1 / 45

Computer Graphics (Part 1: C/C++ Programming)

Computer Graphics (Part 1: C/C++ Programming). HyunKi Hong Dept. of Image Eng., GSAIM ChungAng Univ. Contents . 상수와 변수 수식과 연산자 제어 명령문 파생자료형 ( 배열 , 포인터 , 구조체 등 ) C++ 함수 클래스와 객체. 변수와 배열 (array). 변수 단독주택 int x; //4 평 (byte) 짜리 단독주택 1 가구 배열 같은 평수로 구성된 아파트

lin
Télécharger la présentation

Computer Graphics (Part 1: C/C++ Programming)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Computer Graphics(Part 1: C/C++ Programming) HyunKi Hong Dept. of Image Eng., GSAIM ChungAng Univ.

  2. Contents 상수와 변수 수식과 연산자 제어 명령문 파생자료형(배열, 포인터, 구조체 등) C++ 함수 클래스와 객체

  3. 변수와 배열(array) • 변수 • 단독주택 • int x; //4평(byte)짜리 단독주택 1가구 • 배열 • 같은 평수로 구성된 아파트 • int x[5]; //4평짜리 5가구

  4. 배열이란? • 연속적인 항목들이 동일한 크기의 순서를 갖고 나열되어 있는 데이터의 집합 • 동일 자료형인 여러 변수들이 하나의 이름으로 통합 구조화됨. • 동일한 형태의 데이터를 대량으로 관리하는데 편리 • 같은 형태의 여러 개의 값을 저장할 수 있는 연속된 메모리 • 1000명 학생의 성적평균? • int s1, s2,s3,s4,….s1000; • (s1+s2+s3+s4+……s1000)/1000. int s[1000]; int i,sum=0; double avg; for(i=0;i<1000;i++) sum+=s[i]; avg=sum/1000.; 배열은 모든 배열원소가 동일한 자료형을 갖는 요소의 동질성과 기억장소에 연속해서 저장되는 기억 공간의 연속성이 특징

  5. 1차원 배열 • 첨자(subscript)가 한 개 • int score[3] → score[0], score[1], score[2] • 데이터형 배열명[첨자] • 첨자는 양의 정수이며 배열의 크기(방의 개수) • 각 방=배열 요소(element) • 첫번째 방의 첨자는 0이다.

  6. score[0] score[1] score[2] score[3] score[4] score[5] score[6] 배열 선언시 첨자의 값은 배열(공간)의 크기 int score[7] 각방의-값의-형태 이름 갯수 점수가 들어갈 자리 1번 학생의 점수 2번 학생의 점수 3번 학생의 점수 4번 학생의 점수 5번 학생의 점수 6번 학생의 점수 7번 학생의 점수 배열 요소 (element) 배열 요소(element)의 첨자는 방의 순서 변수를 사용한다면 7개의 다른 이름의 변수 필요

  7. 1차원 배열의 초기화 • int score[5]={10, 20, 30,40,50}; • char name[ ]={'H','o','n','g','','H','',‘K','\0'}; • 초기화까지 할 경우 방의 개수(9) 생략 가능 • char name[ ]="Hong H K"; • 배열원소가 초기화 데이터 수보다 크면 나머지 원소들은 0으로 초기화 된다. int han[3]={10,20}이면 han[2]은 0 • 배열 원소가 초기화한 데이터 수보다 작으면 에러 • error C2078: too many initializers

  8. 초기화와 대입 • int han[3]={10,20,30}; //배열선언과 초기화 • int han[3]; //배열 선언 han[0]=10; //대입 han[1]=20; han[2]=30

  9. 배열에 값 저장(1) #include <iostream.h> void main() { int han[3]; //배열 선언시 첨자값은 공간의 크기 //int han[3] = {10, 20, 30}; han[0]=10; //배열 요소(element)의 첨자는 방의 순서 han[1]=20; han[2]=30; // han[3]=40; cout<<han[0]<<", "<<han[1]<<", "<<han[2]<<"\n"; }

  10. 배열에 값 저장(2) 10 arry[0] #include <stdio.h> void main() { int arry[5] = {10, 20, 30, }; int i; for(i=0; i<7; i++) printf("\n arry[%d] => %d", i, arry[i]); printf("\n sizeof(arry) => %d", sizeof(arry)); } 20 arry[1] 30 arry[2] 0 arry[3] 0 arry[4] 쓰레기값 10/45

  11. 배열에 값 저장(3) H irum[0] #include <stdio.h> void main() { char irum[] = "HONG"; int i; printf("\n sizeof(irum) => %d", sizeof(irum)); for(i=0; i<sizeof(irum); i++) printf("\n irum[%d] => %c (Ascii code: %d", i, irum[i], irum[i] ); } O irum[1] N irum[2] G irum[3] \0 irum[4] 11/45

  12. 10개의 수를 입력 받아 평균을 구하는 프로그램 #include <stdio.h> void main() { int s[10]; int i,sum=0; printf("\n10개의 수를 입력하세요="); for(i=0;i<10;i++){ scanf("%d",&s[i]); sum+=s[i]; } printf("%lf",sum/10.); } #include <stdio.h> #define NUM 10 void main() { int s[NUM]; int i,sum=0; printf("\n수를 입력하세요="); for(i=0;i<NUM;i++){ scanf("%d",&s[i]); sum+=s[i]; } printf("%lf",(double)sum/NUM); }

  13. 프로그램 예제 #include <stdio.h> void main() { char arry[] = "C programming"; int i = 2; printf("\n i = %d arry[i] => %c", i, arry[i]); printf("\n arry[i++] => %c", arry[i++]); printf("\n arry[++i] => %c", arry[++i]); printf("\n arry[i]-- => %c", arry[i]--); printf("\n --arry[i] => %c", --arry[i]); } # include <stdio.h> void main() { int arry[5]; int i, max = 0; for(i=0; i<5; i++){ printf("숫자 %d ...", i+1); scanf("%d", &arry[i]); } for(i=0; i<5; i++) if(arry[i] > max) max = arry[i]; printf("\n최대값은 => %d \n", max); }

  14. 1 x[0][0] 2 x[0][1] 3 x[1][0] 1 x[0][0] 2 x[0][1] 4 x[1][1] 3 x[1][0] 4 x[1][1] 5 x[2][0] 5 x[2][0] 6 x[2][1] 6 x[2][1] 논리적 구조 물리적구조 다차원 배열 • 배열의 배열(array of arrays) • int x[3][2]; • int x[3][2]={1,2,3,4,5,6}; • int x[3][2]={ {1,2}, {3,4}, {5,6} }; 열 행 초기화하면 첨자 생략 가능

  15. 2차원 배열 #include <stdio.h> void main() { int i,j; int han[2][3]={10,20,30,40,50,60}; for(i=0;i<2;i++) for(j=0;j<3;j++) printf("han[%d][%d]=%d\n",i,j,han[i][j]); } 구구단을 계산해서 그 결과를 배열에 저장하는 프로그램 작성!!

  16. 3차원 배열 • 데이터형 배열명[첨자1][첨자2][첨자3] • int sam[2][3][4] 전체공간=234 면 행 열

  17. 문자 배열 • 문자열 • 끝에 null문자(‘\0’)가 있는 문자(char)배열 • char a[3]; • char aa[2][3]; • char s[]=“soft” • char s[]={‘s’,’o’,’f’,’t’,’\0’}; 자동적으로 널문자가 들어감 주소연산자 int i; char s[5]; // for(i=0;i<5;i++) s[i] = i; for(i=0;i<5;i++)printf("%d ",&s[i]); // for(i=0;i<5;i++)printf("\n %d ",s[i]); 17/45

  18. 포인터 • 자료의 주소를 저장하는 변수 = 메모리중의 위치를 가리키는 변수 • 데이터가 기억된 기억장소의 주소 저장 • int x=10 ; • int *px; → px는 자료가 수록되는 메모리주소가 대입 → *px는 px에 수록되어 있는 값(자료 자체, int형) • int형 데이터를 참조하기 위한 포인터 변수 • 번지 값(포인터)을 저장하는 변수 • px가 지시하는 곳의 자료형이 int형

  19. 포인터 변수를 사용하는 경우 • 함수로부터 한 개 이상의 값을 return 할 때 • 한 함수에서 다른 함수로 보다 편리하게 배열이나 문자열을 전달 할 때 • 배열조작을 쉽게 할 때 • 복잡한 데이터 구조 만들 때

  20. 포인터 선언 • 데이터형 *포인터변수명; • int *pa; • 변수 pa가 int형 데이터를 참조하기 위한 포인터 변수 • pa가 지시하는 곳의 자료형이 int 형 • 포인터 변수 이름은 pa • char *pc; • 변수 pc가 char형 데이터를 참조하기 위한 포인터 변수 • pc가 지시하는 곳의 자료형이 char형 • 포인터 변수 이름은 pc

  21. 포인터 변수의 크기 int *pi; //정수형 포인터 변수 pi char *pc; //문자형 포인터 변수 pc double *pd; //배정도형 포인터 변수 pd printf("%d %d %d\n",sizeof(pi),sizeof(pc),sizeof(pd)); printf("%d %d %d\n",sizeof(*pi),sizeof(*pc),sizeof(*pd)); // 4 4 4 → 메모리 주소 자체는 크기가 같음. // 4 1 8 → 실재 할당된 메모리 크기는 다름. 21/45

  22. 포인터 변수의 초기화 • 데이타형 *포인터변수명=초기화주소; int x=10; int *ptr; printf("\n x 주소= [%d], [%x]", &x, &x); ptr = &x; printf("\n *ptr => %d, prt => %d", *ptr, ptr); cf. 정수형 포인터 변수 ptr 선언과 동시에 정수형 변수 x의 주소로 초기화 int *ptr = &x; &x: 지정변수(x)의 주소 22/45

  23. *의 두 가지 의미 int x=10, y; //정수형 변수 x, y 선언 int *px; //정수형 포인터 변수 px 선언 px=&x; //정수형 변수 x의 주소를 포인터 변수 px에 대입 y=*px; printf("%d %x\n",x,&x); //10 12ff7c printf("%x %d\n",px,*px); // 12ff7c 10 printf("%d %x\n",y,&y); //10 12ff78 선언시: 뒤에오는 변수가 포인터 변수이다 실행문: 포인터 변수가 갖는 주소로 가서 값 참조 주소 저장된 값 10 x: 12ff7c 12ff7c px *(px) y: 12ff78 23/45

  24. 포인터 연산 • 포인터를 1 증가 시킨다는 것은 주소를 1(byte) 증가 시키는 것이 아니라, 포인터가 지시하는 데이타형(char : 1byte, int : 4,double : 8)만큼 증가 char c; int i; double d; char *pc=&c; int *pi=&i; double *pd=&d; printf("%d %d\n", &c, &i); // 1245052 1245048 printf("%d %d\n", pc, pc+1); // 1245052 1245053 printf("%d %d\n", pi, pi+1); // 1245048 1245052 printf("%d %d\n", pd, pd+1); // 1245040 1245048 cf. 배열과 유사 24/45

  25. 포인터와 문자열 • 배열의 경우 문자열 길이가 확정, 포인터는 가변적 #include <stdio.h> void main() { char arry[] = {'C', 'O', 'M', 'P', 'U', 'T', 'E', 'R'}; char *ptr = "GRAPHICS"; int i = 0; printf("\n *(arry + i) => "); for (i=0; i<8; i++) printf(" %c ", *(arry+i)); printf("\n ptr[i] => "); for (i=0; i<8; i++) printf(" %c ", ptr[i]); } char *title = "ABC .. Z"; int i = 0; do printf("\n *(title + %d) => %c (ASCII code: %d)", i, *(title+i), *(title+i)); while (*(title+i++) != '\0'); 25/45

  26. 포인터와 1차원 배열 비교 • 포인터 : 주소를 저장하는 변수 • 배열명 : 배열의 시작 주소인 상수 값 • int x[10]; - x==&x[0], x+1==&x[1], x+2==&x[2] - (x+i)==&x[i] - *(x+i)==*&x[i]==x[i] - x[0]==*(x+0), x[1]==*(x+1), x[2]==*(x+2)

  27. 포인터와 배열이름 • 배열 이름은 그 배열의 첫번째 원소의 주소이다. • int x[5]; • x는 x[0]가 저장되는 주소를 나타낸다 int x[5]={10,20,30,40,50}; int i; for(i=0;i<5;i++) { cout<<x[i]<<" vs. "; //printf("%d ",x[i]); cout<<*(x+i)<<'\n'; //printf("%d\n",*(x+i));//x+1은 x에서 4더한 번지 } cf. 여기서 *x+1의 결과는? 27/45

  28. s+0 (0번지) s+1 (4번지)s+2 (8번지)s+3 (12번지) s+4 (16번지)s+5 (20번지) s+6 (24번지) s[0], *(s) s[1], *(s+1) s[2], *(s+2) s[3], *(s+3) s[4], *(s+4) s[5], *(s+5) s[6], *(s+6) int s[7] s[i] ==*(s+i)

  29. 포인터와 1차원 배열 예제 #include <iostream.h> void main() { int a[5]={1,2,3,4,5}; int sum=0,*pa=a; //배열명을 포인터변수에 대입 while(pa<=&a[4]){ cout<<*pa<<"\n"; //printf(" %d",*pa); sum+=*pa++; } cout<<sum<<"\n"; //printf("%d\n",sum); } 29/45

  30. 포인터와 2차원 배열 • int ts[3][4]; int형 포인터 상수 ts[0][0]의 시작 주소 주소 ts[0] ts[1] ts[2] 주소 ts ts+1 ts+2 int형 포인터 상수 ts[2][0]의 시작 주소

  31. 2차원 배열의 주소 int a[2][3]={1,2,3,4,5,6}; int i,j; for(i=0;i<2;i++) for(j=0;j<3;j++) printf("&a[%d][%d]=%d\n",i,j,&a[i][j]); printf("%a=%d\n",a); printf("a[0]=%d\n",a[0]); printf("a[1]=%d\n",a[1]); &a[0][0]=1245032 &a[0][1]=1245036 &a[0][2]=1245040 &a[1][0]=1245044 &a[1][1]=1245048 &a[1][2]=1245052 a=1245032 a[0]=1245032 a[1]=1245044 31/45

  32. 이차원 배열 a[i][j] • a[i][j]==(a[i])[j]==*(a[i]+j)==(*(a+i))[j]==*(*(a+i)+j) • 예제: int a[2][3]={1,2,3,4,5,6}; int i,j; //printf("%d %d %d\n",*(a[1]+2),(*(a+1))[2],*(*(a+1)+2)); cout<<*(a[1]+2)<<(*(a+1))[2]<<*(*(a+1)+2)<<'\n'; for(i=0;i<2;i++) for(j=0;j<3;j++) cout<<*(a[i]+j)<<(*(a+i))[j]<<*(*(a+i)+j)<<'\n'; //printf("%d %d %d\n",*(a[i]+j),(*(a+i))[j],*(*(a+i)+j)); a[1][2] 32/45

  33. 포인터와 문자열 • 데이타형 *배열명="문자열" • char *ch="A BC"; • 변수 ch는 포인터 변수로 선언 • ch에는 문자열 "A BC"가 저장되는 것이 아니라 문자 배열의 시작주소가 배정됨 주소 ch (ch+1) (ch+2) (ch+3) (ch+4)  char ch[5] 65 *ch 32 *(ch+1) 66 *(ch+2) 67 *(ch+3) 0 *(ch+4) char *ch="A BC"; printf("%s\n",ch); printf("%d %d %d %d %d", *ch,*(ch+1),*(ch+2),*(ch+3),*(ch+4)); Characters are printed up to the first null character 33/45

  34. 문자형 포인터와 배열 • 문자열을 저장하는 방법 • C언어에서 사람이름을 저장하려면? • 문자형 배열 사용 : char name[10] • 문자형 포인터 사용: char *name void OUT() { char *name="홍길동"; cout<<name<<"\n"; } void IN(char* n) { cout<<n<<"\n"; } void main() { char *name="홍길동"; IN(name); OUT(); } 34/45

  35. 포인터 변수 배열 • 포인터 변수 대신 포인터 배열 변수를 사용하여 문자배열 참조 • 데이타형 *배열명[첨자]; • char *ch[5]; • 5개의 임의의 길이의 문자열 사용

  36. 포인터 변수 배열 예 int i; char *ch[4]={"ABC", "Image", "GSAIM", "CAU" }; for(i=0;i<4;i++) printf("ch[%d]= %d %c %s\n",i, ch[i], *ch[i], ch[i]); ch[0]는 문자열 “ABC”가 저장되어 있는 시작 주소 36/45

  37. 문자열 함수 • <string.h>에 내장

  38. strcpy • 문자열 복사 함수 • strcpy(st1,st2) #include <stdio.h> #include <string.h> void main() { char s1[4]; char *s2="CAU"; strcpy(s1,s2); printf("%s, %s\n",s2,s1); } st1의 길이가 st2보다 길면 나머지는 공백으로 채워진다. char *s1; char *s2=“CAU"; s1=s2; 38/45

  39. strcmp • 문자열 비교 함수 • strcmp(st1,st2) #include <stdio.h> #include <string.h> void main() { char *s1="soft"; char *s2="ware"; int a,b,c; a=strcmp(s1,s2); //-1 b=strcmp(s2,s1); //1 c=strcmp(s1,s1); //0 printf("%d %d %d\n",a,b,c); } st1>st2 : +(1) st1==st2 : 0 st1<st2 : -(1) if(strcmp(“끝”,s1)==0) break; 39/45

  40. strlen, strlwr, strupr • strlen(st); //null문자 포함하지 않은 길이 • strlwr(st); //소문자로 변환 • strupr(st); //대문자로 변환 #include <string.h> #include <stdio.h> void main( void ) { char string[100] = "The String to End All Strings!"; char *copy1, *copy2; copy1 = _strlwr( _strdup( string ) ); copy2 = _strupr( _strdup( string ) ); printf( "Mixed: %s\n", string ); printf( "Lower: %s\n", copy1 ); printf( "Upper: %s\n", copy2 ); } 40/45

  41. 참조자(reference) • C++에서만 가능 • 변수의 별명 • 예) int &rx=x; • rx는 x를 참조하도록 초기화된 정수형 참조자 • 참조자(rx)에 변화를 주면 그 타켓(x)도 변함

  42. 참조자(reference) 예 #include <iostream.h> void main(void) { int num = 34; int & variable = num; cout << num << "\n"; cout << variable << "\n"; variable = variable + 10; cout << num << "\n"; cout << variable << "\n"; } 42/45

  43. call by reference: 포인터 vs. 참조자(함수에서 다시) #include <iostream.h> void swap(int *, int *); void main() { int a=2, b=5; cout<<a<<b<< '\n' ; swap(&a,&b); cout<<a<<b<< '\n'; } void swap(int *pa, int *pb) { int temp; temp=*pa; *pa=*pb; *pb=temp; cout<<*pa<<*pb<< '\n'; } #include <iostream.h> void swap(int &, int &); void main() { int a=2, b=5; cout<<a<<b<< '\n'; swap(a,b); cout<<a<<b<< '\n'; } void swap(int &ra, int &rb) { int temp; temp=ra; ra=rb; rb=temp; cout<<ra<<rb<< '\n'; } a의 참조자 43/45

  44. 배열 인자 #include <iostream.h> void array(int array1[], int number) { int i; for (i = 0; i <number; i++){ cout << array1[i] << " "; cout << *(array1+i) << " "; } } void main(void) { int little[5] = {6,7,8,9,10 }; int big[3] = {110, 220, 3300}; array(little, 5); //array 함수 호출, 배열명만 쓰네!! array(big, 3); //array함수 호출 } int *array1 배열을 함수의 인자로 사용하고 싶다면? main()에 있는 배열값들을 array()로 넘기고 싶어요! 44/45

  45. 배열 인자 #include <iostream.h> void values(int array[], int number) { int i; for (i = 0; i <number; i++) { cout << "input value" << i << '\n'; cin >> array[i]; cout << array[i] << '\n'; } } void main(void) { int num[3]; int i; values(num, 3); for (i = 0; i <3; i++) cout << num[i] << "\n"; } 45/45

More Related