본문 바로가기

C언어

3주차 복습

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