앞서 살펴본 프로그램 예제들은 변수 선언시나 배정문을 통해서 변수에 특정 초기값을 설정하였다. 그러나 변수에 대한 초기 값을 사용자가 프로그램 실행시에 제공할 수 있다. C 언어는 이를 위해서 scanf() 함수를 제공한다.


1. scanf()

scanf() 함수는 printf()와 마찬가지로 미리 정의되어 있으며, 이에 관한 정보는 stdio.h의 헤더 파일에 포함되어 있다. 따라서 scanf()를 사용하려면 표준 입출력 라이브러리의 헤더 파일을 반드시 포함시켜야 한다.

scanf() 함수의 형태는 printf() 함수의 형태와 유사하다. 다음은 scanf() 함수의 예이다.

 

 

scanf("%d", &n);

scanf() 함수에서 첫 번째 인자는 제어 스트링이다. 제어 스트링은 printf()와 마찬가지로 형식 코드를 포함한다. 위에서 형식 코드 %d는 다음번째 인자 &n에 대응된다.

형식 코드의 역할은 사용자 입력한 값을 해석하는 방식을 알려준다. 위의 scanf() 함수는 사용자가 입력한 값을 십진수 정수로 해석하여, 그 결과를 n의 변수에 저장한다.

&n에서 & 주소 연산자로서 변수 n에 대해서 할당되어 있는 기억공간의 주소를 반환하는 주소 연산자(address operator)이다. 주소 연산자는 포인터를 다루는 11주차 강의에서 자세히 다룬다.

여러분이 키보드를 통해서 프로그램에 값을 입력할 때, 입력된 값은 문자들의 시퀀스(sequence)이고, 이것이 프로그램에 전달된다. 이러한 문자 시퀀스를입력 스트림(input stream)이라 한다.

가령, 사용자가 키보드 상에서 1, 2, 3의 키를 순차적으로 눌렀을 때, 입력 스트림은 ('3', '2', '1')로 구성된다. 즉, 가장 먼저 누른 키 값이 입력 스트림의 가장 오른쪽에 위치하고, 다음에 누른 키 값이 입력 스트림의 오른쪽부터 왼쪽 방향으로 순서대로 위치하는 것을 알 수 있다.


scanf() 함수는 입력 스트림을 해당 형식 코드에 따라서 적절히 해석하고, 해석된 결과를 명세된 변수에 저장한다.

다음은 scanf()를 사용한 간단한 프로그램이다. 사용자로부터 값을 입력받아 그대로 화면에 출력한다.

       
 

    #include<stdio.h>
     main()
       {
             int n;
             printf("Input an integer: \n");
             scanf("%d", &n);
             printf("You entered %d\n", n);
       }

 
            
     

위 프로그램의 실행 과정을 단계별로 살펴보자.

 

        프로그램은 첫 번째 printf()를 수행하여 화면에 "Input an integer: "의 프롬프트(prompt)를
           디스플레이하여 사용자가 한 개의 정수를 입력하도록 요청한다. 그리고 프로그램은 사용자가
           키보드로부터 값을 입력할 때까지 실행 대기한다.

        사용자가 정수 12를 입력하면, 대기중인 프로그램은 입력된 값을 정수 12로 해석하여
           변수 n에 저장한다.

        프로그램은 계속해서 두 번째 printf()를 수행하여 화면에 "You entered 12"를 디스플레이한다.


 


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

 

한 개의 scanf() 문으로 두 개 이상의 값을 입력받을 수 있다. 다음 프로그램은 두 개의 정수를 입력받아서 그 곱을 출력하는 프로그램이다.

       
 

    #include<stdio.h>
     main()
       {
             int n, m;
             printf("Input two integers: \n");
             scanf("%d%d", &n, &m);
             printf("%d*%d = %d\n", n, m, n*m);
       }

 
            
     

 

이제 사용자는 두 개의 값을 공백으로 구분하여 연속으로 입력하면 된다. 그러면 처음 입력된 값은 n에 저장되고, 두 번째 입력된 값은 m에 저장된다.

다음은 위 프로그램의 scanf() 문의 수행 과정을 보여준다.



다음은 프로그램 3-5의 수행과정을 보여준다.



scanf()는 %d 뿐만 아니라 입력 스트림을 다른 방식으로 해석할 수 있는 형식 코드를 다양하게 제공하고 있다. 다음은 그 중에서 빈번하게 사용되는 몇 가지를 보여준다.

 

변환 문자

        입력스트링 해석 방식

 

c
d
f
lf 또는 LF

        문자로
        십진수 정수로
        실수로(float)
        실수로(double)

다음은 다양한 형식코드를 포함한 scanf()의 예이다.

 

 

char c;
int n;
float f;
double d;
.....
scanf("%c%d%f%lf", &c, &n, &f, &d);

위의 scanf() 수행시 사용자가 4개의 값을 공백으로 구분하여 입력하면, 입력 순서대로 값이 char, int, float, double 타입으로 해석되어 c, n, f, d이 변수에 저장된다.



위에서 사용자는 정수 35를 입력하였지만, 프로그램은 scanf()의 제어 스트링의 대응 형식 코드 %f를 보고서 float 실수로 해석한다는 것을 알 수 있다.

따라서 한 개의 scanf()가 여러 개의 값을 입력받을 경우에, 값의 입력 순서와 제어 스트링에 나열된 형식 코드의 순서가 일치하도록 주의해야 한다.

[프로그램 단위 입력 실행] 다음 실습창을 통해서 여러개의 값을 입력받는 scanf() 함수의 실행과정을 알아본다


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


2. 프로그램 예제

여기서는 scanf() 함수를 사용하여 프로그램에서 사용자가 키보드로부터 입력한 값을 토대로 처리를 수행하는 프로그램을 작성한다.


      분석    
 


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

 

   분석 사항

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

예제 프로그램 3-1과 비교해 볼 때, 문제 입력에서 값을 사용자로부터 입력받는다는 사실이 추가되었음을 알 수 있다.

 
     


      설계    
 

이제 알고리즘 3-1은 다음과 같이 수정된다.

 

     알고리즘 3-4
          1. 변수 선언하고, 화씨 온도값을 사용자로부터 읽어들인다.
          2. 화씨 온도값을 섭씨 온도로 변환시킨다.
          3. 변환된 섭씨 온도를 출력한다.

단계 1에서 화씨 온도 값이 사용자로부터 읽어들이도록 수정되었음을 알 수 있다.

 
     


      구현    
 

알고리즘 3-4의 각 단계를 C 언어로 번역하여 프로그램을 작성한다.

 
     

 

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

 

 

      분석    
 
 

   분석 사항

                    내용
     문제 입력

          한달동안 일한 시간 (int hours)
          시간수당 (float rate)
           (hours와 rate를 사용자로부터 입력)

     문제출력

          총액 (float gross)
          지급액 (float net)

     관계식

          gross = hours * rate
          net = gross - gross*0.2


 
     


      설계    
 
 

     알고리즘 3-5
          1. 변수 선언하고, 일한 시간과 수당을 사용자로부터 입력받는다.
          2. 총액과 지급액을 계산한다.
          3. 총액과 지급액을 출력한다.

위 알고리즘의 2단계를 총액 계산과 지급액 계산으로 구분하여 알고리즘 3-5-1로 세분화시킨다.

 

     알고리즘 3-5-1
          1. 변수 선언하고, 일한 시간과 수당을 사용자로부터 입력받는다.
          2. 총액과 지급액을 계산한다.
                  
  2-1. 총액을 계산한다.
                    2-2. 지급액을 계산한다.
          3. 총액과 지급액을 출력한다.

 
     


      구현    
 


 
     

 

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

 

지금까지 프로그램 예제를 여러 개 살펴보았다. 본 강좌에서는 주어진 문제에 대한 프로그램을 문제 분석, 설계, 구현의 과정을 거쳐서 작성하였다. 여러분은 가능한 이러한 과정을 거쳐서 프로그램을 작성하는 것이 매우 중요하다.

지금은 문제가 비교적 간단하여 분석, 설계 과정을 거치지 않고 직접 구현 단계로 들어가서 프로그램을 작성할 수도 있겠지만(이 경우 분석, 설계 과정이 머리 속에서 이루어질 것이다), 문제가 복잡해지면 이러한 체계적인 문제 해결과정을 거치지 않으면 프로그램을 작성하는 것이 매우 어려워진다.

문제 해결과정에서 가장 중요한 것은 알고리즘을 설계하는 것이다. 여러분도 어느 정도 느끼겠지만, 알고리즘이 설계되면, C 프로그램 작성은 단순히 알고리즘의 각 단계를 C 언어 문장으로 번역하는 정도의 수준으로 이루어진다.

알고리즘을 잘 설계할 수 있는 방법은 없는가? 그것은 문제를 잘 분석하는 것이다. 문제 분석을 토대로, 문제의 입력과 출력을 생각하고, 입력으로부터 출력을 계산하는 과정을 단계적으로 기술하면 된다. 이러한 일련의 과정을 다양한 문제에 대해서 반복적으로 숙달함으로써 여러분은 어렵지 않게 알고리즘을 기술할 수 있는 방법을 터득할 수 있다고 본다.




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

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

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

 

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