2주차 강의에서 산술식을 표현하고 평가하는 방법을 살펴보았다. 이제 산술식의 평가 결과 값을 화면에 출력하는 방법에 대해서 알아보고자 한다. 여러분은 printf() 함수를 사용하여 그렇게 할 수 있다. printf() 함수에 관해서는 이미 1주차 강의에서 정수를 출력하기 위한 방법으로 간단히 다루었지만, 여기서는 더 자세히 다룬다. 또한 정수뿐만 아니라, 실수, 문자, 스트링을 출력하는 방법에 대해서도 알아본다.

1. printf()

printf() 함수는 스트링이나 계산된 결과를 화면에 출력하는데 사용된다. 다음은 스트링 상수를 출력하는 printf() 함수의 예이다

 

위에서 상자는 화면을 나타내고, prinf() 함수의 수행 결과가 그 화면에 디스플레이된다고 가정한다.

2주차 강의에서 이미 다루었듯이, 스트링 상수는 큰따옴표로 둘러싸여 표현된다. 위의 printf() 함수는 주어진 스트링 상수를 화면에 그대로 출력한다.

다음은 식의 결과 값을 출력하는 printf() 함수의 예이다.

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

이제 printf()는 두 개의 인자(argument)를 갖는다. 첫 번째 인자는 출력 형태를 제어하는 명세를 포함하기 때문에 제어 스트링(control string)이라 한다. 제어 스트링은 '%d'와 같은 형식 코드를 포함할 수 있다.

printf()는 제어 스트링에 포함된 문자들을 그대로 출력하는데, 형식 코드를 만나면 두 번째 인자의 값으로 대체한다. 그 결과는 출력 스트링이다. 즉, 2+3의 식이 평가되어 그 결과 값 5가 생성되고, 이 값이 제어 스트링의 '%d'를 대체한다. 그 결과 출력 스트링이 생성되고, 이것이 화면에 출력된다.

제어 스트링은 한 개 이상의 형식 코드를 포함할 수 있다. 다음 printf()를 생각해보자.

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

이제는 제어 스트링은 3개의 형식 코드를 포함하고 있고, 제어 스트링 이외에 3개의 인자를 더 갖는다. a, b의 변수는 각각 2와 3의 정수 값을 포함한다고 가정한다.

형식 코드에는 나머지 인자들이 왼쪽에서 오른쪽의 순서로 차례로 대응된다. 마찬가지로, 3개 인자들이 각각 평가되고, 그 결과 값들이 대응되는 형식 코드를 대체하여 출력 스트링을 생성한다.


위에서 살펴본 printf()에서 형식 코드는 '%d'로 구성되었다. 형식 코드는 %로 시작되고, d와 같은 문자로 끝난다. 이러한 문자를 변환 문자(conversion character)라 한다. 가령, d는 정수를 십진수 정수 값으로 변환하여 출력하는데 사용된다.

정수는 컴퓨터 내부에서 2진수로 표현되어 있음을 유의하라.

printf()는 정수뿐만 아니라 2주차 강의에서 다룬 실수, 문자, 스트링의 값도 출력할 수 있다. 이를 위해서 다양한 변환 문자가 제공된다. 다음은 printf()에서 사용 가능한 변환 문자를 보여준다.

 

변환 문자

        값의 출력형태

 

c
d
e
f

        문자로서
        십진수 정수로서
        지수 표기 형태의 실수로서
        실수로서

다음은 다양한 변환 문자를 포함하는 printf() 함수의 예이다.

 


첫 번째 printf()는 첫 번째 인자인 제어 스트링에서 두 개의 형식 코드를 포함한다. 각 형식 코드는 변환 문자로서 c를 포함하기 때문에, 나머지 두 개의 인자가 문자 값일 것을 예상한다. 여기서 두 개의 인자는 문자 값 'a'와 'b'이다.

두 번째와 세 번째 printf()는 동일한 실수 값을 출력하는데, 제어 스트링에 포함된 변환 문자에서 보듯이 값의 출력 형태가 다르다. 세 번째(변환 문자 e 포함)는 두 번째(변환 문자 f 포함)와는 다르게 실수를 지수 표기 형태로 출력하는 것을 알 수 있다.

네 번째 printf()는 제어 스트링에 변환 문자 s를 포함하고 있으며, 그 대응 인자는 스트링 "abc"이다. 따라서 해당 스트링이 출력된다.

다음 print()를 다시 한번 생각해보자.

 


출력에서 보듯이, 실수의 출력 형태는 소수점 이하 부분이 6자리임을 알 수 있다. 소수점 이하의 자리수를 다음과 같이 3자리로 줄여서 표현할 수 있는 방법이 없을까?

 


여러분은 printf()의 제어 스트링의 형식 코드에 다음과 같이 필드 폭과 정밀도를 추가로 지정함으로써 위의 목적을 달성할 수 있다.

 

필드 폭은 출력될 실수의 전체 숫자 개수를 나타내며, 정밀도는 소수점 이하 자리수를 나타낸다. 314.159의 전체 숫(필드폭) 6개이고, 소수점 이하 자리(정밀도)는 3개이다.

만약, 실수의 출력형태가 3.14159일 경우에, 출력될 숫자가 전체 6개이고, 소수점 이하 자리수가 5이므로, 다음과 같이 작성되어야 한다.

 


필드 폭과 정밀도를 다른 변환 문자에도 적용하여 값이 출력되는 전체 폭과 그 폭 내부에서 값의 정렬(왼쪽-정렬 혹은 오른쪽-정렬)을 명세함으로써 출력 형태를 조정할 수 있다. 이에 관해서는 다음에 다루기로 한다.

다음 printf()를 생각해보자.

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

실수를 십진수 정수로 변환하여 출력할 것을 요청하고 있다. 무엇이 실제로 출력될 것인가? 실수를 정수로 변환하여 출력한다고 생각하면 314가 출력될까?

그렇지 않다. 컴퓨터에서 정수와 실수는 그 내부 표현 방식이 다르다. C에서 printf()는 변환 문자 d를 보고서 그 대응 인자 314.159의 데이터 타입을 고려하지 않고, 그 표현을 정수로 판단하여 십진수로 변환하여 출력한다. 따라서 전혀 엉뚱한 값이 출력된다.

printf() 함수 작성시에 출력하고자 하는 값의 타입과 일치하는 변환 문자를 제어 스트링에 포함시키도록 하라.

다음 실습창을 통해서 printf() 함수에 관하여 실습한다.

[프로그램 단위 입력 실행] 다음 실습창을 통해서 printf() 함수의 실행과정을 알아본다

 


2. 탈출 문자열 

여러분은 printf()에서 특수 문자 \n의 용도를 1주차 강의에서 이미 살펴보았다. \n은 다음번째 출력 위치를 다음 줄의 첫 번째 열로 이동하라는 특수한 의미를 갖는다.

여기서 '\'을 백슬러쉬(backslash)라 부르고, 이를 또한 탈출 문자(escape character)라 부른다. 이것은 '\' 다음에 오는 문자에 대한 정상적인 해석을 벗어나게 하여 특수한 의미를 부여하기 때문이다. '\'와 문자로 구성된 문자열을 탈출 문자열(escape sequence)라 한다.

다음 테이블은 C에서 제공하는 탈출 문자열을 몇 가지 보여준다.

 
탈출 문자열
의미
 

          \b

          출력 위치를 뒤로 한 칸 이동한다.
 

          \f

          출력 위치를 다음 페이지로 이동한다.
 

          \n

          출력 위치를 다음 줄로 이동한다.
 

          \r

          캐리지 리턴을 나타낸다.
 

          \t

          출력 위치를 다음 탭 위치로 이동한다.
 

          \\

          출력 스트링에 '\'를 포함시킨다.
 

          \'

          출력 스트링에 '를 포함시킨다.
 

          \"

          출력 스트링에 "를 포함시킨다.

탈출 문자열을 사용하여 프로그램 실행 결과를 원하는 형태로 출력할 수 있다.

다음은 탈출 문자열 포함한 printf()의 예이다.

 

첫 번째와 두 번째 printf()는 탭을 사용한 형식적인 출력을 보여준다. 세 번째와 네 번째 printf()는 출력 스트링에 작은따옴표(')와 큰따옴표(")를 포함하는 방법을 보여준다.

작은따옴표와 큰따옴표는 각각 문자 상수와 스트링 상수를 표현하는데 사용되기 때문에, 이를 스트링에 포함시키려면 탈출 문자열로 표현되어야 한다.

[프로그램 단위 입력 실행] 다음 실습창을 통해서 탈출 문자열의 실행과정을 알아본다

 



3. 프로그램 예제 

여러분은 2주차 강의에서 C에서 제공하는 데이터 타입, 특정 타입의 값이 저장될 변수를 선언하는 변수 선언문, 값을 변수에 할당하는 배정문, 그리고 계산을 표현하는 산술식에 대해서 다루었고, 앞에서 컴퓨터의 처리 결과를 적절한 형태로 출력할 수 있는 printf() 함수를 다루었다.
여기서는 이러한 C 언어의 기초 지식을 사용하여 해결할 수 있는 간단한 문제를 프로그램으로 작성하는 방법에 대해서 살펴본다.

주어진 문제에 대한 프로그램 작성은 1주차 강의(문제 해결 및 프로그램 작성)에서 다루었듯이 다음과 같은 5단계의 문제 해결 방법에 따라서 이루어진다.

 

             1. 문제의 요구사항을 정확히 명세한다.
          2. 문제를 분석한다.
          3. 문제를 해결하기 위한 알고리즘을 설계한다.
          4. 알고리즘을 구현한다.
          5. 완성된 프로그램을 테스트하고 검증한다.

 

 

      문제명세    
 

이 단계에서는 문제를 애매모호함 없이 완벽하게 기술한다. 여기서 다루는 문제가 간단하므로 앞으로 이 단계는 생략하고, 필요가 있을 경우에만 기술한다.

 
     

      분석    
 

이 단계에서는 문제의 입력과 출력을 식별하고, 사용되는 변수들을 정의한다. 그리고 변수들간의 관계 식을 기술한다.
 

   분석 사항

                            내용
     문제 입력           화씨 단위의 온도 값(float fahrenheit)
     문제출력           섭씨 단위로 변환된 값(float celsius)
     관계식           celsius = 5 / 9 * (fahrenheit - 32)

입력 변수와 출력 변수는 각각 celsius와 fahrenheit로 정의하였고, 이들은 모두 float 타입이다. 왜냐하면, 실세계에서 온도 값이 실수이기 때문이다.

 
     

      설계    
 

문제 해결 과정을 알고리즘으로 기술한다. 알고리즘을 작성할 때는 먼저, 문제의 입력 부분과 출력 부분을 기술하고, 다음에 입력으로부터 출력을 생성하는 과정으로서 처리 과정을 명세한다. 즉, 처리 과정은 입력 데이터를 사용하여 명세된 처리를 수행하고, 그 결과로서 출력을 생성한다.

데이터 입력 부분에서는 사용되는 변수를 선언하고, 변수의 값을 초기화하는 작업이 이루어진다. 변수 초기화는 배정문을 통해서 이루어지거나, 사용자로부터 값을 입력받아서 이루어질 수 있다. 여기서는 당분간 배정문을 통해서 변수를 초기화한다. 다음 장에서는 사용자로부터 값을 입력받아 변수를 초기화하는 방법에 대해서 알아본다.

위에서 설명한 알고리즘 작성 방법에 따라서 주어진 문제에 대한 알고리즘을 다음과 같이 작성한다.



먼저, 데이터 입력 부분을 작성하고, 다음에 결과 출력 부분을 작성한다. 이 두 단계에 대한 기술은 문제 분석을 토대로 쉽게 작성할 수 있다.

다음에 처리 과정 명세 부분을 어떻게 채울까 생각한다. 생각의 방향은 입력으로부터 어떻게 출력을 생성하는 가이다. 이 과정 역시 문제 분석 단계에서 어느 정도 고려되었다. 위 문제의 경우 변수들간의 관계로부터 단순히 처리 과정을 유도할 수 있다.

완성된 알고리즘은 다음과 같다.

 

     알고리즘 3-1
          1. 변수 선언하고, fahrenheit에 초기값을 설정한다.
          2. celsius = 5/9(fahrenheit-32)(화씨 온도를 섭씨 단위로 변환)
          3. celsius를 출력한다.


1주차 강의에서 다루었듯이, 알고리즘은 다음과 같이 순서도의 그래픽 형태로 표현할 수 있다.

 

 

 
     


      구현    
 

알고리즘 3-1을 C 프로그램으로 작성한다. 먼저, 프로그램이 표준 출력을 포함하고 있으므로, 다음의 프로그램 틀을 생각한다.
 

다음은 알고리즘 3-1의 각 단계를 C 언어로 번역하여 위 프로그램 틀의 본체 상자를 채운다. 그 결과는 문제에 대해서 작성한 C 프로그램이다.


 

 
     

다음은 Visual Studio에 포함된 Visual C++를 사용하여 다시 한번 프로젝트를 생성하고, 파일을 생성하는 과정을 보여준다. 다음에 위의 프로그램 3-1을 작성하고, 컴파일링하고, 링킹하고, 실행시키는 과정을 윈도 캡을 사용하여 단계별로 순차적으로 보여준다.

top으로... 다음페이지로.. home으로..

[프로그램 단위 입력 실행] 다음 실습창을 통해서 프로그램 3-1의 실행과정을 알아본다


  위에서 작성한 프로그램에 대해서 몇 가지 사항을 살펴보자.

   프로그램 3-1은 변수를 선언하고, fahrenheit에 값을 할당하는 과정을 두 개의 C 문장으로 표현하였다.
       그러나 다음과 같이 한 개의 문장으로 표현 가능하다.

 

       float celsius, fahrenheit = 66.2;     

     즉, 변수에 대한 초기 값 할당은 그 변수 선언시에 함께 이루어질 수 있다.

  여섯 번째 줄에 표현된 식에서 괄호는 반드시 필요하다. 왜냐하면, 뺄셈보다 곱셈에 대한 연산자 우선순위가
       높기 때문이다.

  또한, 산술 식을 다음과 같이 표현하는 그 결과는 동일한가?

 

       celsius = 5/9*(fahrenheit - 32);    

     그렇지 않다. 2주차 강의에서 이미 살펴보았듯이, / 연산자두 개의 피연산자가 정수이면 정수 나눗셈이
    수행되어 그 결과는 나눗셈의 몫뿐
이다. 따라서 5/9는 0이고, celsius에는 fahrenheit의 값에 관계없이 항상
     0의 값이 할당될 것이다.

     위의 식에서 / 연산자를 정수가 아닌 실수 나눗셈을 수행하기 위해서는 적어도 한 개의 피연산자는 실수일 필요가
     있고, 따라서 프로그램 3-1에서는 첫 번째 피연산자 5를 실수 5.0으로 표현하였다.

  네 번째 문장에서 printf() 문을 다음과 같이 작성할 수 있을 것이다.

 

       printf("%3.1fFahrenheit -> %3.1fCelsius\n", fahrenheit, celsius);  

    이 printf() 함수의 수행 결과는 다음과 같다.


[프로그램 단위 입력 실행] 다음 실습창을 통해서 프로그램 3-1에서 논의한 사항을 실습한다.

 

 



      분석    
 

문제를 해결하기 위해서, 미터와 피트 단위간의 관계를 알아야 한다. 여러분이 단위간의 변환을 보여주는 테이블을 살펴보면, 다음 사항을 알 수 있다.

 

        1 미터 = 39.37인치
        1 피트 = 12인치

따라서 미터 단위 값을 피트 단위로 변환하기 위해서는 먼저 인치 단위로 변환시키고, 이것을 다시 피트 단위로 변환시켜야 한다는 것을 알 수 있다.

 

   분석 사항

                            내용
     문제 입력           미터 단위의 철사 길이(double meter)
     문제출력           피트 단위로 변환된 철사 길이(double feet)
     추가변수           인치 단위 값을 저장하는 변수(double inch)
     관계식

          1 미터 = 39.37 인치         1 피트 = 12 인치

입력 변수와 출력 변수는 각각 celsius와 fahrenheit로 정의하였고, 이들은 모두 float 타입이다. 왜냐하면, 실세계에서 온도 값이 실수이기 때문이다.

 
     

      설계    
 

문제 해결 과정을 다음 알고리즘으로 기술한다.


 

     알고리즘 3-2
          1. 변수 선언하고, meter에 초기값을 설정
          2. meter의 값을 피트 단위 값으로 변환한다.
          3. 변환된 피트 단위 값을 출력한다.

위의 알고리즘에 단계 2에서 미터 단위 값을 피트 단위 값으로의 변환 과정은 다음 2 단계로 이루어진다.

 

        2.1 미터 단위 값을 인치 단위 값으로 변환한다.
        2.2 인치 단위 값을 피트 단위 값으로 변환한다.


결과적으로, 알고리즘 3-2는 다음과 같이 세분화된다.


 

     알고리즘 3-2-1
          1. 변수를 선언하고, meter에 초기값을 설정
          2. 미터 단위 값을 피트 단위 값으로 변환한다.
               2.1 미터 단위 값을 인치 단위 값으로 변환한다.
               2.2 인치 단위 값을 피트 단위 값으로 변환한다.

          3. 변환된 피트 단위 값을 출력한다.

알고리즘을 처음부터 상세히 기술하는 것은 쉽지 않다. 따라서 문제를 해결하는 과정을 단계적으로 기술하고, 단계가 C의 한 문장으로 번역(사상)되기에 어려울 정도로 복잡하면, 그 단계를 또다시 세분화시킨다. 이와 같이 알고리즘의 세분화 과정을 거치면서 알고리즘을 단계별로 상세히 기술해 가는 것이 중요하다.

 
     

      구현    
 


알고리즘 3-2-1을 보고서 프로그램 3-2로 작성한다.


 
     

 

[프로그램 단위 입력 실행] 다음 실습창을 통해서 프로그램 3-2의 실행과정을 알아본다.

top으로... 다음페이지로.. home으로..

 

top으로... 다음페이지로.. home으로..