본문 바로가기
c/자습

배열(쉽게 풀어쓴 C언어 EXPRESS)

by 지트리아 2023. 1. 1.

용어정리

 

 

 

 

본문정리

배열이란?

배열이란 동일한 타입의 데이터가 여러 개 저장되어 있는 데이터 저장 장소이다. 

메모리 연속적인 공간에 저장되고 서로 관련된 데이터를 차례로 접근하여서 처리할 수 있다. 반복문을 사용하여서 배열의 요소를 간편하게 처리할 수 있다.

 

배열의 초기화

초기값을 부여하는 것이 원칙이다.

개수를 구하는 방식은 sizeof(배열명) / sizeof(배열 첫번째 요소) 이다. 

 

배열과 함수

배열은 원본이 매개 변수를 통하여 전달된다. 배열 요소복사본이 전달된다.

배열의 원본을 훼손시키고 싶지 않다면 매개변수에 const를 붙이면 된다. 

 

정렬

선택 정렬은 가장 작은 수를 가장 왼쪽과 바꾸는 방식이다. 

 

탐색

순차 탐색배열의 원소를 순서대로 하나씩 꺼내서 탐색키와 비교하여 원하는 값을 찾아가는 방식이다.

이진 탐색중앙에 있는 값을 탐색키와 비교하여 범위를 좁혀가는 방식이다. 다만 이진 탐색은 배열이 반드시 정렬되어 있어야 한다. 

 

2차원 배열

배열은 선언 시 행의 개수, 열의 개수 순으로 기입한다. 초기화 시 안에 {}를 기입해야 한다. 

함수에서 2차원 배열을 받을 때 행의 크기는 적지 않아도 되지만 열의 크기는 적어야 한다. 

 

본문제

Q1. 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
    int days[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

    for (int i = 1; i <= 12; i++) {
        printf("%d월은 %d일까지 있습니다.\n", i, days[i - 1]);
    }

    return 0;
}

 

Q2. 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
    srand(time(NULL));
    int n[10] = {rand(),};
    int max = n[0], min = n[0];
    printf("%d\n", n[0]);
    for (int i = 1; i < 10; i++) {
        n[i] = rand();
        if (max < n[i]) {
            max = n[i];
        }
        if (min > n[i]) {
            min = n[i];
        }
        printf("%d\n", n[i]);
    }    
    
    printf("최댓값은 %d\n최솟값은 %d", max, min);

    return 0;
}

 

Q3. 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define SIZE 10

int array_equal(int a[], int b[], int size) {
    for (int i = 0; i < size; i++) {
        if (a[i] != b[i]) {
            return 0;
        }
    }
    return 1;
}

int main(void) {
    int a[SIZE] = { 1, 2, 3, 0 };
    int b[SIZE] = { 1, 2, 0 };

    if (array_equal(a, b, SIZE)) {
        printf("2개의 배열은 같음");
    }
    else {
        printf("2개의 배열은 다름");
    }

    return 0;
}

 

Q4. 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define SIZE 10

void array_copy(int a[], int b[], int size) {
    for (int i = 0; i < size; i++) {
        b[i] = a[i];
    }
    for (int i = 0; i < size; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");
    for (int i = 0; i < size; i++) {
        printf("%d ", b[i]);
    }    
}

int main(void) {
    int a[SIZE] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int b[SIZE] = { 0, };

    array_copy(a, b, SIZE);

    return 0;
}

 

Q5. 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
    srand(time(NULL));
    int result = 0, max = 0, count = -1;
    int a[10] = { 0, };

    for (int i = 0; i < 100; i++) {
        result = rand() % 10;
        switch (result) {
            case 0:
                a[0]++;
                break;
            case 1:
                a[1]++;
                break;
            case 2:
                a[2]++;
                break;
            case 3:
                a[3]++;
                break;
            case 4:
                a[4]++;
                break;
            case 5:
                a[5]++;
                break;
            case 6:
                a[6]++;
                break;
            case 7:
                a[7]++;
                break;
            case 8:
                a[8]++;
                break;
            case 9:
                a[9]++;
                break;
        }
    }

    max = a[0];
    count = 0;

    for (int i = 0; i < 10; i++) {
        if (max < a[i]) {
            max = a[i];
            count = i;
        }
        printf("%d는 %d 나옴\n", i, a[i]);
    }
    printf("가장 많이 나온수 = %d", count);

    return 0;
}

 

Q6.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define ROWS 3
#define COLS 5

int main(void) {
    int a[ROWS][COLS] = { 12, 56, 32, 16, 98, 99, 56, 34, 41, 3, 65, 3, 87, 78, 21 };
    int sum = 0;

    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            sum += a[i][j];
        }
        printf("%d행의 합계: %d\n", i, sum);
        sum = 0;
    }
    for (int j = 0; j < COLS; j++) {
        for (int i = 0; i < ROWS; i++) {
            sum += a[i][j];
        }
        printf("%d열의 합계: %d\n", j, sum);
        sum = 0;
    }

    return 0;
}

 

Q7.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define ROWS 10
#define COLS 3

int main(void) {
    int a[ROWS][COLS] = { 0, };
    int count = 0;
    
    for (int i = 0; i < ROWS; i++) {
        a[i][0] = i + 1;
        a[i][1] = (i + 1) * (i + 1);
        a[i][2] = (i + 1)* (i + 1)* (i + 1);
    }

    printf("세제곱값을 입력하시오: ");
    scanf("%d", &count);

    for (int i = 0; i < ROWS; i++) {
        if (a[i][2] == count) {
            printf("%d의 세제곱근은 %d", count, a[i][0]);
            break;
        }
    }

    return 0;
}

 

Q8.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <Math.h>

int main(void) {
    srand(time(NULL));
    int a[10] = { 0, };
    float sum = 0, avg = 0;

    for (int i = 0; i < 10; i++) {
        a[i] = rand();
        printf("a[%d] = %d\n", i, a[i]);
        sum += (float)a[i];
    }

    avg = sum / 10;

    printf("평균값은 %f입니다.\n", avg);

    for (int i = 0; i < 10; i++) {
        sum += ( (a[i] - avg) * (a[i] - avg) );
    }

    printf("표준편차는 %f입니다.\n", sqrt(sum / 10.0));

    return 0;
}

 

Q9.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
    srand(time(NULL));
    int a[10][3] = { 0, };
    int max = -1, min = -1;

    for (int i = 0; i < 10; i++) {
        printf("학번%d\t", i + 1);
        for (int j = 0; j < 3; j++) {
            a[i][j] = rand() % 100;
            printf("%d\t", a[i][j]);
        }
        printf("\n");
    }

    for (int i = 0; i < 3; i++) {
        max = -1, min = 100;
        for (int j = 0; j < 10; j++) {
            max == a[j][i], min == a[j][i];
            if (max < a[j][i]) {
                max = a[j][i];
            }
            if (min > a[j][i]) {
                min = a[j][i];
            }
        }
        printf("시험 %d에서의 최댓값 %d 최솟값 %d\n", i, max, min);
    }

    return 0;
}

 

Q10.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void vector_add(float a[], float move[]) {
    a[0] += move[0];
    a[1] += move[1];
    a[2] += move[2];
}

int main(void) {
    float a[3] = { 0, }, move[3] = { 0, };
    float x = 0, y = 0, z = 0;
    printf("현재의 값을 입력하세요(x,y,z순): ");
    scanf("%f%f%f", &x, &y, &z);
    a[0] = x, a[1] = y, a[2] = z;
    x = 0, y = 0, z = 0;
    printf("움직일 값을 입력하세요(x,y,z순): ");
    scanf(" %f%f%f", &x, &y, &z);
    move[0] = x, move[1] = y, move[2] = z;

    vector_add(a, move);

    printf("움직인 것의 위치 = {%f, %f, %f}", a[0], a[1], a[2]);

    return 0;
}

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void vector_add(float a[], float move[]) {
    a[0] *= move[0];
    a[1] *= move[1];
    a[2] *= move[2];
}

int main(void) {
    float a[3] = { 0, }, move[3] = { 0, };
    float x = 0, y = 0, z = 0;
    printf("현재의 값을 입력하세요(x,y,z순): ");
    scanf("%f%f%f", &x, &y, &z);
    a[0] = x, a[1] = y, a[2] = z;
    x = 0, y = 0, z = 0;
    printf("움직일 값을 입력하세요(x,y,z순): ");
    scanf(" %f%f%f", &x, &y, &z);
    move[0] = x, move[1] = y, move[2] = z;

    vector_add(a, move);

    printf("백터의 내적= %f", a[0] + a[1] + a[2]);

    return 0;
}

 

Q11.

 

Q12.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void scalar_mult(int a[][3], int scalar){
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            a[i][j] *= scalar;
        }
    }

}

int main(void) {
    int a[3][3] = { 0, };
    int scalar = 0, x = 0, y = 0, z = 0;

    printf("스칼라 값을 입력하라: ");
    scanf("%d", &scalar);

    printf("행렬을 입력하라: \n");
    for (int i = 0; i < 3; i++) {
        x = 0, y = 0, z = 0;
        scanf(" %d %d %d", &x, &y, &z);
        a[i][0] = x, a[i][1] = y, a[i][2] = z;
    }

    scalar_mult(a, scalar);

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }

    return 0;
}

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void scalar_mult(int a[][3], int b[][3]) {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            b[i][j] = a[j][i];
        }
    }
}

int main(void) {
    int a[3][3] = { 0, }, b[3][3] = { 0, };
    int x = 0, y = 0, z = 0;

    printf("행렬을 입력하라: \n");
    for (int i = 0; i < 3; i++) {
        x = 0, y = 0, z = 0;
        scanf(" %d %d %d", &x, &y, &z);
        a[i][0] = x, a[i][1] = y, a[i][2] = z;
    }

    scalar_mult(a, b);

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", b[i][j]);
        }
        printf("\n");
    }
    return 0;
}

 

Q13.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
    int a[32] = { 0, };
    int n = 0, count = 0;
    
    printf("정수를 입력하세요: ");
    scanf("%d", &n);

    for (int i = 0; i < 32 && n > 0; i++) {
        a[i] = n % 2;
        n = n / 2;
        if (n == 0) {
            count = i;
        }
    }
    for (int i = count; i >= 0; i--) {
        printf("%d ", a[i]);
    }

    return 0;
}

 

Q14.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
    srand(time(NULL));
    int map[11][11] = { 0, };
    int x = 5, y = 5, stop = 0;

    map[5][5] == 1;
    for (int i = 0; i < 10; i++) {
        switch (rand() % 8) {
            case 0:
                x--;
                break;
            case 1:
                x--; y++;
                break;
            case 2:
                y++;
                break;
            case 3:
                x++; y++;
                break;
            case 4:
                x++;
                break;
            case 5:
                x++; y--;
                break;
            case 6:
                y--;
                break;
            case 7:
                y--; x--;
                break;
        }
        map[x][y] = 1;
        
        scanf(" %d", &stop);

        for (int o = 0; o < 11; o++) {
            for (int p = 0; p < 11; p++) {
                if (map[o][p] == 0) {
                    printf(". ");
                }
                else if (map[o][p] == 1) {
                    printf("- ");
                }
            }
            printf("\n");
        }
    }

    return 0;
}

 

Q15.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
    srand(time(NULL));
    int map[10][10], result = 0;

    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
            map[i][j] = rand() % 2;
            if (map[i][j] == 0) {
                printf(". ");
            }
            else if (map[i][j] == 1) {
                printf("# ");
            }
        }
        printf("\n");
    }

    return 0;
}

 

Q16.

 

댓글