01장

Similar documents
Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - chap-03.pptx

Microsoft PowerPoint - Lesson2.pptx

<4D F736F F F696E74202D20C1A633C0E52043C7C1B7CEB1D7B7A5B1B8BCBABFE4BCD2>

<4D F736F F F696E74202D20C1A632C0E520C7C1B7CEB1D7B7A5B0B3B9DFB0FAC1A4>

쉽게 풀어쓴 C 프로그래밍

untitled

쉽게 풀어쓴 C 프로그래밍

프로그램의실행화면 주석 (comment) 두수의합 : 300 /* 두개의숫자의합을계산하는프로그램 */ 주석은코드를설명하는글입니다. 주석 3 가지방법의주석 주석의예 /* 한줄로된주석 */ /* 저자 : 홍길동날짜 : 2013.

Microsoft PowerPoint - chap-02.pptx

Microsoft PowerPoint - chap01-C언어개요.pptx

Microsoft PowerPoint - 2주차-1차시 (강의자료) ch01 - C Programming 기초 (part 2)

OCW_C언어 기초

Microsoft PowerPoint - chap-02.pptx

PowerPoint Presentation

쉽게

OCW_C언어 기초

C 프로그램의 기본

<4D F736F F F696E74202D204C BAB8C3E6BCB3B8ED202D20C7C1B7CEB1D7B7A1B9D6C0DBBCBAB0FAC1A42C C F>

Microsoft PowerPoint - chap06-2pointer.ppt

PowerPoint 프레젠테이션

C 언어의구성요소인상수, 변수, 입 출력함수에 대하여학습

Microsoft PowerPoint - [2009] 02.pptx

중간고사

Microsoft PowerPoint - chap04-연산자.pptx

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

Microsoft PowerPoint - chap06-1Array.ppt

금오공대 컴퓨터공학전공 강의자료

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음

11장 포인터

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

Microsoft PowerPoint - 1장 C 프로그래밍 시작하기 pptx

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

Microsoft PowerPoint - Perpect C 02.ppt [호환 모드]

Microsoft PowerPoint - ch07 - 포인터 pm0415

PowerPoint 프레젠테이션

Microsoft PowerPoint - gnu-w09-c-chap

Microsoft PowerPoint - C프로그래밍-chap03.ppt [호환 모드]

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

PowerPoint 프레젠테이션

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap08-1 [호환 모드]

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - chap03-변수와데이터형.pptx

PowerPoint Presentation

Microsoft PowerPoint - Java7.pptx

TEST BANK & SOLUTION

1.2 자료형 (data type) 프로그램에서다루는값의형태로변수나함수를정의할때주로사용하며, 컴퓨터는선언된 자료형만큼의메모리를확보하여프로그래머에게제공한다 정수 (integer) 1) int(4 bytes) 연산범위 : (-2 31 ) ~ (2 31 /2)-

Microsoft PowerPoint - chap05-제어문.pptx

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

슬라이드 1

1. 자바프로그램기초 및개발환경 2 장 & 3 장. 자바개발도구 충남대학교 컴퓨터공학과

ISP and CodeVisionAVR C Compiler.hwp

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

슬라이드 1

untitled

PowerPoint Template

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

Microsoft PowerPoint - 08-C-App-19-Quick-Preprocessor

PowerPoint Presentation

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

PowerPoint Presentation

Microsoft PowerPoint - ch01.ppt

C 언어와 프로그래밍 개요


C 언어 프로그래밊 과제 풀이

Microsoft PowerPoint - 1C언어소개0.PPT

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

Microsoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx

C# Programming Guide - Types

17장 클래스와 메소드

untitled

PowerPoint 프레젠테이션

Microsoft Word - PLC제어응용-2차시.doc

Microsoft PowerPoint - 2장 변수와 자료형 pptx

Microsoft PowerPoint - e pptx

금오공대 컴퓨터공학전공 강의자료

Microsoft PowerPoint - c2.ppt

Microsoft PowerPoint - Chapter_04.pptx

본 강의에 들어가기 전

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

Microsoft PowerPoint - chap-06.pptx

03 상수, 변수, 자료형

쉽게 풀어쓴 C 프로그래밊

Studuino소프트웨어 설치

슬라이드 1

C 언어와 프로그래밍 개요

쉽게 풀어쓴 C 프로그래밍

슬라이드 1

10 강. 쉘스크립트 l 쉘스크립트 Ÿ 쉘은명령어들을연속적으로실행하는인터프리터환경을제공 Ÿ 쉘스크립트는제어문과변수선언등이가능하며프로그래밍언어와유사 Ÿ 프로그래밍언어와스크립트언어 -프로그래밍언어를사용하는경우소스코드를컴파일하여실행가능한파일로만들어야함 -일반적으로실행파일은다

gnu-lee-oop-kor-lec06-3-chap7

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

Microsoft PowerPoint - 제11장 포인터(강의)

Transcription:

01 프로그래밍소개 C PROGRAMMING CHAPTER 학습목표 프로그램이란무엇인지를이해한다. 프로그래밍언어가왜필요한지를이해한다. 알고리즘을소개한다. 프로그램이개발되는과정을이해한다. C O N T E N T S 1.1 프로그래밍의소개 1.2 프로그래밍언어의종류 1.3 C언어 1.4 알고리즘 1.5 프로그램개발과정 1.6 비주얼 C++ 를이용한프로그램작성

01 CHAPTER 프로그래밍소개 C PROGRAMMING 1.1 프로그래밍의소개 컴퓨터는범용적인기계 컴퓨터가가지고있는최대의강점은무엇일까? 먼저컴퓨터와가전제품을비교하여보자. 가전제품은미리정해진한가지작업밖에못하는반면, 컴퓨터는프로그램만바꾸어주면여러가지작업을할수있다. 이처럼컴퓨터의가장큰장점은범용적인기계라는점이다. 예를들어, 우리는컴퓨터에서문서편집프로그램을실행시켜문서를편집하기도하고동영상재생프로그램을실행시켜영화를보기도한다. 범용적인기계를만드는것은오랫동안인류의꿈이었다. 19세기에찰스배비지는수천개의기어, 바퀴, 축, 레버등을사용하여어떤계산이든지할수있는해석기관을만들려고하였다. 그러나그당시기술로는실현이불가능하였다. 1940년대에와서야진공관으로구현한전자식스위치를이용하여전자계산기를만들수있었다. 이후로우리가알다시피컴퓨터는우리생활에불가결한존재가되었다. [ 그림 1-1] 프로그램만바꾸어주면컴퓨터는다양한작업을할수있다.

제 1 장프로그래밍소개 17 컴퓨터의구성요소컴퓨터시스템은기본적으로하드웨어와소프트웨어로구분된다. 하드웨어 (hardware) 는컴퓨터에설치되어있는모든물리적인장치를의미한다. 소프트웨어 (software) 는컴퓨터를동작시키는데사용되는다양한종류의프로그램을부르는용어이다. [ 그림 1-2] 하드웨어와소프트웨어 컴퓨터개발자들은컴퓨터를범용적인장치로만들기위해서하드웨어와소프트웨어를분리하였다. 1940년대에만들어진최초의컴퓨터인에니악 (ENIAC) 에서는하드웨어와소프트웨어가분리되지않았다. 에니악은전선의연결에의하여프로그램되었다. 따라서프로그램을변경하려면모든전선의연결을바꾸어야했다. 1950년대에폰노이만이프로그램을컴퓨터메모리에저장하는아이디어를제시하였다. 그것은획기적인아이디어였고이후로모든컴퓨터가폰노이만의방식을따르게되었다. 동일한하드웨어상에서소프트웨어를바꾸어가면서다양한작업을할수있는것은컴퓨터가가진가장강력한장점이다. [ 그림 1-3] ENIAC 의프로그래밍장면 프로그램안에들어있는것프로그램안에는무엇이들어있을까? 프로그램안에는작업의내용이들어있다. 즉, 작업의지시서가들어있다고생각할수있다. 컴퓨터에게무엇을어떻게시킬지를기록해놓은문서가프로그램 (program) 이다. 프로그램의각문장은컴퓨터에게작업을지시하는명령 (instruction) 으로되어있다. 명령은 숫자를더하시오, 데이터를저장하시오 와같은형식으로되어있다. 만약사용자에게두수를받아서두수의합을출력하는프로그램이라면 [ 그림 1-4] 와같은내용이프로그램안에들어있을것이다. 프로그램을만드는작업을프로그래밍 (programming) 이라고하며프로

18 CHAPTER 01 누구나쉽게즐기는 C 언어콘서트 그램을만드는사람을프로그래머 (programmer) 라고한다. [ 그림 1-4] 프로그램은작업지시서와같다. 최초의프로그래머역사상최초의프로그래머는누구일까? 프로그램을최초로만든사람은여자로서에이다러브레이스 (Ada Lovelace) 이다. 에이다는대문호바이런의친딸로서배비지의해석기관에매료되어해석기관을위한프로그램을개발하였다. 에이다는현대적인컴퓨터가나오기 100년전에이미서브루틴 (subroutine), 루프 (loop), 점프 (jump) 등의핵심적인컴퓨터프로그래밍기본원리를고안하였다. 서브루틴은같은공식을여러번사용하기위해서, 루프는같은계산을반복하기위해서, 점프는중간의필요없는과정을뛰어넘기위해서고안하였다. 여기에추가로어떤조건이일치할경우, 다음공식으로넘어가는 if 구문을생각해냈다. 이러한것들은배비지의해석기관이단순히계산만하는기계가아니라주어진조건에따라결정을내리고논리를수행할수있다는것을의미하였다. 미국국방성에서는에이다러브레이스를기념하기위하여자신들의언어를에이다 (ADA) 라고이름지었다. 세계최초의프로그래머는여자였던것이다. 컴퓨터가이해하는언어프로그램은컴퓨터에게해야할작업의내용을알려주는문서이다. 그렇다면어떤언어를사용해야만컴퓨터가작업지시를이해할수있을까? 컴퓨터는사실프로그래머가시키는대로만하는단순한기계이니사람의언어를이해할것같지는않다. 즉, 한국어나영어등으로작업을기술한다면컴퓨터는전혀이해할수없을것이다.

제 1 장프로그래밍소개 19 [ 그림 1-5] 컴퓨터는한글로된작업지시서는이해하지못하는반면, 기계어로된작업지시서는이해할수있다. 사실컴퓨터가알아듣는언어는한가지뿐이다. 즉, 0과 1로구성되어있는 "001101110001010..." 과같은이진수이다. 컴퓨터는이진수의개념위에만들어진기계이다. 컴퓨터는모든것을 0과 1로표현하고 0과 1에의하여스위치회로들이 ON/OFF 상태로변경되면서작업을한다. 즉, 0이면회로를 OFF시키고 1이면회로를 ON으로만든다. 이러한이진수형태의언어를기계어 (machine language) 라고한다. 이러한기계어는컴퓨터가가장좋아하는언어이다. 실제로초기의컴퓨터에서는이러한기계어를사용하여프로그램을했었다. 그러나기계어는인간한테는상당히불편한언어이기때문에좀더편리한언어가필요했다. 따라서인간이더편리하고알기쉽게지시를내리기위하여프로그래밍언어들이만들어졌다. 이들프로그래밍언어들은기계어와인간이사용하는자연어중간쯤에위치한다. 인간이프로그래밍언어를배워서프로그램을작성하면컴파일러라고하는통역을담당하는소프트웨어가프로그램을기계어로바꾸어준다. 이것은영어를말하는사람과한국어를말하는사람이중간에통역을두고이야기하는것과비슷하다.

20 CHAPTER 01 누구나쉽게즐기는 C 언어콘서트 [ 그림 1-6] 컴파일러는프로그램을기계어로변환한다. 컴퓨터는왜십진수가아닌이진수를사용하는가? 2진수의각자릿수는 0 아니면 1이다. 0은스위치가열린상태 (OFF) 로표현할수있고 1은스위치가닫힌상태 (ON) 로표현할수있다. 따라서여러개의스위치를늘어놓으면이진수를나타낼수있다. 이진수는컴퓨터가받아들이기가아주쉽다. 컴퓨터에서는내부적으로는모든것을이진수형태로표현하여처리한다. 이진법은숫자를표현하는데도사용되지만컴퓨터안에서덧셈과같은연산을수행하는회로를구현하는데도이용된다. 0과 1만을이용하여논리처리를하는수학의분야를불대수 (boolean algebra) 라고한다. 이불대수를이용하면몇개의스위치를모아서논리회로 (logic circuit) 를만들어각종연산을빠르게하는회로를만들수있다. 컴퓨터에서스위치는트랜지스터로구현된다. 트랜지스터는소형전자스위치로생각하면된다.

제 1 장프로그래밍소개 21 1.2 프로그래밍언어의종류 현재많이사용되는프로그래밍언어에는 FORTRAN, PASCAL, COBOL, C, C++, C#, Object-C, Java 등이있다. 프로그래밍언어는하나만있으면될거같은데왜그렇게많은종류가있을까? 그이유는각언어마다특징이다르기때문이다. 시장에나가보면 TV도여러회사에서나온제품들이경쟁하고있는것처럼프로그래밍언어도다양한용도에맞는여러가지언어들이만들어지고있는것이다. 어떤프로그래밍언어를사용하더라도컴퓨터에일을시킬수있지만선택기준은주어진상황에서어떤프로그래밍언어가가장작업을효과적으로간단하게할수있느냐이다. < 표 1-1> 에각언어들을간략하게기술하였다. 언어특징예제 FORTRAN은 1950년대에가장먼저만 FORTRAN 들어진언어로수치계산과과학기술계산에적합하다. COBOL은 1959년만들어진비즈니스사무처리언어이다. 이언어는구어체 COBOL 문장형태로기술할수있도록설계되었다. PASCAL은 1970년대에니클라우스비르트에의하여개발된절차적인프로 PASCAL 그래밍언어이다. 파스칼은교육용언어로알려져있다. C언어는 1970년대초반, UNIX 운영체제를위하여 AT&T의벨연구소에서일 C 하던데니스리치에의하여만들어졌다. C++ 는 1983년벨연구소의스트로스트럽에의하여개발된언어로, C언어 C++ 에클래스개념을비롯하여여러가지객체지향적인특징들을추가한언어이다. Java는 1995년선마이크로시스템의제임스고슬링에의하여개발된객체 Java 지향언어이다. 자바는인터넷웹페이지상에서실행이가능하다. PROGRAM HELLO PRINT '(A)', 'Hello, World' STOP END IDENTIFICATION DIVISION. PROGRAM-ID. HELLO-WORLD. PROCEDURE DIVISION. DISPLAY 'Hello, World'. STOP RUN. program Hello(output); begin writeln('hello, World') end. int main(void) { printf("hello, World\n"); return 0; } int main() { cout << "Hello, World" << endl; return 0; } public class Hello { public static void main(string[] args) { System.out.println("Hello, World"); } } < 표 1-1> 프로그래밍언어

22 CHAPTER 01 누구나쉽게즐기는 C 언어콘서트 중간점검 1. 은과학기술계산에주로사용된다. 2. 은컴퓨터교육에사용할목적으로제작되었다. 3. 은 C에객체지향개념을추가한언어로서 C의상위집합이다. 4. 은기업의사무처리에적합하다. 5. 은인터넷상에서실행이용이하도록만들어진언어이다. 6. C언어를기초로만들어진대표적인 2가지언어는 과 이다. 1.3 C 언어 C언어는 1970년대초반, UNIX 운영체제를위하여 AT&T의벨연구소에서일하던 Dennis Richie에의하여만들어졌다. 처음만들어진후, 벨연구소안에서만사용되던 C언어는차츰외부에서도인기를얻기시작하더니현재는가장널리사용되는언어중의하나가되었다. Dennis Ritchie는이공로로 1983년에 Ken Thompson과함께컴퓨터분야의노벨상이라고불리는 Turing 상을수상하였다. [ 그림 1-7] Ken Thomson과 Dennis Ritchie가클린턴대통령으로부터 National Medal of Technology 상을받는장면 C언어의특징중에서중요한것들은다음과같다. C언어는간결한언어이다. C언어에는꼭필요한기능만이들어있고, C언어의모든표기법은매우간결하다. 이점은여러분들이학습을진행하면느낄수있을것이다. 간결성은 C언어의핵심적인특징이다. C언어는효율적인언어이다. C언어가효율적이라는의미는 C로작성된프로그램이크기가작으며실행속도가빠르고메모리를효과적으로사용한다는것을말한다. C언어는거의어셈블리언어수준의효율성을자랑한다. 이점은상업용프로그램을작성할때큰장점이된다.

제 1 장프로그래밍소개 23 C언어는저수준의프로그래밍도가능하고고수준의프로그래밍도가능하다. C언어는운영체제를만들었던언어이니만큼, 어셈블리언어만큼의구체적인하드웨어제어가가능하다. 실제로 TV, 휴대폰, 세탁기등의여러가지전자기기안에들어가는임베디드 ( 내장 ) 프로그램은대부분 C언어로개발되고있다. 예전에는어셈블리언어로작업을하였지만어셈블리언어는사용하는 CPU에따라서프로그램을변경시켜야되는치명적인약점이있다. C언어로임베디드프로그램을작성하게되면유지관리및다른기기로의이식도쉬워진다. C언어는포인터, 비트단위의조작으로여러가지하드웨어장비를섬세하게제어할수있다. 또한 C언어는모듈단위의프로그램작성을지원하고분할컴파일도가능하기때문에고수준에서의프로그램작성도가능하다. 하향식 (top-down) 설계, 구조화프로그래밍, 모듈화설계등의소프트웨어공학의다양한기법들을적용할수있다. C언어는이식성이뛰어나다. 이식성 (portability) 이란한번작성된프로그램을다른 CPU를가진하드웨어로쉽게이식할수있다는뜻이다. 많은종류의 CPU에대하여 C 컴파일러가개발되어있기때문에 C 프로그램은상대적으로이식성이좋다. 즉, PC에서개발된프로그램도컴파일만다시하면슈퍼컴퓨터에서수행시킬수있다. C언어는배우기가어렵다. C언어는초보자가배우기가어렵다고하는데, 교육을위하여일부러쉽게만들어놓은언어가아니라지금도산업현장에서사용되는언어이므로당연하다할것이다. 또한항상모든자유에는책임이따르듯이하드웨어를제어하기위하여꼭필요한요소인포인터등을잘못사용하는경우가많다. [ 그림 1-8] C 언어의특징

24 CHAPTER 01 누구나쉽게즐기는 C 언어콘서트 중간점검 1. 이번절에서새롭게등장한용어들의의미를인터넷을이용하여찾아보자. 어셈블리언어, 모듈, 임베디드프로그램, 소프트웨어공학 1.4 알고리즘 이제우리는프로그램이컴퓨터안에서무슨역할을하는지도알았고, 프로그래밍언어를사용하면더욱쉽게프로그램을작성할수있다는것도알았다. 그렇다면프로그래밍언어의규칙만학습하면프로그램을작성할수있는것일까? 다시말해, 프로그래밍언어를어떻게사용하는지만배우면프로그램을작성할수있는것일까? 요리로예를들어보자. 자, 요리를만들기위해서오븐을준비하였다. 그리고오븐을어떻게사용하는지도배웠다. 그렇다면음식재료만있으면누구나요리를할수있는것일까? [ 그림 1-9] 오븐 ( 컴퓨터 ) 이준비되고오븐에게명령을내리는방법 ( 프로그래밍언어 ) 을안다고하더라도요리를하는절차 ( 알고리즘 ) 를모르면요리 ( 프로그램 ) 를만들수없다. 한가지매우중요한것이빠져있다. 오븐의사용법을안다고해서누구나요리를만들수있는것은아니다. 어떻게요리를만들것인가? 가빠져있다. 즉, 요리를만드는절차가빠져있는것이다. 컴퓨터도마찬가지이다. 컴퓨터에명령을내리는프로그래밍언어만안다고해서프로그램을작성할수있는것은아니다. 주어진문제를어떤절차에따라서해결할것인가가빠져있으면프로그램을작성할수없다. 문제를해결하는절차 ( 또는방법 ) 가바로알고리즘 (algorithm) 이다. 이책에서는물론어려운알고리즘은등장하지않는다. 하지만아무리간단한프로그램이라도어떤절차에따라서주어진문제를해결할것인지를생각해보아야한다.

제 1 장프로그래밍소개 25 알고리즘이란? 어떤문제가주어져있고이것을컴퓨터로해결하려고한다고가정하자. 제일먼저해야할일은문제를해결할수있는절차를고안하는것이다. 예를들면, 전화번호부에서특정한사람 ( 박철수라고가정하자 ) 의전화번호를찾는문제를생각하여보자. 한가지방법은전화번호부의첫페이지부터시작하여한장씩넘기면서박철수를찾는것이다. 이방법은엄청난시간이걸리는방법으로보통이런식으로찾는사람은거의없다. 또하나의방법은전화번호부의이름들이정렬되어있음을이용하는방법이다. 전화번호부의중간정도를펼쳐서거기에있는이름들과박철수를비교하여앞부분으로가든지뒷부분으로간다. 다시찾아야할범위의중간부분에있는이름과박철수를비교한다. 이러한과정을박철수란이름을찾을때까지되풀이한다. 이러한방법은프로그래밍언어와는무관하다. 즉, C언어를사용하건 Java를사용하건사용되는방법은동일하다. 이렇게문제를풀기위하여컴퓨터가수행하여야할단계적인절차를기술한것을알고리즘 (algorithm) 이라고한다. 알고리즘을프로그래밍언어로구현하면프로그램이된다. 알고리즘은흔히요리법 (recipe) 에비유된다. 우리는요리를요리법에따라만들어본적이있을것이다. 예를들어, 빵을만드는알고리즘은다음과같다. 1 빈그릇을준비한다. 2 이스트를밀가루, 우유에넣고저어준다. 3 버터, 설탕, 계란을추가로넣고섞는다. 4 따뜻한곳에놓아두어발효시킨다 5 170~180 도의오븐에서굽는다 [ 그림 1-10] 알고리즘은요리법과같다. 빵을만들때도순서가잘못되면빵이만들어지지않는다. 빵을만드는방법은영어, 독일어, 프랑스어로도정확하게표현할수있듯이알고리즘은어떤프로그래밍언어로도동일하게표현할수있다. 같은빵을만드는방법도여러가지가있을수있듯이하나의문제에대하여알고리즘은여러개가있을수있다. 이경우프로그래머는가장효율적인알고리즘을선택하여구현하여야할것이다.

26 CHAPTER 01 누구나쉽게즐기는 C 언어콘서트 알고리즘의예간단한예를들어서알고리즘을설명하여보자. 많이사용되는예제가 1부터 10까지의합을구하는문제이다. 다음과같이몇가지의방법을생각할수있다. 각각의방법은하나의알고리즘이된다. 1 1 부터 10 까지의숫자를직접하나씩더한다. 1 + 2 + 3 + + 10 = 55 2 두수의합이 10 이되도록숫자들을그루핑하여그룹의개수에 10 을곱하고남은숫자 5 를더한다. 3 공식을이용하여계산할수도있다. 10*(1+10)/2=55 순서도그렇다면알고리즘은어떻게기술하는것이좋을까? 물론우리말로기술할수도있고아니면영어로기술할수도있다. 입문단계에서많이사용되는방법은순서도를사용하는것이다. 순서도는플로차트 (flow chart) 또는흐름도라고도하는것으로프로그램에서의논리순서또는작업순서를그림으로표현하는방법이다. 프로그래머는항상순서도를통해자신의논리를가시화하는것이좋다. 보통의순서도는단순한기하학적기호를사용한다. 즉, 처리는직사각형, 판단은마름모, 입출력처리는평행사변형기호를쓴다. [ 그림 1-11] 순서도작성에사용되는기호

제 1 장프로그래밍소개 27 예를들어, 프린터고장을처리하는알고리즘은다음과같다. [ 그림 1-12] 순서도의예 : 프린터고장을처리하는알고리즘 순서도의단점은알고리즘이복잡해지면기술하기가힘들어진다는점이다. 중간점검 1. 친구에게전화를거는알고리즘을만들어보라. 2. 세탁기를이용하여세탁을하는알고리즘을만들어보라. 1.5 프로그램개발과정 이제부터는실제로컴퓨터에서실행되는프로그램을작성하여보자. 먼저전체적인과정을살펴보자.

28 CHAPTER 01 누구나쉽게즐기는 C 언어콘서트 [ 그림 1-13] 프로그래밍의순서 1 에디트 (edit) 단계컴퓨터에작업을지시하는문서를만들어야한다. C언어를이용하여원하는작업의내용을기술한것을소스코드 (source code) 라고한다. 소스코드가파일에저장된것을소스파일이라고한다. 소스파일이름은프로그래머가마음대로지정할수있다. 다만파일의확장자는항상.c 이어야한다. 2 컴파일 (compile) 과링크 (link) 단계컴파일러를이용하여소스파일에저장된소스코드를기계어로변환한다. 컴파일러는소스파일의문장을분석하여문법에맞도록작성되었는지를체크한다. 만약오류가발견되면사용자에게오류를통보하고컴파일은종료된다. 이런경우에프로그래머는에디팅단계로되돌아가서소스파일을수정하여야한다. 만약오류가없다면컴파일러는각문장들을기계어로변환한다. 이기계어로되어있는파일은오브젝트파일 (object file) 이라고불린다. 오브젝트파일은윈도우즈에서는.obj 확장자를가지고있다. 예를들어, test.c를컴파일하면 test.obj라는이름의오브젝트파일이생성된다. 링크 (link) 란서로연관된오브젝트파일들을라이브러리파일들과연결하여하나의실행파일 (execute file) 을만드는절차이다. 링크가끝나면비로소실행가능한파일인 test.exe 가생성된다. 3 실행 (execute) 단계실행파일을컴퓨터에서실행시키면서자신이원하는작업을올바르게하고있는지확인하는단계이다.

제 1 장프로그래밍소개 29 필요한도구프로그램을제작하려면어떠한도구가필요할까? 먼저소스파일을만드는데는텍스트에디터가필요하다. 메모장과같은에디터도사용할수있다. 소스파일을컴파일하여서실행파일로만들려면컴파일러가필요하다. 컴파일러는비용을지불하고구입하여야하지만입문자들을위한컴파일러는무료로제공된다. 대표적인컴파일러가바로우리가사용하려고하는비주얼 C++ 이다. 또오류를찾아내는데필요한디버거가있다. 예전에는에디터, 컴파일러, 디버거등이별도의분리된프로그램이었다. 따라서프로그래머들은매번여러개의프로그램을실행시켜야했다. 프로그램개발은통합개발환경 (IDE: integrated development environment) 과같은소프트웨어도구들이등장하면서더욱간편하고효율적으로프로그램을작성할수있게되었다. 통합개발환경은프로그램개발에필요한기능인에디팅, 컴파일, 실행, 디버깅기능을하나의프로그램안에모두넣어서프로그램개발을쉽게해주는도구를의미한다. 비주얼 C++ 윈도우즈에서의대표적인통합개발도구는마이크로소프트사의비주얼 C++(Visual C++) 이다. 비주얼 C++ 의최신버전은비주얼 C++ 2008이다. 여기에서는사용자의수준에맞추어서몇가지의제품을제공하고있다. 특이한점은학생및초보자가쉽게배울수있는비주얼 C++ 익스프레스에디션 (Express Edition) 을제공하고있다. 이것은인터넷에서무료로다운로드받아서설치할수있다 (http://www.microsoft. com/express/vc/).

30 CHAPTER 01 누구나쉽게즐기는 C 언어콘서트 [ 그림 1-14] 비주얼스튜디오 2008 비주얼 C++ 는 C언어와 C++ 언어를이용하여윈도우형태를비롯하여여러가지형태의응용프로그램을개발할수있도록하여주는통합개발도구이다. 여기서우리가만들려고하는형태는콘솔 (console) 프로그램이다. 콘솔프로그램은콘솔을이용하여텍스트형태로입력과출력을하는매우간단한프로그램이다. 주로문자입출력만이가능하며윈도우나그래픽은불가능하다. 너무실망할필요는없고항상중요한것은화려한외양보다내용이다. 소스파일과오브젝트파일, 실행파일중에서반드시보관하여야하는파일은무엇일까? 정답은소스파일이다. 소스파일만있으면컴파일러를수행시켜서오브젝트파일, 실행파일을만들수있다. 하지만소스파일을삭제하면컴파일이불가능하다. 따라서반드시소스파일을잘보관하여야한다. Visual C++ 에서는프로젝트와워크스페이스파일도같이보관하는것이좋다. 이러한파일들은다시만들수도있지만번거로운작업이된다. 먼저간단한 C 프로그램을에디터로입력하여소스파일로만들고컴파일과링크한다음, 실행시켜보자.

제 1 장프로그래밍소개 31 만약여러분이게임프로그램을작성하였다고가정하자. 프로그램을판매하여이익을얻으려고한다. 그런경우에여러분은소스파일, 오브젝트파일, 실행파일중에서어떤파일을구매자한테주어야할까? 정답은실행파일이다. 실행파일은독립적인파일이다. 즉, 다른파일들이없어도독립적으로수행될수있다. 구매자들은실행파일만있으면얼마든지실행할수있다. 또한 C 컴파일러도필요없다. 만약소스파일을구매자한테준다면구매자가소스를변경하여다른게임을만들수있기때문에조심하여야한다. 업체들이소스파일을공개하지않는것은이런이유때문이다. 중간점검 1. 프로그램작성단계에는,, 이있다. 2. 프로그램개발에필요한도구를묶어서제공하는것을 이라고한다. 1.6 비주얼 C++ 를이용한프로그램작성 비주얼 C++ 의실행먼저 [ 시작 ] 을클릭하고 [ 모든프로그램 ] 에서 [Microsoft Visual C++ 2008 Express Edition] 을찾아서실행시키거나바탕화면에서비주얼 C++ 아이콘을찾아서더블클릭한다. 초기화면은다음과같다.

32 CHAPTER 01 누구나쉽게즐기는 C 언어콘서트 프로젝트의생성비주얼 C++ 를사용하여프로그램을작성하려면먼저솔루션과프로젝트에대하여이해를하여야한다. 솔루션 (solution) 은하나의애플리케이션을생성하기위한프로젝트들의그루핑이다. 프로젝트 (project) 란하나의실행파일을만드는데필요한모든파일들을묶어놓은것이다. 프로젝트에는소스파일, 리소스파일, 외부파일과같은것들이포함된다. 먼저 [ 파일 ] [ 새로만들기 ] [ 프로젝트 ] 메뉴를선택하여서새로운프로젝트를만들어보자. 프로젝트를생성하면솔루션은자동으로생성된다. [ 파일 ] [ 새로만들기 ] [ 프로젝트 ] 를선택하면다음과같은화면이등장한다. 프로젝트형식으로는 [ 일반 ] 을선택하고템플릿은 [ 빈프로젝트 ] 를선택한다. 이어서새로운프로젝트의이름을입력한다. 프로젝트가저장되는폴더는 [ 찾아보기 ] 버튼을클릭하여서변경할수있다. 솔루션의이름은자동으로입력된다.

제 1 장프로그래밍소개 33 소스파일의생성프로젝트를만들었으므로이제는소스파일을생성시켜보자. 소스파일을프로젝트에추가하기위해서는 [ 프로젝트 ] 메뉴에서 [ 새항목추가 ] 를실행한다. 그러면다음과같은화면이등장한다. 여기서 [ 코드 ] 와 [C++ 파일 (.cpp)] 을선택하고파일이름을입력한다. 우리가작성하려고하는것은 C++ 파일이아니고 C 파일이지만걱정할것은없다. 파일이름을입력할때확장자를.c로하면된다. 만약확장자를지정하지않으면확장자가.cpp인소스파일이기본적으로생성된다.

34 CHAPTER 01 누구나쉽게즐기는 C 언어콘서트 소스코드의입력왼쪽상단에있는솔루션탐색기에보면리소스파일, 소스파일, 헤더파일의세가지폴더가보인다. 우리가만든 test01.c는소스파일폴더에들어있다. test01.c 파일을더블클릭하면 test01.c가열리면서에디터가실행되어오른쪽화면에서소스코드를입력할수있다. 이상태에서오른쪽윈도우에소스를입력하면된다. 다음의소스를주의하여서그대로입력하여보자. 소스코드를입력할때는흔히한두글자는틀리기쉽다. 그러나한글자만틀려도프로그램은컴파일되지않는다. 따라서처음에는다음을참조하여코드를보이는대로그대로입력하도록하자. [ 그림 1-15] 소스코드를오른쪽과같이입력하여야한다. 소스코드를입력할때주의하여야할사항을살펴보자. C에서는대문자와소문자를구별한다. 따라서대문자와소문자를정확하게구별하여입력하여야한다. 즉, main과 Main은서로다르다. 주어진소스코드를입력할때한글자라도틀리지않게철자에주의하여야한다.

제 1 장프로그래밍소개 35 하나의기호만틀려도실행이불가능하다. stdio.h라고해야할것을 stdio,h로입력하면안된다. 컴퓨터는믿을수없을만큼멍청하다. 소스코드에서의각문장은세미콜론 (;) 기호로끝나야한다. ; 기호는마침표역활을한다. 각문장과문장사이에는공백이있어도된다. 또한문장은들여쓸수있다. 그러나일단은주어진대로입력하도록하자. 화면을캡처한그림에서도알수있지만단어들이파란색, 붉은색, 검은색으로나타난다. 만약자신이입력한단어가그림의색상과다른경우에는다시한번확인을하여야한다. 그림과완전히 100% 동일한경우에만올바르게컴파일된다. Q 비주얼 C++ 를사용하여프로그램을작성하는경우에반드시비주얼 C++ 에서지원되는에디터만을이용해야되는가? A 다른에디터를이용해도된다. 단, 에디터를이용하여파일을저장할때파일의확장자가 c 로끝나야된다. 확장자가 c 인파일은프로젝트의 [ 소스파일 ] 이라고되어있 는부분에추가할수있다. [ 소스파일 ] 위치에서마우스오른쪽버튼을누르고 [ 추가 ] 메뉴를선택하면삽입시킬파일을물어본다. 컴파일과링크소스코드를다입력하였으면컴파일과링크를하여실행파일을만들어보자. 컴파일과링크를하려면 [ 빌드 ] 메뉴의 [ 솔루션빌드 ] 를선택하면된다. 소스파일은자동으로저장된다.

36 CHAPTER 01 누구나쉽게즐기는 C 언어콘서트 화면은컴파일과링크과정에서오류와경고의숫자가 0이라는것을나타낸다. 만약여러분이입력하는과정에서철자를잘못입력하게되면오류와경고가 0이아닐수가있다. 이경우에는입력한소스코드를다시한번교과서와비교해보고오류를수정한다음, 다시빌드를하여야한다. 만약철자를하나잘못입력하였다고가정하자. 문장끝의 ; 을 : 으로잘못입력했다고하면, 컴파일러는다음과같은오류메시지를출력하게된다. 위의오류메시지를보면 test01.c의 5번라인에서구문오류가발생했다는것을알수있다. 프로그래머는오류메시지에서오류설명을보고소스코드를수정할수있어야한다. 프로그램실행지금까지작성한프로그램을실행시키려면 [ 디버그 ] 메뉴의 [ 디버깅하지않고시작 ] 메뉴항목을선택한다. 만약실행시간오류가없다면다음과같은 MS-DOS 창이뜨고여기에 Hello World! 가출력된다. 이상태에서아무키나누르면프로그램이종료되고다시비주얼 C++ 로되돌아간다. 실행화면에서 계속하려면아무키나누르십시오... 는프로그램의출력이아니고계속진행하려면아무키나누르라는안내메시지이다. 이메시지는프로그램을실행시켰을때항상나오는메시지이다. Hello World! 가예제프로그램의출력이된다. 참고독자들중에서는혹시왜프로그램의출력이명령프롬프트에텍스트로나오는지궁금해하는사람도있을것이다. C언어가만들어진 1970년대에는주로텍스트로입력과출력을하였다. 따라서 C 프로그램은기본적으로텍스트입력과출력을가정한다. 하지만그래픽프로그램을 C언어로작성하지못한다는의미는절대아니다. 비주얼 C++ 에서도프로젝트의유형을 [Win32] 로하면윈도우에서실행되는그래픽프로그램을작성할수있다.

제 1 장프로그래밍소개 37 위와같은화면이나오면프로그램이성공적으로실행된것이다. 이작은프로그램에대한설명은 2장에서자세하게살펴보자. Q Visual C++ 2008 버전에서는소스파일, 오브젝트파일, 실행파일이어디에저장되는가? A 소스파일은 / 지정폴더 / 솔루션 / 프로젝트 / 에저장된다. 위의예에서는 C:/source/chapter01/test01/test01/ 에 test01.c 가저장된다. 오브젝트파일과실행파일은앞의폴더안의 debug 폴더에저장된다. 중간점검 1. 새로운프로젝트를생성하고프로젝트에소스파일을추가하는메뉴는무엇인가? 2. 프로젝트에속하는소스파일을컴파일하여실행하는메뉴는무엇인가? 3. C언어에서는대문자와소문자를구별하는가?

38 CHAPTER 01 누구나쉽게즐기는 C 언어콘서트 Q & A Q 컴퓨터는왜십진수가아닌이진수를사용하나? A 이진수의각자릿수는 0 아니면 1 이다. 0 은스위치가열린상태 (OFF) 로표현할수있고 1 은스위치가닫힌상태 (ON) 로표현할수있다. 따라서여러개의스위치를 늘어놓으면이진수를나타낼수있다. 이진수는컴퓨터가받아들이기아주쉽다. 컴퓨터에서는내부적으로모든것을이진수형태로표현하여처리한다. Q 지금은객체지향언어시대라고한다. 그래도 C 언어를공부하여야하는가? A C 언어는현재많이사용되는객체지향언어인 C++, 자바의어머니격이되는언어이다. 지금도전자기기안에내장되는임베디드프로그램은 C 언어를많이사 용한다. 그리고많은응용프로그램들이스크립트언어로 C언어와유사한언어들을제공한다 ( 예를들어서 MATLAB). 결론적으로프로그래머가되려고하면 C언어는필수라고할수있다. Q 왜이름이 C 언어인가? A C 언어라고이름붙여진이유는이전에존재하였던 B 언어에서많은특징들을따왔기때문이다. B 언어는 BCPL 이라는언어의간략화된버전이었다고한다.

제 1 장프로그래밍소개 39 Exercise 1. 컴퓨터가사용하는진법은? ( ) 1 2진법 2 8진법 3 10진법 4 16진법 2. 소스프로그램을오브젝트프로그램으로변환하는도구는무엇인가? ( ) 1 링커 2 컴파일러 3 에디터 4 디버거 3. 다음중에서 C언어의특징으로올바른것을모두선택하여라. ( ) 1 비교적간결한언어에속한다. 2 개발된프로그램을다른컴퓨터로옮기기쉽다. 3 하드웨어제어가가능하다 4 객체지향프로그래밍이가능하다. 4. 문제를해결하는절차를시각적으로표현하는것은무엇인가? ( ) 1 구조도 2 순서도 3 의사코드 4 설명도 5. 다음의프로그램개발과정을순서대로적어라. ( ) 1 소스코드를컴파일한다. 2 에디터를이용하여소스코드를작성한다. 3 논리적인오류를추적하기위하여디버깅한다. 4 오브젝트파일들을모아서링크한다. 5 프로그램을실행한다. 6 알고리즘을설계한다. 6. 컴퓨터를이용하여문제를해결하기위한단계 ( 절차 ) 를무엇이라고하는가? ( ) 1 알고리즘 2 객체지향 3 구조적방법 4 자료구조 7. 프로그래밍언어의문법을위반하였을경우에발생하는오류는? ( ) 1컴파일시간오류 2실행시간오류 3 논리적인오류 4 링크시간오류 8. 순서도 (flowchart) 에서처리를나타내는기호는? ( ) 1 2 3 4

40 CHAPTER 01 누구나쉽게즐기는 C 언어콘서트 9. 다음중에서 C언어를개발한사람은누구인가? ( ) 1 Dennis Ritchie 2 Kernighan 3 Niklaus Wirth 4 Bjarne Stroustrup 10. 컴퓨터에서십진법이아닌이진법이사용되는이유를설명하여라. 11. 인텔의 CPU에서사용되는명령 (instruction) 에서 3가지를선택하여무슨일을하는명령어인지를조사하여라. 12. 주판, 계산자, 계산판등의고대의계산하는기계들하고현대의컴퓨터와결정적인차이점은무엇인가? 13. 컴퓨터를이용하여문제를해결할때, 문제를해결하는방법을인간이구체적으로고안하여알려주어야한다면, 왜컴퓨터를사용하는것인가? 인간이직접하는편이낫지않을까? 컴퓨터를사용하는경우의장점을들어라. 14. 임베디드시스템이란어떤것인가? 인터넷에서자료를찾아서정리하여라. 15. 주어진두수의평균을구하는알고리즘을작성하여라. 16. 사용자로부터원의반지름을입력받고, 반지름에 2를곱하여지름을구하고, 여기에 3.14를곱하여원주를구하는알고리즘을순서도를이용하여기술하여라. 17. 사용자에게입력받은 5개의정수중에서최솟값을찾는문제에대한알고리즘을작성하여라. 18. 1부터 10까지의숫자들이있다. 이들숫자들은순서대로되어있지않다. 이들숫자들을크기순서대로정렬시키는알고리즘을생각할수있는가? 19. 두개의숫자중에서큰수를반환하는연산만지원되는컴퓨터가있다. 이컴퓨터에서 3개의숫자중에서제일큰수를찾으려고하면어떤알고리즘을사용해야하는가? 순서도로그려보아라. 20. 두개의컵에우유와주스가각각담겨있다. 우유와주스를교환하기위한알고리즘을고안하여라. 사용가능한세번째컵이있다고가정하여라. 21. 소스파일, 오브젝트파일, 실행파일의차이점을설명하여라. 22. 컴파일러와링커가하는일을정리하여라. 23. 영어의문장을예로들어서문법적인오류와논리적인오류를설명하여라. 24. 다음소스에는많은오류가있다. 오류를찾아내서수정하여라. /* 첫번째프로그램 * / include <stdio.h> int Main(void); { printf("hello World!\n") return 0; }

02 기초사항 C PROGRAMMING CHAPTER 학습목표 프로그램의각구성요소들을간단히학습한다. 키보드로부터입력하는방법을학습한다. 콘솔로출력하는방법을학습한다. C O N T E N T S 2.1 첫번째프로그램 2.2 화면출력 2.3 연산이있는프로그램 2.4 입력과출력이있는프로그램 2.5 오류수정및디버깅 2.6 응용프로그램

02 CHAPTER 기초사항 C PROGRAMMING 2.1 첫번째프로그램 1장에서컴파일하고실행시킨소스코드를분석하여보자. 이프로그램은 "Hello World!" 라고하는문자열을화면에출력하는프로그램이다. 이프로그램은전통적으로 C 프로그램의세계에들어오는사람들이처음으로작성하는프로그램이되어왔다. 프로그램의구성요소들을설명하여보자. hello.c 1 2 3 4 5 6 7 8 /* 첫번째프로그램 */ #include <stdio.h> int main(void) { printf("hello World!"); return 0; } 함수의종료 주석헤더파일포함 함수의시작 실행되는문장 실행결과 Hello World! 주석 /* 첫번째프로그램 */ 위의문장은주석 (comment) 이라고불린다. 주석이란프로그램에대한설명이다. 주석은 /* 로시작하여서 */ 로끝난다. 주석은컴파일러에의하여무시되기때문에프로그램의동작에는전혀영향을끼치지않는다. 무엇이든지적어놓을수있으며한줄또는여러줄이될수있다. 그렇다면도대체주석은어디에필요한것인가? 주석은컴퓨터를위한것이아니고프로그램을읽는사람을위한것이다. 주석은프로그램의가독성을높인다. 주석에는보통프로그램의구조와동작을설명해주는문장들

제 2 장기초사항 43 이들어간다. 대개작성자, 작성목적, 작성일자, 코드설명등이주석에포함된다. / 와 * 은반드시붙여서쓰도록한다. 문법 예 /*... */ /* 한줄로된주석 */ /* 여러줄로된주석 */ 현재의 C 프로그램에서는더욱편리한새로운타입의주석을사용할수있다. 바로이중슬래시 // 이다. 이중슬래시는 // 부터줄의끝까지가주석이라는것을나타낸다. // 이줄은전체가주석이다. printf("hello World!"); // 문자열을화면으로출력 좋은주석은코드를그대로설명하지않는것이라고한다. 좋은주석은코드를작성한의도를명확히나타낸다. 주석은프로그래머가무엇을하려고하는지를훨씬높은수준에서설명하여야한다. [ 그림 2-1] 주석 헤더파일포함 #include <stdio.h> # 으로시작하는문장은전처리기지시자이다. 전처리기 (preprocessor) 는보통본격적으로컴파일하기전에사전정지작업을하는컴파일러의일부분이다. #include는소스코드안에특정파일을현재의위치에포함시키라고지시한다. 이러한파일들

44 CHAPTER 02 누구나쉽게즐기는 C 언어콘서트 은헤더파일 (header file) 이라고불리며, 헤더파일은컴파일러가필요로하는정보를가지고있다. 전처리기지시자문장끝에는세미콜론을붙이면안된다. 문법 예 #include < 헤더파일 > #include <stdio.h> #include <memory.h> stdio.h라는파일은입출력함수에대한정보를가지고있는헤더파일이다. 헤더파일들은일반적으로.h 확장자를가지고있다. 대부분의프로그램에서한개이상의헤더파일을사용한다. 우리는대부분의경우, stdio.h 헤더파일을포함시킬것이다. 헤더파일은보통소스파일의시작부분에포함시킨다. [ 그림 2-2] 헤더파일이 #include 위치에삽입된다. 줄바꿈및들여쓰기 hello.c의 3번째줄은비어있는데이는프로그램을보기쉽게하기위하여빈줄을의도적으로둔것이다. 문장과문장사이에는얼마든지빈줄을둘수있다. 빈줄은프로그램의실행결과에는아무런영향을끼치지않는다. 여기서잠깐들여쓰기 (indentation) 에대하여설명을하고지나가자. 들여쓰기는소스코드의가독성을높이기위하여같은수준에있는문장들을왼쪽끝에서몇자안으로들여보내거나적당한공백문자를삽입하는것이다. 들여쓰기를잘하면소스보기가매우편해진다. 반면에들여쓰기를하지않으면똑같이실행되기는하지만읽기에불편한프로그램이된다.

제 2 장기초사항 45 [ 그림 2-3] 줄바꿈및들여쓰기 함수 1장에서프로그램은작업지시서와같다고이야기하였다. 그렇다면작업을지시하는문장들은어디에들어가게될까? 바로다음과같은공간안에작업을지시하는문장들을넣으면된다. int main(void) { } 작업을지시하는부분 위의문장은실제로는 main() 함수를정의하는문장이다. 함수 (function) 란특정한작업을수행하는코드의집합이다. 함수는입력이주어지면출력을만들어내는가상적인기계와같다. [ 그림 2-4] 함수 하나의프로그램은여러개의함수들로이루어진다. 그러나우리는당분간 main() 함수만을사용할것이다. main() 함수는특별한의미가있다. 왜냐하면모든 C 프로그램은 main() 에서시작하기때문이다. 따라서모든 C 프로그램에는반드시하나의 main() 함수가있어야한다.

46 CHAPTER 02 누구나쉽게즐기는 C 언어콘서트 [ 그림 2-5] main() 함수 함수는 6장에서자세하게기술되겠지만일단간단하게함수에대한설명을하여보자. int main(void) 은함수의이름과함수의입출력을나타낸다. int, main, void는 C언어에서모두미리정해진단어로키워드라고하는데, int는출력타입이고, main 은함수이름이며, void는입력타입이다. 따라서 int main(void) 는함수main은 void 형태의입력을받아서처리하여출력을 int 형태로내보낸다는것을의미한다. void는비어있다는뜻이므로이는입력이없다는것을말한다. int는정수타입을나타내므로출력은정수형태임을알수있다. 함수의구성요소를다시정리하여보면다음과같다. [ 그림 2-6] 함수의구성요소 함수의출력타입함수의이름 int main(void) 함수의입력타입 { printf("hello World!\n"); return 0; } 함수의시작함수의몸체 함수의끝 함수의시작과끝은 { 과 } 로나타낸다. { 과 } 사이에함수의몸체부분이들어간다. 함수의몸체에는작업을수행하는문장들이들어간다. 예를들어, 만약함수가화면에출력하는작업을한다면화면에메시지를출력하는문장들이 { 과 } 사이에들어간다. 문장그렇다면이제함수의몸체에들어가서작업을지시하는문장 (statement) 에대하여살펴보자. 문장은하나의작은처리를나타낸다. 프로그램이어떻게동작하느냐는어떤문장이함수안에포함되느냐에달려있다. 문장을이용하여화면에값들을출력할수도있고수학적인계산을할수도있다. 한글문장의끝에는마침표를찍듯이소스코드문장의끝에는반드시 ;( 세미콜론 ) 을찍어야한다. 문장들은기본적으로처음부터차례대로실행된다. 즉, 예제에서살펴보면먼저 printf("hello World!"); 문장이실행되고다음에 return 0; 문장이실행된다.

제 2 장기초사항 47 int main(void) { printf("hello World!"); return 0; } 순차적으로실행된다. printf("hello World!"); 문장은 printf() 함수를호출하여콘솔화면에텍스트 Hello World! 를출력하는문장이다. 함수를호출한다고하는것은이미작성되어있는함수를사용한다는뜻이다. printf() 함수는컴파일러가우리에게제공하는함수로써콘솔화면에텍스트나데이터값들을출력할때사용하는라이브러리함수이다. 일반적으로 printf 함수는큰따옴표사이에있는문자들을그대로화면에출력한다. 큰따옴표로둘러싸인텍스트를문자열 (string) 이라고한다. 예제프로그램에서 "Hello World!" 가바로문자열이다. 화면출력은상당히중요한작업이기때문에다음절에서상세하게살펴보자. return은함수가작업을끝내고작업의결과를반환할때사용된다. return 0; 문장이실행되면 main() 함수는작업을끝내고외부로 0값을반환한다. 여기서외부라고하는것은이프로그램을실행시킨윈도우 XP와같은운영체체를가리킨다. 보통 0의값은프로그램이정상적으로종료했음을나타낸다. 참고 printf() 에서 f는 formatted를의미한다. 즉, 형식 (format) 을지정하는출력함수라는의미이다. printf() 함수는프린트에프라고읽으면된다. 중간점검 1. 주석이하는역할은무엇인가? 2. 주석을여러줄로하려면어떤스타일을사용하여야하는가? 3. #include 문은어떤동작을하는가? 4. 모든문장의끝에있어야하는기호는? 2.2 화면출력 화면출력은어떤프로그램에서도중요하다. 보통프로그램은결과를어딘가에출력하여야하기때문이다. 요즘은윈도우에다가그래픽으로출력하는것이대세이지만그래픽을사용하려면약간은복잡한과정을거쳐야한다. C언어는전통적으로콘솔화면에텍스트를출력하는기능을기본으로제공한다. 바로 printf() 가출력을담당하는라이브러리함수이다. 라이브러리함수란프로그래머가사용할수있도록컴파일러가기본적으로제공하는함수들을의미한다. 라이브러리에있는함수들은누구든지사용할수있다.

48 CHAPTER 02 누구나쉽게즐기는 C 언어콘서트 [ 그림 2-7] 라이브러리함수는컴파일러가프로그래머한테제공하는함수들이다. 즉, 우리가다음과같은문장을작성하면컴퓨터는따옴표안의텍스트를화면에출력한다. [ 그림 2-8] printf() 함수 라이브러리에는많은함수들이기본으로제공되고있는데, 그중에서 printf() 는콘솔화면에출력을하기위한함수이고, 뒤에나오는 scanf() 는키보드에서의입력을위한함수이다. 줄바꿈기호앞에서화면에문자열을출력하는아주간단한프로그램을작성하여보았다. 우리가만든첫번째프로그램을약간만확장시켜보자. 우선출력을다음과같이한줄이아닌두줄로하려면어떻게할까? 실행결과 Hello World! Kim ChulSoo 첫번째예제에서는 printf("..."); 에있는큰따옴표안의텍스트가화면에출력되었다. 그리고 main() 함수안에들어있는문장들은순차적으로수행된다고하였다. 따라서비슷한문장을하나더만들어서추가하여실행하면원하는결과를얻을수있을것이다.

제 2 장기초사항 49 hello1.c 1 2 3 4 5 6 7 8 9 /* 첫번째프로그램의응용 */ #include <stdio.h> int main(void) { printf("hello World!"); printf("kim ChulSoo"); } return 0; 순차적으로실행된다. 실행결과 Hello World!Kim ChulSoo 하지만실행결과는우리가원하는것과약간다르다. Hello World! 를출력한후에다음줄에 Kim ChulSoo를출력하려면화면에서줄을바꾸어주어야한다. 줄바꿈문자는 \n으로표현된다. \n처럼역슬래시 (\) 가먼저나타나면특별한의미를가진다. \ 와 n이합쳐진 \n은줄바꿈 (newline) 을의미한다. \n은화면의커서를다음줄의시작위치로옮긴다. 여기서커서라고하는것은마우스의커서가아니고 MS-DOS 창과같은콘솔화면에서의커서를의미한다. [ 그림 2-9] \n은화면에서줄을바꾸는데사용되는특수한문자이다. 따라서줄바꿈문자를이용하여서위의프로그램을다시작성해보면다음과같다.

50 CHAPTER 02 누구나쉽게즐기는 C 언어콘서트 hello2.c 1 2 3 4 5 6 7 8 9 10 /* 첫번째프로그램의응용 */ #include <stdio.h> int main(void) { printf("hello World!\n"); printf("kim ChulSoo\n"); } return 0; 줄바꿈문자 실행결과 Hello World! Kim ChulSoo 화면에여러줄을출력한다. 이제까지배운것을바탕으로화면에구구단의일부를다음과같이출력하여보자. 실행결과 3 1 = 3 3 2 = 6 3 3 = 9 여기에서도마찬가지로 main() 안의문장들은순차적으로실행되므로다음과같이문장을배치하면된다. gugu.c 1 2 3 4 5 6 7 8 9 10 11 /* 첫번째프로그램의응용 */ #include <stdio.h> int main(void) { printf("3 X 1 = 3\n"); printf("3 X 2 = 6\n"); printf("3 X 3 = 9\n"); } return 0; 순차적으로실행된다.

제 2 장기초사항 51 중간점검 1. 줄바꿈문자인 "\n" 이하는역할은무엇인가? 2. main() 함수안의문장들은어떤순서대로실행되는가? 2.3 연산이있는프로그램 앞에서출력문만있는아주간단한프로그램을살펴보았다. 그러나일반적인프로그램은외부로부터데이터를받아서, 데이터를처리한후에, 결과를화면에출력한다. 이번장에서는이러한일반적인구조를가지는프로그램을작성하여보자. 이프로그램들을난이도순으로학습하여보자. 첫번째프로그램은두개의정수를가지고덧셈연산을실행한후에, 연산결과를화면에출력한다. 이프로그램에서는데이터들을메모리에저장하기위하여변수라는새로운개념을사용한다. 이프로그램을통해덧셈연산을실행하는문장을배우고, printf() 함수를사용하여변수의값을출력하는방법도살펴본다. 먼저소스프로그램을전체적으로살펴본다음에각구성요소별로좀더자세히설명한다. add1.c 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 /* 두개의숫자의합을계산하는프로그램 */ #include <stdio.h> int main(void) { int x; int y; int sum; } // 첫번째정수를저장할변수 // 두번째정수를저장할변수 // 두정수의합을저장하는변수 x = 100; 변수에값을할당 y = 200; 덧셈연산 sum = x + y; printf(" 두수의합 : %d", sum); return 0; 변수의값을출력 변수선언 실행결과 두수의합 : 300

52 CHAPTER 02 누구나쉽게즐기는 C 언어콘서트 변수 int x; int y; int sum; // 첫번째정수를저장하는변수 // 두번째정수를저장하는변수 // 두정수의합을저장하는변수 위의문장들은변수를정의하는문장이다. 변수 (variable) 란프로그램이사용하는데이터를일시적으로저장할목적으로사용하는메모리공간이다. 변수를요리에비유하여이야기하면그릇이라고할수있다. 요리는여러가지재료를이용하여만든다. 요리를하려면외부에서음식재료를받아서어딘가에놓아야한다. 이때필요한것이그릇이다. 재료들을일단은그릇에놓아야다음에사용할수있는것이다. 프로그램에서변수도그릇과마찬가지의역할을한다. 어떤처리를하려면먼저입력데이터값들을어딘가에저장해야한다. 이때필요한것이변수이다. 변수는데이터값을일시적으로저장하는역할을한다. [ 그림 2-10] 프로그램에서의변수는요리에서의그릇과같다. 그릇에음식재료들이담기듯이변수에는데이터들이저장된다. 변수는데이터값을저장하고있는상자로생각하면이해가쉽다. 이상자는컴퓨터안의메인메모리안에만들어진다. 앞으로는변수를상자로그리기로하자. [ 그림 2-11] 변수와상자 변수는어떤데이터를저장하느냐에따라여러가지타입이있다. 상자도여러가지

제 2 장기초사항 53 크기가있는것처럼변수도담을수있는데이터의종류나범위에따라여러가지타입이있다. 예를들면, 정수를저장할수있는변수도있고실수나문자를저장할수있는변수도있다. 작은상자에큰물건을넣을수없는것처럼변수도큰값을작은값을저장하는변수에저장할수는없다. [ 그림 2-12] 변수는저장할수있는데이터의종류나범위에따라여러가지종류가있다. 상자와상자를구분하기위해서는각각의상자에이름을붙이는것이편리하듯이각각의변수들도자신만의이름을가지고있다. 우리는이이름을사용하여변수들을구분한다. [ 그림 2-13] 변수들은자신만의이름을가지고있다. 변수선언 C언어에서변수를사용하려면먼저변수를선언하여야한다. 변수선언이란컴파일러에게지금부터이러이러한변수를사용하겠다고미리말을해두는것이다. 또어떤타입의데이터가그변수에저장되는지도컴파일러에게미리알리는것이다. [ 그림 2-14] 변수들은사용하기전에미리선언하여야한다. 선언한다는것은컴파일러에게미리변수들을소개하는것과같다. 변수를선언하는방법은자료형 ( 즉변수가무엇을저장할것인지 ) 과변수의이름 ( 앞으로어떤이름으로불릴지 ) 을적어주는것이다. 그형식은다음과같다.

54 CHAPTER 02 누구나쉽게즐기는 C 언어콘서트 문법 예 자료형변수이름 ; int i; float sum; double x, y; 자료형 (data type) 이란변수가저장할데이터가정수인지실수인지, 아니면또다른어떤데이터인지를지정하는것이다. 자료형에는정수형, 실수형, 문자형이있다. 정수형은 12나 -35 같은정수를나타내는자료형으로정수의범위에따라다시 short, int, long으로나누어진다. 실수형은소수점을가지는실수값을나타내며실수의범위에따라 float와 double로나누어진다. 문자형은하나의문자를나타내는자료형으로 char뿐이다. [ 그림 2-15] 표준자료형의종류 예제프로그램에서는 3 개의정수를저장할수있는변수가필요하다. 이들변수들을 x, y, sum이라는이름으로생성하였다. 이들변수들은모두정수를저장하면되므로정수형으로선언하였다. int x; int y; int sum; // 첫번째정수를저장하는변수 // 두번째정수를저장하는변수 // 두정수의합을저장하는변수 모든변수는함수의처음부분에서선언하여야한다. 변수를선언하는것도하나의문장이므로반드시세미콜론으로끝나야한다. 변수가선언되면메모리의공간이확보되며이공간에이름이매겨지게된다. 아직까지값은저장되지않았다. 즉 [ 그림 2-16] 과같은상태이다. [ 그림 2-16] 변수를선언하면메모리공간에값들을저장할수있는상자가만들어진다고볼수있다.

제 2 장기초사항 55 상수상수 (constant) 란그값이프로그램이실행되는동안변하지않는수또는변경불가능한수를의미한다. 3, 123, 3.141592 등이상수이다. 예제프로그램 add.c에서 100과 200이바로상수이다. 상수가왜필요한지생각하여보자. 연봉을계산하는프로그램을작성한다고해보자. 연봉을계산하려면 1년은 12달로되어있으므로월급에 12를곱하여야한다. 12와같은숫자도프로그램에반드시필요하다. 따라서 12와같은것들이상수가된다. [ 그림 2-17] 변수와상수 상수는변수와반대되는개념이다. 변수는프로그램도중에변경될수있는수이다. 반면상수는처음부터끝까지그값이변하지않는다. 상수는변수들의초기값을설정할때도필요하고각종산술적인연산에서도필요하다. 상수에는정수상수도있고실수상수도있다. 실수상수는일상생활에서사용하는대로3.141592와같이표기하면된다. 이것이외에도문자를나타내는문자상수, 문자열을나타내는문자열상수등이있다. 문자상수는하나의변하지않는문자를나타내는것으로작은따옴표를사용하여 'a' 와같이표기한다. 문자열상수는큰따옴표를사용하여 "Hello World!" 와같이나타낸다. 대입연산 x = 100; y = 200; 변수는값을저장하기위하여선언한다. 그렇다면변수에값을저장하는방법은무엇일까? 위의문장처럼 = 연산자를이용하면된다. = 연산자를대입연산자 ( 또는할당연산자 ) 라고한다. 즉, 변수에값을대입한다는의미이다. = 의좌변에는값을저장할수있는변수가위치하고우변에는저장될값이위치한다.

56 CHAPTER 02 누구나쉽게즐기는 C 언어콘서트 [ 그림 2-18] C에서는 = 연산자가변수에값을저장하는연산자이다. 여기서 = 는수학적인등호가아니라는것에유의해야한다. 따라서다음의문장도가능하다. x = x + 1; 위의문장은변수 x의값에1을더하여다시 x에저장하라는의미이다. 따라서위의문장이실행되면변수 x의값이하나증가하게된다. 산술연산컴퓨터는기본적으로계산을하는기계이다. 따라서프로그램안에서산술연산을할수있다는것은매우당연하다. 산술연산을하려면먼저산술연산을수행하는연산자들을알아야한다. < 표 2-1> 에서산술연산자들을요약하였다. < 표 2-1> 산술연산자의요약 연산 연산자 C 수식 수학에서의기호 덧셈 + x + y x + y 뺄셈 - x - y x - y 곱셈 * x * y xy 나눗셈 / x / y x y 나머지 % x % y x mod y 사칙연산자들은이항연산자라고불리는데, 두개의피연산자를가지고있기때문이다. 여기서주의해야할사항은곱셈의경우반드시 * 기호를사용하여야한다는것이다. 만약수학에서처럼 x와 y를곱하는것을 xy로쓰게되면컴파일러는이것을새로운변수이름 xy로생각할것이기때문이다. 예제프로그램에서의연산을보면다음과같다. sum = x + y;

제 2 장기초사항 57 변수 x에들어있는정수와변수 y에들어있는정수를더해서변수 sum에대입하였다. 여기서 + 가연산자이고피연산자는 x와 y이다. 덧셈의결과는대입연산자인 = 을통하여변수 sum에저장된다. [ 그림 2-19] 산술연산의과정 : 먼저 x와 y에서값을가져와서덧셈연산이수행되고그결과값이 sum에저장된다. 변수값출력 printf() 는문자열을출력할수있을뿐아니라형식을지정하여상수나변수의값을출력하는기능도가지고있다. 만약변수 sum이가지고있는값을 printf() 함수를이용하여출력하려면다음과같이하면된다. 형식 예 printf( 형식제어문자열, 변수 ); printf("%d", sum); 여기서 "%d" 는 %d를출력하라는의미가아니고출력형식을지정한다는의미이다. 즉, 변수 sum의값이 %d의위치에서정수형으로출력이된다는의미이다. 여기서 "%d" 를형식제어문자열이라고하고 %d와같은것을형식지정자라고한다. 기본적인형식지정자는다음과같은것들이있다. 형식지정자의미형태 %d 정수형태로출력 100 < 표 2-2> 형식지정자의종류 %f 실수형태로출력 3.141592 %c 문자형태로출력 A %s 문자열형태로출력 Hello 형식지정자와변수들은 1개이상일수있고중간에문자열이있을수있다. 이경우에는형식지정자와변수들이다음과같이대응된다. 즉, 형식지정자의자리에변수의값이대치되어서출력된다고생각하면된다.

58 CHAPTER 02 누구나쉽게즐기는 C 언어콘서트 [ 그림 2-20] printf() 에서의형식제어문자열 여기서주의할점은형식지정자와변수의타입은반드시일치하여야한다는점이다. 즉, 다음과같이정수형변수를실수형태로출력하라고하면오류가발생한다. [ 그림 2-21] 형식지정자와변수의자료형이다르면오류가발생한다.

제 2 장기초사항 59 2.4 입력과출력이있는프로그램 이번에는고정된정수를더하는것이아니라사용자로부터 2개의정수를받아서더해보자. 먼저, 입력단계에서사용자로부터 2개의정수를받아서변수에저장한다. 다음으로, 처리단계에서 2개의정수를서로합하여변수에저장하고, 출력단계에서변수에저장된합을화면에출력한다. 간단한프로그램이지만순서도를이용하여알고리즘을나타내면 [ 그림 2-22] 와같다. [ 그림 2-22] 예제프로그램에대한순서도 여기서처음으로사용자로부터값을입력받는방법이등장한다. 사용자로부터정수를입력받기위해서는 scanf() 라고하는라이브러리함수가필요하다. add2.c 참고 scanf() 는스캔에프라고읽는다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 // 사용자로부터입력받은 2 개의정수의합을계산하여출력 #include <stdio.h> int main(void) { int x; int y; int sum; printf(" 첫번째숫자를입력하시오 :"); scanf("%d", &x); printf(" 두번째숫자를입력하시오 :"); scanf("%d", &y); 키보드로부터값을입력받는다. // 첫번째정수를저장할변수 // 두번째정수를저장할변수 // 2개의정수의합을저장할변수 // 입력안내메시지출력 // 하나의정수를받아서 x 에저장 // 입력안내메시지출력 // 하나의정수를받아서 x 에저장

60 CHAPTER 02 누구나쉽게즐기는 C 언어콘서트 15 16 17 18 19 } sum = x + y; // 변수 2개를더한다. printf(" 두수의합 : %d", sum); // sum의값을10진수형태로출력 return 0; // 0 을외부로반환 실행결과 첫번째숫자를입력하시오 : 10 두번째숫자를입력하시오 : 20 두수의합 : 30 프로그램설명 1 주석으로프로그램의동작설명 2 입출력라이브러리 printf() 와 scanf() 함수를사용하기위한헤더파일 4 main() 함수정의 5 main() 함수몸체시작 6 사용자가입력하는첫번째숫자를저장할변수선언 7 사용자가입력하는두번째숫자를저장할변수선언 8 두개의숫자의합을저장할변수선언 10 사용자가숫자를입력하도록안내메시지출력 11 사용자로부터숫자를받아서변수에저장 13 사용자가숫자를입력하도록안내메시지출력 14 사용자로부터숫자를받아서변수에저장 15 두개의숫자를더하고그합을 sum에저장 16 두개의숫자의합을출력 18 main() 함수결과값반환 19 main() 함수몸체끝 scanf() scanf() 함수는키보드로부터입력된데이터를지정된형식으로변환하여변수에저장하는라이브러리함수이다. scanf() 함수의사용방법은 printf() 함수와매우유사하다. 일반적인형식은다음과같다. 형식 예 scanf( 형식제어문자열, & 변수 1); scanf("%d", &x); 키보드에서정수를입력받아서변수 x 에저장하는문장은다음과같다.

제 2 장기초사항 61 scanf("%d", &x); 첫번째인수인 "%d" 는형식지정자로써어떤유형의데이터를받을것인지를지정한다. "%d" 는정수형을나타내는데, printf() 에서의형식지정자와그의미가같다. 두번째인수인 &x는입력을받을변수를나타낸다. 변수이름앞에 &( 앰퍼샌드 ) 기호가있다는것에유의하여야한다. 조금어려운이야기지만변수는메모리에저장되고각각의변수는주소를가지고있다. 변수이름앞에 & 를붙이면변수의주소를의미한다. 예를들어, &x라고쓰면이것은변수 x의주소이다. scanf() 는 printf() 와달리변수에값을저장하여야하기때문에변수의주소를받아야한다. 인터넷에서제품을구입하고집으로배달시키려면쇼핑몰에구매자의주소를가르쳐주어야하는것과비슷하다. 다시말해, scanf() 가키보드에서값을받은다음, 이것을변수에저장하려면변수의주소가있어야하는것이다. 현재는 scanf() 를사용하려면변수이름앞에반드시 & 기호를붙여야한다는것으로알아두자. [ 그림 2-23] 데이터를키보드에서받아서변수에저장하기위해서는 scanf() 가변수의주소를알아야한다. scanf() 가호출되면컴퓨터는사용자가숫자입력을마칠때까지기다린다. 사용자가정수를입력하고엔터키를누르면비로소정수가변수에저장되어서 scanf() 호출이끝난다. 위의프로그램에서는두개의정수를사용자로부터받는데거의같은동작을되풀이한다. 다만정수가저장되는변수만달라진다. 일반적으로사용자한테서값을입력받기전에안내메시지를출력하고 scanf() 를이용하여값을읽는다. 이러한방식은컴퓨터와사용자간의상호대화적인동작을수행하도록한다. printf(" 첫번째숫자를입력하시오 :"); scanf("%d", &x);

62 CHAPTER 02 누구나쉽게즐기는 C 언어콘서트 Q printf(), scanf() 는라이브러리함수이다. C 컴파일러는많은라이브러리함수들을제공한다고하였다. 그러면프로그래머는어떤라이브러리함수들이제공되는지알수있을까? A C 에서제공하는라이브러리들은대개표준화되어있다. 따라서이책에서사용하는함수들은어떤 C 컴파일러에서도사용이가능한것들이다. 지원되는라이브러리들 의목록은컴파일러의 HELP 파일에서찾을수있다. 이책에서는부록에수록되어있다. 라이브러리에서제공하는함수들은최대한활용하는편이좋다. scanf() 의형식지정자는대부분이 printf() 와같다. 예를들어서실수를입력받으려면형식지정자로 %f를사용해야한다. float ratio = 0.0; scanf("%f", &ratio); 여기서 ratio 는 float 형의변수로선언되었다. 하지만 double 형을입력받으려면 %lf 를사용해야한다. %lf 만제외하면모든형식지정자는 printf() 와유사하다. double scale = 0.0; scanf("%lf", &scale); 만약한번에여러개의입력값을받으려면다음과같이하면된다. 여기서도 printf() 와마찬가지로형식지정자의타입과변수의타입은일치하여야한다. [ 그림 2-24] scanf() 의동작

제 2 장기초사항 63 여기서형식지정자가 %C인경우를제외하면 scanf() 는모든여백을건너뛴다. 즉, 스페이스나탭, 줄바꿈은무시한다. 참고형식지정자를 %c로하면엔터키도하나의문자로받을수있다. 2.5 오류수정및디버깅 오류의종류프로그램을작성하는과정에는많은오류들이발생할수있다. 오류가없는완벽한프로그램을만드는것은생각보다매우어렵다. 여러분들이구입한휴대폰안에내장된프로그램들이얼마나많은오류를일으켰는지를생각해보자. 오류를발생하는시간에따라서나누어보면다음과같다. 컴파일시간오류 : 대부분문법적인오류 실행시간오류 : 실행되는도중에발생하는오류 논리오류 : 논리적으로잘못되어서결과가의도했던대로나오지않는오류 [ 그림 2-25] 오류의종류 오류를삼각성의정도에따라서나누어보면다음과같다. 에러 (error): 컴파일, 링크가불가능한심각한오류 경고 (warning): 컴파일, 링크가가능하고실행도가능하나잠재적인문제를일으킬수있는경미한오류 경고의경우, 수정하지않아도문제가없는경우가종종있지만가능하면경고메시지도나타나지않도록프로그램을작성하여야한다.

64 CHAPTER 02 누구나쉽게즐기는 C 언어콘서트 예제 error.c 문장의끝에세미콜론이빠져있다. 1 2 3 4 5 6 7 8 /* 에러가발생하는프로그램 */ #include <stdio.h> int main(void) { printf("hello World!\n") return 0; } 가장많이하는실수중의하나인문장의끝에세미콜론을생략한경우를살펴보자. 위의소스를컴파일하면다음과같은에러메시지가표시된다. 실행결과 7 번째라인에서오류 [ 그림 2-26] 에러메시지 1>------ 빌드시작 : 프로젝트 : test, 구성 : Release Win32 ------ 1> 컴파일하고있습니다... 1>error.cpp 1>.\error.cpp(7) : error C2143: 구문오류 : ';' 이 ( 가 ) 'return' 앞에없습니다. 1> 빌드로그가 "file://c:\source\error\error\release\buildlog.htm" 에저장되었습니다. 1>test - 오류 : 1 개, 경고 : 0 개 ========== 빌드 : 성공 0, 실패 1, 최신 0, 생략 0 ========== 일반적으로에러메시지에는다음과같은정보가출력된다. 에러가발견된파일의이름 에러가발견된라인의번호 발견된에러의내용 ( 설명 ) 문장의끝에세미콜론을생략한경우, [ 그림 2-26] 과같은에러메시지가발생한다. 에러메시지를보면 7번째라인의 return 앞에 ; 을빠뜨렸다는것을알수있다. Q 경고메시지를무시하면어떤일이발생하는가? A 경고메시지에따라어떤것은무시해도좋다. 그러나대부분의경우, 잘못된부분이있기때문에발생하는것이므로반드시경고메시지가나오지않도록소스를수정하 는것이중요하다. 비주얼 C++ 에서는경고메시지의수준을설정할수있도록되어있다. 초보자인경우에는경고메시지의수준을낮추어놓는것도좋은방법이다. 수준을낮추어놓으면매우사소한오류도볼수있다.

제 2 장기초사항 65 중간점검 1. 오류를심각성의정도에따라분류하여보자. 2. 작성된프로그램이 C언어의문법을지키지않았으면어떤오류에속하는가? 2.6 응용프로그램 연봉계산 프로그램조금더복잡한문제를다루어보자. 10년동안월급을모두저금할경우, 얼마나모을수있는지를계산하는프로그램을작성해보자. 먼저사용자에게월급의액수를입력받는다. 월급에 12를곱하여연봉을계산하고다시여기에 10을곱하여 10년동안저축할수있는금액을계산한다. deposit.c 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 /* 저축액을계산하는프로그램 */ #include <stdio.h> int main(void) { int salary; int deposit; } // 월급 // 저축액 printf(" 월급을입력하시오 : "); scanf("%d", &salary); deposit = 10 * 12 * salary; printf("10 년동안의저축액 : %d\n", deposit); return 0; 입력단계 처리단계 출력단계 실행결과 월급을입력하시오 : 200 10 년동안의저축액 : 24000

66 CHAPTER 02 누구나쉽게즐기는 C 언어콘서트 프로그램설명 1 주석으로프로그램의동작설명 2 입출력라이브러리 printf() 와 scanf() 함수를사용하기위한헤더파일 4 main() 함수정의 5 main() 함수몸체시작 6 월급을저장할변수선언 7 저축액을저장할변수선언 9 사용자가월급을입력하도록안내메시지출력 10 사용자로부터월급을받아서변수 salary에저장, 여기서정수형식으로입력받는다. 형식지정자 %d는정수형식을나타낸다. scanf() 함수를호출할때는변수의이름앞에 & 를적는것을잊지말자. 12 10년동안의저축액을구한다. C에서곱셈연산자는 * 이다. 10년 *12달* 월급으로계산한다. 14 10년동안의저축액을출력한다. 정수형변수의값을출력하여야하므로형식지정자로 %d가사용되었다. 16 main() 함수결과값반환 17 main() 함수몸체끝 원의면적구하기 프로그램앞에서배운프로그램의구성요소들을이용하여새로운프로그램을작성하여보자. 사용자로부터원의반지름을입력받고, 이원의면적을구한다음, 화면에출력한다. 역시입력단계, 처리단계, 출력단계로구성되어있다. 원의면적을구하려면실수형계산을하여야한다. 따라서실수형변수를선언하여사용하여보자. 본격적인변수와자료형에대한논의는다음장에서하게된다. circle.c 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 /* 원의면적을계산하는프로그램 */ #include <stdio.h> int main(void) { float radius; float area; } // 원의반지름 // 면적 printf(" 반지름을입력하시오 : "); scanf("%f", &radius); area = 3.14 * radius * radius; printf(" 원의면적 : %f\n", area); return 0;

제 2 장기초사항 67 실행결과 반지름을입력하시오 : 5.0 원의면적 : 78.500000 프로그램설명 1 주석으로프로그램의동작설명 2 입출력라이브러리 printf() 와 scanf() 함수를사용하기위한헤더파일 4 main() 함수정의 5 main() 함수몸체시작 6 원의반지름을저장할변수선언 7 원의면적을저장할변수선언 9 사용자가원의반지름을입력하도록안내메시지출력 10 사용자로부터원의반지름을받아서변수 radius에저장, 여기서실수형식으로입력받는것에주의하라. 형식지정자 %f는실수형식을나타낸다. scanf() 함수를호출할때는변수의이름앞에 & 를적는것을잊지말자. 12 원의면적을구한다. C에서곱셈연산자는 * 이다. 3.14는원주율을나타낸다. 원의면적을구하는공식은 rr 2 이지만 C에서는특별히거듭제곱을구하는연산자는없다. 따라서곱셈을두번해주어야한다. 14 원의면적을출력한다. 실수형변수의값을출력하여야하므로형식지정자로 %f가사용되었다. 16 main() 함수결과값반환 17 main() 함수몸체끝

CHAPTER 02 68 누구나쉽게즐기는 C 언어콘서트 Q & A Q 왜 C 언어의주석은중첩하여서쓸수없는가? A C 언어의주석은 PL-1 이라는언어에서그형식을빌려왔기때문이다. 주석이들어있는코드전체를주석처리하고싶으면뒤에서학습하게될 #if 0 와 #endif 라는전처리지시자를사용하여야한다. #if 0 int timer; /* 타이머를나타내는변수 */... #endif Q 주석을많이사용하면프로그램의크기가늘어나는가? A 주석은컴파일단계에서모두제거된다. 따라서주석의양과오브젝트코드의크기와는전혀상관이없다. 주석은실행파일에아무런영향을끼치지않는다. 주 석은순수하게프로그램을읽는사람들을위한것이다. Q 소스코드안의단어사이의공백과문장과문장사이의빈줄은어떤역할을하는가? A 소스코드안의공백이나빈줄은프로그램의실행결과에아무런영향을끼치지않는다. 이것도주석과마찬가지로프로그램을읽기쉽게하기위하여사용된다. Q 프로그램을작성할때한줄에반드시하나의문장만있어야되는가? A 많은개발자들이한줄에보통하나의문장만을두지만꼭그럴필요는없다. 다음과같이한줄에여러개의문장을놓는것도가능하다. int x; int y; int sum; 컴파일러는 ; 만있으면하나의문장으로인식한다. 다만가독성을위해서는한줄에하나의문장만두는것이바람직하다. Q 비주얼 C++ 에서자동으로소스를정리하여주는자동포매팅기능이있는가? A 먼저자동포매팅하고싶은소스영역을마우스로선택하고 Edit Advanced Format Selection(Alt+F8) 을선택하면전문가가포맷하는것처럼소스를자동으로들여쓰기한다.

제 2 장기초사항 69 Q 왜 scanf() 를사용할때는변수이름앞에 & 를붙여야하는가? A 본문에서도설명하였지만 scanf() 함수가변수를받아서변수안에값을저장하기위해서는반드시변수의메모리주소가필요하다. 변수의주소는바로변수 앞에 & 를붙이면된다. 택배를이용하여물건을배달시키기위해서는받는사람의주소가필요한것과마찬가지라고생각하자.

70 CHAPTER 02 누구나쉽게즐기는 C 언어콘서트 Exercise 1. 은프로그램의동작을설명하는글로써프로그램의가독성을높이기위한것이다. 2. 함수의이름을적어서함수안에들어있는문장들을수행시키는것을 (calling) 이라고한다. 3. 은코드의일부분이들어있는텍스트파일로.h의확장자를가진다. 4. 이란데이터의종류 ( 타입 ) 를말한다. 정수형, 실수형, 문자형등이있다. 5. 은 "Hello" 처럼따옴표안에문자들을나열한것이다. 6. 은줄바꿈을나타내는특수문자이다. 7. 은 printf() 에서변수의값을 10진정수형식으로출력할것을지시한다. 8. 문장은함수를종료하고결과값을반환하는문장이다. 9. 함수는키보드에서데이터를받아서지정된형식으로변환시켜주는라이브러리함수이다. 10. 변수에값을넣는연산을 연산이라고한다. 11. 프로그램언어에서특별한의미로사용되는예약된단어들을 라고한다. 12. 다음중 C 프로그램에대하여잘못설명한것을모두고르면? ( ) 1 C 프로그램은적어도하나의함수를가진다. 2 C 프로그램에서반드시있어야하는함수는 main() 이다. 3 적어도하나의변수는반드시선언하여야한다. 4 반드시 stdio.h를포함하여야하는것은아니다. 13. 주석에대하여잘못설명한것은? ( ) 1 주석은어디에나붙일수있다. 2 주석이많아지면실행파일의크기가커진다. 3 주석은 /* 로시작하여 */ 로끝난다. 4 C언어에서도 // 스타일의주석을사용할수있다. 14. 다음중 C에서지원하는자료형의이름이아닌것은? ( ) 1 char 2 long 3 integer 4 float 15. printf() 함수에서정수형변수를출력하는데사용되는형식지정자는? ( ) 1 %i 2 %d 3 %n 4 %f

제 2 장기초사항 71 16. 변수에관한설명으로올바르지않은것을모두고르면? ( ) 1 변수는함수안이면어디서나선언할수있다. 2 변수의이름을지을때키워드와동일하게하면안된다. 3 변수는선언과동시에초기값을줄수도있다. 4 변수는밑줄문자 (_) 로시작할수도있다. 17. 함수에관한설명으로올바르지않은것은? ( ) 1 함수안의문장들은호출 (call) 을해야만이실행된다. 2 C언어의함수중에서가장먼저실행되는함수는 main() 이다. 3 printf() 나 scanf() 도함수이다. 4함수안에다른함수가포함될수있다. 18. 다음코드에주석을붙여라. 아래코드가하는일은무엇인가? #include <stdio.h> int main(void) { int x, y; // // // } scanf("%d %d", &x, &y); printf(" 덧셈 : %d\n", x + y); printf(" 뺄셈 : %d\n", x - y); printf(" 곱셈 : %d\n", x * y); printf(" 나눗셈 : %d\n", x / y); return 0; // // // // // // 19. 다음코드는인치를 mm 로변환하는프로그램이다. 빈칸을채워라. /* 첫번째프로그램의응용 */ #include int main(void) { float inch, mm; printf(" 인치단위로입력 :"); scanf("%f", ); mm = inch * 25.4; printf("%f 인치 = %f mm", inch, mm); return 0; }

72 CHAPTER 02 누구나쉽게즐기는 C 언어콘서트 20. 잠시컴파일러가되었다고가정하자. 다음소스파일이컴파일되어실행되는것인지를말하고, 컴파일이되지않는다면어디가문제인지오른쪽빈칸에적어라. / * 첫번째프로그램 * / #include stdio,h integer main(void) { int x x = 20; print( 현재 x의값은 %d입니다. ); return 0; }

제 2 장기초사항 73 Programming 1. 사용자로부터세개의정수를입력받은후, 평균값을계산하여화면에출력하는프로그램을작성하여보자. 정수를입력하시오 : 10 정수를입력하시오 : 20 정수를입력하시오 : 30 평균은 20 입니다. 먼저문제를해결하는알고리즘을순서도를사용하여작성하여보자. 순차적인처리만을이용하면된다. 빈칸을채워라.

74 CHAPTER 02 누구나쉽게즐기는 C 언어콘서트 다음단계는순서도를프로그램으로변환한것이다. 빈칸을채워라. #include <stdio.h> int main(void) { ; // 정수변수 x, y, z, avg 선언 printf(" 정수를입력하시오 : "); // 사용자에게안내메시지출력 scanf("%d", &x); // 첫번째정수를 x로읽어들인다. ; // 사용자에게안내메시지출력 ; // 두번째정수를 x로읽어들인다. ; // 사용자에게안내메시지출력 ; // 세번째정수를 x로읽어들인다. ; // 평균계산 printf(" 평균은 %d입니다.\n", avg); // 평균출력 return 0; } 입력은 scanf() 함수를사용하고출력은 printf() 함수를사용하면된다. 2. 센티미터를인치로변환하는프로그램을작성하여보자. 프로그램의입력과출력은다음과같다. 센티미터를입력하시오 : 2.54 2.54cm 는 1 인치입니다. 3. 온스로표시된무게를그램으로변경하는프로그램을작성하여보자. 1온스는 28.3그램이다. 온스를입력하시오 : 3.8 3.8 온스는 그램입니다. 4. 달의중력은지구의약 17% 라고한다. 자신의몸무게를입력받아서달에서의몸무게를계산하는프로그램을작성하여보자. 몸무게를입력하시오 : 70 달에서의몸무게는 16kg 입니다.