C 언어 배열 요소 조작

CBeginner
지금 연습하기

소개

이 랩에서는 C 프로그래밍에서 배열 요소를 조작하는 방법을 배우게 됩니다. 이 랩은 배열 선언 및 초기화, 배열 요소 접근 및 수정, 배열 반복, 배열 계산 수행, 그리고 동적 배열 메모리 할당과 같은 기본적인 기술을 다룹니다. 특정 값으로 배열을 선언하고 초기화하는 방법, 부분적으로 배열을 초기화하는 방법, 그리고 배열 요소에 동적으로 값을 할당하는 방법을 포함하여 배열 작업에 대한 다양한 기술을 탐구할 것입니다. 이 랩을 마치면 C 에서 배열 데이터 구조를 효과적으로 관리하고 조작하는 방법에 대한 확실한 이해를 갖게 될 것입니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 중급 레벨의 실험이며 완료율은 80%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

배열 선언 및 초기화

이 단계에서는 C 프로그래밍에서 배열을 선언하고 초기화하는 방법을 배우게 됩니다. 배열은 동일한 유형의 여러 요소를 연속적인 메모리 위치에 저장할 수 있게 해주는 기본적인 데이터 구조입니다.

배열 선언 및 초기화를 탐구하기 위해 새로운 C 파일을 만들어 보겠습니다.

cd ~/project
touch array_basics.c

이제 배열을 선언하고 초기화하는 다양한 방법을 보여주는 프로그램을 작성해 보겠습니다.

#include <stdio.h>

int main() {
    // 방법 1: 특정 값으로 배열을 선언하고 초기화
    int numbers[5] = {10, 20, 30, 40, 50};

    // 방법 2: 배열을 선언하고 나중에 초기화
    int scores[3];
    scores[0] = 85;
    scores[1] = 92;
    scores[2] = 78;

    // 방법 3: 배열을 부분적으로 초기화 (나머지 요소는 0 으로 설정)
    int grades[4] = {100, 95};

    // 초기화를 확인하기 위해 배열을 출력
    printf("Numbers array: ");
    for (int i = 0; i < 5; i++) {
        printf("%d ", numbers[i]);
    }
    printf("\n");

    printf("Scores array: ");
    for (int i = 0; i < 3; i++) {
        printf("%d ", scores[i]);
    }
    printf("\n");

    printf("Grades array: ");
    for (int i = 0; i < 4; i++) {
        printf("%d ", grades[i]);
    }
    printf("\n");

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc array_basics.c -o array_basics
./array_basics

예시 출력:

Numbers array: 10 20 30 40 50
Scores array: 85 92 78
Grades array: 100 95 0 0

배열 초기화 방법을 자세히 살펴보겠습니다.

  1. int numbers[5] = {10, 20, 30, 40, 50};

    • 5 개의 요소를 가진 정수 배열을 선언합니다.
    • 모든 요소를 특정 값으로 초기화합니다.
    • 크기는 초기화 목록의 요소 수에 의해 결정됩니다.
  2. int scores[3]; 다음에 개별 요소 할당

    • 먼저 배열을 선언합니다.
    • 나중에 개별 요소에 값을 할당합니다.
    • 값을 동적으로 설정하려는 경우 유용합니다.
  3. int grades[4] = {100, 95};

    • 배열을 부분적으로 초기화합니다.
    • 지정되지 않은 요소는 자동으로 0 으로 설정됩니다.
    • 일부 초기 값만 설정하려는 경우 시간을 절약하는 데 도움이 됩니다.

기억해야 할 주요 사항:

  • 배열 인덱스는 0 부터 시작합니다.
  • 배열이 저장할 요소의 유형을 지정해야 합니다.
  • 배열은 선언되면 고정된 크기를 갖습니다.
  • 항상 선언된 크기를 초과하여 배열 요소에 접근하지 않도록 하십시오.

배열 요소 접근 및 수정

이 단계에서는 C 프로그래밍에서 배열의 개별 요소에 접근하고 수정하는 방법을 배우게 됩니다. 이전 단계를 기반으로, 인덱싱을 사용하여 배열 요소와 상호 작용하는 방법과 배열 내용을 조작하는 다양한 방법을 탐구할 것입니다.

배열 요소에 접근하고 수정하는 연습을 하기 위해 새로운 C 파일을 만들어 보겠습니다.

cd ~/project
touch array_access.c

이제 배열 요소 접근 및 수정을 보여주는 프로그램을 작성해 보겠습니다.

#include <stdio.h>

int main() {
    // 배열 선언 및 초기화
    int temperatures[5] = {72, 68, 75, 80, 65};

    // 개별 배열 요소에 접근
    printf("First temperature: %d\n", temperatures[0]);
    printf("Third temperature: %d\n", temperatures[2]);

    // 배열 요소 수정
    temperatures[1] = 70;  // 두 번째 요소 변경
    temperatures[4] = 73;  // 마지막 요소 변경

    // 수정된 배열 출력
    printf("Modified temperatures: ");
    for (int i = 0; i < 5; i++) {
        printf("%d ", temperatures[i]);
    }
    printf("\n");

    // 배열 요소 계산 시연
    int average = (temperatures[0] + temperatures[1] + temperatures[2] +
                   temperatures[3] + temperatures[4]) / 5;
    printf("Average temperature: %d\n", average);

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc array_access.c -o array_access
./array_access

예시 출력:

First temperature: 72
Third temperature: 75
Modified temperatures: 72 70 75 80 73
Average temperature: 74

주요 개념을 자세히 살펴보겠습니다.

  1. 배열 인덱싱 (Array Indexing)

    • 배열은 0 기반 인덱싱을 사용하여 접근합니다.
    • temperatures[0]은 첫 번째 요소를 나타냅니다.
    • temperatures[4]는 5 개의 요소 배열에서 마지막 요소를 나타냅니다.
  2. 배열 요소 수정 (Modifying Array Elements)

    • 개별 요소는 해당 인덱스를 사용하여 직접 변경할 수 있습니다.
    • temperatures[1] = 70;은 두 번째 요소를 70 으로 바꿉니다.
    • 유효한 모든 인덱스에서 요소를 수정할 수 있습니다.
  3. 배열 요소 계산 (Array Element Calculations)

    • 개별 배열 요소를 사용하여 계산을 수행할 수 있습니다.
    • 예제에서는 평균 온도를 계산했습니다.
    • 수학적 연산에서 인덱스를 통해 요소에 직접 접근합니다.

피해야 할 일반적인 함정:

  • 배열 범위를 벗어나는 인덱스에 절대 접근하지 마십시오.
  • 배열 인덱스는 1 이 아닌 0 부터 시작합니다.
  • 배열의 선언된 크기를 초과하지 않도록 주의하십시오.

배열 순회 (반복)

이 단계에서는 C 프로그래밍에서 배열을 반복하는 다양한 방법을 배우게 됩니다. 반복은 배열 요소를 효율적으로 처리하고 배열 내용에 대한 다양한 작업을 수행하는 데 매우 중요합니다.

배열 반복 기술을 탐구하기 위해 새로운 C 파일을 만들어 보겠습니다.

cd ~/project
touch array_iteration.c

이제 배열을 반복하는 여러 가지 방법을 보여주는 프로그램을 작성해 보겠습니다.

#include <stdio.h>

int main() {
    // 학생 점수의 배열을 선언하고 초기화합니다.
    int scores[6] = {85, 92, 78, 90, 88, 95};
    int total = 0;

    // 방법 1: 표준 for 루프 사용
    printf("Method 1 - Standard For Loop:\n");
    for (int i = 0; i < 6; i++) {
        printf("Score %d: %d\n", i + 1, scores[i]);
        total += scores[i];
    }

    // 평균 계산 및 출력
    float average = (float)total / 6;
    printf("\nTotal Score: %d\n", total);
    printf("Average Score: %.2f\n", average);

    // 방법 2: 역방향 반복
    printf("\nMethod 2 - Reverse Iteration:\n");
    printf("Scores in reverse order:\n");
    for (int i = 5; i >= 0; i--) {
        printf("Score %d: %d\n", i + 1, scores[i]);
    }

    // 방법 3: while 루프 반복
    printf("\nMethod 3 - While Loop Iteration:\n");
    int j = 0;
    while (j < 6) {
        if (scores[j] >= 90) {
            printf("High score detected: %d\n", scores[j]);
        }
        j++;
    }

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc array_iteration.c -o array_iteration
./array_iteration

예시 출력:

Method 1 - Standard For Loop:
Score 1: 85
Score 2: 92
Score 3: 78
Score 4: 90
Score 5: 88
Score 6: 95

Total Score: 528
Average Score: 88.00

Method 2 - Reverse Iteration:
Scores in reverse order:
Score 6: 95
Score 5: 88
Score 4: 90
Score 3: 78
Score 2: 92
Score 1: 85

Method 3 - While Loop Iteration:
High score detected: 92
High score detected: 90
High score detected: 95

주요 반복 기술:

  1. 표준 For 루프

    • 배열 반복에 가장 일반적인 방법
    • 인덱스에 대한 정확한 제어를 허용합니다.
    • 순방향 처리에 이상적입니다.
  2. 역방향 반복

    • 마지막 요소에서 첫 번째 요소까지 반복합니다.
    • 특정 처리 요구 사항에 유용합니다.
    • 내림차순 루프 카운터를 사용합니다.
  3. While 루프 반복

    • 유연한 반복 제어를 제공합니다.
    • 조건부 처리를 포함할 수 있습니다.
    • 복잡한 반복 로직에 유용합니다.

중요한 반복 원칙:

  • 항상 명확한 루프 경계를 정의합니다.
  • 배열 길이를 사용하여 범위를 벗어난 접근을 방지합니다.
  • 특정 작업에 가장 적합한 반복 방법을 선택합니다.

배열 계산 수행 (합계, 최대값 등)

이 단계에서는 C 프로그래밍에서 배열에 대한 다양한 계산을 수행하는 방법을 배우게 됩니다. 최대값과 최소값 찾기, 합계, 평균 계산, 배열 요소에 수학적 변환 적용과 같은 기술을 탐구할 것입니다.

배열 계산을 연습하기 위해 새로운 C 파일을 만들어 보겠습니다.

cd ~/project
touch array_calculations.c

이제 다양한 배열 계산 기술을 보여주는 프로그램을 작성해 보겠습니다.

#include <stdio.h>
#include <limits.h>

int main() {
    // 판매 데이터의 배열을 선언하고 초기화합니다.
    int sales[7] = {1200, 1500, 980, 1750, 1100, 1300, 1600};

    // 총 판매액 계산
    int total_sales = 0;
    for (int i = 0; i < 7; i++) {
        total_sales += sales[i];
    }
    printf("Total Weekly Sales: $%d\n", total_sales);

    // 평균 판매액 계산
    float average_sales = (float)total_sales / 7;
    printf("Average Daily Sales: $%.2f\n", average_sales);

    // 최대 판매액 찾기
    int max_sales = sales[0];  // 첫 번째 요소로 시작
    for (int i = 1; i < 7; i++) {
        if (sales[i] > max_sales) {
            max_sales = sales[i];
        }
    }
    printf("Highest Daily Sales: $%d\n", max_sales);

    // 최소 판매액 찾기
    int min_sales = sales[0];  // 첫 번째 요소로 시작
    for (int i = 1; i < 7; i++) {
        if (sales[i] < min_sales) {
            min_sales = sales[i];
        }
    }
    printf("Lowest Daily Sales: $%d\n", min_sales);

    // 백분율 증가 적용
    float increase_percentage = 1.1;  // 10% 증가
    printf("\nSales After 10%% Increase:\n");
    for (int i = 0; i < 7; i++) {
        float increased_sale = sales[i] * increase_percentage;
        printf("Day %d: $%.2f\n", i + 1, increased_sale);
    }

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc array_calculations.c -o array_calculations
./array_calculations

예시 출력:

Total Weekly Sales: $9430
Average Daily Sales: $1347.14
Highest Daily Sales: $1750
Lowest Daily Sales: $980

Sales After 10% Increase:
Day 1: $1320.00
Day 2: $1650.00
Day 3: $1078.00
Day 4: $1925.00
Day 5: $1210.00
Day 6: $1430.00
Day 7: $1760.00

주요 배열 계산 기술:

  1. 총 계산

    • 루프를 사용하여 모든 배열 요소를 합산합니다.
    • 별도의 변수에 값을 누적합니다.
    • 총 합계를 찾는 데 유용합니다.
  2. 평균 계산

    • 총 합계를 요소 수로 나눕니다.
    • 부동 소수점 정밀도를 위해 유형 캐스팅을 사용합니다.
    • 배열 요소의 평균값을 제공합니다.
  3. 최대/최소값 찾기

    • 첫 번째 배열 요소로 초기화합니다.
    • 각 후속 요소를 비교합니다.
    • 새로운 극값이 발견되면 최대/최소값을 업데이트합니다.
  4. 요소별 변환

    • 각 요소에 수학적 연산을 적용합니다.
    • 특정 규칙에 따라 배열 값을 수정할 수 있습니다.
    • 데이터의 스케일링, 조정 또는 변환에 유용합니다.

중요한 계산 원칙:

  • 항상 배열 범위를 고려합니다.
  • 적절한 데이터 유형을 사용합니다.
  • 정수 나눗셈에 주의합니다.
  • 계산 전에 누산기 변수를 초기화합니다.

동적 배열 메모리 할당

이 단계에서는 C 프로그래밍에서 malloc(), realloc(), free() 함수를 사용하여 배열에 대한 메모리를 동적으로 할당하는 방법을 배우게 됩니다. 동적 메모리 할당을 사용하면 런타임에 크기가 결정되는 배열을 만들 수 있습니다.

동적 메모리 할당을 탐구하기 위해 새로운 C 파일을 만들어 보겠습니다.

cd ~/project
touch dynamic_array.c

이제 동적 배열 메모리 할당을 보여주는 프로그램을 작성해 보겠습니다.

#include <stdio.h>
#include <stdlib.h>

int main() {
    // 정수 배열에 대한 동적 메모리 할당
    int array_size;
    printf("Enter the number of elements: ");
    scanf("%d", &array_size);

    // 메모리 동적 할당
    int *dynamic_array = (int *)malloc(array_size * sizeof(int));

    // 메모리 할당이 성공했는지 확인
    if (dynamic_array == NULL) {
        printf("Memory allocation failed!\n");
        return 1;
    }

    // 배열 요소 입력
    printf("Enter %d integers:\n", array_size);
    for (int i = 0; i < array_size; i++) {
        printf("Element %d: ", i + 1);
        scanf("%d", &dynamic_array[i]);
    }

    // 배열 요소 출력
    printf("\nArray elements:\n");
    for (int i = 0; i < array_size; i++) {
        printf("%d ", dynamic_array[i]);
    }
    printf("\n");

    // 배열 크기를 동적으로 조정
    int new_size;
    printf("\nEnter new array size: ");
    scanf("%d", &new_size);

    // 메모리 재할당
    int *resized_array = (int *)realloc(dynamic_array, new_size * sizeof(int));

    // 재할당이 성공했는지 확인
    if (resized_array == NULL) {
        printf("Memory reallocation failed!\n");
        free(dynamic_array);
        return 1;
    }

    dynamic_array = resized_array;

    // 새 크기가 더 크면 새 요소 초기화
    if (new_size > array_size) {
        for (int i = array_size; i < new_size; i++) {
            dynamic_array[i] = 0;
        }
    }

    // 크기가 조정된 배열 출력
    printf("Resized array:\n");
    for (int i = 0; i < new_size; i++) {
        printf("%d ", dynamic_array[i]);
    }
    printf("\n");

    // 동적으로 할당된 메모리 해제
    free(dynamic_array);

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc dynamic_array.c -o dynamic_array
./dynamic_array

예시 상호 작용:

Enter the number of elements: 3
Enter 3 integers:
Element 1: 10
Element 2: 20
Element 3: 30

Array elements:
10 20 30

Enter new array size: 5
Resized array:
10 20 30 0 0

주요 동적 메모리 할당 개념:

  1. malloc() 함수

    • 요청된 메모리를 할당하고 포인터를 반환합니다.
    • 구문: pointer = (type *)malloc(size * sizeof(type))
    • 성공적인 할당을 위해 항상 NULL 을 확인합니다.
  2. realloc() 함수

    • 이전에 할당된 메모리 블록의 크기를 조정합니다.
    • 배열 크기를 늘리거나 줄일 수 있습니다.
    • 확장 시 기존 데이터를 보존합니다.
  3. free() 함수

    • 동적으로 할당된 메모리를 해제합니다.
    • 메모리 누수를 방지합니다.
    • malloc()/realloc() 할당에 대해 호출해야 합니다.

중요한 메모리 할당 원칙:

  • 항상 할당 성공 여부를 확인합니다.
  • 더 이상 필요하지 않은 경우 동적으로 할당된 메모리를 해제합니다.
  • 배열 크기를 조정할 때 주의합니다.
  • 잠재적인 할당 실패를 적절하게 처리합니다.

요약

이 랩에서는 C 프로그래밍에서 배열을 선언하고 초기화하는 방법, 배열 요소에 접근하고 수정하는 방법, 배열을 반복하는 방법, 배열 계산을 수행하는 방법, 그리고 배열 메모리를 동적으로 할당하는 방법을 배웠습니다. 값을 직접 지정하고, 나중에 값을 할당하고, 배열을 부분적으로 초기화하는 것을 포함하여 배열을 선언하고 초기화하는 다양한 방법을 탐구했습니다. 또한 배열의 내용을 인쇄하여 초기화를 확인하는 방법도 배웠습니다. 이러한 기본적인 배열 연산은 C 에서 데이터 구조를 다루는 데 필수적이며, 더 복잡한 배열 조작을 위한 구성 요소가 됩니다.