컴퓨터 프로그래밍 스터디 2조 제 2주차 과제

 

숫자와 문자를 차례로 입력할 경우 발생하는 문제 해결해보기 :

숫자와 문자를 차례로 입력받는 프로그램의 코드이다.

#include <stdio.h>

int main(void){

    int in1; char in2;

    printf("Input Integer : "); scanf("%d",&in1);

    printf( "Input Charcter : "); scanf("%c",&in2);

    

}

 

코드를 그대로 실행해 본다면 정수형을 입력후 엔터키를 입력 받지 않는 현상을 목격할 수 있다. 왜 이런 일이 발생하는가?

 

사용자가 96을 입력했다 가정해보자.

96 '┙'

사용자는 96을 입력후 줄바꿈 문자(Enter Key)를 치게된다.

이 과정에서 scanf() 함수는 이 줄바꿈 문자를 문자로 인식한다. 이로 인해 한 문자열로 받을 때 줄바꿈 문자로 입력 받고 끝난다. 이를 방지하기 위해선

 

#include <stdio.h>

int main(void){

    int in1; char in2;

    printf("Input Integer : "); scanf("%d" ,&in1);

    fflush(stdin);

    printf("Input Charcter : "); scanf("%c" ,&in2);

}

 

#include <stdio.h>

int main( void){

    int in1; char in2;

    printf("Input Integer : "); scanf("%d",&in1);

    scanf("%*c");

    printf("Input Charcter : "); scanf("%c",&in2);

}

 

위의 코드에 강조되어 있는 scanf("%*c"); 혹은 fflush(stdin);을 사용하여 주면 위와 같은 문제를 예방할 수 있다.

 

 

 

 

문자열 변수에 대해 알아보기 :

영문 한 글자의 문자를 표현하기 위해선

char in2;

형식으로 변수를 선언하지만 만약 영문 두 글자 이상, 한글 한 글자 이상, 특수문자 한 글자 이상을 입력하기 위해선 위의 형태로 변수 선언을 하면 입력 받지 못한다. 따라서 아래와 같은 형태로 변수 선언을 해준다.

char in2[10];

위의 선언의 뜻은 in2란 이름으로 10개의 메모리 공간을 예약한다는 의미이다. 이렇게 하면 모든 글자 10byte를 입력 받을 수 있다. 휴대전화로 문자를 보내보면 알 수 있듯이 한글은 글자에 2byte를 소모한다. 한글을 10글자 쓰기 위해선 [20]이라 선언해야 한다.

한글 5글자 혹은 영문 10글자를 입출력 예제는 아래와 같다.

#include <stdio.h>

int main(void){

    char in2[10];

    printf("Input Charcter : "); scanf("%s",&in2);

    printf("Your Input Data Is %s",in2);

}

여기서 문자열을 입출력 받는 출력인자는 %s임을 알 수 있으며 입력과 출력 시 여태까지 했던 숫자형태의 출력과 별반 차이가 없음을 알 수 있다.

 

배열에 대해 알아보기 :

위의 char in2[10]; 의 형태는 사실 변수를 배열 형태로 선언한 것이다. 10개의 공간에 각각의 명칭을 표기하는 대신 하나의 명칭으로 통일한 것이라 볼 있다. 그러나 그 통일된 뒤에도 자신의 다른 이름이 붙는다. 예를 들어 우린 김철수, 김영희, 김진수란 사람들을 김씨라 통일해 부를 수 있지만 각각은 철수, 영희, 진수란 이름을 갖는다. 변수의 배열 또한 마찬가지이다.

#include <stdio.h>

int main(void){

    int in1[1];

    printf("Input Integer : ");scanf("%d",in1);

}

위와 같이 소스코드를 작성하면 오류가 났다고 할 것이다. in1을 부르긴 했지만 정확히 누구인지 부르지 않았기 때문이다. 위와 같이 하면 문제가 해결된다.

#include <stdio.h>

int main(void){

    int in1[1];

    printf("Input Integer : ");scanf("%d",in1[0]);

}

여기서 유의할 점은 in1[0]으로 입력받은 것이다. in1[1]로써 in1이란 성을 갖는 사람 1명을 만들었지만 C언어에선 첫번째 사람이 아닌 0번째 사람부터 시작한다.

 

 

 

 

2주차 문제:

  1. 성적을 입력 받아 총점과 평균 값을 구하는 프로그램을 구현하십시오.
    문제 조건:
    1. 배열을 사용해야 합니다.
    2. 성적은 최대 열 개까지 입력 수 있으며 음수의 값이 나오면 성적입력을 중단합니다.
    3. while 구문을 사용하십시오.
  2. 1번 문제에 등급을 표시하십시오.
    문제조건:
    1. 등급은 1-5등급으로 나뉩니다.
    2. 90점 이상 1등급 80점 이상 2등급 70점 이상 3등급 60점 이상 4등급 이외 5등급
    3. switch() 구문을 사용하십시오.
    4. 이 나머지 조건은 1번 문제와 같습니다.
  3. 수업시간에 사용하는 책에 있는 5-17번 문제를 다시 푸십시오.
    문제조건:
    1. 입력은 문자열로 받습니다.
    2. 아스키 코드를 이용합니다.
    3. 반복문을 사용합니다.
  4. 자동차세를 구하는 프로그램을 작성하십시오.
    문제조건:
    1. 5000만원 이상의 경우 20%, 3000만원 이상의 경우 15%, 1000만원 이상의 경우 10% 나머지는 5%의 세금을 부과합니다.
    2. 자동차 가격을 입력한 후, 자동차 이름을 입력 받고 자동차 이름은 국문 기준 10글자를 넘지 않습니다.(순서를 지키셔야 합니다. 자동차 가격 입력 후 자동차 이름 입력)
    3. 입출력 예는 다음과 같습니다.
    자동차 가격을 입력 하십시오 : <1000000>
    자동차 이름을 입력 하십시오 : <소나타>
    귀하의 자동차 '소나타'는 50000원의 세금이 부과됩니다.

    *.<>부분은 사용자가 입력하는 부분입니다.

줄 바꿈 문자(Enter Key) 입력 시 '줄 바꿈 문자(Enter Key)가 입력되었습니다.'라고 출력하는 프로그램을 작성하십시오.
문제조건:
1. scanf()이외 기타 함수를 쓰셔도 상관 없습니다.

  1. 2009/05/06 23:09 답글수정삭제

    비밀댓글 입니다

  2. 손님입니다. 2009/05/07 00:02 답글수정삭제

    티스토리 초대장을 꼭 받고 싶습니다.
    몇일째 한장을 못구했네요...
    부탁 한번 드려도 될까요....
    제가 IT 쪽 일을 하는데....자료를 좀 정리 해볼려고 하는데.....
    참 힘드네요..ㅎㅎ;
    혹시 남으 신다면
    coolgirlss@naver.com
    이쪽으로 좀 보내 주시면 감사 하겠습니다.

트랙백 주소 :: http://juneyin.info/218/trackback/
옵션
댓글 달기