MEC240 정보응용실습 C 언어기초 Jee-Hwan Ryu School of Mechanical Engineering C 언어의특징 1970년대초 Bell 연구소에서개발 문법적유연성간결성 고도로구조화 여러화일로나누어프로그램후하나로합치는피라미드식구조 광범위한확장성 많은기능의루틴들을함수형태로만들어라이브러리구성 하드웨어의밀착제어가가능 사용자가편리하도록만든고급언어
프로그램을짠다 컴퓨터에게인간의의도를전달하여컴퓨터로하여금인간이시키는일을하도록만드는것 Text editor *.c Source Code 인간이이해하는언어 컴파일 (Compiler) 컴퓨터가알아들을수있는명령어의형태 *.obj Object Code 번역 링크 (Linker) 다른파일의함수나내장함수들과의연결을통해서실행가능한상태의코드생성 *.exe *.com 실행 엄청간단한 C 프로그램 간단한 C 프로그램 #include <stdio.h> 표준입출력용 header 파일 main() main 함수는반드시포함 프로그램본체는 내에작성 printf("programming in C is easy. n"); 출력문 대소문자구분 n : 개행문자 (new line) 문장끝은 semicolon(;) 으로종료 printf(" ") 는출력을위해서미리작성된프로그램으로서 library 함수라고함.
통합개발환경을사용한프로그램개발 Visual C++ 프로그램실행 [ 시작 ] - [ 프로그램 ] - [Microsoft Visual Studio] - [Microsoft Visual C++] 새프로젝트파일생성 [File] [New] 메뉴선택 New 대화상자의 Projects 탭에서 [Win32 Console Application] 선택 필요하면 Location 입력 (project 파일생성위치를변경할때 ) Project name 입력후 [OK] 통합개발환경을사용한프로그램개발 Visual C++ 프로그램실행 [ 시작 ] - [ 프로그램 ] - [Microsoft Visual Studio] - [Microsoft Visual C++] 새프로젝트파일생성 [File] [New] 메뉴선택
통합개발환경을사용한프로그램개발 (2) New Project Information 대화상자에서 empty project 선택후 [Finish] 새 C 프로그램을프로젝트에추가 [File] [New] 메뉴선택 통합개발환경을사용한프로그램개발 (2) 프로그램작성 : [File] [Save] ( 단축키 Ctrl+S) 메뉴선택하여저장 Build Run
통합개발환경을사용한프로그램개발 (3) 컴파일 & 링크 [Build] [Build *.exe] ( 단축키 F7) 또는 [Build] [Build All] 메뉴선택 컴파일결과가화면아래의창에출력됨 실행 [Build] [Execute *.exe] ( 단축키 Ctrl+F5) 메뉴선택 통합개발환경을사용한프로그램개발 (4) 종료 변경된내용저장 : [File] [Save All] 메뉴선택 작업종료 : [File] [Close Workspace] 메뉴선택 프로젝트다시수행 Visual C++ 실행 [File] [Open Workspace] 메뉴선택 작업할 project 에대한 workspace 파일선택
실습문제 다음과같이자신의이름을출력하는프로그램을작성하여실행. Hello, Gil-Dong Hong!! C 프로그램의작성과구조이해 /* Sample Program */ /* 설명문 ( 컴파일되지않음 ) */ #include <stdio.h> /* 전처리기 */ int GetSum(int x, int y) /* 사용자함수정의 */ int z; z = x + y; return(z); /* 결과값을출력으로되돌려줌 */ void main() /* main 함수 */ int a, b, sum; /* 변수형선언 */ scanf("%d%d", &a, &b); /* 입력함수호출 */ sum = GetSum(a,b); /* 사용자함수호출 */ printf("the sum of %d and %d is %d", a, b, sum); /* 출력함수호출 %: 위치, d: 십진수 */ 위프로그램을바탕으로앞으로배우게될내용들을살펴보자!
C 언어의함수 C 언어는함수들의집합이다. C 언어의함수들은컴퓨터에게원하는일들을지시하는명령어들의집합으로이루어져특정작업을하는하나의단위가되며, 그결과값을되돌려주기도하는일종의일꾼이다. main 함수 프로그램에서반드시있어야하는특수한함수 프로그램의실행은 main 함수로부터시작하여 main 함수에서끝난다. 여러일꾼들을감독하는관리인 내장함수 회사에정식으로고용된일군과같다 (Ex., scanf, printf) 할수있는일은 stdio.h 에등록되어있다 사용자정의함수 잠시불러쓰는임시직일군 할수있는일은 main 함수전에정의 (Ex., GetSum) 함수및프로그램구조 #include < 등록화일 > GetSum() 임시직일꾼 이력서 Main() 관리자 scanf() 정식직원 printf() 정식직원 GetSum() 임시직
함수의기본형태 되돌림자료형함수이름 ( 매개변수리스트 ) -> 함수의원형 변수선언및초기화여러 C 구문들 예제의함수들을살펴보자 전처리기 #include, #define 등은전처리기제어문 printf() 함수나 scanf() 함수를사용하기위하여이들이등록 ( 선언 ) 되어있는 stdio.h라는파일을포함 (include) 시키는것 이를 < > 로묶어주어, C의표준라이브러리헤더파일임을알려준다. *.h 로묶어주는경우는사용자정의헤더파일 빈번히쓰이는함수들을미리만들어컴파일후목적코드로서라이브러리를구성하고있다가링크시실행코드에첨가 이러한함수의원형을나열해놓은헤더파일을프로그램의시작부분에둠으로서라이브러리에있는기능을사용가능 #define EOF -1 /* EOF 를 -1로정의 */
프로그램의실행과정 소스프로그램 *.c #include <stdio.h> main() printf( Turbo C ).. 표준라이브러리함수 *.Lib printf, scanf 컴파일 오브젝트파일 *.obj 링크 실행모듈 *.exe 식별자 식별자 (identifier) 변수, 함수, 상수와같은프로그램구성요소의이름 식별자생성규칙 규칙 : 영문자, 숫자, 밑줄문자 (_) 로구성, 숫자로시작하지않음 올바른예 : sum, x2000, tax_rate1, tax_rate2, Table, table 잘못된예 : 4th, "x", tax-rate, id@host ANSI 표준은 31 자까지구별, 일부컴파일러는 8 자까지구별 tax_rate1과 tax_rate2는일부컴파일러에서는같은식별자로인식 식별자권장사항 의미를알수있도록부여하는것이바람직함 ( 예 ) tax 두단어를결합한식별자는밑줄문자또는대문자로구분함 ( 예 ) tax_rate TaxRate
예약어 예약어 (reserved word) C 언어에서특별한용도로미리예약된이름 키워드 (keyword) 라고도함 식별자로서사용할수없음 예약어의예 자료형 : char short int long unsigned float double struct union typedef enum void const signed 제어문 : if else switch case default for while do break continue goto return 기억장소 : auto register static extern volatile 연산자 : sizeof 일부컴파일러에서사용하는예약어 ada fortran pascal asm entry near far huge 데이터형 ( 자료형 ) 데이터를처리하여결과를도출하는것이프로그램의관심 이데이터는정수, 실수, 문자일수도있다. 이것이데이터의형 (Type) 이다. 변수 : 데이터를프로그램실행도중저장해두는곳 변수는메모리상에서자신의주소를가진다. int var = 10 변수 : var 메모리번지 2 byte 30CC 30CD 30CE 30CF 30D0 30D1
printf( ) 함수를이용한화면출력 #include <stdio.h> void main() int a, b; a= 10; b = 5; printf(" multiply divide n"); printf("%8d%10d n", a+b, a/b); % 자리에출력, 8,10은출력폭에대한자리수, d는십진수, n 줄바꿈 printf( %5.2f, b); 실수형으로데이터를출력, b값을전체 5자리 ( 소수점포함 ) 소수점이하 2자리로출력 printf( %c, 107); ASCII코드값 107에해당하는 k 를출력 출력함수형식지정자 정수형식지정자 int 가 16 비트인경우에 long 자료형은 %ld, %lu 을사용 int 가 32 비트인경우에 short 자료형은 %hd, %hu 을사용함
출력함수형식지정자 (2) 실수형식지정자 %p 포인터 ( 주소 ) 값 문자 / 문자열형식지정자 예제 1. int a = -200; printf("%d %u n", a, a); 음수를 %u 지정자로출력 2. printf("%o %x n", 500, 500); 10 진수를 8, 16 진수로변환 3. double r = 123.45678; double s = 12340000.0; printf("%f %e %g n", r, r, r); printf("%f %e %g n", s, s, s); %f, %e, %g 비교 4. printf("%s and 100%%", "C language"); 문자열, % 출력 5. char c = 'A'; 문자의 ASCII코드값출력 printf("%c의코드 : 10진수 %d, 8진수 %o, 16진수 %x", c, c, c, c);
scanf( ) 함수를이용한입력 #include <stdio.h> void main() char a; printf("enter a character : "); scanf("%c", &a); printf("%c n", a); int a, b, c, d; d=scanf( %d%d%d, &a, &b, &c); 세수를입력시킬때, 10 20 30과같이숫자사이한칸씩띄워서구별입력이이루어지면 3이 d에저장, scanf() 의리턴값은정상적으로입력된항목의수 입력함수형식지정자 scanf() 형식지정자 printf() 와비슷하지만차이가있음
라인버퍼방식입력 라인버퍼방식입력 키보드에서 [Enter] 가입력될때에줄단위로버퍼에저장됨 scanf() 함수는버퍼에서입력받음 예제 예제 1. 형식지정자사이에공백이없어도무방 scanf("%d%f%lf", &i, &f, &d); scanf("%d %f %lf", &i, &f, &d); 2. ( 예외 ) 문자입력... 입력 : a b 인경우에 scanf("%c %c", &x, &y);... x='a', y='b' 입력 scanf("%c%c", &x, &y);... x='a', y= ' ' 입력 3. 제어문자열에특별한경우가아니면다른문자사용하지않음 scanf("%d n", &a); (x)... 잘못된예 scanf("%d : %f", &i, &f); 정수와실수사이에 : 입력 ( 예 ) 5 : 12.2
putchar( ), getchar( ) #include <stdio.h> void main() putchar('a'+1); putchar(' t'); putchar(0x44); a 는문자a의ASCII 값0x61, a +1=0x62 로서 b의 ASCII 코드값 0x44는문자D 에해당 a=getchar(); 입력한문자의 ASCII 코드값을리턴한다. C 의기본데이터형 (type) 자료형 (data type): 데이터의크기를정해주기위한것 정수 (integer) 실수 (floating point number): 부동소수점수 문자 (character) (cf) 정수 1과실수 1의컴퓨터내부표현은다르다. 문자는컴퓨터내부에서정수로표현된다. C언어의기본자료형 int 정수 char 문자 float 실수 ( 보통정밀도 ) double 실수 (2 배정밀도 ) double x; x는2배정밀도실수변수 char c; c는문자변수
정수형 (Integer) 정수형의크기와범위 컴퓨터와컴파일러에따라서 16-bit 또는 32-bit 로표현됨. 16-bit 정수 : -32,768 (2 15 ) 32,767(2 15-1) 32-bit 정수 : -2,147,483,648(2 31 ) 2,147,483,647(2 31-1) 실수형 (float) 4 byte 소수점을포함한숫자 모두부호를가지고있음 유효숫자가 6개이하일때 float형을사용 Double이나 long double은큰수이거나높은정밀도를요구하는제한적인경우에사용유효숫자지수범위유효숫자 x 10 지수 float (32-bit 실수 ): 6자리 -38 38 double (64-bit 실수 ): 15 자리 -308 308 정수형만으로도가능한프로그램을일부러실수형을쓰지않는것이좋다.
문자형 (Character type) 가장작게메모리를차지 작은범위의숫자를다룰때나메모리입출력을할때쓰인다. 주로 ASCII문자를표현하기위해서쓰임 정수형 (signed) char unsigned char 바이트 1 1 범위 -128 ~ 127 0 ~ 255 문자는 8-bit로표기 (cf) 한글한글자는 16-bit로표기 char 자료형은 8-bit 정수표기에사용가능 8-bit 정수 : -128 127 자료형수정자 (Modifier) 자료형앞에붙여서자료형의표현범위를변경 ( 예 ) long, short, unsigned long int 긴정수 (32-bit) short int 짧은정수 (16-bit) unsigned int 부호없는정수 양수의표현범위 2배증가 unsigned long int 부호없는긴정수 (32-bit) unsigned short int 부호없는짧은정수 (16-bit) 자료형수정자와함께사용하는int는생략가능 long int a; long a; 두변수선언은같은의미임 unsigned 정수의표현범위 16-bit unsigned: 0 65,535 (2 16-1) 32-bit unsigned: 0 4,294,97,295(2 32-1)
실수를정수변수에대입 #include<stdio.h> #include<math.h> /* sqrt 정의되어있음 */ void main() int i_result; float f_result; i_result = sqrt(2); f_result = sqrt(2); printf("the result 1 is %5d n", i_result); printf("the result 2 is %5.3f n", f_result); 상수 (Constant) 변하지않는명시적인자료 정수상수 : 12 056 0x4f 실수상수 : 3.14 1.0 1.5e5 문자상수 : A a 1 n @ 한 a 는십진수 97 을의미함 컴퓨터는문자자체가아닌숫자로문자를이해한다. 문자열상수 : Korea 대한민국 한
정수상수 정수상수 10진수 : 1 9로시작하여표현 ( 예 ) 789 8진수 : 0으로시작하여표현 ( 예 ) 064 16진수 : 0x 또는 0X로시작하여표현 ( 예 ) 0x3af 정수상수는기본적으로 int 형으로표현됨 자료형지정접미사 U, L 1234 int 형정수 1234L 40000U 40000UL long 형정수 unsigned 형정수 unsigned long 형정수 실수상수 실수상수 소수점을포함한숫자 3.14 1.0 1. 소수부분 =0 이면소수점이하생략가능 0.12.12 정수부분 =0 이면정수부분생략가능 과학용표기법 6.2e3 (= 6.2 x 10 3 ) 6.2E3 4e-2 (= 4 x 10-2 ) 소수점이없어도실수상수 실수상수는기본적으로 double 형으로표현됨 float형지정접미사 F 6.2 double형실수 6.2F float형실수
문자상수 문자상수 영문자, 숫자, 특수문자를작은따옴표 (' ') 로묶어서표시 ( 예 ) 'A' 'b' '5' '@' '&' ASCII 코드 문자에대응되는정수값을정한미국표준코드 ASCII코드는 8-bit 정수로표현 ASCII코드의순서는숫자와알파벳순서와같음 '0' 과 0은다르다. '0' 은정수 48과같음 한문자출력 #include<stdio.h> void main() int a; putchar('a'); putchar(' n'); a = 'a'; printf("0x%x %c n", 97, a); printf("%c n", 'a'); 한문자는작은따옴표, 문자열은큰따옴표
확장열 확장열 a f n t 이름 Alert FormFeed NewLine Horizontal tab Backslash Single quote Double quote 의미경고음프린터에서한페이지넘김다음행의처음다음 tab 위치로역슬래쉬자체작은따옴표자체큰따옴표자체 Printf( a n! Good! n ); 경고음 ( 삑 )! Good! 문자열상수 문자열상수 연속된문자들은큰따옴표 (" ") 로묶어서표시 ( 예 ) "Korea" 문자열의표현 문자열은컴퓨터내부에서 null문자로끝나는연속적인문자들로표현 ( 예 ) "Korea" 'K' 'o' 'r' 'e' 'a' ' 0' K o r e a \0 ( 예 ) "a" 는 'a', ' 0' 로구성되므로 'a' 와같지않음 null 문자열 "" 은 ' 0' 만으로구성되는문자열임
변수 변수 (variable) 값을저장할수있는, 이름이부여된기억장소 변수의선언 변수를사용하기전에반드시변수의자료형을선언해야함. int p; float a, b, c; 여러개의같은자료형의변수선언 변수를선언하면변수의메모리공간이확보됨 변수선언위치 : 함수의시작부분 ( 다른위치는나중에다룸 ) main() 변수선언프로그램실행문 변수의초기화 변수는초기값을지정한다음에사용해야함 int a; b = a; (X) a의값이정의되지않았으므로잘못 실행문에서초기화 int a; a = 25; 변수의초기화선언 int a = 25; float data, sum = 0.0, average; sum 만초기화 ( 권장하지않음 )
주석 주석 (comment) /* This is a comment */ /* */ 로둘러싸인부분 예 설명문으로서컴파일러에의해서무시됨 프로그램저작권, 수정이력, 동작설명등의문서화용도로사용 /* hello.c * 내용 : 자료를순서대로나열한다. * ver 0.0: 03/6/10 작성자 : 홍길동 */ int sum; /* 자료들의합 */ int max; /* 최대값 */ 여러줄에걸쳐서작성가능 산술연산자 %: 나머지 (Modulus) ++: 피연산자의값을하나증가 ( 증가연산자 ) --: 피연산자의값을하나감소 ( 감소연산자 ) 17/5 ( 정수 / 정수 ) = 3 17.0/5 ( 실수 / 정수 ) = 3.4 17/5.0 ( 정수 / 실수 ) = 3.4 전위형 (prefix) ++a; 먼저 a를증가시키고이값을이용해다른연산을하라 후위형 (postfix) b++; 우선원래의값으로연산을한후b의값을증가시켜라
증가연산자 #include <stdio.h> #include <math.h> void main() int a=1, b=1; printf("a= %d, b= %d n", ++a, b++); printf("a= %d, b= %d n", a, b); 관계연산자, 대입연산자 <, <= : 작다, 작거나같다 >, >= : 크다, 크거나같다 ==,!= : 같다, 다르다 a = b : b를 a에대입 혼합대입연산자 k=k*3 는 k *= 3 와같다 +=, -=, *=, /=, %=, <<=, >>=, &=, =
논리연산자 ( 한개를다룸 ), 비트연산자 ( 여러개를다룸 )! : 논리부정 (negation) && : 논리곱 (logical and) : 논리합 (logical or) ~ : 비트부정 ( 비트논리 ), 보수연산 ~ 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1 1 ~a+1 == -a (1의보수 +1 = 2의보수 = 음수 ) & : 비트논리곱 ( 비트대비트논리곱 ) n = n & 0xfffb; ( 이진수 1111 1111 1111 1011), 세번째비트 0 : 비트논리합 ( 비트대비트논리합 ) ^ : 비트배타적논리합 ( 비트대비트배타적논리합 ) << : 비트좌쉬프트 >> : 비트우쉬프트 논리연산자, 비트연산자 << 와 >> 사용시비게되는우측또는좌측비트는0으로채워진다. int a = 0xc5; a <<= 2; a : 1 1 0 0 0 1 0 1 -> 0 0 0 1 0 1 0 0
십진수의이진형태 #include<stdio.h> void BinPatt(int z); void main(void) int a,ok ; do printf("enter a Number to be Binary pattern : t"); ok = scanf("%d",&a); //scanf() 함수는 Ctrl-z 입력시 -1 리턴, EOF 값은 -1 로정의되어있다. BinPatt( a ); while(ok!= EOF); void BinPatt(int z) int i; for( i = 16; i >=1; i--) printf("%d", ( z >> i-1 ) & 0x0001); printf(" a n n"); /*void BinPatt(int z) int i; for( i = 0; i <= 15 ; i++) */ printf("%d", ( z & (0x8000 >> i) ) >> 15-i); printf(" n n"); 조건연산자 변수 = 조건식 1? 식 2: 식 3; 조건식이참이면, 식 2 의값을변수에 조건식이거짓이면, 식 3 의값을변수에 C= (x>0)? x: -x; 조건연산자를이용해절대값을구하는방법 If (x>0) c=x; else c=-x #include<stdio.h> void main() int a, abs; scanf("%d", &a); printf("%d n", abs = (a > 0)? a : -a);
캐스트연산자, sizeof 강제적으로형을변환시켜주는연산자 (float) i; //i를원래 int로선언하였어도이부분에선실수형으로쓰인다. 1년은 365.2422일 -> 날, 시간, 분, 초로나타내어보자 sizeof 연산자 : 어떤대상물에할당된메모리크기 (byte) 를알려준다 sizeof 수식, sizeof ( 형 ) -> sizeof(a), sizeof(int) 연사자의종류와우선순위 우선순위 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 연산자의종류단항연산자산술연산자쉬프트연산자관계연산자비트연산자논리연산자조건연산자혼합대입연산자컴마연산자 연산자 () [] ->( 구조체멤버연산자 ) *( 포인터 ) &( 주소 ) * / % + - << >> < <= > >= ==!= & ^! &&? : = += -= *= /= %= = ^= &= >>=,
분기제어 프로그램의실행순서를의도적으로바꾸어야할경우 분기문 if (else if) else 문 형식 if ( 조건 1) 문장 1; else if ( 조건 2) 문장 2; else 문장 3 Y 조건 1 N Y 내용조건2 문장 1 문장 2 문장 3 N Switch -case 문 switch(s) case S1: 문장 1; break; case S2: 문장 2; break; default 문장 0; S S1 S2 Sn default 문장 1 문장 2 문장 n 문장 0 goto label; Break 문이하나의루프를빠져나가는데비해이를이용해한꺼번에빠져나갈수있다.
루프제어 루프문 형식 내용 while While (P) 문장 ; 거짓 P 참문장 do-while Do 문장 ; while() 참 문장 P 거짓 for 초기식조건식증감식 For(P1; P2; P3) 문장 ; Ex) for(i=0;i<10;i++) 문장 ; -> 문장을 10 번수행 P1( 초기화 ) P2 문장 P3( 카운트 ) 루프제어 kbhit() 함수는키보드가눌려짐을검출, conio.h에선언되어있음, getch() 로대체하고결과비교. asthree.c 무한루프방법 for( ; ; ) if( 조건 ) break; while(1) if ( 조건 ) break; for문안에는함수등도들어갈수있다. asc.c