2024-소프트웨어과 1학년/C언어

C언어 중간고사 대비 정리본. 10장 배열~13장 구조체

simless786-it 2024. 10. 21. 00:45

<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