모두의 코드
모두의 코드

총 42 개의 강의로 준비된 씹어먹는 C 언어 강좌를 통해 C 언어의 처음부터 끝까지 배우실 수 있습니다! 특히 악명 높은 C 언어의 포인터나, 어려운 개념들을 충실히 짚고 넘어갑니다.

이 강좌는 2010년에 완결되었지만, 지속적으로 개선 및 보완하고 있습니다.

C 언어 문법을 아시는 분들이라면, 씹어먹는 C++ 강좌를 통해 C++ 기초 부터 최근의 C++ 17 까지 모든 내용을 배우실 수 있습니다. C 언어와 C++ 의 기본적인 문법이 비슷하기 때문에, C 언어를 어느 정도 아는 독자를 가정하여 쓰여져 있습니다.

이 강좌는 2020년에 완결되었고 총 50 개의 강좌가 준비되어 있습니다.

사이트 내에서 검색 하기
C 언어 레퍼런스
표준 입출력 라이브러리 stdio.h
문자열 관련 라이브러리 string.h
시간 관련 라이브러리 time.h
C ++ 레퍼런스
문자열 라이브러리 string
알고리즘 라이브러리 algorithm
최근 댓글
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int print_hello() { printf("Hello! \n"); return 0; // return이 실행되면 함수는 무조건 "종료"됨 -> 함수를 호출하였던 부분을 돌아감 printf("Print or Not \n"); // 얘는 실행 절대 안됨 } int ret() { return 1000; } /* 문제1-1 : 마술상자1 */ int magicbox1(int x) { return (x + 4); } /* 문제1-2 : 마술상자2 */ int magicbox2(int x) { return (x * x * x + 2 * x); // <math.h>의 pow(x, 3) 사용해도됨 (pow stands for power) } /* 문제1-3 : 마술상자3 */ int magicbox3(int x) { return (x * x - 3 * x + 4); } /* 문제3 : 1부터 n까지의 합을 구하는 함수 */ int sum(int n) { int result = 0; for (int i = 1; i <= n; i++) { result += i; } return result; // n * (n + 1) / 2 도 가능하지만 for문 사용하라고 함 -> Big-O 기준으로는 줄어듦(참고) } /* 문제4: 소수의 개수 찾는 함수 */ // 소수 판별 함수 (매개변수 num이 소수인지 판별) int is_prime(int num) { if (num < 2) return 0; for (int i = 2; i < num; i++) { if (num % i == 0) return 0; } return 1; } // 1부터 n까지의 소수의 개수를 구하는 함수 int count_prime(int n) { int count = 0; for (int i = 1; i <= n; i++) { if (is_prime(i) == 1) count++; } return count; } /* 문제5 : 특정한 수 N 을 입력받아서 N 을 소인수분해한 결과가 출력 */ /* - 2부터 시작해서 나눌 수 있으면 계속 나누기 : n % i == 0 -> n = n / i - 나눌 수 없으면 다음 숫자로 - n이 1이 될 때까지 반복 */ void factorize(int n) { for (int i = 2; i <= n; i++) { while (n % i == 0) { printf("%d", i); n = n / i; if (n != 1) printf(" x "); } } } /* 문제6 : int function(int *arg) 와 같은 함수가 무엇을 뜻하는지 생각해보기 */ // int형 변수 arg의 주소를 입력으로 int function(int* arg) { // 예시 : 변수 값 일기 return *arg + 10; } int main(void) { printf("Call a function : "); print_hello(); printf("Call the function again : "); print_hello(); // 함수는 죽어서 "리턴값"을 남긴다! int a = ret(); // ret() 함수를 호출하여 그 값을 변수 a에 대입하는 문장 printf("ret() function's return value : %d \n", a); printf("\n"); // 문제 1 int x1 = 36; printf("Answer for the magic box1 = %d \n", magicbox1(x1)); printf("Answer for the magic box2 = %d \n", magicbox2(3)); printf("Answer for the magic box3 = %d \n", magicbox3(5)); // 문제 3 : 1 부터 n 까지의 합을 구하는 함수를 int n; printf("Enter n : "); scanf("%d", &n); printf("Summation from 1 to %d : %d \n", n, sum(n)); // 문제 4 : N 값을 입력 받아서 1 부터 N 까지의 소수의 개수를 출력 printf("Number of prime numbers between 1 to %d : %d \n", n, count_prime(n)); // 문제 5 : N 값을 입력 받아서 소인수분해 결과 출력 printf("Factorize Result of %d : ", n); factorize(n); printf("\n\n"); // 문제 6 int x = 5; int* px; px = &x; printf("value of x : %d \n", x); // 일반 변수 x의 값 printf("value of *px : %d \n", *px); // 포인터 px가 가리키는 값 -> x printf("value of px : %p \n", px); // 포인터 px에 저장된 주소 -> &x printf("value of (x + 10) : %d \n", x + 10); // x 값에 10을 더한 결과 printf("value of function(&x) : %d \n", function(&x)); // x의 주소 전달 (직접 주소 전달) printf("value of function(px) : %d \n", function(px)); // px에 저장된 주소 전달 (간접 전달) return 0; }
HyeonWoo Im 03.09
문제 5 void add_book(char (*info)[3][101], int* row); int search_info(char (*info)[3][101], int* row); int borrow_book(char (*info)[3][101], int* row, int *borrowed); int return_book(char (*info)[3][101], int* row, int* borrowed); int main() { int row = 0; int option; char info[100][3][101]; int borrowed[100] = { 0 }; while (1) { printf( "\n" "------------------------------\n" "도서 리스트에 추가 : 1\n" "도서 정보 검색 : 2\n" "도서 대여 : 3\n" "도서 반납 : 4\n" "프로그램 종료 : 5\n" "------------------------------\n" "\n" "사용할 기능을 입력해주세요 : " ); scanf("%d", &option); getchar(); switch (option) { case 1: add_book(info, &row); break; case 2: search_info(info, &row); break; case 3: borrow_book(info, &row, borrowed); break; case 4: return_book(info, &row, borrowed); break; case 5: printf("프로그램을 종료합니다.\n"); return 0; default: printf("존재하지 않는 기능입니다.\n"); break; } } return 0; } void add_book(char (*info)[3][101], int* row) { //책을 새로 추가하는 기능 (책의 총 개수는 100 권이라 하자. 이 때, 각 책의 정보는 제목, 저자의 이름, 출판사로 한다) printf("\n"); printf("------------------------------\n"); printf("도서 제목을 입력하세요 : "); fgets(info[*row][0], 100, stdin); info[*row][0][strcspn(info[*row][0], "\n")] = '\0'; printf("저자의 이름을 입력하세요 : "); fgets(info[*row][1], 100, stdin); info[*row][1][strcspn(info[*row][1], "\n")] = '\0'; printf("출판사 이름을 입력하세요 : "); fgets(info[*row][2], 100, stdin); info[*row][2][strcspn(info[*row][2], "\n")] = '\0'; (*row)++; printf("\n"); printf("----- 현재 도서 목록 -----\n"); for (int i = 0; i < *row; i++) { printf("%d. ", i + 1); for (int j = 0; j < 3; j++) { printf("%s", info[i][j]); if (j != 2) printf(", "); } printf("\n"); } } int search_info(char (*info)[3][101], int *row) { // 책의 제목을 검색하면 그 책의 정보가 나와야 한다. //위와 마찬가지로 저자, 출판사 검색 기능이 있어야 한다. int option; char title[101]; char auth[101]; char pub[101]; printf( "\n" "------------------------------\n" "도서 제목 검색 : 1\n" "저자 검색 : 2\n" "출판사 검색 : 3\n" "------------------------------\n" "\n" "사용할 기능을 입력해주세요 : " ); scanf("%d", &option); getchar(); switch (option) { case 1: printf("검색할 제목을 입력해주세요 : "); fgets(title, 100, stdin); title[strcspn(title, "\n")] = '\0'; // info의 원소 중 제목과 title이 같은게 있는지 순회 for (int index = 0; index < *row; index++) { int i = 0; while (title[i] && info[index][0][i] == title[i]) i++; if (title[i] == '\0') { printf("\n"); printf("도서 정보: "); for (int j = 0; j < 3; j++) { printf("%s", info[index][j]); if (j != 2) printf(", "); } printf("\n"); return 0; } if (index == *row - 1) printf("해당 도서는 존재하지 않습니다.\n"); } break; case 2: printf("검색할 저자룰 입력해주세요 : "); fgets(auth, 100, stdin); auth[strcspn(auth, "\n")] = '\0'; for (int index = 0; index < *row; index++) { int i = 0; while (auth[i] && info[index][1][i] == auth[i]) i++; if (auth[i] == '\0') { printf("\n"); printf("도서 정보: "); for (int j = 0; j < 3; j++) { printf("%s", info[index][j]); if (j != 2) printf(", "); } printf("\n"); return 0; } if (index == *row - 1) printf("해당 도서는 존재하지 않습니다.\n"); } break; case 3: printf("검색할 제목을 입력해주세요 : "); fgets(pub, 100, stdin); pub[strcspn(pub, "\n")] = '\0'; for (int index = 0; index < *row; index++) { int i = 0; while (pub[i] && info[index][2][i] == pub[i]) i++; if (pub[i] == '\0') { printf("\n"); printf("도서 정보: "); for (int j = 0; j < 3; j++) { printf("%s", info[index][j]); if (j != 2) printf(", "); } printf("\n"); return 0; } if (index == *row - 1) printf("해당 도서는 존재하지 않습니다.\n"); } break; default: printf("존재하지 않는 기능입니다.\n"); break; } return 0; } int borrow_book(char (*info)[3][101], int* row, int* borrowed) { //책을 빌리는 기능. // 구현 기능 : 대출 상태 추가 (0 : 대출 가능, 1 : 대출 불가) 판단 int index, i; char title[101]; printf("대여하실 도서의 제목을 입력하세요 : "); fgets(title, 100, stdin); title[strcspn(title, "\n")] = '\0'; /* 1. info 에서 해당 제목과 같은 것의 인덱스 찾기 2. borrowed 배열에서 index에 해당하는 값 판단 */ for (index = 0; index < *row; index++) { i = 0; while (title[i] && info[index][0][i] == title[i]) { i++; } if (!(title[i])) { if (!(borrowed[index])) { printf("대출 도서 정보 : "); for (int i = 0; i < 3; i++) { printf("%s", info[index][i]); if (i != 2) printf(", "); } printf("\n"); borrowed[index] = 1; } else printf("대출 불가능한 도서입니다.\n"); return 0; } if (index == *row - 1) printf("해당 도서는 존재하지 않습니다.\n"); } return 0; } int return_book(char (*info)[3][101], int *row, int *borrowed) { //책을 반납하는 기능 int index, i; char title[101]; printf("반납하실 책의 제목을 입력해주세요 : "); fgets(title, 100, stdin); title[strcspn(title, "\n")] = '\0'; for (index = 0; index < *row; index++) { i = 0; while (title[i] && info[index][0][i] == title[i]) { i++; } if (!(title[i])) { if (borrowed[index]) { printf("반납한 도서 정보 : "); for (i = 0; i < 3; i++) { printf("%s", info[index][i]); if (i != 2) printf(", "); } printf("\n"); borrowed[index] = 0; } else printf("대출되지 않은 도서입니다.\n"); return 0; } if (index == *row - 1) printf("해당 도서는 존재하지 않습니다.\n"); } return 0; }
진용범 03.08
이서진 03.06