Presentation is loading. Please wait.

Presentation is loading. Please wait.

A Book on C, 3rd Ed. Al Kelley and Ira Pohl

Similar presentations


Presentation on theme: "A Book on C, 3rd Ed. Al Kelley and Ira Pohl"— Presentation transcript:

1 A Book on C, 3rd Ed. Al Kelley and Ira Pohl
Addison-Wesley Publishing Company, Inc. 담당교수: 성미영

2 C의 유래 1969 Ken Thomson이 Unix를 어셈블리어로 개발
1970 Ken Thomson이 Unix를 B 언어로 다시 씀 BCPL -> B -> C Martin Ken Dennis Richards Thomson Ritchie

3 왜 C 인가?(Why C?) C는 작은 언어(C is small language.)
C는 Unix 구현 언어(C is the native language of Unix) C의 이식성(C is portable.) C의 간결성(C is terse.) C의 모듈성(C is modular.) C는 C++과 Java 언어의 기본(C is the basis for C++ and Java.) C는 대부분의 기계에서 효율적(C is efficient on most machines)

4 제 1장 : C의 개요 Program 출력(1) 다음 프로그램은 화면에 문자열을 출력한다.
#include <stdio.h> int main(void) { printf("from sea to shining C\n"); return 0; } 에디터를 사용해 확장자가 .c인 파일에 위의 내용을 입력한다. 파일이름은 내용을 알 수 있도록 입력한다. 프로그램을 컴파일 하기 위해 다음을 입력한다. cc sea.c 실행할 수 있는 파일 a.out은 이 명령에 의해 만들어 진다. "a.out" 프로그램을 실행하고 화면에 from sea to shining C을 프린트한다.

5 C Programming 변수, 수식, 배정(1)
Write Source Program text editor sea.c Compile & Link compiler sea.exe Execution 변수, 수식, 배정(1) C에서 모든 변수는 프로그램의 시작부분에 선언되어야만 한다. 변수명(구별자)는 문자와 숫자 그리고 밑줄문자(_)의 조합으로 이루어진다. int miles, yards, pacific_sea; float kilometers; char c1, c2, c3; char 1c, 2c, 3c; /* wrong */

6 변수, 수식, 배정(2) 표현식의 값은 변환규칙을 포함할 수 있다. 7/2 /* the int value 3 */
7.0/ /* the value 3.5 */ 두번째 표현식은 자동적으로 double로 변환되었다. /* The distance of a marathon in kilometers. */ #include <stdio.h> int main(void) { int miles, yards ; float kilometers ; miles = 26 ; yards = 385 ; kilometers = 1.609*(miles+yards/1769.0); printf("\nA marathon is %f kilometers. \n\n", kilometers) ; return 0 ; }

7 #define 과 #include의 사용(1)
#으로 시작되는 줄을 전처리 지시자(preprocessing directives)라 한다. #define LIMIT 100 #define PI #define 라인은 프로그램 내에 어디에나 올 수 있다. #define 문은 파일 안에서 그것 이후의 줄에만 영향을 미친다. 인용문의 내용은 결코 전처리기에 의해 변경되지 않는다. printf("PI = %f\n", PI); 프로그램 내에 기호 상수의 사용은 프로그램을 읽기 쉽게 만든다. /* speed of light in km/sec */ #define C it will be easy to change the code at some later time. 모든 코드는 #define 행에서 상수값을 간단히 변경함으로써 갱신된다.

8 #define 과 #include의 사용(2)
표준 헤더 파일 C 시스템은 다수의 헤더파일 들을 제공한다. 예를들면 stdio.h, string.h, math.h. #include <stdio.h> #include <math.h> printf() 와 scanf()의 사용(1) printf() 함수는 출력을 위해 사용되고, scanf() 함수는 입력을 위해 사용된다. printf(" Input character : "); scanf("%c", &c1); 헤더파일 "stdio.h”는 printf() 나 scanf() 함수들이 사용될 때 반드시 포함되야만 한다. 변환형식은 %문자로 시작되고 변환문자로 끝난다. (example) %d, %s, %c

9 printf() 와 scanf()의 사용(2)
화면에 abc문자들을 출력하기 위하여 다음과 같은 문장을 사용할 수 있다. printf("abc"); printf("%s", "abc"); printf("%c%c%c", 'a', 'b', 'c') ; 'a' 는 소문자 a에 해당하는 문자 상수이다. 인자가 출력될 때, 출력이 되는 장소를 필드라 하고, 필드에 있는 문자의 수를 필드폭이라 한다. printf("%c%3c%5c\n", 'A', 'B', 'C'); A__B____C

10 printf() 와 scanf()의 사용(3)
scanf() 함수는 printf() 함수와 사용법이 유사하지만 입력을 위해 사용된다. scanf("%d", &x) ; scanf() 함수는 성공적으로 입력된 횟수를 int형으로 리턴한다. printf() 함수는 출력된 문자들의 수를 int형으로 리턴하고, 오류가 발생한 경우에는 음수 값을 리턴한다. scanf("%d", &x); & 기호는 주소 연산자로, &x 는 “x의 주소”라고 읽는다. %d는 %x가 해석될 방식에 상응하는 형식으로, 입력 문자열은 십진 정수로 해석되어 x의 주소에 결과값이 저장된다.

11 printf() 와 scanf()의 사용 (4)
/* 다음 프로그램은 3개의 문자들과 몇 개의 숫자들을 읽고, 출력한다. */ #include <stdio.h> int main(void) { char c1,c2,c3; int i; float x; double y; ..... scanf("%c%c%c%d%f%lf", &c1,&c2,&c3,&i,&x,&y); printf("\nHere is the data you typed in:\n"); printf("%3c%3c%3c%5d%17e%17ebs|n\n", c1, c2, c3, i, x, y);

12 printf() 와 scanf()의 사용 (5)
결 과 Input three characters, an int, a float, and a double: ABC Here is the data you typed in: A B C 3 e e+01 숫자들을 읽을 때 scanf()는 여백(공백, 개행, 탭)은 건너뛸 것이다. 그러나 문자를 읽을 때 공백은 건너뛰지 않는다. AB_C_3_55_77.7 로 입력하면 정확하게 실행되지 않을 것이다. 세번째 문자 로 공백을 읽고, scanf()는 C를 십진 정수로 읽고자 하기 때문에 문제가 될 수 있다.

13 제어의 흐름(1) C 에서 논리 수식은 int형 값 1이나 또는 int형 값 0을 가진다.
만약 expr이 0이 아니면(참), statement가 실행된다. If(expr) statement 여러 개의 문장들이 포함되어 있어도, if-else문 전체가 하나의 문장이다. if(cnt==0) { a = 2; b = 3; c = 5; } else { a = -1; b = -2; c = -3; printf("%d", a+b+c);

14 제어의 흐름(2) for(expr1; expr2; expr3) statement
다음 프로그램은 while 루프의 사용법을 보여준다. #include <stdio.h> int main(void) { int i = 1, sum = 0; while(i <= 5) { sum += i; ++i; } printf("sum = %d\n", sum); ..... for(expr1; expr2; expr3) statement 3개의 수식 expr1, expr2, expr3 모두가 존재하면, 이 for 문은 다음과 같은 while 문과 동일하다. expr1; while(expr2) { statement expr3; 일반적으로 expr1로 초기화를 실행하며, expr2로 조건을 평가하고, expr3으로 저장된 값을 증가 시킨다.

15 제어의 흐름(3) 함 수(1) 다음 프로그램은 for 루프 내에서 if-else문의 사용을 설명한다. 숫자들을 차례로 읽는다.
..... for(i=2; scanf("%lf", &x)==1; ++i) { if(x < min) min = x; else if(x > max) max = x; sum += x; avg = sum / i; 함 수(1) C 프로그램은 여러 개의 파일을 가질 수 있으며 각각의 파일은 여러 개의 함수들로 구성된다. 함수중의 하나가 main() 함수이며, 이 함수부터 프로그램이 시작된다. 이 main()함수에서 다른 함수가 호출되고, 각각의 함수부터 실행이 시작된다 int main(void) { ..... subfunction1(argument); } subfunction1(argument)

16 함 수(2) float maximum(float x, float y);
float minimum(float x, float y); void prn_info(void); 함수는 사용되기 전 선언되어야 한다. 이런 함수선언 형식을 함수원형 이라고 한다. 컴파일러는 함수원형으로 함수에 전달될 인자의 수화 형, 함수에서 리턴 될 값의 형을 알 수 있다. /* We illustrate the program to find minimum and maximum values. */ int main(void) { ..... scanf("%d", &n); /* the number of input */ scanf("%f", &x); /* read in real number */ max = min = x; for(i = 2; i <= n; ++i) { scanf("%f", &x); max = maximum(max, x); min = minimum(min, x); }

17 함 수(3) C에서 함수의 인자는 항상 “값에 의해”전달된다.
float maximum(float x, float y) { if (x > y) return x; return y; } float minimum(float x, float y) if(x < y) return x; C에서 함수의 인자는 항상 “값에 의해”전달된다. 수식이 인자로 함수에 전달될 때 식이 계산되고, 이 식의 값이 함수에 전달됨을 의미한다. 인자로 함수에 전달되는 변수의 값은 호출환경에서 변경되지 않는다. 다음 프로그램은 이것을 잘 설명하고 있다. /* call by value */ ..... void try_to_change_it(int); int main(void) int a = 1; printf("%d\n", a); /* 1 is printed */ try_to_change_it(a); ... void try_to_change_it(int a) a = 777;

18 배열, 문자열, 포인터(1) 배열(Arrays)
C에서 문자열(string)은 문자(character)의 배열(array)이고 배열이름 자체가 하나의 포인터(pointer)이다. 배열(Arrays) 배열은 동일한 형을 갖고 개수가 많은 변수가 요구될 때 사용된다. int a[3] 이 배열은 int형 원소a[0],a[1],a[3]로 구성되어 있다. 배열의 첨자는 항상 0부터 시작한다. /* sorting program */ ..... int i, j, score[CLASS_SIZE], sum=0, tmp; printf("Input %d scores: ", CLASS_SIZE); for(i = 0; i < CLASS_SIZE; ++i) { scanf("%d", &score[i]); sum += score[i]; } for(i = 0; i < CLASS_SIZE - 1; ++i) { for(j = CLASS_SIZE - 1; j > i; --j) { if(score[j-1] < score[j]) { tmp = score[j-1]; score[j-1] = score[j]; score[j] = tmp;

19 배열, 문자열, 포인터(2) 문자열(Strings) 버블 정렬(bubble sort)은 정수들을 정렬하기 위해 사용된다.
Input 5 scores: ordered scores : score[0] = 97 score[1] = 88 score[2] = 77 score[3] = 63 score[4] = 53 378 is the sum of all the scores 75.6 is the class average 버블 정렬(bubble sort)은 정수들을 정렬하기 위해 사용된다. 현재 비교된 원소들의 순서가 맞지 않으면, 그들의 값은 상호 교환된다. 여기에서 이 상호 교환은 다음 코드에 의해 이루어진다. tmp = score[j-1]; score[j-1] = score[j]; score[j] = tmp; 문자열(Strings) C에서 문자열은 문자의 배열이다. 이 절에서는 문자열의 사용법과 아울러 getchar() 과 putchar() 의 사용법을 소개하고자 한다. 다음 프로그램은 문자 배열(문자열)에 사용자가 입력한 라인을 저장한 후, 화면에 입력의 역순으로 출력하는 프로그램이다.

20 배열, 문자열, 포인터(3) ..... printf("\nHi! what is your name? "); for(i=0; (c = getchar()) != '\n'; ++i) { name[i] = c; if(isalpha(c)) sum += c; } name[i] = '\0'; printf("\n %s%s%s \n%s", "Nice to meet you ", name, ".", "Your name spelled backwards is "); for(--i; i >= 0; --i) putchar(name[i]); printf("\n%s%d%s\n\n%s\n", "and the letters in your in your name sum to", sum, ".","Have a nice day !"); ..… 만약 프로그램을 실행시켜 프롬프트 상태에서 Alice B Carole 이라는 이름을 입력하면 화면에 다음과 같이 나타난다. Hi! what is your name? Alice B. Carole Nice to meet you Alice B. Carole. Your name spelled backwards is eloraC .B cilA and the letters in your name sum to 1142. Have a nice day!

21 배열, 문자열, 포인터(4) 포인터(Pointers ) 포인터는 메모리에 있는 한 대상의 주소이다.
배열명은 그것 자체가 하나의 포인터이다. 다음에 나오는 프로그램은 배열과 포인터의 관계에 대해 설명하기 위해 설계되었다. /* the relationship between arrays and pointers */ ..... char c='a', *p, s[MAXSTRING]; p = &c; printf("%c%c%c ", *p, *p+1, *p+2); strcpy(s, "ABC"); printf("%s %c%c%s\n", s, *s+6, *s+7, s+1); strcpy(s, "she sells sea shells by the seashore"); p = s + 14; for( ; *p != '\0'; ++p) { if(*p == 'e') *p='E'; if(*p == ' ') *p='\n'; } printf("%s\n", s); abc ABC GHBC she sells sea shElls by thE sEashorE

22 배열, 문자열, 포인터(5) 파 일(1) C에서 배열, 문자열, 포인터는 밀접하게 관련되어 있다.
char *p, s[100]; 'p' 가 포인터 변수인데 반해, s는 s[0]을 포인트하는 포인터 상수이다. s[i] 와 *(s + i) 는 동등하다. 이와 유사하게 p[i] 와 *(p + i) 는 동등하다. 파 일(1) #include <stdio.h> int main(void) { int c; FILE *ifp; ifp = fopen("my_file", "r"); Main()의 몸체에서 두 번째 줄은 FILE형 포인터인 ifp(“infile pointer”의 약자)를 선언한다. FILE 형은 특별한 구조로stdio.h 에 정의되어 있다.

23 파 일(2) ifp = fopen("my_file", "r");
fopen() 함수는 인자로 두 개의 문자열을 취하며, FILE형 포인터를 리턴한다. 첫 번째 인자는 파일명이고, 두 번째 인자는 파일이 오픈될 모드이다. fopen() 함수는 표준 라이브러리에 존재하며, 이것이 함수원형은 stdio.h 에 있다. 만약 어떤 이유로 파일에 접근할 수 없다면, fopen()은 NULL 포인터를 리턴한다. 명령어 라인 인자를 프로그램 안에서 받아들일 수 있는 방법에 대해 설명한다. #include <stdio.h> int main(int argc, char *argv[]) { 인자 argc는 ”인자 숫자(argument count)”를 의미한다. 인자 argv 는 ”인자변수(argument variable)”를 뜻한다. 다음에서 대문자의 개수를 세는 프로그램을 작성할 것이다.

24 파 일(3) 다음과 같은 명령어를 입력시켜 보자. cnt_letters chapter1 data1
/* count uppercase letters */ ..... int main(int argc, char *argv) { int c, i, letter[26]; FILE *ifp, *ofp; if(argc != 3) { } ifp = fopen(argv[1], "r"); ofp = fopen(argv[2], "w"); for(i = 0; i < 26; ++i) letter[i] = 0; while((c = getc(ifp)) != EOF) if(c>='A' && c<='z') ++letter[c-'A']; for(i = 0; i < 26; ++i) { if(i % 6 == 0) putc('\n', ofp); fprintf(ofp, "%c:%5d ", 'A'+i, letter[i]); } putc('\n', ofp); ..… 다음과 같은 명령어를 입력시켜 보자. cnt_letters chapter1 data1 data1 파일에서 다음과 같은 결과를 얻을 수 있을 것이다.

25 파 일(4) 운영체제의 고찰(1) 이 절에서는 시스템에 종속적인 많은 주제들에 대해 논하고 프로그램의 작성과 실행에 대해 살펴보자. * C 프로그램의 작성과 실행 1. 편집기를 이용하여 C프로그램이 작성될 pgm.c 라는 문서파일을 만든다. 파일명은 반드시 .c로 끝나야 한다. 2. 프로그램을 컴파일한다. cc pgm.c 3. 프로그램을 실행한다. a.out

26 운영체제의 고찰(2) cc -o sea sea.c
UNIX에서 확장자 .c를 삭제하여 소스파일과 실행 파일의 이름을 동일하게 하는 것이 일반적이다. 문법오류들은 컴파일러에 의해 검사되고, 실행시간 오류들은 프로그램이 실행되는 동안에 발생된다. 예를 들어, 만약 0으로 나누기를 시도한 문장들이 프로그램 내에 코딩 되었다면 프로그램이 실행될 때 실행시간 오류가 발생한다. * MS-DOS 환경에 대하여 생각해보자. 터보 C 와 같은 몇몇 C시스템들은 명령어 라인 환경과 통합 환경을 가지고 있다. MS-DOS에서 C컴파일러에 의해 생성되는 실행 가능한 결과는 소스 파일과 같은 이름을 가진 파일에 써진다. 하지만 확장자로 .c 대신 .exe를 가진다. tcc sea.c /* compile */ sea.exe or equivalently sea /* execute */

27 운영체제의 고찰(3) 프로그램 실행중에 사용자가 프로그램을 잠시 중단시키거나 또한 완전히 종료시키기를 원할 경우가 있다.
예를 들면, MS-DOS와 UNIX에서 인터럽트를 걸기 위해 control-C를 통상 사용한다. UNIX에서 control-d입력 후 carriage return 신호가 파일의 끝을 알리는 전형적인 신호이다. MS-DOS에서 control-z를 대신 사용한다. MS-DOS 와 UNIX를 포함한 많은 운영체제에서 입출력을 재지정(redirect)할 수 있다. ls > tmp > 기호는 운영체제가 명령의 출력을 tmp파일로 재지정하게 한다.

28 운영체제의 고찰(4) /* 이 프로그램은 일반적으로 키보드에 연결된 표준 입력 파일로부터 문자를 읽어서 화면에 연결된 표준 출력 파일에 각 문자를 두번씩 출력한다. */ #include <stdio.h> int main(void) { char c ; while(scanf("%c", &c) == 1) { printf("%c", c); } return 0; 프로그램을 컴파일하고dbl_out 파일이란 실행 코드를 만들었다면 다음 4가지 방법으로 재지정을 이용하여 프로그램을 호출할 수 있다. dbl_out dbl_out < infile dbl_out > outfile dbl_out < infile > outfile


Download ppt "A Book on C, 3rd Ed. Al Kelley and Ira Pohl"

Similar presentations


Ads by Google