1.1. 아스키 코드 ¶
0과 1로 동작하는 컴퓨터에게 모든 것은 숫자로 통합니다.
문자도 숫자,
소리도 숫자,
그림도 숫자로 취급해서 다루죠.
문자도 숫자,
소리도 숫자,
그림도 숫자로 취급해서 다루죠.
그런데 우리는 이미 printf와 scanf를 통해서 문자를 입력받고 출력받고 있습니다.
숫자만을 알고 있는 컴퓨터가 어떻게 문자를 다룰 수 있는 걸까요?
답은 간단합니다. 문자 하나마다 숫자를 하나씩 매칭하는거죠.
숫자 97은 문자 a이다, 라고 약속을 하는 겁니다.
그런 약속이 모여서 아스키 테이블이 만들어졌습니다.
숫자만을 알고 있는 컴퓨터가 어떻게 문자를 다룰 수 있는 걸까요?
답은 간단합니다. 문자 하나마다 숫자를 하나씩 매칭하는거죠.
숫자 97은 문자 a이다, 라고 약속을 하는 겁니다.
그런 약속이 모여서 아스키 테이블이 만들어졌습니다.
[PNG image (195.69 KB)]
printf("%c", 숫자)에서 '숫자' 자리에 위 테이블에 있는 숫자를 하나씩 넣어보세요.
그 숫자에 해당되는 문자가 출력될 것입니다.
그 숫자에 해당되는 문자가 출력될 것입니다.
아스키 코드의 숫자는 0부터 127까지입니다.
그래서 우리가 문자를 출력할 때, 0~127을 벗어나는 수를 넣게 되면 문제가 생기게 되지요(물론 저 범위에서 확장된 확장형 아스키 코드가 있긴 하지만, 그건 지금 얘기하지는 않겠습니다).
그래서 우리가 문자를 출력할 때, 0~127을 벗어나는 수를 넣게 되면 문제가 생기게 되지요(물론 저 범위에서 확장된 확장형 아스키 코드가 있긴 하지만, 그건 지금 얘기하지는 않겠습니다).
1.2. 문자열 입출력 ¶
char name[100]; scanf("%s", name);
string을 입력받을 때는 변수 앞에 '&'가 붙지 않습니다.
지금은 요정도만 알아두세요.
지금은 요정도만 알아두세요.
1.3. 문자 입력받기는 까다롭다! 버퍼 알아보기 ¶
과제 코드의 일부를 가져와봤습니다.
하지만 이대로는 문자 세 개가 정상적으로 입력되지 않습니다.
바로 버퍼 때문인데요, scanf는 입력을 버퍼에 저장합니다.
그래서 사용자가 이렇게 입력을 하면,
a, b, c가 나란히 들어가 있는 것이 아니라 사이사이에 엔터(\n)가 들어간 것을 볼 수 있습니다.
a를 입력하고 누른 엔터, b를 입력하고 누른 엔터가 다 들어간 것이지요.
그래서 변수 ch2에는 b가 아니라 "a를 입력하고 누른 엔터"가 들어가는 것입니다.
이 문제를 어떻게 해결해야 할까요?
흠, 엔터를 받아서 어디다 던져 버리면 되지 않을까요?
getchar()함수는 문자 하나를 받는 함수입니다.
이 함수를 이용해서 엔터를 받으면, ch2에는 b가 들어가게 되겠죠.
getchar()를 추가해서 다시 코드를 작성해 볼까요?
printf("첫 번째 문자 입력하세요 : "); scanf("%c", &ch1); printf("두 번째 문자 입력하세요 : "); scanf("%c", &ch2); printf("세 번째 문자 입력하세요 : "); scanf("%c", &ch3);문자 세 개를 입력받아 ch1, ch2, ch3 변수에 넣고 있습니다.
하지만 이대로는 문자 세 개가 정상적으로 입력되지 않습니다.
바로 버퍼 때문인데요, scanf는 입력을 버퍼에 저장합니다.
그래서 사용자가 이렇게 입력을 하면,
첫 번째 문자 입력하세요 : a 두 번째 문자 입력하세요 : b 세 번째 문자 입력하세요 : c버퍼는 요런 상태가 되지요.
[PNG image (8.68 KB)]
a, b, c가 나란히 들어가 있는 것이 아니라 사이사이에 엔터(\n)가 들어간 것을 볼 수 있습니다.
a를 입력하고 누른 엔터, b를 입력하고 누른 엔터가 다 들어간 것이지요.
그래서 변수 ch2에는 b가 아니라 "a를 입력하고 누른 엔터"가 들어가는 것입니다.
[PNG image (16.62 KB)]
이 문제를 어떻게 해결해야 할까요?
흠, 엔터를 받아서 어디다 던져 버리면 되지 않을까요?
[PNG image (26.59 KB)]
getchar()함수는 문자 하나를 받는 함수입니다.
이 함수를 이용해서 엔터를 받으면, ch2에는 b가 들어가게 되겠죠.
getchar()를 추가해서 다시 코드를 작성해 볼까요?
printf("첫 번째 문자 입력하세요 : "); scanf("%c", &ch1); // a 받고, getchar(); // 엔터 받아오기 printf("두 번째 문자 입력하세요 : "); scanf("%c", &ch2); // b 받고, getchar(); // 엔터 받아오기 printf("세 번째 문자 입력하세요 : "); scanf("%c", &ch3);이렇게 문제가 해결됩니다.
결론 : 문자나 문자열 입력을 받을 때는 그것이 항상 버퍼에 들어간다는 것을 기억하세요!
1.4. 반복문 - 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문은 매우 간단합니다.
하지만 인생은 그리 만만하지 않죠..
여기에는 사실 제어 변수라는 게 들어갑니다.
그림에서 i가 제어변수예요.
다시 구구단 코드를 보겠습니다.
for문은 매우 간단합니다.
for(){ 반복할내용; }그냥 for 적으시고 안에 반복할 내용을 넣으면 됩니다.
하지만 인생은 그리 만만하지 않죠..
여기에는 사실 제어 변수라는 게 들어갑니다.
그림에서 i가 제어변수예요.
[PNG image (12.27 KB)]
다시 구구단 코드를 보겠습니다.
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);
모든 줄이 같은 듯 하지만 딱 두 군데 변하는 부분이 있죠?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);
이렇게 유일하게 변화하는 부분을 해결하는 것이 i입니다.
맨 처음에 i에 2를 넣고, 1씩 증가시키면서 9가 될 때까지 구구단을 출력하는 거죠.
for문의 실행 순서는 이렇게 됩니다.
초기화는 맨 처음에 한 번만 진행되고, 그 뒤부터는 조건검사->내용실행->증가가 계속 반복됩니다.
그러다가 조건이 맞지 않게 되면(i가 10이 되면) 반복문을 빠져나오게 되죠.
실행 순서를 잘 익혀놓으세요.
[PNG image (24.87 KB)]
초기화는 맨 처음에 한 번만 진행되고, 그 뒤부터는 조건검사->내용실행->증가가 계속 반복됩니다.
그러다가 조건이 맞지 않게 되면(i가 10이 되면) 반복문을 빠져나오게 되죠.
[PNG image (20.19 KB)]
실행 순서를 잘 익혀놓으세요.
그런데 반복할 내용에 또 for문을 넣게 되면 어떻게 될까요?
2중 for문이 됩니다.
//도식화는 다음에..
2중 for문이 됩니다.
for(){ for(){ } }2중 for문에서의 실행 흐름을 잘 알아두세요.
//도식화는 다음에..
2. 과제 소개 ¶
교수님이 C의 자잘한 문법보다는 손코딩을 좋아하시는 분이라, 실습 위주로 가려합니다.
문제를 보고 나서, 생각 없이 바로 키보드에 손을 얹지 말아주세요.
반드시 손으로 한 줄이라도 설계를 해보고 코딩을 하시기 바랍니다.
반드시 손으로 한 줄이라도 설계를 해보고 코딩을 하시기 바랍니다.
2.1. 과제1 : 별찍기 Lv.1 ¶
사용자로부터 숫자 N을 입력 받아, 다음과 같이 별을 찍으세용
[PNG image (6.08 KB)]
같이 손코딩 했었죠?
손코딩을 할 때는
손코딩을 할 때는
- 첫째, 문제를 작게 만들어서 손으로 풀어보세요
- 둘째, 손으로 풀면서 패턴을 찾아내세요. 어느 부분이 반복되고, 어느 부분이 변하는지(i를 써야하는 부분인지)?
- 셋째, 패턴을 코드로 써 보세요.
그냥 의미 전달만 되게 쓰시면 됩니다.
그런 코드를 슈도 코드(pseudo code)라고 해요.
이 과제의 경우 슈도 코드를 이렇게 써볼 수 있습니다.
브라켓({})을 칠 필요도, 세미콜론을 붙일 필요도 없습니다.
근데 저게 어색해서 그냥 C문법대로 쓰는 게 편하다, 하시면 그렇게 쓰셔도 돼요~
for( i는 1부터 N까지 ) for( j는 1부터 i까지 ) print("*") print("\n")심플하죠? 하핫
브라켓({})을 칠 필요도, 세미콜론을 붙일 필요도 없습니다.
근데 저게 어색해서 그냥 C문법대로 쓰는 게 편하다, 하시면 그렇게 쓰셔도 돼요~
2.3.1. 정답 ¶
#define _CRT_SECURE_NO_WARNINGS //scanf_s말고 scanf를 쓸 수 있도록 하는 코드 #include <stdio.h> int main(){ int n; printf("몇 단짜리를 출력할까요? "); scanf("%d", &n); int flag = 1; for (int i = 0; i >= 0; i+=flag){ for (int k = n-i; k > 0; k--){ printf(" "); } for (int j = 0; j < 2*i + 1; j++){ printf("*"); } printf("\n"); if (i == n - 1) flag = -flag; } return 0; }
3.1. 현지 ¶
#include <stdio.h> int main(void) { int i,j; for (i = 1; i <= 10; i++) { for (j = 1; j <= i; j++) printf("*"); printf("\n"); } return 0; }
#include <stdio.h> int main(void) { int i, j; for (i = 1; i <= 10; i++) { for (j = 1; j<=10-i; j++) printf(" "); for (j = 1; j <=i; j++) printf("*"); printf("\n"); } return 0; }
3.2. 혜민 ¶
#include<stdio.h> int main(){ int i, n, j; scanf("%d", &n); for(i=1; i<=n; n++){ for(j=1; j<=i; j++){ printf("*");} printf("\n"); } return 0; } #include<stdio.h> int main(){ int i, n, j; scanf("%d",&n); for(i=1; i<=n; n++){ for(j=1; j<=i; j++){ printf("%10*nc",*); } printf("\n");} return 0; }
3.3. 유진 ¶
#include <stdio.h> int main(){ int a, b, n; printf("숫자를 입력 하십시오."); scanf("%d", &n); for (a = 1; a <= n; a++) { for (b = 1; b <= a; b++) { printf("*"); } printf("\n"); } }
#include <stdio.h> int main() { int a, b, n; printf("숫자를 입력 하십시오: "); scanf("%d", &n); for (a = 1; a <= n; a++) { for (b = 1; b <= n - a; b++) { printf(" "); } for (b = 1; b <= a; b++); { printf("*"); } printf("\n"); } }
4. 후기 ¶
물 주는 사람
수업시간에는 너무 이해가 잘되는데 혼자하니까 어려운 점이 많다. 혼자 연습도 많이 해봐야 할 것 같다. 그래도 for문도 쓸 수 있게 되고 아무것도 몰랐던 과거에 비하면 너무 발전한 것 같아서 새싹교실을 하길 잘했다는 생각이 든다. 열심히 하겠습니당 언니 짱짱!!♥
유진
여러가지 예제를 풀어볼 수 있어서 좋았다. 이론으로만 배우는게 아니라 적용해 보고 생각해 보는 시간이 인상깊었다.
선배님 사랑해요...♥
시간이 촉박해서 빨리빨리 넘어가느라고 좀 어렵게 가르친 것 같습니다.
새싹들이 좀 힘들었을 것 같아요ㅠ
다음엔 좀 더 천천히, 쉽게 가려고 합니다.
새싹들이 너무 잘 들어주고 예뻐서(?) 가르치는 게 즐거워요♥ 우힛
새싹들이 똑똑해서 질문도 많이 합니다. 허허
이현지새싹들이 좀 힘들었을 것 같아요ㅠ
다음엔 좀 더 천천히, 쉽게 가려고 합니다.
새싹들이 너무 잘 들어주고 예뻐서(?) 가르치는 게 즐거워요♥ 우힛
새싹들이 똑똑해서 질문도 많이 합니다. 허허
printf,scanf같은 기본적인 것만 해보다가 for문을 배워보니까 재미있었고 생각보다 어렵지 않았다.
항상 코딩을 하려하면 막막했었는데 손코딩을 먼저 해봄으로써 어떤식으로 코드를 짤지 생각하기 수월해진 것 같다.
선배님이 너무 잘 가르쳐주셔서 아쉬운점이 없다 ♥
김혜민항상 코딩을 하려하면 막막했었는데 손코딩을 먼저 해봄으로써 어떤식으로 코드를 짤지 생각하기 수월해진 것 같다.
선배님이 너무 잘 가르쳐주셔서 아쉬운점이 없다 ♥
수업시간에는 너무 이해가 잘되는데 혼자하니까 어려운 점이 많다. 혼자 연습도 많이 해봐야 할 것 같다. 그래도 for문도 쓸 수 있게 되고 아무것도 몰랐던 과거에 비하면 너무 발전한 것 같아서 새싹교실을 하길 잘했다는 생각이 든다. 열심히 하겠습니당 언니 짱짱!!♥
유진
여러가지 예제를 풀어볼 수 있어서 좋았다. 이론으로만 배우는게 아니라 적용해 보고 생각해 보는 시간이 인상깊었다.
선배님 사랑해요...♥