<C언어 2학기 중간고사 대비 정리본(기초)>
범위: 10장~13장 구조체
배열 | 동일한 데이터 타입을 연속된 메모리 공간에 저장하는 자료 구조. 예를 들어 int scores[60]; 은 60개의 정수 값을 저장한다. 각 배열 요소는 인덱스를 통해 접근이 가능하며, 인덱스는 0부터 시작함. |
|
배열의 초기화 | 배열은 선언과 동시에 초기화 가능. 초기값을 지정하지 않으면 배열 요소는 쓰레기 값을 가짐. | int scores[5]={10,20,30,40,50}; |
배열의 크기 및 인덱스 | 배열의 크기는 sizeof 연산자를 사용해 계산 가능. 배열의 인덱스는 정수 값 또는 수식을 사용해 계산 가능. |
int size=sizeof(scores)/sizeof(scores[0]); |
배열 사용 예시 | 배열의 값을 입력받아 평균을 계산하는 프로그램>> | #include <stdio.h> #define STUDENTS 10 int main(void){ int scores[STUDENTS], sum=0, average; for (int i-0; i<STUDENTS; i++){ scanf("%d", &scores[i]); } for (int i=0; i<STUDENTS; i++) sum+=scores[i]; average=sum/STUDENTS; printf("성적 평균=%d\\n", average); return 0; } |
배열의 오류 | 배열의 크기를 초과하여 접근하면 치명적인 오류가 발생함. | scores[5] = 60; // 배열 크기가 5인데 인덱스가 5에 접근하면 오류 발생 |
다차원 배열 | 2차원 또는 3차원 배열을 선언하여 여러 개의 값을 저장 가능. | int matrix[3][5]; // 3x5 크기의 2차원 배열 |
배열의 함수 인수 전달 |
배열은 함수에 전달될 때 배열의 주소가 전달됨. | int get_average(int scores[], int n) { int sum = 0; for (int i = 0; i < n; i++) sum += scores[i]; return sum / n; } |
2차원 배열을 사용한 좌석 예약 프로그램 |
#include <stdio.h> #define SIZE 10 int main(void) { int seats[SIZE] = {0}; int ans; printf("몇 번째 좌석을 예약하시겠습니까? "); scanf("%d", &ans); if (seats[ans - 1] == 0) { seats[ans - 1] = 1; printf("예약되었습니다.\\n"); } else { printf("이미 예약된 자리입니다.\\n"); } return 0; } |
|
배열의 정렬 및 탐색 | 배열 내에서 최소값을 찾는 방법: | int minimum = prices[0]; for (int i = 1; i < SIZE; i++) { if (prices[i] < minimum) minimum = prices[i]; } |
포인터의 개념 | 포인터란?: 변수의 주소를 저장하는 변수. 포인터의 선언: 포인터는 ``를 사용하여 선언하며, 특정 타입을 가리키도록 명시 |
int *p; // 정수형 포인터 선언 |
포인터와 변수 | 포인터는 특정 변수의 주소를 저장하고, & 연산자를 사용하여 변수의 주소를 포인터에 대입함. | int i = 10; int *p = &i; // i의 주소를 포인터 p에 저장 |
간접 참조 연산자 |
포인터는 * 연산자를 통해 해당 주소에 있는 변수의 값을 참조 가능. | printf("%d", *p); // 포인터 p가 가리키는 변수 i의 값을 출력 |
포인터의 사용 예시 | 포인터를 사용하여 변수의 값을 간접적으로 변경 가능. | int i = 10; int *p = &i; *p = 20; // i의 값이 20으로 변경됨 |
NULL 포인터 | 포인터는 초기화되지 않으면 예기치 않은 동작을 할 수 있으므로, 초기값으로 NULL을 지정하는 것이 안전함. | int *p = NULL; |
포인터 연산 | 포인터는 증감 연산을 통해 메모리 주소를 이동 가능. 데이터 타입에 따라 이동 크기가 달라짐. | char *pc = (char *)10000; int *pi = (int *)10000; printf("pc+1 = %u, pi+1 = %u\\n", pc+1, pi+1); // char은 1바이트, int는 4바이트 이동 |
포인터와 배열 | 배열의 이름은 배열의 첫 번째 요소의 주소를 가리키는 포인터임따라서 배열과 포인터는 밀접한 관계를 가지고 있음. | int a[] = {10, 20, 30}; int *p = a; // p는 a[0]의 주소를 가리킴 printf("%d", *(p+1)); // a[1]의 값을 출력 |
포인터와 함수 | 배열은 함수에 포인터로 전달됨. 배열의 원본을 수정하려면 포인터를 사용하여 전달. | void modify(int *arr, int size) { for (int i = 0; i < size; i++) { arr[i] += 1; } } |
포인터를 사용한 값 교환(swap) |
포인터를 사용하여 함수 내에서 변수의 값을 교환함. | void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } |
포인터와 다차원 배열 | 다차원 배열도 포인터를 사용하여 다룰 수 있으며, 배열의 각 요소에 포인터 연산을 통해 접근이 가능. | int matrix[3][3]; int *p = &matrix[0][0]; // 다차원 배열의 첫 번째 요소의 주소를 가리킴 |
포인터와 함수의 관계 |
포인터는 함수와 함께 사용되어 함수 호출 시 변수의 원본 수정 가능. | void sub(int *b) { *b = 5; // 포인터를 통해 b가 가리키는 값 변경 } |
문자열의 개념 | 문자열은 문자(char)의 배열로 끝에 \0(NULL문자)을 붙여 문자열의 끝을 표시함. | |
문자열 선언 및 초기화 | 문자열 선언 방법: char str1[] = "Hello"; char str2[6] = "World"; // 문자열의 크기는 문자 수 + 1 |
문자 배열에 수동 초기화: char str[4] = { 'a', 'b', 'c', '\\0' }; |
문자열 출력 | 문자열을 출력할 때는 %s 형식 지시자를 사용함. | printf("%s", str); |
문자열 처리 | 문자열의 각 문자는 배열처럼 인덱스를 사용하여 접근 가능. - 예: str[0], str[1] 등. |
|
문자열의 길이 계산 |
문자열의 길이를 계산하려면 \0문자가 나올 때까지 반복하여 각 문자를 세면 됨. | int length = 0; while(str[length] != '\\0') length++; printf("문자열 길이: %d", length); |
문자열 복사 | Strcpy 함수를 사용하여 문자열을 다른 배열에 복사 가능. | |
문자열 연결 | Strcat 함수를 사용하여 두 문자열을 연결. | |
문자열 비교 | Strcmp 함수는 두 문자열을 사전 순으로 비교. | |
문자 검색 | Strchr 함수는 문자열 내에서 특정 문자를 찾음. | |
문자열 검색 | Strstr 함수를 사용하여 문자열 내에서 부분 문자열을 검색함. | |
문자열 토큰화 | Strtok 함수를 사용해 문자열을 공백 또는 특정 구분자로 분리 가능. | char str[] = "Hello World C Programming"; char *token = strtok(str, " "); while (token != NULL) { printf("%s\\n", token); token = strtok(NULL, " "); } |
Sprintf와 sscanf함수 |
sprintf함수: 값을 문자열로 변환하여 저장함. char buffer[50]; int x = 10; sprintf(buffer, "값은 %d입니다.", x); |
sscanf함수: 문자열을 분석하여 값을 추출함. char str[] = "file 12"; char name[10]; int number; sscanf(str, "%s %d", name, &number); |
문자 처리 함수 | 문자 처리 함수 isalpha, isdigit, toupper, tolower 등을 사용하여 문자가 알파벳인지 숫자인지 또는 대문자, 소문자 변환 등을 할 수 있음. | if (isalpha(c)) { // c가 알파벳인지 확인 c = toupper(c); // c를 대문자로 변환 } |
문자열 암호화 프로그램 | 시저 암호와 같은 방법을 이용해 문자열을 암호화할 수 있음. | void encrypt(char str[], int shift) { for (int i = 0; str[i] != '\\0'; i++) { if (str[i] >= 'a' && str[i] <= 'z') { str[i] += shift; if (str[i] > 'z') str[i] -= 26; } } printf("암호화된 문자열: %s\\n", str); } |
구조체의 정의와 필요성 | 구조체는 여러 개의 서로 다른 데이터 타입을 하나로 묶을 수 있는 사용자 정의 자료형임. 예를 들어, 학생의 학번, 이름, 성적을 각각의 변수로 정의하는 대신 구조체를 사용하여 하나의 그룹으로 묶을 수 있음. |
|
구조체 선언 | 구조체는 struct키워드를 사용해 선언함. Struct 뒤에 구조체 이름과 중괄호로 멤버 변수를 정의함. |
struct student { int number; char name[10]; double grade; }; |
구조체 변수 선언 및 사용 |
구조체 변수 선언과 멤버 접근에는 .연산자 사용. printf함수로 멤버 값 출력 가능.>> |
printf("학번: %d\\n", s1.number); printf("이름: %s\\n", s1.name); printf("학점: %.2f\\n", s1.grade); |
구조체 배열 | 구조체 배열은 동일한 구조체 타입의 변수를 연속적으로 저장 가능함. 배열을 사용하여 여러 명의 학생 정보를 저장하고 관리할 수 있음. | struct student list[3] = { {1, "Park", 3.42}, {2, "Kim", 4.31}, {3, "Lee", 2.98}}; |
구조체와 포인터 | 구조체의 포인터는 구조체 변수를 가리키는 포인터로 사용 가능. 포인터 연산자 ->를 사용해 포인터가 가리키는 구조체의 멤버에 접근이 가능함. |
struct student *p; p = &s1; printf("학번: %d, 이름: %s, 학점: %.2f\\n", p->number, p->name, p->grade); |
구조체 중첩 | 구조체 안에 다른 구조체를 포함 가능함. | struct date { int year; int month; int day; }; struct student { int number; char name[20]; struct date dob; // 중첩된 구조체 double grade; }; |
'2024-소프트웨어과 1학년 > C언어' 카테고리의 다른 글
C언어 9~12장 정리 pdf (0) | 2024.10.07 |
---|---|
C언어 9장 (1) | 2024.10.07 |
2학기 중간고사 대비 자료 C언어[지속 업데이트] (1) | 2024.09.26 |
[C언어]7장 반복문 (1) | 2024.09.10 |
[C언어]6장_조건문 (0) | 2024.09.10 |