== 설명 == * 2015년도 새싹교실 반입니다. * 장르는 C 프로그래밍 기초 * 진도를 나가기 보다는 수업을 보조해 주는 방식으로 진행합니다. * 매주 목요일 오후 7시 * 왜 팀 이름이 이러냐면... * 나중에 알랴드림 == 멤버 == * 강사: [조영준] * 학생: [서영운], [유동제], [한성현] == 진행 == === 3월 17일 === * 오리엔테이션 * 팀명/시간 조정 === 3월 26일 === * Hello, World 살펴보기 * {{{ # }}}이 무엇을 하나요? * {{{ int main() {} }}} 이 뭐죠? * {{{ puts }}}와 {{{ printf }}}는 무슨 차이가 있어요? * 기타 등등... === 4월 2일 === * 자료형들 * short, int, long * float, double * 컴퓨터에서는 숫자를 어떻게 저장할까? * 왜 다양한 자료형들이 있을까? * 산술/논리 연산자들 * (중첩) if/else * 점수에 따른 성적 출력하는 실습 * 숫자 입력에 따른 출력 실습 (양수? 음수? 양수면 짝수? 홀수?) === 4월 9일 === * 실습 시간 * 쉬프트 암호화 * 4개의 좌표를 입력받아 넓이 출력 * 그 외에 짬짬한 내용들 * {{{ stdio.h }}} 외에도 {{{ math.h }}}와 같은 헤더 파일들이 있으며, 각각의 헤더 파일은 특정 작업과 관련된 함수들을 가지고 있음. * 연산 후, 비교하고, 대입한다. * {{{ 1 <= x <= 9 }}} 이런 코드는 노노. * http://www.asciitable.com/ 아스키 값은 여기서 확인. * 정수끼리 나눌 경우 값이 정수임을 유의. * (float) (double)과 같은 캐스팅을 하거나, 3.0 같은 꼼수(?)를 쓰자 === 5월 7일 === 긴 공백기를 깨고... * 함수 * 왜 함수를 쓰는가, 함수의 구성, 프로토타입 * 포인터 * 왜 포인터를 쓰는가, 포인터 관련 문법, 포인터 동작 원리, swap example * 배열 * 왜 배열을 쓰는가, 배열과 포인터와의 관계 {{{ #include #pragma warning(disable:4996) void getNumbers(int* ary, int len); int main() { int pause; int a[5]; int i; getNumbers(a, 5); for (i = 0; i < 5; i++) { printf("%d ", *(a + 4 - i)); } scanf("%c", &pause); scanf("%c", &pause); return 0; } void getNumbers(int[] ary, int len) { int i; for (i = 0; i < len; i++) { scanf("%d", ary + i); } } --- #include #pragma warning(disable:4996) int main() { int pause; int a[5]; int i; for (i = 0; i < 5; i++) { scanf("%d", &a[i]); } for (i = 0; i < 5; i++) { printf("%d ", a[4 - i]); } scanf("%c", &pause); scanf("%c", &pause); return 0; } --- #include #pragma warning(disable:4996) void printNumbers(int, int); void swap(int*, int*); int add1(int toAdd); int main() { int pause; int a = 1; int b = 2; b = toAdd(b); printf("%d %d\n", &a, &b); printNumbers(a, b); swap(&a, &b); printNumbers(a, b); scanf("%c", &pause); return 0; } void swap(int* swapA, int* swapB) { int temp = *swapA; *swapA = *swapB; // a=2; *swapB = temp; } int add1(int toAdd) { return toAdd + 1; } void printNumbers(int printA, int printB) { printf("a= %d, b= %d\n", printA, printB); } }}} === 5월 14일 === * 쉬어가는 시간 - rand/srand/time {{{ #include // rand, srand #include // time time(NULL); // 1970년 1월 1일 0시 0분 0초부터 지난 시간 리턴 srand(unsigned int) // random의 시드값 설정 rand() // 난수 리턴 }}} ==== seed? ==== {{{ return (i + j + 123) ^ 100000 % 1000 }}} 이라는 가상의 rand 함수가 있다고 가정 하자. j는 0으로 시작해서 호출 시 마다 1씩 증가한다. 이러면 호출시마다 다른 값이 출력되지만, 프로그램을 실행시키면 항상 같은 순서로 같은 값이 나온다. 이를 위해 프로그램 실행시마다 i값을 다르게 설정하면 프로그램을 실행시킬 때 마다 다른 임의의 숫자가 나올 것이다. 이 때 i값을 seed값이라고 한다. === 5월 28일 === ==== 실습 내용 ==== {{{ [a1, a2, a3, ... , an, b1, b2, ..., bn]}}}의 배열을 {{{[a1, b1, a2, b2, ... an, bn]}}} 과 같은 형태로 바꾸시오. (단, 최대 크기는 255) ==== 질의응답 ==== ===== 크기 지정은 어떻게? ===== * 실행하기 전에 크기를 지정하는 방법 #define ARRAY_SIZE 10 int array[ARRAY_SIZE]; * 실행 중에 크기를 지정하는 방법 scanf을 통해 입력 단, 지금으로써는 여전히 최대 크기는 미리 지정해야 할 것. ===== 함수에서 배열을 입력받을 경우 배열의 크기는 어떻게? ===== * 자기만의 '끝'을 표시 (ex. 숫자를 0 이상만 받는다고 할 경우 음수값이 나올 때 까지 반복) * 함수 호출 시 배열 뿐만이 아니라 배열의 크기도 입력받음 (ex. void printArray(int arr[], int size)) ==== 추천 순서 ==== 1. 배열 선언하기 2. 데이터 입력하기 1. scanf 2. rand 3. for문을 이용 3. 배열 출력하기 4. 배열 순서 바꾸기 5. 배열 출력하기 3과 5는 하는 일이 같으니 함수를 이용하는게 어떨까? 이 외에도, 2와 3 부분도 함수로 만들면 보기 편하지 않을까? == 6월 4일 == '''실습 테스트''' (90분) === 문제 1 === 사용자에게 3자리의 현재 자물쇠 비밀번호와 현재 자물쇠의 상태를 입력 받아 몇 번을 돌려야 자물쇠를 풀 수 있는지 알아내는 프로그램을 C로 작성하시오. {{{ // example input: 325 478 // example output: 9 // example input: 001 990 // example output: 3 }}} (문제 모델링) === 문제 2 === 입력 받은 높이만큼의 파스칼 삼각형을 출력하는 프로그램을 C로 작성하시오. (힌트: {{{a[n][m] = a[n - 1][m - 1] + a[n - 1][m], a[n][0] = 1, a[n][n] = 1}}}) {{{ // example input: 6 (1 <= n <= 30) // example output: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 }}} (주어진 로직에서의 구현) === 문제 3 === m(높이), n(너비), k(사각형 크기)을 입력 받아 다음과 같은 출력을 하는 프로그램을 C로 작성하시오. {{{ 1 <= m <= 10, 1 <= n <= 10, 1 <= k <= 5}}} {{{ // example input: m = 3, n = 4, k = 2 // example output: ( _ 은 공백) **__**__ **__**__ __**__** __**__** **__**__ **__**__ // example input: m = 2, n = 3, k = 1 // example output: ( _ 은 공백) *_* _*_ }}} (문제 분석 및 로직 구성)