배열 처리와 함수 활용에 대한 실습 과제입니다.
과제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;
}