목록C언어 (20)
사이먼's 코딩노트
[Linked List] 문제 하나를 통해 링크드리스트에 대해서 살펴봅시다. 문제의 목표는 구조체로 선언된 사람들을 서로 연결하여 하나의 리스트로 만들고 반복문으로 순회하는 프로그램을 구현하는 것입니다. 문제 접근법은 아래의 여러가지 절차로 나눠 진행할 수 있습니다. 1단계 : 사람 구조체 생성 (개인의 구성요소는 이름, 나이, 사람의 위치) 2단계 : 사람 3명 생성 (구조체 변수 선언) 3단계 : 사람 3명 세팅 (이름, 나이, 위치 지정) 4단계 : 1번째 사람이 2번째 사람의 위치를 기억하고 2번째 사람이 3번째 사람의 위치를 기억 5단계 : 3번째 사람의 위치에는 NULL을 저장 6단계 : 반복문을 통해 3명의 이름과 나이를 출력 7단계 : 현재 작업중인 사람의 위치 변수에 NULL이 나올때 까..
이번에는 여지껏 배운 구조체와 동적할당에 관한 문제를 풀어봅시다. 문제는 다음과 같습니다. 사용자는 사람의 수, 해당 사람의 이름과 나이를 입력하고 입력받은 만큼 저장하여 각 사람의 이름과 나이를 출력한다. 우리는 총 3가지의 버전으로 해당 프로그램을 구현해봅시다. 프로그램 실행 시 출력문의 예시는 아래와 같습니다. 사람의 숫자를 입력해주세요. : 3[엔터] 1번째 사람의 이름을 입력해주세요 : aa[엔터] 1번째 사람의 나이를 입력해주세요 : 33[엔터] 2번째 사람의 이름을 입력해주세요 : bb[엔터] 2번째 사람의 나이를 입력해주세요 : 50[엔터] 3번째 사람의 이름을 입력해주세요 : cc[엔터] 3번째 사람의 나이를 입력해주세요 : 42[엔터] 1번째 사람의 이름, 나이 : aa, 33세 2번째..
이번 시간에는 메모리를 효율적으로 사용하지 위해서 할당에 대해서 배워봅시다. [정적 할당] #include int main(){ int arr[5]; arr[0] = 1; arr[1] = 3; arr[2] = 5; arr[3] = 7; arr[4] = 9; } 위 코드는 최초에 arr 배열을 5칸으로 지정하여 선언하였다. 해당 프로그램이 실행되면 자동으로 메모리가 스택 지역에서 할당되며, 크기는 총 28바이트를 가진다. 스택 지역은 지금과 같이 사용자가 배정한 칸 수 만큼 고정된 구역만 할당받을 수 있다. 정적 할당의 단점은 프로그램 실행 중에도 배열의 공간을 변경할 수 없다. 또한 필요한 메모리 양을 잘못 계산해서 크게 할당받으면 메모리 낭비가 생긴다. 정적 할당의 장점은 프로그램 시작과 동시에 자동으..
[구조체] 구조체(structure type)란 사용자가 C언어의 기본 타입을 가지고 새롭게 정의할 수 있는 사용자 정의 타입이다. 구조체는 기본 타입(char, int, double, float 등)으로 나타낼 수 없는 복잡한 데이터를 표현할 수 있다. 배열이 같은 타입의 변수 집합이라고 한다면, 구조체는 다양한 타입의 변수 집합을 하나의 타입으로 나타낸 것이다. 간단하게 말해 구조체는 하나의 설계도를 의미한다고 생각하면 된다. 아래는 구조체를 사용하기 전 통상적으로 우리가 사용하는 코드이다. #include "stdio.h" void introduce(int age, char* name, char* hometown, char* favorite_food, char* hobby); void talk(in..
이번에는 포인터, 배열과 문자열의 심화된 문제를 풀어봅시다. [문제 1] 다음은 문자열이 특정 문자열로 시작하는 지 검사하는 함수를 구현해보세요. #include typedef int bool; #define true 1 #define false 0 int get_str_len(char* str) { for ( int i = 0; true; i++ ) { if ( str[i] == '\0' ) { return i; } } } bool starts_with(char* str, char* start) { int str_len = get_str_len(str); int start_len = get_str_len(start); if(start_len > str_len) { return false; } for(i..
이번에는 여지껏 배운 포인터, 배열과 문자열, 공공재 지역에 관한 문제들을 풀어봅시다. [문제 1] 변수 str1, str2, str4의 값이 같은 이유를 설명하세요. #include int main(void) { char* str1 = "abc"; printf("str1 : %ld\n", (long)str1); char* str2 = "abc"; printf("str2 : %ld\n", (long)str2); char* str3 = "abcd"; printf("str3 : %ld\n", (long)str3); char* str4 = "abc"; printf("str4 : %ld\n", (long)str4); char str5[10] = "abc"; printf("str5 : %ld\n", (long)s..
[공공재 지역] [case #1] #include int main() { char* str1 = "abc"; char* str2 = "abcd"; char* str3 = "abc"; printf("str1 : %ld\n", (long)str1); printf("str2 : %ld\n", (long)str2); printf("str3 : %ld\n", (long)str3); return 0; } 위 코드에서 str1은 4바이트 짜리 '문자열(문자배열)' 상수를 생성한다. 단, 해당 문자열 abc는 '공공재'만 저장되는 메모리의 특수한 구역에 저장된다. '공공재' 라고 표현한 이유는 "abc"는 2번 이상 쓸 때부터는 문자열이 새로 생성되지 않고 기존에 생성된 배열의 시작 주소를 리턴하기 때문이다. 실제로 ..
[define과 typedef] C언어에는 헤더파일을 포함하는 #include 외에 사용자가 임의로 프로그램 내에서 정의할 수 있는 #define이 있다. 또한 C언어에는 각 자료형 타입을 사용자가 임의로 정의할 수 있는 typedef가 있다. 아래는 #define과 typedef를 이용해 boolean이라는 타입이 없는 C언어에서 true, false를 사용할 수 있는 코드이다. #include #define false 0 #define true 1 typedef int bool; int main(void) { bool is_even = false; while ( is_even ) { } while ( false ) { } while ( true ) { printf("true는 1 이다.\n"); br..
[scanf] 출력문을 사용하는 문법을 printf 라고 하면 키보드 입력을 위한 문법은 scanf이다. C언어는 기본적으로 #include 라는 헤더파일을 포함하고 이 때 stdio.h는 표준 입출력을 의미한다. 아래는 scanf의 가장 기본적인 구조이다. #pragma warning(disable: 4996) #include int main() { int input; printf("정수를 입력해주세요. : "); scanf("%d", &input); printf("입력하신 수는 %d 입니다.\n", input); return 0; } 사용자가 키보드로 입력한 정수를 input에 넣어주는 일을 해주는 scanf는 일종의 외부 대행업체라고 생각할 수 있다. scanf는 입력받은 값을 어디에 넣어줄 지 사..
[배열] 아래는 배열의 형태를 코드로 작성한 것이고 포인터와 유사한 점을 찾아봅시다. #include int main(void) { int arr[2000]; int arr1[3] = {1, 2, 3}; int *p = arr1 + 1; printf("%d\n", p[0] + p[1]); return 0; } 위 코드와 같이 배열의 생김새는 [ ] 와 같다. arr이라는 배열 공간에 총 int 타입의 2000개의 변수, 8000 바이트를 관리한다는 뜻이다. arr은 포인터에서의 주소와도 같은 의미로써 한 공간에 메모리 크기가 무조건 8바이트 이다. 포인터에서 * 가 해당 주소로 간다 라는 의미였다면 배열에서는 [ ] 가 그와 같은 의미가 담겨있다. arr1변수와 같이 배열은 항상 배열 중 가장 첫번째 자..