More actions
No edit summary |
No edit summary |
||
| Line 150: | Line 150: | ||
== 선택과제 : 별찍기 Lv.3 == | == 선택과제 : 별찍기 Lv.3 == | ||
짜잔! | 짜잔! | ||
[[File:star_lv.3.png| | [[File:star_lv.3.png|570]] | ||
한 번 해보면 생각보다 어렵지 않다는 걸 느낄거예요. | 한 번 해보면 생각보다 어렵지 않다는 걸 느낄거예요. | ||
== 현지 == | == 현지 == | ||
Revision as of 13:46, 30 March 2017
수업 내용
과제 리뷰를 하며 아스키코드와 버퍼를 설명했습니다. 그러고나서 이론을 가르쳤습니다.
아스키 코드
0과 1로 동작하는 컴퓨터에게 모든 것은
{color:red}숫자
로 통합니다. 문자도 숫자, 소리도 숫자, 그림도 숫자로 취급해서 다루죠.
그런데 우리는 이미 printf와 scanf를 통해서 문자를 입력받고 출력받고 있습니다. 숫자만을 알고 있는 컴퓨터가 어떻게 문자를 다룰 수 있는 걸까요? 답은 간단합니다. 문자 하나마다 숫자를 하나씩 매칭하는거죠. 숫자 97은 문자 a이다, 라고 약속을 하는 겁니다. 그런 약속이 모여서 아스키 테이블이 만들어졌습니다.
printf("%c", 숫자)에서 '숫자' 자리에 위 테이블에 있는 숫자를 하나씩 넣어보세요. 그 숫자에 해당되는 문자가 출력될 것입니다.
아스키 코드의 숫자는 0부터 127까지입니다. 그래서 우리가 문자를 출력할 때, 0~127을 벗어나는 수를 넣게 되면 문제가 생기게 되지요(물론 저 범위에서 확장된 확장형 아스키 코드가 있긴 하지만, 그건 지금 얘기하지는 않겠습니다).
문자열 입출력
char name[100];
scanf("%s", name);
string을 입력받을 때는 변수 앞에 '&'가 붙지 않습니다. 지금은 요정도만 알아두세요.
문자 입력받기는 까다롭다! 버퍼 알아보기
과제 코드의 일부를 가져와봤습니다.
printf("첫 번째 문자 입력하세요 : ");
scanf("%c", &ch1);
printf("두 번째 문자 입력하세요 : ");
scanf("%c", &ch2);
printf("세 번째 문자 입력하세요 : ");
scanf("%c", &ch3);
문자 세 개를 입력받아 ch1, ch2, ch3 변수에 넣고 있습니다. 하지만 이대로는 문자 세 개가 정상적으로 입력되지 않습니다. 바로 버퍼 때문인데요, scanf는 입력을 버퍼에 저장합니다. 그래서 사용자가 이렇게 입력을 하면,
첫 번째 문자 입력하세요 : a 두 번째 문자 입력하세요 : b 세 번째 문자 입력하세요 : c
버퍼는 요런 상태가 되지요.
a, b, c가 나란히 들어가 있는 것이 아니라 사이사이에 엔터(\n)가 들어간 것을 볼 수 있습니다.
a를 입력하고 누른 엔터, b를 입력하고 누른 엔터가 다 들어간 것이지요.
그래서 변수 ch2에는 b가 아니라 "a를 입력하고 누른 엔터"가 들어가는 것입니다.
이 문제를 어떻게 해결해야 할까요?
흠, 엔터를 받아서 어디다 던져 버리면 되지 않을까요?
{color:red}getchar()
함수는 문자 하나를 받는 함수입니다. 이 함수를 이용해서 엔터를 받으면, ch2에는 b가 들어가게 되겠죠. getchar()를 추가해서 다시 코드를 작성해 볼까요?
printf("첫 번째 문자 입력하세요 : ");
scanf("%c", &ch1); // a 받고,
getchar(); // 엔터 받아오기
printf("두 번째 문자 입력하세요 : ");
scanf("%c", &ch2); // b 받고,
getchar(); // 엔터 받아오기
printf("세 번째 문자 입력하세요 : ");
scanf("%c", &ch3);
이렇게 문제가 해결됩니다.
결론 :
{color:blue}문자나 문자열 입력을 받을 때는 그것이 항상 버퍼에 들어간다는 것을 기억하세요!
반복문 for문
코딩을 하다보면 중복되는 부분들이 참 많습니다. 예를 들어 구구단을 출력하는 프로그램을 만든다고 하면,
printf("구구단 2단을 외자!\n");
printf("%d * %d = %d\n", 2, 2, 2*2);
printf("%d * %d = %d\n", 2, 3, 2*3);
printf("%d * %d = %d\n", 2, 4, 2*4);
printf("%d * %d = %d\n", 2, 5, 2*5);
printf("%d * %d = %d\n", 2, 6, 2*6);
.....
.....
이렇게 일일이 타이핑을 하기에는 너무나 귀찮죠. 그 때 반복문을 쓰면 코드가 아주 심플해집니다.
int i;
printf("구구단 2단을 외자!\n");
for( i=2 ; i<=9 ; i++){
printf("%d * %d = %d\n", 2, i, 2*i);
}
C에서 반복문은 두 가지가 있는데, 먼저 for문을 배워보겠습니다. for문은 매우 간단합니다.
for(){
반복할내용;
}
그냥 for 적으시고 안에 반복할 내용을 넣으면 됩니다.
하지만 인생은 그리 만만하지 않죠..
여기에는 사실 제어 변수라는 게 들어갑니다.
그림에서 i가 제어변수예요.
다시 구구단 코드를 보겠습니다.
printf("%d * %d = %d\n", 2,
{color:red}2
, 2*{{{{color:red}2}}});
printf("%d * %d = %d\n", 2,
{color:red}3
, 2*{{{{color:red}3}}});
printf("%d * %d = %d\n", 2,
{color:red}4
, 2*{{{{color:red}4}}});
printf("%d * %d = %d\n", 2,
{color:red}5
, 2*{{{{color:red}5}}});
printf("%d * %d = %d\n", 2,
{color:red}6
, 2*{{{{color:red}6}}});
모든 줄이 같은 듯 하지만 딱 두 군데 변하는 부분이 있죠? 이렇게 유일하게 변화하는 부분을 해결하는 것이 i입니다. 맨 처음에 i에 2를 넣고, 1씩 증가시키면서 9가 될 때까지 구구단을 출력하는 거죠.
for문의 실행 순서는 이렇게 됩니다.
초기화는 맨 처음에 한 번만 진행되고, 그 뒤부터는 조건검사->내용실행->증가가 계속 반복됩니다.
그러다가 조건이 맞지 않게 되면(i가 10이 되면) 반복문을 빠져나오게 되죠.
실행 순서를 잘 익혀놓으세요.
그런데 반복할 내용에 또 for문을 넣게 되면 어떻게 될까요? 2중 for문이 됩니다.
for(){
for(){
}
}
2중 for문에서의 실행 흐름을 잘 알아두세요. //도식화는 다음에..
과제
교수님이 C의 자잘한 문법보다는 손코딩을 좋아하시는 분이라, 실습 위주로 가려합니다.
문제를 보고 나서, 생각 없이 바로 키보드에 손을 얹지 말아주세요. 반드시 손으로 한 줄이라도 설계를 해보고 코딩을 하시기 바랍니다.
과제1 : 별찍기 Lv.1
사용자로부터 숫자 N을 입력 받아, 다음과 같이 별을 찍으세용
과제2 : 별찍기 Lv.2
사용자로부터 숫자 N을 입력 받아, 다음과 같이 별을 찍으세용
선택과제 : 별찍기 Lv.3
짜잔!
한 번 해보면 생각보다 어렵지 않다는 걸 느낄거예요.
