c언어의ael.chungbuk.ac.kr/lectures/undergraduate/internship/... · 2017-07-28 · ascii...

24
C 언어의 발달 과정 ALCOL60->CPL->BCPL->B->C 1972 미국 Bell 연구소의 Dennis Ritchie 의해 B 언어의 한계를 극복하고자 개발됨. C 언어의 특징 1. 시스템간 호환 이식성이 좋음 2. 고급 저급 언어간 인터페이스 용이 3. 비트 증감연산자 풍부한 연산자 지원 4. UNIX 운영체제의 기본이 5. 구조적 프로그래밍언어로 모듈식 구현이 용이 6. 함수의 집합으로 구성된 함수형 언어 7. 동적메모리 관리에 의한 H/W 제어 용이 8. 배열과 포인터 이용한 주소지정 연산 용이 C 언어의 기본 구조 하나의 main() 함수를 기본으로 하여 구성되며, 프로그램의 실행은 main() 함수의 { 시작되어 } 끝나게 된다. 기본구조의 /* 프로그램 기본구조 */ ---a 주석문으로 프로그램 어느곳이나 사용가능 #include <stdio.h> ---a 선행처리기 (main()함수를 읽기 전에 수행) main() ---a main() 함수 { ---a 프로그램 시작 변수의 선언 ---a 프로그램 내용 제어문 / 입출력 함수 ---a 프로그램 내용 } C 언어의 기본 사항들 대문자와 소문자가 구별되면, 주로 소문자에 기초하여 작성된다. main()함수에서 시작되며, 반드시 존재해야 한다. 함수의 본체는 { }으로 묶는다. 문장은 반드시 ; 으로 끝나야 한다. 주석문은 /* */으로 묶어 표시한다. 프로그램 작성 실행들 프로그램 작성 ; SOURCE PROGRAM (확장자 *.C 파일) 원시프로그램 COMPILE ; OBJECT PROGRAM (확장자 *.OBJ 파일) 목적프로그램 LINK/EDIT ; EXECUTE PROGRAM (확장자 *.EXE 파일)

Upload: others

Post on 23-Jul-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: C언어의ael.chungbuk.ac.kr/lectures/undergraduate/internship/... · 2017-07-28 · ASCII 코드는 7bit 로 문자를 나타나게 하는데 메모리의 기본단위가 1byte 이기

C 언어의 발달 과정

ALCOL60->CPL->BCPL->B->C

1972 년 미국 Bell 연구소의 Dennis Ritchie 에 의해 B 언어의 한계를 극복하고자 개발됨.

C 언어의 특징

1. 시스템간 호환 및 이식성이 좋음

2. 고급 및 저급 언어간 인터페이스 용이

3. 비트 및 증감연산자 등 풍부한 연산자 지원

4. UNIX 운영체제의 기본이 됨

5. 구조적 프로그래밍언어로 모듈식 구현이 용이

6. 함수의 집합으로 구성된 함수형 언어

7. 동적메모리 관리에 의한 H/W 제어 용이

8. 배열과 포인터 이용한 주소지정 및 연산 용이

C 언어의 기본 구조

하나의 main() 함수를 기본으로 하여 구성되며, 프로그램의 실행은 main() 함수의 { 로 시작되어 } 로 끝나게

된다.

기본구조의 예

/* 프로그램 기본구조 */ ---a 주석문으로 프로그램 어느곳이나 사용가능

#include <stdio.h> ---a 선행처리기 (main()함수를 읽기 전에 수행)

main() ---a main() 함수

{ ---a 프로그램 시작

변수의 선언 ---a 프로그램 내용

제어문 / 입출력 함수 등 ---a 프로그램 내용

}

C 언어의 기본 사항들

대문자와 소문자가 구별되면, 주로 소문자에 기초하여 작성된다.

main()함수에서 시작되며, 반드시 존재해야 한다.

함수의 본체는 { }으로 묶는다.

한 문장은 반드시 ; 으로 끝나야 한다.

주석문은 /* */으로 묶어 표시한다.

프로그램 작성 및 실행들

프로그램 작성 ; SOURCE PROGRAM (확장자 *.C 파일)

원시프로그램

COMPILE ; OBJECT PROGRAM (확장자 *.OBJ 파일)

목적프로그램

LINK/EDIT ; EXECUTE PROGRAM (확장자 *.EXE 파일)

Page 2: C언어의ael.chungbuk.ac.kr/lectures/undergraduate/internship/... · 2017-07-28 · ASCII 코드는 7bit 로 문자를 나타나게 하는데 메모리의 기본단위가 1byte 이기

실행프로그램

변 수란 무엇인가.?

변수란 값이 변하는 수로, 한순간에 하나의 데이터 값을 가질 수 있고 이 값을 다른 값으로

마음대로 바꿀 수 있는 것을 의미하는데, 모든 변수는 반드시 이름이 붙어 있도록 되어 있다.

따라서 c 프로그램에서 변수를 사용하려면 먼저 이름을 지어야 하는데 이런 이름들을 식별자

또는 명칭이라고 한다. 이런 명칭은 변수 뿐만이 아니라, 새로운 함수를 정의하거나 새로운

데이터 유형을 정의할 때에도 필요한데 c 의 모든 명칭은 다음과 같은 규칙에 맞게 만들어야

한다.

영문자, 숫자, 밑줄문자(_)를 조합하여 구성한다

첫자는 반드시 영문자, 밑줄문자로 시작.

예약어는 사용할 수 없다.

대소문자 구분

공백, 특수문자는 포함할수 없다.

c 의 5 가지 기본 데이터형

1. char 문자 데이터

2. int 부호있는 정수

3. float 실수

4. double 실수

5. void 값이 없슴

형식

데이터타입 변수명;

- 변수안에 저장될 값에 맞는 데이터형을 적고 고유한 변수명을 적어주면 된다.

데이터 유형

정수형

소수부가 없는 데이터형를 말한다. 정수형들은 서로 다른 메모리를 사용하여

정수를 저장하는데 메모리의 크기가 클수록 표현할수 있는 정수값의 범위는 크다.

sigend 는 양수값과 음수값을 모두 표현할수 있으며 unsinged 는 양수값만

표현할수 있다. unnsiged 는 음수값이 들어갈수 없고 양수값만 저장될수 있는

변수를 선언할 경우 사용한다.

int 변수명 1,변수명 2…. (-32768 ~ 32767) 16 비트

short 변수명 1,변수명 2….(-32768 ~ 32767) 16 비트

long 변수명 1,변수명 2….(-2147483648~2147483647) 32 비트

Unsigned int 변수명 1,변수명 2….(0~65535) 32 비트

Unsigned short 변수명 1,변수명 2….(0~65535) 32 비트

Unsigned long 변수명 1,변수명 2….(0~4294967295) 32 비트

실수형

소수부가 있는 데이터형를 말하며 매우 큰값의 표현이나 아주 작은 값들을

처리하기에 적당하다. 메모리의 크기가 클수록 표현할수 있는 수의 정밀도가

커진다.

float 32 비트(소숫점 이하 6 자리 표현)

double 64 비트(소숫점 이하 14 자리 표현)

long double 80 비트(소숫점 이하 19 자리 표현)

Page 3: C언어의ael.chungbuk.ac.kr/lectures/undergraduate/internship/... · 2017-07-28 · ASCII 코드는 7bit 로 문자를 나타나게 하는데 메모리의 기본단위가 1byte 이기

문자형

C 에서 문자 데이터는 하나의 문자를 의미하며 정수 데이터 유형의 경우와 같이

unsigned 가 붙어있는 것과 그렇지 않은 것이 있다. 문자를 컴퓨터에 표현하려면

특정 코드를 사용하여야 하는데 c 에서는 이 코드로 ASCII 라는 이름의 코드를

사용하고 있다. ASCII 코드는 7bit 로 문자를 나타나게 하는데 메모리의

기본단위가 1byte 이기 때문에 8bit 로 한 문자를 나타나게 한다. 그런데 이

코드라는 것이 2 진수이 때문에 겉으로 볼 때 정수와 전혀 차이가 없어 c 에서

아예 이 둘의 구분의 없애 버렸다. 단지 문자 데이터 유형은 1byte 의 크기를

갖는 정수 데이터 유형으로 간주하게 된 것이다. 즉 c 에서의 문자 데이터 유형은

크기가 1byte 인 정수 데이터 유형으로 생각하면 된다.

char (-128~127)8 비트

unsigned char (0~255)8 비트

상 수란 무엇인가.?

- 변하지 않고 고정된 값

- 연산에 사용되는 실제의 데이터 또는 값으로 변수의 초기화 및 특정값 대입시 사용

문자 상수

하나의 단일 문자 의미. 문자 상수는 반드시 (' ')안에 단일문자로 표기한다.

반드시 하나의 문자만 와야 하며 'AB'등과 같이 사용할 수 없으며 이 경우

컴파일시 에러가 발생한다.

예) char a='A';

문자열 상수

두개 이상의 문자가 모여 있는 것을 문자열이라고 한다. 문자열 상수는

이중인용부호(" " )를 사용하여 표기한다. C 에서는 이를 기본 데이터형으로

제공하지 않는다 (C 에서 스트링은 문자 유형의 배열로 처리하고 있다. )

- 문자열 끝에 null string('\0')이 추가되어 그 끝을 알 수 있도록 함

ex)"test","c++ programming";

char name[7]="김나래"

printf()

표준 입출력 함수- 표준 입출력 장치를 통해 데이터를 입력하거나 출력하는 기능을 갖고 있는

함수

표준 입출력 함수를 사용하려면 #include <stdio.h>를 기술해 줘야 한다.

형식

printf(" 출력양식 ", 인수 1,인수 2...);

서식문자열에는 모든 문자를 사용할 수 있으며 변환문자와 제어문자를 제외하고는 화면에 그대로 출력

인수와 변환문자는 일대일 대응해야 하며 반드시 인수의 자료형과 문자의 자료형은 일치해야 한다.

ex) printf("%d + %d= %d\n",10,20,30);

출력결과 10+20=30

변환문자

변환문자 의미 자료형

%d 10 진수로 출력 정수형

Page 4: C언어의ael.chungbuk.ac.kr/lectures/undergraduate/internship/... · 2017-07-28 · ASCII 코드는 7bit 로 문자를 나타나게 하는데 메모리의 기본단위가 1byte 이기

%o 8 진수로 출력

%x 16 진수로 출력

%ld long 형 10 진수로 출력

%lo long 형 8 진수로 출력

%lx long 형 16 진수로 출력

%u 부호없는 10 진수로 출력

%c 하나의 문자로 출력 문자형

제어문자

제어문자 출 력 형 식

\b 커서를 한칸 앞으로 이동 함

\f 한페이지 이동 함

\n 다음줄의 처음으로 줄바꿈 함

\r 커서를 그 줄의 맨 앞으로 이동시킴

\t 탭문자 간격만큼 커서를 이동시킴

\v 커서를 수직으로 칸을 띄우기 함

\a Bell 소리가 나게 함

예제 1)

/* printf()함수를 이용해서 데이터 출력하기 */

#include<stdio.h>

main(){

int x=345;

float y=34.564;

printf("%10d\n",x); /*x 를 10 자리에 맞추어 출력한다. */

printf("%-10d\n",x); /*x 를 10 자리에 맞추어 출력하고 출력방향을 왼쪽에 맞춘다. */

printf("%010d\n",x); /*x 를 10 자리에 맞추어 출력하고 남는 공백을 0 으로 채운다. */

printf("%.2f\n",y); /*y 를 소수점 이하 2 자리로 출력한다. */

printf("%-10.3f\n",y) ; /*y 를 소수점 이하 3 자리,전체자릿수는 10 자리 출력방향은 왼쪽으로 출력한다. */

}

scanf()

형식

scanf("변환문자", 인수 1,인수 2...);

- 일반 변수를 인수로 사용할 때는 인수 앞에 주소 연산자인 & 기호를 사용해야 한다.

- 여러개의 데이터를 입력할 때 데이터의 구분은 공백과 엔터키로 구분한다.

- 변환문자는 입력자료의 형(Type) 을 지정

- 인수의 주소는 입력자료가 기억될 변수의 주소를 나타내며, 변환문자의 갯수와 같아야 함.

ex) scanf("%d %d",&num1,&num2); /*정수값 두개를 입력받아 num1 과 num2 에 저장한다. */

char name[15],c;

scanf("%s %c",name,&c);

Page 5: C언어의ael.chungbuk.ac.kr/lectures/undergraduate/internship/... · 2017-07-28 · ASCII 코드는 7bit 로 문자를 나타나게 하는데 메모리의 기본단위가 1byte 이기

=> scanf() 함수에서 단일 문자 변수 앞에는 &연산자를 붙여야 하지만 문자배열에서는 &기호를 생략한다.

배열의 이름자체가 주소값을 나타내므로 생략가능한 것이다. 문자배열의 맨 마지막에는 null 문자가

자동적으로 입력된다.

예제 2 )

/* scanf()를 사용하여 두 정수값을 입력받아 덧셈 연산하기 */

#include<stdio.h>

void main(){

int a,b,sum;

printf("input two numbers :");

scanf("%d %d",&a,&b); /* 정수 두개를 입력받아 변수 a 와 b 에 저장한다. */

sum=a+b;

printf("sum of two numbers : %d\n",sum);

}

예제 3)

#include<stdio.h>

main()

{

int x;

float y;

char ch1, ch2[30];

printf("10 진정수, 실수, 단일문자, 문자열을 입력하시오 ! \n");

scanf("%d %f %c %s",&x, &y, &ch1, ch2);

printf("10 진정수 :%d, 실수 :%f, 단일문자 :%c, 문자열 :%s\n",x, y, ch1, ch2);

}

문자 입력함수

*한 개의 문자나 문자열을 키보드와 console 을 통해 입출력 하는 함수

gets() 함수

*문자열 입력을 받아들이며, Enter key 에 의해 입력이 됨. 따라서 공백이 포함된 문자열을

입력받을수 있다.

*입력된 내용은 () 안의 변수에 기억된다.

getch() 함수

*한개의 문자 입력을 받아들이며 Enter key 에 의하지 않고 바로 입력되며,입력된 내용이

보이지 않음

*입력된 내용은 다른 변수에 대입시켜 사용함.

getche() 함수

*한개의 문자 입력을 받아들이며 Enter key 에 의하지 않고 바로 입력되며, 입력된 내용은

보임. 입력된 내용은

다른 변수에 대입시켜 사용함.

getchar() 함수

*한개의 문자 입력을 받아들이며, Enter key 에 의해 입력이 됨.

*입력된 내용은 다른 변수에 대입시켜 사용함.

문자 출력 함수

putchar() 함수

*한개의 문자를 출력하며 자동개행하지 않고, () 안에는 상수나 변수가 온다.

puts() 함수

*문자열을 출력하고 자동 개행하며, () 안에는 상수나 변수가 온다.

예제 4)

#include <stdio.h>

void main(){

Page 6: C언어의ael.chungbuk.ac.kr/lectures/undergraduate/internship/... · 2017-07-28 · ASCII 코드는 7bit 로 문자를 나타나게 하는데 메모리의 기본단위가 1byte 이기

char ch1;

printf(" 문자를 입력하세요!");

ch1=getchar(); /*단일문자를 입력받아 ch1 변수에 저장한다.*/

putchar(ch1); /* ch1 에 저장된 단일문자를 화면에 출력한다.*/

}

예제 5)

/* gets(),puts()함수를 이용하여 이름과 전화번호 입력받아 화면에 출력하기*/

#include <stdio.h>

void main(){

char name[15],tel[10];

clrscr();

puts("Your name? ");

gets(name);

puts("Telephone number? ");

gets(tel);

printf("Your name is %s and telephone number is %s",name,tel);

getch();

}

산술연산자, 증감연산자

* 연산자의 우선순위

- 어떤 연산식이 주어져 있을 때 어느 부분 먼저 연산해야 할지 결정되는 것이 연산자 우선순위이다.

같은 종류의 연산자가 있으면 연산자의 결합방향에 따라 연산하게 된다.

구 분 (우선순위) 연 산 자

괄호, 구조체, 공용체 () [] . ->

단항연산자 ! ~ ++ -- -부호 +부호 * & sizeof

승제 * / %

가감 + -

SHIFT << >>

비교 < <= > >=

등가 == !=

bit AND &

bit XOR ^

bit OR |

논리 AND &&

논리 OR ||

조건연산자 ? :

대입연산자 = += -= *= /= %= >>= <<= &= ^= |=

나열연산자 ,

산술연산자

연산자 의미

* 곱셈

/ 나눗셈

% 나머지 연산자

+ 덧셈

- 뺄셈

Page 7: C언어의ael.chungbuk.ac.kr/lectures/undergraduate/internship/... · 2017-07-28 · ASCII 코드는 7bit 로 문자를 나타나게 하는데 메모리의 기본단위가 1byte 이기

증감연산자

연산자 의미

++ ++a 또는 a++ (a=a+1)

-- --b 또는 b-- (b=b-1)

- 증가연산자는 그 변수값을 1 씩 증가시키고 감소연산자는 그 변수값을 1 씩 감소시킨다.

++연산자가 뒤에 나오는 경우는 값을 증가시키지 않고 사용하여 연산식을 연산한 후 변수의

값을 증가시키는 것이고 연산자가 변수 앞에 나오는 경우는 먼저 값을 증가시켜 연산하는

차이점이 있다.

예제)

#include <stdio.h>

main(){

int a=2,b=3,c=9,r1,r2,r3;

r1=++a+ ++b;

r2=c++;

r3=b-- - ++a + ++a + b--;

printf("result1=%d\n",r1);

printf("result2=%d\n",r2);

printf("result3=%d\n",r3);

printf("a=%d b=%d c=%d\n",a,b,c);

}

관계연산자, 논리연산자

연산결과가 참(True) 이나 거짓(False) 으로 표현되는, 두식의 대소 크기를 비교하는 연산자이다.

관계식은 루프의 조건검사식을 할 경우 매우 유용하다. 문자에도 적용될 수 있으나. 문자열에는

사용될수 없다.

대입연산자 = 과 관계연사자의 == 연산자와 혼동하지 말아야 한다.

연산자 의미

< ~보다 작다

<= ~보다 작거나 같다

> ~보다 크다

>= ~보다 크거나 같다

== ~와 같다

!= ~와 같지 않다.

예제)

#include <stdio.h>

main(){

int num1,num2,num3,r1,r2,r3;

num1=2,num2=0,num3=3;

r1=num1>num2;

r2=num2==num3>num1;

r3=num1<num2<num3;

printf("r1=%d r2=%d r3=%d\n",r1,r2,r3);

}

논리연산자

Page 8: C언어의ael.chungbuk.ac.kr/lectures/undergraduate/internship/... · 2017-07-28 · ASCII 코드는 7bit 로 문자를 나타나게 하는데 메모리의 기본단위가 1byte 이기

값이 참인지 거짓인지 판별한다. 주어진 조건이 참이면 결과는 1, 거짓이면 0 의 값을 갖는다.

일반 논리 연산자

연산자 의미

! 두 값이 참이면 거짓,거짓이면 참으로 바꿈

&& 두 값이 모두 참일때만 결과가 참

|| 두 값이 모두 거짓일 때만 결과가 거짓

예제)

#include <stdio.h>

void main(){

int a=5,b=3,c=4,r1,r2,r3,r4;

r1=!a;

r2=!0;

r3=a<b||b!=c;

r4=a-4||a!=b&&2+2!=c;

printf("r1=%d\n r2=%d\n r3=%d r4=%d\n",r1,r2,r3,r4);

}

비트논리연산자

정수형 자료( int, short, long)에 대해 비트단위로 논리 연산을 수행한다.

연산되는 값을 먼저 2 진수로 바꾸어서 연산한다.

연산자 의미

~ 해당 비트를 반전시킨다.(1 -> 0, 0->1)

& 두 비트 모두 참이면 결과가 참

^ 두 비트가 서로 값이 다르면 참

| 두 비트가 모두 거짓이어야 거짓

대입(Assignment) 연산자

오른쪽에 있는 값이나 수식을 계산하여 왼쪽에 있는 변수에 넣어주는 연산자로 = += -= *=

/= %= 등이 있다.

#include<stdio.h>

main()

{

int x, y=20, z=5;

x = 30;

x = y;

x = y + z;

printf("x=%d, y=%d, z=%d\n", x, y, z);

x += y = z;

printf("x=%d, y=%d, z=%d\n", x, y, z);

x = y += z;

printf("x=%d, y=%d, z=%d\n", x, y, z);

x += y - z;

printf("x=%d, y=%d, z=%d\n", x, y, z);

x += y;

printf("x=%d, y=%d, z=%d\n", x, y, z);

Page 9: C언어의ael.chungbuk.ac.kr/lectures/undergraduate/internship/... · 2017-07-28 · ASCII 코드는 7bit 로 문자를 나타나게 하는데 메모리의 기본단위가 1byte 이기

x %= 3;

printf("x=%d, y=%d, z=%d\n", x, y, z);

x /= y+2;

printf("x=%d, y=%d, z=%d\n", x, y, z);

}

쉬프트연산자

데이터의 비트값을 이동시킨다. 값을 이진수로 바꾸어서 비트값을 이동시켜 연산한다.

연산자 의미

<< 2 비트만큼 좌측으로 이동

>> 2 비트만큼 우측으로 이동

Ex)

int a=5,b;

b=a<<2;

a 의 값을 이진수로 바꾸어 보면 00000101 이 되는데 이 값을 왼쪽으로 2 비트 이동시키면

00010100 이 된다. 이를 다시 십진수로 바꾸어 보면 20 이란 결과 값이 나온다. 결국 b 에는

20 의 값이 저장된다.

예제)

#include <stdio.h>

void main(){

int num=7,re1,re2;

re1=num<<2;

re2=num>>2;

printf("결과=%d\n",re1);

printf("결과=%d\n",re2);

}

삼항연산자(조건연산자)

형식

피연산자 1 ? 피연산자 2: 피연산자 3

피연산자 1 의 조건식이 참이면 피연사자 2 의 결과값을 갖고 거짓이면 피연산자 3 의 결과값을

갖는다.

예제)

#include <stdio.h>

main(){

int a,b,max;

scanf("%d %d",&a,&b);

max=(a>b)?a:b; /* a 가 b 보다 크면 a 값을 아니면 b 값을 결과값으로 갖게되어 max 변수에

대입한다. */

printf("max=%d",max);

}

cast 연산자

자료형을 강제적으로 변화시키는 연산자

형식

Page 10: C언어의ael.chungbuk.ac.kr/lectures/undergraduate/internship/... · 2017-07-28 · ASCII 코드는 7bit 로 문자를 나타나게 하는데 메모리의 기본단위가 1byte 이기

(자료형변수명)변수[또는 상수]

예제)

#include <stdio.h>

main(){

int a,b;

printf("임의의 두 정수를 입력하세요!\n");

scanf("%d %d",&a,&b);

printf(" ****** 연산결과 ********\n");

printf(" 덧셈= %d\n",a+b);

printf(" 뺄셈= %d\n",a-b);

printf(" 곱셈= %d\n",a*b);

printf(" 나눗셈= %.2f\n",(float)a/b);

}

콤머연산자

하나의 명령문만이 허용하는 자리에 블록을 사용하여 여러 개의 명령문을 사용할 수 있는데

콤머연산자 역시 그것과

비슷한 역할을 한다. 하나의 표현식만이 허용되는 자리에 두 개 이상의 표현식을 콤머로

구분해서 나열할 수 있다.

성격이 비슷한 것끼리 늘어놓는 경우 사용한다

ex)

main(){

int a=10,b=20, c=40;

printf("very \n"),printf("good!!!\n");

printf("%d %d %d",a,b,c);

}

sizeof 연산자

괄호안의 인수의 전체 크기를 바이트 단위로 나타낸다.

형식

sizeof(인수);

ex)

#include<stdio.h>

main(){

int a=10;

printf("byte size= %d\n",sizeof(a));

printf("byte size= %d\n",sizeof(int));

printf("byte size= %d\n",sizeof(char));

printf("byte size= %d\n",sizeof(float));

}

if 문

형식

if(조건식)

문장 1;

조건식이 참이면 다음에 나오는 문장을 수행하고 거짓이면 수행하지 않는다. 이때 실행문장은 단일

명령문이거나 또는 여러 문장들이 될 수 있는데 실행문장이 두 문장 이상인 경우는 반드시 블록으로

묶어 줘야 한다. 조건식에는 거의 관계 표현식이 사용된다.

Page 11: C언어의ael.chungbuk.ac.kr/lectures/undergraduate/internship/... · 2017-07-28 · ASCII 코드는 7bit 로 문자를 나타나게 하는데 메모리의 기본단위가 1byte 이기

예제 1)

#include <stdio.h>

main(){

int num1,num2;

printf(" enter the first letter : ");

scanf("%d",&num1);

printf(" enter the second letter : ");

scanf("%d",&num2);

if(num2==0) printf("0 으로 나누는 것은 불가능합니다."); /* 조건이 맞으면 printf()문장 수행 */

printf("answer is : %d",num1/num2);

}

if - else

형식

형식

if(조건문)

문장 1;

else

문장 2;

if 문은 특정 문장을 수행할것인지 수행하지 않을건지만 결정한다. 그에 비해 if else 문은

선택적으로 문장을 수 행하게 된다. 만약 if 다음의 조건식이 참이면 문장 1 을 수행하고 만약

조건식이 거짓이면 문장 2 를 수행한다. 여기에서도 조건 이 맞았을 경우 수행될 문장이 여러 개라면

반드시 블록으로 묶어줘야 한다.

예제 2)

#include <stdio.h>

main(){

int number;

clrscr();

printf(" input number!\n");

scanf("%d",&number);

if(number%3==0)

printf(" 입력한 정수는 3 의 배수입니다..");

else

printf("입력한 정수는 3 의 배수가 아닙니다..");

}

예제 3)

#include<stdio.h>

main(){

int answer;

clrscr();

printf("What is 10+14?\n");

scanf("%d",&answer);

if(answer == 10+14 )

{

printf("right\n");

printf("Your are very good!\n");

}

else

{

printf("Sorry!! you are wrong!!\n");

printf("The answer is 24.");

Page 12: C언어의ael.chungbuk.ac.kr/lectures/undergraduate/internship/... · 2017-07-28 · ASCII 코드는 7bit 로 문자를 나타나게 하는데 메모리의 기본단위가 1byte 이기

}

}

다중 if 문

조건이 여러 개가 있는 경우 선택적으로 문장을 수행하는 제어문이다. 이는 if else 문과 조금 다른

것처럼 보이지만 if else 문의 한 형태이다.

if(조건식 1)

실행문 1;

else if(조건식 2)

실행문 2;

else

실행문 3;

실행문 4; .

조건식 1 이 참이면 실행문 1 을 수행하고 if 문을 빠져나와 실행문 4 를 수행하고 거짓이면 두번째

조건식을 판별한다. 두번째 조건식이 참이면 실행문 2 를 수행하고 수행순서는 실행문 4 로 넘어간다.

만약 조건식이 모두 맞지 않는 경 우 else 다음 실행문 3 을 무조건 수행하고 실행문 4 로 넘어간다.

예제 4)

#include<stdio.h>

#include<conio.h>

main(){

int a,b;

char ch;

printf("Do you want to :\n");

printf("Add,Subtract,Multiply,or Divide?\n");

ch=getche();

printf("\n");

printf("enter the first number : ");

scanf("%d",&a);

printf("enter the second number : ");

scanf("%d",&b);

if(ch=='A') printf("%d",a+b);

else if(ch=='S') printf("%d",a-b);

else if(ch=='M') printf("%d",a*b);

else if(ch=='D' ) printf("%d",a/b);

getch();

}

switch 문

하나의 조건에 의해 여러가지 실행문 중 한가지를 선택 실행할 수 있는 명령문이다.

형식

switch(수식){

case 값 1 : 문장 1;문장 2;문장 3;….문장 n;break;

case 값 2 : 문장 1;문장 2;문장 3;….문장 n;break;

case 값 3 : 문장 1;문장 2;문장 3;….문장 n;break;

.

.

case 값 n : 문장 1;문장 2;문장 3;….문장 n;break;

default : 문장 1;문장 2;문장 3; …. 문장 n;

}

switch 문에서는 (수식)의 결과 값과 case 다음에 나오는 값과 일치하게 되면 그 행으로

Page 13: C언어의ael.chungbuk.ac.kr/lectures/undergraduate/internship/... · 2017-07-28 · ASCII 코드는 7bit 로 문자를 나타나게 하는데 메모리의 기본단위가 1byte 이기

점프하여 그 다음에 나오는 문장들을 수행한다. if else 문보다 선택적인 수행을 할 경우 조금 더

명확하게 파악하게 해주는 구조를 갖고 있다. 각 case 다음에 나오는 값들은 항상 정수 상수여야

한다. 명령문들 다음에는 break 문이 올수 있는데 이는 문장들을 수행하고 switch 문을 종료시켜

주는 역할을 한다. break 문이 없으면 그 다음 문장들을 계속 수행하게 된다.

default 다음에 나오는 문장은 수식의 값과 case 다음에 나오는 값들과 일치하는 값이 없을 경우

수행하는 문장이며,default 다음에는 break 문을 써주지 않아도 자동적으로 swith 문이 종료된다.

예제 5)

#include<stdio.h>

main(){

char a;

printf(" 상품 코드를 입력하세요!!\n");

a=getchar();

switch(a){

case 'P' : printf("선택하신 상품은 프린터 입니다. A\n");break;

case 'T' : printf("선택하신 상품은 텔레비젼입니다.\n");break;

case 'C' : printf("선택하신 상품은 자동차 입니다.\n");break;

case 'D' : printf("선택하신 상품은 컴퓨터 입니다.\n");break;

default : printf("코드 에러\n");

}

}

예제 6)

#include <stdio.h>

#include <conio.h>

void main(){

int kor,eng,mat,tot;

float avg;

char hak;

printf(" 국어 영어 수학점수를 입력하세요 : ");

scanf("%d %d %d",&kor,&eng,&mat);

tot= kor+eng+mat;

avg=tot/3.0;

switch((int)avg/10)

{

case 10:

case 9: hak='A';break;

case 8: hak='B';break;

case 7: hak='C';break;

case 6: hak='D';break;

default: hak='F';

}

printf(" 국어 : %d 영어 :%d 수학 : %d\n",kor,eng,mat);

printf(" 총점 : %d 평균 : %.2f 학점 : %c\n",tot,avg,hak);

getch();

}

단일 for 문

형식

for(초기식:조건식:증감식)

실행문장;

*실행순서

초기식을 수행한다 조건식을 판별한다 참인경우 실행문장을 수행한다 증감식을 수행한다

조건식을 판별한다 참인경우 실행문장을 수행한다.(거짓인 경우 for 문을 빠져나간다)

Page 14: C언어의ael.chungbuk.ac.kr/lectures/undergraduate/internship/... · 2017-07-28 · ASCII 코드는 7bit 로 문자를 나타나게 하는데 메모리의 기본단위가 1byte 이기

증감식을 수행한다. 조건식이 거짓인 경우까지 반복한다.

예제 1)

#include <stdio.h>

main()

{

int i,sum;

clrscr();

sum = 0;

for(i=0 ; i <= 100 ; i = i +1)

sum = sum + i;

printf("1 부터 100 까지의 합은 %d 입니다.\n",sum);

getch();

}

예제 2)

#include <stdio.h>

main(){

int dan,i;

clrscr();

printf("단을 입력하세요 :");

scanf("%d",&dan);

for(i=1;i<=9;i++)

printf("%d * %d= %d\n",dan,i,dan*i);

getch();

}

다중 for 문

형식

for(1 초기식:2 조건식:증감식)

{

for(초기식:조건식:증감식)

{

실행문장;

실행문장;

}

실행문장;

}

*for 문 안에 for 문을 하나 이상 포함하는 경우로서 안쪽 for 문은 바깥 for 문에 포함되어야 한다.

*바깥 for 문이 한번 수행될 때 마다 안쪽 for 문은 초기식값부터 조건식에 만족하는 동안 반복 수행된다.

예제 3)

#include<stdio.h>

main(){

int i,j;

for(i=1;i<=5;++i)

{

for(j=1;j<=i;j++)

{

printf("x");

}

printf("\n");

Page 15: C언어의ael.chungbuk.ac.kr/lectures/undergraduate/internship/... · 2017-07-28 · ASCII 코드는 7bit 로 문자를 나타나게 하는데 메모리의 기본단위가 1byte 이기

}

}

while 문

형식

while(조건식)

실행문장;

*조건식에 만족하는 동안 { } 안의 문장을 반복 수행하고 만족하지 않으면 while 다음 문장을

수행

*while(1) 문 : 무한대 반복 수행

*while(0) 문 : 한번도 수행하지 않음

예제 4)

/* while 문 사용실습 : Ctrl+Z 입력시 까지 정수 입력받아 합, 평균 구하기 */

#include<stdio.h>

main()

{

int x, n=0, sum=0;

clrscr();

while(scanf("%d", &x) != EOF)

{

sum += x;

n = n + 1;

}

printf("합 = %d\n", sum);

printf("평균 = %d\n", sum/n);

getch();

}

#. EOF

*-1 값을 갖는 기호상수로 scanf 문 등에서 Ctrl+Z 을 입력받을시

데이터의 끝임을 알림

*stdio.h 파일 include 해야함

* while 문내에 조건식이 항상 참이면 무한루프로 빠져 while 문을 벗어나지 못한다.

예제 5)

#include<stdio.h>

main(){

char name[20],ch;

int age;

clrscr();

while(1) /*조건이 항상 참이므로 무한루프에 빠진다. */

{

printf("input name :");

gets(name);

printf("input age : ");

scanf("%d",&age);

printf("NAME : %s AGE : %d\n", name,age);

printf(" continue? 종료 : N\n");

fflush(stdin);

ch=getch();

if (ch=='n' || ch == 'N') /*입력받은 값이 'N' 이면 while 문을 빠져 나가는 조건 */

break;

Page 16: C언어의ael.chungbuk.ac.kr/lectures/undergraduate/internship/... · 2017-07-28 · ASCII 코드는 7bit 로 문자를 나타나게 하는데 메모리의 기본단위가 1byte 이기

}

}

예제 6)

#include<stdio.h>

main(){

int a,b;

a=b=0;

while(a<5)

{

++a;

while(b<a)

{

putchar('*');

++b;

}

putchar('\n');

b=0;

}

}

do ~ while 문

형식

do{

실행문장;

}while(조건식);

*{ } 안의 문장을 무조건 한번 수행 후, 조건식이 만족하는 동안 { } 안의 문장을 반복

수행한다.

예제 7)

#include<stdio.h>

#include<conio.h>

main(){

int a,b;

char op;

printf(" Enter two numbers : ");

scanf("%d %d",&a,&b);

printf(" Add,Subtract,Multiply,or Divide ? \n");

do {

printf("enter the first letter :");

op=getch();

printf("\n");

}while(op!='A' && op !='S' && op!='M' && op!='D');

if(op=='A') printf("%d\n",a+b);

else if(op=='S') printf("%d\n",a-b);

else if(op=='M') printf("%d\n",a*b);

else if(op=='D' ) printf("%d\n",a/b);

}

goto 문

*현재의 실행 부분에서 문장의 다른 특정 부분으로 실행을 JUMP 하고자 할때 사용하며,

Logic 이 서로 뒤섞여 모호해지는 경우가 많아 꼭 필요한 경우가 아니면 사용하지 않음

Page 17: C언어의ael.chungbuk.ac.kr/lectures/undergraduate/internship/... · 2017-07-28 · ASCII 코드는 7bit 로 문자를 나타나게 하는데 메모리의 기본단위가 1byte 이기

/* goto 문 사용 실습 : 1 에서 100 까지 합 출력 */

예제 8)

#include<stdio.h>

main()

{

int i=0, sum=0;

clrscr();

again:

i += 1;

sum += i;

if(i==100)

printf("1 부터 %d 까지 합 : %d\n", i, sum);

else

goto again;

getch();

}

break 문

*반복문에서 해당 문의 실행을 벗어나고자 할 때 사용

예제 9)

#include <stdio.h>

main()

{

int i,j;

clrscr();

for(i=1;i<=100;i++){

for(j=i;j<=100;j++)

if((j%5)==0){

printf("%3d\n",j);

break;

}

i=j;

}

getch();

}

continue 문

*반복문 등에서 해당 문의 실행 중간에서 처음으로 실행을 옮길때 사용

/* continue 문 사용실습 : 1+2+…+n 이 30000 을 넘는 최초의 n 값과 n 까지의 합 *

예제 10)

#include<stdio.h>

main()

{

int n=0, sum=0;

clrscr();

while(1)

{

Page 18: C언어의ael.chungbuk.ac.kr/lectures/undergraduate/internship/... · 2017-07-28 · ASCII 코드는 7bit 로 문자를 나타나게 하는데 메모리의 기본단위가 1byte 이기

n += 1;

sum += n;

if(sum <= 30000) continue;

printf("1 + 2 + 3 + …..+ %d = %d\n",n, sum);

break;

}

getch();

}

첨자가 하나인 배열

*형식

자료형 배열이름[첨자]

ex) int a[5]; /* 정수가 5 개가 연속적으로 저장될 장소를 확다. */

a[0] a[1] a[2] a[2] a[4]

- 배열의 첨자는 항상 0 부터 시작한다.

*데이터 초기화

int a[5]={100,200,300,400,500};

char ch[5]="test";

char ch[]="test"; /*일차원배열에서는 값을 초기화할 경우 첨자를 생략할수 있다.*/

예제 1)

/* 1 차원배열을 이용하여 성적의 합 구하기 */

#include<stdio.h>

main(){

int sung[10]={100,20,90,80,50,100,40,60,70,80};

int i,sum=0;

for(i=0;i<10;i++)

sum+=sung[i];

printf("total=%d",sum);

}

예제 2)

/* 임의의 날수 입력받아, 온도를 입력후 평균,최소온도,최대온도 구하기 */

#include<stdio.h>

main()

{

int tempr[50],n,i,min,max,sum=0;

clrscr();

printf("임의의 날수 입력 : ");

scanf("%d",&n);

for(i=0 ; i<n ; i++) {

printf("Enter, a noonday temperature for the %dth day : ",i+1);

scanf("%d",&tempr[i]);

sum += tempr[i];

}

printf("The average temperature : %d\n",sum/n);

min = max = tempr[0];

for(i=0 ; i<n ; i++) {

if(min > tempr[i]) min = tempr[i];

if(max < tempr[i]) max = tempr[i];

}

printf("The minimum temperature : %d\n",min);

Page 19: C언어의ael.chungbuk.ac.kr/lectures/undergraduate/internship/... · 2017-07-28 · ASCII 코드는 7bit 로 문자를 나타나게 하는데 메모리의 기본단위가 1byte 이기

printf("The maximum temperature : %d\n",max);

getch();

}

정렬(Sort)

-불규칙한 자료를 일정기준에 따라 순서적으로 나열하는 것

종류

*Ascending sort (오름차순 정렬)

: 기준이 되는것의 작은 것 부터 큰순으로 정렬하는 것

*Descending sort (내림차순 정렬)

: 기준이 되는것의 큰 것 부터 작은순으로 정렬하는 것

방법

*선택정렬(Selection sort) 와 버블정렬(Bubble sort)로 나눔.

(1) 선택정렬(Selection sort)

*좌에서 우로 정렬된 데이터를 채워나가며 정렬하는 방법

(2) 버블정렬(Bubble sort)

*우에서 좌로 정렬된 데이터를 채워나가며 정렬하는 방법

예제 3)

/* 배열을 이용하여 오름차순으로 정렬하여 출력하는 프로그램 */

#include<stdio.h>

main(){

int a[10]={10,20,40,70,50,30,90,100,60,80};

int k,i,j,temp;

clrscr();

for(i=0;i<10;i++){

for(j=i+1;j<10;j++)

if(a[i]>a[j])

{

temp=a[i];

a[i]=a[j];

a[j]=temp;

}

}

for(i=0;i<10;i++)

printf("%3d",a[i]);

}

}

2 차원 배열

* 행첨자와 열첨자로 이루어진 배열

*기억장소가 할당될때는 행우선순위이다.

형식

자료형 배열이름[행첨자][열첨자]

ex) int a[3][3];

a[0][0] a[0][1] a[0][2]

a[1][0] a[1][1] a[1][2]

a[2][0] a[2][1] a[2][2]

Page 20: C언어의ael.chungbuk.ac.kr/lectures/undergraduate/internship/... · 2017-07-28 · ASCII 코드는 7bit 로 문자를 나타나게 하는데 메모리의 기본단위가 1byte 이기

2 차원 배열 초기화

int a[2][3]={{1,2,3},{10,20,30}};

int a[2][3]={1,2,3,10,20,30};

int a[ ][3]={{1,2,3},{10,20,30}};

예제 4)

/* 2 차원 배열을 이용하여 데이터 출력하기 */

main()

{

int a[3][5];

int k,i,j;

k=0;

for(i=0;i<=2;i++)

{

for(j=0;j<=4;j++)

{

a[i][j]=++k;

printf("%3d",a[i][j]);

}

printf("\n");

}

}

문자의 배열

*문자의 1 차원 배열

배열의 각 요소에 문자 1 개가 기억되는 배열로서 char 형으로 정의

예제 5)

#include<stdio.h>

main()

{

char a[8] = {'T','u','r','b','o',' ','C'};

int i;

clrscr();

for(i=0 ; i<7 ; i++)

printf("%c",a[i]);

getch();

}

예제 6)

/* 소문자를 대문자로 변환하는 프로그램 */

#include<stdio.h>

void main(){

char str[80];

int i;

clrscr();

printf("문자열을 입력하세요 :");

gets(str);

for(i=0;str[i]!='\0';i++)

{

if(str[i]>=97&& str[i]<=122)

str[i]-=32;

}

printf("대문자로 변환후 : %s\n",str);

getch();

Page 21: C언어의ael.chungbuk.ac.kr/lectures/undergraduate/internship/... · 2017-07-28 · ASCII 코드는 7bit 로 문자를 나타나게 하는데 메모리의 기본단위가 1byte 이기

}

*char 형의 다차원 배열임

예제 7)

/* 문자의 다차원 배열 */

#include<stdio.h>

main()

{

int i, j;

char a[3][6] = {'S','E','O','U','L',' ',

'B','U','S','A','N',' ',

'K','O','N','G','J','U'};

clrscr();

for(i=0 ; i<3 ; i++) {

for(j=0 ; j<6 ; j++)

printf("%c",a[i][j]);

printf("\n");

}

getch();

}

*문자열(String) 배열

char 형으로 선언하며 이중따옴표(" ")에 의해 문자열을 묶어주고,문자열의

끝이라는 표시로 끝에 NULL STRING(\n) 값이 있기 때문에 1 byte 더

선언해야 함

예제 8)

/* 문자열 배열 실습 */

#include<stdio.h>

main()

{

int i;

char a[][8] = {"BASIC","C","FORTRAN","C++","JAVA"};

clrscr();

for(i=0 ; i<5 ; i++)

printf("%s\n",a[i]);

getch();

}

포인터 개념 이해하기

포인터 변수

- 주소를 값으로 갖는 변수를 포인터 변수라 한다.

- 변수명 앞에 '*'를 사용하여 선언한다.

데이터가 저장되어있는 메모리 내의 위치를 나타내는 주소값으로, 주소값이 기억된 변수를

포인터변수라 하며,

포인터연산자 * 를 이용하여 참조할 데이터의 형으로 선언함

* : 포인터가 가리키는 곳의 값을 가져올 변수에 부여

& : 변수가 정의되어 있는 주소를 가져올 때 변수에 부여

예) int *ap; char *p; float *fp;

포인터 연산자

Page 22: C언어의ael.chungbuk.ac.kr/lectures/undergraduate/internship/... · 2017-07-28 · ASCII 코드는 7bit 로 문자를 나타나게 하는데 메모리의 기본단위가 1byte 이기

예제 1)

#include<stdio.h>

main(){

int num1,num2,*p; /*포인터 변수 선언 */

num1=3000;

p=&num1; /*변수 num1 의 주소를 p 에 대입한다. */

num2=*p; /*포인터 p 가 가르키는 주소에 저장되어

있는 값을

num2 에 저장한다.*/

printf("num1=%d\n num2=%d\n",num1,num2);

printf("the adrress of value =%d the address of

value=%d\n",&num1,p);

}

예제 2)

#include<stdio.h>

main(){

int *p1; /* int 형을 가리키는 포인터 변수 선언*/

char *p2; /*char 형을 가리키는 포인터 변수 선언 */

p1=1000;

p2=2000;

printf("p1+1=>%d\n",++p1);

printf("p1+2=>%d\n",++p1);

printf("p2+1=>%d\n",--p2);

printf("p2+2=>%d\n",--p2);

}

위의 예제에서 포인터를 증가시키는 것은

다음번째

데이터의 시작위치를 가리키는 것을

의미한다. 또한

포인터를 감소시키는 것은 그 이전 데이터가

저장되어

있는 시작주소를 가리키는 것을 의미한다.

따라서 포인터를 증가시키거나 감소시키면

데이터의

크기만큼 증가하거나 감소한다.

[출력결과]

p1+1=>1002

p1+2=>1004

p2-1=>1999

p2-2=>1998

배열과 포인터

배열은 데이터를 연속된 메모리에 저장하므로 포인터와 같이 사용되는 경우가 많다.

배열명은 배열의 시작번지를 갖는 포인터 상수이다.

포인터와 배열

int a[5]={10,20,30,40,50};

int *aa;

aa=a; /* aa=&a[0]와 같은 의미를 갖는다. */

Page 23: C언어의ael.chungbuk.ac.kr/lectures/undergraduate/internship/... · 2017-07-28 · ASCII 코드는 7bit 로 문자를 나타나게 하는데 메모리의 기본단위가 1byte 이기

a[0]=*aa=aa[0];

a[1]=*(aa+1)=aa[1];

a[2]=*(aa+2)=aa[2];

a[3]=*(aa+3)=aa[3];

a[4]=*(aa+4)=aa[4];

예제 3)

#include<stdio.h>

main(){

int data[5]={10,20,30,40,50};

int i;

int *p;

p=data;

for(i=0;i<5;i++)

printf("data[%d]=%d\n",i,*(p+i));

}

2 차원 배열에서의 포인터 사용

예제 4)

#include<stdio.h>

main(){

int ss[4][3]={{10,10,10},

{20,20,20},

{30,30,30},

{40,40,40}};

int i,sum=0,*p;

p=&ss[0][0];

for(i=0;i<12;i++)

sum+=*(p+i);

printf("total=%d",sum);

}

문자열 배열과 포인터

Page 24: C언어의ael.chungbuk.ac.kr/lectures/undergraduate/internship/... · 2017-07-28 · ASCII 코드는 7bit 로 문자를 나타나게 하는데 메모리의 기본단위가 1byte 이기

포인터를 이용하여 문자열 배열을 작성하면 기억장소를 절약하는 경우가 많다.

일반적으로 2 차원배열을 사용하는 경우 특히 그런 경우가 많다.

형식

데이터형 *배열명 = "문자열"

=> 문자열을 배열로 연속된 공간에 저장하고 그 시작위치를 포인터가 가리킨다.

즉 포인터는 문자배열의 시작주소를 저장한다.

예제 5)

#include<stdio.h>

main(){

char *p;

p="abcdefg";

printf("%d\n",p); /* 문자열의 시작주소 출력 */

printf("%s\n",p); /* 포인터 변수 p 가 가르키는 부분부터 문자열 출력 */

printf("%s\n",p+1);

printf("%c\n",*(p+1));

}

예제 6)

#include<stdio.h>

main(){

char *p[3] = {"banana", "water meron","orange"}; -----①

printf("%s\n",p[0]);

printf("%s\n",p[1]);

printf("%c\n",*(p[2]+2));

printf("%s\n",p[2]+2);

}

==>위의 경우에서 ①은 문자열을 배열로 저장하고 각 문자열의 시작주소를 포인터 배열에서

순서적으로 저장하게 된다.

* 이중포인터변수

- 포인터의 주소를 저장하는 포인터변수

예제 7)

#include<stdio.h>

main(){

int a,*p1,**p2;

a=100;

p1=&a;

p2=&p1;

printf("%d\n",**p2);

}