160
실전과제 & 연습문제

실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

Embed Size (px)

Citation preview

Page 1: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

실전과제 & 연습문제

Page 2: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아주는

C 프로그래밍 3rd Edition

실전과제 & 연습문제

저자

초판 인쇄

발행처

발행인

기획

편집

디자인

주소

전화

등록 번호

등록 일자

ISBN

가격

홈페이지

이메일

천정아

2016년 3월 1일

(주)앤아이컴즈

박남일

김찬기, 한두희

이재덕

인지영

경기도 고양시 일산동구 백마로 195 (장항동) 에스케이엠시티오피스 2층 2006호

070-7778-5003, 팩스 031)931-9876

제2015-000191호

2015년 10월 6일

978-11-957135-6-1 93000

5,000원

http://www.nicoms.co.kr

[email protected]

잘못 만들어진 책은 구입하신 곳에서 교환하여 드립니다.

이 책의 일부 혹은 전체를 복사하거나, 배포한 자에 대해서는 저작권 법 제136조에 의해서

5년 이하의 징역 또는 5천만원 이하의 벌금에 처하여 질 수 있습니다.

천정아

이화여자대학교 이학석사

前) LG전자기술원 주임연구원

前) LG정보통신 선임연구원

現) 삼성SDS 멀티캠퍼스 전임 교수

現) (주)베스트인프라 수석컨설턴트

저자 약력

Page 3: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

3rd Edition

천정아 저

실전과제 & 연습문제

Page 4: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

Preface

4

“개념을 콕콕 잡아주는 C 프로그래밍”의 Second Edition이 출간된 지도 벌써 4년이라는

시간이 지났습니다. 처음 C 책을 준비하면서 했던 어떻게 책을 써야 할까 고민하면서 가

장 많이 했던 생각을 다시 떠올려 봅니다.

“C가 어렵다는 선입견 때문에 배우기도 전부터 겁을 먹는 학생들에게

어떻게 하면 C의 진정한 가치를 느끼게 할 수 있을까?”

오랜 기간 학생들과 개발자들을 대상으로 C와 C++ 언어를 강의하면서 초보자들이 C/

C++ 언어를 배우는데 얼마나 많은 어려움을 느끼는지 지켜보면서, 초보자들이 어떻게

하면 C의 다양한 기능들을 보다 쉽게 받아들이고 이해할 수 있게 할지 고민을 많이 했습

니다.

다들 수학 공부하면서 많이 겪어보셨겠지만, 공식을 외워서 문제를 푸는 데는 한계가 있

습니다. C 언어도 마찬가지입니다. C의 문법이나 구문을 외우려고 들기 보다는 왜 이런 기

능이 필요한지, 왜 코드를 이렇게 작성할 수 밖에 없는지 이유를 알면 자연스럽게 C 언어

의 기능을 받아들일 수 있습니다. 예를 들어, 단순히 “함수는 무엇이다”부터 시작하는 게

아니라 “함수는 왜 필요할까?”, “함수는 어떤 경우에 사용하는 것일까?”, “함수를 사용

하면 어떤 점이 좋을까?”라고 먼저 생각해보는 것이 필요합니다. 그래서 이 책을 집필하

면서 가장 많이 신경 쓴 부분이 바로 이 부분입니다. “어떻게” 사용해야 하는지를 설명하

기 전에 먼저 “왜” 필요한지를 설명하는데 많은 노력을 들였습니다.

C 언어를 잘 사용하기 위해서는 제일 중요한 것이 기본적인 개념을 정확히 알고 이해하는

것입니다. 이 책에서는 C 언어의 기본 개념을 쉽게 전달할 수 있도록 다양한 예제 코드와

적절한 그림들을 많이 활용하였습니다. 또한, 간혹 C 책에서 굳이 몰라도 되는 복잡한 문

법들이 마치 중요한 것처럼 다루어지는 경우가 종종 있는데, 이런 부분들은 최대한 간단

히 다루거나 생략했습니다. C 프로그래밍을 잘하기 위해서는 문법적인 세부 사항보다 왜

이런 기능이 필요한지, 어떤 경우에 이 기능을 사용해야 하는 지를 이해하는 것이 더 중

요하기 때문입니다.

Page 5: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

5

개정판을 내면서 여러 교수님과 독자 분들이 의견을 반영해서 좀 더 다양한 예제를 다루

기 해서 노력을 했습니다. 또한, 아직 프로그래밍이 익숙하지 않은 초보자들을 위해서 문

제와 요구사항을 먼저 제시한 다음, 문제 해결에 도움이 되는 힌트를 제공하는 실전 과제

를 추가했습니다. 혼자 프로그램을 작성하기 힘든 초보자들은 실전 과제를 따라 하면서

프로그래밍을 익힐 수 있을 것입니다. “개념을 콕콕 잡아주는 C 프로그래밍”의 개정판을

위해 여러 가지 의견을 내주신 교수님들과 독자 분들께 다시 한번 감사 드립니다.

프로그래밍도 운동과 같습니다. 아무리 이론이 충분해도 직접 운동을 해보면 이론이 몸

에 적용되기까지 시간이 걸립니다. 마찬가지로 프로그래밍도 직접 해보기 전에는 내 것이

되지 않습니다. 따라서 가능하면 책에 있는 예제나 연습문제를 직접 작성하고 실행해 보

기를 권합니다. 눈으로만 봐서는 알 수 없는 부분이 분명히 있습니다. 직접 프로그래밍을

하면서 프로그래밍이란 무엇인지 여러분이 온몸으로 느껴볼 수 있기를 바랍니다.

끝으로 제가 쓴 원고가 좋은 책으로 거듭날 수 있도록 기획과 편집을 맡아주신 (주)앤아

이컴즈 한두희 상무님, 박남일 대표님, 김찬기 대리님, 그리고 모든 관계자 여러분께도 감

사 드립니다. 바쁜 일정 속에서 원고가 나올 때까지 인내(?)의 시간을 보내시느라 다들 고

생 많이 하셨습니다. 언제나 같은 자리에서 저를 지켜주는 남편과 지치지 않는 애교로 힘

든 집필 기간을 견딜 수 있도록 도와준 딸 서연이에게 사랑과 고마움을 전하고 싶습니다.

저자

Page 6: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

Contents

6

CHAPTER 1 C언어의개요 7

CHAPTER 2 C프로그램시작하기 13

CHAPTER 3 변수와데이터형 23

CHAPTER 4 연산자 33

CHAPTER 5 제어문 43

CHAPTER 6 함수 57

CHAPTER 7 배열과문자열 67

CHAPTER 8 포인터 77

CHAPTER 9 구조체 89

CHAPTER 10 함수의활용 105

CHAPTER 11 포인터의활용 121

CHAPTER 12 고급기능 137

CHAPTER 13 입출력라이브러리 149

CHAPTER 14 실전프로젝트 161

Page 7: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

C 언어의 개요

C H A P T E R 1

Page 8: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

8

연 습 문 제

1. 프로그래밍 언어에 대한 설명 중 올바른 것을 모두 고르시오.

①기계어로작성된T프로그램은특정CPU에서만실행될수있다.

②0과1로되어있는명령어를사용하는것이어셈블리어이다.

③고급언어는어셈블리어에비해서자연어에더가깝다.

④고급언어를사용하면CPU마다다르게프로그램을작성해야한다.

⑤어셈블러는고급언어로된프로그램을기계어로번역한다.

2. 다음 중 C 언어의 특징이 아닌 것은?

①다른프로그래밍언어에비해구문이간결하다.

②다른프로그래밍언어에비해서이식성이좋다.

③다른프로그래밍언어에비해서실행속도가느리다.

④C언어는개발자에게최대한의자유를보장한다.

3. C 언어에 대한 설명 중 잘못된 것은?

①C언어는프로그래밍의기본개념을이해하는데도도움이된다

②C를이용하면성능이좋은프로그램을개발할수있다.

③가상머신이인터프리터방식으로프로그램을실행한다.

④임베디드프로그램개발에도C언어가주로사용된다.

4. 다음 중 C 언어의 장점이 아닌 것은?

①C언어는구문이간결하고,프로그램개발에꼭필요한핵심적인기능들을제공한다.

②C언어는어셈블리어수준의기능을제공하면서도기계-독립적인프로그램을작성할수

있다.

③C언어는배우기쉽고사용하는데도별다른주의사항이없다.

④C언어는개발자에게최대한의자유를제공한다.

Page 9: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

9

C 언어의 개요 CHAPTER 01

5. 다음은 일반적인 C 프로그램의 개발 과정이다. 그림의 ①과 ②에 각각 알맞은 단계

는 무엇인지 쓰시오.

① 에러

② 에러

소스 코드 작성

전처리기

실행실행 에러

디버깅

6. Visual C++에서 프로그램을 만들기 위해서 사용되는 소스 파일이나 헤더 파일에

대한 정보, 소스 파일을 컴파일할 때 사용되는 컴파일 옵션, 오브젝트 파일이나 라

이브러리를 링크할 때 사용되는 링크 옵션 등의 정보가 포함되는 것을 무엇이라고

하는가?

프로젝트

컴파일

링크

Page 10: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

10

7. 다음은 Visual C++을 이용한 C 프로그램의 개발 과정이다. 빈칸에 알맞은 단계를

채우시오.

8. 소스 파일을 컴파일 하기 위한 전 단계로 프로그래머가 작성한 소스 파일을 컴파일

하기 위한 소스 파일로 변환하는 기능을 제공하는 프로그램을 무엇이라고 하는가?

전처리기

9. C 프로그램 개발 과정에 대한 설명 중 잘못된 것은?

①소스코드를작성할때는일반적인텍스트편집기를사용한다.

②전처리기를거치고나면오브젝트코드가생성된다.

③소스파일이여러개일때는소스파일마다개별적으로컴파일이수행된다.

④링크단계에서라이브러리를실행파일에연결한다.

⑤링크에러는컴파일에러에비해서찾기어렵다.

프로젝트 생성

Page 11: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

11

C 언어의 개요 CHAPTER 01

10. 다음 중 디버깅을 통해서 찾을 수 있는 에러는?

①전처리기에러

②컴파일에러

③링크에러

④실행에러

11. C 언어와 C++ 언어에 대한 설명 중 올바른 것은?

①C++프로그램은유효한C프로그램이다.

②C로작성된프로그램을C++로변환하려면소스파일의확장자만.c에서.cpp로변경하면

된다.

③C컴파일러와C++컴파일러는서로다른프로그램인경우가많다.

④C++언어를이어받아객체지향성을추가한것이C언어이다.

12. Test.c라는 이름의 소스 파일의 내용이 다음과 같은 때, Test.c를 이용해서 Test.

exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual C++를 이용

한다.

#include <stdio.h>

int main()

{

printf("--------------------------\n");

printf("첫 번째 C 프로그램입니다.\n");

printf("프로그램을 종료합니다.\n");

printf("--------------------------\n");

return 0;

}

Page 12: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual
Page 13: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

C 프로그램 시작하기

C H A P T E R 2

Page 14: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

14

실 전 과 제

-- 목표

변수를선언하고,변수의값을입력받아출력해본다.

-- 과제

문자형,정수형,실수형변수를각각하나씩선언하고각각을입력받아서출력하는프로그램을

작성하시오.

-- 요구사항

•문자형,정수형,실수형변수를각각하나씩선언한다.

•변수의값을입력받기위해서scanf함수를이용한다.

•입력받은변수의값을출력하기위해서printf함수를이용한다.

-- 힌트

•문자형변수는char형으로선언하고,정수형변수는 int형으로선언하고,실수형변수는

float형으로선언한다.

•scanf함수로값을입력받거나printf함수로값을출력하려면형식문자열을사용한다.문

자를입력받거나출력하려면형식문자열로%c를지정하고,정수를입력받거나출력하려면

%d를지정한다.실수를입력받거나출력하려면%f를지정한다.

•프로그램의실행예는다음과같다.

문자를 입력하세요 : A

정수를 입력하세요 : 10

실수를 입력하세요 : 12.3456

문자 = A, 정수 = 10, 실수 = 12.345600

Page 15: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

15

C 프로그램 시작하기 CHAPTER 02

-- 구현

직접프로그램코드를작성해보고,다음코드의부분에필요한코드를채워넣으시오.

01: /* Lab02.c */

02: #include ___________________________

03:

04: int main(void)

05: {

06: _____________________;

07: _____________________;

08: _____________________;

09:

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

11: scanf(_________________);

12:

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

14: scanf(_________________);

15:

16: printf("실수를 입력하세요 : ");

17: scanf(_________________);

18:

19: printf(____________________________________________________);

20:

21: return 0;

22: }

-- 평가

올바른실행결과가나오는지확인해보자.

Page 16: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

16

연 습 문 제

1. C 프로그램에 대한 설명 중 올바른 것을 모두 고르시오.

①C프로그램은함수로구성된다.

②반드시한문장을한줄에작성해야한다.

③함수안에들어가는문장은{}로묶어준다.

④함수는반드시값을리턴해야한다.

⑤C프로그램에는main함수가있어도되고,없어도된다.

2. C 프로그램의 입출력에 대한 설명 중 잘못된 것을 모두 고르시오.

①C프로그램마다입출력을위한함수를직접만들어서사용해야한다.

②입출력을위해서<stdio.h>라는헤더파일을포함해야한다.

③콘솔창에출력하는데사용되는함수는printf함수이다.

④콘솔창으로부터입력을받는데사용되는함수는printf함수이다.

⑤printf함수는정해진문자열이나변수의값을출력할수있다.

3. 변수에 대한 설명 중 잘못된 것을 모두 고르시오.

①변수는먼저선언한후에사용해야한다.

②모든변수는같은크기의메모리를사용한다.

③변수를선언하려면변수의데이터형만있으면된다.

④변수에값을저장하려면=를이용한다.

⑤변수의값을읽어오거나변수에값을저장할때변수의이름을사용한다.

4. C 프로그램에서 콘솔 창에 출력하는 데 사용되는 가장 기본적인 함수는 무엇인가?

printf 함수

Page 17: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

17

C 프로그램 시작하기 CHAPTER 02

5. 콘솔 창에서 변수로 값을 입력받는 기본적인 함수는 무엇인가?

scanf 함수

6. 다음은 printf 함수에 사용되는 형식 문자열이다. 형식 문자열과 그 의미가 잘못 짝

지어 진 것은?

①%c→문자출력

②%d→정수출력

③%s→실수출력

④%f→실수출력

7. 주석(comment)에 대한 설명 중 잘못된 것은?

①주석은프로그램에대한설명을써주는것이다.

②주석처리(commentout)된코드는실제로수행되지않는다.

③주석의시작부분에는/*를,주석의끝부분에는*/을써준다.

④/*와*/로된주석은중첩해서사용할수있다.

8. 변수를 선언할 때 값을 저장하기 위한 공간이 얼마나 필요한지 컴파일러에게 알려

주기 위해서 지정하는 것은 무엇인가?

데이터형

9. 다음은 간단한 C 프로그램이다. 프로그램의 각 줄에 대한 설명 중 잘못된 것은?

01: /* Test.c */

02: #include <stdio.h>

03:

04: int main()

05: {

06: printf("첫 번째 C 프로그램");

07: return 0;

08: }

Page 18: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

18

①1번째줄:주석은실행되지않는다.

②2번째줄:입출력라이브러리를사용하기위해서필요한준비이다.

③4번째줄:C프로그램은main함수에서부터시작된다.

④6번째줄:printf함수를이용해서출력할수있다.

⑤7번째줄:main함수가0을리턴하면비정상종료라는의미이다.

10. 다음 중 main 함수를 잘못 정의하고 있는 것을 모두 고르시오,

①int main(void)

{

printf("Hello World\n");

return 0;

}

②int main(void) { printf("Hello World\n"); return 0; }

③void main(void)

{

printf("Hello World\n");

}

④int Main(void)

{

return 0;

}

⑤int main(void) {

printf("Hello World\n");

return 1;

}

⑥int main(void)

{

printf("Hello World\n");

return 0;

}

int main(void) {

printf("Good Bye\n");

return 0;

}

Page 19: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

19

C 프로그램 시작하기 CHAPTER 02

11. 다음 프로그램은 정수형 변수 a와 문자형 변수 b를 입력받아서 출력한다. 에

공통으로 필요한 코드를 작성하시오.

#include <stdio.h>

int main(void)

{

int a;

char b;

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

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

return 0;

}

%c

12. 다음 프로그램의 실행 결과를 쓰시오.

#include <stdio.h>

int main(void)

{

int x, y, z;

x = 10;

y = 20;

z = x * y;

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

return 0;

}

z = 200

Page 20: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

20

13. 다음 프로그램은 변수 x에 실수 값을 입력받아서 출력하는 프로그램이다. ①, ②, ③

에 필요한 코드를 각각 작성하시오.

#include <stdio.h>

int main(void)

{

①__________________;

②_________________("%f", &x);

③_________________("x = %f\n", x);

return 0;

}

① float x; ② scanf ③ printf

14. 정수를 두 개 입력받아서 두 수의 합과 차를 구해서 출력하는 프로그램을 작성하

시오.

15. 실수를 하나 입력받아서 그 값에 100을 곱한 결과를 구해서 출력하는 프로그램을

작성하시오.

16. 다음과 같이 출력하는 프로그램을 작성하시오. (단, for나 while 같은 반복문을 사

용하지 않는다.)

*****

***

*

***

*****

Page 21: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

21

C 프로그램 시작하기 CHAPTER 02

17. 다음과 같이 출력하는 프로그램을 여러 가지 방법으로 작성해보시오. (printf문을

한번만 이용할 수도 있고, 여러 번 이용할 수도 있다.)

안녕하세요?

반갑습니다.

또 만나요.

Page 22: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual
Page 23: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

변수와 데이터형

C H A P T E R 3

Page 24: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

24

실 전 과 제

-- 목표

정수형변수를여러가지방법(10진수,8진수,16진수)으로입력받고출력해본다.

-- 과제

int형변수에대해서정수값을10진수로입력받아10진수,16진수,8진수로출력하는프로그

램을작성하시오.또한정수값을16진수와8진수로도입력받은후각각을10진수,16진수,8

진수로출력하시오.

-- 요구사항

•int형변수num을선언하고,그값을10진수로입력받은후그값을10진수,16진수,8진수

로출력한다.

•num의값을16진수로입력받은후그값을10진수,16진수,8진수로출력한다.

•num의값을8진수로입력받은후그값을10진수,16진수,8진수로출력한다.

-- 힌트

•10진수입력에는형식문자열로%d를,16진수입력에는%x를,8진수입력에는%o를지정

한다.

•10진수출력에는형식문자열로%d를,16진수입력에는%x를,8진수입력에는%o를지정

한다.

정수를 10진수로 입력하세요 : 10

10진수:10, 8진수:12, 16진수:a

정수를 16진수로 입력하세요 : ab

10진수:171, 8진수:253, 16진수:ab

정수를 8진수로 입력하세요 : 77

10진수:63, 8진수:77, 16진수:3f

Page 25: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

25

변수와 데이터형 CHAPTER 03

-- 구현

직접프로그램코드를작성해보고,다음코드의부분에필요한코드를채워넣으시오.

01: #include <stdio.h>

02:

03: int main(void)

04: {

05: int num;

06:

07: printf("정수를 10진수로 입력하세요 : ");

08: scanf("_____", &num);

09: printf("10진수:___, 8진수:___, 16진수:___\n\n", num, num, num);

10:

11: printf("정수를 16진수로 입력하세요 : ");

12: scanf("_____", &num);

13: printf("10진수:___, 8진수:___, 16진수:___\n\n", num, num, num);

14:

15: printf("정수를 8진수로 입력하세요 : ");

16: scanf("_____", &num);

17: printf("10진수:___, 8진수:___, 16진수:___\n\n", num, num, num);

18:

19: return 0;

20: }

-- 평가

올바른실행결과가나오는지확인해보자.

Page 26: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

26

연 습 문 제

1. 변수에 대한 설명 중 잘못된 것을 모두 고르시오.

①메모리에저장할값의형식에따라변수의데이터형을지정한다.

②변수는비트단위크기로할당할수있다.

③메모리에저장된변수에접근하려면변수의이름이필요하다.

④변수의값은변경할수있다.

⑤이름이없는변수를선언할수있다.

⑥변수에값을저장하려면=을사용한다.

2. 다음 중 잘못된 변수명을 모두 고르시오.

①employee-name

②backcount

③_rate

④income2016

⑤break

⑥discountFactor

3. 10, ‘a’, 12.34처럼 값 자체를 직접 사용하는 상수를 무엇이라고 하는가?

리터럴 상수

4. #define으로 정의되는 기호 상수를 무엇이라고 하는가?

매크로 상수

5. 상수에 대한 설명 중 잘못된 것을 모두 고르시오.

①문자형상수중특수문자는‘\’와함께표현한다.

②정수형상수를16진수로표기할때는상수앞에0x또는0X를붙여서나타낸다.

Page 27: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

27

변수와 데이터형 CHAPTER 03

③부호없는정수형상수는접미사로f또는F를붙여서구분한다.

④매크로상수는컴파일전에특정값으로대치된다.

⑤매크로상수를정의할때도C문장이므로세미콜론(;)이필요하다.

⑥const변수도변수이므로값을변경할수있다.

6. 데이터형에 대한 설명 중 잘못된 것을 모두 고르시오.

①문자형으로는char형이있으며,크기는2바이트이다.

②정수형의크기는플랫폼에따라달라질수있다.

③정수형에서signed,unsigned여부를지정하지않으면signed로간주한다.

④바이트단위의데이터를저장할때는부호있는정수형을사용한다.

⑤문자형,정수형,실수형에는유효범위가존재한다.

⑥단정도실수는double형을,배정도실수는float형을사용한다.

7. 데이터형의 유효 범위를 넘어서는 값을 저장하려고 할 때, 유효 범위 내의 값으로

값이 순환되는 현상을 무엇이라고 하는가?

오버플로우

8. 데이터형의 크기를 구할 때 사용되는 연산자는?

sizeof

9. 정수형을 부호 없는 정수형으로 선언하기 위해서 사용되는 키워드는?

unsigned

10. 변수 선언 시 변수의 값을 읽어볼 수만 있고, 변경할 수 없도록 지정하는 키워드는?

const

Page 28: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

28

11. 데이터형의 유효 범위에 대한 설명 중 잘못된 것을 모두 고르시오.

①char형은CHAR_MIN부터CHAR_MAX사이의값을갖는다.

②unsignedshort형은-32768~32767사이의값을갖는다.

③데이터형의유효범위에대한매크로상수는<limits.h>에정의되어있다.

④정수형변수에유효범위밖의값을저장하면오버플로우가발생한다.

⑤SHRT_MAX같은매크로상수를사용하는것보다32767같은리터럴상수를사용하는것

이알아보기쉽다.

12. 리터럴 상수를 사용하는 대신에, 이름 있는 상수를 사용하는 경우의 장점을 두 가

지 쓰시오.

프로그램을 알아보기 쉽다. 프로그램을 수정하기 쉽다.

13. 다음 프로그램에서 컴파일 에러가 발생하는 곳을 모두 찾으시오.

#include <stdio.h>

#define MAX 100

int main(void)

{

int a = 10;

const int b = 20;

char ch;

a = 20; // ①

b = 30; // ②

ch = 97; // ③

MAX = 200; // ④

a = 'A'; // ⑤

30 = a + b; // ⑥

return 0;

}

②, ④, ⑥

Page 29: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

29

변수와 데이터형 CHAPTER 03

14. 다음 중 잘못된 변수 선언문을 모두 고르시오.

①intphone@home;

②charcase;

③char_internalUse;

④constintcount=0;

⑤charmenu=0;

15. 변수명이나 함수명과 같은 식별자를 만들기 위한 규칙 중 잘못된 것은?

①식별자는반드시영문자,숫자,밑줄기호(_)만을사용해야한다.

②식별자의첫글자는반드시영문자나밑줄기호로시작해야한다.

③식별자는대소문자를구분해서정의한다.

④char,for,const같은C언어의키워드(keyword)도식별자로사용할수있다.

16. 다음 중 상수와 상수의 데이터 형이 잘못 연결된 것은?

①‘\007’→char

②12345L→long

③3.14d→double

④100u→unsignedint

17. 32비트 플랫폼을 기준으로 데이터 형과 그 크기가 잘못 연결된 것은?

①char→2바이트

②short→2바이트

③int→4바이트

④float→4바이트

Page 30: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

30

18. 전처리기는 #define으로 정의된 매크로 상수를 특정 값으로 대치(replace)하는 일

을 한다. 다음 코드 중에서 매크로 상수의 대치가 일어나지 않는 곳은?

#include <stdio.h>

#define NUM 10

int main(void)

{

int a = NUM; // ①

int b = NUM + 1; // ②

printf("NUM = "); // ③

printf("%d\n", NUM); // ④

return 0;

}

19. 다음 프로그램의 실행 결과를 쓰시오.

#include <stdio.h>

#include <limits.h>

int main(void)

{

int a = 16;

short b = SHRT_MIN;

char c = 'a';

float d = 1.5;

b = b - 1;

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

return 0;

}

10, 32767, 97, 4

Page 31: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

31

변수와 데이터형 CHAPTER 03

20. 사용자로부터 16진수 정수를 입력받아서 10진수로 변환해서 출력하는 프로그램을

작성하시오. 프로그램의 실행 결과는 다음과 같아야 한다.

16진수로 정수를 입력하세요 : ab

ab는 10진수로 171입니다.

21. char형 변수를 이용해서 char형의 언더플로우와 오버플로우를 확인하기 위한 프로

그램을 작성하시오. 프로그램의 실행 결과는 다음과 같아야 한다.

char형의 최대값 : 127

char형의 최대값+1 : -128

char형의 최소값 : -128

char형의 최소값-1 : 127

22. ‘a’, ‘m’, ‘x’ 문자의 ASCII 코드를 10진수와 16진수로 출력하는 프로그램을 작성하시

오. 프로그램의 실행 결과는 다음과 같아야 한다.

a : 10진수= 97, 16진수= 61

m : 10진수=109, 16진수= 6d

x : 10진수=120, 16진수= 78

Page 32: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual
Page 33: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

연산자

C H A P T E R 4

Page 34: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

34

실 전 과 제

-- 목표

여러가지연산자를이용해본다.

-- 과제

시간(시,분,초)을입력받아서몇초인지계산하는프로그램을작성하시오.

-- 요구사항

•시간을시,분,초로나누어정수로입력받는다.

•입력받은시간이몇초인지계산해서출력한다.

-- 힌트

•1시간은60분,1분은60초이다.

•프로그램의실행예는다음과같다.

시간을 순서대로 입력하세요(시,분,초) : 1 3 20

1시간 3분 20초는 총 3800초입니다.

Page 35: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

35

연산자 CHAPTER 04

-- 구현

직접프로그램코드를작성해보고,다음코드의____부분에필요한코드를채워넣으시오.

01: /* Lab04.c */

02: #include <stdio.h>

03:

04: int main(void)

05: {

06: int hour, min, sec;

07: int total_sec = 0;

08:

09: printf("시간을 순서대로 입력하세요(시,분,초) : ");

10: scanf("%d %d %d", &hour, &min, &sec);

11:

12: ___________________________________________________;

13:

14: printf("%d시간 %d분 %d초는 총 %d초입니다.\n",

15: hour, min, sec, total_sec);

16:

17: return 0;

18: }

-- 평가

올바른실행결과가나오는지확인해보자.

Page 36: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

36

연 습 문 제

1. 연산자에 대한 설명 중 잘못된 것은?

①연산의대상이되는값을연산자라고한다.

②연산자를사용하는연산식은항상값이있다.

③피연산자가하나인연산자를단항연산자라고한다.

④피연산자가세개인연산자는조건연산자밖에없다.

2. 다음 중 단항 연산자를 모두 고르시오.

①% ②++

③<< ④?:

⑤~

3. 사칙연산에 대한 설명 중 잘못된 것은?

①‘정수+정수’,‘정수-정수’의연산결과는정수이다.

②‘정수/정수’의연산결과는정수이다.

③%연산자는실수에도사용할수있다.

④+,-,*,/연산자는피연산자중하나가실수이면실수연산으로처리한다.

4. 다음 연산의 수행 결과는?

int a = 0;

int b = 100;

int c = b++;

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

1, 102, 100

Page 37: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

37

연산자 CHAPTER 04

5. 다음 연산의 결과를 쓰시오.

(1) (int)(2.5+1.3*2) 5

(2) (int)2.5+((int)1.3)*2 4

(3) 8%3 2

(4) 10/3 3

(5) 1<=10<5 1

(6) 1<=10&&10<5 0

(7) x=1==0 0

(8) (x=1)==0 0

(9) 8<<2 32

(10)8>>2 2

6. 다음 중 두 연산식의 의미가 같은 것을 모두 고르시오.

①x=x+1 x+=1

②x=y x==y

③x&y x&&y

④!x ~x

⑤x<<1 x*2

7. 다음 연산식에 연산자 우선순위에 맞춰서 괄호를 추가하시오.

(1)a+b-c ((a+b)-c)

(2)a+b*c–d%2 ((a+(b*c))–(d%2))

(3)a>100||a<0 ((a>100)||(a<0))

(4)!a&&!b ((!a)&&(!b))

(5)a=b+c/d (a=(b+(c/d)))

(6)a=b=c (a=(b=c))

(7)a+=b*2 (a+=(b*2))

(8)a=b,c ((a=b),c)

Page 38: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

38

8. 다음과 같이 선언된 변수에 대하여 연산 후 각 변수의 값을 쓰시오. (1)~(4) 각각에

대하여 x = 10, y = 5, z = 20이라고 가정한다.

int x = 10, y = 5, z = 20;

(1)z=x+++--y; x=11,y=4,z=14

(2)z=x=++y; x=6,y=6,z=6

(3)x+=y+3; x=18,y=5,z=30

(4)z=++x==y+5; x=11,y=5,z=0

9. 다음 중 C 언어가 제공하는 연산자가 아닌 것을 모두 고르시오.

①|

②?

③%

④&

⑤#

⑥~

10. 형 변환에 대한 설명 중 잘못된 것을 모두 고르시오.

①형변환에는암시적인형변환과명시적인형변환이있다.

②“short+short”연산의결과는int형이다.

③“float*float”연산의결과는float형이다.

④“int/int“연산의결과는int형이다.

⑤실수값을int형으로변환하면소수점이하를잘라버린다.

⑥크기가큰데이터형은값의손실없이작은크기의데이터형으로변환된다.

Page 39: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

39

연산자 CHAPTER 04

11. 다음 중 형 변환이 일어나는 경우를 모두 찾으시오.

①int a = 123.45;

②double d = 10.0;

③short a = 100, b = 200;

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

④int c = 10 + 20;

⑤printf("%f\n", 10 / 4);

12. 다음은 연산자 우선순위의 일반적인 규칙이다. ______________ 에 알맞은 연산

자는?

단항연산자>산술연산자>관계연산자>논리연산자>대입연산자

13. 다음 중 연산자의 결합 방향이 다른 것은?

①*연산자(이항연산자)

②&&연산자

③>=연산자

④+=연산자

Page 40: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

40

14. 다음 프로그램의 실행 결과를 쓰시오.

#include <stdio.h>

int main(void)

{

int x = 0x7a, y = 0x1c;

int z;

z = (x & y) << 2;

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

z = (x & ~y) >> 2;

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

return 0;

}

z = 60z = 18

15. inch로 된 제품의 크기를 입력받아서 cm로 출력하는 프로그램을 작성하시오. (1

inch = 2.54cm)

16. 시간을 초 단위로 입력받아서 몇 시간 몇 분 몇 초인지를 계산하는 프로그램을 작

성하시오.

17. 연도를 입력받아서 윤년인지 확인하는 프로그램을 작성하시오.

연도를 4로 나누어 떨어지면 윤년이다. 4로 나누어 떨어지는 연도 중에서 100으로 나

누어 떨어지는 연도는 윤년이 아니다. 100으로 나누어 떨어지는 연도 중에서 400으로

나누어 떨어지는 연도는 윤년이다.

Page 41: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

41

연산자 CHAPTER 04

18. 25, 210, 215, 220, 225, 230을 각각 구해서 출력하는 프로그램을 작성하시오. 단, 2의

지수승을 구할 때 비트 이동 연산자(<<)를 이용하시오.

19. 면적을 제곱 미터(m2) 단위로 입력받아서 평수로 변환해서 출력하는 프로그램을 작

성하시오. (1평 = 3.3058m2)

20. 3개의 정수를 입력받아서 합계와 평균, 최대값과 최소값을 구해서 출력하는 프로그

램을 작성하시오. 단, 평균은 소수점 이하까지 구하도록 한다.

21. RGB 표현법은 색상을 나타내기 위한 방법 중 하나이다. RGB 표현법은 최하위 바이

트부터 각 바이트마다 red, green, blue의 순서로 0~255 사이의 값을 각각 한 바

이트씩 저장한다. 이때 최상위 바이트는 사용하지 않으므로 항상 0이다.

사용자로부터 red, green, blue 값을 각각 0~255사이의 정수로 입력받아서 4바

이트 크기의 RGB 값을 만들어 출력하는 프로그램을 작성하시오. 이때, 만들어진

RGB 값을 출력할 때, 각 바이트 별로 값을 확인하기 쉽도록 16진수로 출력한다.

0~7번 비트 : red에 해당하는 0~255(0x0~0xff) 사이의 값

8~15번 비트 : green에 해당하는 0~255(0x0~0xff) 사이의 값

16~23번 비트 : blue에 해당하는 0~255(0x0~0xff) 사이의 값

24~31번 비트 : 0에 해당하는 값 (0x00)

Page 42: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual
Page 43: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

제어문

C H A P T E R 5

Page 44: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

44

실 전 과 제

-- 목표

여러가지제어문을이용해본다.

-- 과제

사용자로부터영문자를입력받아서대문자인지소문자인지출력하는프로그램을작성하시오.

만일영문자가아니면“영문자가아닙니다”라고출력하도록작성하시오.이프로그램은‘.’이입

력될때까지반복수행되어야한다.

-- 요구사항

•사용자로부터문자를입력받아서대소문자여부를검사해서적절한메시지를출력한다.

•대소문자여부를출력한다음바로프로그램을종료하는대신계속해서문자를입력받아

같은기능을반복수행한다.

•입력받은문자가‘.’이면프로그램을더이상수행하지않고종료한다.

-- 힌트

•대소문자인지여부를검사할때는ifelse문을사용한다.

•무한루프를이용하면종료조건이만족할때까지프로그램을반복수행하게할수있다.

while( 1 ) { … }

for( ; ; ) { … }

•무한루프를탈출할때는break문을이용한다.

•문자하나를입력받으려면scanf함수의형식문자열로“%c”를지정한다.그런데사용자가

“A Enter ”를입력하면‘A’문자와‘\n’문자가입력버퍼로들어와서그중‘A’문자만char형

변수로입력되고‘\n’문자는입력버퍼에남아있다가그다음번scanf함수호출에서입력

으로사용되므로문제가발생한다.이문제를해결하려면형식문자열로“%c”대신“%c”를

지정하면된다.형식문자열에““(스페이스)를지정하면입력된내용중공백문자(‘‘,‘\t’,‘\n’

등)는무시하라는의미이므로“%c”는공백이아닌첫번째문자를입력받게한다.입력버퍼

에대해서는13장의[예제13-1]을참고하자.

Page 45: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

45

제어문 CHAPTER 05

•프로그램의실행예는다음과같다.

영문자를 입력하세요 : a

'a'는 소문자입니다.

영문자를 입력하세요 : B

'B'는 대문자입니다.

영문자를 입력하세요 : 9

'9'는 영문자가 아닙니다.

영문자를 입력하세요 : .

-- 구현

직접프로그램코드를작성해보고,다음코드의____부분에필요한코드를채워넣으시오.

01: /* Lab05.c */

02: #include <stdio.h>

03:

04: int main(void)

05: {

06: char ch;

07:

08: ________________

09: {

10: printf("영문자를 입력하세요 : ");

11: scanf(" %c", &ch);

12:

13: if(ch == '.')

14: ____________;

15:

16: printf("'%c'는 ", ch);

17:

18: ____________________________

19: printf("대문자입니다.\n");

20: ____________________________

Page 46: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

46

21: printf("소문자입니다.\n");

22: ____________________________

23: printf("영문자가 아닙니다.\n");

24: }

25:

26: return 0;

27: }

-- 평가

올바른실행결과가나오는지확인해보자.

Page 47: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

47

제어문 CHAPTER 05

연 습 문 제

1. if문에 대한 설명 중 잘못된 것을 모두 고르시오.

①if문의조건식이참이면if다음의문장을수행한다.

②if문에는반드시else가필요하다.

③if문에서수행할문장이여러개일때는{}로묶어주어야한다.

④if문을중첩해서사용할수없다.

⑤ifelse문에서else다음에다시if를사용하는문장을다중if라고한다.

2. switch문에 대한 설명 중 잘못된 것을 모두 고르시오.

①switch문의()안에는정수식을써주어야한다.

②case문에서수행할문장이여러개일때{}로묶어줄필요가없다.

③case문을빠져나가기위한break는생략할수없다.

④switch문에서default는반드시모든case다음에위치해야한다.

⑤case다음에실수값을지정할수없다.

3. switch문에서 정수식의 값이 모든 case에 일치하지 않을 때 수행할 문장을 써주기

위해서 사용되는 키워드는?

default

4. for문에 대한 설명 중 잘못된 것을 모두 고르시오.

①for문의초기식은for문이반복될때마다수행된다.

②for문의초기식,조건식,증감식은모두생략가능하다.

③for문의조건식은반복문을수행한다음에검사한다.

④for문의조건식을생략하면무한루프가된다.

⑤for문에서반복할문장을생략할수있다.

Page 48: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

48

5. 다음의 while문을 for문으로 다시 작성하시오.

int i;

int n, m;

i = 0, n = 1, m = 0;

while( i <= 10 )

{

n *= i;

m += n;

i++;

}

int i;

int n, m;

for ( i = 1, n = 1, m = 0 ; i <= 10 ; i++ )

{

n *= i;

m += n;

}

6. while문에 대한 설명 중 잘못된 것을 모두 고르시오.

①while문의조건식이참이면문장을수행한다.

②while문의조건식은루프의시작부분에서검사한다.

③while문의반복할문장은반드시한번은수행된다.

④while문의조건식은생략할수있다.

⑤while문은for문에비해비정형화된루프를구현하는데적당하다.

7. 다음 반복문 중에서 printf문이 최소한 한 번 실행되는 것은?

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

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

② i = 0;

while( i < 0 )

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

③ i = 0;

do

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

while( i < 0 );

Page 49: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

49

제어문 CHAPTER 05

④ for( i = 0 ; 0 ; i++ )

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

8. 다음 중 분기문과 그 역할이 잘못 짝지어진 것은?

①break-루프를빠져나간다.

②continue-루프의시작부분으로이동해서조건식검사부터다시계속한다.

③return-함수를호출한곳으로되돌아간다.

④goto-루프의끝부분으로돌아간다.

9. 다음 문장 중 컴파일 에러가 발생하는 것을 모두 고르시오.

① int i;

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

② int i, j, k;

for( i = j = 0, k = 10 ; i < 10 && j < 10 && k > 0 ; i++, j+=2, k -= 3 )

printf("%d, %d, %d\n", i, j, k);

③ int i = 1;

for( )

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

④ int i;

while( 1 )

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

⑤ int i = 1;

do

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

while( i < 10 )

10. 분기문 중 반복문을 탈출하거나 switch문을 빠져나오는데 사용되는 것은?

break

Page 50: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

50

11. 다음 프로그램의 실행 결과를 쓰시오.

#include <stdio.h>

int main(void)

{

int n = 3;

if( n > 1 )

{

n += 2;

if( n < 5 ) {

n *= 2;

}

else {

n -= 2;

}

}

else {

n <<= 2;

}

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

return 0;

}

n = 3

12. 다음 프로그램의 실행 결과를 쓰시오.

#include <stdio.h>

int main(void)

{

int i = 0;

int n = 0;

Page 51: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

51

제어문 CHAPTER 05

while( i < 10 )

{

n += i;

if( n > 20 )

break;

i += 2;

}

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

return 0;

}

n = 20

13. 다음 프로그램의 실행 결과를 쓰시오.

#include <stdio.h>

int main(void)

{

int i;

int n = 0;

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

{

if( i % 4 == 0 )

continue;

n += i;

}

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

return 0;

}

n = 18

Page 52: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

52

14. 다음은 정수를 입력받아 짝수인지 홀수인지 출력하는 프로그램이다. 참고로 0은 짝

수도 홀수도 아니다. 이처럼 if else문으로 작성된 프로그램을 switch문을 이용해서

다시 작성하시오.

#include <stdio.h>

int main(void)

{

int num;

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

scanf("%d", &num);

if( num == 0 )

printf("%d는 짝수도 홀수도 아닙니다\n", num);

else if ( num % 2 == 0 )

printf("%d는 짝수입니다.\n", num);

else

printf("%d는 홀수입니다.\n", num);

return 0;

}

Page 53: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

53

제어문 CHAPTER 05

#include <stdio.h>

int main(void)

{

int num;

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

scanf("%d", &num);

switch( num % 2 ) {

case 0:

if( num == 0 )

printf("%d는 짝수도 홀수도 아닙니다\n", num);

else

printf("%d는 짝수입니다.\n", num);

break;

case 1:

printf("%d는 홀수입니다.\n", num);

break;

}

return 0;

}

15. 간단한 텍스트 기반의 메뉴를 출력하고, 정수를 입력받아서 입력받은 번호에 해당

하는 메뉴를 수행하는 프로그램을 작성하시오. 1~3번 메뉴를 선택하면 별 다른 기

능 없이 각각 1번 메뉴, 2번 메뉴, 3번 메뉴가 선택되었다는 메시지를 출력한다. 입

력받은 값이 1~3 사이의 값이 아니면 에러메시지를 출력한다. 프로그램의 실행 결

과는 다음과 같아야 한다.

1. 메뉴1

2. 메뉴2

3. 메뉴3

>>> 선택 : 1

메뉴1이 선택되었습니다.

Page 54: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

54

16. 15번 프로그램에 0번 종료 메뉴를 추가해서 사용자가 0을 입력할 때까지 반복 수

행하도록 작성하시오. 프로그램의 실행 결과는 다음과 같아야 한다.

1. 메뉴1

2. 메뉴2

3. 메뉴3

0. 종료

>>> 선택 : 2

메뉴2이 선택되었습니다.

1. 메뉴1

2. 메뉴2

3. 메뉴3

0. 종료

>>> 선택 : 5

잘못 선택하셨습니다.

1. 메뉴1

2. 메뉴2

3. 메뉴3

0. 종료

>>> 선택 : 0

17. 사용자로부터 정수를 입력받아서, 1부터 N까지의 합계와 1부터 N까지 홀수의 합계,

1부터 N까지 짝수의 합계를 각각 구해서 출력하시오. 1부터 N까지의 합계는 for문

을 이용해서 구하고, 1부터 N까지 홀수의 합계는 while문을 이용해서 구하고, 1부

터 N까지 짝수의 합계는 do while문을 이용해서 구하시오.

18. 14번 프로그램은 한번에 하나의 정수에 대해서만 홀수인지 짝수인지 판단할 수 있

다. 한번만 수행되고 종료되는 대신 “계속 하시겠습니까? (Y/N)”를 출력하고, 사용

자로부터 ‘Y’ 또는 ‘N’을 입력받아서 ‘Y’인 경우에는 프로그램을 반복 수행하고, ‘N’

인 경우에는 프로그램을 종료하도록 14번 프로그램을 수정하시오. 실행 결과는 다

음과 같아야 한다.

Page 55: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

55

제어문 CHAPTER 05

정수를 입력하세요 : 123

123는 홀수입니다.

계속 하시겠습니까? (Y/N) y

정수를 입력하세요 : 24

24는 짝수입니다.

계속 하시겠습니까? (Y/N) n

19. 입력받은 정수 N에 대하여 팩토리얼(N!)을 구하는 프로그램을 작성하시오. 팩토리

얼 값을 구하기 위한 공식은 다음과 같다.

0! = 1

N! = N x (N-1) x (N-2) x … x 3 x 2 x1

20. 정수 N을 입력받으면 N! 만 구해서 출력하는 대신 0!, 1!, 2!, …, (N-1)!, N!에 해당

하는 값을 모두 구해서 출력하도록 19번 프로그램을 수정하시오. 프로그램의 실행

결과는 다음과 같아야 한다.

정수를 입력하세요 : 5

0! = 1

1! = 1

2! = 2

3! = 6

4! = 24

5! = 120

Page 56: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

56

21. 다음 실행 예처럼 간단한 텍스트 메뉴를 출력하고 사용자로부터 숫자로 된 메뉴를

선택 받아서 수행하는 프로그램을 작성하시오.

1번 메뉴를 선택하면 문자를 하나 입력받아서 대소문자 여부를 출력한다. 2번 메뉴

를 선택하면 정수를 하나 입력받아서 입력받은 정수가 홀수인지 짝수인지 출력한

다. 3번 메뉴를 선택하면 정수를 하나 입력받아서 N!을 구해서 출력한다. 0번 메뉴

를 선택하면 프로그램을 종료시킨다.

1. 대소문자 확인

2. 홀수 짝수 확인

3. N 팩토리얼 구하기(N!)

0. 종료

>>> 선택 : 1

영문자를 입력하세요 : A

'A'는 대문자입니다.

1. 대소문자 확인

2. 홀수 짝수 확인

3. N 팩토리얼 구하기(N!)

0. 종료

>>> 선택 : 2

정수를 입력하세요 : 100

100는 짝수입니다.

1. 대소문자 확인

2. 홀수 짝수 확인

3. N 팩토리얼 구하기(N!)

0. 종료

>>> 선택 : 3

정수를 입력하세요 : 7

7!는 5040입니다.

1. 대소문자 확인

2. 홀수 짝수 확인

3. N 팩토리얼 구하기(N!)

0. 종료

>>> 선택 : 0

Page 57: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

함수

C H A P T E R 6

Page 58: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

58

실 전 과 제

-- 목표

함수를선언및정의하고,호출하는방법을알아본다.

-- 과제

red,green,blue를인자로받아서4바이트크기의RGB색상을만드는함수,반대로4바이트

크기의RGB색상으로부터red에해당하는값을구하는함수,green에해당하는값을구하는

함수,blue에해당하는값을구하는함수를각각정의하고이함수들을이용하는프로그램을

작성하시오.

0~7번 비트 : red에 해당하는 0~255(0x0~0xff) 사이의 값

8~15번 비트 : green에 해당하는 0~255(0x0~0xff) 사이의 값

16~23번 비트 : blue에 해당하는 0~255(0x0~0xff) 사이의 값

24~31번 비트 : 0에 해당하는 값 (0x00)

-- 요구사항

•red,green,blue는부호없는정수형을사용하며항상0~255사이의값을저장한다.

•red,green,blue를인자로받아서4바이트크기의RGB색상을만드는함수,반대로4바이

트크기의RGB색상으로부터red에해당하는값을구하는함수,green에해당하는값을

구하는함수,blue에해당하는값을구하는함수에대해서각함수의이름을결정하고,매

개변수와리턴형을결정한다.

•각함수의선언과정의를작성한다.

•main함수에서red,green,blue을입력받아서RGB색상을만들어서16진수로출력한다.

또한RGB색상을16진수로입력받아red,green,blue값을각각구해서출력한다.

-- 힌트

•red,green,blue는0~255사이의값을사용하므로unsignedchar형을사용하는것이

좋다.

Page 59: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

59

함수 CHAPTER 06

•red,green,blue를조합해서RGB색상을만들때는<<연산자와|연산자를이용한다.

•RGB색상에서red,green,blue를추출할때는&연산자와>>연산자를이용한다.

•프로그램의실행예는다음과같다.

red를 입력하세요(0~255) : 0

green을 입력하세요(0~255) : 244

blue를 입력하세요(0~255) : 255

RGB 값 : FFF400

RGB 값을 16진수로 입력하세요 : ff00ab

RGB 값 FF00AB 중 red : 171

RGB 값 FF00AB 중 green : 0

RGB 값 FF00AB 중 blue : 255

-- 구현

직접프로그램코드를작성해보고,다음코드의____부분에필요한코드를채워넣으시오.

01: /* Lab06.c */

02: #include <stdio.h>

03:

04: ______________________________________________; // 4바이트 크기의 RGB 색상을 만드는 함수

05: ______________________________________________; // RGB색상에서 red를 구하는 함수

06: ______________________________________________; // RGB색상에서 green를 구하는 함수

07: ______________________________________________; // RGB색상에서 blue를 구하는 함수

08:

09: int main(void)

10: {

11: unsigned int r, g, b;

12: unsigned int rgb;

13:

14: printf("red를 입력하세요(0~255) : ");

15: scanf("%d", &r);

16:

17: printf("green을 입력하세요(0~255) : ");

18: scanf("%d", &g);

19:

20: printf("blue를 입력하세요(0~255) : ");

21: scanf("%d", &b);

22:

Page 60: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

60

23: rgb = _________________________;

24: printf("RGB 값 : %06x\n\n", rgb);

25:

26: printf("RGB 값을 16진수로 입력하세요 : ");

27: scanf("%x", &rgb);

28:

29: printf("RGB 값 %06x 중 red : %3d\n", rgb, ______________);

30: printf("RGB 값 %06x 중 green : %3d\n", rgb, ______________);

31: printf("RGB 값 %06x 중 blue : %3d\n", rgb, ______________);

32:

33: return 0;

34: }

35:

36: _____________________________________________ // 4바이트 크기의 RGB 색상을 만드는 함수

37: {

38: return (red | (green << 8) | (blue << 16));

39: }

40:

41: _____________________________________________ // RGB색상에서 red를 구하는 함수

42: {

43: return (rgb & 0x0000ff);

44: }

45:

46: _____________________________________________ // RGB색상에서 green를 구하는 함수

47: {

48: return (rgb & 0x00ff00) >> 8;

49: }

50:

51: _____________________________________________ // RGB색상에서 blue를 구하는 함수

52: {

53: return (rgb & 0xff0000) >> 16;

54: }

-- 평가

올바른실행결과가나오는지확인해보자.

Page 61: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

61

함수 CHAPTER 06

연 습 문 제

1. 함수에 대한 설명 중 잘못된 것을 모두 고르시오.

①함수를호출하려면반드시함수의선언또는정의가필요하다.

②함수의정의는생략할수없다.

③함수선언시매개변수이름은생략할수없다.

④함수를호출할때는매개변수의개수와인자의개수가같아야한다.

⑤리턴값을갖지않는함수는리턴값을생략한다.

2. 함수를 사용할 때의 장점이 아닌 것은?

①코드가중복되지않고간결해진다.

②코드의재사용성이증가된다.

③프로그램의모듈화가증대된다.

④프로그램의기능을함수단위로나누어두었기때문에코드를수정하기가어려워진다.

3. 함수의 리턴형과 매개변수에 대한 설명 중 잘못된 것을 모두 고르시오.

①함수의리턴형은함수가처리결과로리턴하는값의데이터형이다.

②함수의리턴형을여러개지정할수있다.

③함수의매개변수는함수안에선언된변수를말한다.

④함수의매개변수의개수에는제한이없다.

⑤함수호출시넘겨준인자는매개변수로전달된다.

⑥함수의매개변수도일종의지역변수이다.

Page 62: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

62

4. 다음은 함수의 호출 과정이다. 올바른 순서로 나열하시오.

A.함수의매개변수로인자를전달한다.

B.함수호출문다음의코드를수행한다.

C.인자가수식인경우수식의값을평가한다.

D.함수의코드를수행한다.

E.함수의정의로이동한다.

F. 함수를호출한곳으로되돌아온다.

G.함수를호출한곳으로리턴값을전달한다.

C → A → E → D → G → F → B

5. 지역 변수에 대한 설명 중 잘못된 것을 모두 고르시오.

①함수밖에선언된변수를지역변수라고한다.

②지역변수는따로초기화하지않으면쓰레기값이다.

③서로다른함수에서는같은이름의지역변수를선언할수있다.

④다른함수에선언된지역변수를사용할수있다.

⑤함수안에서다시블록을정의하고블록안에지역변수를선언할수있다.

6. 같은 이름의 변수가 여러 번 선언되었을 때 가장 가까운 블록 안에 선언된 변수가

우선적으로 사용되는 규칙을 무엇이라고 하는가?

영역 규칙(scope rule)

7. 함수 바깥쪽에 선언되어 프로그램 전체에서 사용될 수 있는 변수를 무엇이라고 하

는가?

전역 변수

8. 함수의 인자를 전달할 때 인자의 값을 매개변수로 복사해서 전달하는 방식은?

값에 의한 전달(Passing by value)

Page 63: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

63

함수 CHAPTER 06

9. 다음 중 올바른 함수 선언이 아닌 것은?

①intGetSum(intnum);

②voidPrintHello();

③GetFactorial(intnum);

④doubleGetMax(double,double,double);

10. 함수의 인자 전달 방법에 대한 설명 중 잘못된 것은?

①함수를호출할때넘겨주는값을실매개변수또는인자라고한다.

②함수호출시전달되는값을받아오기위한변수를형식매개변수또는매개변수라고

한다.

③함수의형식매개변수는함수호출시생성되는지역변수이다.

④함수를호출할때인자가매개변수로복사되어전달된다.

⑤함수가리턴해도함수의매개변수를해제되지않고남아있는다.

11. 다음 프로그램에서 _____________에 필요한 코드를 작성하시오.

#include <stdio.h>

#include <math.h>

_______________________________________________________

int main()

{

int a, b, c, d;

double length;

printf("직선의 시작점의 좌표 x, y를 입력하세요 : ");

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

printf("직선의 끝점의 좌표 x, y를 입력하세요 : ");

scanf("%d %d", &c, &d);

length = GetLength(a, b, c, d);

printf("두 점 사이의 거리 : %f\n", length);

Page 64: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

64

return 0;

}

double GetLength(int x1, int y1, int x2, int y2)

{

int dx = x2 - x1;

int dy = y2 - y1;

return sqrt(dx*dx + dy*dy);

}

double GetLength(int x1, int y1, int x2, int y2);또는 double GetLength(int, int, int, int);

12. 다음 프로그램의 실행 결과를 쓰시오.

#include <stdio.h>

double dummy = 12.34;

int main(void)

{

double dummy = 56.78;

if( dummy > 20 )

{

double dummy = 16.25;

dummy++;

printf("dummy = %f\n", dummy);

}

return 0;

}

dummy = 17.250000

Page 65: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

65

함수 CHAPTER 06

13. 실수 값을 인자로 받아서 절대값을 구하는 Absolute 함수를 정의하시오.

14. 실수 값을 인자로 받아서 소수 첫째 자리에서 반올림한 정수 값을 리턴하는 Round

함수를 정의하시오. 반올림 함수 Round는 양수일 때와 음수일 때 모두 올바르게

동작해야 한다.

예를 들어, Round(1.2)는 1을, Round(1.7)은 2를 리턴해야 하고, Round(1.2)는 -1

을, Round(-1.7)은 -2를 리턴해야 한다.

15. 연도를 인자로 받아서 윤년인지 여부를 판단하는 IsLeapYear 함수를 정의하시오.

IsLeapYear 함수는 윤년이면 1을, 그렇지 않으면 0을 리턴해야 한다. 참고로 연도

를 4로 나누어 떨어지면 윤년, 4로 나누어 떨어지는 연도 중에서 100으로 나누어

떨어지는 연도는 윤년이 아니고, 100으로 나누어 떨어지는 연도 중 다시 400으로

나누어 떨어지는 연도는 윤년이다.

16. 연도와 월을 인자로 받아서 그 달의 날짜 수를 리턴하는 GetDaysOfMonth 함수를

정의하시오. 1, 3, 5, 7, 8, 10, 12월은 31일이고, 2, 4, 6, 9, 11월은 30일이다. 단,

2월은 윤년이면 29일, 윤년이 아니면 28일이다. 15번에서 만든 IsLeapYear 함수를

이용해서 정의한다. GetDaysOfMonth를 정의한 다음 사용자로부터 연도와 월을

입력받아서 날짜 수를 출력하는 프로그램을 작성하시오.

17. 정수 값을 인자로 받아서 소수인지 판단하는 IsPrime 함수를 정의하고, IsPrime 함

수를 이용해서 1부터 100사이의 소수를 모두 구해서 출력하는 프로그램을 작성하

시오.

Page 66: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

66

18. 문자를 입력으로 받아서 소문자인지 검사하는 IsLower 함수, 대문자인지 검사하는

IsUpper함수를 정의하시오. IsLower 함수는 인자로 전달된 문자가 소문자면 1을

반환하고, 아니면 0을 반환한다. IsUpper 함수는 인자로 전달된 문자가 대문자면 1

을 반환하고, 아니면 0을 반환한다.

또한, 두 함수를 이용해서 알파벳인지 검사하는 IsAlphabetic 함수를 정의하시오.

IsAlphabetic 함수는 인자로 전달된 문자가 알파벳이면 1을 반환하고, 아니면 0을

반환한다.

19. x의 y승인 xy를 구하는 Power 함수를 정의하시오. 이때, x, y와 xy는 모두 실수이다.

20. 정수형 좌표를 사용하는 2차원 평면에서 (x1, y1)과 (x2, y2)이 이루는 직사각형에

대하여 직사각형의 폭을 구하는 GetRectWidth 함수, 직사각형의 높이을 구하는

GetRectHeight 함수, 직사각형의 면적을 구하는 GetRectArea 함수, 직사각형의

둘레를 구하는 GetRectPerimeter 함수를 정의하시오.

(x1, y1)

(x1, y1)

직사각형

Page 67: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

배열과 문자열

C H A P T E R 7

Page 68: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

68

실 전 과 제

-- 목표

두개의인덱스를사용하는이차원배열을이용해본다.

-- 과제

2x3행렬과3x2행렬을곱해서2x2행렬을구하는프로그램을작성하시오.

-- 요구사항

•제1크기가2,제2크기가3인이차원배열과제1크기가3,제2크기가2인이차원배열을선

언한다.

•행렬의곱을구해서저장하기위해서제1크기가2,제2크기가2인이차원배열은선언한다.

•행렬의곱을구한다음,각각의행렬을출력한다.

-- 힌트

•행렬의곱을구하는방법은다음과같다.

ad

be

cf

gik

hjl

ag bi ckdg ei fk

ah bj cldh ei fl

+ ++ +

+ ++ +

R

T

SSSSSSSS# #

V

X

WWWWWWWW& &

•행렬의곱에사용할이차원배열은다음과같이초기화한다.

� ���� �[2][3];� � � � � ���� y[3][2];

Page 69: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

69

배열과 문자열 CHAPTER 07

•프로그램의실행예는다음과같다.

첫번째 행렬(2x3) :

1 2 3

3 2 1

두번째 행렬(3x2) :

10 20

30 40

50 60

행렬의 곱(2x2) :

220 280

140 200

-- 구현

직접프로그램코드를작성해보고,다음코드의____부분에필요한코드를채워넣으시오.

01: /* Lab07.c */

02: #include <stdio.h>

03:

04: int main(void)

05: {

06: int x[2][3] = ________________________________________;

07: int y[3][2] = ________________________________________;

08: int z[2][2] = {0};

09: int i, j, k;

10:

11: for(______________________)

12: for(______________________)

13: for(j=0 ; j<3 ; j++)

14: z[k][i] += x[k][j]*y[j][i];

15:

16: printf("첫번째 행렬(2x3) : \n");

17: for(______________________)

18: {

19: for(______________________)

Page 70: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

70

20: printf("%4d ", x[i][j]);

21: printf("\n");

22: }

23:

24: printf("두번째 행렬(3x2) : \n");

25: for(______________________)

26: {

27: for(______________________)

28: printf("%4d ", y[i][j]);

29: printf("\n");

30: }

31:

32: printf("행렬의 곱(2x2) : \n");

33: for(______________________)

34: {

35: for(______________________)

36: printf("%4d ", z[i][j]);

37: printf("\n");

38: }

39:

40: return 0;

41: }

-- 평가

올바른실행결과가나오는지확인해보자.

Page 71: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

71

배열과 문자열 CHAPTER 07

연 습 문 제

1. 배열의 선언에 대한 설명 중 잘못된 것을 모두 고르시오.

①배열은서로다른데이터형의변수를하나로묶어서사용하는것이다.배열의각원소는

인덱스로접근한다.

②배열의크기는상수로만지정할수있다.

③크기를지정하지않는배열을선언할수있다.

④배열을선언하려면배열의데이터형이필요하다.

⑤배열전체의바이트크기를구하려면sizeof연산자를이용한다.

2. 배열의 사용에 대한 설명 중 올바른 것을 모두 고르시오.

①배열의각원소에접근하려면배열의인덱스를사용한다.

②배열의인덱스는0부터시작한다.

③배열의각원소를사용할때는배열의크기를신경쓰지않아도된다.

④크기가5인배열은인덱스로5까지사용할수있다.

⑤배열의인덱스로잘못된값을사용하면컴파일에러가발생한다.

3. 다음 중 배열의 선언 및 초기화가 잘못된 것은?

①intarr1[3]={0};

②intarr2[];

③intarr3[3]={10,20,30};

④intarr4[]={10,20,30,40};

Page 72: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

72

4. 다음 중 이차원 배열의 선언 및 초기화가 잘못된 것은?

①shortarr1[2][2]={1,2,3,4};

②shortarr2[2][2]={{1,2},{3,4}};

③shortarr3[][2]={1,2,3,4,5,6};

④shortarr4[2][]={1,2,3,4,5,6};

5. 다차원 배열에 대한 설명 중 잘못된 것은?.

①원소접근시두개이상의인덱스를사용하는배열을말한다.

②다차원배열도메모리에할당될때는일차원배열처럼연속적으로할당된다.

③다차원배열의각원소를순차적으로접근하려면가장오른쪽인덱스부터증가된다.

④이차원배열의제2크기는생략할수있다.

6. 배열의 각 원소에 접근하기 위해서 배열 이름 다음에 [ ] 안에 써주는 정수 값을 무

엇이라고 하는가?

첨자 또는 인덱스

7. 문자열에 대한 설명 중 잘못된 것을 모두 고르시오.

①문자열은연속된문자들의모임이므로int배열처럼생각할수있다.

②C의문자열은항상널문자로끝난다.

③“hello”를저장하려면6바이트가필요하다.

④널문자열은널문자만으로된문자열을말한다.

⑤변경될수있는문자열을저장하려면문자열상수를사용한다.

Page 73: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

73

배열과 문자열 CHAPTER 07

8. 다음 중 문자배열의 선언 및 초기화가 잘못된 것은?

①charstr[5]={‘1’,‘2’,‘3’,‘4’,‘\0’};

②charstr[1]=‘A’;

③charstr[5]=“”;

④charstr[]=“1234”;

9. 다음과 같이 선언된 문자배열이 있을 때 컴파일 에러가 발생하는 코드는?

char s[10] = "xyz";

①s[0]=‘A’;

②s=“apple”;

③s[0]=0;

④scanf(“%s”,s);

10. 문자열 처리 함수와 그 기능이 잘못 짝지어진 것은?

①strcpy→문자열복사

②strlen→문자열의길이구하기

③strcmp→문자열비교

④strcat→문자열입력

Page 74: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

74

11. 다음 프로그램의 실행 결과를 쓰시오.

#include <stdio.h>

int main(void)

{

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

int i, j;

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

{

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

{

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

}

printf("\n");

}

return 0;

}

1 0 02 3 04 5 6

12. 다음 프로그램의 실행 결과를 쓰시오.

#include <stdio.h>

int main()

{

double data[] = {1.5, 3.2, 4.7, 5.8};

printf("%d\n", sizeof(data));

printf("%d\n", sizeof(data)/sizeof(data[0]));

return 0;

}

324

Page 75: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

75

배열과 문자열 CHAPTER 07

13. 줄 바꿈 문자(‘\n’)를 지정하지 않아도 문자열 출력 후 자동으로 줄 바꿈 문자를 출

력하는 표준 C 라이브러리 함수는 무엇인가?

puts 함수

14. 정수 값을 10개 입력받아서 그 중 양수의 개수와 음수의 개수, 0의 개수를 출력하

는 출력하는 프로그램을 작성하시오.

15. 입력받은 문자열에 대하여 역순으로 된 문자열을 만들어서 출력하는 프로그램을 작

성하시오.

16. 3x3 행렬의 차를 구하는 프로그램을 작성하시오.

17. 정수 값을 인자로 받아서 소수인지 판단하는 IsPrime 함수를 이용해서 가장 작은

소수 100개를 구해서 정수형 배열에 저장한 다음, 구한 소수들을 한 줄에 10개씩

출력하는 프로그램을 작성하시오.

18. 문자열을 입력받아 문자열을 모두 대문자로 변경하는 프로그램을 작성하시오. 프로

그램의 실행 결과는 다음과 같아야 한다.

문자열을 입력하세요 : hello world

변경 후 문자열 : HELLO WORLD

Page 76: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

76

19. 실수 값 10개를 입력받아 평균, 분산, 표준편차를 각각 구하는 프로그램을 작성하

시오. 분산과 표준 편차를 구하는 방법은 다음과 같다.

분산Variance변량의 개수편차의 총합

※ 편차: 각 변량에서 평균을 뺀 값표준편차Standard Deviation분산

20. 문자열을 입력받아 각 단어의 첫 글자를 대문자로 변경하는 프로그램을 작성하시

오. 프로그램의 실행 결과는 다음과 같아야 한다.

문자열을 입력하세요 : this is character array test program

변경 후 문자열 : This Is Character Array Test Program

21. 문자열에서 공백문자를 모두 제거하는 프로그램을 작성하시오. 프로그램의 실행 결

과는 다음과 같아야 한다.

문자열을 입력하세요 : this is character array test program

변경 후 문자열 : thisischaracterarraytestprogram

22. 크기가 10인 int형 배열에 대하여 특정 값을 갖는 원소를 찾아서 그 위치(인덱스)를

알려주는 프로그램을 작성하시오. 특정 값을 갖는 원소를 찾으면 찾은 원소의 인덱

스를 출력하고, 찾지 못하면 에러 메시지를 출력한다. 배열은 미리 초기화 해두고

사용하고, 배열에서 검색할 값은 사용자로부터 입력을 받도록 한다.

Page 77: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

포인터

C H A P T E R 8

Page 78: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

78

실 전 과 제

-- 목표

포인터를이용해서배열의원소에접근해본다.

-- 과제

문자배열에문자열을입력받아또문자열의길이를구해서출력하는프로그램을작성하시오.

단,문자열의길이를구할때문자배열의원소를가리키는포인터를이용하시오.

-- 요구사항

•문자배열을선언하고,문자열을입력받아저장한다.

•문자배열의주소를저장할포인터변수를선언한다.

•배열의원소를가리키는포인터변수와반복문을이용해서문자배열의길이를구한다.(라

이브러리함수인strlen함수를이용해서는안된다.)

-- 힌트

•빈칸을포함한문자열을입력받으려면gets함수를사용한다.

•문자열의길이를구하려면문장열의끝에있는널문자를만날때까지문자의개수를센다.

•프로그램의실행예는다음과같다.

문자열을 입력하세요 : good morning

문자열의 길이 : 12

Page 79: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

79

포인터 CHAPTER 08

-- 구현

직접프로그램코드를작성해보고,다음코드의____부분에필요한코드를채워넣으시오.

01: /* Lab08.c */

02: #include <stdio.h>

03:

04: int main(void)

05: {

06: char str[256];

07: _____________________; // str을 가리키는 포인터 변수 선언

08: int len; // 문자열의 길이를 구해서 저장할 변수

09:

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

11: gets(str);

12:

13: len = 0;

14: while(________________) // p가 가리키는 문자열의 끝을 만날 때까지

15: {

16: len++; // 문자 개수 증가

17: ___________; // 포인터가 다음 문자 가리키도록 변경

18: }

19:

20: printf("문자열의 길이 : %d\n", len);

21:

22: return 0;

23: }

-- 평가

올바른실행결과가나오는지확인해보자.

Page 80: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

80

연 습 문 제

1. 포인터에 대한 설명 중 잘못된 것을 모두 고르시오.

①포인터는다른변수를가리키는변수이다.

②포인터변수는다른변수의이름를저장한다.

③포인터변수도변수이므로주소를구할수있다.

④포인터변수의크기는포인터가가리키는변수의크기와같다.

⑤포인터변수가가리키는변수에접근하려면*연산자를이용한다.

⑥변수의주소를구할때는&연산자를이용한다.

2. 다음 중 포인터의 선언 및 초기화가 잘못된 것을 모두 고르시오.

① int x;

int *p1 = &x;

② short s;

int *p2 = &s;

③ char str[20];

char *p3 = str;

④ double d;

double *p4 = d;

⑤ float f;

float *p5 = NULL;

3. 포인터 사용에 대한 설명 중 잘못된 것은?

①포인터변수의데이터형은포인터변수가가리키는변수의데이터형과서로달라도된다.

②포인터를초기화하지않고사용하는것은위험하다.

③간접참조연산자(*)는포인터변수에만사용할수있다.

④주소구하기연산자(&)는상수나수식에는사용할수없다.

Page 81: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

81

포인터 CHAPTER 08

4. 널 포인터에 대한 설명 중 잘못된 것은?

①NULL이라는매크로상수가라이브러리에정의되어있다.

②NULL매크로대신0을사용해도된다.

③포인터가가리키는변수가없을때널포인터로만든다.

④널포인터에대하여간접참조연산자(*)를사용하면메모리0번지에접근한다.

5. 다음과 같이 short*형의 포인터 변수가 선언되어 있을 때, 포인터 연산의 결과를 구

하시오.

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

short *p = arr; // p에 저장된 arr의 주소가 0x8000번지라고 가정하자.

(1)p+1 0X8002

(2)p+3 0X8006

(3)*p 10

(4)*(p+2) 30

(5)p[5]; 60

6. 다음과 같이 선언된 포인터 변수에 대한 코드의 실행 결과 중 잘못된 것은?

double num = 12.34; // num의 주소는 0x5678번지

double *p = &num; // p의 주소는 0x5670번지

코드 실행결과

①printf(“%lf”,*p); 12.340000

②printf(“%p”,p); 00005678

③printf(“%p”,&p); 00005674

④printf(“%p”,p+1); 00005678

⑤printf(“%d”,sizeof(p)); 4

Page 82: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

82

7. 다음과 같이 선언된 int형 변수와 int*형의 포인터 변수에 대하여 잘못된 코드는?

int data = 10;

int *p = &data;

①p=NULL;

②p=&(data+1);

③*p=100;

④p=&data+1;

8. 배열과 포인터에 대한 설명 중 잘못된 것은?

①배열의이름은배열의시작주소가되므로포인터인것처럼사용할수있다.

②arr[i]는*(arr+i)를의미한다.

③포인터변수가배열원소를가리키고있을때,포인터를배열인것처럼사용할수있다.

④배열의시작주소는변경할수있다.

9. 다음과 같이 선언된 배열과 포인터 변수에 대해서 여러 가지 수식 중 의미가 다른

하나는?

int x[10];

int *p = x;

①*(x+i)

②x[i]

③*(p+i)

④&p[i]

Page 83: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

83

포인터 CHAPTER 08

10. 다음과 같이 선언된 배열과 포인터 변수에 대한 코드 중 컴파일 에러가 발생하는 것

은?

int x[10], y[10];

int *p = x;

①p++; ②x++;

③p=y; ④p=&x[3];

11. 가리키는 변수가 없다는 의미로 0번지를 저장하는 포인터를 무엇이라고 하는지 쓰

시오.

널 포인터

12. 문자열 포인터에 대한 설명 중 잘못된 것은?

①문자열의주소를저장하려면char*형을사용한다.

②문자배열의주소를저장할때는char*형을사용한다.

③문자열리터럴의주소를저장할때는constchar*형을사용하는것이좋다.

④constchar*형의포인터변수가가리키는문자열은변경할수있다.

13. 다음과 같이 선언된 문자 배열과 포인터가 있을 때 컴파일 에러나 실행 에러가 발생

할 수 있는 문장을 모두 고르시오.

char str[] = "hello world";

char *p1 = "good bye";

char *p2 = str;

①p1=“Hello”; ②p1[0]=‘G’;

③p2[0]=‘H’; ④strcpy(p1,“abcde”);

⑤strcpy(p2,“abcde”); ⑥str=“Hello”;

Page 84: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

84

14. 다음 프로그램에서 컴파일 에러가 발생하는 곳을 모두 찾으시오.

#include <stdio.h>

#include <string.h>

int main(void)

{

char str1[20] = "Hello World";

char str2[20] = "Good Bye";

const char *p1 = str1;

char * const p2 = str1;

const char * const p3 = str1;

p1[0] = 'A'; // ①

p1 = str2; // ②

p2[0] = 'A'; // ③

p2 = str2; // ④

p3[0] = 'A'; // ⑤

p3 = str2; // ⑥

return 0;

}

①, ④, ⑤, ⑥

15. 다음과 같이 선언된 포인터 변수 pi, pc, pd에 대해서 pi의 값이 0x12FF60번지이고,

pc가 0x12FF40 번지이고, pd가 0x12FF00번지일 때, 포인터 연산의 결과를 구하

시오.

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

int *pi = arr1; // pi는 0x12FF60번지

char arr2[] = "abcdefg";

char *pc = arr2; // pc는 0x12FF40번지

double arr3[5] = {1.1, 2.2, 3.3, 4.4, 5.5};

double *pd = arr3; // pd는 0x12FF00번지

Page 85: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

85

포인터 CHAPTER 08

(1)pi+2 0x12FF68

(2)*(pi+1) 20

(3)pc[3] d

(4)&arr3[3]-&arr3[1] 2

(5)&pd[1] 0x12FF08

16. 다음은 포인터로 배열에 접근해서 배열의 원소를 1 증가 시킨 후 출력하는 프로그

램이다. _____________에 필요한 코드를 작성하시오. (단, 반드시 p를 이용해서

배열의 원소에 접근해야 한다.)

#include <stdio.h>

int main()

{

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

int *p = NULL;

int i;

p = arr;

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

{

printf("%d ", );

p++;

}

printf("\n");

return 0;

}

++*p 또는 ++(*p) 또는 ++p[0]

Page 86: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

86

17. 다음 프로그램의 실행 결과를 쓰시오.

#include <stdio.h>

int main()

{

char str[] = "abcdefghij";

char *p = NULL;

p = str + 1;

p[0] = 'X';

p = str + 3;

p[1] = 'Y';

p = str + 5;

p[2] = 'Z';

printf("str = %s\n", str);

return 0;

}

str = aXcdYfgZij

18. 문자 배열에 문자열을 입력받아 또 다른 문자 배열로 복사하는 프로그램을 작성하

시오. 단, 문자열을 복사할 때 문자 배열의 원소를 가리키는 포인터를 이용하시오.

(단, 라이브러리 함수인 strlen 함수를 이용해서는 안 된다.)

19. 문자열을 2개 입력 받아서 두 문자열을 대소문자 구분하지 않고 비교해서 같은지

여부를 출력하는 프로그램을 작성하시오. 두 문자열을 비교할 때는 문자열 포인터

변수를 이용한다. 프로그램의 실행 결과는 다음과 같아야 한다.

첫 번째 문자열을 입력하세요 : Good Luck

두 번째 문자열을 입력하세요 : good luck

Good Luck와(과) good luck는(은) 같습니다.

Page 87: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

87

포인터 CHAPTER 08

20. 배열 원소를 가리키는 포인터를 이용해서 실수형 배열의 평균을 구하는 프로그램을

작성하시오. (배열의 크기는 마음대로 정하고, 배열의 원소를 원하는 값으로 초기화

해두고 사용한다.)

21. 정수 값을 하나 입력 받아서 정수형 배열의 모든 원소를 특정 값만큼 증가시키는

프로그램을 작성하시오. 단, 정수형 배열의 원소를 증가시킬 때 포인터를 이용하시

오. 프로그램의 실행 결과는 다음과 같아야 한다.

[ 원본 배열 ] 15 23 7 78 34 67 45 36 90 71

증가량을 입력하세요 : 5

[ 증가후 배열 ] 20 28 12 83 39 72 50 41 95 76

22. 입력받은 문자열을 역순으로 만드는 프로그램을 작성하시오. 단, 문자열을 역순으로

만들 때 문자열 포인터를 이용하시오.

23. 입력받은 문자열 중 공백 문자(‘ ’, ‘\t’, ‘\v’, ‘\n’, ‘\f’, ‘\r’)의 개수를 구해서 출력하는

프로그램을 작성하시오. 공백 문자인지 검사할 때는 표준 C 라이브러리의 isspace

함수를 이용하거나 직접 각각의 문자가 공백 문자인지 검사해도 된다. 단, 문자열의

각 문자가 공백 문자인지 검사할 때 문자열 포인터를 이용하시오.

Page 88: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual
Page 89: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

구조체

C H A P T E R 9

Page 90: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

90

실 전 과 제

-- 목표

구조체배열을이용해본다.

-- 과제

이차원평면상의직사각형은직사각형의좌상단점의좌표(left,top),우하단점의좌표(right,

bottom)에의해서결정된다.이런직사각형정보를저장하는rect구조체를정의하고,크기가

5인구조체배열을선언한다.직사각형정보를입력받아서rect구조체배열에저장하고,rect

구조체에대한여러가지정보(직사각형의좌표,직사각형의폭/높이)를출력하는프로그램을

작성하시오.

-- 요구사항

(left, top)

(right, bottom)

좌상단점

우하단점

직사각형

•직사각형의좌상단점의x좌표에해당하는left,y좌표에해당하는top,우하단점의x좌표에

해당하는right,y좌표에해당하는bottom을멤버로갖는구조체를정의한다.

struct rect {

int left; // 직사각형의 좌상단점의 x좌표

int top; // 직사각형의 좌상단점의 y좌표

int right; // 직사각형의 우하단점의 x좌표

int bottom; // 직사각형의 우하단점의 y좌표

};

•구조체를간편하게사용할수있도록typedef로정의한다.

typedef struct rect RECT;

Page 91: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

91

구조체 CHAPTER 09

•매크로상수를이용해서크기가5인구조체배열을선언한다.

#define COUNT 5

RECT rects[COUNT];

•구조체배열에직사각형정보(좌상단점의좌표,우하단점의좌표)를입력받는다.

•구조체배열에대해서각각의직사각형정보(좌상단점/우하단점의좌표,폭,높이)를출력

한다.

-- 힌트

•직사각형의폭은(right–left)로구할수있는데,이때직사각형의폭은음수값이될수

없으므로(right–left)의절대값을구한다.

•직사각형의높이는(bottom-top)으로구할수있는데,이때직사각형의높이는음수값이

될수없으므로(bottom-top)의절대값을구한다.

•프로그램의실행예는다음과같다.

좌상단점/우하단점의 좌표를 입력하세요(left, top, right, bottom 순)

10 10 20 30

좌상단점/우하단점의 좌표를 입력하세요(left, top, right, bottom 순)

0 0 50 70

좌상단점/우하단점의 좌표를 입력하세요(left, top, right, bottom 순)

90 80 5 15

좌상단점/우하단점의 좌표를 입력하세요(left, top, right, bottom 순)

55 66 2 5

좌상단점/우하단점의 좌표를 입력하세요(left, top, right, bottom 순)

20 0 99 78

1 번째 직사각형 : 좌상단점=(10,10) 우하단점=(20,30) 폭=10 높이=20

2 번째 직사각형 : 좌상단점=(0,0) 우하단점=(50,70) 폭=50 높이=70

3 번째 직사각형 : 좌상단점=(90,80) 우하단점=(5,15) 폭=85 높이=65

4 번째 직사각형 : 좌상단점=(55,66) 우하단점=(2,5) 폭=53 높이=61

5 번째 직사각형 : 좌상단점=(20,0) 우하단점=(99,78) 폭=79 높이=78

Page 92: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

92

-- 구현

직접프로그램코드를작성해보고,다음코드의____부분에필요한코드를채워넣으시오.

01: /* Lab09.c */

02: #include <stdio.h>

03: #define COUNT 5

04:

05: struct rect {

06: int left; // 직사각형의 좌상단점의 x좌표

07: int top; // 직사각형의 좌상단점의 y좌표

08: int right; // 직사각형의 우하단점의 x좌표

09: int bottom; // 직사각형의 우하단점의 y좌표

10: };

11: typedef struct rect RECT;

12:

13: int main( )

14: {

15: RECT rects[COUNT] = {0};

16: int i;

17:

18: for( i = 0; i < COUNT ; i++ )

19: {

20: printf("좌상단점/우하단점의 좌표를 입력하세요(left, top, right,

bottom 순)\n");

21: scanf("%d %d %d %d",

22: ________________________________________); // rect 멤버 입력

23: }

24:

25: for( i = 0; i < COUNT; i++ )

26: {

27: int width = ___________________________; // 직사각형의 폭

28: int height = ___________________________; // 직사각형의 높이

29:

Page 93: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

93

구조체 CHAPTER 09

30: width = width > 0 ? width : -width;

31: height = height > 0 ? height : -height;

32:

33: printf("%d 번째 직사각형 : ", i+1);

34: printf("좌상단점=(%d,%d) 우하단점=(%d,%d) 폭=%d 높이=%d\n",

35: ________________________________________); // rect 멤버 출력

36: }

37: return 0;

38: }

-- 평가

올바른실행결과가나오는지확인해보자.

Page 94: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

94

연 습 문 제

1. 구조체에 대한 설명 중 잘못된 것은?.

①구조체는서로다른데이터형의변수들을하나로묶은것이다.

②구조체를구성하는변수를구조체의멤버라고한다.

③구조체안에멤버로배열이나포인터를넣을수있다.

④구조체를정의한다고해서구조체의멤버가메모리에할당되지는않는다.

⑤구조체는C언어가제공하는기본데이터형이다..

2. 다음 중 구조체의 정의 및 구조체의 변수 선언이 잘못된 것은?

① struct date {

unsigned int year, month, day;

};

struct date d1;

② struct employee {

char name[20];

unsigned int salary;

} e1;

③ struct pixel {

unsigned int color;

int x, y;

};

pixel p1;

④ struct {

unsigned char red, green, blue;

} rgb1;

Page 95: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

95

구조체 CHAPTER 09

3. 다음과 같이 date 구조체가 정의되어 있을 때, 구조체 변수에 대한 사용이 잘못된

것을 모두 고르시오.

struct date {

unsigned int year, month, day;

};

struct date d1 = {2016, 1, 1};

struct date d2;

① d1.day = 31;

②d2={2017,12,31};

③ struct date d3 = d1;

④ d2 = d1;

⑤ if( d1 != d2 )

printf("두 날짜가 다릅니다.\n");

4. 다음과 같이 font 구조체가 정의되어 있을 때, 구조체 배열과 구조체 포인터에 대한

사용이 잘못된 것을 모두 고르시오.

struct font {

char faceName[40]; // 폰트명

unsigned int size; // 폰트 크기

int weight; // 폰트 두께

};

struct font defaultFonts[3] = {

{"굴림", 10, 1}, {"돋음", 12, 2}, {"바탕", 11, 2},

};

struct font *pCurrentFont = NULL;

① strcpy(defaultFonts[0].facename, "바탕");

② defaultFonts.size[1] = 10;

③ pCurrentFont = defaultFonts + 1;

④ pCurrentFont.size += 2;

⑤ pCurrentFont[0].weight++;

⑥ printf("%s", pCurrentFont->facename);

Page 96: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

96

5. 구조체의 일종으로 멤버를 비트 단위로 나누어서 할당하는 방법을 무엇이라고 하는

가?

비트필드

6. 비트필드에 대한 설명 중 잘못된 것은?

①메모리를비트단위로나누어서할당할수있다.

②최하위비트부터첫번째멤버를할당한다.

③비트필드의멤버사이에사용되지않는비트를지정할수있다.

④비트필드를정의할때는bitfield키워드를사용한다.

7. 사용자 정의형을 만드는 방법 중 모든 멤버가 같은 주소에 할당되어 메모리를 공유

하도록 하는 기능을 무엇이라고 하는가?

공용체(union)

8. 다음에 정의된 공용체의 크기는 얼마인가?

union dummy {

unsigned char str[10];

double d;

char x;

};

①10바이트

②19바이트

③20바이트

④22바이트

Page 97: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

97

구조체 CHAPTER 09

9. 열거체와 열거 상수의 정의 중 잘못된 것은?

① enum job_code {teacher = 0x10, doctor = 0x20, salesman = 0x30};

② enum film_rate {general, pg_13, restricted, no_child};

③ enum math {zero = 0.0, pi=3.1415};

④ enum file_open_mode {read, write, append, text=0x10, binary=0x20};

10. 기존의 데이터형에 새로운 이름을 붙이는 typedef의 사용 목적 두 가지를 쓰시오.

프로그램의 이식성을 높이기 위해서, 프로그램의 가독성을 높이기 위해서

11. 다음과 같이 date 구조체가 정의되어 있고 typedef로 DATE를 정의했을 때, 잘못된

코드는?

struct date {

unsigned int year, month, day;

};

typedef struct date DATE;

① struct date d1, d2;

② DATE d3 = {2016, 3, 1};

③ void PrintDate(DATE d);

④structDATEd4;

Page 98: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

98

12. 다음은 date 구조체 배열을 이용해서 날짜를 연, 월, 일로 나누어 입력받고, 출력하

는 프로그램이다. __________에 필요한 코드를 직접 작성하시오.

#include <stdio.h>

struct date {

unsigned int year, month, day;

};

int main( )

{

struct date d1 = {0};

printf("날짜를 입력하세요(연,월,일 순) : ");

scanf("%d %d %d", ①_______________________);

printf("입력된 날짜 : %d년 %d월 %d일\n", ②______________________);

return 0;

}

① &d1.year, &d1.month, &d1.day ② d1.year, d1.month, d1.day

13. 다음 프로그램의 실행 결과를 쓰시오.

#include <stdio.h>

union color {

unsigned char rgb[4];

unsigned int dword;

};

int main()

{

union color color1 = {0};

color1.dword = 0x00CC00FF;

Page 99: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

99

구조체 CHAPTER 09

printf("red = %2X, green = %2X, blue = %2X\n",

color1.rgb[0], color1.rgb[1], color1.rgb[2]);

return 0;

}

red = FF, green = 0, blue = CC

14. 다음 프로그램의 실행 결과를 쓰시오.

#include <stdio.h>

enum content_type { book = 0x10, e_book = 0x20 };

enum category_type { fiction, nonfiction, textbook, children };

struct item_info {

char title[128];

int type; // content_type과 category_type의 비트OR로 조합한 값

// (e_book이면서 nonfiction이면 e_book|nonfiction이므로 0x21)

};

int main( )

{

struct item_info item1 = { "개념을 콕콕 잡아주는 C 프로그래밍",

book|textbook };

printf("Item Information\n");

printf(" title : %s\n", item1.title);

printf(" type : %02X\n", item1.type);

return 0;

}

Item Information title : 개념을 콕콕 잡아주는 C 프로그래밍 type : 12

Page 100: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

100

15. 13번 프로그램을 다음과 같이 출력하도록 변경하시오.

Item Information

title : 개념을 콕콕 잡아주는 C 프로그래밍

type : 도서,교재

16. 다음에 정의된 point 구조체를 이용해서 직선의 시작점과 끝점을 멤버로 갖는 line

구조체와 typedef를 정의하시오. line 구조체 변수를 이용해서 직선의 시작점, 끝

점 좌표를 입력받은 다음, 직선의 길이를 구해서 출력하는 프로그램을 작성하시오.

struct point {

int x, y;

};

typedef struct point POINT;

17. 16번에 정의된 line 구조체에 대하여 직선의 정보를 출력하는 PrintLine 함수를 정

의하시오. 이때, line 구조체를 함수의 인자로 전달한다. (필요하면 point 구조체에

대하여 점의 좌표를 출력하는 PrintPoint를 정의해도 된다.)

또한, 특정 값으로 초기화된 line 구조체 변수에 대하여 직선 정보를 출력한 후, x축

으로 이동할 거리와 y축으로 이동할 거리를 입력받아서 직선의 좌표를 이동하고 이

동 후의 직선 정보를 다시 출력하는 프로그램을 작성하시오. 프로그램의 실행 결과

는 다음과 같아야 한다.

변경 전 직선 정보 : 시작점=(10, 20), 끝점=(50, 60)

x축으로 이동할 거리를 입력하세요 : 5

y축으로 이동할 거리를 입력하세요 : -3

변경 후 직선 정보 : 시작점=(15, 17), 끝점=(55, 57)

Page 101: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

101

구조체 CHAPTER 09

18. 13번에 정의된 color 공용체를 이용해서 사용자로부터 red, green, blue 값을 각각

0~255사이의 정수로 입력받은 후 double word 값으로 16진수 출력하는 프로그

램을 작성하시오. 프로그램의 실행 결과는 다음과 같아야 한다.

red를 입력하세요(0~255) : 255

green을 입력하세요(0~255) : 128

blue를 입력하세요(0~255) : 64

color1.dword = 4080FF

19. 이름과 전화번호를 저장하는 간단한 연락처 관리 프로그램을 작성하려고 한다. 이

름과 전화번호를 멤버로 갖는 contact 구조체를 정의하시오. 이름과 전화번호는 각

각 문자열로 저장한다. 그 다음 크기가 5인 contact 구조체 배열을 이용해서 이름

과 전화번호를 입력받아 출력하는 프로그램을 작성하시오. 프로그램의 실행 결과는

다음과 같아야 한다.

이 름 : 유재석

전화번호 : 010-111-1111

이 름 : 박명수

전화번호 : 010-222-2222

이 름 : 정준하

전화번호 : 010-333-3333

이 름 : 정형돈

전화번호 : 010-444-4444

이 름 : 하하

전화번호 : 010-555-5555

--- 전체 연락처 목록 ---

유재석 010-111-1111

박명수 010-222-2222

정준하 010-333-3333

정형돈 010-444-4444

하하 010-555-5555

Page 102: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

102

20. 19번의 contact 구조체를 이용해서 이름으로 전화번호를 검색하는 프로그램을 작

성하시오. contact 구조체 배열을 이용해서 연락처는 최대 100개까지 저장할 수 있

게 한다.

먼저 이름을 입력받아서 기존에 저장된 연락처에서 해당 이름을 찾을 수 있으면 찾

은 연락처의 전화번호를 출력하고, 만일 찾을 수 없으면 전화번호를 입력받아서 새

로운 연락처로 저장한다. 이 프로그램은 반복 수행되다가 이름에 “.”이 입력되면 종

료한다. 프로그램의 실행 결과는 다음과 같아야 한다.

검색할 이름 : 유재석

저장되지 않은 연락처입니다. 저장하시겠습니까? (Y/N) : y

전화번호 입력 : 010-111-1111

검색할 이름 : 박명수

저장되지 않은 연락처입니다. 저장하시겠습니까? (Y/N) : y

전화번호 입력 : 010-222-2222

검색할 이름 : 유재석

찾은 전화번호 : 010-111-1111

검색할 이름 : 박명수

찾은 전화번호 : 010-222-2222

검색할 이름 : .

Page 103: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

103

구조체 CHAPTER 09

21. 실전 과제의 rect 구조체와 point 구조체를 이용해서 직사각형의 좌표와 한 점의

좌표를 입력받아서 그 점이 직사각형 내부의 점인지 검사하는 프로그램을 작성하시

오. 직사각형의 left가 right 보다 크거나 top이 bottom보다 크면, 각각 두 값을 맞

교환해서 항상 left는 right보다 작거나 같아야 하고, top은 bottom보다 작거나 같

게 만든 다음에 직사각형 내부의 점인지 검사하도록 한다. 프로그램의 실행 결과는

다음과 같아야 한다.

좌상단점/우하단점의 좌표를 입력하세요(left, top, right, bottom 순)

50 60 10 20

입력된 직사각형: 좌상단점=(50,60), 우하단점=(10,20)

수정된 직사각형: 좌상단점=(10,20), 우하단점=(50,60)

한점의 좌표를 입력하세요(x, y) : 30 40

(30, 40)는 직사각형 내부에 있습니다.

Page 104: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual
Page 105: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

함수의 활용

C H A P T E R 10

Page 106: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

106

실 전 과 제

-- 목표

구조체를함수의인자로전달하는다양한방법을알아본다.

-- 과제

한점의좌표와직사각형정보를각각입력받아직사각형내부의점인지여부를출력하는프

로그램을작성하시오.

-- 요구사항

•한점의좌표를나타내는point구조체와직사각형에대한정보를나타내는rect구조체를

정의한다.

•직사각형정보를출력하는PrintRect함수를정의한다.

•직사각형의좌상단점인(left,top)은항상우하단점인(right,bottom)보다작거나같아야

한다.즉,left≤rignt,top≤bottom이항상성립해야한다.rect구조체를인자로전달

해서좌상단점이우하단점의좌표보다작거나같도록만드는NormalizeRect함수를정의

하시오.

•point구조체와rect구조체를인자로전달해서점의좌표가직사각형내부에있으면1을

리턴하고,그렇지않으면0을리턴하는IsPointInRect함수를정의한다.

•한점의좌표와직사각형정보를각각입력받아직사각형내부의점인지여부를출력한다.

-- 힌트

•PrintRect함수는직사각형정보를출력할때함께출력할문자열을첫번째인자로받아오

고,rect구조체를두번째인자로받아온다.

void PrintRect(const char* title, const RECT *rt);

•NormaizeRect함수는rect구조체를인자로받아서left가right보다크면left와right를

맞교환하고,top이bottom보다크면top과bottom을맞교환한다.즉,NormaizeRect함수

에인자로전달된rect구조체는함수안에서이용도되고,변경도되는입출력인자이다.또

한,함수안에서left와right,top과bottom의맞교환이이루어지면1을리턴해서직사각형

이정규화되었음을알려주고,직사각형에변화가없으면0을리턴한다.

•rect구조체의멤버인left와right,top과bottom을맞교환하는데Swap함수를이용한다.

Page 107: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

107

함수의 활용 CHAPTER 10

•IsPointInRect함수는point구조체와rect구조체를인자로갖는함수이며,리턴형은int형

이다.IsPointInRect함수에인자로전달된point구조체와rect구조체는함수안에서이

용만될뿐,변경되지않는입력인자이다.

•프로그램의실행예는다음과같다.

좌상단점/우하단점의 좌표를 입력하세요(left, top, right, bottom 순)

50 60 10 20

입력된 직사각형 : 좌상단점=(50,60), 우하단점=(10,20)

정규화된 직사각형 : 좌상단점=(10,20), 우하단점=(50,60)

한점의 좌표를 입력하세요(x, y) : 30 40

(30, 40)는 직사각형 내부에 있습니다..

-- 구현

직접프로그램코드를작성해보고,다음코드의____부분에필요한코드를채워넣으시오.

01: /* Lab10.c */

02: #include <stdio.h>

03:

04: typedef struct point {

05: int x, y;

06: } POINT;

07:

08: typedef struct rect {

09: int left, top, right, bottom;

10: } RECT;

11:

12: void Swap(int *x, int *y);

13: void PrintRect(const char* title, const RECT *rt);

14: int NormalizeRect(__________________);

15: int IsPointInRect(__________________________________);

16:

17: int main(void)

18: {

19: RECT rect1 = { 0 };

20: POINT pt;

Page 108: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

108

21:

22: printf("좌상단점/우하단점의 좌표를 입력하세요(left, top, right,

bottom 순)\n");

23: scanf("%d %d %d %d", &rect1.left, &rect1.top, &rect1.right,

&rect1.bottom);

24:

25: PrintRect("입력된 직사각형", &rect1);

26: if( NormalizeRect(___________) )

27: {

28: PrintRect("정규화된 직사각형", &rect1);

29: }

30:

31: printf("한점의 좌표를 입력하세요(x, y) : ");

32: scanf("%d %d", &pt.x, &pt.y);

33:

34: printf("(%d, %d)는 ", pt.x, pt.y);

35: if( IsPointInRect(__________________) )

36: printf("직사각형 내부에 있습니다.\n");

37: else

38: printf("직사각형 외부에 있습니다.\n");

39:

40: return 0;

41: }

42:

43: void Swap(int *x, int *y)

44: {

45: int temp = *x;

46: *x = *y;

47: *y = temp;

48: }

49:

50: void PrintRect(const char* title, const RECT *rt)

51: {

52: printf("%s : 좌상단점=(%d,%d), 우하단점=(%d,%d)\n",

Page 109: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

109

함수의 활용 CHAPTER 10

53:

54: title, rt->left, rt->top, rt->right, rt->bottom);

55: }

56:

57: int NormalizeRect(_________________)

58: {

59: int result = 0;

60: ________________________________________________

61: ________________________________________________

62: ________________________________________________

63: ________________________________________________

64: return result; // Normailize되면 1, 아니면 0을 리턴한다.

65: }

66:

67: int IsPointInRect(________________________________________)

68: {

69: ___________________________________________

70: ___________________________________________

71: ___________________________________________

72: }

-- 평가

올바른실행결과가나오는지확인해보자.

Page 110: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

110

연 습 문 제

1. 함수의 인자 전달 방법에 대한 설명 중 잘못된 것을 모두 고르시오.

①함수안에서변경되지않는인자를전달할때는값에의한전달방법을사용한다.

②함수안에서변경되어야하는인자를전달할때는포인터에의한전달방법을사용한다.

③배열을전달할때는값에의한전달방법을사용한다.

④구조체를복사하지않고전달할때는값에의한전달방법을사용한다.

⑤값에의한전달방법은인자의값을매개변수로복사해서전달하는방법이다.

2. int 배열을 인자로 전달하는 함수의 선언 중 잘못된 것은??

① void f(int *arr, int n);

② void f(int arr[ ], int n);

③ void f(const int *arr, int n);

④ void f(const int arr[ ], int n);

⑤ void f(int arr, int n);

3. 포인터에 의한 전달 방법으로 함수의 처리 결과를 받아오는 방법에 대한 설명 중 잘

못된 것은?

①함수를선언할때는매개변수를포인터형으로선언한다.

②함수를호출할때는처리결과를받아올변수를직접인자로전달한다.

③함수를정의할때는매개변수가가리키는곳에함수의처리결과를저장한다.

④함수안에서는포인터로넘겨받은매개변수를이용해서함수호출측의변수에접근한다.

4. 함수 안에서 변경되어야 하는 인자를 전달할 때 사용하는 인자 전달 방법은?

포인터에 의한 전달

Page 111: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

111

함수의 활용 CHAPTER 10

5. double형의 원소를 갖는 배열을 함수의 인자로 전달해서 표준 편차를 구하려고 한

다. 함수의 이름을 StandardDeviation이라고 할 때, 함수의 원형을 쓰시오.

double StandardDeviation(const double *arr, int size); 또는double StandardDeviation(const double arr[], int size);

6. 함수의 인자로 배열을 전달하는 경우에 대한 설명 중 잘못된 것은?

①매개변수의데이터형으로배열원소에대한포인터형을사용한다.

②함수안에서배열의크기가필요할때는sizeof연산자로구한다.

③함수를호출할때는,배열의시작주소를인자로넘겨준다.

④함수안에서배열을사용할때는일반배열처럼사용한다.

7. 함수의 인자로 구조체를 전달하는 경우에 대한 설명 중 잘못된 것은?

①구조체를인자로전달할때는값에의한전달방법을사용하면성능저하가발생할수도

있다.

②구조체를인자로전달할때는포인터로전달할수있다.

③함수안에서구조체가사용만될뿐변경되지않을때는const포인터로전달한다.

④포인터로전달받은구조체의멤버에접근할때는.연산자를이용한다.

8. 함수 원형에 대한 설명이 잘못된 것은?

① char* strcpy(char* s1, const char s2); → s1은 strcpy 함수 안에서 변경될 수 있고,

s2는 변경되지 않는다.

② struct tm *localtime(const time_t *t); → t는 localtime 함수 안에서 변경되지 않

는다.

③ time_t time(time_t *s); → s는 time 함수 안에서 변경될 수 있다.

④ size_t strlen(const char *s);→ s는 strlen 함수 안에서 변경될 수 있다.

9. 자기 자신을 호출하는 함수를 무엇이라고 하는가?

재귀 함수

Page 112: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

112

10. 구조체를 값에 의한 전달 방법으로 전달하는 경우에 비해 포인터에 의한 전달 방법

으로 전달했을 때 어떤 차이가 발생하는 지 쓰시오.

포인터에 의한 전달 방법으로 전달하는 것이 성능 상 더 좋다. 즉, 프로그램의 수행 속도를 증가시킬 수 있다. (구조체를 복사하는데 걸리는 시간을 단축할 수 있기 때문)

11. 함수 안에 선언된 지역 변수가 함수가 리턴될 때 사라지지 않고 메모리에 남아서 다

음 번 함수 호출에 다시 이용되도록 하려면 어떤 기억 부류를 지정해야 하는가?

static

12. 기억 부류에 대한 설명 중 잘못된 것은?

①지역변수는따로지정하지않아도자동으로auto변수가된다.

②register변수는메모리에할당되지않고CPU레지스터에할당된다.

③register변수는경우에따라서메모리에할당될수도있는데,그경우에도레지스터변

수의주소는구할수없다.

④변수의메모리는할당하지않고다른곳에선언되었다고알려주려면extern을지정한다.

⑤전역변수는따로지정하지않으면static으로선언되며,사용범위가전역변수가선언된

소스파일내로제한된다.

13. 정적 지역 변수와 정적 전역 변수에 대한 설명 중 잘못된 것을 모두 고르시오.

①정적지역변수는함수호출시메모리에할당되고함수리턴시메모리에서해제된다..

②정적지역변수는따로초기화하지않으면쓰레기값을갖는다.

③정적지역변수는함수안에선언되고함수안에서만사용된다.

④정적전역변수는프로그램시작시메모리에할당되고프로그램종료시메모리에서해

제된다.

⑤정적전역변수는따로초기화하지않아도자동으로0으로초기화된다.

⑥정적전역변수도extern선언을하면다른소스파일에서사용할수있다.

Page 113: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

113

함수의 활용 CHAPTER 10

14. 다음은 라이브러리 함수와 그 기능을 연결한 것이다. 잘못 연결된 것을 모두 고르시

오.

①strcmp함수:문자열을연결한다.

②atoi함수:문자열을정수로변환한다.

③isdigit함수:숫자인지검사한다.

④rand함수:난수를생성한다.

⑤memcmp함수:메모리를설정한다.

⑥localtime함수:time_t를tm구조체로변환한다.

15. 다음 프로그램에서 MakeLower 함수는 문자 배열을 인자로 받아서 ‘A’~‘Z’에 해

당하는 대문자를 소문자 ‘a’~‘z’로 변환하는 함수이다. 함수의 매개변수에 해당하

는 부분에 알맞은 코드를 작성하시오.

#include <stdio.h>

#include <string.h>

void MakeLower(_______________);

int main()

{

char str[] = "HAPPY Birthday";

MakeLower(str);

printf("str = %s\n", str);

return 0;

}

void MakeLower(_______________)

{

int i;

int len = strlen(s);

int diff = 'a' - 'A';

Page 114: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

114

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

{

if( s[i] >= 'A' && s[i] <= 'Z' )

s[i] = s[i] + diff;

}

}

char *s 또는 char s[]

16. 다음 프로그램에서 PrintPoint 함수는 점의 좌표를 출력하는 함수이고,

Offset 함수는 한 점의 좌표를 xOffset, yOffset만큼 이동시키는 함수이다.

_____________ 부분에 알맞은 코드를 작성하시오.

#include <stdio.h>

#include <math.h>

typedef struct point {

int x, y;

} POINT;

void PrintPoint(const char* title, ①const POINT *pt);

void Offset(②POINT *pt, int xOffset, int yOffset);

int main(void)

{

POINT pt1 = {100, 100};

int dx, dy;

PrintPoint("pt1", &pt1);

printf("x축으로 이동할 거리 : ");

scanf("%d", &dx);

printf("y축으로 이동할 거리 : ");

scanf("%d", &dy);

Offset(&pt1, dx, dy);

PrintPoint("이동후의 pt1", &pt1);

return 0;

}

Page 115: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

115

함수의 활용 CHAPTER 10

void PrintPoint(const char* title, ①const POINT *pt)

{

printf("%s : (%d,%d)\n", title, ③pt->x, pt->y);

}

void Offset(②POINT *pt, int xOffset, int yOffset)

{

④pt->x += xOffset;

⑤pt->y += yOffset;

}

17. 다음 프로그램의 실행 결과를 쓰시오.

#include <stdio.h>

void TestStatic(int num);

int main(void)

{

TestStatic(3);

TestStatic(5);

TestStatic(7);

return 0;

}

void TestStatic(int num)

{

int a = 1;

static int b = 1;

a *= num;

b *= num;

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

}

a = 3, b = 3a = 5, b = 15a = 7, b = 105

Page 116: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

116

18. 문자열을 인자로 전달하면 암호화해서 리턴하는 Encrypt 함수를 다음과 같이 정의

하였다. 암호화를 위해서 Encrypt 함수는 ‘A’는 ‘B’로, ‘B’는 ‘C’로, …, ‘Z’는 ‘A’로 변

환하고, 소문자도 마찬가지로 ‘a’는 ‘b’로, ‘b’는 ‘c’로, … ‘z’는 ‘a’로 변환한다. 다음 코

드 중 잘못된 부분을 찾아서 올바르게 수행되도록 수정하시오.

#include <stdio.h>

#include <string.h>

char* Encrypt(const char* s);

int main(void)

{

char str[256];

char *encrypt_str = NULL;

printf("원본 문자열 : ");

gets(str);

encrypt_str = Encrypt(str);

printf("암호화된 문자열 : %s\n", encrypt_str);

return 0;

}

char* Encrypt(const char* s)

{

char result[256];

int len;

char temp;

int i;

len = strlen(s);

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

{

temp = toupper(s[i]);

if( temp >= 'A' && temp < 'Z' )

result[i] = s[i] + 1;

else if( temp == 'Z' )

result[i] = s[i] - 'Z' + 'A';

Page 117: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

117

함수의 활용 CHAPTER 10

else

result[i] = s[i];

}

result[i] = 0;

return result;

}

char* Encript(const char* s){ static char result[100]; …}

19. 정렬 알고리즘 중 퀵 정렬(quick sort)을 수행하는 QuickSort 함수를 정의하고, 이

함수를 이용해서 입력받은 정수형 배열을 정렬해서 출력하는 프로그램을 작성하시

오. 이때, QuickSort 함수는 정수형 배열과 정렬 방법(오름차순으로 정렬할 지 내림

차순으로 정렬할 지 여부)을 함수의 인자로 전달받도록 한다. 퀵 정렬은 정렬할 배

열 중 한 값을 선택한 다음, 정렬할 배열의 원소들을 그 값보다 작은 값들의 그룹과

그 값보다 큰 값들의 그룹으로 나눈다. 그리고 각각의 그룹에 대하여 다시 퀵 정렬

을 수행한다. 각 그룹에 값이 하나만 남을 때까지 이 과정을 반복한다.

Page 118: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

118

20. 두 개의 문자열을 인자로 받아 비교하는 Compare 함수를 정의하시오. 이 함수는

두 문자열이 같으면 0을, 첫 번째 문자열이 두 번째 문자열보다 크면 0보다 큰 값

을, 그렇지 않으면 0보다 작은 값을 리턴한다. 또한, 이 함수는 대소문자의 구분 여

부를 인자로 받아서 이 값이 0이면 대소문자를 구분하지 않고 문자열을 비교하고,

이 값이 1이면 대소문자를 구분해서 문자열을 비교한다. (단, 표준 C 문자열 처리 함

수를 이용하지 말고 구현하시오.)

21. 인자로 전달받은 문자열로부터 공백 문자(‘ ’, ‘\t’, ‘\v’, ‘\n’, ‘\f’, ‘\r’)를 제거하는

함수 RemoveSpace 함수를 정의하시오. 함수의 첫 번째 인자로 전달되는 문자열

은 함수 안에서 사용도 되고 변경도 되므로 입출력 인자로 처리한다. 또한, 이 함수

는 제거된 공백 문자의 개수를 리턴해야 한다. 프로그램의 실행 결과는 다음과 같

아야 한다.

문자열을 입력하세요 : C program to remove spaces in input string

결과 문자열 : Cprogramtoremovespacesininputstring

제거된 공백 문자 개수 : 7

22. 실수형 배열을 인자로 받아서 실수 값들을 입력받는 InputArray 함수, 실수 값

들을 출력하는 PrintArray 함수, 실수 값들의 평균을 구하는 Average 함수, 실

수 값들의 분산을 구하는 Variance 함수, 실수 값들의 표준 편차를 구하는

StandardDeviation 함수를 각각 정의하시오. 각 함수는 배열과 배열의 크기를 인

자로 가지며, 함수의 기능에 따라 배열이 입력 인자인지 출력 인자인지 적절히 판

단해서 매개변수의 데이터형을 결정하시오. 프로그램의 실행 결과는 다음과 같아야

한다.

5개의 실수를 입력하세요 : 10.2 10.78 10.44 10.84 10.56

배열 : 10.20 10.78 10.44 10.84 10.56

분산 : 0.054144

표준편차 : 0.232689

Page 119: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

119

함수의 활용 CHAPTER 10

23. 직사각형 정보를 저장하는 rect 구조체를 이용해서 직사각형의 중심점의 좌표를

구하는 CenterOfRect 함수를 정의하시오. 이 함수는 rect 구조체를 입력인자로 받

아 직사각형의 중심점의 좌표를 point 구조체에 구한 다음 리턴하는 함수로 정의한

다. 또한, 직사각형 정보를 입력 받는 InputRect 함수를 정의하고, 입력받은 직사각

형에 대해서 중심점의 좌표를 구해서 출력하는 프로그램을 작성하시오. 프로그램의

실행 결과는 다음과 같아야 한다.

좌상단점/우하단점의 좌표를 입력하세요(left, top, right, bottom 순)

10 20 70 80

입력된 직사각형 : 좌상단점=(10,20), 우하단점=(70,80)

직사각형의 중심 : (40, 50)

24. 표준 C 라이브러리 함수인 time 함수와 localtime 함수를 이용해서 현재 시간을 구

한 뒤, 날짜 정보를 저장하는 date 구조체에 저장하고 출력하는 프로그램을 작성하

시오.

#include <time.h>

time_t time(time_t *timer);

struct tm *localtime(const time_t *timer);

※참고로localtime함수는보안상취약점때문에더이상사용되지않으며대신보다안전

한버전의함수인localtime_s함수가대신제공된다.따라서프로그램코드에localtime

함수를사용하면컴파일에러가발생하므로주의해야한다.이런취약점에도불구하고

localtime함수를사용하려면라이브러리헤더앞에_CRT_SECURE_NO_WARNINGS매

크로를정의해야한다.

errno_t localtime_s(struct tm* _tm, const time_t *time);

Page 120: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual
Page 121: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

포인터의 활용

C H A P T E R 11

Page 122: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

122

실 전 과 제

-- 목표

•동적메모리를이용해본다.

-- 과제

•크기가n×m인이차원배열을할당하고사용하는프로그램을작성하시오.

-- 요구사항

•이차원배열의크기인n과m을사용자로부터입력받는다.

•동적메모리에int를m개만큼할당하고,크기가m인일차원배열을다시n개만큼할당한다.

•할당된이차원배열의각원소에1부터증가되는값을대입하고출력한다.

-- 힌트

•크기가정해지지않은이차원배열을동적메모리에할당하는방법은두가지이다.첫번째

방법은크기가nxm인일차원배열을할당하고,사용할때이차원배열인것처럼사용하는

것이다.이방법은동적메모리할당과해제는비교적간단하지만이차원배열의각원소에

접근하기위한인덱스를계산하는수식이복잡해진다.

int *arr = NULL;

int i, j, k = 1;

arr = (int*) malloc(sizeof(int) * n * m); // 일차원 배열처럼 메모리 할당

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

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

arr[i * m + j] = k++; // 인덱스를 이용해서 일차원 배열을 이차원 배열처럼 접근

Page 123: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

123

포인터의 활용 CHAPTER 11

•크기가정해지지않은이차원배열을동적메모리에할당하는두번째방법은다음과같이

크기가m인일차원배열을할당하고,이배열을다시n개만큼할당하는것이다.이방법은

동적메모리에일차원배열을가리킬포인터배열을할당하고,포인터배열의각원소가가

리키는일차원배열을다시동적메모리에할당해서사용하는방법이다.포인터연산에의

해서직접이차원배열에접근하는것처럼사용할수있으므로배열의원소에접근하는코

드는간단하지만,동적메모리의할당과해제를이중으로수행해야하므로주의해야한다.

실전과제에서는두번째방법을사용해서코드를작성한다.

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

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

arr[i][j] = k++; // 이차원 배열처럼 2개의 인덱스로 접근

•프로그램의실행예는다음과같다.

배열의 제1크기와 제2크기를 입력하세요 : 3 5

<3 x 5 크기의 배열>

1 2 3 4 5

6 7 8 9 10

11 12 13 14 15

Page 124: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

124

-- 구현

•직접프로그램코드를작성해보고,다음코드의______부분에필요한코드를채워넣으

시오.

01: /* Lab11.c */

02: #include <stdio.h>

03: #include <stdlib.h>

04:

05: int main(void)

06: {

07: int n, m;

08: ______________________________________; // 포인터 변수 선언

09: int i, j, k;

10:

11: printf("배열의 제1크기와 제2크기를 입력하세요 : ");

12: scanf("%d %d", &n, &m);

13:

14: __________________________________________ // 동적 메모리 할당

15: __________________________________________

16: __________________________________________

17:

18: k = 1;

19: for(i = 0 ; i < n ; i++ )

20: for(j = 0 ; j < m ; j++)

21: arr[i][j] = k++;

22:

23: printf("<%d x %d 크기의 배열>\n", n, m);

24: for(i = 0 ; i < n ; i++ )

25: {

26: for(j = 0 ; j < m ; j++)

27: printf("%3d ", arr[i][j]);

28: printf("\n");

29: }

30:

Page 125: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

125

포인터의 활용 CHAPTER 11

31: __________________________________________ // 동적 메모리 해제

32: __________________________________________

33: __________________________________________

34:

35: return 0;

36: }

-- 평가

•올바른실행결과가나오는지확인해보자.

Page 126: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

126

연 습 문 제

1. 다음 중 변수 선언과 그 의미가 잘못 짝지어진 것은?

①int*w[3];→포인터배열

②int(*x)[3];→배열에대한포인터

③int*y(int);→int형을리턴하고int형의인자를갖는함수에대한포인터

④int(*z)(int);→int형을리턴하고int형의인자를갖는함수에대한포인터

2. 다음 중 포인터 배열의 선언 및 초기화가 잘못된 것은?

①int*arr[3]=NULL;

② int *arr[3] = {NULL};

③ int x, y, z;

int *arr[3] = {&x, &y, &z};

④ int x[3], y[3], z[3];

int *arr[3] = {x, y, z};

3. 다음과 같이 포인터 배열이 선언되었을 때, 각 문장의 의미를 잘못 연결한 것은?

int data1[5], data2[5], data3[5];

int *arr[2] = {data1, data2};

int i = 1, j = 2;

①arr[i][j]=10;→data2[2]에10을저장한다.

②arr=data3;→arr[0]이data3을가리키게한다.

③*(arr[i]+j)=20;→data[2]에20을저장한다.

④arr[i]=data3;→arr[1]이data3을가리키게한다.

Page 127: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

127

포인터의 활용 CHAPTER 11

4. 다음과 같이 선언된 포인터가 있을 때, 잘못된 설명은?

double *pd = NULL;

①pd에double형변수의주소를저장할수있다.

②pd에double형배열의시작주소를저장할수있다.

③pd에double형배열원소의주소를저장할수있다.

④pd[0]과*pd는같은의미이다.

⑤*pd[0]과*pd는같은의미이다.

5. 다음 중 배열에 대한 포인터의 선언 및 초기화가 잘못된 것은?

① int (*p)[3] = NULL;

② int x[3];

int (*p)[3] = &x;

③ int x[3];

int (*p)[3] = x;

④ int x[2][3];

int (*p)[3] = x[0];

6. 다음과 같이 배열에 대한 포인터가 선언되었을 때, 각 문장의 의미를 잘못 연결한

것은?

int arr[3][2];

int (*ptr)[2] = arr;

int i = 0, j = 1;

①ptr[i][j]=10;→arr[0][1]에10을저장한다.

②ptr[i]=20;→arr[0][0]에20을저장한다.

③(*ptr)[j]=30;→arr[0][1]에30을저장한다.

④ptr=&arr[1];→ptr이arr[1]를가리키게한다.

Page 128: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

128

7. 다음과 같이 정의된 구조체와 구조체 포인터 배열이 있을 때, 구조체 포인터 배열을

사용하는 코드 중 잘못된 것은?

typedef struct font {

char faceName[40]; // 폰트명

unsigned int size; // 폰트 크기

int weight; // 폰트 두께

} FONT;

FONT f1 = {"굴림", 10, 1};

FONT f2 = {"바탕", 20, 2};

FONT f3 = {"돋음", 12, 1};

FONT *fonts[3] = {&f1, &f2, &f3};

int i = 0;

① fonts[0].size += 2;

② strcpy(fonts[1]->faceName, "궁서");

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

if( fonts[i]->weight > 1 )

fonts[i]->weight = 1;

④ (*fonts[1]).size = 10;

8. 다음 중에서 함수 원형과 함수에 대한 포인터 변수의 선언 및 초기화가 잘못된

것은?

① double log(double x);

double (*pf)(double) = log;

② int isdigit(int c);

int (*pf)(int) = isdigit;

③ char *strcpy(char *dest, const char *src);

char *pf(char*, const char*) = strcpy;

④ char *strcpy(char *dest, const char *src);

char *(*pf)(char*, const char*) = strcpy;

Page 129: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

129

포인터의 활용 CHAPTER 11

9. 다음과 같이 선언된 함수와 함수에 대한 포인터 변수가 있을 때, 잘못된 코드는?

int Calculator(char op, int x, int y);

int Add(int x, int y);

int PrintBorder(char ch, int width, int height);

int (*pfunc)(char, int, int) = Calculator;

① pfunc(‘+’, 10, 20);

② (*pfunc)(‘-’, 10, 20);

③ pfunc = Add;

④ pfunc = PrintBorder;

10. 동적 메모리를 특정 바이트 크기만큼 할당하는 함수는?

malloc 함수

11. 사용이 끝난 동적 메모리를 해제할 때 사용되는 함수는?

free 함수

12. 동적 메모리에 대한 설명 중 잘못된 것을 모두 고르시오.

①동적메모리를할당할때는할당할메모리의데이터형이필요하다.

②동적메모리를할당할때는할당할메모리의바이트크기가필요하다.

③동적으로할당된메모리의주소는포인터변수에저장해두고사용한다.

④동적메모리는자동으로해제되지않으므로명시적으로해제해야한다.

⑤동적메모리를해제할때는해제할메모리의바이트크기가필요하다.

⑥동적메모리를해제한다음에는동적메모리를가리키던포인터를NULL로만들어야한다.

Page 130: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

130

13. 다음 프로그램에서 arr를 이용해서 x 배열과 y 배열의 원소를 출력하고자 할 때,

_____________에 필요한 코드를 작성하시오.

#include <stdio.h>

int main()

{

int x[3] = {1, 2, 3};

int y[3] = {4, 5, 6};

int *arr[2] = {x, y};

int i, j;

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

{

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

printf("%d ", _______________________ );

printf("\n");

}

return 0;

}

arr[i][j] 또는 *(arr[i] + j) 또는 *( *(arr + i) + j)

14. 다음 프로그램의 실행 결과를 쓰시오.

#include <stdio.h>

int main(void)

{

int arr[3][2] = { 10, 20, 30, 40, 50, 60 };

int (*p)[2] = NULL;

int i;

p = &arr[1];

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

{

printf("%d ", (*p)[i]);

}

printf("\n");

return 0;

}

30 40

Page 131: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

131

포인터의 활용 CHAPTER 11

15. 다음과 같은 원형을 갖는 함수에 대한 포인터형 PFUNC를 정의하시오.

int IsPointInRect(const POINT *pt, const RECT *rt);

typedef int (*PFUNC)( const POINT*, const RECT*);

16. 함수에 대한 포인터를 이용해서 int 변수의 값을 맞교환하는 Swap함수를 호출하려

고 한다. _____________에 필요한 코드를 각각 작성하시오.

#include <stdio.h>

void Swap(int *x, int *y);

int main( )

{

void (*pSwap)(int*, int*) = NULL;

int a = 10, b = 20;

printf("Swap 전의 a = %d, b = %d\n", a, b);

①______________________ // pSwap에 Swap 함수의 주소를 저장한다.

②______________________ // pSwap으로 Swap함수를 호출해서 a, b의 값을 맞바꾼다.

printf("Swap 후의 a = %d, b = %d\n", a, b);

return 0;

}

void Swap(int *x, int *y)

{

int temp = *x;

*x = *y;

*y = temp;

}

① pSwap = Swap; 또는 pSwap = &Swap ;② (*pSwap)(&a, &b); 또는 pSwap(&a, &b);

Page 132: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

132

17. 이차원 배열과 일차원 배열을 인자로 전달해서 이차원 배열의 부분합을 일차원 배

열에 구하는 함수를 정의하시오. 그리고 이 함수를 이용하는 프로그램을 작성하시

오. 예를 들어 다음과 같은 이차원 배열이 있을 때, a[i][0]~a[i][9] 사이의 부분합을

b[i]에 구해야 한다. 이차원 배열의 제1크기는 정해져 있지 않으므로 함수에 인자로

전달하고, 제2크기는 10이라고 가정한다.

b[0]

b[0]

b[0]

b[0]

b[0]

a[4][0]

a[3][0]

a[2][0]

a[1][0]

a[0][0]

a[4][1]

a[3][1]

a[2][1]

a[1][1]

a[0][1]

a[4][2]

a[3][2]

a[2][2]

a[1][2]

a[0][2]

a[4][9]

a[3][9]

a[2][9]

a[1][9]

a[0][9]

18. 이름과 전화번호를 저장하는 contact 구조체를 이용해서 연락처 관리 프로그램을

작성하시오. 이름과 전화번호는 각각 문자열로 저장한다. 연락처는 구조체 포인터

배열을 사용해서 최대 100개까지 저장할 수 있게 한다.

먼저 이름을 입력받아서 기존에 저장된 연락처에서 해당 이름을 찾을 수 있으면 찾

은 연락처의 전화번호를 출력하고, 만일 찾을 수 없으면 새로운 contact 구조체를

동적 메모리에 할당하고 그 주소를 포인터 배열에 저장한 후 전화번호를 입력받아

서 저장한다. 이 프로그램은 반복 수행되다가 이름에 “.”이 입력되면 종료한다. 프로

그램의 실행 결과는 다음과 같아야 한다.

검색할 이름 : 유재석

저장되지 않은 연락처입니다. 저장하시겠습니까? (Y/N) : y

전화번호 입력 : 010-111-1111

검색할 이름 : 박명수

저장되지 않은 연락처입니다. 저장하시겠습니까? (Y/N) : y

전화번호 입력 : 010-222-2222

Page 133: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

133

포인터의 활용 CHAPTER 11

검색할 이름 : 유재석

찾은 전화번호 : 010-111-1111

검색할 이름 : 박명수

찾은 전화번호 : 010-222-2222

검색할 이름 : .

19. 18번에서는 연락처를 저장할 때마다 동적 메모리에 contact 구조체를 하나씩 할당

하고, 그 주소를 구조체 포인터 배열에 저장해두고 사용하였다. 그렇게 하는 대신

프로그램이 시작될 때 최대 연락처의 개수를 입력받아서 동적 메모리에 contact 구

조체 배열을 한꺼번에 할당한다. 할당된 contact 구조체 배열에 이름과 전화번호를

입력받아서 저장하고 전체 연락처 목록을 출력하는 프로그램을 작성하시오. 프로그

램의 실행 결과는 다음과 같아야 한다.

저장할 연락처의 개수 : 5

이 름 : 유재석

전화번호 : 010-111-1111

이 름 : 박명수

전화번호 : 010-222-2222

이 름 : 정준하

전화번호 : 010-333-3333

이 름 : 정형돈

전화번호 : 010-444-4444

이 름 : 하하

전화번호 : 010-555-5555

--- 전체 연락처 목록 ---

유재석 010-111-1111

박명수 101-222-2222

정준하 010-333-3333

정형돈 010-444-4444

하하 010-555-5555

Page 134: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

134

20. 19번 프로그램에서 전체 연락처 목록을 출력할 때, 사용자의 선택에 따라서 이름순

(가나다순)이나 전화번호순으로 출력하도록 기능을 추가하시오. 프로그램의 실행 결

과는 다음과 같아야 한다.

저장할 연락처의 개수 : 3

이 름 : 박보검

전화번호 : 010-234-5678

이 름 : 류준열

전화번호 : 010-785-6783

이 름 : 고경표

전화번호 : 010-567-3411

0.종료

1.이름순 출력

2.전화번호순 출력

출력방법 선택 : 1

--- 전체 연락처 목록 ---

고경표 010-567-3411

류준열 010-785-6783

박보검 010-234-5678

0.종료

1.이름순 출력

2.전화번호순 출력

출력방법 선택 : 2

--- 전체 연락처 목록 ---

박보검 010-234-5678

고경표 010-567-3411

류준열 010-785-6783

0.종료

1.이름순 출력

2.전화번호순 출력

출력방법 선택 : 0

Page 135: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

135

포인터의 활용 CHAPTER 11

21. 다음과 같이 폰트 정보를 저장하는 font 구조체가 정의되어 있다고 하자. 미리 준비

된 폰트 정보를 font 구조체 배열에 저장해두고, qsort 함수를 이용해서 폰트명에

따라 미리 정렬해둔다.

typedef struct font {

char faceName[40]; // 폰트명

unsigned int size; // 폰트 크기

int weight; // 폰트 두께

} FONT;

그 다음 사용자로부터 폰트명을 입력받아서 font 구조체 배열로부터 폰트 정보를

찾아서 출력하는 프로그램을 작성하시오. 이때, 구조체 배열로부터 폰트명을 기준

으로 검색할 때 표준 C 라이브러리가 제공하는 bsearch 함수를 이용한다. 프로그

램의 실행 결과는 다음과 같아야 한다.

검색할 폰트명 : 궁서

폰트명 : 궁서

폰트크기 : 10

폰트두께 : 2

계속 하시겠습니까? (Y/N) : y

검색할 폰트명 : 바탕

폰트명 : 바탕

폰트크기 : 14

폰트두께 : 2

계속 하시겠습니까? (Y/N) : n

Page 136: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual
Page 137: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

고급기능

C H A P T E R 12

Page 138: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

138

실 전 과 제

-- 목표

•main함수의인자로전달되는프로그램의명령행인자를처리해본다.

-- 과제

•프로그램실행시문자열을명령행인자로받아와서모두대문자로만드는프로그램을작성

하시오.

-- 요구사항

•프로그램이실행될때명령행인자를받아올수있도록main함수를정의한다.

•명령행인자로받아온문자열을모두대문자로만들어서출력한다.

-- 힌트

•main함수가명령행인자를받아오려면다음과같은원형으로정의한다.

int main(int argc, char* argv[]);

•명령행인자의argv[0]에는실행파일명이저장되어있으므로,argv[1]로전달된명령행인

자부터마지막인자까지의문자열을모두대문자로변환한다.

•프로그램의실행예는다음과같다.

C:\> TOUPPER.EXE hello world

HELLO WORLD

Page 139: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

139

고급기능 CHAPTER 12

-- 구현

•직접프로그램코드를작성해보고,다음코드의______부분에필요한코드를채워넣으

시오.

/* Lab12.c */

#include <stdio.h>

int main(_________________________________)

{

int i, j;

for(_____________________________________)

{

// 소문자를 대문자로 변환

__________________________________________________

__________________________________________________

__________________________________________________

__________________________________________________

}

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

printf("%s ", argv[i]);

printf("\n");

return 0;

}

-- 평가

•올바른실행결과가나오는지확인해보자.

Page 140: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

140

연 습 문 제

1. 전처리기에 대한 설명 중 잘못된 것은?

①전처리기는소스파일을컴파일하기전에수행되는프로그램이다.

②전처리기는다른파일의내용을소스파일로복사해오는#include문을처리할수있다.

③전처리기는코드중일부를조건에따라서컴파일하거나하지않을수있다.

④전처리기는소스파일내의특정식별자를다른식별자로대치한다.

2. 다음 중 매크로 상수의 정의 및 사용이 잘못된 것을 모두 고르시오.

① #define COUNT 10;

x = COUNT – 1;

② #define printf PRINT

PRINT("hello");

③ #define MSG "안녕하세요"

printf(MSG);

④ #define PI 3.14

PI = PI + 0.0015;

⑤ #define WORD unsigned short

WORD temp;

3. 매크로 함수에 대한 설명 중 잘못된 것은?

①함수인것처럼보이지만실제로는함수호출이일어나지않는다.

②매크로함수를사용하면실행속도는느려질수있지만프로그램의크기가작아진다.

③매크로함수의정의를여러줄에걸쳐작성하려면\를이용한다.

④매크로함수의인자로수식을전달하면수식의값을먼저계산한다.

⑤매크로함수의인자를전달할때데이터형검사를수행하지않는다.

Page 141: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

141

고급기능 CHAPTER 12

4. 다음 프로그램의 실행 결과를 쓰시오.

#include <stdio.h>

#define TEST_EVEN(num) num % 2 == 0 ? 1 : 0

int main(void)

{

if( TEST_EVEN(1 + 3) )

printf("짝수\n");

else

printf("홀수\n");

return 0;

}

홀수

5. 4번의 TEST_EVEN 함수에는 연산자 우선순위 문제가 있다. TEST_EVEN 함수를 올

바르게 다시 정의하시오.

#define TEST_EVEN(num) ((num) % 2 == 1 ? 1 : 0)

6. 다음 코드의 실행 결과는?

#define INCREASE_BY(x, y) x += y; printf(#x" = %d\n", x);

int n = 5;

INCREASE_BY(n, 3);

①x=8

②x=10

③n=8

④n=10

Page 142: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

142

7. 다음 프로그램의 실행 결과를 쓰시오.

#include <stdio.h>

#define TEST_SWAP

void Swap(int *x, int *y)

{

int temp = *x;

*x = *y;

*y = temp;

}

int main(void)

{

int a = 10;

int b = 20;

#ifndef TEST_SWAP

Swap(&a, &b);

#endif

#if 0

Swap(&a, &b);

#endif

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

return 0;

}

a = 10, b = 20

8. 특정 매크로가 정의된 경우에만 소스 코드를 컴파일하도록 만드는 전처리기 문장은?

#ifdef

Page 143: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

143

고급기능 CHAPTER 12

9. 분할 컴파일에 대한 설명 중 잘못된 것을 모두 고르시오.

①헤더파일은소스파일에포함되어야만컴파일된다.

②다른소스파일에정의된함수를호출하려면함수의정의가필요하다.

③구조체는구조체를사용하는소스파일마다정의해야한다.

④#include문에서라이브러리헤더파일을포함하려면<>를사용한다.

⑤#include문에서<>로헤더파일을포함하면소스파일이있는디렉터리에서헤더파일을

찾는다.

10. 소스 파일을 여러 개로 나누어 프로그램을 작성할 때 소스 파일 사이에 공유해야

할 정보를 헤더 파일에 넣어주어야 한다. 어떤 내용을 헤더 파일에 넣어주어야 하는

지 쓰시오.

함수 선언, 매크로 정의, 구조체 정의, typedef 정의, 전역 변수의 extern 선언

11. 다른 소스 파일에 선언된 전역 변수를 사용하려면 전역 변수에 대한 ________ 선

언을 헤더 파일에 넣어주어야 한다. _________에 알맞은 키워드를 쓰시오.

extern

12. main 함수의 매개변수에 대한 설명 중 잘못된 것은?

①main함수는매개변수와리턴형을모두void형으로정의할수있다.

②main함수에인자를전달하려면프로그램을실행할때,실행파일명과함께명령행인자

를지정한다.

③main함수에는프로그램의실행파일명도인자로전달된다.

④main함수가매개변수를갖는경우에는intmain(intargc,char*argv)와같이정의한다.

Page 144: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

144

13. 점의 좌표를 나타내는 POINT 구조체가 다음과 같이 정의되어 있다고 하자. POINT

구조체의 정의는 점의 좌표를 정수형으로 처리하고 있는데, 필요하다면 실수형으로

도 처리할 수 있도록 코드를 변경하고자 한다. 전처리기가 제공하는 조건부 컴파일

기능을 이용해서 정수 좌표 또는 실수 좌표를 모두 처리할 수 있도록 다음 코드를

수정하시오.

typedef struct point { int x; int y;} POINT;

double Distance(const POINT *start, const POINT *end);

int main(void){ POINT pt1 = { 0, 0 }; POINT pt2 = { 30, 40 }; printf("두 점 사이의 거리 : %f\n", Distance(&pt1, &pt2));

return 0;}

double Distance(const POINT *start, const POINT *end){ int dx = end->x - start->x; int dy = end->y - start->y; return sqrt(dx*dx + dy*dy);}

#ifdef INT_COORDtypedef int COORD_TYPE;#elsetypedef double COORD_TYPE;#endif

struct point { COORD_TYPE x; COORD_TYPE y;};typedef struct point POINT;

double Distance(const point *p1, const point *p2){ COORD_TYPE dx = p2->x – p1->x; COORD_TYPE dy = p2->y – p1->y; return sqrt(dx*dx + dy*dy);}

Page 145: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

145

고급기능 CHAPTER 12

14. 소스 파일에서 같은 헤더 파일이 여러 번 포함되어도 컴파일될 수 있도록 하기 위해

서 필요한 코드를 다음의 헤더 파일에 추가하시오.

/* font.h */

typedef struct font

{

char faceName[40];

int size;

int weight;

} FONT;

void PrintFont(const FONT* pFont);

/* font.c */

#include <stdio.h>

#include "font.h"

#include "font.h"

int main(void)

{

FONT font1 = {"굴림", 10, 2};

PrintFont(&font1);

return 0;

}

void PrintFont(const FONT* pFont)

{

printf("폰트명 : %s\n", pFont->faceName);

printf("폰트크기 : %d\n", pFont->size);

printf("폰트두께 : %d\n", pFont->weight);

}

/* font.h */#ifndef FONT_H#define FONT_H

typedef struct font { char faceName[40]; int size; int weight;} FONT;

void PrintFont(const FONT* pFont);

#endif

Page 146: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

146

15. 다음 코드는 하나의 소스 파일로 작성되어 있다. 이 소스 파일을 RECT 구조체에 대

한 기능을 제공하는 Rect.c와 main 함수를 제공하는 Main.c로 나누어 작성하시오.

이때 필요한 헤더 파일을 함께 만든다.

/* 12_15.c */

#include <stdio.h>

typedef struct point {

int x, y;

} POINT;

typedef struct rect {

int left, top, right, bottom;

} RECT;

void PrintRect(const RECT *rt);

int Width(const RECT *rt);

int Height(const RECT *rt);

int main(void)

{

RECT rect1 = { 10, 20, 30, 40 };

PrintRect(&rect1);

return 0;

}

void PrintRect(const RECT *rt)

{

printf("[ 좌상단점=(%d,%d),우하단점=(%d,%d),폭=%d,높이=%d ]\n",

rt->left, rt->top, rt->right, rt->bottom, Width(rt), Height(rt));

}

int Width(const RECT *rt)

{

int width = rt->right - rt->left;

return width > 0 ? width : -width;

}

Page 147: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

147

고급기능 CHAPTER 12

int Height(const RECT *rt)

{

int height = rt->bottom - rt->top;

return height > 0 ? height : -height;

}

#ifndef RECT_H#define RECT_Htypedef struct point { int x, y;} POINT;typedef struct rect { int left, top, right, bottom;} RECT;void PrintRect(const RECT *rt);int Width(const RECT *rt);int Height(const RECT *rt);#endif

/* Rect.c */#include <stdio.h>#include "Rect.h"void PrintRect(const RECT *rt){ printf("[ 좌상단점=(%d,%d),우하단점=(%d,%d),폭=%d,높이=%d ]\n", rt->left, rt->top, rt->right, rt->bottom, Width(rt), Height(rt));}int Width(const RECT *rt){ int width = rt->right - rt->left; return width > 0 ? width : -width;}int Height(const RECT *rt){ int height = rt->bottom - rt->top; return height > 0 ? height : -height;}

/* Main.c */#include "Rect.h"int main(void){ RECT rect1 = { 10, 20, 30, 40 }; PrintRect(&rect1); return 0;}

Page 148: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

148

16. 다음은 표준 C 라이브러리 함수이다. 각각을 매크로 함수로 정의하고, 라이브러리

함수와 비교해서 사용해보시오.

int islower(int c);

int isupper(int c);

char* strcpy(char *strDestination, const char *strSource);

char* strcat(char *strDestination, const char *strSource);

17. 문자열 배열을 정렬하는 프로그램을 작성하시오. 이때 조건부 컴파일 기능을 이용

해서 ALGORITHM이라는 매크로가 1로 정의되었으면 선택 정렬 방법을 사용하고,

ALGORITHM이 2로 정의되었으면 퀵 정렬 방법을 사용하도록 코드를 작성하시오.

18. red, green, blue에 해당하는 값을 이용해서 4바이트 크기의 RGB 색상을 만드는

MAKE_RGB 매크로 함수를 정의하시오. 또한 4바이트 크기의 RGB 색상으로부터

red, green, blue의 값을 추출하는 GET_RED, GET_GREEN, GET_BLUE 매크로 함

수를 정의하시오.

19. 직사각형의 left, top, right, bottom에 해당하는 값을 명령행 인자로 받아와서 직

사각형의 면적과 둘레를 구해서 출력하는 프로그램을 작성하시오. 프로그램의 실행

결과는 다음과 같아야 한다.

C:\> 12_19.EXE 10 20 30 40

[ 좌상단점=(10,20),우하단점=(30,40),폭=20,높이=20 ]

직사각형의 면적 : 400

직사각형의 둘레: 80

Page 149: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

입출력 라이브러리

C H A P T E R 13

Page 150: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

150

실 전 과 제

-- 목표

•텍스트파일에대한입출력을처리해본다.

-- 과제

•명령행인자로텍스트파일명을입력받아파일내의문자들을소문자는대문자로,대문자는

소문자로변경한다음출력용파일로저장하는프로그램을작성하시오.

-- 요구사항

•프로그램의명령행인자로두개의파일명을받아온다.

•첫번째명령행인자로전달된파일명으로입력용파일을텍스트파일로연다.

•두번째명령행인자로전달된파일명으로출력용파일을텍스트파일로연다.

•입력용파일의내용을읽어서소문자를대문자로변환한다음출력용파일로저장한다..

-- 힌트

•입력용파일에서한문자씩읽어서변환하는대신입력버퍼크기만큼씩데이터를읽어서

변환한다.한문자씩읽어서처리하는것보다입력버퍼크기만큼씩읽어서처리하는것이

더효율적이다.

•텍스트파일에서한줄의문자열을읽어오려면fgets함수를사용하고,한줄의문자열을

텍스트파일로저장하려면fputs함수를사용한다.

char* fgets(char *str, int n, FILE* stream);

int fputs(const char *str, FILE* stream);

•입력버퍼의문자를대문자또는소문자로변환하려면toupper함수와tolower함수를이

용한다.

int toupper(int c);

int tolower(int c);

Page 151: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

151

입출력 라이브러리 CHAPTER 13

•프로그램의실행예는다음과같다.

C:\> LAB13.EXE a.txt b.txt

파일 변환 완료

-- 구현

•직접프로그램코드를작성해보고,다음코드의______부분에필요한코드를채워넣으

시오.

01: /* Lab13.c */

02: #include <stdio.h>

03: #include <ctype.h>

04:

05: int main(int argc, char* argv[])

06: {

07: FILE *fp1, *fp2;

08: char buff[256];

09: int i;

10:

11: if( argc < 3 )

12: {

13: printf("Usage : Convert src_file dest_file\n");

14: return -1;

15: }

16:

17: fp1 = ____________________________; // 입력용 파일 열기

18: if( fp1 == NULL )

19: {

20: printf("%s 파일 열기 실패\n", argv[1]);

21: return -1;

22: }

23:

24: fp2 = _____________________________; // 출력용 파일 열기

25: if( fp2 == NULL )

Page 152: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

152

26: {

27: printf("%s 파일 열기 실패\n", argv[2]);

28: return -1;

29: }

30:

31: while( ___________________ ) // fp1이 가리키는 파일의 끝이 아닌 동안

32: {

33: _______________________ // 입력용 파일에서 한 줄의 문자열 읽기

34:

35: for(i = 0 ; buff[i] != '\0' ; i++)

36: {

37: if( isupper(buff[i]) )

38: buff[i] = tolower(buff[i]); // 대문자는 소문자로 변환

39: else if( islower(buff[i]) )

40: buff[i] = toupper(buff[i]); // 소문자는 대문자로 변환

41: }

42:

43: __________________________ // 출력용 파일에 한 줄의 문자열 쓰기

44: }

45:

46: printf("파일 변환 완료\n");

47:

48: ______________ // 입력용 파일 닫기

49: ______________ // 출력용 파일 닫기

50:

51: return 0;

52: }

-- 평가

•올바른실행결과가나오는지확인해보자.

Page 153: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

153

입출력 라이브러리 CHAPTER 13

연 습 문 제

1. 스트림에 대한 설명 중 잘못된 것을 모두 고르시오.

①스트림이란연속된데이터바이트의흐름을말한다.

②프로그램의입력은입력스트림을통해서프로그램외부에서프로그램의내부로전달

된다.

③프로그램의출력은출력스트림을통해서프로그램내부에서프로그램의외부로전달

된다.

④스트림기반입출력은입력장치별로다르게입출력을수행하므로장치종속적이다.

⑤버퍼를경유한입출력으로수행된다.

⑥표준입출력시에도스트림을생성해야한다.

2. printf 함수에서 형식 문자열의 type 필드에 대하여 그 의미가 잘못 짝지어진 것은?

①%c→문자열출력

②%i→10진수정수출력

③%x→16진수정수출력

④%e→실수의지수표기출력

3. 다음 printf 함수의 출력 결과는?

printf("%+5d", 555); // 빈칸은 □으로 표시한다.

①555□□

②00555

③□□555

④□+555

Page 154: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

154

4. 다음 scanf 함수의 형식 문자열로 올바른 것은?

int num;

scanf("______", &num); // 16진수 입력

①%d ②%x

③%f ④%lf

5. 다음 scanf 함수의 형식 문자열로 올바른 것은?

double data;

scanf("______", &data); // double형 입력

①%d ②%x

③%f ④%lf

6. 다음 중 표준 C 입출력 라이브러리 함수와 그 의미가 잘못 짝지어진 것은?

①getchar→표준입력으로부터한문자입력

②gets→표준입력으로부터한줄의문자열입력

③fgetc→파일로부터한줄의문자열입력

④feof→파일의끝인지검사

⑤ferror→표준입출력의에러확인

7. 다음 중 바이너리 파일 입출력에 사용되는 라이브러리 함수가 아닌 것은?

①fread ②fwrite

③fprintf ④fseek

⑤ftell

Page 155: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

155

입출력 라이브러리 CHAPTER 13

8. 다음은 파일 입력 시 수행할 단계이다. 올바른 순서로 나열하시오.

A. 파일을 읽는다.

B. 파일을 닫는다.

C. 파일을 연다.

C → A → B

9. 파일을 닫는 데 사용되는 표준 C 입출력 라이브러리 함수는?

fclose 함수

10. 다음 중 파일 열기 모드와 그 의미가 잘못 짝지어진 것은?

①“r”→입력용파일을여는데,파일이없으면열기실패이다.

②“w”→출력용파일을여는데,파일이없으면새로생성하고기존의파일이있으면내용

이모두사라진다.

③“a”→파일의끝에출력하는용도로파일을여는데,파일이없으면열기실패이다.

④“r+”→입출력용파일을여는데,파일이없으면열기실패이다.

⑤“w+”→입출력용파일을여는데,파일이없으면새로생성하고기존의파일이있으면내

용이모두사라진다.

⑥“a+”→입출력용파일을여는데,파일이없으면열기실패이다.

11. 다음과 같이 정의된 font 구조체가 있을 때 바이너리 파일로부터 font 구조체 정보

를 읽어 오려고 한다. ___ 부분에 알맞은 코드를 쓰시오.

typedef struct font {

char faceName[40]; // 폰트명

unsigned int size; // 폰트 크기

int weight; // 폰트 두께

} FONT;

FONT f1;

FILE *pf = fopen("fonts.dat", "rb");

fread(&f1, sizeof(FONT), 1, pf); // 파일로부터 FONT 구조체 하나를 f1 변

수에 읽어온다.

Page 156: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

156

12. 다음 프로그램의 실행 결과를 쓰시오.

#include <stdio.h>

#include <time.h>

int main()

{

time_t t;

struct tm now = {0};

t = time(NULL);

localtime_s(&now, &t);

printf("%02d:%02d:%02d\n", now.tm_hour, now.tm_min, now.tm_sec);

return 0;

}

01:01:01처럼 현재 시간을 출력한다.

13. 다음은 실수형 배열을 바이너리 파일로 저장하고 다시 읽어와서 비교하는 프로그램

이다. 만일 저장한 배열과 다시 읽어온 배열이 같으면 “파일 테스트 성공”이라고 출

력하고, 그렇지 않으면 “파일 테스트 실패”라고 출력한다. _____________에 알맞

은 코드를 각각 작성하시오.

Page 157: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

157

입출력 라이브러리 CHAPTER 13

14. 연락처를 입력받아서 텍스트 파일과 바이너리 파일에 각각 저장하고 읽어오는 프로

그램을 작성하시오. 이때, 연락처는 다음과 같이 구조체로 정의해서 사용한다.

Page 158: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

158

프로그램의 실행 결과는 다음과 같아야 한다.

15. DOS 명령어 중 TYPE.EXE는 명령행 인자로 파일 이름을 지정하면 해당 파일의 내

용을 읽어서 콘솔에 출력한다. TYPE 명령어처럼 명령행 인자로 텍스트 파일의 이

름을 지정하면 텍스트 파일의 내용을 읽어서 화면에 출력하는 프로그램을 작성하

시오.

Page 159: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

159

입출력 라이브러리 CHAPTER 13

16. 두 파일의 내용이 서로 같은지 비교해서 같은지 다른지 출력하는 프로그램을 작성

하시오. 파일의 이름을 프로그램 실행 시 명령행 인자로 전달해야 하며, 두 파일의

각 바이트를 비교해야 한다.

17. 인터넷 사이트의 회원 관리를 위해 ID와 패스워드를 멤버로 갖는 구조체를 다음과

같이 정의한다.

우선 전체 사용자 수를 입력받고, 사용자 수만큼 login_info 구조체 배열을 동적 메

모리에 할당한다. 그 다음 사용자로부터 ID와 패스워드를 입력받아서, 전체 ID와 패

스워드 목록을 파일로 저장하는 프로그램을 작성하시오. 이때, 파일은 일반 문서 편

집기에서 읽어볼 수 있도록 텍스트 파일로 작성한다.

참고로 패스워드 파일은 다음과 같은 형식으로 저장되어야 한다.

패스워드 파일의 시작 부분에는 전체 login_info 구조체의 개수를 저장하고, 그 다

음에 login_info 구조체의 내용을 ID와 패스워드의 순서로 저장해야 한다.

Page 160: 실전과제 & 연습문제surak.hanrw.ac.kr:8080/프로그래밍 응용/EX/Excercise... · exe라는 프로그램을 작성하시오. 이때, 프로그램을 작성하는데 Visual

개념을 콕콕 잡아 주는 C 프로그래밍

160

18. 17번 프로그램에서 만들어진 패스워드 파일(텍스트 파일임)을 읽어서 login_info

구조체 배열을 동적 메모리에 생성하는 프로그램을 작성하시오. 패스워드 파일을

읽은 다음에는 사용자로부터 ID와 패스워드를 입력받아서 ID로 login_info 구조체

배열을 검색하고, ID와 패스워드가 일치하면 로그인을 허용하고 그렇지 않으면 로

그인을 실패로 처리한다. 빠른 검색을 위해서 패스워드 파일을 읽어서 만든 login_

info 구조체 배열은 qsort 함수를 이용해서 정렬해두고, 검색할 때도 bsearch 함수

를 이용한다.

19. 17번처럼 패스워드 파일을 텍스트 파일로 저장하면 일반 문서 편집기에서 파일의

내용을 쉽게 확인할 수 있다. 일반 문서 편집기에서는 내용을 확인할 수 없게 패스

워드 파일을 바이너리 파일로 저장하도록 17번 프로그램을 수정하시오

20. 19번 프로그램에서 만들어진 패스워드 파일(바이너리 파일임)을 읽어서 login_info

구조체 배열을 동적 메모리에 생성하는 프로그램을 작성하시오. 패스워드 파일을

읽은 다음에는 사용자로부터 ID와 패스워드를 입력받아서 ID로 login_info 구조체

배열을 검색하고, ID와 패스워드가 일치하면 로그인을 허용하고 그렇지 않으면 로

그인을 실패로 처리한다. 실행 결과는 18번과 같아야 한다.