본문 바로가기
Programming/컴퓨터프로그래밍및실습

[컴프실] 제10장: 배열

by Lizardee 2023. 7. 19.
배열
  • 배열을 사용하면 한 번에 여러 개의 변수를 생성할 수 있다.
  • int s[10];

 

배열의 특징
  • 배열은 메모리의 연속적인 공간에 저장된다. 예를 들어, 배열 요소 s[0]과 s[1]은 실제 메모리 상에서도 서로 붙어있다.
  • 배열의 가장 큰 장점은 서로 관련된 데이터를 차례로 접근하여서 처리할 수 있다는 점이다. 

 

배열 선언
int scores[10]; //자료형, 배열 이름, 요소의 개수
int score[60]; //60개의 int형 값을 가지는 배열 score
float cost[12]; //12개의 float형 값을 가지는 배열 cost
char name[50]; //50개의 char형 값을 가지는 배열 name

 

기호 상수 사용
#define SIZE 30 //기호 상수 사용
int score[SIZE];

 

배열 기초 예제
//배열 기초 예제
#include <stdio.h>
#define SIZE 5

int main(void) {
	int i;
	int score[SIZE];

	for (i = 0; i < SIZE; i++) {
		score[i] = (i+1) * 10;
		printf("scores[%d] = %d\n", i, score[i]);
	}
	return 0;
}

 

배열 난수로 채우기
//배열 난수로 채우기
#include <stdio.h>
#include <stdlib.h>
#define SIZE 5

int main(void) {
	int i = 0;
	int scores[SIZE];

	srand((unsigned)time(NULL));

	for (i = 0; i < SIZE; i++) {
		scores[i] = rand() % 100;
		printf("scores[%d] = %d\n", i, scores[i]);
	}

	return 0;
}

 

//성적 평균 계산하기
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define SIZE 5

int main(void) {
	int i = 0;
	int sum = 0;
	int scores[SIZE];

	for (i = 0; i < SIZE; i++) {
		printf("학생들의 성적을 입력하시오: ");
		scanf("%d", &scores[i]); //배열 scores[i]를 입력받는다.
		sum += scores[i];
	}

	double average = (double)sum / SIZE;
	printf("성적 평균 = %lf\n", average);

	return 0;
}

 

배열의 초기화
//배열의 초기화 예제
#include <stdio.h>
#define SIZE 5

int main(void) {
	int i = 0;
	int scores[SIZE] = { 31, 63, 62, 87, 14 }; //배열의 초기화

	for (i = 0; i < SIZE; i++) {
		printf("scores[%d] = %d\n", i, scores[i]); //socres[i] 초기화되어 있기 때문에 다시 정의할 필요 없음
	}

	return 0;
}

 

Lab: 주사위 던지기
//주사위 던지기
#include <stdio.h>
#include <stdlib.h>
#define SIZE 6

int main(void) {
	printf("=====================\n");
	printf("숫자   빈도\n");
	printf("=====================\n");

	int i = 0;
	int frequency[SIZE] = { 0 }; //주사위의 면의 빈도를 0으로 초기화!

	srand((unsigned)time(NULL));

	for (i = 0; i < 1000; i++) {
		frequency[rand() % 6]++; //0~5까지의 수 중 하나 증가
	}

	for (i = 0; i < SIZE; i++) {
		printf(" %d   %d\n", i, frequency[i]);
	}

	return 0;
}

 

Lab: 극장 예약 시스템
//극장 예약 시스템
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define SIZE 10

int main(void) {
	char ans1;
	int i;
	int seat[SIZE] = { 0 };

	while (1) {
		printf("좌석을 예약하시겠습니까?(y 또는 n) ");
		scanf(" %c", &ans1); //%c앞에 공백 추가!
		if (ans1 == 'n')
			break;

		printf("------------------------\n");
		printf("1 2 3 4 5 6 7 8 9\n");
		printf("------------------------\n");

		for (i = 0; i < 10; i++) {
			printf("%d ", seat[i]);
		}
		printf("\n");

		int where; //몇 번째 좌석
		printf("몇 번째 좌석을 예약하시겠습니까? ");
		scanf("%d", &where);

		if (seat[where - 1] == 0) {
			printf("예약되었습니다.\n");
			seat[where - 1]++;
		}
		else {
			printf("이미 예약된 자리입니다.\n");
		}
	}

	return 0;
}
  • scanf(" %c", &ans1);: 사용자로부터 입력을 받을 때 %c 형식 지정자 앞에 공백을 추가하여, 이전 입력에서 남은 엔터 등을 소비합니다. 이렇게 하면 이후에 입력이 원하는 대로 작동합니다.

 

Lab: 최솟값 찾기
//최솟값 찾기
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10

int main(void) {
	int i;
	int price[SIZE];

	srand((unsigned)time(NULL));

	printf("---------------------------\n");
	for (i = 0; i < SIZE; i++) {
		printf("%d ", i + 1);
	}
	printf("\n---------------------------\n");

	for (i = 0; i < SIZE; i++) {
		price[i] = (rand() % 100) + 1;
		printf("%d ", price[i]);;
	}
	int min = price[0]; //최솟값 임의로 설정

	for (i = 1; i < SIZE; i++) { //새로운 for문에서 작성해야 함
		if (price[i] < min)
			min = price[i];
	}

	printf("\n\n최솟값은 %d입니다.\n", min);

	return 0;
}
  • 최솟값 임의로 설정하고, for문을 다시 작성해야 함

 

배열과 함수
//배열이 함수의 인수인 경우
#include <stdio.h>
#define STUDENT 5

int get_average(int scores[], int n); //평균 구하는 함수

int main(void) {
	int scores[STUDENT] = { 1, 2, 3, 4, 5 };
	int avg;

	avg = get_average(scores, STUDENT); //배열이 인수인 경우, 배열의 주소가 전달됨
	printf("평균은 %d입니다.\n", avg);

	return 0;
}

int get_average(int scores[], int n) { //배열의 원본이 scores[]로 전달됨
	int i;
	double sum = 0;

	for (i = 0; i < n; i++)
		sum += scores[i];
	return sum / n;
}

 

//배열이 함수의 인수인 경우 - 2
#include <stdio.h>
#define SIZE 7

void modify_array(int a[], int size); //함수 미리 선언
void print_array(int a[], int size);

int main(void) {
	int list[SIZE] = { 1, 2, 3, 4, 5, 6, 7 };

	print_array(list, SIZE); //함수 호출
	modify_array(list, SIZE);
	print_array(list, SIZE);

	return 0;
}

void modify_array(int a[], int size) { //modify_array 함수
	int i;
	for (i = 0; i < SIZE; i++) {
		a[i]++;
	}
}

void print_array(int a[], int size) { //print_array 함수
	int i;
	for (i = 0; i < SIZE; i++) {
		printf("%d ", a[i]);
	}
	printf("\n");
}

 

2차원 배열
//2차원 배열의 활용
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROWS 3
#define COLS 5

int main(void) {
	int s[ROWS][COLS]; //2차원 배열 선언
	int i, j; //2개의 인덱스 변수
	
	srand((unsigned)time(NULL));

	for (i = 0; i < ROWS; i++) {
		for (j = 0; j < COLS; j++) {
			s[i][j] = rand() % 100;
		}
	}

	for (i = 0; i < ROWS; i++) {
		for (j = 0; j < COLS; j++) {
			printf("%d ", s[i][j]);
		}
		printf("%\n");
	}

	return 0;
}

 

2차원 배열의 초기화
//2차원 배열의 초기화
#include <stdio.h>
#define ROWS 3
#define COLS 5

int main(void) {
	int a[ROWS][COLS] = { {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5} };
	int i;

	for (i = 0; i < ROWS; i++) {
		double final_scores = a[i][0] * 0.3 + a[i][1] * 0.4 + a[i][2] * 0.2 + a[i][3] * 0.1 - a[i][4];
		printf("학생 %d의 최종성적 = %f\n", i + 1, final_scores);
	}

	return 0;
}

 

행렬
//다차원 배열을 이용한 행렬의 표현
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define ROWS 2
#define COLS 2

int main(void) {
	int i, j;
	int x[ROWS][COLS];
	int y[ROWS][COLS];
	int z[ROWS][COLS];

	for (i = 0; i < ROWS; i++) {
		for (j = 0; j < COLS; j++) {
			scanf("%d", &x[i][j]);
		}
	}

	for (i = 0; i < ROWS; i++) {
		for (j = 0; j < COLS; j++) {
			scanf("%d", &y[i][j]);
		}
	}

	for (i = 0; i < ROWS; i++) {
		for (j = 0; j < COLS; j++) {
			z[i][j] = x[i][j] + y[i][j];
			printf("%d ", z[i][j]);
		}
		printf("\n");
	}

	return 0;
}