Difference between r1.91 and the current
@@ -1,9 +1,9 @@
[[TableOfContents]]
= 참여자 명단 =
== 1회차(3/16) ==
* 수업시간 - 10:00 ~ 12:00
= 참여자 명단 =
||이름||3/16||3/23||3/30||3/31||4/7||4/27||5/4||
||강소현|| O || O || O || O || O || O || ||
||박성국|| O || O || O || O || O || O || ||
||이준영|| O || O ||늦잠|| O || O || O || ||
||이름||3/16||3/23||3/30||3/31||4/7||4/27||5/4||5/11||5/18||5/25||6/8||
||강소현|| O || O || O || O || O || O || O || O || O || O || O ||
||박성국|| O || O || O || O || O || O || O || O || X || O || O ||
||이준영|| O || O || △ || O || O || O || O || O || O || O || O ||
= 수업 === 1회차(3/16) ==
* 수업시간 - 10:00 ~ 12:00
@@ -642,7 +642,7 @@
맞았습니다.
그만하시겠습니까?(y: yes, n: no) => y
}}}
{{{
#include <stdio.h>
그만하시겠습니까?(y: yes, n: no) => y
}}}
=== 과제 제출 ===
=== 과제제출 ===
* [이준영]{{{
#include <stdio.h>
@@ -724,12 +724,86 @@
* [이준영] - rand와 srand를 배우고 그동안 배웠던 반복문과 조건문을 활용해 간단한 게임을 만들어보았습니다. 문장이 조금 길어져서 복잡했어요.
* [강소현] - while, if, break, continue 등 예전에 배웠던 것들을 게임을 통해 복습을 하는 시간을 가졌습니다.
== 7회차(5/4) ==
* 위키 정리가 매우 알차네요!! 그런데 한편으론 이렇게 정리하려면 위키에 적는 것이 새싹교실 선생님에게 너무 부담스럽지 않을까 싶은 걱정도 듭니다. 즐겁게 정리하고 있다면 정말 좋은 일이지만 혹시 너무 부담스럽다면 덜 꼼꼼히 적어도 괜찮을 것 같아요~ - [김수경]
* 네ㅎㅎ 이제 슬슬 시험이 다가오니까 실습 위주로 나가면서 적당히 하려구요 ㅋㅋㅋ - [강소현]
* [강소현] - while, if, break, continue 등 예전에 배웠던 것들을 게임을 통해 복습을 하는 시간을 가졌습니다.
== 7회차(5/4) ==
* 수업시간 - 10:30 ~ 12:00
* 수업시간 - 10:30 ~ 12:30
=== 수업내용 ===
* 함수
* 타입 4 가지
* variable
* global, local, static, register
*call by value
=== 후기 === * [박성국] - ^오늘은 함수에 대해서 자세히 배우고 그에 필요한 지식인 지역변수 전역변수 static변수에 대해 자세히 배웠습니다.^
* [박성국] - ^오늘은 함수에 대해서 자세히 배우고 그에 필요한 지식인 지역변수 전역변수 static변수에 대해 자세히 배웠습니다.^ 하나하나 배우면서 C언어어에 대한 자신감을 가졌습니다. 특히 Recursive function에 대해 정확한 이해를 통하여 활용할 수 있게 되었습니다. 항상 스펀지같이 쏙쏙 머리속에 들어오는 수업 감사합니다.
* [이준영] - 수업시간에 제대로 집중을 못해서 잘 못들은 부분을 자세히 배울 수 있어서 다행이었습니다. 재귀함수랑 변수의 유형을 자세히 배웠습니다. 앞으로도 더 많은 걸 배우고 싶어요.
* [강소현] - 함수의 형태를 반환형이 있는 지의 여부와 매개변수가 있는 지의 여부에 따른 4 가지를 실습하여 차이를 알아보았습니다. 그리고 재귀함수에 대한 진도도 나갔으나, 아무래도 그냥 함수 한번 호출하고 끝낼 때보다 이해가 잘 가지 않는 듯 합니다. 다음 시간에 한번 더 복습할 예정입니다. 재귀함수로 만드는 factorial이나 gcd 같은 것을 점화식을 설명하고 보여주면 좀 더 이해가 쉽지 않을까 싶었습니다.
== 8회차(5/11) ==
* 수업시간 - 11:00 ~ 12:00
=== 수업내용 ===
* 재귀함수 복습
* 봉봉 교수님 hw2 문제 풀이
=== 후기 ===
* [강소현] - 한 시간은 정말 금방 가네요. 근데 왜 학교 수업 들을 때는 그리 길었던거지!? 재귀함수를 사용할 경우 항상! 빠져나올 수 있는 '''조건'''을 걸어야 한다는 것을 복습했습니다. 뭔가 도미노 원칙 어쩌구 하긴 했지만 정확한 게 아니라 비슷하다-고 했던거에요. 정확한 건 3학년 알고리즘 시간에 divide&conquer을 배우면...<< 간단히 설명하자면 한번에 풀기 힘드니까 나눠서 풀자는 내용입니다.
* [박성국] -
* [이준영] - * [강소현] -
== 9회차(5/18) ==
* 수업시간 - 10:00 ~ 11:00
=== 수업내용 ===
* Function Call Stack
* 함수 호출 시, stack에 돌아올 주소를 넣어두고 함수가 종료되면 stack에서 빼와서 돌아간다. LIFO(Last In First Out)의 순으로..
* 배열
* 둘 이상의 변수를 동시에 선언하는 효과
* 많은 양의 데이터를 일괄적 처리할 때 유용하다
* 1차원 배열
* 배열 길이: 배열을 구성하는 변수의 개수
* 배열 요소 자료형: 배열을 구성하는 변수의 자료형
* 배열 이름: 배열에 접근할 때 사용되는 이름
* 문자열 변수
* 문자열은 널(null) 문자를 끝에 지닌다.
* 널(null) 문자: ‘\0’ (아스키코드 값으로 0)
* 널(null) 문자를 지녀야 하는 이유
* 문자열의 끝을 표현하기 위해서
* 쓰레기 값과 실제 문자열의 경계를 나타내기 위해
* Printf함수는 널 문자를 통해서 출력의 범위를 결정 짓는다.
=== 실습 ===
*실습(2): 문자열을 입력 받는다. 입력 받은 문자열을 구성하고 있는 문자 중에서 아스키코드 값이 가장 큰 문자를 찾아서 출력하는 프로그램을 구현해보자.
* [이준영]
{{{
#include <stdio.h>
int main()
{
char array[20],max;
int i;
scanf("%s", &array);
max=array[0];
for(i=0;i<20;i++){
if(array[i+1]>array[i]) max=array[i+1];
if(array[i]==NULL) break;
}
printf("%c", max);
return 0;
}
}}}
=== 후기 ===
* [강소현] - 배열이 쉬워서 그런가(?) 예상외로 금방 수업이 끝났습니다. 다음 시간에는 시간 조절을 더 잘 해야겠습니다.
* [박성국] -
* [이준영] - 수업 시간에 배열을 제대로 집중을 안해서 몰랐는데 오늘 배열이 무엇인지 알게 되었습니다. 무엇보다 제가 실습2를 직접 풀어서 정말 의미있었던 새싹교실이었습니다.
== 10회차(5/25) ==
* 수업시간 - 10:30 ~ 11:30
=== 수업 내용 ===
* 다차원 배열
=== 후기 ===
* [박성국] - 배열에 대해 평소 개념과 실습이 적었는데 오늘 개념도 자세히 배우고 실습도 충분히 한 시간이었어요. :) 또한 과제도 하면서 더욱 자세히 이해 할 수 있었습니다.!!! 그리고 오늘 수업중 다같이 나가서 루카스 옷도 받아온 정말 유익한 시간이었습니다. ㅋㅋ
* 음 음 여러 모로 유익했지 ~ㅁ~ㅋㅋ 40분이나 기다렸지만 만족스러움!ㅋㅋ -[강소현]
* [강소현] - 다차원 배열의 선언 및 초기화와 2차원 배열을 이용한 행렬 계산을 실습항였습니다. 이후에 sort와 search 부분도 나가려 하였으나...올 해는 꼭 티셔츠를 받고 말겠다!라는 의욕으로 함께 줄 서서 기다렸습니다 /ㅁ/ 아 줄이 안끊겨서 다행이에요ㅎㅎ
== 11회차(6/8) ==
* 수업시간 - 10:30 ~ 12:00
=== 수업 내용 ===
* 포인터
* 문자열 조금?
=== 후기 ===
* [강소현] - 이후의 내용은... 배우고 싶은 사람에 한해 방학 때 하기로 했습니다.진도를 너무 느리게 나가면 안되겠구나하고 느낀.. ;ㅅ; 작년에는 3번 수업으로 포인터까지 나갔는데, 올해는.. 대상이 다르기는 하지만, 조절을 잘 못하기도 했네요. ㅠㅠ
----* 위키 정리가 매우 알차네요!! 그런데 한편으론 이렇게 정리하려면 위키에 적는 것이 새싹교실 선생님에게 너무 부담스럽지 않을까 싶은 걱정도 듭니다. 즐겁게 정리하고 있다면 정말 좋은 일이지만 혹시 너무 부담스럽다면 덜 꼼꼼히 적어도 괜찮을 것 같아요~ - [김수경]
* 네ㅎㅎ 이제 슬슬 시험이 다가오니까 실습 위주로 나가면서 적당히 하려구요 ㅋㅋㅋ - [강소현]
Contents
1. 참여자 명단 ¶
이름 | 3/16 | 3/23 | 3/30 | 3/31 | 4/7 | 4/27 | 5/4 | 5/11 | 5/18 | 5/25 | 6/8 |
강소현 | O | O | O | O | O | O | O | O | O | O | O |
박성국 | O | O | O | O | O | O | O | O | X | O | O |
이준영 | O | O | △ | O | O | O | O | O | O | O | O |
2.1.1. 수업내용 ¶
- C언어의 역사
- C언어의 장&단점
- 프로그램 완성과정
- 실습
/* Hello.c */ #include <stdio.h> int main(void) { printf("Hello, World!\n"); return 0; }
2.1.2. QnA ¶
- 선형대수학을 배우는 이유?
Application DB 그래픽스 네트워크 컴공 core 자료구조 알고리즘 수학 선형대수학 이산수학 수치해석
- 텅 빈 공간에 ; 를 해도 오류 없이 실행되는 이유?
- ; 는 문장의 끝을 나타내므로, printf("Hello World"); 처럼 어디까지 내용이 있다 나타내는 것처럼 빈 공간도 빈 공간 그대로 인식이 되지 않았나 싶어요.
- ; 는 문장의 끝을 나타내므로, printf("Hello World"); 처럼 어디까지 내용이 있다 나타내는 것처럼 빈 공간도 빈 공간 그대로 인식이 되지 않았나 싶어요.
- C언어의 단점 중 low-level적 특성으로 프로그래밍을 하는데 많은 주의를 요한다 했는데, 실제로 잘못 사용한 사례는?
- 나중에 포인터를 사용하는 실습을 하다 보면 많은 깨달음을 얻을 수 있지 않을까 싶습니다...
- 나중에 포인터를 사용하는 실습을 하다 보면 많은 깨달음을 얻을 수 있지 않을까 싶습니다...
- printf를 왜 제일 처음 배우나요?
- 아무래도 성과가 바로바로 눈에 보이게 출력하여 확인할 수 있는 함수이다 보니, 초보자가 바로 이해하기 어려움에도 불구하고 처음에 배우게 되는 듯 합니다.
- 아무래도 성과가 바로바로 눈에 보이게 출력하여 확인할 수 있는 함수이다 보니, 초보자가 바로 이해하기 어려움에도 불구하고 처음에 배우게 되는 듯 합니다.
- C언어 전이 B언어 였는데 A언어도 있나요?
- A언어 : ALGOL을 말합니다. 고급 프로그래밍 언어(어셈블리나 기계어를 저급 프로그래밍 언어라고 합니다)로 각광받던 포트란ForTran에 대항하기 위해 유럽을 중심으로 개발된 프로그래밍 언어입니다. ALGOL은 Algorithm Language의 약자로서, 이름 그대로 알고리즘 연구개발을 위해 만들어졌습니다. 하지만 ALGOL은 특정한 프로그래밍 언어를 지칭하기 보다는 C언어나 파스칼과 같이 구조화된 프로그래밍 언어를 지칭하는 말(ALGOL-like programming language)로 쓰입니다. 출처 링크! 클릭하세요:)
- A언어 : ALGOL을 말합니다. 고급 프로그래밍 언어(어셈블리나 기계어를 저급 프로그래밍 언어라고 합니다)로 각광받던 포트란ForTran에 대항하기 위해 유럽을 중심으로 개발된 프로그래밍 언어입니다. ALGOL은 Algorithm Language의 약자로서, 이름 그대로 알고리즘 연구개발을 위해 만들어졌습니다. 하지만 ALGOL은 특정한 프로그래밍 언어를 지칭하기 보다는 C언어나 파스칼과 같이 구조화된 프로그래밍 언어를 지칭하는 말(ALGOL-like programming language)로 쓰입니다. 출처 링크! 클릭하세요:)
- 기계어로 번역된 파일이 .obj 파일인데 왜 이상한 영어들로 되어있나요?
- 메모장으로 열어서 글이 깨졌어요 ㅠㅠ 연결프로그램을 Visual Studio로 하면 번역이 정상적으로 되어있을거에요. 숫자가 010100 하면 너무 길어서 16진수로 표현이 되어있는듯 합니다.
- 메모장으로 열어서 글이 깨졌어요 ㅠㅠ 연결프로그램을 Visual Studio로 하면 번역이 정상적으로 되어있을거에요. 숫자가 010100 하면 너무 길어서 16진수로 표현이 되어있는듯 합니다.
2.1.3. 후기 ¶
- 이준영 - C언어의 기초적인 내용에 대해 다시 배울 수 있었습니다. 생각나는거로는 %d가 생각나네요.
아직 어렵지만 열심히 배우도록 하겠습니다. 소현누나 고마워요.
- 강소현 - 열성적으로 질문을 해주어서 좋았습니다. A언어도 있는지의 여부를 물었었는데 저는 몰랐었는데 실제로 존재하더라구요 ㅎㅎ 가벼운 내용이라도 의문이 드는 사항이라면 언제든지 위키나 문자로 질문해주면 최대한 답변을 달도록 노력하겠습니다. 다음 시간에는 이전에 실습했던 것의 복습과 scanf 이후로 나갈 예정입니다. PPT 준비에 디자인도 없이 급하게 만든 티가 났었는데, 다음 시간에는 조금 더 준비를 해가겠습니다:)
- 박성국 - 이 수업이 C프로그래밍 강의에서 이해 안되었던 부분을 이해 할 수 있게 도와졌어요^^ 앞으로도 모르는것 많이 알려주세요~.
2.2.1. 수업내용 ¶
- 입, 출력 함수 - printf, scanf
- redirection
- 연산자
- 산술연산자 사용 예
- 산술연산자 사용 예
#include <stdio.h> //printf 함수 사용 int main(void) { int val1 = 4; int val2 = 2; printf("두 수의 덧셈: %d\n", val1+val2); printf("두 수의 뺄셈: %d\n", val1-val2); return 0;
- 기타 대입 연산자 사용 예
#include <assert.h> //assert 함수 사용 int main(void) { int val1 = 4, val2 = 2; val1 += 3; val2 *= 2; assert(val1 == 7); //val1이 7인 경우 정상 종료, 아닌 경우 오류 출력 assert(val2 == 4); //val2이 4인 경우 정상 종료, 아닌 경우 오류 출력 return 0; }
- 증가, 감소 연산자 사용 예
#include <assert.h> //assert 함수 사용 int main(void) { int val = 10; assert(val++ == 10); //val++한 값이 10과 같으면 정상작동. 아니면 오류 출력 assert(++val == 12); //++val한 값이 12과 같으면 정상작동. 아니면 오류 출력 return 0; }
- 관계 연산자 사용 예
#include <assert.h> //assert 함수 사용 int main(void) { int val1 = 10; int val2 = 12; assert(val1 <= val2); //val2값이 val1값보다 크거나 같으면 정상작동. 아니면 오류 출력 return 0; }
- 논리 연산자 사용 예
#include <assert.h> //assert 함수 사용 int main(void) { int val1 = 10; int val2 = 12; assert(val1 < val2 && val2 == 12); //val2값이 val1값보다 크고, val2값이 12와 같으면 정상작동. 아니면 오류 출력 assert(val1 > val2 || val2 != 11); //val2값이 val1값보다 크거나, val2값이 11이 아니면 정상작동. 아니면 오류 출력 return 0; }
2.2.2. 과제 ¶
- 산술 연산자 사용 예에서 val1과 val2를 곱셈, 나눗셈, 나머지를 구하는 것을 추가하여 출력해보자.
- 기타 대입 연산자 사용 예에서 assert(val1 == 7); 를 assert(val1 != 7); 로 바꾸어 실행해보기.
- 기타 대입 연산자 사용 예에서 -= , /= , %= 한 결과를 assert(val1 == 7); 와 같이 assert함수 안에 넣어 확인하시오.
- 증가 감소 연산자 사용 예에서 감소연산자를 사용한 예를 추가해보자.
- 관계 연산자 사용 예에서 >= , != 가 사용되는 사례를 만들어보자(변수 val3 만들어서).
- 실수(float)를 2개 입력받아(scanf), 앞서 받은 값이 뒤의 값보다 크면 정상작동, 아니면 오류를 출력하도록 해보자(assert)
2.2.3. 과제제출 ¶
- 박성국
#include <stdio.h> int main() { int val1 = 4; int val2 = 2; printf ("%d\n",val1*val2); system("pause"); return 0; }
#include <stdio.h> int main() { int val1 = 4; int val2 = 2; printf ("%d\n", val1/val2); system("pause"); return 0; }
#include <stdio.h> int main() { int val1 = 3; int val2 = 2; printf("%d\n", val1%val2); system("pause"); return 0; }
#include <assert.h> int main() { int val1 = 4, val2 = 2; val1 += 3; val2 *= 2; assert(val1 != 7);//printf 도 안쓰고 값을 출력할 수 있다니 assert의 정체가 궁금 하네요. assert(val2 != 4);//수업시간에 자세히 알려주세요~ //음 그리고 이거 실행하면 에러가 나는데 값이 7과4 맞으니까 에러 안뜨지 안나요??? return 0; }
#include <assert.h> int main() { int val1 = 10, val2 = 8; val1 -= 3; val2 /= 2; assert(val1 != 7); assert(val2 != 4); return 0; //이것도 오류 아닌거 같은데 오류가 나네요 (수업시간때 잘못된것좀 지적해 주세요) }
#include <assert.h> int main() { int val1 = 4, val2 = 2; val1 %= 3; val2 %= 2; assert(val1 != 1); assert(val2 != 0); return 0; // 이것도 오류가;; }
#include <assert.h> int main() { int val = 15; assert(--val == 14); assert(val-- == 14); system("pause"); return 0; }
#include <assert.h> int main() { int val1 = 13; int val2 = 12; int val3 = 13; assert(val1 >= val2); assert(val1 != val3); return 0; //이게 왜 오류가 뜨는지 알 수 없네요 ;; 그리고 main() 괄호 안에 void 넣든 안넣든 //별상관 없는것 같은데 왜 void를 쓰죠??? }
#include <assert.h> int main() { float val1,val2; scanf("%d %d", &val1, &val2); assert(val1 < val2 && val2 == 12); assert(val1 < val2 || val1 != 11); return 0; //아 이것도 오류가 안나야 되는데 오류가 나네요 음 근본적인 무언가가 틀린거 같아요. // 그리고 float이란 실수를 정의해 주는건가요??? // 이경우엔 int를 안 써주는게 맞나요??? }
2.2.4. QnA ¶
- assert 문에서 오류가 난 이유?
#include <assert.h> int main() { int val1 = 10, val2 = 8; val1 -= 3; val2 /= 2; assert(val1 != 7); assert(val2 != 4); return 0; }
- assert는 강하게 주장하다라는 의미로 위와 같은 경우 val1이 7이 아니다! val2가 4가 아니다! 라고 주장한다는 의미입니다. 하지만 val1값은 7이고, val2의 값은 4니까 에러창을 띄워 주장이 잘못됐다고 알려주는 거에요. 전체적으로 의문사항은 assert문보다는 !=의 의미를 잘 몰라서 그런 듯 합니다. == 는 같다, !=는 아니다라는 의미의 관계연산자입니다.
- int main(void) 안에 void를 넣든 안넣든 상관없는 이유?
- 원래는 원칙상으로 void라고 명시해서 매개변수를 사용하지 않고 비어있다!!고 알려야하지만, 아무것도 안 쓰는 것도 비어있다는 의미로 허용해서 그렇습니다.
- 원래는 원칙상으로 void라고 명시해서 매개변수를 사용하지 않고 비어있다!!고 알려야하지만, 아무것도 안 쓰는 것도 비어있다는 의미로 허용해서 그렇습니다.
2.2.5. 후기 ¶
- 박성국 - 오늘 다양한 연산자에 대해 배우고 printf 와 scanf 에 대해 잘 이해 할 수 있었어요. 감사합니다.^^
- 이준영 - 수업시간에 이해가 잘안가던 printf랑 scanf를 배울 수 있어서 유익한 시간이었습니다. 기타 연산자도 배울 수 있었습니다.감사합니다.
- 강소현 - 4피에서 수업이 없는 줄 알고 괜히 이동했다가 다시 6피로 이동하는 번거로운 일을 했었는데, 앞으로는 얌전히 6피에서만 수업을 해야겠어요. 수요일 11시부터 12시까지 딱 새싹 시간에 다른 수업이 있는 줄 몰랐었어요 ㅠㅠ printf와 scanf에서 시간을 많이 투자해서, 급하게 연산자를 쭉쭉- 설명하고 끝내느라 기억에 남지 않을 것 같습니다. 따라서 연산자에 관한 간단한 과제를 내어 익히도록 하겠습니다.(?!) 준비를 잘 해와야하는데, 계속 부족한 강의라고만 하는 것은 겸손이 아니라 그냥 자기비하란 생각이 문득 들었습니다. 그 동안 푸념을 들어주어 미안했고, 앞으로는 그런 일이 없도록 할 것입니다.
2.3.1. 수업내용 ¶
- #define 이란?
- 실행파일의 생성순서
- 전처리기
- 심볼릭(Symbolic) 상수
- 실행파일의 생성순서
- 데이터 저장을 위한 변수
- 변수란?
- 변수 선언 시 주의사항
- 자료형
- 변수란?
2.3.2. QnA ¶
- 2의 보수는 뭐고, 왜 사용하나요?
- 2의 보수에 2의 보수에 대한 설명이 있습니다. 왜 0000 0010 의 음수 형태를 1000 0010 으로 하지 않고, 2의 보수 형태인 1111 1110 을 사용했냐! 이건 컴퓨터가 음수와 양수를 이용한 계산을 편리하게 하기 위해 그런듯합니다. 2-2를 우리야 바로 0이라고 계산할 수 있지만, 컴퓨터는 2+(-2)형태로 바꿔서 0000 0010 과 1111 1110을 더해 0000 0000 이 나오게 합니다. 컴퓨터에서 가산기를 사용하여 뺄셈을 하기 위해 음수의 표현으로 자주 사용된다라고 사전에 나오네요ㅠㅠㅋ
- 2의 보수에 2의 보수에 대한 설명이 있습니다. 왜 0000 0010 의 음수 형태를 1000 0010 으로 하지 않고, 2의 보수 형태인 1111 1110 을 사용했냐! 이건 컴퓨터가 음수와 양수를 이용한 계산을 편리하게 하기 위해 그런듯합니다. 2-2를 우리야 바로 0이라고 계산할 수 있지만, 컴퓨터는 2+(-2)형태로 바꿔서 0000 0010 과 1111 1110을 더해 0000 0000 이 나오게 합니다. 컴퓨터에서 가산기를 사용하여 뺄셈을 하기 위해 음수의 표현으로 자주 사용된다라고 사전에 나오네요ㅠㅠㅋ
2.3.3. 후기 ¶
- 박성국 - 오늘은 전산처리기와 자료형에 대해서 배웠습니다. 자세히 몰랐던 #include<stdio.h> 등 이 어떤 역활을 하는지
- 이준영 - 오늘 심볼릭 상수를 배웠습니다. const랑 define을 배웠어요. 먼지는 모르겠지만 나중에 암기하도록 하겠습니다.
변수의 선언과 초기화시 유의할점도 알 수 있어서 유익했습니다. 무엇보다 앞으로 자주 쓰이는 자료형인
char, int, float, double의 서식문자를 암기하도록 노력하겠습니다.
- 강소현 - 1시간 늦췄지만, 학교 수업 이전에 새싹 교실을 하는 것이 많이 부담이 되는 듯 합니다. 내일 오후에 수업을 하면서 다시 시간을 정할 계획입니다. 오늘 배운 전처리기와 변수, 데이터 타입을 끝으로 이론 위주의 수업은 거의 없을 거에요! 앞으로 그 동안 배웠던 기본적인 것을 활용하여 열심히 실습을 해봅시다ㅋㅋ
2.4.1. 수업내용 ¶
- 반복문
- while
- while
#include <stdio.h> int main() { int i = 1; while(i<=10) { printf("%d번째 출력\n",i); i++; } return 0; }
- do~while
#include <stdio.h> int main() { int i = 1; do { printf("%d번째 출력\n",i); i++; }while(i<=10); return 0; }
- for
#include <stdio.h> int main() { int i; for(i=1; i<=10; i++) { printf("%d번째 출력\n",i); } return 0; }
- 중첩 반복문
- for
- for
#include <stdio.h> int main() { int i, j; for(i=0; i<2; i++) { printf("j for문 실행 전 i값=%d\n",i); for(j=0; j<3; j++) { printf("여기는 안쪽 for문! j=%d\n",j); } printf("j for문 실행 후 i값=%d\n",i); } return 0; }
2.4.2. 후기 ¶
- 박성국 - 오늘은 printf 를 쓰지 않고 for 과 while or do while을 사용하여 어떻게 문장을 반복하는지에 대하여 자세히 배웠다. 이해가 차근차근 잘되어서 좋은 수업 이었다.
- 이준영 - 반복문을 배웠습니다. for문과 while, do while 을 배웠는데 다 비슷한 문법 같습니다.
매우 유익한 시간이었어요. 감사합니다.
- 강소현 - 반복문은 괜찮지만, 중첩을 하면서 안드로메다로 간 듯 합니다. 다음 시간에 다시 중첩을 해보도록 하겠습니다. 좀 더 쉽게 설명할 방법이 없을까 고민되네요 @ㅁ@;; 그리고...준영이가 콩나물 잘 못먹는다는 의견을 무시하고 콩불을 먹으러 가서 죄송합니다ㅠㅠ 소수의 의견을 묵살하지 마세요!하면서도 가길래 ㅋㅋ 아...성국이는 매운 거 잘 못 먹는 줄 몰랐고..저는 또 늦게 먹었다고 속쓰리고 ㅋㅋㅋㅋㅋㅋㅋ 이래서 의견은 존중해줘야 하는 거였군요!!(?!) 앞으로는 모두의 의견을 종합하여 해결봐야겠어요 ㅠㅠㅠㅠㅋ
2.5.1. 수업내용 ¶
- if, else if, else
- switch, break, continue
- if, switch, while 활용 사례
#include <stdio.h> #include <stdlib.h> int main() { int choice=0;//int형 변수 선언 및 초기화 char day;//char형 변수 선언 while(1) { printf("아침 기상\n"); printf("성국이는 아침으로(1:밥 2:김치 3:두부 4:삼겹살 0:다먹음) "); do { scanf("%d",&choice);//정수형 숫자 입력 받음 switch(choice) { case 1: printf("밥, "); break; case 2: printf("김치, "); break; case 3: printf("두부, "); break; case 4: printf("삼겹살, "); break; case 0: printf("을(를) 먹었다.\n"); break; default: printf("물, "); break; } }while(choice != 0); printf("그리고 학교에 갔다.\n"); printf("수업을 대충 듣다 빠져나와서 성국이는(1:당구장 2:PC방 3:술집) "); scanf("%d",&choice);//정수형 숫자를 입력받음 switch(choice) { case 1: printf("당구장을 갔다."); break; case 2: printf("PC방을 갔다."); break; case 3: printf("술집을 갔다."); break; default: printf("어딜 가려하였으나 그냥 다시 수업을 하러 갔다."); break; } printf("다 끝나고 하숙집에 돌아가 저녁을 먹고 잤다.\n"); printf("다음 날이 평일이었나?(y:yes n:no) "); fflush(stdin);//입력버퍼를 비워준다. '\n'도 문자로 인식하니까. scanf("%c",&day);//'%c'는 문자를 입력받음. if(day == 'n') { printf("주말이니 집으로 내려갔다.\n"); break; } system("pause");//일시정지 system("cls");//clear screen } }
- 별찍기 예시
#include <stdio.h> int main() { int i,j,h; for(i=1;i<=10;i++)//10번 출력 { for(j=1;j<=i;j++)//별 갯수 { printf("*"); } printf("\n"); } return 0; }
2.5.2. 과제 ¶
- 높이 h를 입력받아 별을 출력하세요.
***** **** *** ** *
- 높이 h를 입력받아 O을 출력하세요.
O OO OOO OOOO OOOOO
2.5.3. 과제제출 ¶
- 박성국
#include <stdio.h> int main() { int i,j; for(i=1;i<=5;i++) { for(j=5;i<=j;j--) printf("*"); printf("\n"); } return 0; }
#include<stdio.h> int main() { int i,j,h; scanf("%d",&h); for(i=0;i<h;i++) { for(j=1;h-i>j;j++) printf(" "); for(j=0;i>=j;j++) printf("o"); printf("\n"); } return 0; }//한글 ㅇ를 치니까 피라미드가 나오던데요 ㅇㅅㅇ 이건 어떤 현상인지 ㅋ?
2.5.5. 후기 ¶
- 박성국 - 오늘은 if를 활용하는 방법에 대해서 자세히 배웠어요^^ 그리고 if와 비슷한 switch를 이용하여 다양한 경우를 출력해 보는것 또한 배웠어요:)
- 이준영 - 이제 본격적으로 줄 수가 많아지니 흥미가 생깁니다. if에 대해 자세히 배울 수 있었습니다.
- 강소현 - if,for,while,switch를 배우고, 실습을 병행하였습니다. 구구단에서 홀수만 출력하는 경우 i+=2 를 하거나, continue를 활용하는 사례도 시행해보았습니다. 다음 주는 시험 일주일 전인 관계로 수업을 휴강하겠습니다. 시험 끝나고 봐요~ㅁ~
2.6.1. 수업내용 ¶
- rand()를 이용해서 up-down 게임 만들기
#include <stdio.h> #include <stdlib.h> //srand, rand #include <time.h> //time int main() { int num, i; srand((unsigned)time(NULL)); printf("%u\n",(unsigned)time(NULL)); for(i=0; i<10;i++){ num=rand()%5; printf("%d ",num); } return 0; }
2.6.2. 실습 ¶
- 이준영
#include <stdio.h> #include <stdlib.h> //srand, rand #include <time.h> //time int main() { int num,i,min=0,max=99; srand((unsigned)time(NULL)); num=rand()%100; while(1){ scanf("%d",&i); if(num>i){ printf("up\n"); if(min<i){ min=i; } printf("%d에서 %d 사이\n",min,max); }else if(num<i){ printf("down\n"); if(max>i){ max=i; } printf("%d에서 %d 사이\n",min,max); }else break; } return 0; }
- 박성국
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int n,a,min=0,max=99; srand((unsigned)time(NULL)); n = rand()%100; while(1) { scanf("%d",&a); if(a<n){ if(a>min) min=a; printf("up (%d<n<%d)\n",min,max); } else if(a>n){ if(max>a) max=a; printf("down (%d<n<%d)\n",min,max); } else break; } return 0; }
2.6.3. 과제 ¶
- 두 개의 1~9 사이의 정수를 입력받아 구구단 문제 푸는 게임을 만드세요.
- 출력 예시
- 출력 예시
3 * 5 => // 13 입력(내가 입력한 값) 틀렸습니다. 3 * 5 => // 15 입력(내가 입력한 값) 맞았습니다. 그만하시겠습니까?(y: yes, n: no) => n 7 * 9 => // 63 입력(내가 입력한 값) 맞았습니다. 그만하시겠습니까?(y: yes, n: no) => y
2.6.4. 과제제출 ¶
- 이준영
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int a,b,c,i; srand((unsigned)time(NULL)); while(1){a=(rand()%9)+1; b=(rand()%9)+1; printf("%d*%d=",a,b); while(1){ scanf("%d",&i); if(i==a*b) break; else printf("틀렸음\n"); } printf("잘했어요.\n"); printf("그만하시겠습니까?(0:quit 1:continue)\n"); scanf("%d",&c); if(c==0) break; else system("cls"); } return 0; }
* 박성국
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int n,m,a; char d,y='y'; srand((unsigned)time(NULL)); while(1) { n = rand()%9+1; m = rand()%9+1; while(1) { printf("%d*%d=?",n,m); scanf("%d",&a); if(n*m==a) { printf("%d*%d => // %d\n맞았습니다\n그만하시겠습니까?(y: yes, n: no)",n,m,a); fflush(stdin); scanf("%c",&d); if(d==y) { printf(" => y\n"); exit(0); } else printf(" => n\n"); break; } else { printf("%d*%d => // %d 입력(내가 입력한 값)\n틀렸습니다.)",n,m,a); } } } return 0; }
2.7.2. 후기 ¶
- 박성국 - ^오늘은 함수에 대해서 자세히 배우고 그에 필요한 지식인 지역변수 전역변수 static변수에 대해 자세히 배웠습니다.^ 하나하나 배우면서 C언어어에 대한 자신감을 가졌습니다. 특히 Recursive function에 대해 정확한 이해를 통하여 활용할 수 있게 되었습니다. 항상 스펀지같이 쏙쏙 머리속에 들어오는 수업 감사합니다.
- 이준영 - 수업시간에 제대로 집중을 못해서 잘 못들은 부분을 자세히 배울 수 있어서 다행이었습니다. 재귀함수랑 변수의 유형을 자세히 배웠습니다. 앞으로도 더 많은 걸 배우고 싶어요.
- 강소현 - 함수의 형태를 반환형이 있는 지의 여부와 매개변수가 있는 지의 여부에 따른 4 가지를 실습하여 차이를 알아보았습니다. 그리고 재귀함수에 대한 진도도 나갔으나, 아무래도 그냥 함수 한번 호출하고 끝낼 때보다 이해가 잘 가지 않는 듯 합니다. 다음 시간에 한번 더 복습할 예정입니다. 재귀함수로 만드는 factorial이나 gcd 같은 것을 점화식을 설명하고 보여주면 좀 더 이해가 쉽지 않을까 싶었습니다.
2.9.1. 수업내용 ¶
- Function Call Stack
- 함수 호출 시, stack에 돌아올 주소를 넣어두고 함수가 종료되면 stack에서 빼와서 돌아간다. LIFO(Last In First Out)의 순으로..
- 함수 호출 시, stack에 돌아올 주소를 넣어두고 함수가 종료되면 stack에서 빼와서 돌아간다. LIFO(Last In First Out)의 순으로..
- 배열
- 둘 이상의 변수를 동시에 선언하는 효과
- 많은 양의 데이터를 일괄적 처리할 때 유용하다
- 둘 이상의 변수를 동시에 선언하는 효과
- 1차원 배열
- 배열 길이: 배열을 구성하는 변수의 개수
- 배열 요소 자료형: 배열을 구성하는 변수의 자료형
- 배열 이름: 배열에 접근할 때 사용되는 이름
- 배열 길이: 배열을 구성하는 변수의 개수
- 문자열 변수
- 문자열은 널(null) 문자를 끝에 지닌다.
- 널(null) 문자: ‘\0’ (아스키코드 값으로 0)
- 널(null) 문자를 지녀야 하는 이유
- 문자열의 끝을 표현하기 위해서
- 쓰레기 값과 실제 문자열의 경계를 나타내기 위해
- Printf함수는 널 문자를 통해서 출력의 범위를 결정 짓는다.
- 문자열의 끝을 표현하기 위해서
- 문자열은 널(null) 문자를 끝에 지닌다.
2.9.2. 실습 ¶
- 실습(2): 문자열을 입력 받는다. 입력 받은 문자열을 구성하고 있는 문자 중에서 아스키코드 값이 가장 큰 문자를 찾아서 출력하는 프로그램을 구현해보자.
- 이준영
- 이준영
#include <stdio.h> int main() { char array[20],max; int i; scanf("%s", &array); max=array[0]; for(i=0;i<20;i++){ if(array[i+1]>array[i]) max=array[i+1]; if(array[i]==NULL) break; } printf("%c", max); return 0; }
2.10.2. 후기 ¶
- 박성국 - 배열에 대해 평소 개념과 실습이 적었는데 오늘 개념도 자세히 배우고 실습도 충분히 한 시간이었어요. 또한 과제도 하면서 더욱 자세히 이해 할 수 있었습니다.!!! 그리고 오늘 수업중 다같이 나가서 루카스 옷도 받아온 정말 유익한 시간이었습니다. ㅋㅋ
- 음 음 여러 모로 유익했지 ~ㅁ~ㅋㅋ 40분이나 기다렸지만 만족스러움!ㅋㅋ -강소현
- 음 음 여러 모로 유익했지 ~ㅁ~ㅋㅋ 40분이나 기다렸지만 만족스러움!ㅋㅋ -강소현
- 강소현 - 다차원 배열의 선언 및 초기화와 2차원 배열을 이용한 행렬 계산을 실습항였습니다. 이후에 sort와 search 부분도 나가려 하였으나...올 해는 꼭 티셔츠를 받고 말겠다!라는 의욕으로 함께 줄 서서 기다렸습니다 /ㅁ/ 아 줄이 안끊겨서 다행이에요ㅎㅎ