Download presentation
Presentation is loading. Please wait.
1
제 11장 C 프로그래밍
2
C 언어 개요 1972년 Denis Richi에 의해 설계됨 발달과정 특징 UNIX운영체계를 위하여 개발
algol->cpl->bcpl->b->c 특징 구조화된 언어로서 모듈별 설계가 가능하다. 이식성이 강하다.(다양한 하드웨어에서 사용 가능) 처리속도가 빠르다. 다양한 연산자(44개의 연산자) 동적이고 능동적인 메모리 관리
3
C 프로그램 여러 개의 .c 파일로 구성됨 하나의 .c 파일 #include #define 비지역 변수 선언들 함수들을 선언
4
C 프로그램 구조 #include <....> #include "...." #define ... int function(int,long,...); int value1, value2; void main() { int x; //지역변수 정의 … //함수의 내용; } int function(...) { } #include <내장헤더파일> #include "사용자정의헤더파일“ #define ..매크로 상수/함수 정의 사용자 정의 함수 선언 비지역 변수 정의 C 프로그램의 본체 사용자 정의 함수
5
C 프로그램 실행 1. 원시 프로그램의 작성 일반 텍스트 파일 형태를 가짐.
*.c (C-언어 source file), *.cpp(C++언어 source file), *.h(header파일) 2. 컴파일러 cc –c 확장자는 UNIX에서는 *.o Dos와 Window9* 에서는 *.obj라는 확장자를 가짐. 3.실행 프로그램 생성 cc -o 목적 프로그램을 필요한 라이브러리와 부프로그램등과 링크시켜서 실행프로그램 생성 최종 실행파일명: a.out 혹은 사용자 정의 이름
6
문장 종류 공문(Empty Statement) 단순문(Simple Statement)
';'으로 되어있는 문장 단순문(Simple Statement) '식;'으로 되어있는 문장 예) int a, b=10; //선언문 (int a; int b; b=10;과 동일) a = b +5; //배정문 display(a); //함수 호출문 복합문(Compound Statement) 하나이상의 단문들을 기술하여 {}로 둘러싼 문 전처리 지시어(Preprocessor directive) '#지시어'형태의 문, ';'를 붙이지 않음
7
문장의 기능별 분류 선언문(Declarative Statement)
함수 외부에서 비지역변수 선언 int a; void f(매개변수선언){//함수내용 } 함수 서두에서 매개변수 선언 void f(int a){//함수내용} 함수 내부에서 지역변수 선언 void f(매개변수선언) { int a; //함수내용 }
8
기능별 분류 배정문 제어문(Control Statement) 주석문(Comment)
프로그램의 제어의 흐름에 관한 문 if문, switch case문, while문, do while문, for문 break문, continue문, return문, goto문 주석문(Comment) /* 주석내용(여러줄도 가능) */ // 한줄내에서 가능(c++컴파일러에서 가능)
9
자료형(Data type) 기본형 문자형 정수형 실수형 나열형 void char(8bit): -128~127
unsigned char(8bit): 0~255 정수형 int, short int(16bit): ~32767 unsigned int(16bit): 0~65535 long(32bit): ~ unsigned long(32bit): 0~ 실수형 float(32bit): ±3.4x10-38 ~ ±3.4x1038 double(64bit): ±1.7x ~±1.7x10308 long double(80bit): ±3.4x ~ ±3.4x104932 나열형 enum(16bit): ~ 32767 void
10
자료형(Data type) 복합형(Complex type) 배열 포인터 구조체 공용체
데이터형 array[] 동일한 기본형의 연속배치 포인터 데이터형* 포인터변수 기억장소의 주소를 저장하는 변수 구조체 struct 구조체변수명 서로 다른 기본형의 조합 공용체 union 공용체변수명 동일한 기억장소를 분할하여 사용
11
표준 입출력함수 표준 입출력함수 기능 getchar() fgetc() 문자단위로 입력하는 함수
표준 입출력함수 기능 getchar() fgetc() 문자단위로 입력하는 함수 putchar() fputc() 문자단위로 출력하는 함수 gets() fgets() 문자열을 입력하는 함수 puts() fputs() 문자열을 출력하는 함수 scanf() fscanf() 형식 갖춘 자료 입력 함수 printf() fprintf() 형식 갖춘 자료 출력 함수
12
변환 문자의 종류 변환문자 argument 변환 방법 %d int형, char형 부호 있는 10진수로 출력한다.
%ld long형 long type의 10진수로 출력한다. %u unsigned형 부호 없는 10진수로 출력한다. %x %Xint형, char형,unsigned형 16진수로 출력한다. %x는 소문자로 출력하고,%X는 대문자로 출력한다. %o int형, char형 unsigned형 8진수로 출력한다. %c int형, char형, unsigned형 주어진 argument를 ASCII Code로 보고 해당문자를 출력한다. %s 문자열의 포인터 주어진 문자열의 주소로부터 NULL문자를 만날 때 까지 기억된 문자열을 출력한다. %f float형 소수점만 가지고 있는 실수형으로 출력한다. %e , %E float형 지수형식의 실수형으로 출력한다. %g float형 %e와 %f 형식 중 자리수가 적게 드는 방식으로 출력한다. 필요 없는 0이나 소수점은 출력하지 않음 %p pointer형 어떤 기억장소의 주소를 출력시 사용한다. %Fp pointer형 어떤 기억장수의 원거리 주소를 출력시 사용한다.
13
C의 연산자 형명칭 연산자 결합성 1차 연산자 () [] . -> 오른쪽
형명칭 연산자 결합성 1차 연산자 () [] . -> 오른쪽 단항 연산자 * & - ! ~ ++ -- (형) sizeof() 왼쪽 이항 연산자 * / % (곱하기, 나누기, 나머지) 오른쪽 + - (덧셈, 뺄셈) >> << (bit shift오른쪽, 왼쪽) > < <= >= (대소의 비교) == != (동등비교) & (bit and) ^ (bit xor) | (bit or) && (논리 곱) || (논리 합) 삼항 연산자 ? : 이항연산자 = += -= *= /= %= &= |= 왼쪽 ^= <<= >>= (할당) (comma) 오른쪽
14
연산자 예 예1) float a, b; a=2.5*5/2; //2.5*5.0 연산후 12.5/2.0계산됨 a=6.25 b=2.5*(5/2); //2.5 * 2 -> 2.5 * 2.0 -> b = 5.0 //()로 인해 연산의 순서가 바뀜. // 정수/정수 => 소수점 이하는 버림. 예2) int a[5]={10, 20, 30, 40, 50}; //[]가 배열 선언 시 사용됨 printf("\n a[0]=%d", a[0]); // a[0]=10 //[]가 배열의 요소를 호출할 때 사용 예3) 구조체변수에서 변수 참조 시 사용 구조체를 가리키는 포인터변수->구조체내의 변수명 구조체변수명.이름;
15
&(번지 연산자) 변수의 메모리 상의 주소를 나타낼 때 사용
#include <stdio.h> void main() { int a=10; printf("변수a의 값은=%d, 변수a의 주소는=%u",a, &a); } 비교 1. &변수명 : 변수의 주소를 나타냄 2. 자료형 &변수명 : 참조 변수 선언 (기존의 변수명 대신에 사용하는 변수명) 3. 변수1 & 변수2 : Bit AND 연산자 4. 논리식1 && 논리식2 : 논리 AND 연산자
16
*(포인터 연산자) 선언 시: int *p; 사용 시: *p; 변수 a와 *p는 동일하게 사용 가능.
17
포인터 예 #include <stdio.h> void main() { int a=10;
int *p=&a; //int *p; p=&a;두 개의 문장 printf("변수a의 주소=%u a의 값=%d\n", &a, a); printf("변수p의 값=%u *p의 값=%u\n", p, *p); *p = 20; // a=20과 동일 a=30; // *p=30과 동일 }
18
제어 구문 선택문 if, if-else, switch 반복제어 for, while, do -while
19
C 프로그램 예 #include <stdio.h> void main() { int i,k;
printf("정수를 입력하시오!(factorial계산)=> "); scanf("%d",&k); long fact = 1; for(i=1;i<=k;i++) fact *=i; printf("\n%d!=%ld", i, fact);" }
20
함수 #include <내장헤더파일> #include <stdio.h> int fn(int x);
사용자 정의 함수 선언 C 프로그램의 본체 함수 호출 사용자 정의 함수를 정의 #include <stdio.h> int fn(int x); void main() { int a=3, b; b=fn(a); printf(“b=%d”, b); } int fn(int x) { int y; y=x+10; return y; }
21
함수 호출 매개변수 전달 값 전달 (pass by value) 값 전달(pass by value)만 사용됨
실 매개변수의 값을 형식 매개변수에 전달 포인터 값을 전달할 때는 주소가 전달됨
22
자동 변수: 예 #include <stdio.h> void sub(); void main() { sub(); }
auto int i=1; static int j=1; printf("\n auto i=%d static j=%d", i, j); i++, j++;
23
정적 변수: 예 #include <stdio.h> static int i, j=4; void inc();
void main() { printf("\n1 main i=%d, j=%d", i,j); inc(); printf("\n2 main i=%d, j=%d", i, j); } void inc() ++i; printf("\nsub i=%d, j=%d", i, j); ++j;
24
배열 정의 static int a[10]; 동일한 형을 가지는 일련의 변수로 메모리에 연속적으로 저장된다.
static : 메모리 클래스(auto, static, extern, register) int : 자료형 a : 배열명(배열의 시작주소값을 가진 상수) 10 :배열의 요소의 갯수가 10개라는 의미
25
배열: 예 #include <stdio.h> void main() { int sum; int a[3]; a[0]=1; a[1]=2; a[2]=3; int b[]={10,20,30}; for(int i=sum=0; i<=2; i++) sum+=a[i]; printf("배열 a[]의 합=%d\n", sum); for(int j=sum=0; j<=2; j++) sum+=b[j]; printf("배열 b[]의 합=%d\n", sum); }
26
다차원 배열 다차원배열은 배열의 요소가 배열 예 다차원 배열(int a[][2])에서 배열요소
static int a[6][2]; int a[2]짜리 일차원 배열이 6개 연속된 배열 static int a[2][3][4]; int a[4]짜리 일차원 배열이 3개 모인 것이 2개 있는 배열 다차원 배열(int a[][2])에서 배열요소 (예...a[0][0]...) 외에는 전부 주소값이다. a : 배열의 시작주소 a[0] : 첫 번째 a[2]짜리 일차원 배열 요소의 시작 주소 a[1] : 두 번째 a[2]짜리 일차원 배열 요소의 시작주소
27
다차원 배열: 예 #include <stdio.h> void main() {
char a[][4]={"hi","him","high"}; char b[]="hello world!"; for(int i=0;i<=2;i++) { for(int j=0;j<=3;j++) { if(a[i][j]==NULL) printf("a[%d][%d]= NULL ", i, j); else printf("a[%d][%d]= %4c ", i, j, a[i][j]); } printf("\n"); } printf("\n"); for(int k=0; k<=12; k++) { if(b[k]==NULL) printf("b[%d]= NULL\n", k); else printf("b[%d]= %c\n", k, b[k]); } }
28
포인터(Pointer) 포인터 포인터 배열 배열 포인터 포인터의 포인터 기억장소(변수)에 대한 주소 값을 저장하는 주소 변수
int *p; 포인터연산이 필요한 모든 경우 포인터 배열 포인터가 배열을 이룬 경우 int *p[10]; 길이가 서로 다른 문자열을 다룰 때 사용 배열 포인터 2차원 배열을 가리키는 포인터 int (*p)[2]; 2차원 배열을 매개변수로 넘겨주는 경우에 사용 포인터의 포인터 포인터의 대상이 포인터인 포인터 변수 int **p; 외부 매개변수를 받는 프로그램
29
포인터: 예 #include <stdio.h> void main() {
int i; char *p, ch[]="Turbo-c"; p=ch; for(i=0; i<=6; i++) printf("\n ch[%d] = %c", i, ch[i]); printf("\n ch[] = "); while(*p) printf("%c", *p++); }
30
포인터: 예 #include <stdio.h> void main() {
int a=10, b=20, c=30, i, *p[3]; p[0]=&a; p[1]=&b; p[2]=&c; for(i=0; i<=2; i++) printf("\n address = %u *p[%d] = %d", p[i], i,*p[i]); }
31
구조체(struct) 구조체 선언 struct 구조체_이름 { 맴버 선언문들; ; }[구조체 변수_이름={초기값들,...}]; 구조체 선언 후에 구조체 변수선언 struct 구조체_이름 변수_이름; 구조체 이름(타입 이름) 정의 typedef struct 이름 { 맴버 선언문들; ; } 구조체명;
32
구조체: 예 #include <stdio.h> struct my{ int a; char b; float c; }x={1,'a',1.5}, y={2,'b',3.5}; void main() { struct my z={3,'c',3.5}; printf("\n x.a=%d x.b=%d x.c=%3.1f", x.a, x.b, x.c); printf("\n y.a=%d y.b=%d y.c=%3.1f", y.a, y.b, y.c); printf("\n z.a=%d z.b=%d z.c=%3.1f", z.a, z.b, z.c); }
33
구조체: 예 #include <stdio.h> struct record{ char name[10]; int age; char tel[13]; } man[2], *p; void main() { register i; for(i=0; i<2; i++ ) { printf("이름: "); scanf("%s", man[i].name); printf("나이: "); scanf("%d", &man[i].age); printf("전화: "); scanf("%s", man[i].tel); } for(i=0;i<2;i++) printf("\n이름=%10s 나이=%3d 전화=%13s" ,man[i].name, man[i].age, man[i].tel); for(i=0, p=man; i<2; i++,p++) printf("\n이름=%10s 나이=%3d 전화=%13s" ,p->name, p->age, p->tel); for(i=0, p=man; i<2; i++,p++) printf("\n이름=%10s 나이=%3d 전화=%13s" ,(*p).name, (*p).age,(*p).tel); }
34
자기참조 구조체:예 #include <stdio.h>
typedef struct record{ char name[10]; int nai; struct record *next } name; void main() { name a={"김 종서",35},b={"장 보고", 40}, c={"이 순신",50}, *head; a.next=&b; b.next=&c; c.next='\0'; for(head=&a; head; head=head->next) { printf("\nPointer=%p", head); printf("\n이름: %s, 나이: %d", head->name, head->nai); } }
35
입출력 표준 입력 함수 표준 출력 함수 표준 파일 입력 함수 표준 파일 출력 함수 scanf(), getchar()
printf(), putchar() 표준 파일 입력 함수 fscanf(), fgets(), fgetc() 표준 파일 출력 함수 fprintf(), fputs(),fputc()
36
파일 입출력 파일 입출력 과정 파일 열기 fopen() 입출력 방식 파일 열기, 읽기/쓰기, 파일 닫기
#include <stdio.h> FILE *fp; fp=fopen("파일 이름", "입출력방식"); 입출력 방식 r : 읽기 전용 w: 쓰기 전용 a: 추가 수록 r+: 읽기쓰기겸용 w+: 쓰기읽기겸용 a+: 읽기추가겸용
37
파일 입출력 파일 입력 함수 파일 출력 함수 파일 닫기 fscanf(), fgets(), fgetc()
열린 파일에서 내용을 읽어 들이는 함수 파일 출력 함수 fprintf(), fputs(), fputc() 열린 파일에 내용을 기록하는 함수 파일 닫기 fclose()
38
FILE 형 구조체 열린 파일의 상태를 저장하기 위한 구조체 형식 <stdio.h>에 정의되어 있음
typedef struct { short level; //buffer의 상태 (fill or empty) unsigned flags; //file상태 flags char fd; //파일 설명자 unsigned char hold; short bsize; //버퍼 크기 unsigned char *buffer, *curp; //data 포인터 unsigned istemp; // 임시 파일 지시자 short token; } FILE;
39
파일 출력: 예 #include <stdio.h> #include <conio.h> void main()
// 키보드에서 문자를 입력받아 파일에 출력하는 예제 #include <stdio.h> #include <conio.h> void main() { FILE *fp; int c; fp = fopen("c:\\test.txt","w"); //쓰기 전용으로 c = getchar(); //키보드로부터 입력 받은 문자의 ASCII 코드 반환 while(c!=EOF) { //file의 끝이 아니면. fputc(c, fp); //fp가 가르키는 파일에 문자 c저장 c = getchar(); //키보드로부터 문자를 읽어 c에 저장 } fclose(fp); }
40
파일입출력: 예 //파일(fgets.c)에서 읽어 들여 파일(test.txt)에 출력하는 함수
#include <stdio.h> void main() { FILE *fp; FILE *fp_write; char buffer[100];//데이터를 임시로 저장하기위한 배열 fp=fopen("fgets.c","r"); fp_write=fopen("test.txt","w"); if(fp==NULL) printf("file not found"); /*최대 길이가 100인 문자열을 fp가 가리키는 파일에서 읽어서 buffer에 저장 후 fp_write가 가리키는 파일에 buffer 내용 기록*/ while(fgets(buffer, 100, fp)!=NULL) fputs(buffer, fp_write); fclose(fp); }
41
디버거 gdb gdb 기능 컴파일 gdb 실행파일 단일 단계 이동(single stepping) 정지점(breakpoint)
변수 접근 및 수정 함수 탐색 추적(tracing) 컴파일 cc –g 옵션을 이용하여 컴파일 gdb 실행파일 help
42
gdb 명령어 break [file:]function run [arglist] bt print expr c next step
Set a breakpoint at [file:]function run [arglist] Start program bt Backtrace: display the program stack. print expr c Continue running program next Execute next line (after stopping); step over any function calls in the line. step Execute next line; step into any function calls in the line. quit
43
다중 모듈 프로그램 여러 개의 파일로 구성된 프로그램 reverse.h void reverse(); /* 선언 */
reverse.c #include <stdio.h> #include “reverse.h” void reverse(char *before, char *after) { int i, j, len; len = strlen(before); for (j = len-1, i=0; j>=0; j--, i++) after[i] = before[j]; after[len] = NULL; }
44
다중 모듈 프로그램 main1.c cc –c reverse.c main1.c
#include <stdio.h> #include “reverse.h” main() { char str[100]; reverse(“cat”, str); printf(“reverse (\”cat\”) = %s\n”, str); reverse(“noon”, str); printf(“reverse (\”noon\”) = %s\n”, str); } cc –c reverse.c main1.c cc –o main1 reverse.o main1.o main1
45
The File Dependency System Make
Why do we use make ? cc "reverse.c" cc -o main1 reverse.o , main1.o … to produce a new version cc -o main2 reverse.o , main2.o … to produce a new version We want to update files automatically based on dependency rules make [ -f makefile] - updates files based on a series of dependency rules in "make file". - If no option is specified, the name "makefile" is assumed.
46
The File Dependency System Make
make files consist of make rules targetList: dependencyList commandList - targetList : a list of target files - dependencyList : a list of files that the files in targetList depend on - commandList : a list of commands that reconstructs the target files from the dependency files.
47
The File Dependency System Make
main1: main1.o reverse.o cc main1.o reverse.o -o main1 main1.o : main1.c reverse.h cc -c main1.c reverse.o : reverse.c reverse.h cc -c reverse.c Figure : make dependency tree main1 main1.o reverse.o main1.c reverse.h reverse.c reverse.h
Similar presentations