2차원 배열
2차원 배열 : 표의형태. 데이터를 찾을 때 2가지 정보가 필요(행과 열)
배열명 [행] [열];
table [5] [3] = { 0 }; (밑 표 참고)
0 | 0 | 0 |
0 | 0 | 0 |
0 | 0 | 0 |
0 | 0 | 0 |
0 | 0 | 0 |
*메모리는 논리적으로 보기 위해 표로 보는 것 뿐이지, 1차원으로 쭉 간다.
2차원 배열 초기화 하는 법
1. 원소별로 대입문 사용 //좋은 방법은 아니다
int table[5][3];
table[0][0] = 0;
table[0][1] = 0;
table[0][2] = 0;
table[1][0] = 0;
.
.
.
table[4][2] = 0;
2. for문 이용 (2차원 배열은 늘 중첩반목물과 함께 한다)
int table[5][3];
for (i = 0; i < 5; i++) {
for (j = 0; j < 3; j++) {
table[i][j] = 0;
}
}
3. 선언과 동시에 초기화
//3-1
int table[5][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}};
//3-2
int table[5][3] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
//3-3
int table[5][3] = {0};
3-1의 경우에는 원소 값에 0이 연속으로 나오면 생략이 가능하다.
10 20 30 40 50
0 90 0 0 0
8 70 0 0 0
이렇게 데이터를 대입시키고 싶다했을 때, 밑의 코드 둘 다 가능하다. (단, 90 앞에 있는 0은 생략 불가)
int table [3] [5] = {{10, 20, 30, 40, 50}, {0, 90, 0, 0, 0}, {8, 70, 0, 0, 0}};
int table [3] [5] = {{10, 20, 30, 40, 50}, {0, 90}, {8, 70}};
3-3의 경우에는 table 전체에 0을 집어넣는다는 뜻이 아니다. 첫 데이터 즉, table[0][0] 번째에 0을 넣겠다는 의미이고, 나머지는 모두 값이 비어있으므로 자동으로 0으로 초기화되는 것이다. 즉, int table[5][3] = {5}; 인 경우 table 전체가 5로 초기화 되는 것이 아니라 { 5, 0, 0, 0, ... , 0 } 이 된다.
또한 초기화 할 때는 행은 생략이 가능하다. 단, 열은 생략이 불가능하다.
int table[][3] = {0};
배열의 전체크기를 구해주는 방법
sizeof(list) / sizeof(list[0]) 은 4이다. list가 정수하면
sizeof(table) / sizeof(table[0][0]) 은 행만 안다. 3으로.
table 2차원 전체
table[0] 2차원의 한 줄
table[0[[0] 2차원의 한칸
연습1
for(int i = 0; i < 5; i++){
for(int j = 0; j < 3; j++) {
table[i][j] = i*10 + j;
}
}
연습2
int sum = 0;
for(int i = 0; i < 5; i++){
for(int j = 0; j < 3; j++) {
sum += table[i][j];
}
}
printf("%d", sum);
연습3
int sum = 0;
for(int j = 0; j < 3; j++) {
sum += table[0][j];
}
printf("%d", sum);
연습4
int sum = 0;
for(int i = 0; i < 5; i++){
for(int j = 0; j < 3; j++) {
sum += table[i][j];
}
printf("%d\n", sum);
sum = 0;
}
연습 5
int sum = 0;
for(int i = 0; i < 5; i++){
sum += table[i][0];
}
printf("%d", sum);
연습6
int sum = 0;
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 5; i++) {
sum += table[i][j];
}
printf("%d\n", sum);
sum = 0;
}
0,0 1,0 2,0 3,0 4,0
0,1 1,1 2,1 3,1 4,1
0,2 1,2 2,2 3,2 4,2
사용자 정의 함수 : 배열의 함수 매개 변수 전달
배열 -> 정수형, 실수형 : 배열의 이름, 크기 전달
- 그러나 행과 열 두 개의 크기 다 보내는 것은 아니다. 배열명과 행의 크기만 보내야 한다. 초기화 할 때와 마찬가지로 열을 꼭 주어야 하는 부분이다.
void printTable(int t[][5], int rowSize){
}
행의 사이즈는 넘어오지만 열의 사이즈는 넘어오지 않으므로, 열의 사이즈는 사용자 정의 함수에서 직접 열의 크기는 써줘야 한다.
배열 -> 문자형 : 배열의 이름 (크기는 \0 값으로 찾아준다.)
---------------2주차 중 선택정렬
선택정렬
내림차순 : 값이 점점 내려가는 것
오름차순 : 값이 점점 올라가는 것
이렇게 정렬하는 법은 여러가지 정렬 알고리즘이 존재.
어떤 알고리즘은 내림차순이 빠르기도, 어떤 알고리즘은 오름차순이 빠르기도 한다.
*힙 정렬과 퀵 정렬이 빠르다.
*생활 속에서는 버블 정렬
선택 정렬 : 앞에서부터 쭉 보고 가장 최솟값을 찾아서 위치를 바꾸는 것.
원 데이터가 538127라고 생각해 보자. 원 데이터는 정렬되지 않은 영역 즉, 비정렬영역이다. 가장 작은 수를 찾는다. 정렬이 안 된 수 중 최솟값을 찾는다. 그리고 맨 앞에 있는 값과 체인지.
그 다음은 두 번째 값을 찾아서 정렬된 영역의 두 번째 영역에 넣는다.
1/38527
12/8537
123/587
1235/87
12357/8
123578
#include <stdio.h>
#define SIZE 6;
int main(void) {
int a[SIZE] = { 5, 3, 8, 1, 2, 7 };
int i, j, temp, minIndex;
for(i = 0; i < SIZE; i++) {
minIndex = i;
for(j = i + 1; j < SIZE; j++)
if(minIndex > a[j]){
minIndex = j;
temp = a[i];
a[i] = a[minIndex];
a[minIndex] = temp;
}
for(i = 0; i < 6; i++) {
printf(a[i]);
}
}
(나중에 다시 짜보기)
'C언어' 카테고리의 다른 글
변수 (0) | 2023.09.23 |
---|---|
[JAVA] 3주차 (0) | 2023.09.18 |
2021 학기말고사 (0) | 2023.09.11 |
논리야 놀자 #3 (0) | 2023.09.09 |
논리야 놀자 #2 (0) | 2023.09.08 |