[새싹교실/2017/꽃밭/0324|◀이전수업]▒▒▒▒▒[새싹교실/2017/꽃밭/0403|다음수업▶] [[TableOfContents]] = 수업 내용 = 과제 리뷰를 하며 아스키코드와 버퍼를 설명했습니다. 그러고나서 이론을 가르쳤습니다. == 아스키 코드 == 0과 1로 동작하는 컴퓨터에게 모든 것은 {{{{color:red}'''숫자'''}}}로 통합니다. 문자도 '''숫자''', 소리도 '''숫자''', 그림도 '''숫자'''로 취급해서 다루죠. 그런데 우리는 이미 printf와 scanf를 통해서 문자를 입력받고 출력받고 있습니다. 숫자만을 알고 있는 컴퓨터가 어떻게 문자를 다룰 수 있는 걸까요? 답은 간단합니다. 문자 하나마다 숫자를 하나씩 매칭하는거죠. 숫자 97은 문자 a이다, 라고 약속을 하는 겁니다. 그런 약속이 모여서 아스키 테이블이 만들어졌습니다. attachment:ascii_table.png?width=300&height=520 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 }}} 버퍼는 요런 상태가 되지요. attachment:buffer1.png?width=480&height=220 a, b, c가 나란히 들어가 있는 것이 아니라 사이사이에 엔터(\n)가 들어간 것을 볼 수 있습니다. a를 입력하고 누른 엔터, b를 입력하고 누른 엔터가 다 들어간 것이지요. 그래서 변수 ch2에는 b가 아니라 "a를 입력하고 누른 엔터"가 들어가는 것입니다. attachment:buffer2.png?width=480&height=220 이 문제를 어떻게 해결해야 할까요? 흠, 엔터를 받아서 어디다 던져 버리면 되지 않을까요? attachment:buffer3_v2.png?width=480&height=220 {{{{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가 제어변수예요. attachment:for1.png?width=470&height=200 다시 구구단 코드를 보겠습니다. 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문의 실행 순서는 이렇게 됩니다. attachment:for2.png?width=470&height=200 초기화는 맨 처음에 '''한 번만''' 진행되고, 그 뒤부터는 '''조건검사->내용실행->증가'''가 계속 반복됩니다. 그러다가 조건이 맞지 않게 되면(i가 10이 되면) 반복문을 빠져나오게 되죠. attachment:for3.png?width=470&height=230 실행 순서를 잘 익혀놓으세요. 그런데 반복할 내용에 또 for문을 넣게 되면 어떻게 될까요? 2중 for문이 됩니다. {{{ for(){ for(){ } } }}} 2중 for문에서의 실행 흐름을 잘 알아두세요. //도식화는 다음에.. = 과제 소개 = 교수님이 C의 자잘한 문법보다는 손코딩을 좋아하시는 분이라, 실습 위주로 가려합니다. 문제를 보고 나서, 생각 없이 바로 키보드에 손을 얹지 말아주세요. 반드시 손으로 한 줄이라도 '''설계를 해보고''' 코딩을 하시기 바랍니다. == 과제1 : 별찍기 Lv.1 == 사용자로부터 숫자 N을 입력 받아, 다음과 같이 별을 찍으세용 attachment:star_lv.1.png?width=250&height=300 같이 손코딩 했었죠? 손코딩을 할 때는 * 첫째, 문제를 작게 만들어서 손으로 풀어보세요 * 둘째, 손으로 풀면서 '''패턴'''을 찾아내세요. 어느 부분이 반복되고, 어느 부분이 변하는지(i를 써야하는 부분인지)? * 셋째, 패턴을 코드로 써 보세요. 손으로 코드를 쓸 때는 C문법을 지키지 않아도 돼요. 그냥 의미 전달만 되게 쓰시면 됩니다. 그런 코드를 {{{{color:red}슈도 코드}}}(pseudo code)라고 해요. 이 과제의 경우 슈도 코드를 이렇게 써볼 수 있습니다. {{{ for( i는 1부터 N까지 ) for( j는 1부터 i까지 ) print("*") print("\n") }}} 심플하죠? 하핫 브라켓({})을 칠 필요도, 세미콜론을 붙일 필요도 없습니다. 근데 저게 어색해서 그냥 C문법대로 쓰는 게 편하다, 하시면 그렇게 쓰셔도 돼요~ == 과제2 : 별찍기 Lv.2 == 사용자로부터 숫자 N을 입력 받아, 다음과 같이 별을 찍으세용 attachment:star_lv.2.png?width=250&height=300 == 선택과제 : 별찍기 Lv.3 == 짜잔! attachment:star_lv.3.png?width=600&height=320 한 번 해보면 생각보다 어렵지 않다는 걸 느낄거예요. === 정답 === {{{ #define _CRT_SECURE_NO_WARNINGS //scanf_s말고 scanf를 쓸 수 있도록 하는 코드 #include 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; } }}} = 과제 제출 = == 현지 == {{{ #include int main(void) { int i,j; for (i = 1; i <= 10; i++) { for (j = 1; j <= i; j++) printf("*"); printf("\n"); } return 0; } }}} ------------------------------------------------------------------------------------------------------------ {{{ #include 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; } }}} == 혜민 == {{{ #include 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 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; } }}} == 유진 == {{{ #include 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 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"); } } }}} = 후기 = [이지수|물 주는 사람] 시간이 촉박해서 빨리빨리 넘어가느라고 좀 어렵게 가르친 것 같습니다. 새싹들이 좀 힘들었을 것 같아요ㅠ 다음엔 좀 더 천천히, 쉽게 가려고 합니다. 새싹들이 너무 잘 들어주고 예뻐서(?) 가르치는 게 즐거워요♥ 우힛 새싹들이 똑똑해서 질문도 많이 합니다. 허허 [이현지] printf,scanf같은 기본적인 것만 해보다가 for문을 배워보니까 재미있었고 생각보다 어렵지 않았다. 항상 코딩을 하려하면 막막했었는데 손코딩을 먼저 해봄으로써 어떤식으로 코드를 짤지 생각하기 수월해진 것 같다. 선배님이 너무 잘 가르쳐주셔서 아쉬운점이 없다 ♥ [김혜민] 수업시간에는 너무 이해가 잘되는데 혼자하니까 어려운 점이 많다. 혼자 연습도 많이 해봐야 할 것 같다. 그래도 for문도 쓸 수 있게 되고 아무것도 몰랐던 과거에 비하면 너무 발전한 것 같아서 새싹교실을 하길 잘했다는 생각이 든다. 열심히 하겠습니당 언니 짱짱!!♥ [유진] 여러가지 예제를 풀어볼 수 있어서 좋았다. 이론으로만 배우는게 아니라 적용해 보고 생각해 보는 시간이 인상깊었다. 선배님 사랑해요...♥ ---------- [새싹교실/2017/꽃밭/0324|◀이전수업]▒▒▒▒▒[새싹교실/2017/꽃밭/0403|다음수업▶] [새싹교실/2017] [새싹교실/2017/꽃밭]