1장 C 언어 복습
Transcription
1장 C 언어 복습
1장 C 언어 복습 표준 입출력 배열 포인터 배열과 포인터 함수 const와 포인터 구조체 컴파일러 사용 방법 C++ 프로그래밍 입문 교수 소개 – IT학부 서동수 교수 1장 C 언어 복습 1 1. 표준 입출력 표준 입출력 입력 : 키보드, scanf 함수 #include <stdio.h> 출력 : 모니터, printf 함수 int main(void) 문제 : 정수값 2개를 입력받고 { int Num1, Num2; 두 값 사이의 값들을 더하여 i t Sum int S = 0; 0 출력하라. int i; 주소 전달 서식 문자 : int형 - %d 값 전달 // 전처리문 사용 // main 함수 // 변수 선언 // 변수 선언 및 초기화 printf( 2개의 정수 입력 : "); printf("2개의 ); scanf("%d %d", &Num1, &Num2); // 출력 // 입력 for (i = Num1; i <<= Num2; i++) Sum += i; // 제어문 // 연산자 pprintf("%d부터 %d까지의 합 : %d n", Num1, Num2, Sum); return 0; 1장 C 언어 복습 2 2. 배열 배열 : 같은 타입의 변수 여러 개를 묶어서 처리 배열 변수 선언 및 초기화의 예 int Grade[5]; // 지역 변수의 경우 쓰레기값을 가짐 Grade[2] = 100; // 세 번째 원소의 값을 100으로 변경 int Grade[5] = { 10, 20, 30, 40, 50 ; int Grade[5] = { 10, 20 ; // Grade[2] 이후로는 0 값을 가짐 int Grade[5] = { 0 ; // 모두 0 값을 가짐 int Grade[2][3] = { { 10, 20, 30 , { 40, 50, 60 G d [1][1] = 100; Grade[1][1] 100 1장 C 언어 복습 ; // 2차원 배열 // 2행 2열 원소의 값을 100으로 변경 3 배열의 개요 배열(array)의 정의 같은 데이터 형을 가지는 여러 개의 변수를 하나의 배열명으 로 공유 기억공간을 순차적으로 할당 받아 사용하는 것 [그림 7.1] 일반 변수와 배열 변수의 차이 1장 C 언어 복습 4 배열의 개요 배열(array)의 필요성 같은 데이터 형의 여러 개의 변수 간결하게 선언 기억공간을 순차적으로 변수의 값들을 저장, 관리 국어, 영어, 수학 성적의 변수 선언 예 [그림 7.2] 일반 변수와 배열 변수의 비교 1장 C 언어 복습 5 정수형 데이터를 배열에 대입, 출력 #include<stdio.h> void main(void){ int a[10]={0, 10, 20, 30, 40, 50, 60, 70, 80, 90}, i; for(i=0;i<10;i++) printf(“%u printf( %u \t %d\n”, %d\n , &a[i], a[i]); } [ [결과 출력]] 1245016 1245020 1245024 1245028 1245032 1245036 1245040 1245044 1245048 1245052 1장 C 언어 복습 0 10 20 30 40 50 60 70 80 90 6 배열의 개요 배열(array)의 구조 배열의 요소들이 기억장치에 저장되어 지는 주소값 및 실제 변수값의 구조 정수형 배열변수에 배열요소 구조 예 a[0]=1 ・・・ , a[9]= 90 a[0]=1, [그림 7.3] 배열 변수의 구조(int a[10]) 1장 C 언어 복습 7 배열 사용하기 배열의 선언 데이터형 배열 변수명[배열 요소의 개수]; 배열명은 변수명을 지정할 때와 같은 규칙을 따름 영문자 대․소문자 또는 언더바(_)가 첫번째 문자로 사용 숫자 사용 가능(단, 가능(단 배열 변수명의 첫번째 문자로는 사용 불가) 특수문자 및 예약어 사용 불가(데이타형, 명령어 등) 1장 C 언어 복습 8 배열 사용하기 배열의 초기화 배열의 초기치를 선언문에 직접 입력 int a[5]={0, 1, 2, 3, 4 ; int b[5]={1, in b[ ] {1, 2, , 3 ; 반복문 또는 제어문을 이용한 배열의 초기화 int i, a[5] a[5]; for(i=0;i<=4 ; i++) a[i]=i+1; 배열 선언시 요소개수를 지정하지 초기화 int a[ ]={0, ]={0 1, 1 22, 3, 3 4 ; int b[ ]={1, 2, 3 ; 1장 C 언어 복습 9 for 반복문을 사용한 배열의 초기화 예 #include<stdio.h> void id main(void) i ( id) { int i, a[5]; for(i=0;i<=4;i++) { a[i]=i+1; printf(“a[%d]=%d printf( a[%d]=%d \n \n”, i, i a[i]); [결과 출력] a[0]=1 a[1]=2 [ ] a[2]=3 a[3]=4 a[4]=5 1장 C 언어 복습 10 배열 사용하기 배열 초기화할 때 주의할 점 문자열 변수를 배열로 선언할 때 ¾ 문자열의 마지막에는 NULL 문자가 반드시 존재 ¾ 실제 문자열의 수보다 1바이트 크게 배열의 크기를 지정 char color[3]=“RED”; (컴파일 에러) char color[4]=“RED”; char color[4]={‘R’ color[4] { R , ‘E’ E , ‘D’ D , ‘0/’ ; 배열의 초기값 설정 ¾ 선언된 배열의 요소 수보다 적은 수의 초기치가 주어진 경우에는 모자 라는 요소의 개수만큼은 0이 대입 ¾ 배열의 요소 개수보다 많은 수가 초기화될 경우에는 컴파일 에러가 발 생 1장 C 언어 복습 11 정수 값의 합 및 평균 ##include<stdio.h> void main(void) { int i, data[]={78, 55, 99, 75, 84, 39, 67, 98, 87, 100 ; int sum=0; float ave; for (i=0; i < 10; i++) sum += data[i]; ave=(float)sum / 10.0; printf(“Total=%d i f(“ l %d Average=%.2f\n”, A % 2f\ ” sum, ave); ) [결과 출력] Total=782 Average=78.20 1장 C 언어 복습 12 정수의 값들을 오름차순으로 정렬 #include<stdio.h> void main(void) { int i, i j, j temp=0, temp=0 data[]={78, data[]={78 55, 55 99, 99 75, 75 84, 84 39, 39 67, 67 98, 98 87,100 ; for (i=0; i < 9; i++){ for (j=i+1; j < 10; j++){ if(data[i] >= data[j]){ temp=data[i]; data[i]=data[j]; data[j]=temp; printf(“Resort array list:”); for(i=0; i<10; i++) printf(“%3d (“ ” ”, data[i]); [ ]) [결과 출력] Resort array list: 39 55 67 75 78 84 87 98 99 100 1장 C 언어 복습 13 다차원 배열 2차원 배열 선언 및 사용 2차원 배열은 배열의 요소를 표현하는 첨자가 2개인 배열 데이터형 2차원 배열 변수명 [행 배열 요소의 개수][열 배열 요소의 개수]; 예) int a[2][3]; [ ][ ] 2차원 배열은 2(행)×3(열)=6(개)의 요소의 수만큼 변수 사용이 가능 메모리 공간은 6(개)×4(Byte)=24Byte를 할당 1장 C 언어 복습 14 다차원 배열 2차원 배열의 초기화 기화 int a[2][3]={0, 1, 2, 3, 4, 5 ; 또는, 또는 int a[2][3]={{0, 1, 2 , {3, 4, 5 ; 2차원 배열의 구조 1장 C 언어 복습 15 2차원 배열 요소의 합 #include<stdio.h> void id main(void) i ( id) { int m[4][3]={ {10, 5, -3 , {9, 0, 0 , {32, 20, 1 , {0, 0, 8 int row, column, sum =0 ; for( row=0; row < 4; row++ ) for( column=0; column < 3; column++ ){ sum=sum + m[row][column]; printf(“m[%d][%d]=%d\n” printf( m[%d][%d]=%d\n , row, row column column, m[row][column]); ; printf(“The printf( The total is %d\n”, %d\n , sum ); [결과 출력] m[0][0]=10 m[0][1]=5 m[0][2]=-3 m[1][0]=9 m[1][1]=0 m[1][2]=0 m[2][0]=32 m[2][1]=20 m[2][2]=1 m[3][0]=0 m[3][1]=0 m[3][2]=8 Th totall is The i 82 1장 C 언어 복습 16 다차원 배열 3차원 배열 선언 및 사용 3차원 배열은 배열의 요소를 표현하는 첨자가 3개인 배열 변수명[행 열의 평면 배열 요소의 데이터형 3차원 배열 변수명[행,열의 개수][행 배열 요소의 개수][열 배열 요소의 개수]; 예) int a[2][2][2]={0, 1, 2, 3, 4, 5, 6, 7 ; 3차원 배열은 2(평면)×2(행)×2(열)=8(개)의 요소의 수만 큼 변수 사용이 가능 메모리 공간은 8(개)×4(Byte)=32Byte를 할당 1장 C 언어 복습 17 다차원 배열 3차원 배열의 구 구조 Step 1:평면에 2차원 배열에 해당하는 데이터를 행, 열의 순서대로 대입 Step 2:다음 평면 요소에 Step 1과 같이 2차원 배열에 해당하는 데 이터를 행, 행 열의 순서대로 대입 1장 C 언어 복습 18 배열을 이용한 문자열 다루기 문자열의 입출력 문자 표현 : 작은따옴표(‘ ’) 사용 문자열 표현 : 큰따옴표( 큰따옴표(“ ”)) 사용 문자:‘a’, ‘b’, ‘c’, ‘d’ 문자열:“abcd”, “C Language” 한 줄의 문자열을 입력받는 함수 : gets() 함수 한 줄의 문자열을 출력하는 함수 : puts() 함수 1장 C 언어 복습 19 배열을 이용한 문자열 다루기 문자 배열 선언 및 사용 문자 데이터형 배열 변수명[문자 배열 요소의 개수]; char h color_1[3]=“RED”; l 1[3] “RED” (컴파일 에러) char color_2[4]=“RED”; 메모리 구조 (a) char color_1[3]=“RED” 2[4] “RED” (b) char color color_2[4]= RED 1장 C 언어 복습 20 배열을 사용한 문자열 복사 ・ 문자열 배열 요소에 문자변수 개별 대입(NULL ( 문자 포함)) #include<stdio.h> void main(void) { char a1[5]=“BOOK”, a2[5]; a2[0]=a1[0]; a2[1]=a1[1]; a2[2] a1[2] a2[2]=a1[2]; a2[3]=a1[3]; a2[4]=a1[4]; printf(“a1 배열 문자열:%s \n”, a1); printf(“a2 printf( a2 배열 문자열 문자열:%s %s \n \n”, a2); [결과 출력] a1 배열 문자열:BOOK a2 배열 문자열:BOOK 1장 C 언어 복습 21 2. 배열 문제 : 5행 5열의 int형 배열을 선언하고 실행 결과와 같이 각 원소의 값을 채운 후 출력하기 int main(void) { int Ary[5][5]; int i, j; for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) { if (i >= j) A [i][j] = i + 11; Ary[i][j] else Ary[i][j] = 0; // 2차원 배열 // 왼쪽 아래 부분 : i + 1 // 오른쪽 위 부분 : 0 for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) { printf("%d ", Ary[i][j]); printf(" n"); return 0; 1장 C 언어 복습 22 3. 포인터 : 프로그램과 메모리 실행 중인 프로그램(프로세스)의 메모리 구조 1장 C 언어 복습 23 3. 포인터 : 메모리 주소 메모리 주소 주소 : 바이트 단위의 번호 주소를 8비트로 표현한다면 Æ 28개(0~255번지)의 주소값 Windows 운영체제에서는 32비트로 표현 Æ 232개(0 개(0~2 232-1번지) 1번지) ¾ 프로세스 1개 당 4GByte의 전용 메모리(가상 메모리)가 할당됨 변수와 함수의 주소 변수와 함수는 메모리 공간을 차지함 1장 C 언어 복습 24 3. 포인터 : 변수와 포인터 변수의 주소 : 주소 연산자(&) 사용 int num = 5; printf("변수 num의 주소 : %d\n", &num); 포인터 : 주소값을 저장하는 변수 타입 별로 다르게 표현됨 Æ 포인터 변수를 통해 간접 처리 가능 예 : int형 포인터 변수 1장 C 언어 복습 25 3. 포인터 : 변수와 포인터 포인터 변수를 통한 변수 접근 : 역참조 연산자(*) 사용 int *pNum = # *pNum = 5; (num = 5;와 동일) 포인터 연산 : 증가(++), 감소(--), 덧셈(+), 뺄셈(-) 가능 int형 포인터의 경우 1 증가 : int형 변수의 크기인 4만큼 증가함 예제 int main(void) { int var = 5; int *p = &var; // 포인터 변수 선언 및 var 주소로 초기화 printf("var의주소 : %d n", &var); pprintf("var의값 ( : %d n",, var); ) printf("p의주소 : %d n", &p); printf("p의값 : %d n", p); printf("p가가리키는변수의값 : %d n", *p); int형이므로 4 증가 p++; printf(">> 변경후 n"); printf("p의값 printf( p의값 : %d n" n , p); return 0; 1장 C 언어 복습 26 4. 배열과 포인터 배열은 포인터처럼, 포인터는 배열처럼 사용 가능! 배열에 대한 포인터 연산의 적용 예 배열 첫 번째 원소의 주소 대입 다음 원소를 가리킴 pNum[0], pNum[1], … 과 같이 사용 가능 pNum[2] == *(pNum + 2) 주의 : 배열명에 대한 주소 변경 불가 Æ 상수 개념 1장 C 언어 복습 27 4. 배열과 포인터 : 메모리 동적 할당 메모리 동적 할당 및 해제 함수 malloc(), free() 예제 : 10개의 원소를 갖는 int형 배열에 대한 메모리 동적 할당 #include <stdio.h> #include <stdlib.h> <stdlib h> #include <time.h> // srand srand, rand 함수 // time 함수 int main(void) { int ii, ary[10] ary[10], *p; srand((unsigned) time(NULL)); for (i = 0; i < 10; i++) ary[i] = rand(); // 무작위 값 대입 p = (int *) malloc(sizeof(int) * 10); // int형 10개 메모리 동적 할당 for (i = 0; i < 10; i++) p[i] = ary[i]; // 포인터는 배열처럼 사용 가능 printf("index tary tp n"); for (i = 0; i < 10; i++) printf("%d t%d t%d n", i, ary[i], p[i]); free(p); // 메모리 해제 malloc의 반환형 : void * Æ 형변환 필요 Æ C에서는 자동 형변환됨 return 0; 1장 C 언어 복습 28 5. 함수 함수 작성 시 고려 사항 함수 원형, 함수 정의, 함수 호출, 매개변수 전달 예제 : xy을 계산하는 함수 값에 의한 전달 #include <stdio.h> <stdio h> int power(int x, int y) { int i; int result = 1; for (i = 0; i < y; i++) result *= x; iint main(void) i ( id) { int a = 2; int b = 3; int result = power(a, b);// 함수호출 printf("%d^%d : %d n", a, b, result); a = 3; b = 4; result = power(a, b); printf("%d^%d : %d n", a, b, result); return result; return 0; 1장 C 언어 복습 29 5. 함수 : 매개변수 전달 방식 값에 의한 전달 예제 : swap 함수 문제점은? void swap(int x, int y) { int temp = x; x = y; y = temp; t 값에 의한 전달 int main(void) { int a = 2; int b = 3; pprintf("a : %d, b : %d n", a, b); swap(a, b); printf("a : %d, b : %d n", a, b); return 0; 1장 C 언어 복습 30 5. 함수 : 매개변수 전달 방식 참조에 의한 전달 *x int *y) void swap(int *x, { int temp = *x; *x = *y; p *yy = temp; 예제 : swap 수정 참조에 의한 전달 int main(void) { int a = 2; int b = 3; printf("a : %d, b : %d n", a, b); swap(&a, &b); 주소 전달 printf("a : %d, b : %d n", a, b); return 0; 0 1장 C 언어 복습 31 5. 함수 : 매개변수 전달 방식 – 배열의 전달 배열의 전달 값에 의한 전달 불가 첫 번째 원소의 주소를 전달 Æ 참조에 의한 전달 사용 예제 int형 배열 포인터, 원소 개수 void SetArray(int *ary, int count) { int i; for (i = 0; i < count; i++) ary[i] = i * i; int main(void) { int i; int Ary[5]; 배열의 첫 번째 원소 주소, 주소 원소의 개수 전달 SetArray(Ary, 5); for (i = 0; i < 5; i++) printf("%d i tf("%d : %d n", " ii, Ary[i]); A [i]) return 0; 포인터를 배열처럼 사용 1장 C 언어 복습 32 6. const와 포인터 const 상수 선언 const double PI = 3.14; 변수 PI의 값 변경 불가 함수 매개변수의 상수화 int sum(const int x, const int y) { return (x + y); } 함수 내에서 x, x y의 값 변경 불가 실매개변수로 일반 변수와 const 상수 모두 사용 가능 ¾ 형식매개변수가 const가 아닌 경우에는 실매개변수로 const 상수 불가 const와 포인터 int *pNum = # 1장 C 언어 복습 33 6. const와 포인터 1. num의 상수화 const int *pNum pNum = # 2. pNum의 상수화 int * const pNum = # 예제 : const의 사용 int main(void) { int var1 = 1; int var2 = 2; 선언과 동시에 초기화 const int *p1; p1; //int * const p2; int * const p2 = &var1; p1 = &var1; p1 = &var2; //*p1 = 5; var2 = 4; *p2 = 3; //p2 = &var2; 포인터를 통해 값 변경 불가 변수 자체는 변경 가능 다른 변수로 변경 불가 printf("var1 : %d n", var1); printf("var2 : %d n", var2); return 0; 1장 C 언어 복습 34 7. 구조체 구조체 동질 또는 이질적인 데이터 여러 개를 하나의 그룹으로 처리 사용자 정의형 예 : 2차원 평면상의 한 점 구조체 변수 대입 O ¾ 배열은 대입 X struct Point { // 구조체 선언 int x; int y; ; struct Point P1, P2; // 변수 선언 P1.x = 5; // 변수 사용 P1.y = 6; 값에 의한 전달 가능 P1 = P2; struct Point Sum(struct Point P1, struct Point P2); 구조체 배열 가능 구조체의 멤버 변수로 배열 가능 ¾ 이 경우에도 대입 가능 1장 C 언어 복습 struct t t PPoint i t Ary[10]; A [10] struct Student { char name[20]; int id; int score; ; 35 7. 구조체 예제 : 2차원 평면상의 한 점을 위한 Point 구조체 사용 struct Point { int x, y; ; 에 의한 전달 P1 : 값에 의한 전달, P2 : 참 참조에 struct Point Sum(struct Point P1, struct Point *P2) { struct Point Po; Po.x = P1.x + P2->x; 구조체 포인터의 멤버는 ->로 접근 Po.y = P1.y + P2->y; (*P2).x와 동일 return Po; 구조체 변수의 선언 및 초기화 int main(void) { struct Point A = { 1, 2 ; struct Point B = { 3, 4 ; struct Point C; C = Sum(A, &B); A : 값 전달, B : 주소 전달 printf("Point i tf("P i t C : (%d, (%d %d) n", " C.x, C CC.y); ); return 0; 1장 C 언어 복습 36 7. 구조체 : 단방향 링크드 리스트 예제 : 단방향 링크드 리스트 만들기 #include #i l d <<stdio.h> tdi h> #include <stdlib.h> struct Node { int data; struct Node *next; ; int main(void) { int i; struct Node *pStart = NULL; struct Node *pEnd = NULL; struct Node *Current; 1장 C 언어 복습 // 첫 번째 노드 포인터 // 마지막 노드 포인터 37 7. 구조체 : 단방향 링크드 리스트 for (i = 1; i <= 5; i++) { // 노드생성 Current = (struct Node *) malloc(sizeof(struct Node)); Current >data = i; Current->data Current->next = NULL; if (pStart (p == NULL)) pStart = pEnd = Current; else { pEnd->next = Current; pEnd = Current; // 첫 번째 노드 // 노드 추가 // 첫 번째 노드부터 출력 Current = pStart; while (Current != NULL) { printf("%d printf( %d nn", Current->data); Current >data); Current = Current->next; return 0; 1장 C 언어 복습 38 8. 컴파일러 사용 방법 프로그램 작성 및 수행 과정 컴파일러의 종류 Visual C++ : Windows 운영 체제, 통합 개발 환경 제공 ¾ Visual C++ 6.0 : 현재 가장 많이 사용되고 있음 ¾ Visual Vi l C++ 8 8.0 0 : 최신 버전, 버전 Visual Vi l St Studio di .NET NET 2005에 포함 gcc : UNIX 운영 체제 그 외 다수 컴파일러의 선택 어떤 컴파일러라도 상관없음 자신의 컴퓨터 사용 환경에 따라 적절히 선택하여 사용하면 됨 본 강의에서 배우는 것은 컴파일러의 사용 방법이 아닌 표준 C++! 1장 C 언어 복습 39