본문으로 건너뛰기

배열의 개념 및 활용

int score1, score2, score3, score3, score4 ... 와 같은 변수를 선언 시 연속되지 않은 주소에 메모리가 할당된다

4byte x n 개의 메모리가 할당

배열의 개념

연속한 주소에 동일한 자료형의 연속된 데이터를 동일한 이름으로 생성하는 것 인덱스(배열원소의 번호)로 데이터를 구분

배열의 선언과 초기화

int val[n];

  • int: 자료형
  • val: 배열 이름
  • [n]: 지료의 개수

인덱스는 0부터 시작 잘못 사용시 심각한 에러가 발생할 수 있음 (오버플로우, 언더플로우)

1차원 배열의 선언과 초기화

int score[10];

4byte4byte4byte4byte...
score[0]score[1]score[2]score[3]...
  • 총 10 개의 인엑스
  • 4byte x 10개 = 40byte
  1. int val[3] = {1, 2, 3};
  2. int val[3] = {1,};
  3. int val[3] = {0};
  4. int val[] = {1, 2, 3};
순서val[0]val[1]val[2]
1123
2100
3000
4123

4번의 데이터는 가변으로 선언하여 데이터의 갯수 만큼 배열을 생성 가변 배열의 데이터는 sizeof() 함수를 사용하여 크기를 출력할 수 있다

2차원 배열의 선언과 초기화

int score[2][5]; 행, 열

행/열01234
0score[0][0]score[0][1]score[0][2]score[0][3]score[0][4]
1score[1][0]score[1][1]score[1][2]score[1][3]score[1][4]
  • 2개의 행과 5개의 열로 구성된 배열
  • 총 2 x 5 = 10개의 요소
#include <stdio.h>

int main(void){
int i,st[5] = {1,2,3};

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

실행 결과:

st[0]=1
st[1]=2
st[2]=3
st[3]=0
st[4]=0
#include <stdio.h>

int main(void){
int score[] = {1,2,3};
int i, size;

size = sizeof(score)/sizeof(score[0]);

printf("size = %d \n", size);

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

실행 결과:

size = 3
score[0] = 1
score[1] = 2
score[2] = 3

실습

학생 점수 입력 후, 평균 구하기

#include <stdio.h>
#define ROW 5
#define COL 3

int main(void){
int students[ROW][COL] = {0};
int i,j;

for(i = 0; i < ROW; i++){
for(j = 0; j < COL; j++){

printf("%d번 학생의 %d번 시험 점수를 입력하세요:",i+1,j+1);
scanf("%d", &students[i][j]);
}
}

printf("---입력 완료---\n");

for(i = 0; i < ROW; i++){
int sum = 0;
for(j = 0; j < COL; j++){
printf("%d번 학생의 %d번 과목의 점수 = %d\n",i+1,j+1,students[i][j]);
sum += students[i][j];
}
printf("%d번 학생의 평균 점수 = %d\n\n", i+1, sum / COL);
}
}

실행 결과:

1번 학생의 1번 시험 점수를 입력하세요:72
1번 학생의 2번 시험 점수를 입력하세요:88
1번 학생의 3번 시험 점수를 입력하세요:93
2번 학생의 1번 시험 점수를 입력하세요:59
2번 학생의 2번 시험 점수를 입력하세요:78
2번 학생의 3번 시험 점수를 입력하세요:92
3번 학생의 1번 시험 점수를 입력하세요:68
3번 학생의 2번 시험 점수를 입력하세요:87
3번 학생의 3번 시험 점수를 입력하세요:80
4번 학생의 1번 시험 점수를 입력하세요:96
4번 학생의 2번 시험 점수를 입력하세요:80
4번 학생의 3번 시험 점수를 입력하세요:100
5번 학생의 1번 시험 점수를 입력하세요:92
5번 학생의 2번 시험 점수를 입력하세요:83
5번 학생의 3번 시험 점수를 입력하세요:100
---입력 완료---
1번 학생의 1번 과목의 점수 = 72
1번 학생의 2번 과목의 점수 = 88
1번 학생의 3번 과목의 점수 = 93
1번 학생의 평균 점수 = 84

2번 학생의 1번 과목의 점수 = 59
2번 학생의 2번 과목의 점수 = 78
2번 학생의 3번 과목의 점수 = 92
2번 학생의 평균 점수 = 76

3번 학생의 1번 과목의 점수 = 68
3번 학생의 2번 과목의 점수 = 87
3번 학생의 3번 과목의 점수 = 80
3번 학생의 평균 점수 = 78

4번 학생의 1번 과목의 점수 = 96
4번 학생의 2번 과목의 점수 = 80
4번 학생의 3번 과목의 점수 = 100
4번 학생의 평균 점수 = 92

5번 학생의 1번 과목의 점수 = 92
5번 학생의 2번 과목의 점수 = 83
5번 학생의 3번 과목의 점수 = 100
5번 학생의 평균 점수 = 91

문자열 출력

#include <stdio.h>

int main(void){
char hi[10] = "hello";
int i;
for(i = 0; i < 10; i++){
printf("%c",hi[i]);
}
// puts(hi);
}

실행 결과: hello

"hello" 라는 문자열을 넣으면 내부에는 ; 가 들어있고, \0 는 문자열의 끝을 의미한다 puts() 함수는 배열로 이루어진 문자열을 처음부터 끝까지 출력함

랜덩 별찍기

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

int main(void){
srand((unsigned int)time(0)); // 명시적 형 변환
int a[5] = {0};
int i,j;

for (i=0; i<5;i++){
a[i]= rand() % 6 +1;
printf("a[%d] = ",i);
for (j = 0; j < a[i]; j++){ // 조건문 수정
printf("*");
}
printf("\n");
}
}

실행 결과:

a[0] = *****
a[1] = *
a[2] = ***
a[3] = ***
a[4] = *