C언어 배열 및 함수 실습

배열 처리와 함수 활용에 대한 실습 과제입니다.

과제1 소스코드:

#include <stdio.h>
#define MAX_SIZE 4
#define ROWS 2

void arrayTest1() {
    int arr[MAX_SIZE] = {1, 9, 8, 4};
    int idx;
    printf("배열 크기: %d\n", sizeof(arr));
    for(idx = 0; idx < MAX_SIZE; ++idx) {
        printf("%p: %d\n", &arr[idx], arr[idx]);
    }
    printf("배열 주소: %p\n", arr);
}

void arrayTest2() {
    int matrix[ROWS][MAX_SIZE] = {{1, 9, 8, 4}, {2, 0, 4, 9}};
    int i, j;
    printf("2차원 배열 크기: %d\n", sizeof(matrix));
    for(i = 0; i < ROWS; ++i) {
        for(j = 0; j < MAX_SIZE; ++j) {
            printf("%p: %d\n", &matrix[i][j], matrix[i][j]);
        }
    }
    printf("행렬 주소:\n");
    printf("matrix = %p\n", matrix);
    printf("row0 = %p\n", matrix[0]);
    printf("row1 = %p\n", matrix[1]);
}
</div>

출력 결과:
- 요소 배치: 연속적
- 주소 비교: 동일/다름(정수 크기 차이)

<b>과제2</b>
소스코드:
<div>```
#include <stdio.h>
#define MAX_ARR 100

void inputArray(int*, int);
double calculateAvg(int*, int);

int main() {
    int data[MAX_ARR];
    int count;
    double result;
    
    while(printf("입력 개수: "), scanf("%d", &count) != EOF) {
        inputArray(data, count);
        result = calculateAvg(data, count);
        printf("결과: %.2f\n\n", result);
    }
    return 0;
}

void inputArray(int* arr, int size) {
    for(int i = 0; i < size; ++i) {
        scanf("%d", &arr[i]);
    }
}

double calculateAvg(int* arr, int size) {
    int maxVal = arr[0], minVal = arr[0];
    double total = 0;
    
    for(int i = 0; i < size; ++i) {
        total += arr[i];
        if(arr[i] > maxVal) maxVal = arr[i];
        else if(arr[i] < minVal) minVal = arr[i];
    }
    return (total - maxVal - minVal) / (size-2);
}

출력 결과:

  • 매개변수: 배열 요소 타입과 이름 지정
  • 인수: 배열 이름 직접 전달
  • 기능: 최소/최대 제외 평균 계산

과제3 소스코드:

#include <stdio.h>
#define MAX_DIM 100

void printMatrix(int[][MAX_DIM], int);
void fillMatrix(int[][MAX_DIM], int, int);

int main() {
    int matrix[MAX_DIM][MAX_DIM];
    int size, value;
    
    while(printf("크기 및 값 입력: "), scanf("%d%d", &size, &value) != EOF) {
        fillMatrix(matrix, size, value);
        printMatrix(matrix, size);
        printf("\n");
    }
    return 0;
}

void printMatrix(int mat[][MAX_DIM], int dim) {
    for(int i = 0; i < dim; ++i) {
        for(int j = 0; j < dim; ++j) {
            printf("%d ", mat[i][j]);
        }
        printf("\n");
    }
}

void fillMatrix(int mat[][MAX_DIM], int dim, int val) {
    for(int i = 0; i < dim; ++i) {
        for(int j = 0; j < dim; ++j) {
            mat[i][j] = val;
        }
    }
}

출력 결과:

  • 2차원 배열 처리
  • 전체 요소 초기화 기능

과제4 소스코드:

#include <stdio.h>
#define MAX_ARR 100

void readData(int*, int);
double findMedian(int*, int);

int main() {
    int numbers[MAX_ARR];
    int count;
    double median;
    
    while(printf("요소 수 입력: "), scanf_s("%d", &count) != EOF) {
        readData(numbers, count);
        median = findMedian(numbers, count);
        printf("중간값: %g\n\n", median);
    }
    return 0;
}

void readData(int* arr, int size) {
    for(int i = 0; i < size; ++i) {
        scanf_s("%d", &arr[i]);
    }
}

double findMedian(int* arr, int size) {
    for(int i = 0; i < size-1; ++i) {
        for(int j = 0; j < size-1-i; ++j) {
            int temp;
            if(arr[j] > arr[j+1]) {
                temp = arr[j+1];
                arr[j+1] = arr[j];
                arr[j] = temp;
            }
        }
    }
    if((size-1) % 2 == 0) {
        return arr[(size-1)/2];
    } else {
        return (arr[size/2] + arr[(size-2)/2]) / 2.0;
    }
}

과제5 소스코드:

#include <stdio.h>
#define MAX_DIM 100

void readMatrix(int[][MAX_DIM], int);
void displayMatrix(int[][MAX_DIM], int);
void rotateRight(int[][MAX_DIM], int);

int main() {
    int matrix[MAX_DIM][MAX_DIM];
    int size;
    
    printf("행렬 크기 입력: ");
    scanf("%d", &size);
    readMatrix(matrix, size);
    
    printf("원본 행렬:\n");
    displayMatrix(matrix, size);
    
    rotateRight(matrix, size);
    
    printf("변환 후 행렬:\n");
    displayMatrix(matrix, size);
    
    return 0;
}

void readMatrix(int mat[][MAX_DIM], int dim) {
    for(int i = 0; i < dim; ++i) {
        for(int j = 0; j < dim; ++j) {
            scanf("%d", &mat[i][j]);
        }
    }
}

void displayMatrix(int mat[][MAX_DIM], int dim) {
    for(int i = 0; i < dim; ++i) {
        for(int j = 0; j < dim; ++j) {
            printf("%4d", mat[i][j]);
        }
        printf("\n");
    }
}

void rotateRight(int mat[][MAX_DIM], int dim) {
    for(int i = 0; i < dim; ++i) {
        int last = mat[i][dim-1];
        for(int j = dim-1; j > 0; --j) {
            mat[i][j] = mat[i][j-1];
        }
        mat[i][0] = last;
    }
}

과제6 소스코드:

#include <stdio.h>
#define MAX_BUF 100

void convertBase(int, int);

int main() {
    int number;
    while(printf("십진수 입력: "), scanf("%d", &number) != EOF) {
        convertBase(number, 2);
        convertBase(number, 8);
        convertBase(number, 16);
        printf("\n");
    }
    return 0;
}

void convertBase(int num, int base) {
    int digits[MAX_BUF];
    int index = 0;
    
    while(num != 0) {
        digits[index++] = num % base;
        num /= base;
    }
    
    for(int i = index-1; i >= 0; --i) {
        if(digits[i] < 10) {
            printf("%d", digits[i]);
        } else {
            switch(digits[i]) {
                case 10: printf("A"); break;
                case 11: printf("B"); break;
                case 12: printf("C"); break;
                case 13: printf("D"); break;
                case 14: printf("E"); break;
                case 15: printf("F"); break;
            }
        }
    }
    printf("\n");
}

과제7 소스코드:

#include <stdio.h>
#define MAX_DIM 100

void readSquare(int[][MAX_DIM], int);
void printSquare(int[][MAX_DIM], int);
int isMagicSquare(int[][MAX_DIM], int);

int main() {
    int matrix[MAX_DIM][MAX_DIM];
    int size;
    
    while(printf("행렬 크기 입력: "), scanf("%d", &size) != EOF) {
        printf("행렬 입력:\n");
        readSquare(matrix, size);
        printf("행렬 출력:\n");
        printSquare(matrix, size);
        
        if(isMagicSquare(matrix, size)) {
            printf("마방진\n\n");
        } else {
            printf("아니오\n\n");
        }
    }
    return 0;
}

void readSquare(int mat[][MAX_DIM], int dim) {
    for(int i = 0; i < dim; ++i) {
        for(int j = 0; j < dim; ++j) {
            scanf_s("%d", &mat[i][j]);
        }
    }
}

void printSquare(int mat[][MAX_DIM], int dim) {
    for(int i = 0; i < dim; ++i) {
        for(int j = 0; j < dim; ++j) {
            printf("%4d", mat[i][j]);
        }
        printf("\n");
    }
}

int isMagicSquare(int mat[][MAX_DIM], int dim) {
    int colSum = 0, rowSum = 0, diag1 = 0, diag2 = 0;
    
    for(int i = 0; i < dim; ++i) {
        colSum += mat[i][0];
    }
    
    for(int j = 1; j < dim; ++j) {
        rowSum = 0;
        for(int i = 0; i < dim; ++i) {
            rowSum += mat[i][j];
        }
        if(rowSum != colSum) return 0;
    }
    
    for(int i = 0; i < dim; ++i) {
        rowSum = 0;
        for(int j = 0; j < dim; ++j) {
            rowSum += mat[i][j];
        }
        if(rowSum != colSum) return 0;
    }
    
    for(int i = 0; i < dim; ++i) {
        diag1 += mat[i][i];
    }
    if(diag1 != colSum) return 0;
    
    for(int i = 0; i < dim; ++i) {
        diag2 += mat[i][dim-i-1];
    }
    if(diag2 != colSum) return 0;
    
    return 1;
}

과제8 소스코드:

#include <stdio.h>

int main() {
    for(int n = 1; n < 1000; ++n) {
        if(check(n)) {
            printf("%d", n);
            break;
        }
    }
    return 0;
}

int check(int num) {
    int square = num * num;
    int cube = num * num * num;
    int digits[10] = {0};
    int temp;
    
    while(square > 0) {
        temp = square % 10;
        digits[temp]++;
        square /= 10;
    }
    
    while(cube > 0) {
        temp = cube % 10;
        digits[temp]++;
        cube /= 10;
    }
    
    for(int i = 0; i < 10; ++i) {
        if(digits[i] != 1) return 0;
    }
    return 1;
}

태그: C언어 배열 처리 함수 정의 메모리 관리 알고리즘

6월 2일 23:27에 게시됨