[[TableOfContents]] = 참여자 = ||강사 || [권영기] || ||<|3> 새싹 || [금강현] || || [권준혁] || || [이지수] || = 진행 = * 매주 금요일 오전 10시에 진행합니다. --컴공타임 적용해서 10시 30분에 시작-- * 주제는 그날 그날 필요한 것 + 자료구조 PPT = feedback = * 새싹교실이 ZeroPage에서 시행되는만큼 4F([ThreeFs] + Future Action Plan)에 맞게 feedback을 작성합니다. * Facts, Feelings, Findings, Future Action Plan. 즉, 사실, 느낀 점, 깨달은 점, 앞으로의 계획. * 예를 들어 지난주에 돈가스를 먹은 것에 대해 후기를 쓴다면 : "지난주에 강남에 가서 하나에 5만원하는 돈가스를 먹었다.(사실) 기대를 잔뜩 했는데 별로 맛이 없었다.(느낌) 강남은 땅값이 비싸서 값만 보고 엄청 맛있을거라 기대하면 안된다는 것을 알았다.(깨달은점) 다음에는 미리 인터넷에서 평을 찾아보고 별점이 높은 돈가스집을 찾아서 가봐야겠다.(앞으로의 계획)" * 설마 이것보다 더 짧게 쓰진 않겠죠? 믿을게요 * feedback은 최대한 성의있게 써주세요. * 반드시 ZeroWiki에 작성해주세요. 하위 페이지를 만드는 것도 허용합니다. * 여러분들이 배운 내용을 정리해주세요. 학습효과가 더 커집니다. * 참고로 ZeroWiki는 MoniWiki Engine을 사용하며 Google Chrome이나 Mozila Firefox, Safari보다는 Internet Explorer에서 가장 잘 돌아가는 것 같습니다. = 수업 일지 = == 1회차(3월 13일) == == 2회차(3월 21일) == === 예정 === * Compile * Pointer * Call by Value / Call by Reference --* 이중포인터-- --* C 메모리 구조-- === 참여자 === ||강사 || [권영기] || O || ||<|3> 새싹 || [금강현] || O || || [권준혁] || O || || [이지수] || O || === 참고 자료 === * C 소스의 컴파일 과정 [http://www.hanbit.co.kr/network/view.html?bi_id=1013] [http://seohs.tistory.com/entry/%EC%BB%B4%ED%8C%8C%EC%9D%BC%EA%B3%BC-%EB%A7%81%ED%82%B9] [https://kldp.org/node/71570] * 한상용 교수님의 자료구조 PPT C_Review === 숙제 === * 후기 남기기. * 포인터를 사용하여 두 변수의 값을 교환해주는 함수를 작성하시오. ==== 이지수 ==== {{{#include int main() { int x = 5, y = 8, z; int *p, *q; p = &x; q = &y; printf("p의 값은 %d, q의 값은 %d\n",*p, *q); z = *p; *p = *q; *q = z; printf("p의 값은 %d, q의 값은 %d\n",*p, *q); system("pause"); return 0; }}}} //함수가 아니라 틀렸다!! 라고 조심스래 말해봅니다,,, [권준혁] [권준혁]의 태클로 수정습니다. {{{#include void exchange(int *a, int *b); int main() { int m, n; int *ptr1, *ptr2; printf("두 정수 a, b 입력 :"); scanf("%d %d", &m, &n); ptr1 = &m; ptr2 = &n; exchange(*ptr1, *ptr2); printf("두 정수 a, b 출력 : &d %d",m,n); system("pause"); return 0; } void exchange(int *a, int *b) { int z; z = *a; *a = *b; *b = z; }}}} 근데 이거 돌려보면 처리되지 않은 예외가 있다고 뜨네요..왜지? 후 지수야,,, printf에 &d가 아니라 %d지...exchange(ptr1,ptr2)지...아직 멀었구나...- [권준혁] 컴파일해봤는데 오류떠서 봤더니 stdlib.h가 include 안되있구나... system() 쓰려면 필요함 - [권준혁] * ?! 근데 첫번째코드에선 왜 stdlib.h인클루드 안했는데 오류가 안났지?? * 금방 돌려봤는데 에러뜨던데? 근데 프로그램 실행은 되더라 - [권준혁] ==== 권준혁 ==== 함수만 만들기 뭐해서 main함수까지 작성했습니다 {{{#include //여기부터가 함수 void switch(int *xp, int *yp){ int temp; temp = *xp; *xp = *yp; *yp = temp } //여기까지가 함수 int main() { int a = 39, b =573; int *ap; int *bp; ap=&a; bp=&b; printf("바꾸기전에는 %d, %d",a,b); switch(ap,bp); printf("바꾸기후에는 %d, %d",a,b); retrun 0; } //컴파일 안돌려본거라 문법상 오류가 있을지도 모르겠음,,, //함수는 문제없을듯 }}} 그런데 retrun은 생전 처음보는데요, 이게 뭐죠? - [이지수] retrun -> return - [권영기] 중요한 함수부분은 문제 없으니 맞다고 열심히 변명해봅니다 - [권준혁] ==== 금강현 ==== 으어.. 내가 젤 못해ㅠㅠ {{{ #include int main() { int num1, num2, *num1_p, *num2_p, temp; scanf("%d\n", &num1); scanf("%d\n", &num2); num1_p = &num1; num2_p = &num2; temp = num1; *num1_p = num2; *num2_p = temp; } }}} * malloc(), calloc(), realloc(), free()에 대해서 찾아보기. C reference 사이트. [http://www.cplusplus.com/reference/cstdlib/malloc/?kw=malloc malloc] [http://www.cplusplus.com/reference/cstdlib/realloc/ realloc] [http://www.cplusplus.com/reference/cstdlib/calloc/ calloc] [http://www.cplusplus.com/reference/cstdlib/free/ free] === 찾아보면 좋은 사이트 === * http://www.cplusplus.com/ : c++ reference 사이트. * http://www.soen.kr/ : 강좌 - c/c++ 란에서 c, c++ 강좌를 볼 수 있음. === 후기 === * 포인터 복습. 잊혔던 기억이 되살아나서 감회가 새로웠다. 재미있었음! 바로 다음 시간에 기프 수업 듣는데 컴파일 과정이 나왔다. 예기치않게 예습한 셈이 됨ㅋㅋ - [이지수] * 목표한 진도까지는 나갔습니다. 학생들이 공부를 미리 해왔기 때문에 진행이 수월했네요. 주변에 도움을 주는 사람들도 많아서 진행하기 좋았습니다. 자료구조 시간에 배웠던 내용을 그대로 진행해보고 있는데 이렇게 되면 다음 시간도 이론 수업이겠네요. 아무래도 실습은 과제로 내주는 방법 밖에는 없겠습니다. 진행을 하면서 한 가지 아쉬웠던 점은 나올 수 있는 질문에 대해서 미리 준비하지 않은 점. 다음 시간에는 그 점을 더 보강해야겠습니다. - [권영기] * 배웠던 내용을 복습했다. 다음시간부터는 모르는거라 설랜다. 권영기선배님 설명도 좋았다. 그냥 좋다 ^ㅡ^ [권준혁] == 3월 28일 (3회차) == === 예정 === * C 메모리 구조. * malloc, calloc, realloc, free * 이중 포인터 * 자료 구조? 알고리즘? * --시간복잡도, 공간복잡도.-- === 참여자 === ||강사 || [권영기] || O || ||<|3> 새싹 || [금강현] || O || || [권준혁] || O || || [이지수] || O || == 4월 11일 (4회차) == === 예정 === * 시간복잡도 * 정렬 - 삽입 정렬 * 피보나치 수 - 재귀적 방법 - 순차적 방법 * 시간이 남아서 분할 정복. - 피보나치 수 - n개의 점이 주어졌을 때, 가장 짧은 거리의 선분 구하기. * 시간이 남아서 동적 프로그래밍. - 피보나치 수 * 스택 === 참여자 === ||강사 || [권영기] || O || ||<|3> 새싹 || [금강현] || O || || [권준혁] || O || || [이지수] || O || === 참고 자료 === * [http://mirror.enha.kr/wiki/%EC%A0%95%EB%A0%AC 정렬] === 숙제 === * 삽입 정렬 구현. * 피보나치 수 재귀적 방법으로 구현. * 스택 혼자서 구현해보기. * 어차피 시험 기간이어서 못할수도 있으니 시험 공부하다가 질리면 하던가 바쁘면 안해도 됨. === 후기 === * 항상 예상보다 빨리 진행이 되서 걱정입니다. 앞으로는 숙제를 내야겠습니다. 시험들 잘보세요. - [권영기] * 정렬과 스택을 배우고 divide&conquer도 살짝 배웠습니다. 이제부터는 전혀 모르는 내용이라 새롭고 재미있었습니다. 권영기 선배님이 알기 쉽게 잘 가르쳐주셔서 이해하는 데에는 별로 어렵지 않았습니다. 하지만 스스로 프로그래밍해보면 어려울 듯 합니다ㅠㅠ 어쨌든 이렇게 도전적인 내용을 배울 수 있어서 좋습니다. 선배님 ppt도 올려주세요!! 바쁘신데 늘 감사합니다ㅠㅠ - [이지수] * 시간 쪼개서 해주시는데 항상 늦게 가서 죄송할 따름입니다. 성실한 수업태도와 착실하게 숙제를 함으로 보답하겠습니다. 이제부터 슬슬 머리굴리는게 나오는 것 같습니다. 기대됩니다 ㅎ [권준혁] === 다음 수업 === * 중간고사가 금요일에 끝나서 새싹을 진행할 수 있을 것 같으면, 4월 25일에 진행. * 4월 25일에 불가능할 것 같다면, 5월 2일. === 숙제 === ==== 권준혁 ==== 1. 피보나치 구현 {{{ #pragma warning(disable:4996) #include int pibo(int num); int main(){ int input = 0; printf("피보나치수 몇번째수를 출력할깝쇼? : "); scanf("%d", &input); printf("\n이거에요 : %d", pibo(input)); } int pibo(int num){ if (num == 1 || num == 2) return 1; int temp = pibo(num - 1) + pibo(num - 2); return temp; } }}} * 삽입정렬 구현 n,k를 입력받아서 1부터 k범위의 숫자를 임의로 n개 받아서 저장하는걸 동적할당을 이용해서 구현해봤습니다 {{{ #pragma warning(disable:4996) #include #include #include int random_num(int range); //1부터 range까지의 랜덤한 숫자 하나를 가져옴 void insert_sort(int* start_p, int range); void swap(int* a, int* b); int main(){ int number, range; int i, j, temp; int *start_p; srand(time(NULL)); printf("몇개의 숫자를 정렬할것입니까? : "); scanf("%d", &number); printf("숫자의 범위는요? : "); scanf("%d", &range); start_p = (int*)malloc(sizeof(int) * (number+1)); *start_p = 0; start_p = start_p + 1;//삽입정렬을 위해 앞의 한 공간을 비워둠 for (i = 0; i < number; i++) //임의의 값을 넣어줌 { *(start_p + i) = random_num(range); } printf("임의로 배열된 숫자들입니다.\n"); for (i = 0; i < number; i++) //출력해주자 { printf("%d ", *(start_p + i)); } insert_sort(start_p, number); printf("\n삽입정렬 되었습니다.\n"); for (i = 0; i < number; i++) //출력해주자 { printf("%d ", *(start_p + i)); } printf("끝"); } int random_num(int range){ return (rand() % range) + 1; } void insert_sort(int* start_p, int range) //start_p의 앞 한자리는 0으로 되있다는 전제이다 { int i, j, temp; for (i = 0; i < range; i++) { for (j = i; j >= 0; j--)//-1까지는 j가 내려갈 수 있다 { if (*(start_p + j) < *(start_p + j - 1)) swap((start_p + j), (start_p + j - 1)); else break; } } } void swap(int* a, int* b){ int temp = *a; *a = *b; *b = temp; } }}} * 스택 구현 {{{#pragma warning(disable:4996) #include #include #include int scale_of_stack; //스택의 크기 int top_of_stack; //스택의 성분 갯수. 7이면 7개 있는거다 int Pop(int *start_p); //0이면 실패(스택에 아무것도 없는 경우겠져? ^^) start_p는 스택의 시작 주소 int Push(int *start_p, int input); //1이면 성공, 0이면 실패(스택이 꽉 찬 상태겠져? ^^) void Print_Stack(int *start_p); //start_p부터 top_of_stack만큼 스택 요소를 출력한다 int main(){ int i, j, temp = 0, input; int trigger;//분기 저장 int* startp_of_stack;//스택 시작 주소 printf("스택 놀이를 시작하기 전 스택의 크기를 정해주세요^^ 0으로 초기화됩니다 : "); scanf("%d", &scale_of_stack); startp_of_stack = (int*)calloc(scale_of_stack,sizeof(int)); top_of_stack = 0; while (1) { printf("\n신나고, 재미나는 스택 놀이! 1=PUSH 2=POP 3=Show Stack 4=End"); scanf("%d", &trigger); printf("\n"); switch (trigger) { case 1: if (top_of_stack == scale_of_stack) { printf("스택이 꽉 차서 넣을수가 없네요 ㅎ"); break; } printf("삽입하실 자료를 입력해주세요 : "); scanf("%d", &input); if (Push(startp_of_stack, input)) printf("입력 성공!"); else printf("왠진 모르겠는데 실패했다."); break; case 2: if (top_of_stack == 0) { printf("스택이 텅 벼서 뺄 수가 없네요 ㅎㅎ"); break; } printf("제일 위에 있는걸 뺍니다.\n"); temp = Pop(startp_of_stack); if (temp != 0) printf("빼기 성공! 뺀 자료는 %d입니다.", temp); else printf("왠진 모르겠는데 실패했다."); break; case 3: Print_Stack(startp_of_stack); break; case 4: printf("\n바이바이\n"); return 0; default: break; } } } int Pop(int *start_p) //0이면 실패(스택에 아무것도 없는 경우겠져? ^^) { if (top_of_stack == 0) return 0; int temp; temp = *(start_p + top_of_stack); *(start_p + top_of_stack) = 0; top_of_stack--; return temp; } int Push(int *start_p, int input)//1이면 성공, 0이면 실패(스택이 꽉 찬 상태겠져? ^^) { if (top_of_stack == scale_of_stack) return 0; top_of_stack++; *(start_p + top_of_stack) = input; return 1; } void Print_Stack(int *start_p) //start_p부터 top_of_stack만큼 스택 요소를 출력한다 { for (int i = top_of_stack; i > 0; i--) //top of stack 이 n이면 1부터 n까지 출력해야한다. { printf("| %5d |\n", *(start_p + i)); } printf("└______┘\n"); } }}} ==== 이지수 ==== 1. 재귀함수로 피보나치 수열 구현 {{{ #pragma warning(disable:4996) #include #include int fibo(int x){ if (x == 1 || x == 2) return 1; else return fibo(x - 1) + fibo(x - 2); } int main() { int n, i; printf("출력하고 싶은 수열의 항 개수를 입력하세요 : "); scanf("%d", &n); for (i = 1; i <= n; i++) printf("%d ", fibo(i)); system("pause"); return 0; } }}} 2. 삽입 정렬 구현 {{{ #pragma warning(disable:4996) #include #include #include int main() { int *align; int align_n, sort_n, i = 0; printf("정렬할 숫자의 개수를 입력하세요 : "); scanf("%d", &align_n); align = (int *)malloc(sizeof(int)*align_n); printf("정렬할 수열을 입력해 주세요(정수 %d개) : ", align_n); for (i=0; i < align_n; i++) scanf("%d", align+i); for (int j = 1; j < align_n ; j++){ for (sort_n = j; sort_n > 0; sort_n--){ int temp; if (*(align + sort_n) < *(align + sort_n - 1)){ temp = *(align + sort_n - 1); *(align + sort_n - 1) = *(align + sort_n); *(align + sort_n) = temp; } else break; } } puts("삽입정렬 되었습니다."); for (int n=0; n < align_n; n++) printf("%d ", *(align+n)); printf("\n"); free(align); system("pause"); return 0; } }}} ==== 권영기 ==== * 삽입 정렬 {{{ #include #include const int INF = 0x7FFFFFFF; int main(void) { int n; int *number; int i, j; scanf("%d", &n); number = (int *)malloc(sizeof(int) * (n + 10)); number[0] = -INF; for(i = 1; i<=n; i++){ scanf("%d", number + i); } for(i = 1; i<=n; i++){ int temp = number[i]; for(j = i - 1; j>=0 && number[j] > temp; j--){ number[j + 1] = number[j]; } number[j + 1] = temp; } for(i = 1; i<=n; i++){ printf("%4d", number[i]); } return 0; } }}} * 피보나치 {{{ #include int fibo(int n){ if(n <= 2)return 1; return fibo(n - 1) + fibo(n - 2); } int main(void) { int n; scanf("%d", &n); printf("%d", fibo(n)); return 0; } }}} * 스택 {{{ #include #include using namespace std; template class Stack{ private: vector dataVector; int top_pointer; public: Stack(){ top_pointer = -1; dataVector.resize(20); } ~Stack(){ } void push(T element){ if(top_pointer == dataVector.size() - 1){ dataVector.resize(dataVector.size() * 2); } dataVector[++top_pointer] = element; } T pop(){ if(top_pointer < 0){ } return dataVector[top_pointer--]; } T top(){ return dataVector[top_pointer]; } }; int main(void){ Stack s = Stack(); Stack sc = Stack(); for(int i = 0; i<=100; i++){ s.push(i); sc.push(char(i)); } for(int i = 0; i<=100; i++){ printf("%d\n", s.pop()); printf("%c\n", sc.pop()); } } }}} ---- [새싹교실/2014]