-
[C언어/Day3] C언어 수업정리 - 배열 기초 (정보처리기사, 실기)Backend 2019. 5. 22. 22:00
좁은 서울 땅 덩어리에 미국처럼 단독주택만 짓는다면 어떨지 상상해보자. 집 짓는 데 시간도 오래 걸리고 효율도 매우 떨어질 것이다. 그런데 여러 명을 한 번에 수용할 수 있는 아파트를 지어서 방 한 칸에 1가구 씩 배정한다면 훨씬 효과적으로 주택 공급을 할 수 있을 것이다.
만약에 배열이 없었다면 어떤 데이터 100개를 처리할 때 100개의 변수를 만들고, 그 변수에 100개의 데이터를 각각 할당하여 처리를 해야만 했을 것이다. 얘기만 들어도 비효율적이고 끔찍하다. 그래서 우리는 배열이란 걸 만들어냈는데, 일종의 아파트를 만든 것이다. 그리고 아파트 칸마다 순차적으로 방번호를 부여하고 하나의 데이터를 부여한 것이다. 그리고 우리는 반복문을 사용하여 각각의 방에 든 데이터를 가지고 같은 작업을 여러 번 반복해서 처리할 수 있다.
1. 배열 만들기
#include<stdio.h> #define NUM 5 int main(void) { int array[NUM] = { 87, 99, 80 }; // array[0] = 87, array[1] = 99, array[2] = 80, array[3] = 0, array[4] = 0; int cnt; for (cnt = 0; cnt < NUM; cnt++) { printf("array[%d]=%3d \n", cnt, array[cnt]); } printf("\n"); system("pause"); return 0; }
C언어에서 배열의 선언은 arrayName[5] 이런 식으로 한다.
arrayName은 말 그대로 배열의 이름을 쓰면 되고,
숫자는 배열 방의 개수라고 생각하면 된다.
array[5]라고 하면 5개의 빈 방이 생겨나는 셈이다.
동적 언어인 자바스크립트와 다르게 정적 언어인 C언어는
배열을 선언할 때, 방의 개수를 이렇게 미리 지정해준다.
(자바스크립트에서는 그냥 var arr = []; 이렇게 빈 배열만 선언하고
배열에 들어갈 요소의 개수는 지정하지 않는다.)
위 코드에서는 array라는 배열에 빈 방을 5개를 만들었고, 초기값으로는 87, 99, 80을 할당하였다.
그러면 값이 할당되지 않은 나머지 빈 방은 0이 출력된다.
주의할 점은 배열의 방 번호는 0번부터 시작한다.
Flow chart와 같은 알고리즘 세계에서는 1번부터 카운트하기 때문에 헷갈리면 안된다.
그러니까 위 array[5]의 방 개수는 5개이지만 방 번호는 0번부터 4번까지 존재하게 된다.
즉, array[5] = { 87, 99, 80 };은
array[0] = 87, array[1] = 99, array[2] = 80, array[3] = 0, array[4] = 0;이라고 선언한 것과 같다.
2. 배열의 초기값을 0으로 설정하기
#include<stdio.h> #define NUM 5 int main(void) { int array1[5] = { 0 }; int array2[5]; int cnt; for (cnt = 0; cnt < NUM; cnt++) { array2[cnt] = 0; printf("array1[%d]=%3d \n", cnt, array1[cnt]); } printf("\n"); for (cnt = 0; cnt < NUM; cnt++) { array2[cnt] = 0; printf("array2[%d]=%3d \n", cnt, array2[cnt]); } printf("\n"); system("pause"); return 0; }
배열을 처음 선언할 때는 int arrayName[num] = { 0 }; 이라고 주로 쓴다.
그러면 arrayName이라는 배열이 선언되고, 그 배열의 방의 개수는 num이고
각 배열 방에는 0이라는 값이 할당되어 초기화된다.
위 코드를 보면 int array2[5]; 라고 배열만 일단 선언한 다음에
for문 안에서 array2 각각의 빈 방에 0이란 값을 할당해도 초기화가 된다.
3. 배열의 값들로 총점과 평균 구하기
#include<stdio.h> #define NUM 5 int main(void) { int array[NUM] = { 87,99,80 }; int total = 0, cnt; double avg; for (cnt = 0; cnt < NUM; cnt++) { printf("array[%d]=%3d \n", cnt, array[cnt]); } printf("\n"); for (cnt = 0; cnt < NUM; cnt++) { total = total + array[cnt]; } printf("----------반복문 종료-------------\n"); printf("총점은 %d 이고 \n", total); avg = (double)total / NUM; printf("평균은 %.2lf 입니다\n", avg); system("pause"); return 0; }
이제 배열의 값들을 반복문을 사용하여 total이란 변수에 누적해서 더한 후, 평균값을 구해서 출력하였다.
평균값을 출력할 때, %.2lf라고 표기하면 소수점 2자리수까지만 표현하라는 의미이다.
%.2f라고 표현할 수도 있는데, f라고 표기하면 소수점을 5~6자리까지만 연산한다.
lf라고 표기하면 그 이상의 소수점까지 연산한다.
4. 배열과 반복문으로 사각형 출력하기 (2차원 배열)
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
그러니까 이렇게 생긴 사각형을 출력해보려고 한다.
#include <stdio.h> int main() { int row, col, i, j, k = 0; int arr1[5][5] = { 0 }; //사각형 도형 채우기 printf("-----------------------\n"); for (row = 0; row < 5; row++) { for (col = 0; col < 5; col++) { k = k + 1; arr1[row][col] = k; } } for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) { printf("%3d", arr1[i][j]); } printf("\n"); } printf("-----------------------\n"); system("pause"); return 0; }
이제 행과 열이 필요하므로 2차원 배열을 사용해서 출력할 수밖에 없다.
각각의 행이 하나의 배열을 이루고 그 행들이 모여 또 하나의 배열을 이루는 형태가 된다.
arr1[5][5] = { 0 }; 이라고 선언하면 5개의 행과 5개의 열이 생겨난다.
그 행열에 이중 반복문을 사용하여 숫자를 채워넣어준다.
출력할 때, 하나의 행 출력이 끝나면 줄바꿈을 해주어야 한다.
#include <stdio.h> #define NUM 5 int main() { int row, col, i, j, k = 0; int arr1[NUM][NUM] = { 0 }; //사각형 도형 채우기 printf("-----------------------\n"); row = 0; while (row < NUM) { col = 0; while (col < NUM) { k = k + 1; arr1[row][col] = k; col++; } row++; } i = 0; while (i < NUM) { j = 0; while (j < NUM) { printf("%3d", arr1[i][j]); j++; } printf("\n"); i++; } printf("-----------------------\n"); system("pause"); return 0; }
똑같은 코드를 while문으로 표현하면 이렇게 된다.
for문보다 길이는 길지만 원리는 같다.
#include <stdio.h> #define NUM 5 int main() { int row, col, i, j, k = 0; int arr1[NUM][NUM] = { 0 }; //사각형 도형 채우기 printf("-----------------------\n"); row = 0; do { col = 0; do { k = k + 1; arr1[row][col] = k; col++; } while (col < NUM); row++; } while (row < NUM); i = 0; while (i < NUM) { j = 0; while (j < NUM) { printf("%3d", arr1[i][j]); j++; } printf("\n"); i++; } printf("-----------------------\n"); system("pause"); return 0; }
이 코드는 do-while문으로 작성한 코드이다.
5. 배열과 반복문으로 사각형 출력하기 (2차원 배열) _ (2)
1 6 11 16 21
2 7 12 17 22
3 8 13 18 23
4 9 14 19 24
5 10 15 20 25
이번엔 새로 방향으로 수를 출력해보자.
#include <stdio.h> int main() { int row, col, i, j, k = 0; int arr1[5][5] = { 0 }; //사각형 도형 채우기 printf("-----------------------\n"); for (row = 0; row < 5; row++) { for (col = 0; col < 5; col++) { k = k + 1; arr1[col][row] = k; } } for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) { printf("%3d", arr1[i][j]); } printf("\n"); } printf("-----------------------\n"); system("pause"); return 0; }
col과 row의 위치만 바꿔주면 간단하게 바꿀 수 있다.
6. 배열과 반복문으로 사각형 출력하기 (2차원 배열) _ (3)
1 0 0 0 0
0 2 0 0 0
0 0 3 0 0
0 0 0 4 0
0 0 0 0 5
모두 0을 출력하고 대각선으로 1 2 3 4 5를 출력하는 방법은 다음과 같다.
#include <stdio.h> int main() { int row, col, i, j, k = 0; int arr1[5][5] = { 0 }; //사각형 도형 채우기 printf("-----------------------\n"); for (row = 0; row < 5; row++) { for (col = 0; col < 5; col++) { if (row == col) { k = k + 1; arr1[row][col] = k; } } } for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) { printf("%3d", arr1[i][j]); } printf("\n"); } printf("-----------------------\n"); system("pause"); return 0; }
대각선은 row와 col의 인덱스 번호가 같아질 경우이므로
if (row == col) 조건을 주면 대각선에만 번호가 할당된다.
#include <stdio.h> int main() { int row, col, i, j, k = 0; int arr1[5][5] = { 0 }; //사각형 도형 채우기 printf("-----------------------\n"); for (row = 0; row < 5; row++) { for (col = 0; col < 5; col++) { if (row != col) { continue; } else { k = k + 1; arr1[row][col] = k; } } } for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) { printf("%3d", arr1[i][j]); } printf("\n"); } printf("-----------------------\n"); system("pause"); return 0; }
위 코드는 continue문을 사용하여 이렇게도 표현 가능하다.
(물론 위의 코드가 더 짧고 간결하다.)
반응형'Backend' 카테고리의 다른 글
[Node.js] Express와 jwt 토큰(Json Web Token)을 이용한 회원가입 / 로그인 구현하기 [2] (609) 2019.09.13 [Node.js] Express와 jwt 토큰(Json Web Token)을 이용한 회원가입 / 로그인 구현하기 [1] (1314) 2019.09.11 [Node.js] Express를 backend로 하는 Create-react-app 시작하기 (609) 2019.09.05 [C언어/Day2] C언어 수업정리 (정보처리기사, 실기) / 자바스크립트와 산술연산 결과가 다르게 나오는 이유 (0) 2019.05.13 [C언어/Day1] C언어 수업정리 (정보처리기사, 실기) (0) 2019.05.12 COMMENT