267

인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고
Page 2: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고
Page 3: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

인 사 말

국의 17살 고등학생 창업자 로이시오는 어렸을때부터 컴퓨터를 가지고 놀았고 12살

때 처음 앱을 개발하 다. 매일 쏟아지는 방 한 뉴스를 한 에 악했으면 좋겠다는

생각을 한 그는 뉴스를 스마트폰의 화면에 들어가도록 축약해 주는 로그램을 개발

하 다. 고등학생 신분으로 설립한 벤처회사‘섬리’를 세계 인 검색 포털업체인 야후는

약 300억원 이상의 비용을 들어가며 사들 다. 취미로 로그램을 개발했던 로이시오는

일약 세계 인 스타가 되었다. 델로이시오를 세계 인 천재 로그래머의 반열에 올려

놓은 것은 코딩 능력과 반짝이는 아이디어 때문이다. 새로운 것에 한 호기심과 상상

력이 가장 왕성한 등 시 에 로그래 교육이 함께 한다면 우리나라에서도 제2의

로이시오가 나올 것이다.

그런 미래가 우리 발앞에 놓여 있다. IT 분야는 논리 으로 어 나지만 않는다면 상상

하는 무엇이든 가능하다. 이제는 상상력과 디자인, 로그램 코딩 능력이 결합된다면

구나 얼마든지 좋은 로그램을 개발할 수 있다. 하지만 련학과를 졸업하거나 각종

IT학원에서 로그래 을 배우지 않는 이상 로그래 을 하기란 쉽지 않은 것이 실

이다.

이에 본 정보원에서 자라나는 미래의 아이들에게 컴퓨터 기본언어를 알려주어 IT 분야에

꿈과 끼를 가진 학생들에게 상상력 교육과 로그램 교육, 열린정보공유로 세계를 변

시킬 미래의 IT 재를 길러내는데 도움을 “리 스 C언어 교재”를 개발해 제공하는

일은 매우 의미 있는 일이라 하겠습니다.

본 자료가 미래를 비하는 학생에게 투입되어 많은 학생들이 재미있고 편리하게 활용

함으로써 정보사회의 주역으로 성장하기를 기원합니다.

아울러 그동안 개발에 참여하여 좋은 아이디어를 내고, 집필하고 정리하고, 로그램을

짜느라 얘써주신 모든 분들의 노고에 감사를 드립니다.

2014. 02

충청북도교육정보원장 손 철

Page 4: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고
Page 5: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

목 차

리눅스 C언어의 이해(초급) ················································································· 1

1. 프로그램 설치··············································································································· 3

2. C언어란?······················································································································· 8

3. priontc, scanf ············································································································· 9

4. 변수와 상수················································································································· 11

5. 연산자··························································································································· 14

6. 분기문··························································································································· 19

7. 반복문··························································································································· 25

8. break문, continue문······························································································· 30

9. 함수······························································································································ 33

리눅스 C언어의 이해(중급) ···································································· 43

1. 배열의 선언과 초기화······························································································· 45

2. 배열기반 문자열 변수······························································································· 47

3. 포인터와 포인터 변수······························································································ 50

4. 포인터 타입(형) ········································································································· 53

5. 배열 이름의 의미와 활용························································································ 57

6. 포인터 연산················································································································ 60

7. 문자열 상수와 포인터······························································································ 62

8. 포인터와 함수의 이해······························································································ 65

9. Call-by-value & Call-by-reference ································································ 68

10. 다차원 배열·············································································································· 70

11. 포인터의 포인터······································································································· 74

12. 2차원 배열 이름의 포인터형················································································· 77

13. 문자 단위 입·출력 함수······················································································ 80

14. 문자열 단위 입·출력 함수·················································································· 83

15. 문자열 조작 함수···································································································· 86

Page 6: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

16. 구조체의 정의와 접근···························································································· 88

17. 구조체의 배열과 포인터························································································· 91

18. 구조체의 활용·········································································································· 94

19. 파일의 개방과 종결································································································ 98

20. 파일의 개방과 종결······························································································ 100

리눅스 C언어의 이해(고급) ·································································· 105

1. 정보올림피아드와 자동채점시스템······································································· 107

2. 기초문제풀이 1 : 고장난 체중계········································································· 109

3. 기초문제풀이 2 : 수학 신동이 되는 마법종이·················································· 112

4. 기초문제풀이 3 : 객관식 답안 채점하기···························································· 115

5. 기초문제풀이 4 : 숙제 안 낸 사람은 누구?····················································· 118

6. 기출문제풀이 1 : 곱셈···························································································· 122

7. 기출문제풀이 2 : 홀수··························································································· 125

8. 기출문제풀이 3 : 백설공주와 난장이································································· 130

9. 기출문제풀이 4 : 완전제곱수··············································································· 134

10. 정렬 알고리즘········································································································· 137

11. 검색 알고리즘·········································································································· 141

12. 정렬 알고리즘의 적용 : 대푯값·········································································· 144

13. 검색 알고리즘의 적용 : 예산·············································································· 147

14. 재귀의 개념 : 1부터 N까지의 합계 구하기····················································· 153

15. 재귀의 적용 : 팩토리얼 구하기·········································································· 156

16. 동적계획법의 이해 1 : 피보나치 수열 (재귀) ················································· 159

17. 동적계획법의 이해 2 : 피보나치 수열 (메모이제이션) ································· 163

18. 동적계획법의 적용 1 : 연속부분최대합 (3회중첩반복문) ····························· 166

19. 동적계획법의 적용 2 : 연속부분최대합 (2회중첩반복문) ·························· 170

20. 동적계획법의 적용 3 : 연속부분최대합 (동적계획법) ·································· 173

리눅스 보충문제······················································································ 175

리눅스 실전문제······················································································ 241

Page 7: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 1 -

리눅스 C언어의 이해(초급)

Page 8: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고
Page 9: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 3 -

리 스 C언어의 이해( )

1. 로그램 설치

가. 리 스 설치

1) 장단

· LinuxOS을 직 다운받아 PC에 설치

· 설치용 USB나 CD필요

· 설치 시 Windows를 포맷하거나,Linux를 한 별도 티션 필요

· 컴퓨터 자원을 100% 활용

· 원래 환경으로 복귀하기 어려움

2) 리 스 설치 순서

가) Ubuntu 12.04 다운로드(http://ftp.kaist.ac.kr/ubuntu-cd/12.04/)

나) cd로 설치

마우스 오른 쪽 클릭 디스크 이미지 굽기 선택

다) 설치

부 순서 지정 CD나 USB 선택

라) 설치 후 설정

소 트웨어센터 소 트 웨어 설치

Page 10: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 4 -

마) 기본 사용법

나. 가상머신 설치

1) 장단

·LinuxOS를 도우 에서 가상으로 동작하도록 설치

·가상 이미지 일 필요

·컴퓨터 자원을 일부만 활용

·설치가 간단하고,쉽게 원래 환경으로 복귀 가능

2) 리 스 설치 순서

가) Oraclevirtualbox설치(https://www.virtualbox.org/wiki/Downloads)

나) Oraclevirtualbox설치순서

Page 11: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 5 -

다) KOI가상 이미지 일받기

(https://www.digitalculture.or.kr/sub07/AllselectInfoTrainingList.do)

라) 가상머신 사용하기

Page 12: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 6 -

아이디 :student,비 번호 :olympiad

다. 도우용 코드블럭 설치

1) 장단

· 도우 에서 코드블럭 동작하도록 설치

·컴퓨터 자원을 일부만 활용

·설치가 간단하고,쉽게 원래 환경으로 복귀 가능

2) 코드블럭(codeblocks) 설치 순서

가) 코드블럭 설치(http://www.codeblocks.org/downloads/binaries)

나) 코드블럭 설치순서

Page 13: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 7 -

라. 코드블럭 사용순서

Files → New → Project 선택 Console application 선택

Next를 선택 C 선택 후 Next 선택

내용을 입력 왼쪽 창에서 main.cpp 선택

main.cpp에서 문제를 품Build -> Build and run을 하면

로그램이 컴 일 된 후 실행

Page 14: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 8 -

2. C언어란?

가. C언어가 머야?

· 컴퓨터는 0, 1로 이루어진 기계어라는 언어를 사용합니다.

· C언어 직업 기계어를 사용하지 않고도 컴퓨터와 화할 수 있도록 하는 말(언어)

· C언어를 컴퓨터가 바로 이해할 수 있는 것은 아닙니다. 사람이 작성한 언어를 컴퓨

터가 이해할 수 있는 기계어로 바꾸어 주는 통역사 컴 일러의 도움이 받아야 한다.

나. C언어의 특징?

·사람들이 이해하기 쉽습니다.

·컴퓨터는 차별하지 않습니다.

·컴퓨터에게 비교 자세히 명령할 수 있습니다.

다. 컴퓨터도 사람이다.

·사람들이 이해하기 쉽습니다.

·컴퓨터도 사람처럼 , 머리 입과 손에 해당하는 기능이 있다.

·두뇌(cpu, 주기억장치), , 입, 손(입출력장치), 책, 카메라(보조기억)

라. 알고리즘과 순서도

1) 알고리즘

·어떤 문제를 해결하기 한 차나 방법

2) 순서도란?

·일이 처리되는 과정

·순서도의 역할

- 간단한 기호로 로그램의 흐름을 나타내어 로그램의 체 인 차와 내용에

하여 쉽게 악할 수 있음

- 로그래 과정을 알 수 있음

- 오류를 발견하고 수정이 용이

- 로그램에 해 쉽게 이해하고 유지 보수가 용이

3) 순서도

Page 15: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 9 -

4) 로그램 작성부터 실행까지

· 로그램 작성

·컴 일

·링크

·실행하기

3. priontc, scanf

가. printf

printf 함수는 모니터에 정보를 출력하는 함수로 #include <stdio.h>에 미리 만들어져

있는 함수이다.

연습문제

문제 “사랑합니다. 환 합니다.”를 출력하는 로그램

결과 사랑합니다. 환 합니다.

#include <stdio.h>

int main()

{

printf("사랑합니다. \n”);

printf("환 합니다. \n”);

}

나. scanf

scanf 함수는 키보드를 통하여 정보를 입력하는 함수로 데이터를 받아 정할 변수를

선언하고 변수의 주소(&)에 키보드로 부터 입력 받은 테이터 장하는 함수이다.

Page 16: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 10 -

연습문제

문제 나이를 입력받아 출력하는 로그램#include <stdio.h>

int main()

{

int Val;

scanf("%d”, &Val);

printf("나이는 %d살입니다. \n”, Val);

}

다. 서식문자

변수의 성격을 표시하는 서식문자

서식문자 의미 서식문자 의미

%d 정수 %s 문자열

%f 실수 %c 반각문자

숫자 연산식 변수

printf(“%d”, 1) printf(“%d”, 1+2)int a=3;

printf(“%d”, 1+2)

여러 데이터int b=4;

printf(“%d와 %d는 같다”, b, 1+3);

연습문제

문제 학교, 학년, 반, 번호, 이름을 출력하는 로그램#include <stdio.h>

int main()

{

printf("%s 등학교 %d학년 %d반 %d번 이름 %s \n”, "충북”, 6, 1, 2, "안희동”);

}

Page 17: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 11 -

4. 변수와 상수

가. 변수란?

변수(變數)란 한자그 로 변하는 수

를 들면 창고에 종류 별로 서 이 쌓여 있습니다. 이것을 상자에 담아 보 하려고

합니다. 상자에 아무 게 담으면 나 에 보기가 곤란하므로 상자에 상자순서(A,B,C,D)

책의 특성(소설, 참고서 등)을 어 놓았습니다.

창고 : 주기억장치(Ram), 상자순서 : 변수이름, 책의 특성 : 변수의 자료형, 책 : 데이터

변수의 자료형에는 char형과 int형이 주로 사용

종류 자료형 데이터의 범 와 크기

숫자

정수형

char -128~127, 1바이트

short -32768~32717, 2바이트

int -2147483648 ~ 2147483647 4바이트

long -2147483648 ~ 2147483647 4바이트이상

실수형float 3.4 x 1037 ~ 3.4 x 1038

double -1.7 x 10307 ~ 1.7 x 10308

문자문자 char 아스크코드

문자열 없음 배열을 이용

Page 18: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 12 -

나. 변수의 선언

변수에 데이터를 장하려면 변수를 사용하겠다고 알리는 선언을 먼 한다.

연습문제

문제 입력받은 수의 합을 출력하는 로그램#include <stdio.h>

int main()

{

int a, b, c;

int sum;

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

sum=a+b+c

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

}

연습문제

문제 입력받은 수에 5를 곱하고 출력하는 로그램#include <stdio.h>

int main()

{

int Num

printf("숫자를 입력하세요. \n”);

scanf("%d”, &Num);

printf("%d*5=%d”, Num, Num*5);

}

Page 19: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 13 -

다. 상수란?

변수는 변경 가능한 수이고 상수는 변경이 가능하지 않는 수로 를 들면 상자에 뚜

껑을 운 것입니다.

라. 자료형의 변환

자료형이 서로 다른 변수끼리 연산할 수 없는 것을 변환해 주어야 한다.

1) 자동형 변환

시 자동형 변환 결과

int a=12.5; 실수→정수 a=12

double b=5; 정수→실수 b=5.000000

int c=215/100 실수→정수 c=2

연습문제

문제 자료형의 변환 로그램#include <stdio.h>

int main()

{

int a;

double b;

int c=2.0+10;

float d;

a=215/100;

b=12;

d=(2+3);

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

}

연습문제

문제 자료형의 변환 로그램#include <stdio.h>

int main()

{

int a;

float b;

a=(2+3)/2;

b=(2+3)/2;

printf("%d %f”, a, b);

}

Page 20: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 14 -

시 자동형 변환 결과

double c;

c=1.5+10정수→실수

c=1.5+10.0

=11.5

2) 강제형 변환

연산자( )를 사용하면 강제형 변환되는 것으로 서식문자 %d는 정수형이므로 실수 2.0

을 정수형(2)으로 강제형 변환되는 것이다.

3) 자료형이 맞지 않는 경우

산술연산자에 의해서 서로 자료형 맞지 않는 경우에는 자료형이 큰쪽을 우선으로 합

니다.

정리학습

변수

변수(變數)란 한자 그 로 변하는 수

변수의 선언 (int val)

변수의 입 int val val=10

상수

변수는 변경 가능한 수이고 상수는 변경이 가능하지 않는 수

co n s t in t a= 1 0 ;

5. 연산자

가. 산술연산자

산술연산자는 우리가 알고 있는 사칙연산과 같은 것으로 컴퓨터에서도 +, -, ×, ÷을

할 때 사용하는 것입니다.

산술연산자 의 미 연산식 결과

A+B A에 B를 더한 값 1+2 3

A-B A에 B를 뺀 값 2-1 1

A*B A에 B를 곱한 값 2*3 6

A/B A를 B로 나 값 6/2 3

A%B A를 B로 나 나머지 값 5%2 1

Page 21: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 15 -

연습문제

문제 - 용돈 천원 400원 떡볶이를 사먹고 남은 돈의 반을 하 습니다. 얼

마를 하 는지 출력하는 로그램

결과 - 300원#include <stdio.h>

int main()

{

int money;

money=(1000-400)/2;

printf(" 한 돈은? %d원”, money);

}

연습문제

문제 - 방학을 맞아 선생님이 사탕 100개를 우리 반 아이들 27명에게 나 어 주셨

습니다. 남은 사탕은 몇 개인지 출력하는 로그램

결과 - 19#include <stdio.h>

int main()

{

int Num;

Num=100%27;

printf("남은 연필은 %d개입니다.”, Num);

}

나. 입연산자

여러 개의 연산자를 여쓰기 한 연산자이며 사용되는 “=”은 입의 의미이지

수학 으로 “=”같다는 의미는 아닙니다.

입연산자 의 미 연산자의 의미

A+=B A에 B를 더한 값 A=A+B

A-=B A에 B를 뺀 값 A=A-B

A*=B A에 B를 곱한 값 A=A*B

A/=B A를 B로 나 값 A=A/B

A%=B A를 B로 나 나머지 값 A=A%B

Page 22: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 16 -

연습문제

문제 1+5의 결과값과 3÷2의 나머지를 구하는 로그램

결과 6, 1#include <stdio.h>

int main()

{

int Val1=1, Val2=3;

Val1+=5;

Val2%=2;

printf("%d %d”, Val1, Val2);

}

다. 증가 감소 연산자

데이터를 1씩 증가시키거나 감소시키는 연산자입니다.

증가·감소연산자 의 미

++A 1을증가시킨 후 연산

--A 1을감소시킨 후 연산

B++ 연산진행 후 1을 증가

B-- 연산진행 후 1을 삼소

연습문제

문제 --a와 a-- 의 차이 출력하는 로그램

#include <stdio.h>

int main()

{

int a1, a2, a3, a4;

a1=10;

a3=10;

a2=--a1;

a4=a1--;

printf("a1은 %d, a2는 %d \n”, a1, a2);

printf("a3은 %d, a4는 %d \n”, a3, a4);

}

Page 23: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 17 -

순 연산자 연산방향

1 () [] -> . →

2 sizeof &++ -- +(부호) (부호) ~ ! *(포인터) ←

3 * ? % →

4 +(덧셈) (뺄셈) →

라. 계 연산자

숫자나 변수의 크기를 비교하는 연산자이다.

계연산자 의 미 반환값

A<B A가 B보다작은가?

참이면 (1)

거짓이면 (0)

A>B A가 B보다큰가?A==B A와 B가 같은가?A!=B A와 B가 다른가?A>=B A가 B보다 크거나 같은가?A<=B A가 B보다 작거나 같은가?

마. 논리 연산자

참과 거짓에 따른 결과를 조합하여 조건을 만들어 수 있는 연산자이다

&& B:참 B:거짓

B:참 1 0

B:거짓 0 0

|| B:참 B:거짓

B:참 1 1

B:거짓 1 0

! !AB:참 0

B:거짓 1

A&&B A와 B가 모두 참이면 1을 나타냅니다.

A||B A와 B 어느 하나라도 참이면 1을 나타냅니다.

!A A가 참이면 0을 거짓이면 1을 나타냅니다.

연습문제

문제 논리 연산자 활용하는 로그램

#include <stdio.h>

int main()

{

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

int result1, result2, result3;

result1=(a>10);

result2=(b==20);

result3=(c<40);

printf("출력값은 %d입니다.”, result1 && result2 || result3);

}

바. 연산의 우선순

Page 24: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 18 -

순 연산자 연산방향

5 << >> →

6 < <= >= > →

7 == != →

8 & →

9 ^ →

10 | ←

11 && →

12 || →

13 ?: ←

14 = += -= *= /= %= ^= != <<= >>= ←

15 ,(콤마 연산자) →

정리학습

산술연산자산술연산은 일반 인 연산과 같이 “+, -, *, /”와 같은 연산자를 사용

A+B, A-B, A*B, A/B, A%B

입연산자입연산자는 여러 개의 연산자를 여 쓰기 해 사용하는 연산자

A+=B, A-=B, A*=B, A/=B, A%=b

증가 감소 연산자테이터를 1씩 증가 는 감소시키는 연산자

++A, --A, B++, B--

계 연산자숫자나 변수의 크기를 비교하는 연산

A<B,A>B,A==B,A!=B,A>=B,A<=B

논리 연산자참과 거짓에 결과를 조합하여 조건을 만들어 수 있는 연산자

&&,||,!

연산의 우선순

여러 가지 연산자가 들어간 연산을 할때의 순서

Page 25: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 19 -

6. 분기문

시문

친구인 소 , , 은찬, 은솔, 수정, 희동이가 화 에 화를 보고 녁을 먹기

로 하고 화 에 갔습니다.

그런데 화 에는 보고자 하는 호러 화는 15세 람가 화로 15세 생일이 안된

다고 하여 학생증을 검사하고 있습니다.

은찬, 은솔, 소 이가 생일이 안되어 호러 화를 못보고 뽀로로 화를 보기로 하

습니다.

화를 다보고 식당에 갔습니다. 매운것을 좋아하는 사람은 “떡볶이”를 고기를 좋

아하는 사람은 “돈가스”를 나머지는 햄버거를 먹기로 하 다.

가. if문

어떤 조건이 참이면 실행이 되고 거짓이면 실행이 되지 안

는 경우로, 분기문 if문을 이용합니다.

시문에서 “15세 이상은 호러 화를 니다.”를 실행하기

해서 조건 : 호러 화를 본다 → 나이>=15세이며 실행내용

: 조건이 참이면 → 호러 화 람을 한다는 것이다.

연습문제연습문제

문제 - 큰수에서 작은수 빼는 로그램#include <stdio.h>

int main()

{

int A, B;

scanf("%d %d”, &A, &B);

if(A>B)

printf("A와 B의 차는 %d”, A-B);

printf("A와 B의 합은 %d”, A+B);

}

Page 26: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 20 -

연습문제

문제 - 90 이상이면 합격 90 미만은 불합격을 나타내는 로그램#include <stdio.h>

int main()

{

int point;

scanf("%d”, &point);

if(point>=90) printf("합격 \n”);

if(point<90) printf("불합격 \n”);

}

나. if~else문

어떤 조건이 참일 때와 거짓일때 각각 다른 내용일

실행되는 것으로, 분기문 if~else문을 이용합니다.

시문에서 “15세 이상은 호러 화를 보고 아니면 뽀

로로를 니다.”를 실행하기 해서 조건 : 경우 → 나

이>=15세이며 실행내용1 : 참 → 호러 화 람, 실행

내용2 : 거짓 → 뽀로로 람을 한다는 것이다.

연습문제

문제 - 짝수 홀수를 입력받아 구분하는 로그램#include <stdio.h>

int main()

{

int Num

scanf("%d”, &Num);

if(1<=Num && Num<=10)

{

if(Num%2==0)

printf("짝수입니다.”);

else

printf("홀수입니다.”);

}

}

Page 27: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 21 -

나. if~else문

조건에 따라 실행내용이 여러가지 되는 경우 사

용하는 if~else if~else문을 사용합니다.

시문에서 “매운것을 좋아하는 사람은 “떡볶이”

를 고기를 좋아하는 사람은 “돈가스”를 나머지는

햄버거를 먹기로 하 다.” 실행하기 해서

조건 : 경우 → 매운것 == 떡볶이, 실행내용 : 참

→ 떡볶이, 조건 : 경우 → 고기== 돈까스이며, 실행

내용1 : 참 → 돈까스, 실행내용2 : 거짓 → 햄버거

를 한다는 것이다.

연습문제

문제 - 100m 달리기 20 이상이면 “많이 노력하세요”, 16 이상이면 “조 만 더

노력하세요”, 15 이하이면 “좋은 기록입니다”. 출력하는 로그램#include <stdio.h>

int main()

{

int num;

scanf("%d”, &num);

if(num>=20)

printf("많이 노력하세요.”);

else if(num>=16)

printf("조 만 더 노력하세요.”);

else

printf("좋은 기록입니다.”);

}

다. 조건연산자를 이용한 분기문

if~else문을 조건연산자를 이용하여 간단하게 나타냄

조건이 참이면 A를 거짓이면 b를 출력

Page 28: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 22 -

연습문제

문제 - 입력한 두수를 비교하여 큰 수에서 작은 수의 차를 구하는 로그램 #include <stdio.h>

int main()

{

int X, Y;

int Z;

scanf("%d %d”, &X, &Y);

Z=(X>Y)? X-Y:Y-X;

printf("%d과(와) %d의 차는 %d입니다.”, X, Y, Z);

}

라. switch문

switch문은 한가지 조건에 하여 다양한 실행내용을 선택할 수 있어 if~else if~else문

보다도 간결하고 이해하기 쉽지만 제한 이 많습니다.

연습문제

문제 - 입력받은 수가 홀수이면 “홀” 짝수이면 “짝”이 출력되는 로그램 #include <stdio.h>int main(){ int num; scanf("%d”, &num); switch(num%2) { case 0: printf("짝수입니다.”); break; case 1: printf("홀수입니다.”); break; }}

Page 29: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 23 -

연습문제 (변환 )

문제 - if~else 문을 switch문으로 바꾸기#include <stdio.h>

int main()

{

int num;

printf("1,2,3 에 하나를 선택하세요.”);

scanf("%d”, &num);

if(num==1)

printf("첫 번째”);

else if(num==2)

printf("두 번째”);

else if(num==3)

printf("세 번째”);

else

printf("1,2,3이 아닙니다.”);

}

연습문제 (변환 )

문제 - if~else 문을 switch문으로 바꾸기#include <stdio.h>

int main()

{

int num;

printf("1,2,3 에 하나를 선택하세요.”);

scanf("%d”, &num);

switch(num)

{

case 1:

printf("첫 번째”);

break;

case 2:

printf("두 번째”);

break;

case 3:

printf("세 번째”);

break;

default:

printf("1,2,3이 아닙니다.”);

}

}

Page 30: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 24 -

정리학습

if문 사용법

if~else문 사용법

if~else if~else 문 사용법

조건연산자를 이용한 분기문

if~else문을 조건연산자를 이용하여 간단하게 나타냄

switch문

switch문은 한가지 조건에 하여 다양한 실행내용을 선택할 수 있어 if~else

if~else문 보다도 간결하고 이해하기 쉽지만 제한 이 많음

Page 31: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 25 -

7. 반복문

반복문은 여러 번 반복해야 할일을 따로 따로 명령하지 않고 간단한 문장을 통해 명

령을 내리는 것 입니다.

를 들어 블럭쌓기를 10명의 친구들이 같이 할 때 이름 한명씩 불러서 하나씩 쌓게

하는 것이 아니라 번호순서 로 나와서 하나씩 쌓게 하는 것이라고 보면 됩니다.

가. for문

연습문제

문제 - 5에서 10까지 자연수의 합이 출력되는 로그램

결과 -45

#include <stdio.h>

int main()

{

int i;

int sum=0;

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

sum=sum+i;

printf("%d”, sum);

}

Page 32: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 26 -

연습문제

문제 - 1에서 10까지 짝수의 합이 출력되는 로그램

결과 -30

#include <stdio.h>

int main()

{

int i

int sum=0;

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

sum=sum+i

printf("%d”, sum);

}

나. while문

while문은 여러 번 반복해야 할일을 따로 따로 명령하지 않고 간단한 문장을 통해 명

령을 내리는 것입니다.

for문과 비교하면 아래와 같습니다.

Page 33: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 27 -

연습문제

문제 - 입력받은 수부터 10까지 더한 값이 출력되는 로그램

#include <stdio.h>

int main()

{

int num;

int sum=0;

printf("숫자를 입력하세요.”);

scanf("%d”, &num);

if(1<=num && num<10)

{

while(num<=10)

{

sum=sum+num;

num++;

}

printf("10까지의 합은 %d입니다.”, sum);

}

else printf("범 가 아닙니다.”);

}

연습문제

문제 - 입력받은 수부터 50이하의 정수의 합이 출력되는 로그램#include <stdio.h>

int main()

{

int i=50;

int x=0;

int sum=0;

printf("1에서 50까지의 정수 하나 입력: ”);

scanf("%d”, &x);

while(i>=x)

{

sum+=i;

i--;

}

printf("%d 이상 50 이하 정수의 합은 %d입니다. \n”, x, sum);

}

Page 34: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 28 -

나. do~while문

do~while while문과 닮아 있으나 while문의 경우 조건의 참 거짓 여부에 따라 실행여

부를 결정 하지만 do~while에서는 조건이 뒤에 있기 때문에 실행내용이 최소 한번 실행

후 반복여부를 결정하는 차이 이 있다.

실 문제

문제 - 입력받은 정수의 합이 출력되는 로그램

#include <stdio.h>

int main()

{

int sum=0;

int x=0;

printf("정수 입력: ”);

do{

scanf("%d”, &x);

sum+=x;

printf("합은 %d 입니다. \n”, sum);

}while(x!=0);

}

Page 35: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 29 -

정리학습

반복문

반복문은 여러 번 반복해야 할일을 따로 따로 명령하지 않고 간단한 문장을

통해 명령을 내리는 것

for문 사용법

while문 사용법

do~while문

do~while while문과 닮아 있으나 while문의 경우 조건의 참 거짓 여부에 따라

실행여부를 결정 하지만 do~while에서는 조건이 뒤에 있기 때문에 실행내용이

최소 한번 실행 후 반복여부를 결정하는 차이 이 있다.

Page 36: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 30 -

8. break문, continue문

가. break문

break는 멈춘다는 뜻으로 쓰이는데 반복문에서 반복 동작을 멈추기 해 사용하는 명

령어입니다.

연습문제

문제 - A, B, C, D 를 입력하면 참잘했어요, 잘했어요, 보통입니다, 노력하세요. 가

출력되는 로그램

#include <stdio.h>

int main()

{

char c;

printf("A~D 는 a~d 하나 입력: ”);

scanf("%c”, &c);

switch(c)

{

case 'A' :

case 'a' : printf("참 잘했어요.”); break;

case 'B' :

case 'b' : printf("잘했어요.”); break;

case 'C' :

case 'c' : printf("보통입니다.”); break;

case 'D' :

case 'd' : printf("노력하세요.”); break;

}

}

Page 37: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 31 -

연습문제

문제 - 합이 20이상이 되는 최 의 숫자 구하는 로그램

#include <stdio.h>

int main()

{

int i=1;

int sum=0;

while(1)

{

sum=sum+i;

if(sum>=20)

break;

i++;

}

printf("%d일 때 합은 %d입니다.”, i, sum);

}

나. continue문

continue는 계속한다는 뜻으로 쓰이는데 로그램에서 사용하는 것은 조 다른데

continue문 아래를 실행하지 않고 건 뛴 다음 반복을 계속하는 것입니다.

Page 38: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 32 -

연습문제

문제 - 3과 5의 배수를 제외하고 1~30까지의 숫자를 출력하는 로그램

#include <stdio.h>

int main()

{

int i;

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

{

if(i%3==0 || i%5==0)

continue;

printf("%d”, i);

}

}

연습문제

문제 - 구구단 에서 짝수단 출력하는 로그램

#include <stdio.h>

int main()

{

int i, j;

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

{

if(i%2!=0)

continue;

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

printf("%d*%d=%d”, i, j, i*j);

printf("\n”);

}

}

정리학습

break문

break는 멈춘다는 뜻으로 쓰이는데 반복문에서 반복 동작을 멈추기 해 사용

continue문

continue는 계속한다는 뜻으로 쓰이는데 로그램에서 사용하는 것은 조

다른데 continue문 아래를 실행하지 않고 건 뛴 다음 반복을 계속하는 것

Page 39: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 33 -

9. 함수

가. 함수란

함수란 로그램 안의 작은 로그램으로 모든 로그램에 함수가 필요하지는 않지만

함수가 사용되면 로그램을 좀 더 쉽고 간편하게 만들어 주는 작은 로그램입니다.

함수는 로그램 안에서 여러 번 반복하여 사용할 수 있어 로그램을 간편하게 사용

됩니다. 그러나 함수는 로그램 안에 로그램이지만 단지 따로 떼어 놓아 모양이 조

다른 것으로 이해하면 편합니다.

를 들면 피자를 만든다고 할때 피자가게에서 모두 만드는 것이 아니라 치즈, 돼지고

기(햄), 토마토, 가루 등 재료를 하나하나 사와서 도우 에 넣고 굽기만 하면 되는 것

처럼 피자가게에서 모든 것을 만들어서 피자를 만드는 것이 아닙니다.

치즈는 치즈공장에서 돼지고기(햄)는 햄고장에서 만들어서 필요시만 가져와서 사용하

는 것이지요

나. 함수의 구조

Page 40: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 34 -

연습문제

문제 - 두정수의 합을 구하는 로그램#include <stdio.h>

int sum_num(int a, int b)

{

int sum=a+b;

return sum;

}

int main()

{

int x, y;

int sum=0;

scanf("%d %d”, &x, &y);

sum=sum_num(x, y);

printf("%d과(와) %d의 합은 %d입니다.”, x, y, sum);

}

다. 함수 사용시 주의

함수 사용시 아래의 그림과 같이 함수의 정의가 먼 제시 되어야 한다.

연습문제

문제 - 입력된 두 수의 곱을 나타내는 로그램#include <stdio.h>

int mul_num(int a, int b)

{

int mul=a*b;

return mul;

}

int main()

{

int x, y;

int mul=0;

scanf("%d %d”, &x, &y);

mul=mul_num(x, y);

printf("%d과(와) %d의 곱은 %d입니다.”, x, y, mul);

}

Page 41: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 35 -

연습문제

문제 - 입력된 두 수의 차를 나타내는 로그램#include <stdio.h>

int diff(int a, int b)

{

if(a>b)

return a-b;

else

return b-a;

}

int main()

{

int x, y;

scanf("%d %d”, &x, &y);

printf("%d와 %d의 차는 %d입니다.”, x, y, diff(x, y));

}

라. 함수의 여러 가지 형태

1) 첫번째, 달인자(O) 반환값(O)

덧셈 함수이므로 총 두개의 매개변수를 달 받아습니다.

2) 두번째, 달인자(O) 반환값(X)

“void형은 반환하지 않는다”라는 뜻이 담겨져 있습니다. 실제로 몸체에는 return문이

없습니다.

3) 세번째, 달인자(X) 반환값(O)

Page 42: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 36 -

연습문제

문제 - 입력받은 수부터 100까지의 짝수의 합과 홀수 합 구하는 로그램#include <stdio.h>

int search_e(int);

int search_o(int);

int main()

{

int n;

int sum_e=0;

int sum_o=0;

printf("정수 입력: ”);

scanf("%d”, &n);

sum_e=search_e(n);

sum_o=search_o(n);

printf("%d~100 사이의 짝수의 합은 %d 입니다.\n”, n, sum_e);

printf("%d~100 사이의 홀수의 합은 %d 입니다.\n”, n, sum_o);

}

int search_e(int n)

{

void반환형은 반환하지 않겠다는 의미이지만 매개변수의 void는 인자 달을 하지 않겠

다 라는 의미입니다.

4) 네번째, 달인자(X) 반환값(X)

마. 함수의 여러 가지 형태

함수의 수가 많은 경우 확인하기 어렵기 때문에 함수를 뒤로 보내서 사용하는 방법이다.

Page 43: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 37 -

int tmp=0;

int i;

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

{

if(i%2==0) tmp+=i;

}

return tmp;

}

int search_o(int n)

{

int tmp=0;

int i;

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

{

if(i%2==1) tmp+=i;

}

return tmp;

}

마. 함수의 범

함수는 지역에서 사용되는 지역변수와 역에서 사용되는 변수로 구분할 수 있는데

를 들면 치즈를 생산하는 우유(지역변수)는 치즈 공장에서 만 사용하고 피자가게에서

는 사용하지 않는다.

그러나 치즈나 치즈가루, 도매상 소매상( 역변수) 같은 경우는 모든 피자 가게에서

사용한다.

1) 지역변수

지역변수는 함수 내에서만 사용되는 변수로 그 지역을 벗어나면 의미가 없어지는 변

수이다. 아무리 같은 이름의 변수라도 선언되는 치에 따라 서로 다른 변수로 인식되

는 것이 지역변수이다.

Page 44: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 38 -

연습문제

문제 - 두수의 곱을 구하는 로그램#include <stdio.h>

int func1(void)

{

int X=5;

printf("func1에서 X는 %d입니다. \n”, X);

}

int func2(void)

{

int X=10;

printf("func2에서 X는 %d입니다. \n”, X);

}

int main()

{

func1();

func2();

}

연습문제

문제 - 같은 이름 지역변수의 연산 로그램#include <stdio.h>

int func(int a, int b)

{

return a+b;

}

int main()

{

int a=5, b=5;

int X;

X=func(10,10);

printf("main에서 합은 %d func에서 합은 %d”, a+b, X);

}

2) 역변수

역변수는 말 그 로 로그램 지역에서 사용할 수 있는 변수로 한번 역변수로

선언되면 로그램 안에서 어디서든 자유롭게 사용할 수 있으며 로그램이 끝나야 비

로소 메모리에서 없어지는 변수로 역변수를 사용할 때는 지역변수와 이름이 복되지

Page 45: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 39 -

않는 지 확인해야 한다.

3) static변수

static변수는 지역변수를 역변수로 바꾸어 주는 변수로 역변수는 로그램 기에

선언해주어야만 사용이 가능하나 static변수는 로그램어디든지 선언 하면 사용이 가능

한 것이 특징이다.

마. 재귀함수

엘리베이터 안에는 양쪽의 거울이 있어 한쪽을 바라보면 반복 으로 자신의 모습이

비추는 것을 알 수 있는데 이와 마찬가지로 함수 자신이 자신을 호출하여 조건에 만족

할 때까지 반복하는 것을 재귀함수라 합니다.

연습문제

문제 - 카운트 로그램#include <stdio.h>

int Recursive( int nCount )

{

if( nCount <= 0 )

{

printf( "발사\n” );

return ;

}

else

{

printf( "카운트 다운 : %d\n”, nCount );

Recursive( nCount-1 );

}

}

int main( )

{

Recursive( 5 );

return 0;

}

Page 46: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 40 -

바. 팩토리얼 함수

팩토리얼 함수 자신부터 -1 한것을 계속*하는 함수이다.

n! n*(n-1)*(n-2).... 3! 3*2*1

5! 5*4*3*2*1 3! 3*(3-1)*(3-2)

연습문제

문제 - 카운트 로그램#include <stdio.h>

int facto(int n)

{

if(n==0)

return 1;

else

return n*facto(n-1);

}

int main()

{

int num;

int result;

printf("정수를 입력하세요”);

scanf("%d”, &num);

if(num<0)

{

printf("0 이상의 정수가 아닙니다.”);

}

else

{

result=facto(num);

printf("%d!의 결과 : %d”, num, result);

}

}

사. 매크로

매크로는 간단히 말해 호루라기 생각하시면 됩니다.

체육시간에 교사와 학생간에 호루라기 횟수와 시간에 따라 다양한 행동을 하게 훈련

을 하는 것과 같은 것과 같습니다.

컴 일 처리 과정을 통해 단순 치환 작업을 요청할 때 사용하는 지시자입니다.

Page 47: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 41 -

연습문제

문제 - 이름과 나이 출력하기#include <stdio.h>

#define NAME "안희동”

#define AGE 15

int main()

{

printf("제 이름은 %s이고 \n”, NAME);

printf("제 나이는 %d살입니다. \n”, AGE);

}

연습문제

문제 - 연산식 치환하기#include <stdio.h>

#define ONE 1

#define TWO 1+1

#define THREE ONE+TWO

int main()

{

printf("ONE: %d\n”, ONE);

printf("TWO: %d\n”, TWO);

printf("THREE: %d\n”, THREE);

}

아. 매크로 함수

매크로에 간단한 연산식과 짧은 함수를 사용하여 편리성을 높인 함수입니다.

Page 48: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 42 -

연습문제

문제 - 삼각형 넓이 구하는 로그램#include <stdio.h>

#define FUNC(B, H) ((B)*(H)/2)

int main()

{

int W;

W=FUNC(10,12);

printf("삼각형의 넓이는? %d \n”, W);

}

정리학습

함수란? 함수란 로그램 안의 작은 로그램

모든 로그램에 함수가 필요하지는 않지만 함수가 사용되면 로그램을 좀더 쉽

고 간편하게 만들어

함수는 로그램안에서 여러 번 반복하여 사용할 수 있어 로그램을 간편하게

사용

함수의 여러가지 형태 첫번째, 달인자(O) 반환값(O), 두번째, 달인자(O) 반환값(X)

세번째, 달인자(X) 반환값(O), 네번째, 달인자(X) 반환값(X)

함수의 범 함수는 지역에서 사용되는 지역변수와 역에서 사용되는 변수로 구분

지역변수는 함수 내에서만 사용되는 변수로 그 지역을 벗어나면 의미가 없어지는

변수

역변수는 말 그 로 로그램 지역에서 사용할 수 있는 변수

static변수는 지역변수를 역변수로 바꾸어 주는 변수

재귀함수 함수 자신이 자신을 호출하여 조건에 만족할 때 까지 반복하는 것을 귀함수라 함

팩토리얼 팩토리얼 함수 자신부터 -1 한것을 계속*하는 함수

매크로 컴 일 처리 과정을 통해 단순 치환 작업을 요청할 때 사용하는 지시자

매크로 함수 매크로에 간단한 연산식과 짧은 함수를 사용하여 편리성을 높인 것

Page 49: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 43 -

리눅스 C언어의 이해(중급)

Page 50: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고
Page 51: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 45 -

리 스 C언어의 이해( )

1. 배열의 선언과 기화

가.배열이란 무엇인가?

아래와 같이 다수의 정보를 장하기 해서는 다수의 변수를 선언해야 하며, 이는 매

우 번거로울 수 있다.

in t m a in (vo id ){in t c la s s1 0 1 , c la s s1 0 2 , c la s s1 0 3 , c la s s1 0 4 ; / /1 학 년 1 반 부 터 4 반 까 지in t c la s s2 0 1 , c la s s2 0 2 , c la s s2 0 3 , c la s s2 0 4 ; / /2 학 년 1 반 부 터 4 반 까 지in t c la s s3 0 1 , c la s s3 0 2 , c la s s3 0 3 , c la s s3 0 4 ; / /3 학 년 1 반 부 터 4 반 까 지.....}

배열을 이용하면 하나의 선언을 통하여 둘이상의 변수를 선언할 수 있으며, 동시에

다수의 변수가 할 수 없는 일도 할 수 있다. 이 듯 배열은 다수의 데이터를 장하고

처리하데 있어 유용하게 사용할 수 있으며, 선언방식에 따라 1차원 구조가 될 수도 있

고, 2차원 구조가 될 수 도 있다.

이번 장에서는 1차원 구조에 해서 살펴보고 2차원 배열은 10장에서 다룰 것이다.

나.배열의 선언

배열은 일반 변수와 달리 여러 개의 변수가 모여서 배열을 이루기 때문에 여러 개의

값을 동시에 장할 수 있으며, 1차원 배열은 다음과 같이 선언한다.

int arr[10]; 1차원 배열 선언의

배열은 세 개의 요소로 구성이 되며, 각 요소가 의미하는 바는 다음과 같다.

int 배열을 이루는 요소의 자료형

arr 배열의 이름

[10] 배열의 길이

“int형 데이터 10개를 장할 수 있는 메모리 공간을 할당하고 배열의 이름을 arr이

라 해라!”

그리고 의 선언으로 생성되는 배열의 형태는 다음과 같으며,배열의 선언과 동시에 각 변수에

해당되는 10개의 장 공간이 생긴다.이 장 공간인 배열의 각 요소에 근해서 값을 장하기

해서는 다음과 같은 형태의 식이 필요하다.

∙arr[3]=4;→ “배열 arr3번 인덱스(4번째 요소)에 4를 장해라!”

Page 52: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 46 -

이 듯 [ ] 연산자 사이에 배열의 치 정보를 명시하게 되는데 이를 ‘인덱스 값’이

라 한다. 배열의 치 정보를 명시하는 인덱스 값은 첫 번째 요소로부터 얼마만큼 떨어

져 있는가를 의미하며, 의 그림처럼 4번째 요소의 인덱스 값은 첫 번째 요소로부터 3

만큼 떨어져 있으므로 3이 된다.

그러면 다음 실 문제를 통해서 간단한 배열을 선언하고 배열의 요소에 근해보자.

연습문제

문제 - 배열의 길이가 5인 int형 배열을 선언하고 각 배열의 요소의 값을 모두

합한 값과 그 평균을 구하는 로그램.

결과 -

#include<stdio.h>

int main( )

{

int sum=0;

int arr[5];

arr[0]=80;

arr[1]=60;

arr[2]=50;

arr[3]=60;

arr[4]=90;

sum=arr[0]+arr[1]+arr[2]+arr[3]+arr[4];

printf("합 : %d, 평균 :%d”,sum,sum/5);

return 0;

}

제는 배열을 선언하고 각 배열의 요소에 값을 장한 후, 그 요소의 값들을 모두

더한 합과, 평균을 구하는 로그램이다. 각 요소의 총합은 340이고, 평균은 합을 5로

나 값 68이 된다.

다.배열의 선언과 동시에 기화

기본 자료형 변수들은 선언과 동시에 기화가 가능하다. 마찬가지로 배열도 선언과

동시에 원하는 값으로 기화 할 수 있는데, 기화 방법의 유형은 총 세가지 정도이고,

그 방법은 다음과 같다.

int arr[5]={1, 2, 3, 4, 5}; //배열 요소의 왼쪽부터 순차 으로 기화

int arr[ ]={1, 2, 3, 4, 5}; //컴 일러에 의해 자동으로 5가 삽입됨.

int arr[5]={1, 2}; //3, 4, 5번째 요소는 자동으로 0으로 채워짐

여기에서 기화를 목 으로 선언된 호 안의 값을 ‘ 기화 리스트’라고 한다.

의 두 번째 문장은 배열의 길이를 생략하더라도 컴 일러가 자동으로 기화 리스트

Page 53: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 47 -

의 수를 참조하여 길이의 정보를 채워주기 때문에 1, 2번 문장은 다음 문장과 완 동

일하다.

int arr[5]={1, 2, 3, 4, 5}; //int arr[5]={1, 2, 3, 4, 5};, int arr[ ]={1, 2, 3, 4, 5};

그리고 마지막 세 번째 문장에서 선언하는 배열의 길이는 5이나 기화 할 값이 두

개 밖에 존재하지 않는다. 이런 경우 첫 번째 요소부터 차례로 채우고 채울 값이 존재

하는 부분은 0으로 채워나가므로 다음과 같은 배열이 생성된다.

int arr[5]={1, 2, 0, 0, 0}; //intarr[5]={1,2};

그럼 지 까지 설명한 내용을 제를 통해 살펴보도록 하자. 다음 제는 배열을 기

화 하고 배열의 각 요소 값을 출력하는 로그램이다.

# in c lu d e< s td io .h >

in t m a in ( )

{

in t i= 0 ;

in t a rr [5 ]= {1 ,2 ,3 ,4 ,5 } ;

in t a rr1 [5 ]= {1 ,2 } ;

in t a rr2 [ ]= {1 ,2 ,3 ,4 ,5 } ;

fo r ( i= 0 ;i< 5 ;i+ + )

p r in t f ("% 3 d " , a rr1 [ i] ) ;

re tu rn 0 ;

}

2. 배열기반 문자열 변수

가.문자열 상수와 문자열 변수

문자열을 표 하는 방법은 문자열 상수에 의한 방법과 문자열 변수를 이용하는 방법

이 있다. 문자열 상수는 문자열이면서 상수의 특성을 갖고, 문자열 변수는 문자열 이면

서 변수의 특성을 지닌다. 상수와 변수의 의미를 구분하는 기 이 되는 것은 문자열을

장뿐만 아니라 문자열의 변경이 가능한가이며, 아래는 문자열의 변경이 불가능한 문

자열 상수의 를 보여주고 있다.

printf("Happy new year!! \n"); //문자열 상수

그러면 문자열을 변경할 수 있는 방법은 어떻게 하면 될까? char형 배열을 이용하면, 변수

형태의 문자열 선언이 가능해진다. 때문에 배열 char형 배열과 문자열에는 큰 상 이 있다.

Page 54: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 48 -

아래는 배열을 이용하여 문자열을 장하는 문자열 변수의 를 보여주고 있다.

char str1[5]="Food"; //문자열 변수

의 선언을 통해서 메모리 공간에는 char형 배열의 길이만큼 배열이 할당되고, 이 배

열에 문자열이 장된다. 아래의 문제는 문자열 배열을 선언하고 그 배열 요소의 일부

를 다른 문자로 변경하는 제를 보여주고 있다.

연습문제

문제 - 문자열 배열을 선언하고 문자열의 일부를 변경하여 출력하시오.

결과 -

#include<stdio.h>

int main(void)

{ char str1[10]="blueberry”;

char str2[ ]="strawberry”;

str1[0]=‘G'; printf("%s”,str1);

return 0;

}

그런데 char str1[ ]="blueberry"에 할당되는 배열의 길이는 10이다. 문자열의 길이가 9

인데 배열의 길이가 10이 되는 이유는 문자열의 끝에 ‘\0’이라는 특수문자(escape

sequence)가 자동으로 삽입되기 때문이다. 따라서 문자열의 장을 목 으로 char형 배

열을 선언할 경우에는 특수문자 '\0'이 장될 공간까지 고려해서 배열의 길이를 결정해

야 한다.

나.문자열의 (null)문자

이 듯 문자열의 끝에 자동으로 삽입되는 특수문자 ‘\0’을 가르켜 (null)문자라 하

는데 이 (null) 문자는 문자의 끝을 나타냄과 동시에 문자열과 쓰 기 값의 경계를 나

타낸다. 한 문자의 아스키 코드 값은 0이고, 이를 문자의 형태로 출력할 경우, 아무

런 출력이 발생하지 않는다.

사실 메모리상에서 문자열은 이진 데이터로 장되기 때문에 문자열의 시작과 끝이

표시되어 있지 않다면 문자열을 구분하는 것이 불가능하다. 그래서 문자를 이용해서

문자열의 끝을 표시하는 것이다.

아래 문제는 문자열 배열을 선언하고 문자열을 장한 후 문자열의 간에 문자를

삽입해서 문자열의 끝을 변경하고 있다. 그리고 이 게 문자열의 끝이 변경되었을 때,

변경된 끝을 기 으로 문자열이 출력됨을 보여 다.

Page 55: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 49 -

연습문제

문제 - 문자열의 간 간에 (null) 문자를 삽입하여 문자열의 끝을

변경시키면서 문자열을 출력하는 로그램

결과 -

include<stdio.h>

int main(void)

{

char str[30]="I like blueberry!”;

printf("string : %s \n”, str);

str[10]='\0';

printf("string : %s \n”,str);

str[6]='\0';

printf("string : %s \n”,str);

return 0;

}

다.문자 상수와 문자열 상수

이 듯 문자열에 있어서 문자의 존재는 매우 요하다. 문자가 존재하면 문자열

이고 문자가 존재하지 않으면 문자열이 아니다. 다음은 배열에 장되는 값이 문자

열(문자열 상수)인지 문자(문자 상수)인지 나타낸 문장이다.

char str1[ ]="a, b, c, d”; // 큰따옴표 안에 있으므로 문자열

char str2[ ]={'a', 'b', 'c', 'd'}; // 마지막에 문자가 없으므로 문자

char str3[ ]={'a', 'b', 'c', '\0'}; // 마지막에 문자가 있으므로 문자열

문자열의 단여부에 있어서 선언방법은 요하지 않다. 어떻게 선언이 되든 문자

가 마지막에 존재하면 문자열 상수가 되고 없으면 문자 상수가 된다.

다음 문제는 char 배열을 선언한 수 scanf 함수를 이용하여 문자열을 입력받아 배열에

장한 후 장된 문자열을 출력하는 로그램이다. scanf 함수가 데이터를 구분 짓는

기 이 공백이므로 문자열을 입력할 때 공백이 생기지 않도록 주의하여야 한다.

Page 56: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 50 -

연습문제

문제 - char형 배열을 선언한 후 scanf 함수를 이용하여 문자열을 입력받아

배열에 장한 후 다시 이 문자열을 출력하는 로그램

결과 -

#include<stdio.h>

int main(void)

{

char str[50];

int i=0;

printf("문자열 입력 : ”);

scanf("%s”,str);

printf("문자열 출력 : %s \n”,str);

printf("//****문자단 출력****//\n”);

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

printf("%c”,str[i]);

return 0;

}

3. 포인터와 포인터 변수

가.포인터 변수의 개념

포인터는‘변수 형태의 포인터’와‘상수 형태의 포인터’로 구분되는데, 흔히 포인터

라 함은‘포인터 변수’를 지칭한다.

아래는 포인터를 설명하기에 앞서 변수의 선언과 이 변수가 메모리에 할당되는 과정

을 그림으로 표 한 것이다.

Page 57: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 51 -

#include<stdio.h>

int main(void)

{

char ch=‘A';

int num=5;

double d=3.14;

......

}

그림에서 char 변수 ch는 문자 ‘A'가 장되어 있고 int 변수 num에는 5, double형

변수 d에는 3.14의 값이 장되어 있다. 각 변수가 차지하는 메모리의 공간은 char형 변

수가 1바이트, int형 변수가 4바이트 double형 변수가 8바이트를 차지한다. 그러면 데이

터를 장하는 이 변수들의 주소는 어떻게 되는가?

“char형 변수 ch는 0x1001 번지에 장되어 있고, int형 변수 num은 0x1002에서부터

0x1005 번지에, double형 변수 d는 0x1006에서부터 0x100d까지 장되어 있다.” 라고 말

하는 사람도 있을 것이다.

하지만 C언어에서 각 변수는 시작번지만을 가지고 치를 표 한다. 그러므로 “char형

변수 ch는 0x1001, int형 변수 num은 0x1002, double형 변수 d는 0x1006번지에 할당되어

있다.”라고 말할 수 있다. 여기에서 주소 값들 한 정수이며, 이것도 장이 가능한 값

이며, 이를 장하기 해 마련된 변수가 바로 ‘포인터 변수’이다.

이러한 포인터 변수의 크기는 4바이트(32비트)가 될 수도 있고, 8바이트(64비트)가 될

수도 있다. 이는 컴퓨터 시스템에 따라 다르며 32비트 컴퓨터시스템에서는 주소 값을 32

비트로 표 하기 때문에 포인터 변수의 크기가 4바이트인 반면, 64비트 시스템에서는 주

소 값을 64비트로 표 하기 때문에 포인터 변수의 크기가 8바이트 이다.

여기에서는 32비트 시스템이라는 가정 하에 포인터 변수에 해 설명한다.

나.포인터 변수의 선언

포인터 변수는 가리키고자 하는 변수의 자료형에 따라서 선언하는 방법도 달라진다.

사실 주소 값은 동일한 시스템에서 그 크기가 동일하며 모두 정수의 형태를 띤다.

아래 그림은 변수와 포인터 변수를 선언하고 각 변수들이 메모리 공간상에 할당되는

과정을 나타낸 것이다.

#include<stdio.h>

int main(void){ char ch=‘A'; int num=5; int *ptr=&num; //포인터 변수 ptr 선언 ...... //num주소 값을 ptr에 장}

Page 58: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 52 -

의 코드에서 int *ptr이 포인터 변수의 선언이다. * 연산자는 포인터 선언 시 사용되

는 연산자이며, & 연산자는‘오른쪽에 등장하는 피연산자의 주소 값을 반환하는 연산

자’이다. 따라서 의 문장에서는 &연산의 결과로 변수 num의 주소 값이 반환되며, 이

를 포인터 변수 ptr에 장된다.이러한 상황을 그림으로 표 하면 다음과 같다.

//포인터와 변수의 참조 계

그림에서 보듯이 포인터 변수 ptr에는 변수 num의 시작번지 주소 값이 장된다.

그리고 이 상황을 다음과 같이 표 한다.

“포인터 변수 ptr이 int형 변수 num을 가리킨다.”

가리키고자 하는 변수의 자료형에 따라서 선언하는 방법은 다음과 같이 달라진다.

#include<stdio.h>{ int *ptr //ptr이라는 이름의 int 형 포인터 char *ch //ch 라는 이름의 char형 포인터 double *q; //q라는 이름의 double형 포인터 ........ }

그러면 문제를 통해 포인터 변수를 더 깊이 이해해 보도록 하자.

연습문제

문제 - 포인터 변수를 선언하고 포인터 변수에 장에 된 값과 포인터가

가르키는 값을 출력하는 로그램

결과 - num : 5

&num : 2293572 //주소 값 이므로 컴퓨터마다 다름

*ptr : 5 //포인터가 가르키는 주소의 값을 참조

ptr : 2293572 //포인터 변수 ptr에 장된 값(주소 값)

#include<stdio.h>

int main()

{

char ch='A';

int num=5;

int *ptr=&num;

printf("num : %d \n”,num);

printf("&num : %d \n”,&num);

printf("*ptr : %d \n”,*ptr);

printf("ptr : %d \n”,ptr);

return 0;

}

Page 59: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 53 -

앞에서도 설명하 듯이 *연산자는 포인터가 가리키는 메모리 공간을 근할 때 사용

하는 연산자이다. 소스코드에서 포인터 변수 ptr은 변수 num을 가리키고 있다. 따라서

*ptr이 의미하는 바는 다음과 같다.

“포인터 변수 ptr이 가리키는 메모리 공간인 변수 num에 근을 해서...”

그러므로 printf(*ptr : %d \n",*ptr);의 의미는

“포인터 변수 ptr이 가리키는 메모리 공간인 변수 num에 근해서 장된 값을 십진

수 정수형으로 출력해라!”가 된다.

그리고 printf(ptr : %d \n”,ptr);은 ptr이 포인터 변수이므로 변수 ptr에 장된 값(num

의 주소 값)을 출력하라는 문장이다.

4. 포인터 타입(형)

가. 다양한 포인터 타입이 존재하는 이유

다음과 같은 반환문이 있다고 가정하자.

return *ptr;

return문에서 ptr은 포인터 변수이다. 그리고 의 문장을 해석하면 ptr이 가르키는 메

모리 공간에 근해서 장된 값을 반환하라는 의미가 된다. 데이터의 자료형에 따라

장되는 메모리 공간의 크기가 다르다. char형 1바이트, int형 4바이트, double형 8바이

트의 공간에 데이터가 장 되는데 문장으로 보았을 때 ptr이 참조해야 하는 값이

얼마인지 알지 못한다.

그럼 ptr을 int형 포인터 변수라고 가정했을 때에는 어떻게 되는가?

“ptr은 int형 포인터 변수이므로 pnum에 장된 주소를 시작으로 총 4바이트를 읽어

들여서 이를 정수형으로 반환해라”라는 의미가 된다.

그러므로 포인터의 타입은 메모리 공간을 참조하는 기 이 된다.

Page 60: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 54 -

연습문제

문제 - 연속된 메모리 공간에서 포인터 변수가 참조하는 값을 출력하는

로그램

결과 - *pCh:A, *pNum:5, *pD:3.140000

#include<stdio.h>

int main(void)

{

char ch='A';

char *pCh=&ch;

int num=5;

int *pNum=&num;

double d=3.14;

double *pD=&d;

printf("*pCh:%c, *pNum:%d, *pD:%f”, *pCh, *pNum, *pD);

return 0;

}

의 로그램은 포인터변수가 메모리 공간에 근해서 자료형에 해당하는 만큼의 메

모리 공간을 참조하여 데이터를 출력한다. 이것을 메모리 공간상의 그림으로 살펴보면

다음과 같다.

그림에서 각 포인터 변수의 크기는 pCh, pNum, pD는 4바이트로 동일하다. 하지만

포인터 변수에 장된 주소 값을 기 으로 메모리 공간에 근 기 은 각기 다르다.

pCh는 char형 포인터이므로 0x1001번지를 기 으로 1바이트 만큼, pNum은 int형 포인터

이므로 0x1002번지를 기 으로 4바이트 만큼, pD는 double형 포인터이므로 0x1006번지

를 기 으로 8바이트 만큼을 참조하여 데이터를 읽어 들인다.

Page 61: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 55 -

나.잘못된 포인터의 사용

포인터 변수에는 메모리의 주소 값이 장되고,이를 이용해서 해당 메모리 공간에 근도 가능하

기 때문에 포인터와 련해서는 상당히 주의를 해야 한다.따라서 지 부터는 잘못 사용된 포인터

변수의 에 해 살펴보기로 하겠다.

#include <stdio.h>

int main()

{

int *ptr; //쓰 기값 기화(Code::Blocks에서는 0으로 기화)

*ptr=100;

printf("*ptr : %d”, *ptr);

}

의 로그램을 살펴보면 포인터 변수를 선언하고 기화 하지 않았다. 그러므로 포

인터 변수 ptr에는 쓰 기 값으로 기화 된다. ptr은 주소 값이 장되는 포인터 변수

이므로 어딘가 모르는 곳을 가르키게 된다는 의미가 된다. 여기에 *ptr=100은 *연산을

통해 100을 장하라는 의미가 된다. 이것을 정리하면

“어딘가 알지 못하는 곳에 100이라는 값을 장해라!”라는 의미로, 만약 ptr이 가르키

는 곳이 메모리 공간상에서 매우 요한 치라면 시스템에 심각한 문제를 일으킬 수

도 있는 상황이 된다. 하지만 다행스럽게도 요즘 운 체제에서는 잘못된 근을 미연에

방지하는 장치가 마련되어있다. 그 지만 이런 포인터의 사용은 해야 한다.

두 번째 포인터의 잘못된 사용을 살펴보면 다음과 같다.

#include <stdio.h>

int main()

{

int *ptr=100; // 장 번지?

*ptr=200;

printf("*ptr : %d”, *ptr);

}

의 로그램은 포인터 변수 ptr을 100번지로 기화하고 있다. 하지만 100번지가 어

디인지 알지 못하고 100번에 장된 값이 어떤 값인지도 알지 못하는 상황이다.

이는 쓰 기 값으로 포인터를 기화하는 것과 다르지 않다. 이러한 포인터의 사용도

해야 한다. 그럼 앞에서 공부한 포인터 타입에 따라 포인터 변수가 참조하는 메모리

의 크기가 얼마나 되는지 제를 통해 살펴보자.

Page 62: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 56 -

연습문제

문제 - 연속된 메모리 공간에서 포인터 타입에 따라 포인터 변수가 참조하는

메모리 공간의 크기가 얼마나 되는지, 그리고 포인터 변수의 크기가 얼마인지

sizeof( )함수를 사용하여 출력하는 로그램

결과 - *pCh:1, pCh:4

*pNum:4, pNum:4

*pD:8 pD:4

#include<stdio.h>

int main(void)

{

char ch='A';

int num=5;

double d=3.14;

char *pCh=&ch;

int *pNum=&num;

double *pD=&d;

printf("*pCh:%d, pCh: %d\n”, sizeof(*pCh), sizeof(pCh));

printf("*pNum:%d, pNum: %d\n”, sizeof(*pNum), sizeof(pNum));

printf("*pD:%d, pD: %d\n”, sizeof(*pD), sizeof(pD));

return 0;

}

로그램에서 char형, int형, double형 포인터 변수가 참조하는 메모리 공간의 크기

는 각각 1바이트, 4바이트, 8바이트이다. 그리고 변수의 주소 값을 장하는 포인터 변

수의 크기는 모두 4바이트로 동일하다.

Page 63: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 57 -

5. 배열 이름의 의미와 활용

가.배열 이름의 의미

결론부터 말하자면‘배열의 이름은 포인터’다. 단, 그 값을 바꿀 수 없는‘상수형 포

인터’이다. 이런 결론을 안고 이번 장을 설명하려고 한다.

배열 이름의 정체를 밝히기 해 다음 제를 살펴보자

연습문제

문제 - 배열을 선언한 후 각 배열 요소의 주소 값과 배열 이름의 주소 값을

출력하여 배열 이름이 갖는 의미를 확인하고자 하는 로그램

결과 -

#include <stdio.h>

int main()

{

int arr[5]={1, 2, 3, 4, 5};

printf("arr[0]:%d, arr[1]:%d\n”, arr[0], arr[1]);

printf("&arr[0]:%d, &arr[1]:%d\n”, &arr[0], &arr[1]);

printf("배열 이름 arr: %d”, arr); //배열이름의 정체

return 0;

}

의 로그램을 실행시킨 결과 배열요소 arr[0]와 arr[1]의 주소 값의 차이는 4바이트

가 남을 알 수 있다. 선언한 배열의 자료형이 int형이므로 각 요소별로 할당되는 메모리

공간의 크기가 4바이트가 됨을 알 수 있다. 그리고 실행 결과를 통해 ‘모든 배열의

요소가 메모리 공간에 나란히 할당된다.’라는 사실을 증명하는 결과 한 알 수 있다.

그리고 배열의 arr이 배열의 첫 번째 요소인 arr[0]의 주소와 같다는 것을 알 수 있다.

한 로그램을 통해 증명해 보이지는 않았지만 배열의 이름 arr은 다른 값을 넣을 수

없는 상수이다.

그러므로 우리는 배열의 이름에 해 다음과 같은 결론을 내릴 수 있다.

“배열의 이름은 배열의 시작 주소 값을 의미하며, 그 형태는 값의 장이 불가능한 상

수이다.”

처음 시작하면서 내린‘배열이름은 포인터이다.’라는 결론을 확인하기 해 배열이름

과 포인터의 차이 이 무엇이지 비교해 보자.

Page 64: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 58 -

비교 상

비교조건포인터 배열이름

이름이 존재하는가? 있다 있다

무엇을 나타내는가? 메모리의 주소 메모리의 주소

변수인가? 상수인가? 변수 상수

의 표에서 보이듯이 포인터와 배열이름은 둘 다 이름이 존재하며, 모두 메모리의 주

소를 나태내고 있다. 다만 포인터는 주소 값을 바꿀 수 있는 변수이고 배열이름은 주소

값을 바꿀 수 없는 상수이다. 그러므로 배열의 이름은‘상수형 포인터’ 는‘포인터

상수’라고 말할 수 있다.

‘배열이름도 포인터’라면 자료형이 존재해야 한다. 다음과 같은 배열이 선언되었을 때

int arr[5]; //arr은 int형 포인터 상수

배열 이름 arr이 가르키는 곳은 배열의 첫 번째 요소인 arr[0]의 주소이다. 그러면 배

열의 첫 번째 요소가 int형 이므로 arr은‘int형 포인터’라는 결론이 나오며, 이것이 실

제 arr의 포인터 형이 된다.

그러면 배열 이름의 포인터형을 결정지어 보자.

char ch[5]; //배열의 요소가 char형 이므로 ch는 char형 포인터 상수

double d[5]; //배열의 요소가 double형 이므로 d는 double형 포인터 상수

나.배열 이름의 활용

배열 이름의 이름과 포인터 변수는 변수냐 상수냐의 특성 차이가 있을 뿐, 포인터

변수로 할 수 있는 연산을 배열이름으로도 할 수 있고 배열의 이름으로 할 수 있는 연

산은 포인터 변수로도 할 수 있다. 달리 표 하면, 배열이름을 포인터처럼, 포인터를 배

열 이름처럼 활용하는 것이 가능해진다는 것이다.

그림은 배열 이름과 포인터의 계를 그림으로 표 한 것이다. 다음 제를 통해

포인터가 배열 이름처럼 활용될 수 있는지 확인해 보기로 하자.

Page 65: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 59 -

연습문제

문제 - 포인터를 선언한 후 포인터를 배열처럼 활용하는 것이 가능함으로

보여주는 로그램

결과 -

#include <stdio.h>

int main( )

{

int arr[3]={10,20,30};

int *ptr

ptr=arr; //가능?, 입연산자는 자료형이 같아야 입이 가능..

printf("%d, %d, %d\n”, arr[0], arr[1], arr[2]);

printf("%d, %d, %d\n”, ptr[0], ptr[1], ptr[2]);

return 0;

}

의 제에서 보듯 포인터 변수를 배열의 이름처럼 사용하는 것이 가능함으로 알 수

있다.

그러면 다음 제를 통해 배열이름이 상수이고, 포인터가 변수임을 확인해 보자.

연습문제

문제 - 포인터를 선언한 후 포인터를 배열처럼 활용하되. 배열 이름은 값을

변경할 수 없는 상수, 포인터는 값을 변경할 수 있는 변수임을 확인할 수

있는 로그램

결과 -

#include <stdio.h>

int main( )

{

int arr[3]={10,20,30};

int num=100;

int *ptr;

ptr=arr;

printf("%d, %d, %d\n”, arr[0], arr[1], arr[2]);

printf("%d, %d, %d\n”, ptr[0], ptr[1], ptr[2]);

ptr=&num;

arr=&num //배열이름은 상수이므로 컴 일 에러

printf("%d”,*ptr);

return 0;

}

의 제에서 arr은 포인터 상수이므로 &num의 주소 값을 장 할 수 없으므로 컴

일 에러가 발생한다. 로그램은 arr=&num을 주석처리 후 실행해야 한다.

Page 66: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 60 -

6. 포인터 연산

가.포인터 상 증·감 연산

포인터는 메모리 근을 한 *연산 이외에도 증가 감소 연산도 가능하다. 포인터

변수를 상으로 증가 감소 연산을 하 을 때 어떤 연산이 실행되는지 다음 제를

통해 확인해 보자

연습문제

문제 - 포인터 변수에 기값을 장한후 포인터 증·감연산을 실행하 을 때

어떤 변화가 있는지 확인하는 로그램

결과 -

#include <stdio.h>

int main( )

{

int *ptr1=1000;

char *ptr2=2000;

double *ptr3=3000;

printf("%d번지, %d번지, %d번지\n”,ptr1++,ptr2++,ptr3++);

printf("%d번지, %d번지, %d번지\n”,ptr1, ptr2,ptr3);

printf("%d번지, %d번지, %d번지\n”,--ptr1,--ptr2,--ptr3);

return 0;

}

제에서 포인터 변수의 기화 형태는 에 배운 포인터의 타입의 부 한 표

에서 언 한 바와 같이 치 못한 기화이다. 다만, 포인터 연산을 했을 때 증감 연

산의 결과를 확인하기 해서 와 같이 기화를 진행하 다. 의 실행결과를 통해

알 수 있는 사실을 정리하면 다음과 같다.

“int형 포인터를 상으로 1을 증가시키면 4바이트가 증가하고, char형 포인터를 상

으로 1을 증가시키면 1바이트, double형 포인터를 상으로 1을 증가시키면 8바이트가

증가한다. 한 감소 연산시도 마찬가지로, 각각 4, 1, 8바이트씩 감소한다.”

지 까지의 결과를 일반화 하면 다음과 같이 정리할 수 있다.

“TYPE형 포인터를 상으로 n의 크기만큼 값을 증가 감소시킬 때, n×sizeof

(TYPE)의 크기만큼 주소 값이 증가 감소한다.”

그러면 포인터 증가 감소 연산을 통해 배열 요소에 근하는 로그램을 확인해

보도록 하자.

Page 67: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 61 -

연습문제

문제 - 배열을 선언한 후 포인터로

배열에 근하여 증감 연산을 실행했을

때 연산결과가 어떻게 되는가를

확인하는 로그램

결과 - 10, 20, 30, 40, 50, 30

#include <stdio.h>

int main( )

{

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

int *ptr=arr;

printf("%d\n”,*ptr);

//포인터 연산 후//

printf("%d\n”,*(++ptr));

printf("%d\n”,*(++ptr));

printf("%d\n”,*(ptr+1)); //ptr ?

printf("%d\n”,*(ptr+2)); //ptr ?

printf("%d\n”,*(ptr));

return 0;

}

의 로그램에서 배열을 선언한 후 기화 하 을 때 배열의 요소들이 메모리에 할

당된 것을 그림으로 나타내었다. 포인터 변수 ptr은 배열이름 arr로 기화 되어있다.

포인터 변수 ptr은 int형 포인터임으로 값을 1 증가시키는 연산을 할 때마다 실제로는

4바이트가 증가한다. 따라서 배열 arr이 할당된 치의 주소 값이 0x1000 이라 가정할

때 ++ptr의 연산결과로 반환되는 주소 값은 0x1004이고, 포인터 변수 ptr에 장된 주

소 값은 0x1004으로 변경된다.

로그램에서 ++p 연산을 두 번 실행하 을 때 ptr에 장된 주소 값은 0x1008로

변경된다. 그런데 ptr+1은 ptr의 치에서 1만큼 연산한 결과이므로 4바이트가 증가한

치의 주소 값 0x100c를 참조하지만 포인터 변수 ptr에 장된 주소 값은 여 히

0x1008으로 장되어있다. ptr+2는 ptr의 치 0x1008에서 2만큼 연산한 결과이므로 8바

이트를 증가시킨 치의 주소 값 0x1010이다.

의 로그램에서 내릴 수 있는 결론은 “*(++ptr)은 연산의 결과로 인해서 포인터 변

수 ptr에 장된 값이 4만큼 변경되지만, *(ptr+1)은 결과로 인해서는 ptr에 장된 값이

증가하지 않는다”는 것이다.

나. 한 결론!arr[i]==*(arr+i)

앞선 제를 통해 *ptr, *(ptr+1), *(ptr+2)의 출력결과는 arr[0], arr[1], arr[2]의 출력 결

과와 동일함을 확인하 다. 그러므로 배열의 이름과 포인터 변수는 상수냐 변수냐의 차

Page 68: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 62 -

이만 있을 뿐, 사실상 동일한 포인터임을 확인할 수 있다.

다음 제를 통해 한 결론 arr[i]==*(arr+i)을 성립함을 확인하고자 한다.

연습문제

문제 - 배열이름으로 연산한 결과와 배열

요소의 값을 통해 arr[i]==*(arr+i)가 성립함을

확인할 수 있다.

결과 -

#include <stdio.h>int main( ){ int arr[5]={10,20,30,40,50}; int *ptr=arr; printf("%d %d\n”,arr[0],*(arr+1)); printf("%d %d\n”,ptr[0],*(ptr+1)); return 0;}

의 로그램을 통해 다음 네 문장이 사실상 같은 것이며, 실제로 다음의 네 문장 모

두 동일한 출력 결과를 보임을 측할 수 있다.

printf("%d %d %d \n”, arr[0], arr[1], arr[2]);

printf("%d %d %d \n”, *(arr+0), *(arr+1), *(arr+2));

printf("%d %d %d \n”, ptr[0], ptr[1], ptr[2]);

printf("%d %d %d \n”, *(ptr+0), *(ptr+1), *(ptr+2));

이제까지의 알아본 사실로 우리는 한 식을 도출할 수 있다.

arr[i]==*(arr+i); //arr[i]는 *(arr+i)와 같다.

ptr[i]==*(ptr+i); //ptr[i]는 *(ptr+i)와 같다.

의 식에서 arr은 배열의 이름이어도 성립하고 포인터 변수이어도 성립한다.

7. 문자열 상수와 포인터

가.두 가지 형태의 문자열 표

문자열을 선언하는 방식에는 다음과 같이 두가지 방식이 있다. 하나는 배열을 이용하

여 문자열을 장하는 방식이고, 다른 하나는 char형 포인터 변수를 이용하는 방식이

다.

char str1[5]="good”; //char형 배열을 이용하는 방식

char *str2="GOOD”; //char형 포인터 변수를 이용하는 방식

의 첫 번째 문장은 배열을 기반으로 하는‘변수 형태의 문자열’선언으로, 변수라는

Page 69: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 63 -

용어에서 알 수 있듯이 문자열의 일부를 변경할 수 있다. 두 번째 문장은 포인터를 기

반으로 하는 문자열 선언으로 이 게 선언하면 메모리 공간에 문자열 “GOOD”이 장되

고, 문자열의 첫 번째 문자‘G'의 주소 값이 반환된다. 그리고 반환된 값이 포인터 변수

str2에 장된다. 이는 문자열의 일부를 변경할 수 없는 “상수 형태의 문자열”이라 한다.

다음 제를 통해 str과 str2의 차이 을 확인하도록 하자.

연습문제

문제 - 배열기반 문자열 변수와 포인터 기반 문자열 상수의 차이 을 확인하기

해 문자의 일부를 변경하는 로그램.

결과 -

#include <stdio.h>int main( ){ char str[5]="good”; char *str2="GOOD”; printf("%s\n”,str); printf("%s\n”,str2); str[0]='F'; printf("%s\n”,str);// str2[0]='G';// printf("%s\n”,str2);// printf("%c\n”,str2[3]); return 0;}

str은 배열 이름으로 배열의 첫 번째 요소 str[0]의 주소 값을 담고 있고, str2는 문자

'G'의 주소 값을 담고 있다. 다만 이들의 차이 은 str은 주소 값을 바꿀 수 없으며, str2

는 다른 치를 가리킬 수 있다는 것이다.

str과 str2, 두 문자열에 할당된 메모리 형태를 비교하면 다음과 같다.

앞에서도 언 한 바와 같이‘변수 형태의 문자열’은 배열을 상으로는 값의 변경이

가능하다. 의 로그램에서 str[0]=‘F' 문장은 배열에 장된 첫 번째 배열요소를 'g'

에서 'F'로 변경함으로써 문자열 “good”를 “Food”로 변경할 수 있지만 포인터 변수 str2

가 가리키는 문자열은 “상수 형태의 문자열”이기 때문에 문자열의 내용 변경이 불가능

하다. 그러므로 str2[0]='G' 문장은 컴 일 시 에러가 발생한다.

나.포인터 배열의 이해

포인터 변수로 이루어진, 그래서 주소 값의 장이 가능한 배열을‘포인터 배열’이라

한다. 그리고 이러한 배열의 선언 방식은 다음과 같이 한다.

Page 70: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 64 -

int *arr1[20]; //길이가 20인 int형 포인터 배열 arr1

연습문제

문제 - 포인터 배열을 선언하고 활용하는 로그램

결과 - #include <stdio.h>int main( ){ int num1=1, num2=2, num3=3; int *arr[3]={&num1,&num2,&num3}; printf("arr[0]:%d\n”,*arr[0]); printf("arr[1]:%d\n”,*arr[1]); printf("arr[2]:%d\n”,*arr[2]); return 0;}

포인터 배열은 배열의 요소로 주소 값을 장하고 있을 뿐 일반 배열과 구조 으로

별반 다르지 않다.

다.문자열을 장하는 포인터 배열

앞에서도 언 하 듯이 문자열이 장되면 그 주소 값을 반환하게 된다. 문자열을

장하는 포인터 배열은 각 문자열의 주소 값을 배열의 요소로 갖는 배열을 말한다. 다음

제를 통해 자세히 살펴보도록 하자.

연습문제

문제 - 문자열을 배열의 요소로서 갖는 포인터 배열의 활용 로그램

결과 -

#include <stdio.h>

int main( )

{

char* arr[3]={

"Linux-C”,

"C-Programming”,

"Vacation”

};

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

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

printf("%s\n”, arr[2]);

return 0;

}

의 로그램이 실행되면 기화 리스트에 선언된 문자열들은 메모리 공간에 장되

고, 장된 치의 주소 값을 반환한다. 따라서 다음과 같은 형태로 다시 표 될 수 있다.

char *arr[3]={0x1000, 0x2000, 0x3000}; //반환된 주소 값은 임의로 정함

Page 71: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 65 -

여기에서 각 배열 요소의 주소 값은 문자열의 첫 번째 문자의 주소 값이 된다.

제문제2의 포인터 배열도 배열의 요소로 주소 값을 갖고, 제문제3의 포인터 배열

도 배열의 요소로 주소 값을 갖는 다. 다만 제문제 2의 포인터 배열은 기본 자료형

변수의 주소 값을, 제문제 3의 포인터 배열은 문자열의 주소 값을 갖는다는 차이 이

있을 뿐이다.

8. 포인터와 함수의 이해

가. 기본 인 인자의 달 방식

함수호출 시 호출하는 쪽에서는 인자의 값을 달하고, 호출 되는 함수 쪽에서는 매개

변수로서 달된 인자의 값을 받게 된다. 이때 우리가 알아야 할 요한 사실은 “함수호

출 시 달되는 값은 매개변수에 복사가 된다!”라는 것이다. 즉, 함수가 호출이 되고 나

면 달되는 인자와 매개변수는 별개가 된다는 것이다.

의 그림에서 add 함수 내에서 매개변수 n의 값을 10을 증가시켰다고 해서 main 함

수 내의 num의 값이 바 지 않는다는 것이다. 왜냐하면, n과 num은 값만 복사되었을

뿐, 별개의 변수이기 때문이다. 그럼 달되는 인자 num과 달받는 매개변수 n이 함께

연동되어 변하는 인자 달 방법은 없을까? 이 문제에 해서는 후에 언 하기로 한다.

나. 배열이름에 의한 달 방식

함수호출 시 배열을 인자로 달하는 방식에 해 생각해 보자. 결론 으로 호출되는

함수 쪽에 매개변수로 배열을 통째로 넘겨주는 방법은 없다. 이는 배열을 통째로 넘겨

받으려면 매개변수로 배열을 선언할 수 있어야 하는데, 이것이 허용되지 않기 때문이다.

신 호출되는 함수 내에서 배열에 근할 수 있도록 배열의 주소 값을 달하는 것은

가능하다.

다음은 배열이름(배열의 주소 값)을 인자로 달하는 함수와 메모리 구조를 그림으로

나타낸 것이다.

Page 72: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 66 -

연습문제

문제 - 함수 호출시 배열의 주소 값을

인자로 달하여 호출되는 함수 내에서

배열에 근이 가능한지 확인하는 로

그램

결과 -

#include <stdio.h>

void add(int *arr2);int main( )

{

int arr1[2]={10,20}; add(arr1);

printf("%d \n”,arr1[0]);

return 0;}

void add(int *arr2){

printf("%d \n”,arr2[0]);

arr2[0]=50;}

의 로그램에서 add 함수를 호출하면서 인자로 배열이름 arr1을 달하고 있고 호

출되는 add 함수는 매개변수로써 다음과 같이 int형 포인터 변수를 선언하여야 한다.

void add(int *arr2) //매개변수로 int형 포인터 변수 arr2 선언

그러면 매개변수 arr2를 이용해서 배열에는 어떻게 근해야 하는가? 이와 련해서는

앞의 포인터 연산에서 포인터 변수를 이용해서 배열의 형태로 근이 가능하다는 것을

확인했다.

그러므로 arr1[0]==arr2[0], arr1[1]==arr2[1]를 갖는다. 이는 단순한 값의 복사가 아니라

arr1과 arr2가 메모리 공간상에서 같은 치를 가리키고 있다는 의미 한 갖는다. 그러

므로 arr2[0]의 값을 50으로 변경한다는 것은 main 함수내 배열의 요소 arr1[0]의 값이

변경된다.

다. 배열이름, 포인터의 sizeof 연산

배열이름은 배열 체 크기를 바이트 단 로 반환하고, 포인터는 포인터의 크기를 바

이트 단 로 반환한다. 이를 확인하기 해서는 다음과 같이 sizeof 연산을 사용하여 확

인할 수 있다.

Page 73: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 67 -

연습문제

문제 - sizeof 연산을 사용하여 배열이름과 포인터의 크기를 바이트 단 로

반환하여 출력하는 로그램

결과 -

#include <stdio.h>

int main()

{

int arr[5];

int *ptr=arr;

printf("%d \n”,sizeof(arr));

printf("%d \n”,sizeof(ptr));

return 0;

}

의 로그램을 통해 배열이름은 배열의 체크기는 4×5=20바이트, 포인터는 포인터

자체크기 4바이트를 반환한다는 것을 확인할 수 있다. 다음 제는 호출함수에서 주소

값을 달인자로, 호출되는 함수에서 주소 값을 매개변수로 달받아 배열의 요소에 직

근하여 합을 구하는 로그램이다.

연습문제

문제 - 호출되는 함수에서 main함수 내 배열에 근하여 배열요소의 체의 합을 구하는

로그램

결과 -

#include <stdio.h>

int Add_arr(int *arr2,int n);

int main()

{

int arr1[8]={1,2,3,4,5,6,7,8};

int sum_arr;

sum_arr=Add_arr(arr1, sizeof(arr1)/sizeof(int));

printf("배열의 총합:%d\n”,sum_arr);

return 0;

}

int Add_arr(int *arr2, int n)

{

int sum=0;

int i=0;

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

sum+=arr2[i];

return sum;

}

Page 74: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 68 -

9. Call-by-value & Call-by-reference

가. 값의 복사에 의한 함수호출

함수을 호출할 때 단순히 값을 달하는 형태의 함수호출을 가리켜 Call-by-value라

하고, 메모리의 근에 사용되는 주소 값을 달하는 형태를 Call-by-reference라 한다.

연습문제

문제 - 함수의 인자 달로 값을 달하는 일반 인 함수 호출의 를 보여주는

로그램

결과 - #include <stdio.h>

int add(int a, int b)

int main( )

{

int num1=10;

int num2=20;

printf("result : %d \n”,add(num1,num2));

return 0;

}

int add(int a, int b)

{

return a+b;

}

의 로그램은 함수 호출시 인자로 num1, num2 값을 달하고 있다. 달받는 매개

변수 int a, int b는 num1과 num2의 값을 받지만 단순한 값의 복사만이 이루어진다. 메

모리 공간상에서도 num1, num2, int a, int b의 치가 서로 다르고 값만 같다.

나. Call-by-value에 의한 swap 함수

다음 로그램은 swap 함수를 호출하여 main 함수 내에 장되어 있는 변수 num1,

num2의 값을 서로 바꾸려고 한다. 하지만 교환의 잘못된 를 보여주고 있다. 이는 호

출되는 함수 쪽에서 main 함수내의 변수에 근할 없기 때문이다. 무엇이 잘못되었는지

로그램으로 통해 확인해 보도록 하자.

Page 75: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 69 -

연습문제

문제 - Call-by-value에 의한 swap 함수의 호출로 변수의 값을 서로 바꾸고자

하는 로그램. 의도하고자 하는 바와 다르게 실행되는 로그램의

결과 -

#include <stdio.h>

void swap(int a, int b);int main()

{

int num1=10; int num2=20;

swap(num1,num2);

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

return 0;

}void swap(int a, int b)

{

int temp=a; a=b;

b=temp;

printf("a:%d \n”,a); printf("b:%d \n”,b);

}

main 함수에서 swap 함수를 호출하고 있으며 swap 함수는 두 변수 a, b에 장되어있

는 값을 서로 교환하는 알고리즘에 의해 값을 서로 바꾸고 있다. 하지만 이는 매개변수

a, b에 장된 값을 변경시킬 뿐, num1, num2에 장된 값의 변경까지 이어지지 않는다.

이것은 다음 그림에서 보이듯이 num1, num2, a, b와 완 히 별개의 것이기 때문이다.

Call-by-value에 의한 함수 호출로는 우리가 원하는 결과를 얻을 수 없다. 그러면 어떻

게 하면 될까? 이를 해서는 Call-by-reference라는 개념이 필요하다.

다. Call-by-reference에 의한 swap 함수

Call-by-reference는 앞장에서 살펴본 ‘주소 값을 달하는 형태의 함수호출’의 개

념으로 설명될 수 있다. 이는 num1과 num2의 주소 값을 swap 함수로 달해서 swap

함수 내에서 num1, num2에 직 근이 가능하도록 하는 것이다 그럼 이에 한 제

문제를 통해 확인해 보도록 하자.

Page 76: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 70 -

연습문제

문제 - Call-by-reference에 의한 swap 함수의 호출로 main 함수내 변수num1,

num2의 값을 서로 바꾸는 로그램.

결과 -

#include <stdio.h>void swap(int *a, int *b);int main( ){ int num1=10; int num2=20; swap(&num1,&num2); printf("a:%d \n”,num1); printf("b:%d \n”,num2); return 0;}void swap(int *a,int *b){ int temp=*a; *a=*b; *b=temp;}

의 로그램은 swap 함수의 호출을 통해 main 함수내의 변수 num1과 num2가 서로

바 는 것을 보여주고 있다. 제에서 가장 핵심 되는 부분은 swap 함수이다.

함수는 변수의 주소 값을 인자로 받아서 해당 변수에 직 근하는 형태를 띤다.

10. 다차원 배열

가. 다차원 배열이란?

다차원 배열은 2차원 이상의 배열을 의미한다.

1차원 배열은 논리 으로 1차원 형태인 선의 형태를 띠고, 2차원 배열은 논리 으로 2

차원 형태인 평면구조의 형태를 띤다. 그러면 3차원 배열은 어떻게 될까? 3차원 배열은

입체의 형태인 직육면체 구조의 형태를 띤다.

참고로 1차원, 2차원 3차원 배열의 선언형태는 다음과 같다.

Page 77: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 71 -

2차원 배열의 선언방식은 1차원 배열의 선언방식과 매우 유사하다. 다만 그 특성상 세

로와 가로의 길이를 각각 명시하는 형태일 뿐이다. 따라서 다음과 같은 형태로 표 할

수 있다.

int arr2[3][4]에서 호 안에 들어있는 숫자는 배열의 요소에 근할 때 사용하게 되

는 인덱스 값이다. 정리하면 배열의 이름이 arr2이고 배열요소의 자료형이 int형이고, 3

은 행(가로)요소, 4는 열(세로)요소가 된다.

나. 2차원 배열요소의 근

2차원 배열요소에 근하는 방법을 설명하기 해 다음 그림을 제시하고 있다.

int arr[3][4]는 행(가로)이 3, 열(세로)이 4이고 배열의 요소가 int형이며, 배열의 이름이

arr인 2차원 배열이다. 여기에서 2차월 배열이름 arr의 값은 arr[0][0]의 주소 값과 같다.

Page 78: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 72 -

연습문제

문제 - 2차원배열을 선언하고 학년별, 학 별 학생 수를 입력받아 2차원배열에

장하고 출력하는 로그램

#include <stdio.h>int main( ){ int chungbuk[3][4]; int i,j; int stu; //학년별 반별 학생수 입력 for(i=0;i<3;i++) { for(j=0;j<4;j++) { printf("%d학년 %d반 학생수 입력:”, i+1, j+1); scanf("%d", &chungbuk[i][j]); } } //충북 학교 학년별 총학생수 출력 for(i=0;i<3;i++) { stu=0; for(j=0;j<4;j++) { stu+=chungbuk[i][j]; } printf("%d학년 체 수: %d\n”, i+1, stu); } return 0;}

의 로그램은 학년별, 반별 학생수를 입력받아 2차원배열에 장하고, 그 장된

데이터를 출력하는 로그램이다. 2차원 배열이 장되는 방식은 1차원 배열과 동일하

다. 다만 이를 해석함에 있어 2차원 으로 하고 있을 뿐이다.

다음 그림을 통해 2차원 배열이 메모리 공간 상에서 어떻게 장이 되는지 확인해보자.

Page 79: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 73 -

그림에서 보듯 2차원 배열은 물리 으로도 2차원 형태로 장되지 않는다. 우리가 사

용하고 있는 컴퓨터의 메모리는 2차원 구조가 아닌 1차원 구조로 되어있다. 의

사실을 확인하기 해서는 각 배열의 요소의 주소값을 출력해보면 각 배열 요소의 간격

이 4바이트 단 로 떨어져 있음을 확인할 수 있다.

다. 2차원 배열의 선언과 기화

다음은 2차원 배열을 선언하면서 기화하는 방법을 알아보자.

2차원 배열의 기화 방법은 행단 로 구분할 때 호{ }를 사용한다. 만약 행단 로

구분하는 호가 없다면 이는 1차원 으로 컴 일러가 해석하게 된다. 2차원 배열을

기화하는 방법은 다음과 같이 크게 3가지로 구분된다.

case1. 행단 로 모든 요소들을 기화하는 방법

case2. 행단 로 일부 요소들을 기화하는 방법

csae3. 1차원 배열의 형태로 기화하는 방법

다음 그림은 기화하는 방법을 그림으로 표 한 것읻자. case2처럼 행단 에 일부 요

소만 있다면 왼쪽부터 값을 채우고 나머지는 가로의 값을 기 으로 모두 0을 채운다.

case3처럼 1차원 배열의 형태로 기화 리스트가 선언되면 7번째 요소까지 기화 리스

트 값으로 채우고 나머지 8,. 9번 요소는 0으로 채운다.

case3

Page 80: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 74 -

1차원 배열의 크기가 없다면 배열요소에 의해 컴 일러가 자동으로 채워주지만, 2차원

배열의 1차원 배열과 다르다.

//1차원 배열

//2차원 배열

11. 포인터의 포인터

가. 포인터의 포인터란?

포인터의 포인터란 포인터 변수를 가리키는 다른 포인터 변수를 뜻하는 것으로서

‘이 포인터’ 는‘더블 포인터'라고 부르며 선언 시에는 다음과 같이 *연산자 두

개를 사용한다.

∙int**ptr //int형 더블 포인터

의 그림에서 변수 num은 10을 장하고 있고 변수 num의 주소 값을 참조하기 해

선언된 변수가 포인터 변수 ptr이다. 그러므로 포인터 변수 ptr에는 num의 주소값

0x1000을 장하고 있다. 이 포인터 변수 ptr의 주소 값을 장하기 해 선언된 것이

포인터의 포인터 변수 pptr이고 여기에는 ptr의 주소 0x2000 값이 장되어있다.

그러므로 pptr을 상으로 다음과 같이 정리될 수 있다.

*pptr=0x1000 //*pptr은 포인터 변수 ptr을 의미함

*(*pptr)=10 //*(*pptr)은 변수 num을 의미함

Page 81: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 75 -

나. 포인터 변수 상의 Call-by-reference

다음은 두 싱 포인터 ptr1과 ptr2에 장된 값을 서로 바꿔서 장하는 함수를 정의

하고 이 함수를 호출하여 다음 그림과 같이 싱 포인터가 가리키는 변수 num1과 num2

의 값을 서로 바꾸는 로그램을 작성하려고 한다.

포인터의 포인터 변수를 사용하지 않았을 때 어떤 문제가 있는지 제문제를 통해 알

아보도록 하자.

연습문제

문제 - 싱 포인터에 장된 값을 서로 바꾸는 함수를 호출하여, main 함수 내

싱 포인터가 가리키는 num1, num2의 값을 바꾸고자 하는 로그램(잘못 이해

한 )

결과 -

#include <stdio.h>

void pswap(int *p1, int *p2);

int main( )

{

int num1=10, num2=20;

int *ptr1, *ptr2;

ptr1=&num1, ptr2=&num2;

pswap(ptr1, ptr2);

//함수 호출 후의 값의 변화

printf("*ptr1 : %d \n”,*ptr1);

printf("*ptr2 : %d \n”,*ptr2);

return 0;

}

void pswap(int *p1, int *p2)

{

int *temp;

temp=p1;

p1=p2;

p2=temp;

}

실행결과 함수 pswap은 두 포인터 p1과 p2가 가리키는 상을 변경시키지 못했음을

확인할 수 있다. 따라서 pswap 함수의 정의가 치 못했다고 단 할 수 있다. 의

로그램을 실행하면 p1과 p2에 장된 값이 바 는 것을 확인할 수 있다. 하지만 ptr1

과 ptr2와는 별개의 변수이기 때문에 ptr1은 여 히 num1의 주소 값을, num2는 여 히

num2의 주소값을 장하게 된다. 함수를 호출하면서 인자 달시 ptr1, ptr2의 주소 값

Page 82: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 76 -

을 달하지 않고 단지 ptr1과 ptr2 변수 내에 장된 값을 달했기 때문에

Call-by-value 개념으로 설명될 수 있다.

다음 제를 통해 원하는 결과를 얻을 수 있는지 확인해 보도록 하자.

연습문제

문제 - 싱 포인터에 장된 값을 서로 바꾸는 함수를 호출하여, main함수 내

싱 포인터가 가리키는 num1, num2의 값을 바꾸고자 하는 로그램(바르게 작

성된 )

결과 -

#include <stdio.h>

void pswap(int **p1, int **p2);

int main( )

{

int num1=10, num2=20;

int *ptr1, *ptr2;

ptr1=&num1, ptr2=&num2;

pswap(&ptr1, &ptr2);

//함수 호출 후의 값의 변화

printf("*ptr1 : %d \n”,*ptr1);

printf("*ptr2 : %d \n”,*ptr2);

return 0;

}

void pswap(int **p1, int **p2)

{

int *temp;

temp=*p1;

*p1=*p2;

*p2=temp;

}

의 로그램 실행결과 ptr1과 ptr2의 값이 서로 바 었음을 확인할 수 있다. 함수 호

출시 인자로서 ptr1의 주소 값을 달하므로 호출되는 함수 쪽에서는 주소값을 장하

고 있는 ptr의 주소값을 매개변수로 받아야 하므로 포인터의 포인터(더블 포인터)

**p1, **p2로 선언하고 있다.

Page 83: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 77 -

12. 2차원 배열 이름의 포인터형

가. 1차원 배열이름의 포인터형

1차원 배열이름의 포인터형을 결정짓는 요소는 다음과 같이 정리할 수 있다.

포인터가 가르키는 요소의 자료형

포인터 연산 시 증가하는 바이트의 크기

1차원 배열이름이 가리키는 요소의 자료형만 일치하면 포인터 연산 시 증가하는 값

한 일치함을 알 수 있었다. 한 배열이름을 함수의 인자로 달함에 있어 함수의 매

개변수는 다음과 같이 int형 포인터로 선언되어야 함을 배웠다.

void Arr_array(int *arr){.........}

그러면 2차원 배열은 어떠한가? 1차원 배열과는 많은 차이가 있다. 2차원 배열이름에

는 어떤 특성이 있는지 살펴보자.

나. 2차원 배열이름의 포인터형

2차원 배열이름(다차원 배열이름)의 포인터형을 결정짓는 요소는 1차원 배열이름과 마

찬가지로 다음과 같이 정리할 수 있다.

포인터가 가리키는 요소의 자료형

포인터 연산 시 증가하는 바이트의 크기

1차원 배열이름이 가리키는 요소의 자료형만 일치하면 포인터 연산 시 증가하는 값

한 일치하지만, 2차원 배열이름은 요소의 자료형이 일치하더라도 포인터 연산 시 증

가하는 값의 크기가 다르다. 한 배열이름을 함수의 인자로 달함에 있어 함수의 매

개변수를 어떻게 선언해야 하는지도 궁 하다.

다. 2차원 배열이름의 분석

다음과 같이 선언된 2차원 배열이 있다고 가정해 보자.

int arr[3][2];

그 다면 배열이름 arr이 가리키는 인덱스의 기 으로 arr[0][0]에 치한 첫 번째 요소

이다. 그런데 2차원 배열의 경우 arr[0], arr[1], arr[2]도 의미를 갖는다. 이들은 각각 1행,

2행, 3행의 첫 번째 요소를 가리킨다.

다음 제를 보면서 2차원 배열이름에 해 분석해 보자.

Page 84: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 78 -

연습문제

문제 - 배열이름뿐 아니라 각 행의 배열요소 arr[0],

arr[1], arr[2]의 의미를 알아보는 로그램.

결과 -

#include <stdio.h>

int main( )

{

int arr[3][2]={10,20,30,40,50,60};

printf("arr[0]:%d \n”,arr[0]);

printf("arr[1]:%d \n”,arr[1]);

printf("arr[2]:%d \n”,arr[2]);

printf("arr:%d \n”,arr);

return 0;

}

의 로그램에서 2차원 배열이름 arr은 arr[0], arr[0][0]와 같음을 확인할 수 있다.

한 각 행의 배열요소 arr[0], arr[1], arr[2] 사이에 8byte씩 증가하며, 각 행의 배열요소의

간격은 열의 배열요소에 의해 결정됨을 확인할 수 있다.

2차원 배열이름으로 연산 시 어떻게 되는지 다음 문제를 통해 확인해 보자.

연습문제

문제 - 2차원 배열을 선언하고 기화 후 배

열이름으로 연산했을 때 어떻게 되는지 확인

하는 로그램

결과 -

#include <stdio.h>

int main( )

{

int arr[3][2]={10,20,30,40,50,60};

printf("arr:%d \n”,arr);

printf("arr+1:%d \n”,arr+1);

printf("arr+2:%d \n”,arr+2);

return 0;

}

의 제를 통해 알 수 있는 것은 배열이름으로 연산 시 arr, arr+1, arr+2 사이에는

8바이트씩 증가함을 확인할 수 있다. 앞에서 살펴본 arr[0], arr[1], arr[2]에서도 마찬가지

Page 85: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 79 -

로 8바이트씩 증가하 다. 이는 배열이름으로 증가 연산 시 행단 로 증가함을 확인 할

수 있다. 이는 다음 제를 통해 확인할 수 있다.

연습문제

문제 - 2차원 배열을 선언하고 기

화 후 배열이름으로 연산했을 때 어

떻게 되는지 확인하는 로그램

결과 -

#include <stdio.h>

int main()

{

int arr1[3][2];

printf("arr1 : %d \n”,arr1);

printf("arr1+1 : %d \n”,arr1+1);

printf("arr1+2 : %d \n”,arr1+2);

return 0;

}

연습문제

문제 - 2차원 배열을 선언하고 기

화 후 배열이름으로 연산했을 때 어

떻게 되는지 확인하는 로그램

결과 -

#include <stdio.h>

int main()

{

int arr2[2][3];

printf("arr2 : %d \n”,arr2);

printf("arr2+1 : %d \n”,arr2+1);

printf("arr2+2 : %d \n”,arr2+2);

return 0;

}

의 제에서 arr1, arr+1, arr+2의 연산 시 8바이트씩 증가하며, arr2, arr2+1, arr+2는

연산 시 12바이트씩 증가함을 확인할 수 있다. 이는 2차원 배열이름의 연산 시 열(가로)

의 요소에 의해 결정됨을 알 수 있다.

다. 2차원 배열이름의 포인터 타입

그 다면 2차원 배열이름의 포인터 형은 어떻게 결정해야 하는가? 2차원 배열이름의

포인터 형에는 다음 두가지 정보가 담겨야 한다.

가리키는 상이 무엇인가?(배열 요소의 자료형)

배열이름(포인터)를 상으로 값을 1 증가 감소 시켰을 때 실제로는 얼마가 증가

감소 하는가?

따라서 다음 배열이름의 포인터 형을 묻는다면, 다음과 같이 답변해야 한다.

int pArr[2][4];

그러면 “배열이름 pArr이 가리키는 상은 int형 변수이고, pArr의 값을 1 증가하면

sizeof(int)×4의 크기만큼 주소 값이 증가하는 포인터형이다.”라는 2차원 배열이름의 포

인터 변수는 다음과 같이 선언한다.

그러면 함수 호출 시 2차원 배열이름을 인자로 달할 때 매개변수를 선언함에 있어

어떻게 해야 하는지 다음 제를 통해 알아보자

Page 86: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 80 -

연습문제

문제 - 2차원 배열에 근하여 각 배열의 요소를 출력하는 함수를 호출함에 있

어 2차원 배열이름을 인자로 달할 때 매개변수를 어떻게 선언해야 하는지 확

인하는 로그램

결과 -

#include <stdio.h> void show_data(int (*ptr)[3], int a);\ int main() { int arr1[2][3]={1,2,3,4,5,6}; int arr2[3][3]={{1},{2},{3}}; show_data(arr1,2); show_data(arr2,3); return 0; } void show_data(int (*ptr)[3], int a) { int i,j; for(i=0;i<a;i++) { for(j=0;j<3;j++) printf("%3d ",ptr[i][j]); printf("\n”); } }

2차원 배열의 포인터형 선언은 int *ptr[3]으로 하고 있다. 이는 “배열이름 ptr이 가리

키는 상이 int형 변수이고 ptr의 값을 1 증가시키면 sizeof(int)×4의 크기만큼 증가하는

포인터이다”라고 해석하면 된다.

13. 문자 단 입·출력 함수

가. 스트림과 데이터의 송

데이터의 입력과 출력은 로그램의 흐름을 뜻한다. 입력은 로그램 안으로 데이터가

흘러 들어오는 것이고, 출력은 로그램 밖으로 데이터가 흘러나가는 것이다. 가장 표

인 입력장치로는 키보드와 일이 있고, 출력장치로는 모니터와 일이 있다. 로그

램 상에서 모니터와 키보드, 일을 상으로 데이터를 입출력하기 해서는 이들을 연

결시켜주는 데이터의 이동통로가 필요한 데, 이 통로 역할을 하는 매개체를 가리켜

‘스트림(stream)'이라 한다.

Page 87: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 81 -

의 그림을 보면 실행 인 로그램과 키보드를 연결해주는‘입력스트림’이라는

데이터의 이동통로가 있고, 실행 인 로그램과 모니터를 연결해주는‘출력스트림’이

라는 이동통로가 있다. 이는 운 체제에서 제공하는 소 웨어 인 가상의 이동통로로,

운 체제에서 외부통로와 로그램과 송수신의 도구가 되는‘스트림’을 제공하고 있다.

일반 으로‘콘솔’이라함은 키보드와 모니터를 의미하며, 우리가 콘솔과의 입출력과

일과의 입출력을 해 스트림을 구성하는데는 약간의 차이가 있다. 일과 입출력 스

트림을 생성할 때에는 우리가 직 요구해야 하지만, 콘솔과의 입출력 스트림을 생성할

때에는 자동으로 생성된다. 정리하면 “콘솔과의 입출력 스트림”은 로그램이 실행되면

자동으로 생성되고, 로그램이 종료되면 자동으로 소멸된다. 이 둘은 기본 으로 제공

되는‘표 스트림(standard stream)’이라 하며, 여기에는‘표 입출력 스트림’외에

‘표 에러스트림’도 존재한다. 표 스트림은 다음과 같이 이름을 붙여 다.

여기에서 stderr는‘표 에러 스트림’으로 모니터로 출력이 이 짐은‘표 출력 스

트림’과 같지만‘입출력 리다이 션’이라는 부분으로 출력 상을 변경시킬 있다는 측

면에선 stdout과 차이가 있다.

나. 문자 단 입출력 함수

모니터로 하나의 문자를 출력할 때 사용하는 입출력 함수는 다음과 같이 정리 할 수

있다.

출력함수

Page 88: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 82 -

입력함수

출력 함수에서 putchar 함수는 인자로 달된 문자 정보를 stdout으로 표 되는 표

출력 스트림(모니터)으로 출력하는 함수이고, fputc 함수는 문자를 송할 스트림(모니터

혹은 일)을 지정할 수 있는 함수이다.

입력 함수에서 getchar 함수는 stdin으로 표 되는 표 입력 스트림(키보드)으로부터

하나의 문자를 입력받는 함수라 할 수 있고, fgetc 함수도 하나의 문자를 입력받지만,

getchar 함수와 달리 입력스트림(키보드 혹은 일)을 지정할 수 있다.

지 까지 설명한 입출력 문자 입출력 함수의 동작을 확인하기 해 다음 제를 살펴

보자. 먼 putchar 함수와 fputc 함수에 해 살펴보자.

연습문제

문제 - getchar 함수를 이용해

키보드로부터 문자를 입력받아

putchar 함수로 모니터에 문자를

출력하는 로그램

결과 -

#include <stdio.h>

int main( )

{

char ch=0;

while(ch!='q')

{

ch=getchar( );

putchar(ch);

}

return 0;

}

연습문제

문제 -getchar 함수를 이용해

키보드로부터 문자를 입력받아

putchar 함수로 모니터에 문자를

출력하는 로그램

결과 -

#include <stdio.h>

int main( )

{

char ch=0;

while(ch!=EOF)

{

ch=getchar();

putchar(ch);

}

printf("program을 종료합니다.\n”);

return 0;

}

로그램은 getchar 함수를 이용해 키보드로부터 문자를 입력받아 putchar함수를

이용해 문자를 출력하는 로그램이다. putchar 함수는 출력 상이 stdout 스트림(모니

터)로 지정되 있으며, 로그램은 지정된 문자나 EOF(-1)가 입력될 때 종료된다.

다음은 fgetc 함수와 fgetc 함수의 쓰임을 알아보기 한 로그램이다.

Page 89: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 83 -

연습문제

문제 - fgetc 함수를 이용해

키보드로부터 문자를 입력받아

fputec 함수로 모니터에 문자를

출력하는 로그램

결과 -

#include <stdio.h>

int main( )

{

char ch=0;

while(ch!='q')

{

ch=fgetc(stdin);

fputc(ch,stdout);

}

return 0;

}

연습문제

문제 - fgetc 함수를 이용해

키보드로부터 문자를 입력받아

fputec 함수로 모니터에 문자를

출력하는 로그램

결과 -

#include <stdio.h>

int main( ){ char ch=0; while(ch!=EOF) { ch=fgetc(stdin); fputc(ch,stdout); } printf("program을 종료합니다.\n”); return 0;}

fputc 함수는 출력스트림을 stdout이나 일로 지정할 있으며, 재 stdout으로 출력한다.

14. 문자열 단 입·출력 함수

가. 문자열 출력 함수

printf 함수와 scanf 함수를 이용해도 문자열의 입출력이 가능하다. 그러나 scanf 함수

는 공백이 포함된 문자열을 입력받는 데는 제한이 있다. 이런 면에서 puts와 fputs 함수

는 공백을 포함한 문자열을 입력 받을 수 있다는 에서 차이 이 있다.

puts 함수와 fputs 함수에 해 살펴보면 다음과 같다.

puts 함수는 출력의 상이 stdout(모니터)으로 결정되어 있지만, fputs 함수는 두 번째

인자를 통해서 출력을 상을 결정할 수 있다. 그리고 둘 다 첫 번째 인자로 달되는

주소 값을 문자열로 출력하지만, 출력의 형태에 있어 한 가지 차이 이 있다. 다음 로

그램을 통해 차이 을 확인해 보자.

Page 90: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 84 -

연습문제

문제 - puts 함수와 fputs 함수를 이용하여 stdout(모니터)으로 문자열을 출력할

때, 어떤 차이 이 있는 지 확인할 수 있는 로그램

결과 -

#include <stdio.h>

int main()

{

fputs("fputs test!! ”, stdout);

fputs("Hello! Good morning!!”, stdout);

fputs("\n”,stdout); //한 띄우기

puts("puts test!!”);

puts("It's a beautiful day!!”);

return 0;

}

의 로그램을 통해 알 수 있는 것은 “puts 함수가 호출되면 문자열 출력 후 자동으

로 개행이 이루어지지만, fputs 함수가 호출되면 문자열 출력 후 자동으로 개행이 이루

어지지 않는다.”는 것이다.

나. 문자열 입력 함수

문자열 입력 함수에는 scanf 함수 이외에도 gets, fgets 함수가 있다. gets함수와 fgets

함수 사이에는 어떤 차이가 있는지 다음 표를 통해 알아보자.

gets 함수는 표 입력 스트림(stdin)인 키보드로부터 문자열을 입력받지만, fgets함수는

문자열을 입력받되 입력 스트림(stdin, 일)을 지정할 수 있다. 하지만 미리 마련해 놓은

배열을 넘어서는 길이의 문자열이 입력되면, 할당 받지 않은 메모리 공간을 침범하여

실행 오류가 발생한다는 단 이 있다. 다음 제를 통해 두 함수에 해 좀 더 살펴

보자

Page 91: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 85 -

연습문제

문제 - fgets 함수를 이용하여 stdin(키보드)으로부터 문자열을 입력받아 배열에

장한 후, stdout으로 출력하는 로그램(gets와 어떤 차이가 있는지 확인하기

바람)

결과 -

#include <stdio.h>int main(){ char str[7]; fputs("Input character!! ”, stdout); fgets(str,sizeof(str),stdin); fputs("Inputed character!!”,stdout); fputs(str,stdout); return 0;}

의 로그램은 fgets 함수를 이용하여 키보드로부터 문자를 입력받아 문자열 배열

str에 장한다. 문자열의 길이는 7로 입력된 문자열 (null) 문자를 포함하여 6자를

배열에 입력하므로 It's a 까지 입력된다.

다음은 gets 함수를 이용하여 문자열을 입력받아 출력하는 로그램을 살펴보자.

연습문제

문제 - gets 함수를 이용하여 stdin(키보드)으로부터 문자열을 입력받아 배열에

장한 후, stdout으로 출력하는 로그램(fgets와 어떤 차이가 있는지 확인하기

바람)

결과 -

#include <stdio.h>

int main()

{

char str[7];

fputs("Input character!! ”, stdout);

gets(str);

fputs("Inputed character!!”,stdout);

fputs(str,stdout);

return 0;

}

gets 함수는 fgets 함수와 마찬가지로 키보드로부터 문자열을 입력받아 배열에 장하

지만, 배열의 길이 7과는 무 하게 입력된 모든 문자를 출력한다. 이러한 이유는 입력버

퍼에 데이터가 장되어 있기 때문이며, 이러한 문제를 해결하기 해서는 gets 신

fgets 함수를 사용하는 것이 더 바람직하다.

Page 92: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 86 -

15. 문자열 조작 함수

가. 표 입출력 기반의 버퍼

printf와 scanf, fputs, fgets는 모두 표 입·출력함수이다. 이러한 표 입출력 함수

를 통해서 데이터를 입출력 하는 경우, 해당 데이터들은 운 체제가 제공하는‘메모리

버퍼’를 간에 통과하게 된다. 여기서 말하는‘메모리 버퍼’라 함은 데이터를 임시

로 모아두는 공간을 말한다. 이를 그림을 나타내었다.

키보드로 문자열을 입력했을 때 문자열이 입력버퍼로 들어가는 시 은 엔터키가 리

는 시 이다. 그러면 데이터를 목 지로 바로 송하지 않고 입출력 버퍼를 두는 이유

는‘데이터 송의 효율성’과 련이 있다. 키보드를 를 때마다 정보를 목 지로 바

로 송하게 되면 mutitasking을 하는 CPU는 부하율이 증가하고 효율성이 떨어질 것이

다. 우체국에서 우편물이 있을 때마다 배송하는 것이 아니라, 모아두었다가 배송하는 원

리와 같은 개념으로 이해해야 할 것이다. 이러한 이유로 메모리 버퍼를 두어 데이터를

한데 묶어서 송시키고 있다.

나. 입출력 버퍼를 비우는 fflush 함수

fflush 함수는 인자로 달된 스트림의 버퍼를 비우는 기능을 제공한다. 따라서 다음과

같이 함수를 호출하면,

fflush(stdout) //표 출력버퍼를 비움

버퍼에 장된 내용이 비워지면서 데이터가 목 지로 이동한다. 이 함수는 표 출력

스트림(stdout) 뿐 아니라 일을 상으로도 가능하다.

그럼 입력버퍼의 비움은 어떻게 해야 하는가?

fflush(stdin) //표 출력버퍼를 비움

의 함수 선언은 시스템(Windows 계열의 컴 일러는 지워짐)에 따라 지워지기도하고

그 지 않기도 하다. 다음 제에서 입력버퍼를 지우지 않았을 때 어떤 문제가 있는지

확인해 보자.

Page 93: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 87 -

연습문제

문제 - fgets 함수를 이용하여 stdin(키보드)으로부터 문자열을 입력받아 배열에

장했을 때, 입력버퍼를 통과하면서 입력버퍼에 원하지 않는 데이터가 남아 있

다. 이를 확인하는 로그램.

결과 -

#include <stdio.h>

int main( )

{

char ID[7];

char passwd[4];

fputs("ID를 입력하세요 : ”,stdout);

fgets(ID,sizeof(ID),stdin);

//fflush(stdin);//입력 버퍼를 지움

fputs("패스워드 입력 : ”,stdout);

fgets(passwd, sizeof(passwd), stdin);

printf("ID : %s \n”,ID);

printf("passwd : %s \n”,passwd);

return 0;

}

의 함수에서 배열 ID의 길이 7을 고려하여‘123456’의 6문자를 입력했는데도 문제

가 발생하 다. 이름을 입력할 기회도 없이 출력이 되었다. 키보드로 6개의 문자를 입력

하고 키보드를 르는 순간 입력버퍼에는‘123456\n’문자가 장된다. 주의할 은 키

보드 엔터‘\n'까지 읽 진다는 이다. 첫 번째 fgets의 호출에 의해 6개의 문자가 읽

지고 입력버퍼에는‘\n' 문자만 남게된다. 이후 두 번째 패스워드를 입력하기 한 fgets

의 호출 시에는‘\n' 문자가 입력되므로 와 같은 결과가 실행된다. 의 문제를 해결

하기 해 주석처리 된 fflush(stdin) 함수를 실행시키면 의 문제를 해결할 수 있다.

다. 문자열 조작 함수의 종류

문자열과 련된 함수는 다양하다. 어떤 함수들이 있는지 살펴보자.

1) 문자 출력 함수

Page 94: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 88 -

2) 문자열을 추가하는 함수

3) 문자열을 비교하는 함수

4) 문자열을 숫자로 변환하는 함수

5) ·소문자의 변환을 처리하는 함수

와 련된 로그래 문제는 실 문제풀이에서 확인하도록 하자.

16. 구조체의 정의와 근

가. 구조체의 정의

구조체(structure)는 하나 이상의 변수를 묶어서 새로운 자료형을 정의하는 도구이다.

즉, 구조체를 기반으로 우리는 새로운 자료형을 정의할 수 있다. 이러한 구조체는 여러

개의 변수 값을 동시에 변경할 때 유리하며, 이 게 하면 데이터의 표 과 리가 용이

해진다.

이러한 이유로 등장한 것이 구조체이며, 구조체는 다음과 같은 형태로 정의한다.

Page 95: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 89 -

struct number { //number라는 이름의 구조체 선언

int a; // 구조체 멤버 int a

int b; // 구조체 멤버 int b

};

이 때 number라는 이름이 int나 double과 같은 자료형의 이름이 되는 것이다. 차이

은 int나 double은 기본자료형이고, number는 사용자가 정의한 자료형인 것이다. 그래서

이를 가리켜‘사용자 정의 자료형’이라 한다.

구조체 정의에 해 다른 와 그림을 살펴보자.

나. 구조체의 변수의 선언과 근

다음 그림은 number라는 이름의 구조체를 정의하고 있다. int형 변수 2개가 포함된

‘사용자 정의 자료형’구조체 이다. 이 게 되면 이 자료형을 상으로 변수를 선언할

수 있다. 그리고 이 게 선언된 변수를 가리켜‘구조체 변수’라고 한다.

struct number{

int a;

int b;

};

int main( )

{

struct number s1, s2, s3;

........

return 0;

}

구조체 변수를 선언할 때에는 맨앞에 구조체를 의미하는‘struct' 선언을 추가해야 하

며, 구조체 이름, 변수명 순 로 문장을 구성한다. 다음 문장을 살펴보자.

struct number s1, s2, s3; //s1, s2, s3라는 구조체 변수 선언

와 같이 구조체 변수를 선언하면, 아래 그림과 같이 구조체 변수 s1, s2, s3의 멤버

int a, int b가 존재한다.

그리고 구조체 변수의 멤버에 근하기 해서는 다음과 같은 문장을 구성해야 한다.

구조체 변수의 이름(s1).구조체 멤버의 이름(a); //s1.a, s1.b, s2.b ...

다음 로그램을 통해 구조체 변수의 선언하고 기화 방법에 해 알아보자.

Page 96: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 90 -

연습문제

문제 - 구조체를 정의, 구조체 변수의 선언 후에 구조체 변수의 멤버에 근해

서 정수 값을 장하고 그 멤버의 값을 모두 더하는 로그램

결과 -

#include <stdio.h>

struct number{

int a;

int b;

};

int main( )

{

struct number s1,s2;

int sum;

fputs("첫번째 number 값을 입력 : ”,stdout);

scanf("%d %d”,&s1.a, &s1.b);

fputs("두번째 number 값을 입력 : ”,stdout);

scanf("%d %d”,&s2.a, &s2.b);

/*입력 된 모든 값의 합 */

sum=s1.a+s1.b+s2.a+s2.b;

printf("모든 수의 합은 : %d”,sum);

return 0;

}

의 로그램에서 먼 , number라는 구조체를 정의하 고 그 멤버는 int a와 int b로

구성되어 있다. 그리고 main 함수 내에서 구조체 변수 s1과 s2를 선언하고, 각각의 멤버

s1.a, s1.b, s2.a, s2.b는 scanf 함수로 정수를 입력받아 장한 후 그 값들을 모두 더하여

출력하고 있다.

다. 구조체 배열의 선언과 근

여러 개의 int형 변수를 선언할 때 int형 배열을 선언하듯 다수의 구조체 변수를 선언

할 때에는 구조체 배열을 사용한다. 구조체 배열의 선언은 일반 인 배열의 선언과 동

일하며, 다음은 구조체 선언방법과 구조에 해 나타낸 것이다.

struct number { //number라는 이름의 구조체 선언

int a; // 구조체 멤버 int a

int b; // 구조체 멤버 int b

};

struct number arr[5]; //구조체 배열의 선언

Page 97: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 91 -

a rr [0 ]

a r r [0 ] .a

a r r [0 ] .b

a rr [1 ]

a r r [1 ] .a

a rr [1 ] .b

a rr [2 ]

a rr [2 ] .a

a r r [2 ] .b

a rr [3 ]

a r r [3 ] .a

a r r [3 ] .b

a rr [4 ]

a r r [4 ] .a

a rr [4 ] .b

한 구조체의 멤버로 배열이 존재할 때에도 다음과 같이 표 한다.

struct student{ char name[20]; char stud_id[20]; int age;};int main ( ){ struct student y={“Hong gil dong”, “140321”,15}; //구조체 배열의 선언과 기화 …… return 0;}

구조체 변수를 선언과 동시에 기화 할 때에는 호를 사용하고, 배열의 요소에 문

자열을 장할 경우 “ ”를 이용하면 된다.

구조체 배열과 련된 문제는 실 문제에서 다루기로 하자.

17. 구조체의 배열과 포인터

가. 구조체 배열의 선언과 기화

구조체 배열을 선언하고 기화 하는 방법은 앞장에서 다루어 보았다. 구조체 배열을

선언하면 다음과 같은 구조가 된다.

struct student{ char name[20]; char stud_id[20]; int age;};int main ( ){ struct student sArr[10]; …… return 0;}

Page 98: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 92 -

와 같이 구조체 배열을 선언하면 name, stu_id, age라는 멤버로 구성되는 배열의 요

소가 10개 생성이 된다. 구조체 배열에서는 1차원 배열을 선언하 어도 구조상 2차원배

열의 형태로 개됨을 볼 수 있다.

나. 구조체 배열 요소의 근

다음은 구조체 배열요소에 근하는 를 보여주고 있다.

sArr[2].age=15;

strcpy(sArr[2].name, “Hong gil dong”);

strcpy(sArr[2].stud_id, “140321”);

sArr[2].age=15;는 구조체 배열 sArr의 2번 인덱스 요소의 age라는 멤버에 15라는 값을

장하라는 의미이며, strcpy(sArr[2].name, “Hong gil dong”);은 Hong gil dong이라는 문

자열을 sArr의 2번 인덱스 요소의 name이라는 멤버에 복사하라는 의미이다.

strcpy(sArr[2].stud_id,“140321”); 한 같은 의미로 해석하면 다음 그림과 같이 배열에

장이 된다.

그럼 다음 제를 통해 구조체 배열을 이용하는 방법을 알아보자.

Page 99: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 93 -

연습문제

문제 - 구조체 배열을 선언하고 각 배열요소에 데이터를 입력받아 장한 후 각

배열 요소에 근해서 값을 출력하는 로그램.

결과 -

#include <stdio.h>

struct student{

char name[20];

char stud_id[20];

int age;

};

int main ( )

{

struct student sArr[3];

int i;

for(i=0;i<3;i++) //data 입력

{

printf("학생의 이름, 학번, 나이 순으로 입력 : ”);

scanf("%s %s %d”,sArr[i].name, sArr[i].stud_id, &sArr[i].age);

}

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

{

printf("학생의 이름 : %s, ”,sArr[i].name);

printf("학번 : %s, ”,sArr[i].stud_id);

printf("나이 : %d \n”, sArr[i].age);

}

return 0;

}

의 로그램은 배열을 name, stud_id, age를 멤버로 갖는 구조체를 정의하고 배열의

요소가 3개인 sArr이라는 구조체 배열을 선언하고 있다. scanf를 이용하여 데이터를 입

력받아 배열의 각 요소에 장한 후, for문을 이용하여 차례 로 출력하고 있다. scanf로

입력받을 때에는 공백문자가 입력요소의 구분이 되기 때문에 주의하여야 한다.

다. 구조체 변수와 포인터

구조체 포인터 변수의 선언 연산의 방법도 아래와 같이 일반 인 포인터 변수의

선언 연산의 방법과 다르지 않다.

Page 100: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 94 -

연습문제

문제 - 구조체 포인터 변수를 선언하고 포인터을 이용하여 배열의 요소에 근

하여 장된 값을 출력한는 로그램

결과 -

#include <stdio.h>

struct student{

char name[20];

char stud_id[20];

};

int main()

{

struct student cb={"Hong”,"123456”}; //name, stud_id를 각각 기화

struct student *pCb=&cb; //포인터 변수 pCb가 구조체 변수 cb를 가리킴

//구조체 변수를 이용한 출력

printf("name : %s\n”,cb.name);

printf("stud_id : %s \n”,cb.stud_id); //구조체 포인터를 이용한 출력1

printf("name : %s\n”,(*pCb).name);

printf("stud_id : %s\n”,(*pCb).stud_id); //구조체 포인터를 이용한 출력2

printf("name : %s\n”,pCb->name);

printf("stud_id : %s\n”,pCb->stud_id);

return 0;

}

구조체 변수 pCb를 이용하여 구조체 변수 cb에 근할 수 있다. (*pCb).name와

pCb->name는 같은 표 으로 pCb->name를 더 많이 사용한다.

18. 구조체의 활용

가. 포인터 변수를 구조체의 멤버로 선언

배열이 구조체의 멤버로 선언될 수 있듯이, 포인터 변수도 구조체의 멤버가 될 수 있

다. 다음 제를 살펴보자.

Page 101: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 95 -

연습문제

문제 - 구조체 포인터 변수를 이용해 자신의 구조체를 멤버로 포함시킨 로그

결과 -

#include <stdio.h>

struct student{

char name[20];

char stud_id[20];

struct student *friend; //구조체 student의 포인터 변수 선언

};

int main()

{

struct student s1={"Hong”,"123456”};

struct student s2={"Kim”,"234567”};

s1.friend=&s2;

printf("Hong gil dong \n”);

printf("name : %s\n”,s1.name);

printf("stud_id : %s\n”,s1.stud_id);

printf("Hong's friend\n”);

printf("name : %s\n”,s1.friend->name);

printf("stud_id : %s\n”,s1.friend->stud_id);

return 0;

}

s1

n am e= "H o n g "

s tu d _ id = "1 2 3 4 5 6 "

* fr ie n d

s2

n am e= "K im "

s tu d _ id = "2 3 4 5 6 7 "

의 로그램은 "구조체의 멤버로 포인터 변수를 둘 수 있다”는 것을 증명하고 있다.

s1.friend->name은 (*(s1.friend)).name과 같은 문장으로 "Kim”을 가리킨다.

s1.friend->stud_id는 (*(s1.friend)).stud_id와 같은 문장으로 "234567”을 가리킨다.

나. 구조체 변수와 주소 값과의 계

구조체 변수의 주소 값은 구조체 변수의 첫 번째 멤버의 주소 값과 동일하다. 이것을

다음 로그램을 통해 확인해 보자.

Page 102: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 96 -

연습문제

문제 - 구조체 변수의 주소값과 구조체 변수의 첫 번째 멤버 주소 값과의

계를 확인하는 로그램

결과 -

#include <stdio.h>

struct number{

int num1;

int num2;

};

int main()

{

struct number a1={1,2};

printf("a1 address: %d\n”,&a1);

printf("a1.num1 address : %d\n”,&(a1.num1));

return 0;

}

의 로그램에서 구조체 변수 a1을 선언하고 각 멤버 num1=1, num=2로 기화 하

고 있다. 구조체 변수의 주소 a1은 첫 번째 멤버인 num1의 주소 값과 일치함을 확인할

수 있다.

다. 함수로의 구조체 변수 달과 리턴

구조체 변수를 함수의 인자로 달하거나 함수 내에서 return문을 통해서 구조체 변수를

반환하는 경우에 발생하는 모든 상은 int형 변수를 인자로 달하거나 int형 변수를 반환

하는 경우에 발생하는 상과 완 히 동일하다.

다음은 구조체 변수를 인자로 달했을 때 이러한 인자를 달받을 수 있도록 구조체

변수가 매개 변수를 선언하고 있다. 그리고 달되는 구조체 변수의 값은 매개변수에

통째로 복사가 된다. 이러한 상을 제를 통해 확인해 보자.

Page 103: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 97 -

연습문제

문제 - 구조체 변수를 함수의 인자로 달했을 때 이러한 인자를 달받을 수

있도록 구조체` 변수를 매개변수로 선언하고, 함수를 실행 후에 이를 반환하는

로그램.

결과 -

#include <stdio.h>

struct number{

int num1;

int num2;

};

void show(struct number aa);

struct number input();

int main()

{

struct number data=input();

show(data);

return 0;

}

void show(struct number aa)

{

printf("num1:%d, num2:%d\n”,aa.num1, aa.num2);

}

struct number input()

{

struct number temp;

scanf("%d %d”,&temp.num1,&temp.num2);

return temp; // temp 값 return시 값에 의한 복사

};

의 로그램은 구조체 변수 data의 멤버 값을 input함수를 호출하여 입력받고 있다.

input함수는 scanf로 정수값을 입력받아 각각의 멤버에 장 후 값을 반환하는 과정에서

temp의 값을 통째로 구조체 변수 data에 복사하고 있다. 이를 show 함수를 통해 모니터

에 출력한다.

다. 구조체를 상으로 하는 연산

기본 자료형을 상으로 하는 연산은 사칙연산, 비교연산 등 다양한 종류의 연산이 가

능하다. 그러나 구조체 변수를 상으로 하는 연산은 제한 인데, 가능한 가장 표 인

연산이 입연산, 주소 값을 반환하는 &연산, 구조체 변수를 크기를 반환하는 sizeof 연

산 등이 있다.

Page 104: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 98 -

19. 일의 개방과 종결

가. 일의 개방(fopen 함수)

로그램상에서 일에 장되어 있는 데이터를 읽어 들이기 해서는 가장 먼 해야

하는 일이 구 한 로그램과 읽어 들일 데이터가 장되어 있는 일 사이에 데이터가

이동할 수 있는 통로를 놓는 일이다.

이러한 통로를 가리켜 “스트림(stream)”이라 하는데 스트림은 앞에서 설명한 바 있다.

스트림(stream)이라는 것은 운 체제에 의해서 소 트웨어 으로 구성된 상태일 뿐 실

제 물리 으로 구성되는 것이 아니다. 이러한 스트림을 형성하기 해서는 다음과 같이

fopen 함수를 호출하여야 한다.

#include <stdio.h>\

FILE *fopen(const char *filename, const char *mode)

//성공 시 해당 일의 일 포인터, 실패 시 NULL 포인터 리턴

함수의 첫 번째 인자로는 스트림을 형성할 일의 이름을, 두 번째 인자로는 형성

할 스트림의 종류에 한 정보를 문자열의 형태로 달한다. 그러면 이 함수는 해당

일과의 스트림을 형성하고 스트림 정보를 FILE 구조체 변수에 담아서 그 변수의 주소

값을 반환한다.

그러면 입력 스트림과 출력 스트림 출력스트림을 생성하는 fopen 함수의 호출문을

살펴보자.

FILE *fp=fopen("test.txt”,"wt”); //출력 스트림의 형성

“ 일 test.txt와 스트림을 형성하되 wt모드로 스트림을 형성해라!

여기에서 'wt 모드스트림‘은 텍스트 스트림을 쓰기 한 출력스트림을 뜻한다.

다음은 입력 스트림을 형성해 보자.

FILE *fp=fopen("test.txt”,"rt”); //입력 스트림의 형성

“ 일 test.txt와 스트림을 형성하되 rt모드로 스트림을 형성해라!

여기에서‘rt 모드 스트림’은 텍스트 데이터를 읽기 한 입력 스트림을 뜻한다.

그리고 fopen 함수의 호출을 통해서 일과의 스트림이 형성되었을 때 우리는‘ 일

이 개방되었다’라고 표 한다. (※fp는 일 test.txt를 지칭하는 포인터)

나. 일의 개방모드(Mode)

fopen 함수의 두 번째 인자로“wt”와 “rt”를 달하여 스트림을 형성하 다. 이를

‘ 일의 개방모드’라 하며‘ 일 근 모드’와‘데이터 입출력 모드’로 구분된다.

Page 105: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 99 -

1) 일 근 모드

모드(mode) 스트림의 성격 일이 존재하지 않을 때

r 읽기 가능 에러

w 쓰기 가능 생성

a 일의 끝에 추가 쓰기 생성

r+ 읽기/쓰기 가능 에러

w+ 읽기/쓰기 가능 생성

a+ 읽기/추가 쓰기 가능 생성

2) 데이터 입출력 모드

모드(mode) 모드의 성격

t(텍스트 모드) ‘\n’은 텍스트 일상에서 ‘\r’ ‘\n’으로 동작한다

b(바이 리 모드) ‘‘\n’은 텍스트 일상에서도 ‘\n’으로 동작한다

의 데이터 입출력 모드를 설명하기 해서는 CR(carriage return, ‘\r')과 LF(line

feed, '\n')개념을 이해해야 하는데 다음은 CR(carriage return)을 설명하는 그림이다.

CR은 재 행의 맨 처음으로 가서 그 행에 다시 출력한다. 그럼 LF를 살펴보자.

LF(line feed)는 바꿈이 커서가 있는 치에서 다음 행 같은 커서 치로 된다.

다. 일의 종결(fclose 함수)

fclose 함수는 fopen 함수의 반 기능을 제공한다. fopen 함수가 스트림을 형성하는

함수라면, fclose 함수는 스트림을 해제하는 함수이다.

#include <stdio.h>

int fclose(FILE *stream)

//오류가 없이 제 로 이 지면 0을 리턴

이 게 개방되었던 일을 닫는 이유는 ‘운 체제가 할당한 자원의 반환’, ‘버퍼링

되었던 데이터의 출력’ 때문이다.

Page 106: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 100 -

연습문제

문제 - fopen함수를 호출하여 a.txt 일을 개방하고, fclose 함수를 호출하여

a.txt 일을 종결하는 로그램

결과 -

#include <stdio.h>

int main()

{

int state;

/* file open */

FILE *file=fopen("a.txt","wt”);

if(file==NULL){

printf("file open error!!\n”);

return 1;

}

/* file close */

state=fclose(file);

if(state!=0){

printf("file close error!!\n”);

return 1;

}

return 0;

}

fopen 함수를 호출하면 로그램과 일 사이에 출력스트림이 형성되고, 일 포인터

fp는 a.txt를 지칭하는 포인터가 된다. 만약 일이 존재하지 않는 다면 “wt” 모드는 새

롭게 a.txt 일을 생성한다. 모든 로그래 작업이 끝나면 fclose 함수를 호출하여

일을 종결시켜 주어야 한다. fclose, 함수의 호출을 통해서 일을 닫아주면 출력버퍼에

장되어 있던 데이터가 일로 이동하면서 출력버퍼는 비워지게 된다.

20. 일의 개방과 종결

가. 일의 입출력 함수

다음은 표 입출력 스트림(콘솔)과 일로부터 데이터를 읽어 들이거나 혹은 일에

출력할 때 사용하는 함수를 비교한 것이다. 일의 입출력 함수(fputc, fgetc, fputs,

fgets, fprintf, fscanf)에 해 로그램을 통해 살펴보자.

Page 107: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 101 -

연습문제

문제 - fopen함수를 호출하여 a.txt 일을 개방하고 a.txt 일에 fputc, fputs

함수를 사용하여 데이터를 장하는 로그램.

결과 -

#include <stdio.h>

int main()

{

FILE *file=fopen("a.txt”,"wt”);

if(file==NULL)

{

puts("file open fail!!\n”);

return -1;

}

fputc('a',file);

fputc('b',file);

fputs("Good morning!!\n”,file);

fputs("Welcome!!\n”,file);

fclose(file);

return 0;

}

의 로그램은 fopen 함수를 호출하여 일을 개방하고, a.txt 일 정보를 file 포인

터에 달한다. fputc 함수를 사용하여 문자를 file포인터가 가리키는 일 a.txt에 장

한다. 한 fputs 함수를 사용하여 문자열 한 a.txt에 장하고 fclose 함수를 사용하여

일을 종결한다.

다음 제는 fgets 함수를 이용하여 입력스트림(stdin)으로부터 입력받아 ch에 장한

후 출력하고, 한 일로부터 데이터를 입력받아 모니터에 출력하는 로그램이다.

Page 108: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 102 -

연습문제

문제 - fopen함수를 호출하여 a.txt 일을 개방하고 fgets 함수를 사용하여 데

이터를 키보드와 일로부터 입력받아 모니터로 출력하는 하는 로그램.

결과 -

#include <stdio.h>

int main()

{

int state;

char ch[100];

/* 일의 개방 */

FILE *file=fopen("a.txt”,"rt”);

if(file==NULL){

printf("file open error!\n”);

return 1;

}

/* fgets 함수의 이용 */

fputs("데이터를 입력하세요!\n”,stdout);

fgets(ch,sizeof(ch),stdin);

puts(ch);

/* fgets 함수의 이용1 */

fgets(ch,sizeof(ch),file);

puts(ch);

/* 일의 종결 */

state=fclose(file);

if(state!=0){

printf("file close error!\n”);

return 1;

}

return 0;

}

의 로그램에서 fgets(ch,sizeof(ch),stdin);은 표 입력 스트림(키보드)로부터 데이터

를 입력받아 문자열 배열 ch에 장하는 함수이다. 한 fgets(ch,sizeof(ch),file);은 file로

부터 데이터를 입력받아 ch에 장하는 함수로써, fgets는 입력스트림을 일이나 혹은

콘솔로 지정할 수 있다.

fprintf와 fscanf 함수는 printf, scanf 함수와 달리 콘솔이 아닌 일을 상으로 입출

력이 이루어진다. 다음 제는 텍스트 데이터인 이름과 학번 나이를 scanf로 입력받아

일에 장하는 로그램을 살펴보자.

Page 109: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 103 -

연습문제

문제 - fprintf 함수를 이용하여 데이터를 일포인터가 지정하는 일에 데이터

를 출력하는 로그램

결과 - //입력데이터

//출력데이터

#include <stdio.h>

int main()

{

char name[20];

char stud_id[20];

int age;

FILE *file=fopen("a.txt”,"wt”);

int i;

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

{

printf("이름 학번 나이 순으로 입력하세요 : ”);

scanf("%s %s %d”, name, stud_id, &age);

getchar();

fprintf(file,"%s %s %d”, name, stud_id, age);

}

fclose(file);

return 0;

}

의 로그램에서 fprintf 함수는 printf 함수와 마찬가지로 문자열을 구성하여 출력하

는 함수이다. 따라서 텍스트모드로 개방해야 한다. 그리고 scanf 함수는 엔터 키의 입력

을 읽어 들이지 않고 입력버퍼에 남겨둔다. 따라서 입력버퍼에 남아있는 엔터 키의 소

멸을 해서 getchar 함수를 호출하고 있다.

Page 110: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고
Page 111: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 105 -

리눅스 C언어의 이해(고급)

Page 112: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고
Page 113: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 107 -

리 스 C언어의 이해(고 )

1. 정보올림피아드와 자동채 시스템

가. 정보올림피아드 회

한국정보올림피아드(Korea Olympiad in Informatics)는 지역 회(시·도)에서 추천된 학

생들이 주어진 문제해결 능력을 겨루는 경시 회와 학생이 스스로 개발한 S/W의 작품성

을 평가하는 공모 회로 진행이 된다. 특히, 경시 회는 수학 지식과 논리 사고능력

을 필요로 하는 알고리즘과 로그램 작성 능력을 평가하는 회다.

나. 정 보올림피아드 문제 형식

①‘이야기’식의 문제가 제시된다.

② 주어진 입력값에 해서 올바른 결과값을 출력해야 한다(정확성).

③ 아무리 올바른 결과값이라도 제한 시간 내에 출력하지 않으면 오답처리된다(시간효

율성).

④ 작성한 로그램은 반드시 주어진 데이터를 input.txt로부터 입력받아, 결과값을

output.txt로 출력해야 한다. 즉, 표 입출력이 아닌‘ 일 입출력’을 해야 한다.

⑤ 입력값은 문제에 제시된 범 내에서 어떤 값도 입력될 수 있으며, 주어진 입력값

에 해서 올바른 결과값을 출력해야 한다. 특히, 입력값의 범 가 매우 크거나 처

리해야할 데이터가 많은 경우, 시간 효율 인 알고리즘을 용하지 않으면 제한 시

간 내에 올바른 값을 출력할 수 없다.

⑥ 입력과 출력은 문제에서 제시된 형식을 그 로 따라야 합니다. 임의로 변경하면 0

처리됨을 유념해야 한다. 따라서 문제에 있는‘입력과 출력의 ’를 꼭 확인해

야 한다. 여기서 제시된 입력값과 출력값은 그냥‘ 시’일 뿐이다.

실 문제

다음은 C 언어에 한 설명이다. 올바른 것은? 정답 : 1

① stdio.h 헤더 일은 scanf 함수나 printf 함수를 사용하기 해 반드시 포함해야

한다.

② 하나의 소스 일에는 하나의 헤더 일만을 포함할 수 있다.

③ 헤더 일은 main 함수 내에 선언되어야 한다.

④ 컴 일할 때 헤더 일의 내용은 소스 일에 포함되지 않는다.

⑤ 블록 단 주석은 첩할 수 있다.

Page 114: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 108 -

실 문제

정보올림피아드 문제 형식에 한 설명으로 바르지 못한 것은? 정답 : 3

①‘이야기’식의 문제가 제시된다.

② 주어진 입력값에 해서 올바른 결과값을 출력해야 한다.

③ 올바른 결과값을 출력하면 제한 시간을 과해도 정답처리 된다.

④ 작성한 로그램은 반드시 주어진 데이터를 input.txt로부터 입력받아, 결과값을

output.txt로 출력해야 한다.

⑤ 입력과 출력은 문제에서 제시된 형식을 그 로 따라야 한다.

정리학습

정보올림피아드 회

국내 최고의 IT 재들이 참가하는 국내 최고의 권 있는 회

경시 회 /공모 회 운

리 스 C언어와 알고리즘은 경시 회와 련됨

경시 회의 공식 언어는 리 스 C언어임

Page 115: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 109 -

2. 기 문제풀이 1 : 고장난 체 계

정보올림피아드 문제라고 해서 항상 어렵게 출제되는 것은 아니다. 기 인 연산자,

즉, +, -, *, /, % 연산자만으로도 해결할 수 있는 문제가 등부에서는 간혹 출제된다.

다음의 문제를 살펴보자

기 문제

00a28고장난 체 계

10kg이 항상 더 나가는 고장난 체 계로 잰 몸무게가 정수로 주어질 때 몸무게를 정확

히 다시 계산하는 로그램을 작성하시오.

로그램의 이름은 BB로 하고 실행시간은 0.5 를 넘을 수 없다.부분 수는 없다.

입력 형식

입력 일의 이름은 INPUT.TXT로 한다.입력 일은 한 개의 로 이루어진다.첫 번째

에 고장난 체 계로 잰 몸무게가 정수로 주어진다.몸무게의 범 는 30~150이다.

출력 형식

출력 일의 이름은 OUTPUT.TXT로 한다.첫 번째 에 다시 계산한 정확한 몸무게를

정수로 출력한다.

입력과 출력의

입력(INPUT.TXT)

62

출력(OUTPUT.TXT)

52

로그래 소스

1. //첫번째 로그램2. #include<stdio.h>3.

4. intmain()5. {6. inta,b;7. freopen("input.txt","r",stdin);8. freopen("output.txt","w",stdout);9.

10. scanf("%d",&a);11. b=a-10;//고장난 체 계로 측정한 몸무게에서 10을 뺄셈한다.12. printf("%d",b);13.

14. return0;15.}

Page 116: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 110 -

실 문제

다음 로그램의 출력 결과로 올바른 것은?정답 :②

#include<stdio.h>

intmain(void)

{

intnum1=2,num2=4,num3=6;

num1+=3;

num2*=5;

num3%=6;

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

return0;

}

① 5161 ② 5200 ③ 5182 ④ 4201 ⑤ 5214

이 문제는 (뺄셈) 연산자만 알면 쉽게 해결할 수 있다. 다만, 정보올림피아드 문제에

서 제시하는 형식을 그 로 따라야 한다. 입력 시에 “입력 : ”이나, 출력 시에 “출력

: ”이라는 단어가 없음에 유념하자!

실 문제

다음 로그램의 출력 결과로 올바른 것은?정답 :①

#include<stdio.h>

intmain(void)

{

intnum1=12;

intnum2=(num1--)+3;

printf("%d%d",num1,num2);

return0;

}

① 1115 ② 1114 ③ 1215 ④ 1214 ⑤ 1116

Page 117: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 111 -

정리학습

사칙연산자

덧셈(+),뺄셈(-),곱셈(*),나눗셈(/)

표 입출력과 일입출력

입력은 키보드,출력은 모니터

일입출력을 한 2가지 방법

1.FILE포인터 선언, 일입출력 함수의 사용

2.freopen()함수를 이용하여 표 입출력을 일입출력으로 변환

Page 118: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 112 -

3. 기 문제풀이 2 : 수학 신동이 되는 마법종이

컴퓨터 내부에서는 문자를 숫자로 표 한다. 특히, 문자의 경우는 ASCII 코드라는

0~127 사이의 숫자로 할당되어 있다. 다음의 char 형 변수의 문자를 장하는 명령문이

다. 이때, 변수 ch에는 65라는 정수가 장되어 있다.

문자열은‘1개 이상의 문자들로 구성된 연속된 문자들의 집합’이다. 문자열은‘연속

된 문자들의 집합’이기 때문에 문자열을 메모리에 장하기 해서는 연속된 메모리

공간에 여러 개의 문자들을 장할 수 있어야 한다. 이것을‘char형 배열’이라고 한다.

문자열의 맨 마지막에는 문자열의 끝을 표시하는 NULL 문자 (‘\0’)가 포함되어 있음

을 유념해야 한다. NULL 문자는 문자열로 인식하게 하는 유일한 표식이다. 따라서

NULL 문자가 없는 문자열은 문자열이 아니다!

기 문제

00a29수학 신동이 되는 마법종이

입력으로 문자열이 주어질 때,문자열 안에 있는 숫자들을 모두 더한 결과를 출력하는

로그램을 작성하시오. 로그램의 이름은 CC로 하고 실행시간은 0.5 를 넘을 수 없

다.부분 수는 없다.

입력 형식

입력 일의 이름은 INPUT.TXT로 한다.입력 일의 첫 번째 에 알 벳과 숫자,그리

고 특수문자 등으로 이루어진 문자열이 주어진다.문자열의 길이는 255를 과하지 않으

며 문자열 속에 포함된 숫자 1개의 범 는 1~9이다.

출력 형식

출력 일의 이름은 OUTPUT.TXT로 한다.첫 번째 에 주어진 문자열에서 숫자를 뽑

아 덧셈한 결과를 출력한다.

입력과 출력의

입력(INPUT.TXT)

ba3dag5nf**7\\6@#1

출력(OUTPUT.TXT)

22

Page 119: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 113 -

로그래 소스

1. #include<stdio.h>

2.

3. intmain()

4. {

5. inti,sum=0;

6. charstr[256];

7.

8. freopen("input.txt","r",stdin);

9. freopen("output.txt","w",stdout);

10.

11. //입력

12. scanf("%s",str);

13. //처리

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

15. {

16. if(str[i]>='0'&&str[i]<='9')

17. {

18. sum+=(str[i]-'0');

19. }

20. }

21. //출력

22. printf("%d",sum);

23.

24. return0;

25.}

6번 라인 : 입력 형식에서 입력으로 주어지는 문자열의 길이는 255를 과하지 않는

다는 명시되어 있으므로, 문자를 포함하여 256 크기의 char 형 배열을

선언하 다.

14번 라인 : for문의 조건식 str[i]!=’\0’ 은 문자열의 끝을 만날때까지 반복함을 의

미한다.

16번 라인 : if문의 조건 str[i]>=’0’ && str[i]<=’9’에서 문자에 해 크기 비교가

가능한 이유는 문자는 아스키 코드라는 숫자로 되어 있기 때문이다. 그

리고 아스키 표 상에서 ‘0’. ‘1’, ‘2’, ... , ‘9’ 의 순서로 코드

값이 부여되어 있기 때문에 아라비아 숫자임을 확인할 수 있다.

18번 라인 : 아라비아 숫자로 확인된 str[i] 값은 문자다. 따라서 이 값을 그 로

하면 아스키 코드값이 됨을 주의해야 한다. 문자인 ‘1’을 숫자 1

로 변환하려면 ‘1’-‘0’을 해야 한다. 왜냐하면 ‘1’은 아스키코드

49이고 ‘0’은 아스키코드 48이기 때문이다.

Page 120: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 114 -

실 문제

다음은 1개의 소문자를 입력받아 문자로 변환하여 출력하는 로그램이다.★에

들어갈 올바른 코드를 고르시오.정답 :⑤

#include<stdio.h>

intmain(){

charch;

scanf("%c",&ch);

printf("%c\n",★ );

return0;

}

① ch+'A'② ch-'A'③ ch+('A'-'a') ④ ch+('a'-'A') ⑤ ch-('a'-'A')

실 문제

다음은 문자열을 거꾸로 뒤집는 로그램이다.★에 공통 으로 들어갈 코드는?

정답 :⑤

intmain(){

inti=0;

chara[]="NET";

charb[4];

while(a[i]!=★){

b[i]=a[2-i];

i++;

}

b[3]=★;

printf('%s는 거꾸로 읽으면 %s입니다.\n',a,b);

return0;

}

① GG ② '0' ③ 'T' ④ 0 ⑤ ‘\0’

정리학습

문자

문자는 ‘아스키 코드’라는 숫자로 구성됨

‘A’는 65,‘a’는 97.따라서,문자는 곧 숫자임

문자열

문자열은 1개 이상의 문자의 집합.문자열 끝에는 문자(‘\0‘)가 포함됨

문자열의 입출력은 %s라는 서식 문자를 사용함

Page 121: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 115 -

4. 기 문제풀이 3 : 객 식 답안 채 하기

배열은 량의 데이터를 장할 수 있는 자료구조다. 즉, 동일한 형식의 데이터를 여

러 개 장할 수 있다. 따라서 배열은 많은 데이터를 빠르게 처리하는 컴퓨터의 문제해

결 방식과 매우 한 련이 있으므로 문제해결에서 많이 활용되고 있다. 다음의 문

제 한 배열을 이용하면 쉽게 해결할 수 있다.

기 문제

00a34객 식 답안 채 하기

N개의 문제로 구성된 5지 선다형 객 식 답안을 채 하는 로그램을 작성하시오.각 문제마다

5개의 선택지가 주어지며 학생은 그 에서 정답이라고 생각되는 1개의 선택지만을 선택한다.선

택지의 이름은 1,2,3,4,5다.

로그램의 실행시간은 0.5 를 넘을 수 없다.부분 수는 없다.

입력 형식

입력 일의 이름은 INPUT.TXT로 한다.입력 일의 첫 번째 에 문제의 수 N(0<N<=10000)이

주어지며,다음의 2N개의 에 한 학생의 답안과 정답이 주어진다.처음 N개의 에는 학생의

답안이,그 다음 N개의 에는 정답이 주어진다.단,주어지는 학생의 답안과 정답의 순서는 문

제 순서와 동일하다.

출력 형식

출력 일의 이름은 OUTPUT.TXT로 한다.학생의 주어진 답안에 한 정답 수 C(0<=C<=N)을

출력한다.

입력과 출력의

입력(INPUT.TXT)

3

1

23

1

32

출력(OUTPUT.TXT)

1

이 문제를 해결하기 해서는 배열을 이용해야 한다. 왜냐하면 최소한 N개의 학생 답

안을 배열에 장한 후, 그 이후에 입력되는 정답과 비교해야 하기 때문이다.

Page 122: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 116 -

로그래 소스

1.#include<stdio.h>

2.

3.inta[10000];

4.intb[10000];

5.intmain()

6.{

7. intn,i,sum=0;

8. freopen("input.txt","r",stdin);

9. freopen("output.txt","w",stdout);

10.

11. //입력과정

12. scanf("%d",&n);

13. for(i=0;i<n;i++)

14. {

15. scanf("%d",&a[i]);

16. }

17. for(i=0;i<n;i++)

18. {

19. scanf("%d",&b[i]);

20. }

21.

22. //처리과정

23. for(i=0;i<n;i++)

24. {

25. if(a[i]==b[i])

26. {

27. sum++;

28. }

29. }

30.

31. //출력과정

32. printf("%d",sum);

33. return0;

34.}

13번~16번 라인 : a배열에 학생 답안을 입력하는 과정이다.

117번~20번 라인 : b배열에 정답을 입력하는 과정이다.

125번~29번 라인 : 학생답안 a[i]과 정답 b[i]를 비교해서 일치하는 개수를 카운트 한다.

Page 123: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 117 -

실 문제

다음 배열 기화로 바르지 못한 것은?정답 :③

① intarr[3]={0,1};

② intarr[]={1,2,3};

③ intarr[][]={{1,2,3},{4,5,6}};

④ intarr[2][3]={{1},{4,5,6}};

⑤ intarr[][3]={1,2,3,4};

실 문제

다음 로그램의 ★에 들어갈 올바른 코드는?정답 :②

#include<stdio.h>intmain(void){

intarr[]={1,2,3,4,5,6,7};intarrLen,i;arrLen=★ ;for(i=0;i<arrLen;i++)

printf("%d",arr[i]);printf("\n");return0;

}

<출력 결과>

①sizeof(arr)②sizeof(arr)/sizeof(int)③6 ④sizeof(int)⑤sizeof(int)/sizeof(arr)

정리학습

배열의 특징

량의 데이터를 장하기 한 공간

동일한 데이터형,동일한 이름,메모리의 인 한 공간에 생성

배열의 사용

일반 변수처럼 사용.a[1]=10;//배열1번째 요소에 10을 장하라

각각의 배열 요소는 첨자로 구분.첨자는 항상 0(번째 요소)부터 시작.

Page 124: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 118 -

5. 기 문제풀이 4 : 숙제 안 낸 사람은 구?

배열을 사용하되 배열의 첨자를 효율 으로 사용함으로써 문제를 쉽게 해결하는 방법

에 해서 학습하기 해 다음의 문제를 확인해 보자.

기 문제

00a30숙제 안 낸 사람은 구?

학생들이 제출한 숙제의 출석 번호가 주어질 때 숙제를 내지 않은 학생의 출석 번호를 출력하는

로그램을 작성하시오.

소스 일의 이름은 문제코드와 동일하며 실행시간은 1 를 넘을 수 없다.부분 수는 없다.

입력 형식

입력 일의 이름은 INPUT.TXT로 한다.입력 일은 두 개의 로 이루어진다.첫 번째 에 숙

제를 제출한 학생 수가 주어진다.두 번째 에 숙제를 제출한 학생의 출석 번호가 주어진다.단,

숙제를 제출한 학생의 수는 1이상 35이하이고,출석 번호의 순서는 숙제를 제출한 순서다.

출력 형식

출력 일의 이름은 OUTPUT.TXT로 한다.첫 번째 에 숙제를 내지 않은 학생의 출석 번호를

오름차순으로 출력한다.모든 학생들이 숙제를 제출한 경우에는 0을 출력한다.

입력과 출력의

입력(INPUT.TXT)

10

5312161923212220

출력(OUTPUT.TXT)

247891011131415161718242526272829303132

333435

배열의 첨자를 이용하면 문제를 효율 으로 해결할 수 있다. 즉, 배열에 과제를 제출

한 학생들의 번호를 장하는 것이 아니라 배열의 첨자를 학생들의 번호로 간주하고 해

당하는 첨자(학생 번호) 치에 과제 제출 여부를 장하는 것이다.

Page 125: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 119 -

로그래 소스

1. #include<stdio.h>2. intmain(){3. inthomework[35+1]={0};4. intN;//숙제를 제출한 학생 수5. intno;//학생번호 입력 변수6. inti;7. freopen("input.txt","r",stdin);8. freopen("output.txt","w",stdout);9.

10. //입력11. scanf("%d",&N);12. for(i=1;i<=N;i++){13. scanf("%d",&no);14. homework[no]=1;15. }16. //처리,출력17. if(N==35){18. printf("0");19. return0;20. }21. for(i=1;i<=35;i++){22. if(homework[i]!=1)23. printf("%d",i);24. }25. return0;26.}

3번 라인 : homework 배열은 첨자에 해당하는 출석번호의 학생이 과제를 제출했는

지 여부를 장하는 배열이다. 배열의 첨자를 학생의 출석번호로 사용하

기 때문에 1번 첨자부터 사용해야 한다. 따라서 배열의 크기를 36으로 설

정하고, 0 첨자는 사용하지 않는다.

14번 라인 : 입력받은 학생번호 no은 과제를 제출했음을 표시하기 해

homework[no]=1;을 처리하고 있다.

17번 라인 : 과제를 제출한 학생들의 수가 35면 모두 과제를 제출한 것이므로 0을

출력한다.

21번~24번 라인 : homework[i]에는 출석번호 i번 학생의 과제 제출여부가 0 (제출하

지 않음) 는 1 (제출함)으로 장되어 있으므로 homework[i]!=1인 첨자 i

는 과제를 제출하지 않은 학생번호다. 따라서 1번 첨자부터 35번 첨자까

지 순서 로 homework[i]!=1인 첨자 i를 출력하면 출석번호 순서 로 출

력하는 문제도 자연스럽게 해결된다.

Page 126: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 120 -

실 문제

다음은 ‘숙제 안 낸 사람은 구?’문제를 해결하는 로그램이다.★에 들어갈 올

바른 코드는?정답 :homework[i]!=1

#include<stdio.h>

intmain(){

inthomework[35+1]={0};

intN;//숙제를 제출한 학생 수

intno;//학생번호 입력 변수

inti;

freopen("input.txt","r",stdin);

freopen("output.txt","w",stdout);

//입력

scanf("%d",&N);

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

scanf("%d",&no);

homework[no]=1;

}

//처리,출력

if(N==35){

printf("0");

return0;

}

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

if(★ )

printf("%d",i);

}

return0;

}

Page 127: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 121 -

실 문제

다음 그림처럼 출력되었을 때,★에 들어갈 올바른 코드는?정답 :③

intmain(){

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

inti,j=0;

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

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

}

printf("\n");

return0;

}

① j%5; ② j=5; ③ j%=5; ④ j+5; ⑤ j+=5;

정리학습

배열의 첨자를 ‘묘하게’사용

배열의 첨자는 배열 요소의 치 번호 이상의 의미를 가질 수 있음

배열의 첨자로 0과 자연수 외에 수식, 다른 배열로 체될 수 있음

배열의 첨자를 ‘묘하게’사용하면 문제를 매우 효율 으로 해결할 수 있는

경우가 많음

Page 128: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 122 -

05년 지역본선 등부 2번 문제

05re2곱셈

(세 자리 수)×(세 자리 수)는 다음과 같은 과정을 통하여 이루어진다.

472 ………(1)385 ………(2)2360 ………(3)

3776 ………(4)1416 ………(5)181720 ………(6)

(1)과 (2) 치에 들어갈 세 자리 자연수가 주어질 때 (3),(4),(5),(6) 치에 들어

갈 값을 구하는 로그램을 작성하시오.

실행 일의 이름은 BB.EXE로 하고, 로그램의 실행시간은 1 를 넘을 수 없다.부

분 수는 없다.

입력 형식

입력 일의 이름은 input.txt이다.첫째 에 (1)의 치에 들어갈 세 자리 자연수가,둘째 에

(2)의 치에 들어갈 세 자리 자연수가 주어진다.

출력 형식

출력 일의 이름은 output.txt이다.첫째 에부터 넷째 까지 차례 로 (3),(4),(5),(6)에 들

어갈 값을 출력한다.

6. 기출문제풀이 1 : 곱셈

입력받은 수에 해서 각 자리의 숫자를 하나씩 분리해야 하는 경우가 있다. 만약 세

자리 수가 주어질 때 이 수의 각 자릿수들을 하나씩 분리하는 방법은 다음과 같다.

<방법>

1.b=123;

2.b1=b/100;

3.b2=(b%100)/10;

4.3=b%10

정수=정수/정수 (소수 이하는 자름)

의 방법은 정수 나눗셈과 나머지 연산자를 이용하여 각 자릿수를 분리하는 방법이

다. 우선 100의 자릿수를 분리한다. 이때 정수 나눗셈을 이용한다. 이 게 나온 몫을 뺀

나머지에서 다시 10의 자릿수를 분리한다. 마지막으로 원래의 값에 해서 10으로 나

나머지를 구하면 1의 자릿수를 분리할 수 있다. 이 방법을 이용하여 다음의 문제를 해

결해 보자.

Page 129: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 123 -

입력과 출력의

입력(INPUT.TXT)

472

385

출력(OUTPUT.TXT)

2360

3776

1416

181720

다음은 이 문제를 해결하는 C언어 소스다.

로그래 소스

1.#include<stdio.h>2.#include<stdlib.h>3.

4.intmain()5.{6. inta,b;7. intb1,b2,b3;8. //입력9. freopen("input.txt","r",stdin);10. freopen("output.txt","w",stdout);11. scanf("%d%d",&a,&b);12. //처리13. b1=b/100;14. b2=(b%100)/10;15. b3=b%10;16. //출력17. printf("%d\n",a*b3);18. printf("%d\n",a*b2);19. printf("%d\n",a*b1);20. printf("%d\n",a*b);21. return0;22.}

13번~15번 라인 : <방법 1>을 통해 세자리 수의 각 자릿수를 분리한다. 분리된 각 자

릿수는 b1, b2, b3에 장된다. 즉, b1에는 100의 자릿수가, b2에는

10의 자릿수가, b3에는 1의 자릿수가 장된다.

Page 130: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 124 -

17번~19번 라인 : 각 자릿수를 이용하여 (3), (4), (5)를 구하고, 원래의 값 b와 a를 곱

함으로써 최종 으로 (b)를 구한다.

실 문제

다음은 1부터 100까지의 짝수의 합계를 구하는 로그램이다.★에 들어갈 올바른

코드 라인을 고르시오.정답 :①

#include<stdio.h>intmain(){

int i,sum=0;for(i=1;i<=100;i++){

if(i%2)★ ;sum+=i;

}printf("%d\n",sum);return0;

}① continue ② break ③ gotofor ④ do ⑤ case

실 문제

다음은 입력된 정수의 ‘1의 자리의 수’를 구하는 로그램이다.★에 들어갈 올바른 코드를 고르시오.정답 :②

#include<stdio.h>intmain(){

inta;scanf("%d",&a);printf("%d\n",★ );return0;

}

<출력 화면>

① a/10 ② a%10 ③ (a/10)%10 ④ (a%10)/10 ⑤ (a*10)%10

정리학습

많이 사용되는 연산자들+,-,*,/,% 등이 있다.정수 /정수의 결과는 정수다.

배열의 기화 방법inta[5]={0};과 inta[5]={0,0,0,0,0}과 같다.inta[5]={1};과 inta[5]={1,0,0,0,0}과 같다.

Page 131: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 125 -

7. 기출문제풀이 2 : 홀수

주어진 배열, 는 일련의 입력값들 에서 최솟값, 최댓값을 구하기 해서는 유념해

야 할 사항이 있다. 다음의 코드를 확인해 보자.

<코드 1>

1. //바르지 못한 1

2. #include<stdio.h>

3. intmain()

4. {

5. inta[]={4,1,5,2,3};

6. intmax=0,min=0,i;

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

8. {

9. if(min>a[i])min=a[i];

10. }

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

12. {

13. if(max<a[i])max=a[i];

14. }

15. printf("%d%d",min,max);

16. return0;

17.}

<코드 1>에서 max, min 변수를 0으로 기화하고 있다. 지 과 같이 a 배열에 양수만

있다면, 최종 으로 max 변수에 5가 장되지만, min 변수에는 0이 장되면 최솟값이

올바르지 않다.

<코드 2>

1. //바르지 못한 2

2. #include<stdio.h>

3. intmain()

4. {

5. inta[]={-4,-1,-5,-2,-3};

6. intmax=0,min=0,i;

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

8. {

9. if(min>a[i])min=a[i];

10. }

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

12. {

13. if(max<a[i])max=a[i];

Page 132: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 126 -

14. }

15. printf("%d%d",min,max);

16. return0;

17.}

<코드 2>에서도 역시 max, min 변수를 0으로 기화하고 있다. <코드 2>에서 같이 a

배열에 음수만 있다면, 최종 으로 min 변수에 5가 장되지만, max 변수에 0이 장

되므로 최댓값이 올바르지 않다.

이러한 문제를 해결하기 해서는 max 변수와 min 변수의 기화에 주의해야 한다.

일반 으로 max 변수에는 ‘비교 상이 되는 값들보다 훨씬 작은 값’으로, min 변수

에는 ‘비교 상이 되는 값들보다 훨씬 큰 값’으로 기화한다. 한, 배열의 0번째

요소 값을 기화하는 방법도 있다.

이러한 사항을 유념하면서 다음의 문제를 해결해 보자!

06년 지역본선 등부 1번 문제

입력 (INPUT.TXT)

12

77

38

41

53

92

85

출력 (OUTPUT.TXT)

256

41

06re1홀수

7개의 자연수가 주어질 때,이들 홀수인 자연수들을 모두 골라 그 합을 구하고,

고른 홀수들 최솟값을 찾는 로그램을 작성하시오.

를 들어,7개의 자연수 12,77,38,41,53,92,85가 주어지면 이들 홀수는 77,41,53,85

이므로 그 합은 256가 되고,최솟값은 41이 된다.

실행 일의 이름은 AA.EXE로 하고, 로그램의 실행시간은 1 를 넘을 수 없다.부분 수가

주어질 수 있다.

입력 형식

입력 일의 이름은 INPUT.TXT로 한다.첫째 부터 일곱 번째 까지 한 에 하나의 자연

수가 주어진다.주어지는 자연수는 100보다 작다.

출력 형식

출력 일의 이름은 OUTPUT.TXT로 한다.홀수가 존재하지 않는 경우에는 첫째 에 –1을

출력한다.홀수가 존재하는 경우 첫째 에 홀수들의 합을 출력하고,둘째 에 홀수들 최소

값을 출력한다.

입력과 출력의

Page 133: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 127 -

홀수로 정된 값들 에서 최솟값을 구해야 하는 것이 이 문제의 핵심 요구사항이다.

다음은 이 문제를 해결하는 C언어 소스다.

로그래 소스

1. #include<stdio.h>2. #include<stdlib.h>3.

4. intmain()5. {6. inta;7. intmin=999;8. intsum=0;9. inti;10. //입력,처리11. freopen("input.txt","r",stdin);12. freopen("output.txt","w",stdout);13. for(i=0;i<7;i++)14. {15. scanf("%d",&a);16. if(a%2==1)17. {18. sum+=a;19. if(a<min)20. {21. min=a;22. }23. }24. }25. //출력26. printf("%d\n",sum);27. printf("%d",min);28. return0;29.}

7번 라인 : min 변수를 999로 기화한다. 999로 기화하는 이유는 주어지는 자연수

의 범 가 100보다 작기 때문에 999가 비교 상이 되는 값들 에서 훨

씬 큰 값이기 때문이다. 9999, 99999 등으로 기화할 수도 있다.

16번~23번 라인 : 주어진 7개의 자연수들에 해서 홀수로 정된 값의 합을 구

하고, 최소값을 장하는 min 변수를 갱신하는 과정이다. min 변수

를 999로 기화했기 때문에 맨 처음으로 주어지는 자연수가 min

변수에 장되는 효과가 있게 된다.

Page 134: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 128 -

실 문제

다음은 배열 원소의 최 값을 출력하는 로그램이다.★에 들어갈 올바른 코드는?

정답 :①

#include<stdio.h>

intmain(void){

intnums[6]={2,18,1,27,16};

inti,max=★;

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

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

}

printf("최 값은 %d",max);

return0;

}

① nums[0] ② max ③ 999 ④ nums[6] ⑤ nums[4]

실 문제

다음은 구구단을 출력하는 로그램이다.오른쪽 그림과 같이 단 사이에 한 의

공백라인을 삽입하고자 한다.printf("\n");를 삽입해야 할 치로 당한 것을 고르시

오.정답 :④

#include<stdio.h>

intmain()

{

inti,j;

for(j=1;j<=9;j++){

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

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

}

}

return0;

}

Page 135: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 129 -

정리학습

최댓값과 최솟값을 구하는 변수의 기화

최댓값을 구하는 변수는 가능한 범 의 최솟값으로 기화

최솟값을 구하는 변수는 가능한 범 의 최댓값으로 기화

2차원 배열의 근 처리

첩 for루 를 이용하면 편리함

Page 136: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 130 -

8. 기출문제풀이 3 : 백설공주와 난장이

정렬 알고리즘은 문제를 해결할 때 가장 많이 사용하는 알고리즘 하나다. 그러나,

정렬 알고리즘은 모른다면, 문제 해결을 해 한 안을 찾아야 한다. 정렬 알고리

즘을 알고 있다면 다음의‘백설공주와 난장이’문제는 쉽게 해결할 수 있다. 그 다면

이 문제를 정렬 알고리즘을 모른다고 가정한 채 해결해 보도록 하자.

04년 지역본선 등부 1번 문제

04re1백설공주와 난장이

안개 숲에는 백설공주와 7명의 난장이가 함께 살고 있다.7명의 난장이의 키가 입력으로 주어질

때 이 키가 가장 큰 난장이와 두 번째로 큰 난장이의 키를 출력하는 로그램을 작성하시오.

실행 일의 이름은 AA.EXE로 하고, 로그램의 실행시간은 1 를 넘을 수 없다.부분 수가 주

어질 수 있다.

입력 형식

입력 일의 이름은 INPUT.TXT로 한다.첫 째 부터 일곱 번째 까지 한 에 하나씩 난장이

의 키가 주어진다.주어지는 난장이의 키는 100보다 작은 자연수다.

출력 형식

출력 일의 이름은 OUTPUT.TXT로 한다.첫째 에는 가장 키가 큰 난장이의 키를 출력한다.

둘째 에는 두 번째로 키가 큰 난장이의 키를 출력한다.만약 키가 큰 난장이가 둘 이상이라면

첫째 과 둘째 에 같은 값을 출력해야 한다.

입력과 출력의

입력(INPUT.TXT)

77578872958864

출력(OUTPUT.TXT)9588

키가 가장 큰 난장이의 키는 최 값을 구하는 방식으로 해결할 수 있다. 그러나 두 번

째로 큰 난장이의 키를 구하는 것이 문제다. 정렬 알고리즘을 알고 있다면, 7명의 난장

이의 키를 내림차순으로 정렬하고 두 번째 값을 출력하면 간단히 해결할 수 있다. 정렬

알고리즘을 모른다면 두 번째로 큰 난장이의 키는 다음과 같은 방법으로 해결할 수 있다.

최 값을 찾은 후에 그 최 값을 제외한 키에서 다시 최 값을

찾으면 그것이 ‘두 번째로 큰 키’다.

Page 137: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 131 -

다음은 이 방법으로 해결하는 C언어 소스다. 의 방법이 어떻게 구 되었는지 확인

해 보자.

로그래 소스

1. #include<stdio.h>2. intmain(){3. inth[7];4. intmax[2]={-999,-999};5. inti,j;6. //입력7. freopen("input.txt","r",stdin);8. freopen("output.txt","w",stdout);9. for(i=0;i<7;i++)10. {11. scanf("%d",&h[i]);12. }13. //처리14. for(i=0;i<7;i++)15. {16. if(max[0]<h[i])17. {18. max[0]=h[i];19. j=i;20. }21. }22. for(i=0;i<7;i++)23. {24. if(max[1]<h[i]&&i!=j)25. {26. max[1]=h[i];27. }28. }29. //출력30. printf("%d%d",max[0],max[1]);31. return0;32.}

3번, 4번 라인 : h 배열은 7명의 난장이의 키를 장하고 max배열은 가장 큰 키와

두 번째로 큰 키를 장하기 한 것이다.

14번~21번 라인 : 가장 큰 키를 찾는 과정이다. 단, j 변수에 가장 큰 키가 장된 배

열의 첨자를 장하고 있음을 유념하자!

Page 138: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 132 -

22번~28번 라인 : 두 번째로 큰 키를 찾는 과정이다. 24번 라인에서 i!=j가 && 연산

자로 묶여진 조건식은 가장 큰 키가 장된 첨자 j를 제외한 최 값

을 찾기 함이다.

실 문제

다음은 ‘백설공주와 난장이’문제를 해결하는 로그램의 일부다다.★ 에 들어갈

올바른 코드는?정답 :i!=j

#include<stdio.h>

intmain(){

inth[7];//난장이의 키가 장됨

intmax[2]={-999,-999};

inti,j;

//입력과정 생략 ...

//처리

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

{

if(max[0]<h[i])

{

max[0]=h[i];

j=i;

}

}

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

{

if(max[1]<h[i]&&★ )

{

max[1]=h[i];

}

}

//출력

printf("%d%d",max[0],max[1]);

return0;

}

Page 139: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 133 -

실 문제

다음은 주어진 정수가 소수를 별하는 로그램이다.★ 에 들어갈 올바른 코드

는?정답 :i==N

#include<stdio.h>

intmain()

{

intN =0,i;①

printf("정수 :");

scanf("%d",&N );

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

{

if(N%i==0)break;

}

if(★) printf("소수\n");⑤

else printf("합성수\n");

return0;

}

정리학습

정렬 알고리즘

정렬 알고리즘은 매우 유용

다양한 문제에서 활용하므로 꼭 숙지해야 하지만,만약 모른다면 문제해결의

안을 찾아내야 함

소수

1과 자신만으로 나 어지는 양의 정수

따라서 2부터 자신보다 1작은 값까지 나 어 으로써 소수 여부 정 가능

Page 140: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 134 -

9. 기출문제풀이 4 : 완 제곱수

표 라이 러리 함수는 언어 자체에 기본 으로 내장된 함수로 많은 유용한 기능을

제공한다. 문제를 해결할 때도 이러한 표 라이 러리 함수는 문제 해결의 난이도를 결

정하는 핵심 요소가 될 수 있다. 다음의 문제에서 표 라이 러리 함수의 유용성을 확

인할 수 있다.

06년 지역본선 고등부 1번 문제

06rh1완 제곱수

자연수 M과 N이 주어질 때 M이상 N이하의 자연수 완 제곱수인 것을 모두 골라 그 합을

구하고 그 최소값을 찾는 로그램을 작성하시오.

를 들어 M=60,N=100인 경우 60이상 100이하의 자연수 완 제곱수는 64,81,100

이 게 총 3개가 있으므로 그 합은 245가 되고 이 최소값은 64가 된다.

실행 일의 이름은 SQR.EXE로 하고, 로그램의 실행시간은 1 를 넘을 수 없다.부분 수가 주

어질 수 있다.

입력 형식

입력 일의 이름은 INPUT.TXT로 한다.첫 째 부터 M이,둘째 에 N이 주어진다.M과 N

은 10000이하의 자연수이며 M은 N보다 같거나 작다.

출력 형식

출력 일의 이름은 OUTPUT.TXT로 한다.M이상 N이하의 자연수 완 제곱수인 것을 모두

찾아 첫째 에 그 합을,둘째 에 그 최소값을 출력한다.단,M이상 N이하의 자연수 완

제곱수가 없을 경우는 첫째 에 –1을 출력한다.

입력과 출력의

입력(INPUT.TXT)

60100

출력(OUTPUT.TXT)

24564

완 제곱수란‘정수의 제곱으로 된 수’를 의미한다. 완 제곱수와 유사한 개념으로는

제곱근이 있다. 어떤 수 x를 제곱하여 a가 되었을 때에, x를 a의‘제곱근’이라고 한다.

다음의 sqrt 함수는 C언어에서 제공하는 제곱근을 구하는 함수다.

#include<math.h>

doublesqrt(a)

Page 141: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 135 -

sqrt 함수는 인자로 받은 a의 제곱근을 구하여 double 형으로 반환한다. sqrt 함수를

이용하여 주어진 정수 a가 완 제곱수인지를 확인하려면 다음과 같이 하면 된다.

1. #include<math.h>2.

3. if(7==(int)sqrt(7)*(int)sqrt(7))4. printf("7는 완 제곱수입니다.");5. else6. printf("7는 완 제곱수가 아닙니다.");

sqrt(9)은 3.0이고, sqrt(7)은 2.645751..이고, 이것을 int형으로 강제 형변환하면 3.0은

3으로, 2.645751..은 2로 변환된다. 완 제곱수는 이 게 구한 값을 다시 곱하면 원래의

수가 된다.

다음의 sqrt() 함수를 이용하여 문제를 해결하는 C언어 소스다.

로그래 소스

1. #include<stdio.h>2. #include<math.h>3.

4. intmain()5. {6. intm,n;7. inti;8. intsum=0;9. intmin=99999;10. //입력11. freopen("input.txt","r",stdin);12. freopen("output.txt","w",stdout);13. scanf("%d%d",&m,&n);14. //처리15. for(i=m;i<=n;i++){16. //소숫 이하를 자르는 형변환17. if(i==(int)(sqrt(i)*(int)sqrt(i)))18. {19. sum+=i;20. if(min>i)min=i;21. }22. }23. //출력24. if(sum>0)printf("%d\n%d",sum,min);25. elseprintf("-1");26. return0;27.}

Page 142: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 136 -

15번 ~ 22번 라인 : 17번 라인의 조건식을 이용하여 m과 n사이의 자연수 i가 완 제

곱수인지 정한다. 완 제곱수로 정한 i에 해서는 19번 라

인에서 sum에 합을 구하고 20번 라인에서 지 까지 구한

min 변수를 더 작은 값으로 갱신할 수 있는지 확인한다.

실 문제 1

제곱근을 구하기 해 sqrt()함수를 사용할 경우,#include해야할 헤더 일은?정

답 :②

① stdio.h ② math.h ③ stdlib.h ④ string.h ⑤ diret.h

실 문제 2

pow(a,b)함수의 의미로 올바른 것은?정답 :②

① a*b ② ab ③ ba ④ a/b ⑤ a%b

정리학습

표 라이 러리 함수

C언어에는 많은 표 라이 러리 함수 제공

#include<math.h>

doublesqrt(a)=>a의 제곱근

Page 143: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 137 -

#include<stdlib.h>

qsort(배열이름,개수,요소크기,comapre)

intcompare(constvoid*a,constvoid*b)

{

a>b인 경우,양수 반환

a<b인 경우,음수 반환

a=b인 경우,0반환

}

10. 정렬 알고리즘

n개의 수로 이루어진 무작 수열을 오름차순으로 정렬하고자 한다. 이 정렬 문제는

다음과 같은 입력과 출력으로 다시 정의할 수 있다.

입력 : n, n개의 수로 이루어진 무작 수열

출력 : 오름차순으로 정렬된 수열

이 문제를 해결하는 알고리즘에는 표 으로 삽입, 선택, 거품 정렬 등이 있다. 그러

나 이러한 정렬 알고리즘은 데이터의 개수가 약 100000개 이상인 경우 1 안에 정렬할

수 없는 문제가 있다. 이런 경우에는 퀵정렬, 힙정렬, 합병정렬 등의 빠른 정렬 알고리

즘을 사용해야 하는데, C언어의 표 함수인 qsort()는 퀵 정렬을 구 한 것으로 이 함수

를 이용하면 빠르게 정렬을 완료할 수 있다. 다음은 qort() 함수의 로토타입과 비교 함

수이다.

다음의 문제를 qsort 함수를 이용하여 해결해 보자.

Page 144: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 138 -

로그래 소스

1. #include<stdio.h>

2. #include<stdlib.h>

3.

4. intcompare(constvoid*a,constvoid*b)

5. {

6. int*x=(int*)a;

7. int*y=(int*)b;

8. //오름차순

9. return*x-*y;

10. //내림차순

11. //return*y-*x;

12.}

13.

14.intmain()

15.{

16. intn;

기 문제

00b11정렬하기

입력받은 n개의 수를 오름차순으로 정렬하는 로그램을 작성하시오. 를 들어,

입력받은 수가 56,23,11,10,2,10,75일 때 오름차순으로 정렬한 결과는 2,10,

10,11,23,56,75이다.

실행 일의 이름은 문제 코드와 동일하다.부분 수는 없다.

입력 형식

입력 일의 이름은 INPUT.TXT이다.첫째 에 n이 주어진다.두 번째 에 n개의 수가 공

백을 사이에 두고 주어진다. 수의 범 는 0~100000이고,n은 100000이하다.

출력 형식

출력 일의 이름은 OUTPUT.TXT이다.첫째 에 입력받은 n개의 수를 오름차순으로 정렬

하여 출력한다.단,각 수의 사이에 공백을 둔다.

입력과 출력의

입력 (INPUT.TXT)

7

5623111021075

출력 (OUTPUT.TXT)

2101011235675

Page 145: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 139 -

17. intd[100000];

18. inti,j,t;

19. //입력

20. freopen("input.txt","r",stdin);

21. freopen("output.txt","w",stdout);

22. scanf("%d",&n);

23. for(i=0;i<n;i++)

24. {

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

26. }

27. //처리

28. /*

29. //거품정렬

30. for(i=0;i<n-1;i++)

31. {

32. for(j=0;j<n-i-1;j++)

33. {

34. if(d[j]>d[j+1])

35. {

36. t=d[j];

37. d[j]=d[j+1];

38. d[j+1]=t;

39. }

40. }

41. }*/

42. qsort(d,n,sizeof(int),compare);

43. //출력

44. for(i=0;i<n;i++)

45. {

46. printf("%d",d[i]);

47. }

48.

49. return0;

50.}

29번~41번 라인 : 거품 정렬 알고리즘을 구 한 것이다. 그러나, 이 알고리즘은 많은

양의 데이터를 빠르게 처리할 수 없다.

42번 라인 : qsort() 함수를 호출하여, 정렬을 수행한다. qsort() 함수의 마지막 인수는

4번~12번 라인에서 정의한 비교 함수의 이름이다.

4번~12번 라인 : 비교 함수를 정의한다. 비교 함수의 이름은 compare이며 return

*x-*y; 명령문을 이용하여 표 라이 러리 함수에서 규정하고 있

는 비교함수의 정의 방법을 따르고 있다.

Page 146: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 140 -

실 문제

다음은 두 변수 a,b의 값을 맞바꾸는 로그램의 일부 코드다.★에 들어갈 올바

른 코드는?정답 :⑤

inta,b,t;

a=10;

b=20;

b=a;

a=t;

① a=b; ② b=a; ③ a=20; ④ b=10; ⑤ t=a;

실 문제 2

다음은 d배열에 있는 n개의 요소들을 정렬하는 로그램의 일부 코드다.★에 들어

갈 올바른 코드는?정답 :③

for(i=0;i<n-1;i++)

{

for(j=0;j<n-i-1;j++)

{

if(★ )

{

t=d[j];

d[j]=d[j+1];

d[j+1]=t;

}

}

}

① d[i]>d[i+1]② d[j]>d[i+1]③ d[j]>d[j+1]④ d[i]>d[j-1]⑤ d[i]>d[j]

정리학습

정렬 알고리즘

거품 정렬 알고리즘은 많은 양의 데이터에 해서 빠르게 수행할 수 없음

언어에는 퀵 정렬 알고리즘을 구 한 qsort()함수가 있어서 데이터의 수가

많아도 빠르게 정렬을 할 수 있음

Page 147: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 141 -

기 문제

00b14어디에 있나

정렬된 n개의 데이터 에서 ‘찾고자 하는 값’이 어디에 치하는지 확인하는 로

그램을 작성하시오.‘찾고자 하는 값’이 맨 처음에 존재하면 1을,그 다음 치에 존

재하면 2를...출력한다.만약 존재하지 않는 경우는 0을 출력한다.실행 일의 이름

은 문제 코드와 동일하며 실행 시간은 0.5 를 과할 수 없다.

입력 형식

입력 일의 이름은 INPUT.TXT이다.첫째 에 정수 n이 주어진다.둘째 에는 공백을 사이에

두고 n개의 서로 다른 데이터들이 주어진다.둘째 에는 찾고자 하는 값이 주어진다.n은

100,000,000이하의 정수고,각 데이터도 500,000,000이하의 정수다.

출력 형식

출력 일의 이름은 OUTPUT.TXT이다.첫째 에 찾고자 하는 값의 치를 출력한다.단,가장

앞쪽에 있는 값의 치는 1이다.찾고자 하는 값이 존재하지 않을 경우에는 0을 출력한다.

입력과 출력의

입력 (INPUT.TXT)

10

245781015203040

5

출력 (OUTPUT.TXT)

3

11.검색 알고리즘

검색이란 n개의 난수로 구성된 무작 수열에서 원하는 값이 있는지, 있다면 어디에

있는지 확인하는 방법이다.

검색 알고리즘에는 순차 검색과 이분 검색이 있다. 순차 검색 알고리즘은 각각의 배열

요소에 해서 처음부터 하나씩 순차 으로 찾고자 하는 값과 일치하는지를 확인한다.

다음의 의사코드는 순차 검색 알고리즘이다,

순차 검색 알고리즘은 데이터의 검색 범 가 직 검색 범 에서 정확히 한 개씩

어드는 반면, 이분 검색 알고리즘은 데이터의 검색 범 가 1/2씩 어든다.

두 검색 알고리즘을 이용하여 다음의 문제를 해결해 보자.

Page 148: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 142 -

로그래 소스

1. #include<stdio.h>2. #include<stdlib.h>3.

4. inta[100000000];5.

6. intmain()7. {8. intn,i,key;9. intleft,mid,right;10. //입력11. freopen("input.txt","r",stdin);12. freopen("output.txt","w",stdout);13. scanf("%d",&n);14. for(i=0;i<n;i++)15. {16. scanf("%d",&a[i]);17. }18. scanf("%d",&key);19. //처리20. /*21. //순차검색22. for(i=0;i<n;i++)23. {24. if(a[i]==key)break;25. }26. //출력27. if(i==n)printf("0");28. elseprintf("%d",i+1);29. */30. //이분검색31. left=0;32. right=n-1;33. while(left<=right)34. {35. mid=(left+right)/2;36. if(a[mid]==key)break;37.

38. if(a[mid]<key)left=mid+1;39. elseright=mid-1;40. }41. //출력42. if(left>right)printf("0");43. elseprintf("%d",mid+1);44. return0;45.}

Page 149: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 143 -

22번~28번 라인 : 순차 검색 알고리즘을 구 한 것이다. i가 하나씩 증가하면서 순차

으로 찾고 있음을 확인하자.

31번~43번 라인 : 이분 검색 알고리즘을 구 한 것이다. 42번 라인에서 while 루 를

종료한 후 left와 right 변수의 값이 서로 엇갈린 여부를 통해 찾고

자 하는 값의 존재 여부를 확인하고 있다.

실 문제

어 사 을 처음부터 한 페이씩 넘겨가면서 찾는 방법과 유사한 알고리즘은?정답

:②

① 이분검색 ② 순차검색 ③ 거품정렬 ④ for루 ⑤ 두 변수 맞바꾸기

실 문제

64개의 데이터에 한 이분 탐색시 최악의 경우의 비교 횟수를 가장 정확히 측

한 것은? 정답 : ③

① 5 ② 6 ③ 7 ④ 8 ⑤ 9

정리학습

검색 알고리즘

순차 검색,이분 검색 2가지가 있음

수차 검색은 처음부터 하나씩 찾는 방법

이분 검색은 다음의 검색범 를 반으로 이면서 찾는 방법,속도 빠름

Page 150: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 144 -

12.정렬 알고리즘의 용 : 푯값

정렬 알고리즘을 용하여 문제를 보다 쉽게 해결해 보자.

05년 지역본선 등부 1번 문제

05re1 푯값

어떤 수들이 있을 때,그 수들을 표하는 값으로 가장 흔하게 쓰이는 것은 평균이

다.평균은 주어진 모든 수의 합을 수의 개수로 나 것이다. 를 들어 10,40,30,

60,30,20,60,30,40,50의 평균은 34다.평균 이외의 다른 푯값으로 앙값이

라는 것이 있다. 앙값은 주어진 수를 크기 순서 로 늘어 놓았을 때 가장 앙에

놓인 값이다. 를 들어 10,40,30,60,30의 경우,크기 순서 로 늘어 놓으면 1030

304060이 되고 따라서 앙값은 30이 된다.

다섯 개의 자연수가 주어질 때 이들의 평균과 앙값을 구하는 로그램을 작성하시오.

실행 일의 이름은 AA.EXE로 하고, 로그램의 실행시간은 1 를 넘을 수 없다.

부분 수는 없다.

입력 형식

입력 일의 이름은 input.txt이다.첫째 부터 다섯 번째 까지 한 에 하나씩 자연수가

주어진다.주어지는 자연수는 100보다 작은 10의 배수이다.

출력 형식

출력 일의 이름은 output.txt이다.첫째 에는 평균을 출력한다.둘째 에는 앙값을 출

력한다.평균과 앙값은 모두 자연수이다.

입력과 출력의

입력(INPUT.TXT)

10

40

30

60

30

출력(OUTPUT.TXT)

34

30

Page 151: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 145 -

로그래 소스

1. #include<stdio.h>

2. #include<stdlib.h>

3.

4. intcompare(constvoid*a,constvoid*b)

5. {

6. int*x=(int*)a;

7. int*y=(int*)b;

8.

9. return*x-*y;

10.}

11.

12.intmain(){

13. inta[5],sum=0,i;

14. //입력

15. freopen("input.txt","r",stdin);

16. freopen("output.txt","w",stdout);

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

18. {

19. scanf("%d",&a[i]);

20. }

21. //처리

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

23. {

24. sum+=a[i];

25. }

26. qsort(a,5,sizeof(int),compare);

27. //출력

28. printf("%d\n%d",sum/5,a[2]);

29. return0;

30.}

이 문제는 다섯 개의 데이터를 정렬한 후 정렬된 배열의 첨자 2 치의 값을 구하면

이것이 곧 ‘ 앙값’이 된다.

Page 152: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 146 -

26번 라인 : 오름차순 정렬을 한 qsort() 함수를 사용하 다.

28번 라인 : 앙값은 정렬된 배열 a의 첨자 2 치에 있는 값이다.

실 문제

이름이 nums이고 요소의 개수가 10인 int형 배열을 정렬하기 한 qsort함수의 올

바른 사용법은?단,비교 함수의 이름은 compare로 가정한다.정답 :⑥

① qsort(nums,compare,int,10);

② qsort(nums,compare,sizeof(int),10);

③ qsort(nums,sizeof(int),10,compare);

④ qsort(&i,nums,10,sizeof(int),compare);

⑤ qsort(nums,10,sizeof(int),compare);

실 문제

다음은 qsort()함수를 한 비교 함수의 정의한 것이다.★에 들어갈 올바른 코드

는?단,가능한 길이가 짧은 코드를 사용할 것!정답 :return*x-*y;

intcompare(constvoid*a,constvoid*b){

intx=*((int*)a);

inty=*((int*)b);

}

정리학습

정렬 알고리즘

정렬 알고리즘을 이용하면 쉽게 해결되는 경우가 많다.

정렬 알고리즘은 매우 요하므로 반드시 익숙해지도록 공부해야 함

Page 153: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 147 -

12년 국본선 등부 2번 문제

12ne2 산

국가의 역할 하나는 여러 지방의 산요청을 심사하여 국가의 산을 분배하는

것이다.국가 산의 총액은 미리 정해져 있어서 모든 산요청을 배정해 주기는 어려

울 수도 있다.그래서 정해진 총액 이하에서 가능한 한 최 의 총 산을 다음과 같

은 방법으로 배정한다.

(1)모든 요청이 배정될 수 있는 경우에는 요청한 액을 그 로 배정한다.

(2)모든 요청이 배정될 수 없는 경우에는 특정한 정수 상한액을 계산하여 그 이상

인 산요청에는 모두 상한액을 배정한다.상한액 이하의 산요청에 해서는 요청

한 액을 그 로 배정한다.

를 들어, 체 국가 산이 485이고 4개 지방의 산요청이 각각 120,110,140,

150이라고 하자.이 경우,상한액을 127로 잡으면, 의 요청들에 해서 각 각 120,

110,127,127을 배정하고 그 합이 484로 가능한 최 가 된다.여러 지방의 산요청

과 국가 산의 총액이 주어졌을 때, 의 조건을 모두 만족하도록 산을 배정하는

로그램을 작성하시오.

실행 일의 이름은 BB.EXE로 하고 실행시간은 1 를 넘을 수 없다.부분 수는

없다.

입력 형식

입력 일의 이름은 INPUT.TXT이다.첫째 에는 지방의 수를 의미하는 정수 N이

주어진다.3이상 10,000이하이다.다음 에는 각 지방의 산요청을 표 하는 N개

의 정수가 빈칸을 사이에 두고 주어진다.이 값들은 모두 1이상 100,000이하이다.

그 다음 에는 총 산을 나타내는 정수 M이 주어진다.M은 N이상 1,000,000,000이

하이다.

13. 검색 알고리즘의 용 : 산

이분 검색은 순차 검색보다 효율 인 알고리즘으로서 많은 문제에 응용되어 출제된다.

특히, 이분 검색은 최 화 문제에도 용할 수 있는 매우 유용한 기법이다.

Page 154: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 148 -

출력 형식

출력 일의 이름은 OUTPUT.TXT이다.첫째 에는 배정된 산들 최 값인

정수를 출력한다.

입력과 출력의

입력(INPUT.TXT)

4

120110140150

485

출력(OUTPUT.TXT)

127

이 문제를 해결하기 한 실마리를 정리해 보면 다음과 같다.

총 산이 지방의 모든 산 요청액을 충족할 수 있다면, 산 요청액의 최 값을

출력하면 된다.

총 산이 지방의 모든 산 요청액을 충족할 수 없다면, 총 산 범 내에서 최

한 많은 산을 배정하도록, 최 상한액을 구하면 된다.

그 다면,최 한 많은 산을 배정하는 최 상한액을 구하는 방법에 해서 알아보

자.여기서 순차 검색, 는 이분검색을 용할 수 있다.

순차검색을 이용하는 방법

최 상한액은 1 ~ 총 산액 사이에 존재하므로, 1부터 하나씩 배정해서 확인하는 방

법이다. 그러나 총 산액이 최 10억이므로 1부터 10억까지 일일이 확인하려면 많은 시

간이 요구된다.

이분검색을 이용하는 방법

1 ~ 총 산액 사이에 존재하는 최 상한액을‘찾기’ 해서 이분검색을 용할 수

있다. 이때 left와 right를 다음과 같이 기화한다.

Page 155: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 149 -

로그래 소스

1. #include<stdio.h>

2. #include<stdlib.h>

3.

4. intn,p[10000],tot;

5.

6. intisPossible(intb)

7. {

8. intt=tot;

9. inti;

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

11. {

12. if(p[i]<=b)t-=p[i];

13. elset-=b;

그리고 정 앙을 확인한다. 앙값이 배

정 가능하다면 배정가능한 최 상한액을

찾기 해 오른쪽에 있을 가능성이 있는

‘최 상한액’을 찾기 해 오른쪽 부분

에 해서 이분 검색을 다시 시도한다.

앙값이 배정 불가능하다면 오른쪽에는

배정가능한 상한액이 존재하지 않으므로

왼쪽 부분에 해서 이분 검색을 시도한다.

최 상한액을 구해야 하므로 이러한 과

정을 더 이상 이분검색을 할 수 없을 때까

지(left와 right가 엇갈릴 때까지) 수행한다.

다음 그림은 left와 right가 엇갈릴 때의 상

황이다.

그림에서도 알 수 있듯이 left와 right가 엇갈렸을 때, right가 가리키는 값이 곧 구하고

자 하는 ‘최 상한액’이 된다. 다음은 순차 검색을 이용하여 이 문제를 해결하는 소

스다.

Page 156: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 150 -

14. }

15. if(t<0)return0;

16. elsereturn1;

17.}

18.

19.intmain()

20.{

21. inti,max=-999,sum=0;

22. intleft,right,mid;

23. //입력

24. freopen("input.txt","r",stdin);

25. freopen("output.txt","w",stdout);

26.

27. scanf("%d",&n);

28. for(i=0;i<n;i++)

29. {

30. scanf("%d",&p[i]);

31. }

32. scanf("%d",&tot);

33. //처리

34. for(i=0;i<n;i++)

35. {

36. sum+=p[i];

37. if(p[i]>max)max=p[i];

38. }

39. if(sum<=tot)

40. {

41. printf("%d",max);

42. return0;

43. }

44. //최 상한액을 찾아야 함

45. /*

46. //순차검색

47. i=1;

48. while(i<=tot)

49. {

50. if(isPossible(i)==1)i++;

Page 157: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 151 -

51. elsebreak;

52. }

53. i-=1;

54. printf("%d",i);

55. */

56. //이분검색

57. left=1;

58. right=tot;

59. while(left<=right)

60. {

61. mid=(left+right)/2;

62. if(isPossible(mid)==1)

63. {

64. left=mid+1;

65. }else

66. {

67. right=mid-1;

68. }

69. }

70. printf("%d",right);

71. return0;

72.}

34번~43번 라인 : 총 산이 지방의 모든 산 요청액을 충족할 수 있다면, 산 요

청액의 최 값을 출력하고 로그램을 종료한다.

47번~54번 라인 : 총 산이 지방의 모든 산 요청액을 충족할 수 없다면 순차검색

으로 배정 가능한 최 상한액을 찾는다. 그러나 이 방법은 속도

가 느린 단 이 있다.

57번~70번 라인 : 이분검색으로 배정 가능한 최 상한액을 찾는다. 이분검색이 종료

될 때 right가 가리키는 값이 구하고자 하는 최 상한액이다.

Page 158: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 152 -

실 문제 1

다음은 순차검색을 이용하여 ‘산’문제를 해결하는 로그램의 일부다.★에 들어갈 올바

른 코드는?정답 :i++

i=1;

while(i<=tot)

{

if(isPossible(i)==1)★ ;

elsebreak;

}

i-=1;

printf("%d",i);

실 문제 2

최 화 문제를 해결하는데 용할 수 있는 검색 방법은?정답 :②

① 순차검색 ② 이분검색 ③거품검색 ④정렬검색 ⑤재귀검색

정리학습

이분검색 알고리즘

순차검색에 비해서 속도가 빠르다.

최 화 문제를 해결하는데 매우 유용한 문제해결기법 하나

Page 159: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 153 -

14. 재귀의 개념 : 1부터 N까지의 합계 구하기

함수 내부에 함수 자신을 호출하는 명령문을 포함하는 구조로서 반복 구조와 유사하

나, 재귀(자기) 호출이 이루어질 때마다 원래 문제의 부분 문제에 해서 알고리즘이 재

귀 으로 수행되는 차이 이 있다. 이때, 재귀 호출이 멈추었을 때의 부분 문제를 기본

상태(base case)라고 하며, 기본 상태에 도달하기 직 까지의 부분 문제를 재귀 상태

(recursive case)라고 한다.

정수 1부터 n까지의 합계를 구하는 문제를 재귀를 이용하여 해결해 보자.

기 문제

00a041부터 N까지의 합계 구하기

하나의 정수 N이 주어질 때 1부터 N까지의 합계를 구하는 로그램을 작성하시오.실행 일의

이름은 문제 코드와 동일하며, 로그램의 실행시간은 1 를 넘을 수 없다.부분 수는 없다.

입력 형식

입력 일의 이름은 INPUT.TXT이다.첫째 에 하나의 정수 N이 주어진다.정수는 1,000이하

다.

출력 형식

출력 일의 이름은 OUTPUT.TXT이다.첫째 에 1부터 N까지의 합계를 출력한다.

입력과 출력의

입력 (INPUT.TXT)

10

출력 (OUTPUT.TXT)

55

1부터 N까지의 합계를 구하는 알고리즘은 3가지가 있다. 반복문을 이용하거나 1부터

N까지의 합계를 구하는 수식을 이용할 수 있다. 마지막으로 재귀를 이용할 수 있는데,

다음의 소스는 바로 이 재귀를 이용한 것이다.

Page 160: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 154 -

로그래 소스

1. #include<stdio.h>

2.

3. intsum(intn)

4. {

5. if(n>1)returnn+sum(n-1);

6. elsereturnn;

7. }

8.

9. intmain()

10.{

11. intres=0;

12. intn;

13. //입력

14. freopen("input.txt","r",stdin);

15. freopen("output.txt","w",stdout);

16. scanf("%d",&n);

17. //처리

18. res=sum(n);

19. //출력

20. printf("%d",res);

21. return0;

22.}

3번~7번 라인 : 1부터 인수 n까지의 합계를 구하는 sum 함수를 재귀 으로 정의하

다.

18번 라인 : 인수 n으로 sum 함수를 호출하면 재귀 으로 수행하다가 최종 으로 1

부터 n까지의 합계를 구해서 반환한다. 그리고 그 반환값을 res에 장

한다. 재귀 으로 수행되는 과정은 다음과 같다.

Page 161: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 155 -

실 문제 1

다음은 1부터 n까지의 합을 구하는 재귀함수다.★에 들어갈 올바른 코드는?정답

:①

intsum(intn)

{

if(n>1)returnn+sum(n-1);

else★;

}

① returnn ② return2 ③ return0 ④ returnn-1 ⑤ returnn+n+1

실 문제 2

자신을 정의할 때,자기 자신을 참조하는 방법으로,반복과 유사하나 간명하게 처

리할 수 있는 장 이 있는 로그래 기법은 ?정답 :재귀

정리학습

재귀

자신을 정의할 때,자기 자신을 참조하는 방법

함수를 정의할 때 재귀의 개념을 용한 것이 ‘재귀함수’

Page 162: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 156 -

15. 재귀의 용 : 팩토리얼 구하기

N의 팩토리얼(계승)은 N!로 표기하며 다음과 같이 구한다.

N! = 1 × 2 × 3 × ... × N-1 × N

0! = 1

기 문제

00a47팩토리얼 구하기

주어진 양의 정수 N의 팩토리얼(계승)을 구하는 로그램을 작성하시오.N!은 1부

터 N까지의 정수를 모두 곱한 것을 말하며 N!로 나타낸다.즉,N!=1×2×3×...

×N-2×N-1×N 이다.단,0!은 1이다.

입력 형식

입력 일의 이름은 input.txt이다.첫째 에 양의 정수 N이 주어진다.N은 0이상 14이하의

정수다.

출력 형식

출력 일의 이름은 output.txt이다.첫째 에 N의 계승(N!)을 출력한다.

입력과 출력의

입력(INPUT.TXT)

5

출력(OUTPUT.TXT)

120

재귀를 이용하여 팩토리얼을 구해보자. 단, 팩토리얼의 값은 매우 커지므로 이러한 결

과값의 처리도 신경써야 한다. 를 들어 5!은 120이지만, 13!은 6227020800으로 int형의

범 21억을 과한다.

Page 163: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 157 -

로그래 소스

1. #include<stdio.h>

2.

3. longlongfact(intn)

4. {

5. if(n>1)returnn*fact(n-1);

6. elsereturn1;

7. }

8.

9. intmain()

10.{

11. longlongres=0;

12. intn;

13. //입력

14. freopen("input.txt","r",stdin);

15. freopen("output.txt","w",stdout);

16. scanf("%d",&n);

17. //처리

18. res=fact(n);

19. //출력

20. printf("%lld",res);

21. return0;

22.}

3번~7번 라인 : 인수 n의 팩토리얼(계승)을 구하는 fact 함수를 재귀 으로 정의하

다. 특히, 13!은 6227020800으로 int형으로 처리할 수 없기 때문에 반환형을 long long형

으로 정의하 다.

11번, 20번 라인 : 결과값을 장하는 res 변수도 long long 형으로 정의하 으며,

printf() 함수의 서식 문자도 %lld를 사용했음을 확인하자!

18번 라인 : 인수 n으로 fact 함수를 호출하면 재귀 으로 수행하다가 최종 으로 n

팩토리얼을 구해서 반환한다. 그리고 그 반환값을 res에 장한다. 재귀

으로 수행되는 과정은 다음과 같다.

Page 164: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 158 -

실 문제

다음은 n!(팩토리얼)을 구하는 재귀함수다.★에 들어갈 올바른 코드는?정답 :②

intfact(intn){

if(★ )returnn*fact(n-1);elsereturn1;

}

① n>0 ② n>1 ③ n==0 ④ n<1 ⑤ n<-1

실 문제

n!(팩토리얼)은 n이 13인 경우 6227020800으로 int형의 범 를 과한다.이러한

을 고려할 때 ★에 들어갈 올바른 코드는?정답 :longlong

★ fact(intn)

{

if(생략 )returnn*fact(n-1);

elsereturn1;

}

정리학습

팩토리얼 구하기

팩토리얼(계승)을 구하는 문제는 재귀로 해결할 수 있는 표 인 문제

하나다.

팩토리얼의 결과값은 매우 크기 때문에 int형으로 처리 불가능

이러한 경우 longlong형을 사용해야 함.

Page 165: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 159 -

기 문제

00b15피보나치 수열의 n번째 항 구하기

1,1,2,3,5,8,13...을 피보나치 수열이라고 한다.즉,n번째 항은 n-1번째 항과

n-2번째 항을 더한 것이고,1번째 항과 2번째 항은 1이다.정수 n이 주어질 때 피보

나치 수열의 n번째 항을 구하는 로그램을 작성하시오. 를 들어,피보나치 수열의

6번째 항은 7이다.실행 일의 이름은 문제 코드와 동일하며 실행 시간은 1 를

과할 수 없다.

입력 형식

입력 일의 이름은 INPUT.TXT이다.첫째 에 정수 n이 주어진다.n은 1,000이하의 정수다.

출력 형식

출력 일의 이름은 OUTPUT.TXT이다.첫째 에 피보나치 수열의 n번째 항을 출력한다.

16.동 계획법의 이해 1:피보나치 수열 (재귀)

피보나치 수열은 다음의 화식으로 정의되는 수열이다.

즉, n번째 항은 n-1번째 항과 n-2번째 항의 합으로 구한다. 단. 1번째 항과 2번째 항

은 1이다. 화식이 주어진다면 이것을 재귀함수로 정의하는 것이 매우 쉽다. 다음의

<코드>는 의 화식을 그 로 재귀함수로 정의한 것이다.

<코드>

1. //피보나치 수열의 n번째 항을 구하는 함수

2. intfib(intn)

3. {

4. if(n==1||n==2)

5. return1;

6. else

7. returnfib(n-2)+fib(n-1);

8. }

Page 166: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 160 -

입력과 출력의

입력 (INPUT.TXT)

20

출력 (OUTPUT.TXT)

6765

로그래 소스

1. #include<stdio.h>2. intfib(intn)3. {4. if(n==1||n==2)5. return1;6. else7. returnfibo(n-2)+fibo(n-1);8. }9.

10.intmain()11.{12. intres;13. intn;14. //입력15. freopen("input.txt","r",stdin);16. freopen("output.txt","w",stdout);17. scanf("%d",&n);18. res=fib(n);19. //출력20. printf("%d",res);21. return0;22.}

2번~8번 라인 : 피보나치 수열의 n번째 항을 구하는 fib() 함수를 재귀 으로 정의하

다.

18번 라인 : fib() 함수를 호출하여 최종 결과로 반환되는 값을 res 변수에 장한다.

다음의 그림은 재귀를 이용하여 피보나치 수열의 n번째 항을 구할 때 재귀 으로 호출

되는 과정을 보여 다. 피보나치 수열의 6번째 항을 구하기 해 1번째 항을 3회, 2번째

항을 5회, 3번째 항을 3, 4번째 항을 2회, 5번째, 6번째 항을 각각 1회씩 구하고 있다. 즉,

같은 값을 반복해서 구하는 매우 비효율 인 면이 나타나고 있다. (재귀를 사용한다고 해

서 모두 비효율 인 면이 나타나는 것은 아니다.) 이 듯, 피보나치 수열의 N번째 항을

구하는 문제는 재귀를 용했을 때 비효율 인 면이 나타나는 표 인 문제다. 이러한

Page 167: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 161 -

문제를 해결하기 해서는 값을 계산한 후 그 값을 배열에 장하여, 나 에 필요할 때

마다 다시 계산할 필요없이 배열에 장된 값을 이용한다. 이러한 문제해결 기법을 ‘동

계획법’이라고 한다. 다음은 이 문제를 동 계획법으로 해결하는 소스 코드다.

n 계산하는 항의 개수

1 3

2 5

3 3

4 2

5 1

6 1

로그래 소스

1. #include<stdio.h>2. intfib(intn)3. {4. inti;5. intf[1001]={0};6. f[1]=1;7. if(n>1)8. {9. f[2]=1;10. for(i=3;i<=n;i++)11. f[i]=f[i-2]+f[i-1];12. }13. returnf[n];14.}15.

16.intmain()17.{18. intres;19. intn;20. //입력21. freopen("input.txt","r",stdin);22. freopen("output.txt","w",stdout);23. scanf("%d",&n);24. res=fib(n);25. //출력26. printf("%d",res);27. return0;28.}

Page 168: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 162 -

2번~14번 라인 : 피보나치 수열의 n번째 항을 구하는 동 계획법을 구하는 함수다.

함수 내부에 자신을 호출하는 코드가 삭제되었음을 확인하고, 일차

원 배열 f[]가 지역 으로 선언되어 사용되고 있음을 확인하자. 이

배열은 동 계획법 구 을 해 선언한 것이다. 만약, 피보나치 수

열의 7번째 항을 구한다면 f[] 배열에 다음과 같이 장될 것이다.

f배열 0 1 1 2 3 5 8 17 ...

실 문제

피보나치 수열을 재귀로 해결할 때 가장 큰 문제 은?정답 :④

① 로그래 이 복잡하다.

② 일반 으로 int형의범 를 벗어난다.

③ double형으로 처리해야 한다.

④ 반복문을 첩해서 사용해야 한다.

⑤ 동일한 값을 복해서 계산한다.

실 문제

다음은 피보나치 수열의 n번째 항을 구하는 재귀함수다.★에 들어갈 올바른 코드는?정답 :①

intfib(intn){if(★ )return1;

elsereturnfibo(n-2)+fibo(n-1);

}

① n==1&&n==2 ② n==1||n==2 ③ n==1 ④ n>1 ⑤ n==0

정리학습

피보나치 수열의 n번째 항 구하기

재귀와 동 계획법을 이용하여 해결

재귀의 경우 이미 구한 값을 다시 복해서 계산하므로 시간이 많이 소요

동 계획법은 이미 구한 값을 배열에 장하고 필요할 때마다 다시

재사용하므로 해를 빠르게 구할 수 있음

Page 169: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 163 -

17. 동 계획법의 이해 2 : 피보나치 수열 (메모이제이션)

피보나치 수열의 N번째 항을 구하는 문제에서 재귀의 장 은 화식이 주어지면 곧바

로 재귀 함수로 정의하여 문제를 해결할 수 있다는 것이다. 그러나 같은 값을 복해서

계산하기 때문에 비효율 이어서 많이 시간이 소요된다.

메모이제이션(Memoization)은 재귀의 장 과 동 계획법의 장 을 결합한 방법으로서

재귀를 이용하여 부분 문제의 해를 구하되 이 게 구한 해를 배열에 장함으로써 복

계산하는 문제를 해결한다. 다음은 메모이제이션으로 피보나치 수열의 n번째 항을 구하

는 메모이제이션 함수다.

<코드>

1. intf[]={0,1,1,-1,-1,...,-1};

2. intfibo(intn)

3. {

4. if(f[n]==-1)//n번째 항을 아직 계산하지 않았다면

5. f[n]=fibo(n-2)+fibo(n-1);//다시 계산해서

6. returnf[n];//f[n]값을 넘겨 다.

7. }

1번 라인에서 메모이제이션을 해 선언한 f[] 배열의 모든 요소를 1로 기화하고

있다. 이것은 계산이 완료된 항인지 아닌지 확인하는 표식자로서의 역할을 하기 때문에

해가 될 수 없는 값으로 기화해야 한다. 여기서 1은 피보나치 수열에서 어떤 항의 값

도 될 수 없다.

Page 170: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 164 -

로그래 소스

1. #include<stdio.h>

2. #include<memory.h>

3. intf[1001];

4. intfibo(intn)

5. {

6. if(f[n]==-1)

7. {

8. f[n]=fibo(n-1)+fibo(n-2);

9. }

10. returnf[n];

11.}

12.

13.intmain()

14.{

15. intres,n;

16. //입력

17. freopen("input.txt","r",stdin);

18. freopen("output.txt","w",stdout);

19. scanf("%d",&n);

20. //처리

21. memset(f,-1,1001*sizeof(int));

22. f[0]=0;

23. f[1]=1;

24. f[2]=1;

25. res=fibo(n);

26. //출력

27. printf("%d",res);

28. return0;

29.}

4번~11번 라인 : 메모이제이션으로 이용하여 피보나치 수열의 n번째 항을 구하는 함

수를 정의한다.

21번 라인 : 메모이제이션에서 사용하는 f[] 배열을 기화한다. 모든 배열 요소를 1

로 기화하기 해 memset 함수를 사용하 다.

22번~24번 라인 : f[0], f[1], f[2]를 피보나치 수열의 기 1번째, 2번째 항으로 기화

한다.

Page 171: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 165 -

25번 라인 : fibo(n)을 호출하여 최종 으로 반환하는 값을 res 변수에 장한다.

실 문제

재귀의 장 과 동 계획법의 장 을 결합한 문제 해결 기법은?정답 :③

① 재귀 ② 동 계획법 ③ 메모이제이션 ④ 정렬 ⑤ 검색

실 문제

다음은 메모이제이션을 이용하여 피보나치 수열의 n번째 항을 구하는 함수다.★에

들어갈 올바른 코드는?정답 :f[n]=fibo(n-1)+fibo(n-2)

intfibo(intn){

if(f[n]==-1){

★ ;}returnf[n];

}

정리학습

메모이제이션

재귀의 장 과 동 계획법의 장 을 결합한 문제해결 기법

메모이제이션을 이용하면 피보나치 수열의 N번째 항 구하기 문제를

효율 으로 해결할 수 있다.

Page 172: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 166 -

18. 동 계획법의 용 1 : 연속부분최 합 (3회 첩반복문)

연속부분최 합 문제는 다양한 알고리즘을 용할 수 있는 유명한 문제다. 즉, 여러

알고리즘을 용해 보고 각 알고리즘의 효율성을 비교해 볼 수 있다. 이 문제를 3회

첩하는 반복문, 2회 첩하는 반복문, 그리고 동 계획법을 이용하여 각각 해결해 보고

효율성을 비교해 보자.

기 문제

1 -3 4 -2 8 -9 3 3 2 -1

00b00연속부분최 합

일차원 배열에 n개의 정수가 담겨 있다.배열에서 임의의 연속된 구간을 잡아 그

합이 최 가 되도록 하려고 한다. 를 들어 다음과 같은 일차원 배열이 주어질 때,

다음과 같이 연속된 구간을 선택하면 그 합이 10이 되고 이것이 최 합이다.

1 -3 4 -2 8 -9 3 3 2 -1

n과 n개의 수를 입력받아 합이 최 가 되도록 하는 연속구간을 찾아 그 합을 출력

하는 효율 인 로그램을 작성하시오.실행 일의 이름은 문제 코드와 동일하다.

실행 시간은 1 를 넘을 수 없다.

입력 형식

입력 일의 이름은 INPUT.TXT이다.첫째 에 1,000,000이하의 자연수 n이 주어진다.둘째

에는 일차원 배열에 담겨 잇는 n개의 정수가 차례로 주어진다.일차원 배열에 담긴 정수는 –100

이상,100이하이다.

출력 형식

출력 일의 이름은 OUTPUT.TXT이다.첫째 부터 연속된 구간의 합 최 값을 출력한다.

입력과 출력의

입력 (INPUT.TXT)

10

1–34–28–9332-1

출력 (OUTPUT.TXT)

10

Page 173: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 167 -

로그래 소스

1. #include<stdio.h>

2. #defineMAX(x,y)(((x)>(y))?(x):(y))

3. inta[1000000];

4. intmain()

5. {

6. intn,sum,mx=-9999999;

7. inti,j,k;

8. freopen("input.txt","r",stdin);

9. freopen("output.txt","w",stdout);

이 문제를 해결하는 가장 쉬운 방법은 3회 첩하는 반복문을 사용하는 것이다. 즉, 2

회 첩하는 반복문으로는 가능한 모든 부분 범 를 확인한다. 그리고 가장 안쪽에 있

는 반복문으로 부분 범 의 합을 구한다.

<코드>

1. #defineMAX(x,y)(((x)>(y))?(x):(y))

2. intmax_sum (inta[],intn){

3. inti,j,k;

4. intsum=0,mx=-9999999;

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

6. for(j=i;j<n;j++){

7. sum =0;

8. for(k=i;k<=j;k++){

9. sum +=a[k];

10. }

11. mx=MAX(mx,sum);

12. }

13. }

14. returnmx;

15.}

첫 번째 반복문의 카운터 변수 i, 두 번째 반복문의 카운터 변수 j를 통해 모든 부분

범 를 만들고, 세 번째 반복문의 카운터 변수 k를 통해 해당 부분 범 의 합을 계산하

는 방법이다.

Page 174: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 168 -

10. //입력

11. scanf("%d",&n);

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

13. {

14. scanf("%d",&a[i]);

15. }

16. //처리

17. for(i=0;i<n;i++)

18. {

19. for(j=i;j<n;j++)

20. {

21. sum=0;

22. for(k=i;k<=j;k++)

23. {

24. sum+=a[k];

25. }

26. mx=MAX(mx,sum);

27. }

28. }

29. //출력

30. printf("%d",mx);

31. return0;

32.}

17번, 19번 라인 : 2회 첩하는 반복문의 카운터 변수 i, j는 모든 가능한 연속된 부

분 범 를 만드는 역할을 한다.

22번~25번 라인 : i ~ j 사이의 범 에 존재하는 값을 더한다.

26번 라인 : i ~ j 사이의 연속부분합이 지 까지 구한 최 값을 갱신하는지 확인하

고 갱신 가능하면 갱신한다.

Page 175: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 169 -

실 문제

다음은 a배열에서 연속부분최 합을 구하는 함수다.sum =0;이 들어갈 치는?

정답 :③

#defineMAX(x,y)(((x)>(y))?(x):(y))

intmax_sum (inta[],intn){

inti,j,k;

intsum=0,mx=-9999999;

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

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

for(k=i;k<=j;k++){

sum +=a[k];

}

mx=MAX(mx,sum);

}

}

returnmx;

}

실 문제

문제에서 for문의 카운터 변수 i,j의 역할은?정답 :④

① 최소합 ② 최 합 ③ 부분 범 의 합

④ 모든 가능한 부분 범 의 시작과 끝 ⑤ 부분 범 의 값

정리학습

연속부분최 합 구하기

3회 첩하는 반복문을 이용하여 연속부분최 합 문제를 해결할 수 있다.

배열에 장된 값의 개수가 많은 경우 더 효율 인 알고리즘이 있는지

고려해야 한다.

Page 176: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 170 -

19. 동 계획법의 용 2 : 연속부분최 합 (2회 첩반복문)

연속부분최 합 구하기 문제에서 3회 첩되는 반복문을 2회 첩하는 반복문으로 개

선할 수 있다. 2회 첩하는 반복문으로 모든 연속된 부분 범 를 만드는 것은 동일하

나, 부분 범 의 합을 좀 더 효율 으로 개선할 수 있다.

i에서 j 사이 범 의 연속부분합은 i에서 j-1 사이 범 의 연속부분합+a[j]라는 사실을

이용하는 것이다. 이러한 아이디어를 통해 sum 변수의 기화를 한 단계 늦추고 가장

안쪽 for 루 를 삭제한다.

로그래 소스

1. #include<stdio.h>2. #defineMAX(x,y)(((x)>(y))?(x):(y))

3.

4. inta[1000000];5.

6. intmain()7. {8. intn,sum,mx=-9999999;9. inti,j;10. freopen("input.txt","r",stdin);11. freopen("output.txt","w",stdout);12. //입력13. scanf("%d",&n);14. for(i=0;i<n;i++)15. {16. scanf("%d",&a[i]);17. }18. //처리19. for(i=0;i<n;i++){20. sum=0;21. for(j=i;j<n;j++){22. sum+=a[j];23. mx=MAX(mx,sum);24. }25. }26. //출력27. printf("%d",mx);28. return0;29.}

Page 177: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 171 -

17번, 19번 라인 : 2회 첩하는 반복문의 카운터 변수 i, j는 모든 가능한 연속된 부

분 범 를 만드는 역할을 한다.

18번~22번 라인 : sum 변수의 기화를 한 단계 늦추므로써 방 구한 j-1까지의 연

속부분합을 이용하여 j까지의 연속부분합을 구할 수 있다.

실 문제

다음은 a배열에서 연속부분최 합을 구하는 함수다.sum =0;이 들어갈 치는?

정답 :②

#defineMAX(x,y)(((x)>(y))?(x):(y))

intmax_sum (inta[],intn){

inti,j,k;

intsum=0,mx=-9999999;

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

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

sum+=a[j];

mx=MAX(mx,sum);

}

}

returnmx;

}

Page 178: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 172 -

실 문제

다음은 a배열에서 연속부분최 합을 구하는 함수다.★에 들어갈 올바른 코드는?

정답 :②

#defineMAX(x,y)(((x)>(y))?(x):(y))

intmax_sum (inta[],intn){

inti,j;

intsum,mx=-9999999;

intb[n];

b[0]=a[0];

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

b[i]=b[i-1]+a[i];

}

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

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

if(i==0)

sum=b[j];

else

★ ;

mx=MAX(mx,sum);

}

}

returnmx;

}

① sum=b[i-1] ② sum=b[j]-b[i-1] ③ sum=b[i-1] ④ sum=0 ⑤ sum=a[j]

정리학습

연속부분최 합 구하기

2회 첩하는 반복문을 이용하여 문제를 해결 가능

추가 인 배열에 한 비작업을 통해 연속부분합을 쉽게 구할 수 있음

Page 179: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 173 -

20. 동 계획법의 용 3 : 연속부분최 합 (동 계획법)

연속부분최 합 구하기 문제를 가장 효율 으로 해결하는 방법은 동 게획법을 이용

하는 것이다. 동 계획법은 다음과 같은 화식을 먼 수립해야 한다.

b[i]을‘a[i]를 포함한 i번째까지의 연속부분 최 합’이라고 가정한다면 다음과 같이

화식으로 b[i]를 구할 수 있다.

의 화식을 이용하면 다음과 같은 b 배열을 만들 수가 있으며, 이 게 구한 b 배열

에서 최 값을 이 문제에서 구해야 하는 연속부분최 합이 된다. 이 게 구하는 알고리

즘은 어떤 반복문도 첩없이 단순 반복문만으로 해를 구할 수 있다.

로그래 소스

1. #include<stdio.h>2. #defineMAX(x,y)(((x)>(y))?(x):(y))3. inta[1000000];4. intb[1000000];5. intmain()6. {7. intn,sum,mx;8. inti,j;9. freopen("input.txt","r",stdin);10. freopen("output.txt","w",stdout);11. scanf("%d",&n);12. for(i=0;i<n;i++)13. {14. scanf("%d",&a[i]);15. }16. b[0]=a[0];17. mx=b[0];18. for(i=1;i<n;i++){19. b[i]=MAX(b[i-1]+a[i],a[i]);20. mx=MAX(b[i],mx);21. }22. printf("%d",mx);23. return0;

24.}

Page 180: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 174 -

16번~21번 라인 : 화식을 이용하여 b 배열을 구축하고, 그 에서 가장 큰 값을

mx 변수에 장한다.

실 문제

다음은 a배열에서 연속부분최 합을 구하는 함수다.★에 들어갈 코드는?정답 :

#defineMAX(x,y)(((x)>(y))?(x):(y))

intmax_sum (inta[],intn){

inti,mx;

intb[n];

b[0]=a[0];

mx=b[0];

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

b[i]=MAX(★ ,a[i]);

mx=MAX(b[i],mx);

}

returnmx;

}

① a[i-1] ② b[i] ③ b[i-1] ④ b[i-1]+a[i] ⑤ a[j]

실 문제

값을 계산한 후 그 값을 배열에 장하여,나 에 필요할 때마다 다시 계산할 필요없이

배열에 장된 값을 이용하는 문제해결기법은?정답 :①

① 동 계획법 ② 재귀 ③ 검색 ④ 정렬 ⑤ 첩반복문

정리학습

연속부분최 합 구하기

단순반복문을 이용하여 가장 효율 으로 해결할 수 있다.

동 계획법은 배열을 이용하여 문제를 효율 으로 해결하는 알고리즘

동 계획법은 많은 문제에서 응용되는 매우 유용한 문제해결기법

Page 181: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 175 -

리눅스 보충문제

Page 182: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고
Page 183: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 177 -

리 스 보충문제

보충문제 1.

문제 : ++a, a++ 에 값 차 알아보는 그램 작

결과 : 11, 12, 10, 11

프 래밍 소스

#include <stdio.h>

int main()

{

int a=10, b=10;

printf("증가 후 연산:%d”, ++a);

printf("다시 출력:%d \n”, a);

printf("연산 후 증가:%d”, b++);

printf("다시 출력:%d \n”, b);

}

보충문제 2.

문제 : 개 는 그램 작 (따라하기)

프 래밍 소스

#include <stdio.h>

int main()

{

printf(“안희동 \n”);

printf(“충북 등학교 \n”);

printf(“6학년 1반 \n”);

printf(“컴퓨터를 좋아합니다. \n”);

}

Page 184: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 178 -

보충문제 3.

문제 : 고 출 는 그램 작 (따라하기)

프 래밍 소스

#include <stdio.h>

int main()

{

int Val;

scanf("%d”, &Val);

printf("우리집 화번호는 %d 입니다. \n”, Val);

}

보충문제 4.

문제 : 알 벳 출 는 그램 (따라하기)

프 래밍 소스

#include <stdio.h>

int main()

{

char Val;

scanf("%c”, &Val);

printf("입력받은 문자:%c 결과: %d”, Val, Val);

}

Page 185: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 179 -

보충문제 5.

문제 : 료 변 는 그램 (따라하기)

프 래밍 소스

#include <stdio.h>

int main()

{

int a, b, c;

int n=215;

int r;

a=n/100;

b=(n-100*a)/10;

c=n%10;

r=c*100+b*10+a;

printf("%d”, r);

}

보충문제 6.

문제 : 3+16, 8÷2 나 지 는 그램 (따라하기)

프 래밍 소스

#include <stdio.h>

int main()

{

int Val1=3;

int Val2=16;

int Val3=8;

int result1, result2;

result1=(Val1+Val2)/2;

result2=Val3%2;

printf("%d %d”, result1, result2);

}

Page 186: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 180 -

보충문제 7.

문제 : A++, ++A 차 알아보는 그램 (따라하기)

프 래밍 소스

#include <stdio.h>

int main()

{

int a=10, b=10;

printf("증가 후 연산:%d”, ++a);

printf("다시 출력:%d \n”, a);

printf("연산 후 증가:%d”, b++);

printf("다시 출력:%d \n”, b);

}

보충문제 8.

문제 : 10>11, 10<11 참과 거짓 가 내는 그램 (따라하기)

프 래밍 소스

#include <stdio.h>

int main()

{

int a=10;

int b=11;

printf("a>b는? %d \n”, a>b);

printf("a<b는? %d \n”, a<b);

}

Page 187: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 181 -

보충문제 9.

문제 : 리연산 용 는 그램 (따라하기)

프 래밍 소스

#include <stdio.h>

int main()

{

int a=10, b=20;

int result1, result2, result3;

result1=(a>20)&&(b>10);

result2=(a<20)||(b<10);

result3=(!a);

printf("result1:%d result2:%d result3:%d \n”, result1, result2, result3);

}

보충문제 10.

문제 : 숫 짝수, 수 는 그램 (따라하기)

프 래밍 소스

#include <stdio.h>

int main()

{

int Num;

scanf("%d”, &Num);

if(1<=Num && Num<=10)

{

if(Num%2==1)

printf("홀수입니다.”);

if(Num%2==0)

printf("짝수입니다.”);

}

}

Page 188: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 182 -

보충문제 11.

문제 : 90 상 “ 격”, 90 미만 “ 격” 출 는 그램

프 래밍 소스

#include <stdio.h>

int main()

{

int point;

scanf("%d”, &point);

if(point>=90) printf("합격 \n”);

else printf("불합격 \n”);

}

보충문제 12.

문제 : 90 상 “수”, 80 상 “우”, 70 상 “미”, 60 상 “양”, 나 지 “가”

출 는 그램

프 래밍 소스

#include <stdio.h>

int main()

{

int point;

scanf("%d”, &point);

if(1<=point && point<=100)

{

if(point >= 90) printf("수”);

else {

if(90 > point && point >= 80) printf("우”);

else {

if(80 > point && point >= 70) printf("미”);

else

printf("가”);

}

}

}

Page 189: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 183 -

보충문제 13.

문제 : 건연산 용 여 짝수 “짝” 출 는 그램

프 래밍 소스

#include <stdio.h>

int main()

{

int num;

scanf("%d”, &num);

printf("%s”, (num%2==0)? "홀”:"짝”);

}

보충문제 14.

문제 : 수 는 그램

프 래밍 소스

#include <stdio.h>

int main()

{

int i;

int x;

int sum=0;

scanf("%d”, &x);

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

{

sum+=i;

}

printf("1에서 %d까지의 합: %d”, x, sum);

}

Page 190: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 184 -

보충문제 15.

문제 : switch연산 용 여 수 크 비 는 그램

프 래밍 소스

#include <stdio.h>

int main()

{

int X=3, Y=1;

switch(X<Y)

{

case 0:

printf("X가 더 큽니다.”);

break;

case 1:

printf("Y가 더 큽니다.”);

break;

}

}

보충문제 16.

문제 : * 3개 출 는 그램

프 래밍 소스

#include <stdio.h>

int main()

{ int i;

for(i=0; i<3; i=i+1) printf("*”);}

Page 191: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 185 -

보충문제 17.

문제 : for 용 여 단 출 는 그램

프 래밍 소스

#include <stdio.h>

int main()

{

int i;

int j;

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

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

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

}

보충문제 18.

문제 : while 용 여 * 3개 출 는 그램

프 래밍 소스

#include <stdio.h>

int main()

{

int i=0;

while(i<3)

{

printf("*”);

i++;

}

}

Page 192: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 186 -

보충문제 19.

문제 : 1에 수 지 는 그램

프 래밍 소스

#include <stdio.h>

int main()

{

int num;

int i=1;

int sum=0;

scanf("%d”, &num);

while(i<=num)

{

sum+=i;

i++;

}

printf("1에서 %d까지의 합: %d”, num, sum);

}

보충문제 20.

문제 : do~while 용 여 수 만큼 * 출 는 그램

프 래밍 소스

#include <stdio.h>

int main()

{

int Val;

int i;

do

{

printf("숫자 입력(0이면 끝): ”);

scanf("%d”, &Val);

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

printf("*”);

printf("\n”);

}while(Val!=0);

printf("끝~!”);

}

Page 193: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 187 -

보충문제 21.

문제 : 수 는 그램

프 래밍 소스

#include <stdio.h>

int sum_num(int a, int b)

{

int sum=a+b;

return sum;

}

int main()

{

int x, y;

int sum=0;

scanf("%d %d”, &x, &y);

sum=sum_num(x, y);

printf("%d과(와) %d의 합은 %d입니다.”, x, y, sum);

}

보충문제 22.

문제 : 수 큰 수 찾는 그램

프 래밍 소스

#include <stdio.h>

int max(a, b)

{

if(a>b)

return a;

else

return b;

}

int main()

{

int x, y;

scanf("%d %d”, &x, &y);

printf("%d와 %d 에 %d가 큽니다.”, x, y, max(x, y));

}

Page 194: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 188 -

보충문제 23.

문제 : 출 는 그램

프 래밍 소스

char change_A(char);char change_a(char);char input(void);int output(char);

int main(){ char result; printf("알 벳을 입력하세요.”); result=input(); if(result>=65 && result<=90) { result=change_A(result); output(result); } else if(result>=97 && result<=122) { result=change_a(result); output(result); } else

printf("입력을 잘못했습니다.”);}char change_A(char A){ A+=32; return A;}char change_a(char a){ a-=32; return a;}char input(void){ char a; scanf("%c”, &a); return a;}int output(char result){ printf("바 알 벳 %c”, result);}

보충문제 24.

문제 : 같 지역변수 출 는 그램

프 래밍 소스

#include <stdio.h>int func(void){ int X=5; printf("func에서 X는 %d입니다. \n”, X);}int main(){ int X=10; func(); printf("main에서 X는 %d입니다. \n”, X);}

Page 195: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 189 -

보충문제 25.

문제 : 변수 출 는 그램

프 래밍 소스

#include <stdio.h>int func(int);int main(){ int x=1; func(x); printf("main()함수에서의 x값: %d \n”, x);}int func(int a){ int x; x=a+1; printf("func()함수에서의 x값: %d \n”, x); return;}

보충문제 26.

문제 : 같 지역변수 연산 출 는 그램

프 래밍 소스

#include <stdio.h>

int X=0;

int X_plus(void)

{

X++;

}

int main()

{

printf(“첫번째 X값 : %d \n”, X);

X++;

printf(“두번째 X값 : %d \n”, X);

X_plus();

printf(“세번째 X값 : %d \n”, X);

}

Page 196: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 190 -

보충문제 27.

문제 : 재귀 수 용 여 “안 요” 5 출 는 그램

결과 :

프 래밍 소스

#include <stdio.h>

int func(int x)

{

printf("안녕하세요 \n”);

if(x!=1)

func(x-1);

}

int main()

{

func(5);

}

보충문제 28.

문제 : 토리얼 수 용 여 수 토리얼 는 그램

프 래밍 소스

#include <stdio.h>

int facto(int n);

int main()

{

int a;

scanf("%d”, &a);

printf("%d팩토리얼 = %d\n”, a, facto(a));

}

int facto(int n)

{

if(n<=1)

return (1);

else

return (n* facto(n-1));

}

Page 197: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 191 -

보충문제 29.

문제 : 매크 수 용 여 수 평균 는 그램

프 래밍 소스

#include <stdio.h>

#define PLUS(X, Y) (X+Y)/2

int main()

{

int sum;

int X=8, Y=10;

sum=PLUS(X, Y);

printf("%d, %d의 평균은 %d \n”, X, Y, sum);

}

보충문제 30.

문제 : if~else 용 여 변경 여 출 는 그램

프 래밍 소스

#include <stdio.h>

char f(char x)

{

if (x>=65 && x<=96) return x+32;

else return x;

}

int main()

{

char x;

char y;

scanf("%c”, &x);

y=f(x);

printf(" 문자 %c를 소문자로 바꾸면 %c입니다. \n”, x, y);

}

Page 198: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 192 -

보충문제 31.

문제 : 가 5 int 열 언 후 첫 째 열 요 94, 87, 90, 100, 95

값 차 니다. 그리고 복 사용 여 열에 장 모든 열 요

과 평균 는 그램 작 시 .

결과 :

프 래밍 소스

#include<stdio.h>

int main( )

{

int arr[5]={94, 87, 90, 100, 95};

int i, sum=0;

double avg;

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

{

sum+=arr[i];

}

avg=(double)sum/5;

printf("배열 요소의 총 합은? :

%d\n”,sum);

printf("배열 요소의 평균은? :

%.2f\n”,avg);

return 0;

}

보충문제 32.

문제 : 가 10 int 열 언 후 10개 수 값 아 열에 장

다. 수 값 수 값만 출 는 그램 작 시 .

프 래밍 소스

#include<stdio.h>

int main( )

{

int arr[10];

int i;

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

{

printf("%d번째 정수값을 입력하세요 :

”,i+1);

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

}

printf("입력된 값 의 홀수값은 : ”);

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

{

if(arr[i]%2!=0)

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

}

return 0;

}

Page 199: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 193 -

보충문제 33.

문제 : 가 10 int 열 언 후 10개 수 값 아 열에 장

다. 수 값 값 출 는 그램 작 시 .

프 래밍 소스

#include<stdio.h>

int main( )

{

int arr[10];

int i, max;

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

{

printf("%d번째 정수값을

입력하세요 : ”,i+1);

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

}

max=arr[0];

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

{

if(max<arr[i])

max=arr[i];

}

printf("입력된 값 의 최 값 :

%d\n”,max);

return 0;

}

보충문제 34.

문제 : 열에 장 열 char str[6]="hello"; 같 열 열 "olleh"

같 거꾸 출 는 그램 작 시 .

결과 :

프 래밍 소스

#include<stdio.h>

int main(void)

{

int i;

char temp;

char str[6]="hello”;

printf("//**변경 문자열**//\n ”);

printf("%s\n”,str);

printf("//** 변경후 문자열**//\n”);

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

{

temp=str[i];

str[i]=str[4-i];

str[4-i]=temp;

}

printf("%s\n”,str);

}

Page 200: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 194 -

보충문제 35.

문제 : 어 단어 아 그 에 아스키 드 값 가장 큰 출 시 .

결과 :

프 래밍 소스

#include <stdio.h>

int main()

{

int i,len=0;

char str[50];

char max=0;

printf(" 어 단어를 입력하시오 : ”);

scanf("%s”,str);

while(str[len]!='\0')

len++;

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

{

if(max<str[i])

max=str[i];

}

printf("ASCII code 값이 가장 큰 문자는 :

%c”, max)

return 0;

}

보충문제 36.

문제 : 포 변수 개 int 변수 언 고 변수에 100 장

니다. 그리고 포 변수 언 여 포 가 int 변수 가리키도 니다. 변수

주 값, 변수에 장 값, 포 가 가리키는 변수 주 값, 포 가 가리키는 변수에

장 값 출 는 그램 작 시 .

결과 :

프 래밍 소스

#include <stdio.h>

int main()

{

int num=100;

int *ptr;

ptr=&num;

printf("num: %d\n”,num);

printf("&num:%d\n”,&num);

printf("*ptr: %d\n”,*ptr);

printf("ptr: %d\n”,ptr);

return 0;

}

Page 201: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 195 -

보충문제 37.

문제 : 개 수 아 각각 다 변수에 장 후, 변수 가 키는 포

언 다. 포 변수 용 여 값 10씩 감 시키는 그램 작 고 각 변수

값 출 시 .

결과 :

프 래밍 소스

#include <stdio.h>

Int main()

{

int num1, num2;

int *ptr1, *ptr2;

ptr1=&num1;

ptr2=&num2;

printf("/** 두 정수를 입력하시

오.**/\n”);

scanf("%d %d”,&num1, &num2);

printf("입력된 정수값 num1: %d,

num2:%d\n”,*ptr1,*ptr2);

*ptr1+=10;

*ptr2+=10;

printf("10이 증가한 정수값 num1:%d,

num2:%d\n”,*ptr1, *ptr2);

return 0;

}

보충문제 38.

문제 : 개 수 아 각각 다 변수에 장 후, 변수 가리키는 포

언 다. 포 변수 용 여 변수에 장 값 꾼 후 출 는

그램 작 시 .

결과 :

프 래밍 소스

#include <stdio.h>

int main()

{

int num1, num2, temp;

int *ptr1=&num1;

int *ptr2=&num2;

printf("/** 두 정수를 입력하시오.**/\n”);

scanf("%d %d”,&num1, &num2);

printf("입력된 정수값 num1: %d,

num2:%d\n”,*ptr1,*ptr2); temp=ptr1;

ptr1=ptr2;

ptr2=temp;

printf("값이 바 num1:%d,

num2:%d\n”,*ptr1, *ptr2); return 0;

}

Page 202: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 196 -

보충문제 39.

문제 : 다 수 값들 열 요 값 여 에 값과 값 는

그램 작 시 (포 용 시 )

: 20, 56, 47, 98, 35, 57, 11, 26, 50, 88

결과 :

프 래밍 소스

#include <stdio.h>

int main()

{

int i, max, min, len=0;

int arr[10]={20, 56, 47, 98, 35, 57,

11, 26, 50, 88};

int *ptr=arr;

max=min=*ptr;

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

{

if(min>*(ptr+i))

min=*(ptr+i);

if(max<*(ptr+i))

max=*(ptr+i);

}

printf("최소값: %d, 최 값:%d”,min, max);

return 0;

}

보충문제 40.

: 다 열에 장 값들 차순 는 그램 작 시 . (단, 포

변수 사용 시 ) 20, 56, 47, 98, 35, 57, 11, 26, 50, 88

결과 :

프 래밍 소스

#include <stdio.h>

int main()

{

int i, j, temp;

int arr[10]={20,56,47,98,35,57,11,26,50,88};

int *ptr=arr;

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

{

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

{

if(*(ptr+i)>*(ptr+j))

{

temp=*(ptr+i);

*(ptr+i)=*(ptr+j);

*(ptr+j)=temp;

}

}

}

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

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

return 0;

}

Page 203: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 197 -

보충문제 41.

문제 : 다 열에 장 값들 앞 달리 블 용 여 차순

는 그램 작 시 .

: 20, 56, 47, 98, 35, 57, 11, 26, 50, 88

결과 :

프 래밍 소스

#include <stdio.h>

int main()

{

int i, j, temp;

int arr[10]={20,56,47,98,35,57,11,26,50,88};

int *ptr=arr;

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

{

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

{

if(*(ptr+i)>*(ptr+j))

{

temp=*(ptr+i);

*(ptr+i)=*(ptr+j);

*(ptr+j)=temp;

}

}

}

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

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

return 0;

}

보충문제 42.

문제 : 가 10 int 열 언 후 10개 수 값 아 열에 장

다. 포 트 변수 언 고 고 그 값 출 시 .

프 래밍 소스

#include<stdio.h>

int main( )

{

int arr[10];

int i,sum=0;

int *ptr=arr;

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

{

printf("%d번째 정수값을 입력하세요 :

”,i+1);

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

}

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

{

sum+=*(ptr+i);

}

printf("배열 요소의 총합 :

%d\n”,sum);

return 0;

}

Page 204: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 198 -

보충문제 43.

문제 : 10 열 arr 언 고 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

다 값 순 거꾸 꾸는 그램 작 고 출 시 . 열 앞과 뒤 가리

키는 포 변수 개 언 고 용 시 .

결과 :

프 래밍 소스

#include <stdio.h>int main(){ int i, temp, len; int arr[10]={1, 2, 3, 4, 5, 6, 7, 8,

9, 10}; int *sptr=&arr[0]; int *lptr=&arr[9]; len=sizeof(arr)/sizeof(int); for(i=0;i<len/2;i++) {

temp=*sptr; *sptr=*lptr; *lptr=temp; sptr++; lptr--; }

for(i=0;i<10;i++) printf("%3d”,arr[i]); return 0;}

보충문제 44.

문제 : 다 과 같 열 장 었 열 첫 째 'b' 'g' 꾸는

그램 작 시 . 만약 꿀 수 없다 그 에 시 .

료) char str1[ ]="blueberry";

char str2="blueberry";

결과 :

str2[0]=‘g';는 상수 태 열 변경 가능 다. 컴 에러 생

프 래밍 소스

#include <stdio.h>int main( ){ char str1[]="blueberry”; char *str2="blueberry”; printf("str1 : %s\n”,str1); printf("str2 : %s\n”,str2); str1[0]='g'; printf("str1 : %s\n”,str1); str2[0]='g'; //상수 형태의 문자열이므로 컴 일 에러 printf("str2 : %s\n”,str2); return 0;}

Page 205: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 199 -

프 래밍 소스

#include <stdio.h>int ninebynine(int *n);int main(){ int a; printf("원하는 단을 입력하세요 : ”); scanf("%d”,&a);

ninebynine(&a); return 0;

보충문제 45.

문제 : 1개 int 매개 변수 사용 여 출 시 수 값 달 아 1증가시킨 후

는 수 increment1() 만들고, main() 수에 출 는 그램 작 시

. 그리고 수 출 변수 값, 수 출 후 변수 값과 1 증가 결과 값 출 시 .

결과 :

프 래밍 소스

#include <stdio.h>

int increment1(int n);

int main()

{

int a=100, result;

printf("함수 호출 후 a 값:%d\n”,a);

result =increment1(a);

printf("함수 호출 후 a 값:%d\n”,a);

printf("함수 호출 후 1 증가한 result

값:%d\n”,result);

return 0;

}

int increment1(int n)

{

return (n+1);

}

보충문제 46.

문제 : 단 작 는 수 작 고 main 수에 수 출 시에는 값

원 는 단만 달 여 그 단만 출 는 그램 작 시 .(매개변수 포 변

수 사용 시 )

결과 :

Page 206: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 200 -

}

int ninebynine(int *n){ int i; printf("/** %d단 **/”,*n); printf("\n”);

for(i=1;i<=9;i++) { printf("%2d *%2d =%3d\n”,*n,i,*n*i); }}

보충문제 47.

문제 : 지 아 달 원 계산 여 는 수 작

고, main 수에 출 고 출 는 그램 작 시 .(매개변수 포 변

수 사용 요)

결과 :

프 래밍 소스

#include <stdio.h>

double circle_area(int *r);

int main(){ int r; double area;

printf("반지름을 입력하세요 : ”); scanf("%d",&r);

printf("원의 넓이는 : %.3f\n”,circle_area(&r));

return 0;}

double circle_area(int *r){ return(3.14*(*r)*(*r));}

Page 207: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 201 -

보충문제 48.

문제 : 수 아 달 그 수값 짝수 지 수 지 별 고

그 결과 출 는 수 작 고 main 수에 출 는 그램 작 시

.(매개변수 포 변수 사용 시 )

결과 :

프 래밍 소스

#include <stdio.h>

void even_or_odd(int *n);

int main()

{

int n;

printf("정수값을 입력하세요 : ”);

scanf("%d”,&n);

even_or_odd(&n);

return 0;

}

void even_or_odd(int *n)

{

if(*n%2==1)

printf("%d는(은) 홀수

입니다.\n”,*n);

else

printf("%d는(은) 짝수

입니다.\n”,*n);

}

보충문제 49.

문제 : 다 과 같 열 언 었 각 열 요 차 출 는 그램

작 시 . 열 출 showArray() 수에 고 main 수에

showArray 수 출 시 .

시 : char arr[]="Happy day!";

결과 :

Page 208: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 202 -

프 래밍 소스

#include <stdio.h>

void showArray(char *ptr, int n);

int main()

{

char arr[]="Happy day!”;

showArray(arr, sizeof(arr)/sizeof(char));

return 0;

}

void showArray(char *ptr, int n)

{

int i;

for(i=0;i<n-1;i++)

printf("arr[%d] : %c\n”,i,ptr[i]);

}

보충문제 50.

문제 : 시 열 요 값 에 값 는 수 작 고 main 수

에 출 고 그 결과 출 는 그램 작 시 .

시 : int arr[5]= {10, 2, 34 54, 1 };

결과 :

프 래밍 소스

#include <stdio.h>

int Max_arr(int *pArr, int n);

int main()

{

int arr[5]={10,2,34,54,1};

int max;

max=Max_arr(arr,

sizeof(arr)/sizeof(int));

printf("max:%d \n”,max);

return 0;

}

int Max_arr(int *pArr, int n)

{

int max, i;

max=pArr[0];

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

if(max<pArr[i])

max=pArr[i];

return max;

}

Page 209: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 203 -

보충문제 51.

문제 : 1 100 지 숫 나 아 달 그 수 지 짝수만

출 는 그램 작 시

(출 에 5개 단 출 시 )

결과 :

프 래밍 소스

#include <stdio.h>

int odd_num(int n);

int main()

{

int a;

printf("1부터 100까지 정수를 입력하세요 : ”);

scanf("%d”, &a);

odd_num(a);

return 0;

}

int odd_num(int n)

{

int i, j, count=0;

printf("*** %d까지 짝수를 구하는 로그램 *** \n”,n);

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

{

if(i%2==0)

{

printf("%4d”,i);

count++;

}

if((count%10)==0)

printf("\n");

}

}

Page 210: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 204 -

보충문제 52.

문제 : 1 100 지 숫 나 아 달 그 수 수 는

수 작 고, main 수에 출 여 출 는 그램 작 시 (단, 열

용 여 장 고, 출 에 5개 단 출 시 )

결과 :

프 래밍 소스

//main 함수 //

#include <stdio.h>

int prime_num(int n);

int arr[100];

int main()

{

int i, a;

int *ptr;

printf("1부터 100까지

정수를 입력하세요 : ”);

scanf("%d”, &a);

ptr=prime_num(a);

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

{

if(i%5==0)

printf("\n”);

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

}

return 0;

}

// prime_num 함수 //

int prime_num(int n)

{

int i, j, count=0;

printf("*** %d까지 소수를 구하는

로그램 *** \n”,n);

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

{

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

{

if( (i % j) == 0)

break;

}

if(i == j)

{

arr[count]=i;

count++;

arr[count]='\0';

}

}

return arr;

}

Page 211: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 205 -

보충문제 53.

문제 : 다 시 변수에 장 값 꾸는 수 작 고, main 수에

출 여 출 는 그램 작 시 .

시 : num1:100, num2:200, num3:300

결과 :

프 래밍 소스

#include <stdio.h>

void swap(int *ptr1, int *ptr2, int *ptr3);

int main()

{

int num1=100, num2=200, num3=300;

printf("변경 num1:%d, num2:%d, num3:%d\n”,num1, num2, num3);

swap(&num1, &num2, &num3);

printf("변경후 num1:%d, num2:%d, num3:%d\n”,num1, num2, num3);

return 0;

}

void swap(int *ptr1, int *ptr2, int *ptr3)

{

int temp;

temp=*ptr1;

*ptr1=*ptr2;

*ptr2=*ptr3;

*ptr3=temp;

}

Page 212: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 206 -

보충문제 54.

문제 : 변수 num에 장 갑 곱 계산 는 수 고, main 수에

출 고 결과 값 출 는 그램 작 시 (단, main 수에 달

num 주 값 달 는 Call-by-reference 작 시 )

결과 :

프 래밍 소스

#include <stdio.h>

int square(int *ptr);

int main()

{

int n, result;

printf("정수를 입력하세요:”);

scanf("%d”,&n);

result=square(&n);

printf("제곱값은 : %d ”,result);

}

int square(int *ptr)

{

int num=*ptr;

*ptr=num*num;

return *ptr;

}

보충문제 55.

문제 : 수 나 아 2진수 변 고 출 는 수 고,

main 수에 출 는 그램 작 시 .

결과 :

프 래밍 소스

#include <stdio.h>

void binary(int n);

int main()

{

int num;

printf("10진수 정수를 입력하세요 : ”);

scanf("%d”,&num);

binary(num);

return 0;

}

void binary(int n)

{

if(n>1)

binary(n/2);

printf("%d”,n%2);

}

Page 213: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 207 -

보충문제 56.

문제 : 가 가 5, 가 5 int 2차원 열 언 고, 각 열

스 요 에 수 아 장 시 . 장 났다 장 값 검증 출

는 그램 작 시 .

결과 :

프 래밍 소스

#include <stdio.h>

int main( )

{

int arr[3][3];

int i,j;

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

{

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

{

printf("%d행의 %d 번째 인덱스 요소 값 : ”,i+1, j+1);

scanf("%d”, &arr[i][j]);

}

}

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

{

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

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

printf("\n”);

}

}

Page 214: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 208 -

보충문제 57.

문제 : 2차원 열 언 고 별, 별 생 수 아 2차원 열에 장 고

출 는 그램 작 시 .

결과 :

프 래밍 소스

#include <stdio.h>

int main( )

{

int chungbuk[3][3];

int i,j;

int stu; //학년별 반별 학생수 입력

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

{

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

{

printf("%d학년 %d반 학생수 입력:”,

i+1, j+1);

scanf("%d”, &chungbuk[i][j]);

}

} //충북 학교 학년별 총학생수 출력

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

{

stu=0;

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

{

stu+=chungbuk[i][j];

}

printf("%d학년 체 수: %d\n”, i+1, stu);

}

return 0;

}

Page 215: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 209 -

보충문제 58.

문제 : 2차원 열에 2차원 열 요 들 모리 공간상에 어떻게 당 는지

다 시 2차원 열 요 들 주 값 출 는 그램 작 시 .

시 : int arr : arr[3][2]

결과 :

프 래밍 소스

#include <stdio.h>

int main( )

{

int arr[3][2];

int i, j;

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

{

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

printf("arr[%d][%d] : %x \n”,i, j,&arr[i][j]);

}

return 0;

}

Page 216: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 210 -

보충문제 59.

문제 : 2차원 열 다 시 과 같 열 요 에 어떻게 장 는

지 열요 출 는 그램 작 시 .

시 : int arr1[3][3]={{1},{2, 3},{4, 5, 6}};

int arr2[3][3]={1, 2, 3, 4, 5, 6, 7};

결과 :

프 래밍 소스

#include <stdio.h>

int main( )

{

int i, j;

int arr1[3][3]={{1},{2, 3},{4, 5, 6}};

int arr2[3][3]={1, 2, 3, 4, 5, 6, 7};

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

{

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

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

printf("\n”);

}

printf("\n”);

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

{

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

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

printf("\n”);

}

return 0;

}

Page 217: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 211 -

보충문제 60.

문제 : 2차원 열 다 시 과 같 열 요 에 어떻게 장 는

지 열요 출 는 그램 작 시 .

(단, 수 출 는 수 showArray 여 출 시 )

시 : int arr1[3][3]={{1},{2, 3},{4, 5, 6}};

int arr2[3][3]={1, 2, 3, 4, 5, 6, 7};

결과 :

프 래밍 소스

#include <stdio.h>

int showArray(int arr[][3],int a, int b);

int main( )

{

int arr1[3][3]={{1},{2, 3},{4, 5, 6}};

int arr2[3][3]={1, 2, 3, 4, 5, 6, 7};

showArray(arr1,3,3);

printf("\n”);

showArray(arr2,3,3);

return 0;

}

int showArray(int arr[][3], int a, int b)

{

int i, j;

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

{

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

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

printf("\n”);

}

}

Page 218: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 212 -

보충문제 61.

문제 : int arr[9][9] 2차원 열 언 여, 단 장 는 그램 작 시

(각 가 단 들어가게 작 시 )

결과 :

프 래밍 소스

#include <stdio.h>

int main( )

{

int i, j;

int arr[8][9];

//구구단 장

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

{

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

arr[i][j]=(i+2)*(j+1);

}

//구구단 출력

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

{

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

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

printf("\n”);

}

return 0;

}

Page 219: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 213 -

보충문제 62.

문제 : 다 시 과 같 변수 언 고 싱 포 각 변수 가리키도 후,

각 싱 포 에 장 주 값 꾸는 수 여 main 수에 출 는

그램 작 시 (단, 매개변수는 블포 언 시 )

시 : int num1=10, num2=20;

int *ptr1, *ptr2;

결과 :

프 래밍 소스

#include <stdio.h>

void pswap(int **p1, int **p2);

int main( )

{

int num1=100, num2=200;

int *ptr1, *ptr2;

ptr1=&num1, ptr2=&num2;

pswap(&ptr1, &ptr2);

//함수 호출 후의 값의 변화

printf("*ptr1 : %d \n”,*ptr1);

printf("*ptr2 : %d \n”,*ptr2);

return 0;

}

void pswap(int **p1, int **p2)

{

int *temp;

temp=*p1;

*p1=*p2;

*p2=temp;

}

return 0;

}

Page 220: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 214 -

보충문제 63.

문제 : 다 시 에 열 요 가장 큰 값 장 열 요 주 출 는

그램 작 시 .

시 : arr[5]={102,34,67,278,8};

결과 :

프 래밍 소스

#include <stdio.h>

Max_addr(int *arr, int n, int **maxptr)

{

int i, *max;

max=&arr[0];

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

{

if(*max<arr[i])

max=&arr[i];

}

*maxptr=max;

}

int main( )

{

int *maxPtr;

int arr[5]={102,34,67,278,8};

//함수 호출

Max_addr(arr,sizeof(arr)/sizeof(int),&maxPtr);

printf("가장 큰 값이 장된 배열 주소:%d\n”,&maxPtr);

return 0;

}

Page 221: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 215 -

보충문제 64.

문제 : 다 그래 스 보고 실 결과 시 .

결과 :

프 래밍 소스

#include <stdio.h>

int main()

{

int arr[3][3];

printf("%d\n”,arr);

printf("%d\n”,arr[0]);

printf("%d\n”,&arr[0][0]);

printf("\n”);

printf("%d\n”,arr[1]);

printf("%d\n”,&arr[1][0]);

printf("\n”);

printf("%d\n”,arr[2]);

printf("%d\n”,&arr[2][0]);

printf("\n”);

printf("sizeof(arr):%d\n”,sizeof(arr));

printf("sizeof(arr[0]):%d\n”,sizeof(arr[0]));

printf("sizeof(arr[1]):%d\n”,sizeof(arr[1]));

printf("sizeof(arr[1]):%d\n”,sizeof(arr[2]))

return 0;

}

Page 222: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 216 -

보충문제 65.

문제 : 2차원 열 언과 값 아래 같 각 별 열 요 값

여 출 는 그램 작 시 .(단, 는 수 고 main 수에

출 시 )

시 : int arr[3][3]={1, 2, 3, 4, 5, 6, 7, 8, 9};

결과 :

프 래밍 소스

#include <stdio.h>

void add_row(int arr[][3], int n);

int main()

{

int arr[3][3]={1, 2, 3, 4, 5, 6, 7, 8, 9};

add_row(arr,3);

return 0;

}

void add_row(int arr[][3],int n)

{

int i, j, sum=0;

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

{

sum=0;

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

sum+=arr[i][j];

printf("%d행의 합은 : %d\n”,i,sum);

}

}

Page 223: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 217 -

보충문제 66.

문제 : 다 시 과 같 2차원 열에 장 개 열 주 포 열에

고 용 여 열 출 는 그램 작 시 .

시 : char str[3][ ]={"Good morning",

"Good afternoon",

"Good evening" };

결과 :

프 래밍 소스

#include <stdio.h>

int main()

{

int i;

char str[3][20]={"Good morning”,

"Good afternoon”,

"Good evening” };

char *ptr[20];

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

ptr[i]=str[i];

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

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

return 0;

}

Page 224: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 218 -

보충문제 67.

문제 : getchar(), putchar() 수 사용 여 EOF 값 지

아 모니 에 출 는 그램 작 시 .

결과 :

프 래밍 소스

#include <stdio.h>

int main()

{

int ch;

while(1)

{

ch=getchar();

if(ch==EOF)

break;

putchar(ch);

}

return 0;

}

Page 225: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 219 -

보충문제 68.

문제 : fgets 수 사용 여 열 아 열 트 단 산

여 출 는 그램 작 시 .(단, 열 산 는 수 여 main 수에

출 도 시 )

결과 :

프 래밍 소스

#include <stdio.h>

#include <string.h>

int len_test(char* s);

int main()

{

char str[100];

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

fgets(str,sizeof(str), stdin);

printf("%d \n”, len_test(str));

return 0;

}

int len_test(char* s)

{

return strlen(s);

}

Page 226: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 220 -

보충문제 69.

문제 : 양 수 수 아 수 공약수 는 그램 작 시

(단, 공약수 는 수 고 main 수에 출 시 )

결과 :

프 래밍 소스

#include <stdio.h>

#include <math.h>

//int lcm(int a, int b);

int gcd(int a, int b);

int main()

{

int x, y;

printf("두 정수를 입력하세요 : ”);

scanf("%d %d”,&x, &y);

gcd(x,y);

return 0;

}

int gcd(int a, int b)

{

while (b != 0)

{

int temp = a % b;

a = b;

b = temp;

}

printf("최 공약수는 : %d”,a);

}

Page 227: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 221 -

보충문제 70.

문제 : 양 수 수 아 수 공 수 는 그램 작 시

(단, 공 수 는 수 고 main 수에 출 시 )

결과 :

프 래밍 소스

#include <stdio.h>

#include <math.h>

int lcm(int a, int b);

int gcd(int a, int b);

int main()

{

int x, y;

printf("두 정수를 입력하세요 : ”);

scanf("%d %d”,&x, &y);

printf("%d와 %d의 최소 공배수는 : %d”,x,y,lcm(x,y));

return 0;

}

int lcm(int a, int b)

{

int gcd_value = gcd(a, b);

if (gcd_value == 0)

return 0;

return abs( (a * b) / gcd_value );

}

int gcd(int a, int b)

{

while (b != 0)

{

int temp = a % b;

a = b;

b = temp;

}

return abs(a);

}

Page 228: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 222 -

보충문제 41.

문제 : 열 아 열 동 지 아닌지 별 는 그램 작 시

(strcmp 수 사용 시 )

결과 :

프 래밍 소스

#include <stdio.h>

#include <string.h>

int main()

{

char str1[30];

char str2[30];

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

fgets(str1,sizeof(str1),stdin);

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

fgets(str2,sizeof(str2),stdin);

if(!strcmp(str1,str2))

puts("두 문자열이 같습니다.”);

else

puts("두 문자열은 같지 않습니다.”);

return 0;

}

Page 229: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 223 -

보충문제 72.

문제 : 키보드 알 벳 아 가

변 출 주고, 가 변 출

는 그램 작 다. 출 에는 getchar 수 putchar 수 사용 다.

결과 :

프 래밍 소스

#include <stdio.h>

int cvt_char(int ch1);

int main()

{

int ch;

printf(" 문자 하나를 입력하세요 : ” );

ch=getchar( );

ch=cvt_char(ch);

putchar(ch);

return 0;

}

int cvt_char(int ch1)

{

int diff='a'-'A';

if(ch1>='A' && ch1<='Z')

return ch1+diff;

else if(ch1>='a' && ch1<='z')

return ch1-diff;

}

Page 230: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 224 -

보충문제 73.

문제 : 열 아 그안에 재 는 숫 들 는 그램 작 시

( , r#45H12는 4+5+1+2=12 출 )

결과 :

프 래밍 소스

#include <stdio.h>

#include <string.h>

int ch_int(char c);

int main()

{

char str[100];

int len, i;

int sum=0;

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

fgets(str,sizeof(str),stdin);

len=strlen(str);

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

{

if(str[i]>='1' && str[i]<='9')

sum+=ch_int(str[i]);

}

printf("숫자의 총 합 : %d\n”,sum);

return 0;

}

int ch_int(char c)

{

int value=1-'1';

return (c+value);

}

Page 231: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 225 -

보충문제 74.

문제 : 열 아 열 작 수 toupper, tolower 수 용 여

는 , 는 변 는 그램 작 시 (단, 변 는

수 고 main 수에 출 시 )

결과 :

프 래밍 소스

#include <stdio.h>

#include <string.h>

#include <ctype.h>

void convert(char *str);

int main()

{

char str[30];

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

fgets(str,sizeof(str),stdin);

convert(str);

printf("바 문자열 : %s\n”,str);

return 0;

}

void convert(char *str)

{

int i;

for(i=0;i<strlen(str);i++)

{

if(str[i]>=65 && str[i]<=90)

str[i]=tolower(str[i]);

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

str[i]=toupper(str[i]);

else

continue;

}

}

Page 232: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 226 -

보충문제 75.

문제 : 수 변수 개 갖는 체 고 체 변수 s1, s2, s3 언후에

체 변수 에 근 수 값 장 고 그 값 모 는 그램

작 시 .

결과 :

프 래밍 소스

#include <stdio.h>

struct number{

int a;

int b;

};

int main( )

{

struct number s1,s2;

int sum;

fputs("첫번째 number 값을 입력 : ”,stdout);

scanf("%d %d”,&s1.a, &s1.b);

fputs("두번째 number 값을 입력 : ”,stdout);

scanf("%d %d”,&s2.a, &s2.b);

/*입력 된 모든 값의 합 */

sum=s1.a+s1.b+s2.a+s2.b;

printf("모든 수의 합은 : %d”,sum);

return 0;

}

Page 233: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 227 -

보충문제 76.

문제 : x, y 갖는 체 언 고, 포 는 열 가 3

체 열 언 여 x, y 아 열에 장 후에 다시 출 는

그램 작 시 .

결과 :

프 래밍 소스

#include <stdio.h>

struct point{

int x;

int y;

};

int main ( )

{

int i;

struct point arr[3];

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

{

printf("x, y 좌표를 입력하세요..: ”);

scanf("%d %d”,&arr[i].x, &arr[i].y);

}

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

{

printf("[%d, %d]”, arr[i].x, arr[i].y);

}

return 0;

}

Page 234: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 228 -

보충문제 77.

문제 : 생 , , 나 장 수 는 본 료 변수 3개 갖는 체

고 체 변수 s1, s2, s3 언 후에 체 변수 에 근 값 장

고 그 값 모 출 는 그램 작 시 .( 체 변수는 체 열

언 시 )

결과 :

프 래밍 소스

#include <stdio.h>

struct student{

char name[20];

char stud_id[20];

int age;

};

int main ( )

{

struct student sArr[3];

int i;

for(i=0;i<3;i++) //data 입력

{

printf("학생의 이름, 학번, 나이 순으로 입력 : ”);

scanf("%s %s %d”,sArr[i].name, sArr[i].stud_id, &sArr[i].age);

}

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

{

printf("학생의 이름 : %s,”,sArr[i].name);

printf("학번 : %s,”,sArr[i].stud_id);

printf("나이 : %d \n”, sArr[i].age);

}

return 0;

}

Page 235: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 229 -

보충문제 78.

문제 : 다 시 과 같 체( 체 포 가 포 ) 사용 여

료 고 출 는 그램 작 시 .

시 : struct stu_info{ char addr[20]; char tel[20]; };

struct student { char name[20]; char stud_id[20]; struct stu_info *info; };

결과 :

프 래밍 소스

#include <stdio.h>

struct stu_info{

char addr[20];

char tel[20];

};

struct student{

char name[20];

char stud_id[20];

struct stu_info *info;

};

int main()

{

struct stu_info addinfo={"chungbuk”,"123-456”};

struct student cb={"Hong”,"123456”};

cb.info=&addinfo;

printf("name : %s\n”,cb.name);

printf("stud_id : %s\n”,cb.stud_id);

printf("addr : %s\n”,cb.info->addr);

printf("tel : %s\n”,cb.info ->tel);

return 0;

}

Page 236: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 230 -

보충문제 79.

문제 : 다 시 과 같 체( 체 신 포 경우) 사

용 여 료 고 출 는 그램 작 시 .

시 : struct student{ char name[20]; char stud_id[20]; struct student *friend;

};

결과 :

프 래밍 소스

#include <stdio.h>

struct student{

char name[20];

char stud_id[20];

struct student *friend;

};

int main()

{

struct student s1={"Hong”,"123456”};

struct student s2={"Kim”,"234567”};

s1.friend=&s2;

printf("Hong gil dong \n”);

printf("name : %s\n”,s1.name);

printf("stud_id : %s\n”,s1.stud_id);

printf("Hong's friend\n”);

printf("name : %s\n”,s1.friend->name);

printf("stud_id : %s\n”,s1.friend->stud_id);

return 0;

}

Page 237: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 231 -

보충문제 80.

문제 : 다 그래 스 보고 수 출 과 수 출 후 체 값 비

여 시 ( 그램 실 시키지 마시 )

* 체 call-by-reference 는

결과 :

프 래밍 소스

#include <stdio.h>

struct number{

int num1;

int num2;

};

void show(struct number aa);

void swap(struct number *ptr);

int main()

{

struct number a1={10,20};

show(a1);

swap(&a1);

show(a1);

return 0;

}

void show(struct number aa)

{

printf("num1:%d, num2:%d\n”,aa.num1, aa.num2);

}

void swap(struct number *ptr)

{

int temp;

temp=ptr->num1;

ptr->num1=ptr->num2;

ptr->num2=temp;

}

Page 238: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 232 -

보충문제 81.

문제 : 다 그램 체 복사 는 그램 다.

그램 실 시키지 말고 결과 값 시 .

결과 :

프 래밍 소스

#include <stdio.h>

struct number{

int num1;

int num2;

};

void show(struct number aa);

int main()

{

struct number a1={1,2};

struct number a2;

a2=a1;

show(a2);

return 0;

}

void show(struct number aa)

{

printf("num1:%d, num2:%d\n”,aa.num1, aa.num2);

}

Page 239: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 233 -

보충문제 82.

문제 : 다 시 과 같 체 시 수 용 여 료 고 출

는 그램 작 시 .

시 : struct number { int num1; int num2;

}; void show(struct number aa); // 료 출 는 수 struct number input(); // 료 는 수

결과 :

프 래밍 소스

#include <stdio.h>

struct number{

int num1;

int num2;

};

void show(struct number aa);

struct number input();

int main()

{

struct number data=input();

show(data);

return 0;

}

void show(struct number aa)

{

printf("num1:%d, num2:%d\n”,aa.num1, aa.num2);

}

struct number input()

{

struct number temp;

printf("두 수를 입력하세요 : ”);

scanf("%d %d”,&temp.num1,&temp.num2);

return temp;

};

Page 240: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 234 -

보충문제 83.

문제 : 'output.txt' 개 여 다 시 는 fputc fprintf 수 사

용 여 장 고 결 는 그램 작 시 .

시 : fputs("Welcome!!",file);

fprintf(file,"%d",num);

결과 :

프 래밍 소스

#include<stdio.h>

int main()

{

int num=50;

FILE *file=fopen("output.txt”,"wt”);

if(file==NULL)

{

printf(" 일을 열 수 없습니다!\n”);

return -1;

}

fputs("Welcome!!”,file);

fprintf(file,"%d”,num);

fclose(file);

return 0;

}

Page 241: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 235 -

보충문제 84.

문제 : 지시 fseek 수 사용 여 아래 같 그램 작 다.

그램 실 시키지 말고 결과 시 .

결과 :

프 래밍 소스

#include <stdio.h>

int main()

{

FILE *file=fopen("output.txt”,"wt”);

fputs("123456789”,file);

fclose(file);

file=fopen("output.txt”,"rt”);

fseek(file, -3, SEEK_END);

putchar(fgetc(file));

fseek(file, 3, SEEK_SET);

putchar(fgetc(file));

fseek(file, -3, SEEK_CUR);

putchar(fgetc(file));

fclose(file);

return 0;

}

Page 242: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 236 -

보충문제 85.

문제 : fgetc 수 사용 여 'data.txt' 5개 어 들여 출 는

그램 작 시 .

결과 :

프 래밍 소스

int main()

{

int ch, i;

FILE *file=fopen("data.txt”,"rt”);

if(file==NULL)

{

puts("file open failed!!”);

return -1;

}

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

{

ch=fgetc(file);

printf("%c \n”,ch);

}

fclose(file);

return 0;

}

Page 243: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 237 -

보충문제 86.

문제 : 'read.txt' ‘write.txt' 복사 는 그램 작 시 .(단, fgetc 수

feof 수 사용 여 작 시 .)

결과 :

프 래밍 소스

#include <stdio.h>

int main()

{

FILE *read=fopen("read.txt”,"rt”);

FILE *write=fopen("write.txt”,"wt”);

int ch;

if(read==NULL || write==NULL)

{

puts("file open failed!!”);

return -1;

}

while((ch=fgetc(read)!=EOF))

{

fputc(ch,write);

}

if(feof(read)!=0)

puts("file copy succeed!!”);

else

puts("file copy failed!!”);

fclose(read);

fclose(write);

return 0;

}

Page 244: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 238 -

보충문제 87.

문제 : 'read.txt' ‘write.txt' 복사 는 그램 작 시 .(단, fgets 수

feof 수 사용 여 작 시 .)

결과 :

프 래밍 소스

#include <stdio.h>

int main()

{

FILE *read=fopen("read.txt”,"rt”);

FILE *write=fopen("write.txt”,"wt”);

char str[30];

if(read==NULL || write==NULL)

{

puts("file open failed!!”);

return -1;

}

while(fgets(str,sizeof(str),read)!=NULL)

{

fputs(str, write);

}

if(feof(read)!=0)

puts("file copy succeed!!”);

else

puts("file copy failed!!”);

fclose(read);

fclose(write);

return 0;

}

Page 245: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 239 -

보충문제 88.

문제 : fscanf 수 사용 여 'student.txt' , , 나 아 모

니 에 출 는 그램 작 시 .

결과 :

프 래밍 소스

#include <stdio.h>

int main()

{

char name[10];

char stud_id[10];

int age;

FILE *file=fopen("student.txt”,"rt”);

int ch;

while(1)

{

ch=fscanf(file, "%s %s %d”,name, stud_id, &age);

if(ch==EOF)

break;

printf("이름 : %s, 학번 : %s, 나이 : %d \n”,name, stud_id,age);

}

fclose(file);

return 0;

}

Page 246: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 240 -

보충문제 89.

문제 : 숫 개수만큼 보나 수열 나열 는 그램 작 시 .(단,

보나 수열 결과는 'pibo.txt' 에 장 도 니다.)

결과 :

프 래밍 소스

#include <stdio.h>

int pibo(int n);

int main()

{

FILE *file=fopen("pibo.txt”,"wt”);

int i, n;

printf("출력할 피보나치 수열 갯수 입력 : ”);

scanf("%d”, &n);

fprintf(file,"%3d”,0);

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

fprintf(file,"%3d”,pibo(i));

printf("\n”);

fclose(file);

return 0;

}

int pibo(int n)

{

if(n==1 || n==2)

return 1;

return pibo(n-1) +pibo(n-2);

}

Page 247: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 241 -

리눅스 실전문제

Page 248: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고
Page 249: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 243 -

㉠ 컴 ㉡ 실 생 ㉢ 링크 ㉣ 스 드 작 ㉤ 목 생

리 스 실 문제

보충문제 1. 다음은 C언어에 한 설명이다. 잘못된 것은?

① 1972 경 UNIX 시스 개 목 만들어 다.

② 컴퓨 지 어가 가능 다.

③ 닉스용 그램 Winodws 용 그램 용 다.

④ mov, call 등 간단 어 어 어 간결 게 작 수 다.

⑤ 드웨어에 크게 지 않는 범용 그램 언어 다.

보충문제 2.C언어의 main()함수에 한 설명이다.올바른 것은?

① main() 수는 그램 실 시 운 체 에 출 는 그램 진

는 수다.

② main() 수는 없 에 어떠 결과값도 수 없다.

③ main() 수에 return 0; 비 상 료 상 미 다.

④ main() 수 내 에 는 수만 출 수 다.

⑤ stdio.h는 main() 수 출 포 야 는 헤 다.

보충문제 3.C 로그램의 작성과정의 각 단계들을 나열한 것이다.그 순서로 올

바른 것을 고르시오.

① ㉠ ㉡ ㉢ ㉣ ㉤ ② ㉢ ㉣ ㉤ ㉠ ㉡ ③ ㉡ ㉢ ㉤ ㉠ ㉣

④ ㉠ ㉣ ㉢ ㉤ ㉡ ⑤ ㉣ ㉠ ㉤ ㉢ ㉡

보충문제 4. 다음의 ‘printf() 함수 사용 ’ 에서 바르지 못한 것은?

① printf("Hello, world\n"); ② printf("%d\n",1234);

③ printf("%d %f\n",10,20); ④ printf("%s","C Programming");

⑤ printf("Good \nmoring \neverybody\n");

보충문제 5. 다음과 같이 출력되는 printf() 함수는?

① printf(" 동\n \t 동\n 동\n");

② printf(" 동/n 동/n 동/n");

③ printf(" 동\n 동\n 동\n");

④ printf(" 동\n 동\n 동\n");

⑤ printf(" 동\n \n 동\n 동\n");

Page 250: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 244 -

보충문제 6.다음 주석처리가 바르지 못한 것은?

① // 것 주 니다.

② /* 것 주 니다. */

③ /* 것 주 니다. // 것도 주 니다. */

④ /* 것 주 니다. /* 것도 주 니다. */*/

⑤ // 것 주 니다. // 것도 주 니다.

보충문제 7.다음 로그램의 출력 결과로 올바른 것은?

#include <stdio.h>

int main(void)

{

int num1=10;

int num2=(num1--)+2;

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

return 0;

}

① 912 ② 1012 ③ 1112 ④ 911 ⑤ 1011

보충문제 8. 다음 그림과 같이 출력하는 printf() 함수로 올바른 것은?

① printf("C언어에 개 나타내는 특수 는 \n 니다.\n알겠죠?\n");

② printf("C언어에 개 나타내는 특수 는 /n 니다.\n알겠죠?\n");

③ printf("\‘C언어에 개 나타내는 특수 는 \n 니다.\’\n알겠죠?\n");

④ printf("C언어에 개 나타내는 특수 는 \nn 니다.\n알겠죠?\n");

⑤ printf("C언어에 개 나타내는 특수 는 \\n 니다.\n알겠죠?\n");

보충문제 9.다음 그림과 같이 출력하기 해 ★에 들어갈 서식문자열로 올바른 것은?

#include <stdio.h>

int main(void)

{

printf("★", "AAA", "BBB", "CCC");

return 0;

}

① %c %c %c \n ② %d %d %d \n ③ %s, %s, %s \n

④ %o, %o, %o \n ⑤ %x, %x, %x \n

Page 251: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 245 -

보충문제 10.다음과 같이 변수를 선언하 다.잘못된 설명을 고르시오.

int aa;

① 변수 aa 다.

② 32비트 컴퓨 에 변수 크 는 4 트 다.

③ 는 수 장 수 다.

④ 변수에는 수만 장 가능 고, 실수나 장 지 못 값 장 다.

⑤ 16비트 컴퓨 에 변수 크 는 2 트 다.

보충문제 11.다음 C언어의 식별자로 바르지 못한 것을 고르시오.

① worldCup 2010 ② ABC ③ numberjumps ④ A124 ⑤ var

보충문제 12. 다음 코드를 수행한 후, 변수 i와 j에 각각 20, 30이 장되었다고

할 때, 바르지 못한 입력 방법은?

int main() {

int i, j;

scanf("%d%d",&i,&j

);

return 0;

}

① ②

③ ④ ⑤

보충문제 13. 다음은 1개의 양의 정수를 입력 받고, 입력받은 정수개 만큼 3의 배

수를 출력하는 로그램이다. ★에 들어갈 올바른 코드는?

#include <stdio.h>int main(void){ int num=0, cnt=0; scanf("%d",&num); while( ★ ) { printf("%d ",3*cnt); } return 0;}

① cnt<num ② cnt>num ③ ++cnt<num ④ cnt++<num ⑤ (cnt+1)<num

Page 252: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 246 -

보충문제 14. 다음은 3개의 정수를 입력받아 덧셈 결과를 출력하는 로그램이다.

다음 입력 형태로 바르지 못한 것은?

#include <stdio.h>

int main(void)

{

int result;

int num1, num2, num3;

printf(" 개 수 : ");

scanf("%d %d %d", &num1, &num2, &num3);

result=num1+num2+num3;

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

return 0;

}

①②

③ ④

보충문제 15.다음 조건식의 의미와 코드가 잘못된 것을 고르시오.

미 건식

① a가 50 상 고

100미만 다

(a>=50) && (a<100)

② (50<=a<100)

b가 0도 1도 아니다

(b!=0) && (b!=1)

④ !(b==0) && !(b==1)

⑤ !((b==0) || (b==1))

Page 253: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 247 -

#include <stdio.h>

int main()

{

int N = 0;

printf( " 수 : " );

scanf( "%d", &N );

if( ★ )

printf( "결과: 수\n" );

else

printf( "결과: 짝수\n" );

return 0;

}

① N/2 == 0

② N%2

③ N%2 == 0

④ !N%2

⑤ N/2

#include <stdio.h>

int main()

{

char ch='A';

int i;

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

{

★ ;

}

return 0;

}

① printf("%c",ch)

② printf("%c",ch+i)

③ printf("%c",i)

④ printf("%c",(ch+1)+i)

⑤ printf("%c",(i+1))

보충문제 16.다음은 정수 한 개를 입력받아,짝수인지 홀수인지 별하는 로그

램이다.★에 들어갈 올바른 코드를 고르시오.

보충문제 17. 다음은 문자 ‘A’부터 ‘Z’까지 출력하는 로그램이다. ★에

들어갈 올바른 코드는?

Page 254: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 248 -

#include <stdio.h>

int main(void)

{

int n;

printf("0 상 수 : ");

scanf("%d",&n);

switch( ★ )

{

case 0: printf("0 상 10미만\n"); break;

case 1: printf("10 상 20미만\n"); break;

case 2: printf("20 상 30미만\n"); break;

default: printf("30 상\n");

}

return 0;

}

① n

② n/10.0

③ n/10

④ (double)(n/10)

⑤ n*10

보충문제 18. 다음 로그램은 입력받은 정수가 0이상 10미만인지, 10이상 20미

만인지, 20이상 30미만인지, 30이상인지를 출력하는 로그램이다.

★에 들어갈 올바른 코드는?

보충문제 19.다음은 입력값의 값을 구하는 로그램이다.㉠,㉡,㉢에 들어

갈 올바른 코드는?

#include <stdio.h>

int main(void)

{

int num, abs;

printf(" 수 : ");

scanf("%d", &num);

abs = ( ㉠ ) ? ㉡ : ㉢ ;

printf(" 값: %d \n", abs);

return 0;

}

① ㉠ num<0 ㉡ num ㉢ num*(-1)

② ㉠ num>0 ㉡ num ㉢ num*(-1)

③ ㉠ num>0 ㉡ num*(-1) ㉢ num

④ ㉠ num>0 ㉡ num*(-1) ㉢ num*(-1)

⑤ ㉠ num<0 ㉡ num ㉢ num

Page 255: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 249 -

보충문제 20다음 로그램의 처음과 마지막에 출력되는 값으로 올바른 것을 고

르시오.

#include <stdio.h>

int main()

{

int num=0;

while(num<=20){

printf("%d\n",++num);

}

return 0;

}

① 0, 20 ② 0, 21 ③ 1, 20 ④ 1, 21 ⑤ 0, 1

보충문제 21. 다음은 1+2+3+...+n의 결과가 최 로 5000을 넘길 때의 n을 출력하는

로그램이다. 코드 if(sum>5000) break;가 들어갈 올바른 치는?

#include <stdio.h>

int main(void)

{

int sum=0, n=1;

while(1)

{

sum+=n;

n++;

}

printf(" 계: %d \n", sum);

printf(" 5000 는 n: %d \n", n);

return 0;

}

Page 256: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 250 -

#include <stdio.h>

int main()

{

int count = 1, num;

double total=0.0, average;

while(count<=4){

scanf("%d",&num);

total+=num;

++count;

}

printf("%d\n",count);

printf("%f\n",average);

return 0;

}

① average = total / (count-1);

② average = total / count;

③ average = total / (count+1);

④ average = total / num;

⑤ average = total / (num+1);

#include <stdio.h>

int main()

{

int num=0;

while(num<=20){

printf("%d\n",++num);

}

return 0;

}

① 0, 20

② 0, 21

③ 1, 20

④ 1, 21

⑤ 0, 1

보충문제 22. 다음은 총 4개의 데이터를 입력하여, 그 평균을 구하는 로그램이

다. ★에 들어갈 코드라인으로 올바른 것을 고르시오.

보충문제 23. 다음 로그램의 처음과 마지막에 출력되는 값으로 올바른 것을 고

르시오.

Page 257: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 251 -

#include <stdio.h>

int main(void)

{

int i,j;

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

{

for(j=0; ㉠; j++)

{

printf("#");

}

㉡ ;

}

return 0;

}

<출 결과>

$

#$

##$

###$

####$

① ㉠ j<i ㉡ printf("$\n")

② ㉠ j<5 ㉡ printf("$\n")

③ ㉠ j<5 ㉡ printf("$")

④ ㉠ j<=i ㉡ printf("$\n")

⑤ ㉠ j<=5 ㉡ printf("$")

#include <stdio.h>

int main(void)

{

int total=0, num;

int i;

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

{

do

{

printf("1 상 수 : ");

scanf("%d", &num);

}while( ★ );

total+=num;

}

printf(" 계 : %d\n",total);

return 0;

}

<출 결과>

① total>1 ② num!=1

③ num>0 ④ num>=1

⑤ num<1

보충문제 24. 다음은 1이상의 정수 5개를 입력받아서 그 합을 출력하는 로그램

이다. ★에 들어갈 올바른 코드는? 단, 1미만의 수가 입력되는 경우

이를 입력으로 인정하지 않고 다시 입력받는 과정을 수행해야 한다.

보충문제 25. 다음과 같이 출력하기 해 ㉠과 ㉡에 들어갈 올바른 코드는?

Page 258: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 252 -

#include <stdio.h>

int main(){

int i, j, nValue;

i = 0;

while( i < 100 )

{

printf( "%4d", ★);

if(i%10==9)

printf("\n");

i++;

}

return 0;

}

<출 결과>

※ 26~27번은 다음 코드를 보고 답하시오.

보충문제 26. 다음 그림과 같이 출력하려고 할 때, ★에 들어갈 올바른 코드 라인

을 고르시오.

① (i%10)*10+i/10 ② (i/10)*10+i/10 ③ (i/10)*10+i%10 ④ (i*10)/10+i%10

⑤ (i/10)*10+i*10

보충문제 27. 마이콜은 15번 코드를 응용해서 다음 그림과 같이 출력하는 로그

램을 작성해 보았다. ★에 들어갈 올바른 코드 라인을 고르시오.(간단히 작성할

수도 있지만, 마이콜은 15번 코드를 최소한의 수정으로 그림과 같이 출력하려고

한 것이다. 마이콜은 참 OTL이다!)

① (i%10)*10+i/10 ② (i/10)*10+i/10 ③ (i/10)*10+i%10

④ (i*10)/10+i%10 ⑤ (i/10)*10+i*10

Page 259: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 253 -

※ 28번~29번은 n*n의 달팽이 숫자를 출력하는 다음 로그램을 보고 답하시오.

단, n은 100이하의 자연수다.

#include<stdio.h>

int main(void) {

int x, y; int cnt, num, direction;

int m, n, i, j; int array[100][100];

scanf("%d",&n);

cnt=1; direction=1;

x=0; y=-1;

while(n!=0)

{

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

y+=direction;

array[x][y]=cnt++;

}

㉠ ;

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

x+=direction;

array[x][y]=cnt++;

}

㉡ ;

}

// array 열 값 릿수에 맞게 게

// 출 다고 가 ,

// 출 과 드는 생략 .

return 0;

}

<출 결과 1 : n 5 경우><출 결과 2 : n 8 경우>

Page 260: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 254 -

#include <stdio.h>

#define M 10

#define N 6

int main(void){

int a[]={2,4,5,7,8,10,15,20,30, 40},b[]={6,10,11,25,33,35}, c[M+N];

int i, j, p;

i=j=p=0;

while (i<M && j<N){

if (a[i]<b[j]){

c[p++]=a[i++];

}else if (a[i]==b[j]){

}else{

c[p++]=b[j++];

}

}

<출 >

while (i<M) c[p++]=a[i++];

while (j<N) c[p++]=b[j++];

for (i=0; ㉡; i++) printf("%d ",c[i]);

printf("\n");

return 0;

}

보충문제 28. ㉠에 들어갈 올바른 코드는?

① n++ ② n-- ③ n+=2 ④ n-=2 ⑤ n=n-i

보충문제 29. ㉡에 들어갈 올바른 코드는?

① direction*=2 ② direction+=1 ③ direction*=-1

④ direction-=1 ⑤ direction%=2

※ 30~31번은 다음의 합집합을 구하는 로그램을 보고 답하시오.

보충문제 30. ㉠에 들어갈 올바른 코드는?

① c[p]=a[i]; ② c[p++]=a[i++]; ③ c[p++]=b[i++]; j++;

④ c[p++]=a[i++]; j++; ⑤ c[p++]=b[j++];

보충문제 31. ㉡에 들어갈 올바른 코드는?

① i<M+N ② i<p ③ i<M ④ i<N ⑤ i<M-N

Page 261: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 255 -

보충문제 32. 다음은 0~100 사이의 수를 10 간격으로 나 어 11등 으로 도수

분포를 나타내는 로그램이다. 단, 0~9는 0등 , 10~19는 1등 , ....

, 90~99는 9등 , 100은 10등 이다. ㉠에 들어갈 올바른 코드는?

#include <stdio.h>

#define Num 20

int main(void){

int a[]={35,25,56,78,43,66,71,73,80,90,0,73,35,65,100,78,80,85,35,50};

int i, histo[11];

for (i=0;i<=10;i++) histo[i]=0;

for (i=0;i<Num;i++) ㉠ ;

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

printf("%3d - :%3d\n",i*10,histo[i]);

return 0;

}

① ++histo[Num/10] ② histo[i/10]++ ③ histo[a[i]/10]++

④ histo[i%10]++ ⑤ ++histo[10]

※ 33번~34번은 다음 로그램을 보고 답하시오.

#include <stdio.h>

int isSorted(int a[], int size){

int i;

int isSwap=0;

for(i=0;i<size-1;i++){

if( ㉠ ) break;

}

if( ㉡ ) return 1;

return 0;

}

int main(void){

static int a[]={20,35,40,41,80,90};

if(isSorted(a, 6))

printf("a 열 차순 상태 니다.\n");

else

printf("a 열 아직 차순 안 상태 니다.\n");

}

Page 262: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 256 -

#include <stdio.h>int main(){ int arr[3][9]; int i,j; for(i=0;i<3;i++) { for(j=0;j<9;j++) { arr[i][j]=㉠; } } for(i=0;i<3;i++) { for(j=0;j<9;j++) { printf("%4d",arr[i][j]); } printf("\n"); } return 0;}

<출 결과>

보충문제 33. ㉠에 들어갈 올바른 코드는?

① a[i]<a[i-1] ② a[i]<a[size] ③ a[i]>a[i+1] ④ a[i]<a[i+1] ⑤ a[i]>a[j]

보충문제 34. ㉡에 들어갈 올바른 코드는?

① i==size+1 ② i==size-1 ③ i==size ④ !isSwap ⑤ isSwap

보충문제 35. isSorted 함수와 가장 유사한 정렬 알고리즘은?

① 택 ② 거 ③ 쉐 커 ④ 삽 ⑤

보충문제 36. 다음은 int형 2차원 배열을 선언하여 구구단 4단, 6단, 8단을

장하는 로그램이다. ㉠에 들어갈 올바른 코드는?

① (i+2)*(j+1) ② (i+4)*(j+1) ③ (i+4)*j

④ (i*2+4)*(j+1) ⑤ (i*4+2)*(j+1)

Page 263: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 257 -

보충문제 37. 다음은 입력값의 계승을 구하는 로그램이다. ★에 들어갈 올바른

코드?

#include <stdio.h>

int fact(int n)

{

int result;

if(n<=1) result=1;

else ★ ;

return result;

}

int main(void)

{

int n;

scanf("%d",&n);

printf("%d 계승 %d\n",n,fact(n));

return 0;

}

① return n; ② else n; ③ n*fact(n-1)

④ result=n*fact(n-1) ⑤ return fact(n-1)

보충문제 38. 다음은 재귀를 이용하여 피보나치 수열의 n번째 항을 구하는 함수

다. 이 로그램의 비효율성을 가장 바르게 지 한 것은?

int fibo(int n){

if(n==1||n==2) return 1;

else return fibo(n-1)+fibo(n-2);

}

① 재귀 탈출 건 잘못 경우 재귀 출 는

② 수 출시 스택에 지역변수, 매개변수, 주 가 장 고 수 료시 출

다시 돌아 는 과 에 CPU에 담 주는

③ 미 다시 복 는

④ 단순 복 용 경우 시 변수, 는 열 추가 요 에 공간 복

잡도가 라가는

⑤ 사 에 도달 지 가 다가 수가 복귀 지만 가

병 지 않는

Page 264: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 258 -

#include <stdio.h>

#define MAX(x,y) (((x)>(y))?(x):(y))

int A[1000000];

int mSum[1000000];

int mIndex[1000000];

int main() {

int n;

int i,mi;

int max;

freopen("input.txt","r",stdin);

freopen("output.txt","w",stdout);

scanf("%d",&n);

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

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

}

mSum[0]=A[0];

mIndex[0]=0;

max=mSum[0];

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

if((mSum[i-1]+A[i])>A[i]){

mSum[i]=mSum[i-1]+A[i];

}else{

mSum[i]=A[i];

mIndex[i]=i;

}

if(max<mSum[i]){

max=mSum[i];

mi=i;

}

}

printf("%d\n",max);

return 0;

}

보충문제 39. ㉠에 들어갈 올바른 코드는?

① mIndex[i]=mSum[i-1];

② mIndex[i]=mIndex[i-1];

③ mIndex[i]=mSum[i];

④ mIndex[i]=i-1;

⑤ mIndex[i]=1;

보충문제 40. ㉡에 들어갈 올바른 코드는?

① printf("%d:%d\n",mIndex[max],m;

② printf("%d:%d\n",mi,n);

③ printf("%d:%d\n",mIndex[mi],n);

④ printf("%d:%d\n",mIndex[mi],mi);

⑤ printf("%d:%d\n",mIndex[n],mi);

※ 39번, 40번은 다음 로그램을 보고 답하시오. 다음은 동 계획법을 이용하여

연속부분 최 합과 그 구간을 구하는 로그램이다. 단, 구간은 배열의 첨자를

기 으로 하며, 연속부분최 합의 구간이 2개 이상인 경우 앞의 구간을 출력

한다.

Page 265: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

- 259 -

정 답

문항 정답 문항 정답 문항 정답 문항 정답 문항 정답

1 ④ 2 ① 3 ⑤ 4 ③ 5 ⑤

6 ④ 7 ② 8 ⑤ 9 ③ 10 ④

11 ① 12 ② 13 ④ 14 ⑤ 15 ②

16 ② 17 ② 18 ③ 19 ② 20 ④

21 ③ 22 ① 23 ④ 24 ⑤ 25 ①

26 ① 27 ③ 28 ② 29 ③ 30 ④

31 ② 32 ③ 33 ③ 34 ② 35 ②

36 ④ 37 ④ 38 ③ 39 ② 40 ④

Page 266: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고
Page 267: 인 사 말 - cbedunet.or.krcbedunet.or.kr/home/file/140307_manual.pdf · 인 사 말 영국의 17살 고등학생 창업자 댈로이시오는 어렸을때부터 컴퓨터를 가지고

정보영재를 위한 리눅스C언어 길라잡이

발 행 인: 손 철(충청북도교육정보원 원장)

제작총 : 김병규(충청북도교육정보원 부장)

편집지도: 조창연(충청북도교육정보원 인턴장학사)

집필 원: 안희동(보은 동 등학교 교사)

최정수(청주공업고등학교 교사)

장원 (충북과학고등학교 교사)

편집 원: 안희동(보은 동 등학교 교사)

발 행 일: 2014년 2월 20일

발 행 처: 충청북도교육정보원

충북 청주시 흥덕구 청남로 1931(산남동 4-3)

http://www.cbei.go.kr