본문 바로가기
2학년 2학기/c언어

7장 배열

by kkkkk1023 2024. 10. 25.

1. 중간 점검 퀴즈(1)

Quiz 1) n개의 요소를 가지는 배열의 경우, 첫 번째 요소의 번호는 무엇인가?

: 0

 

Quiz 2) n개의 요소를 가지는 배열의 경우, 마지막 요소의 번호는 무엇인가?

: n - 1

 

Quiz 3) 범위를 벗어나는 인덱스를 사용하면 어떻게 되는가? 즉, int a[10];과 같이 선언된 배열이 있는 경우, a[10]에 6을 대입하면 어떻게 되는가?

: 배열 인덱스 범위 초과 오류가 생긴다.

 

 

 

2. 중간 점검 퀴즈(2)

Quiz 1) 배열 a[6]의 요소를 1, 2, 3, 4, 5, 6으로 초기화

int a[6] = {1, 2, 3, 4, 5, 6};

 

 

Quiz 2) 배열의 초기화에서 초기값이 배열 요소의 개수보다 적은 경우

: 배열 요소보다 초기화 값이 적으면 나머지 요소는 0으로 초기화된다.

int a[6] = {1, 2, 3};  // 결과: a = {1, 2, 3, 0, 0, 0}

 

 

Quiz 3) 배열의 크기를 주지 않고 초기값의 개수로 배열의 크기를 결정할 수 있는가?

: 배열 선언 시 크기를 생략하면, 초기값의 개수에 따라 배열 크기가 자동으로 결정된다.

int a[] = {1, 2, 3, 4, 5, 6};  // 배열의 크기는 자동으로 6으로 설정됩니다.

 

 

 

 

3. 최솟값 찾기

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

int main(void)
{
    srand(time(NULL));
    int randVal[10];
    int min;

    //랜덤 요소를 가진 배열 선언
    printf("[");
    for (int i = 0; i < 10; i++){
        randVal[i] = rand() % 100;
        printf("%d ", randVal[i]);
    }
    printf("]");

    //최솟값 찾기
    min = randVal[0];
    for (int i = 1; i < 10; i++){
        if(randVal[i] < min){
            min = randVal[i];
        }
    }
    
    printf("\n 가장 작은 값은 %d입니다.", min);

    return 0;
}

 

 

 

 

4. 순차탐색으로 사용자가 원하는 값 찾기

#include <stdio.h>

int main(void)
{
    int arr[10] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
    int val = 0;
    printf("탐색할 값을 입력하시오: ");
    scanf("%d", &val);
    for (int i=0;i<10;i++){
        if(arr[i] == val){
            printf("탐색 성공 인덱스 = %d", i);
            break;
        }
    }
    return 0;
}

 

 

 

 

5. 버블정렬

 

[최적화 전]

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 5

int main(void)
{
    srand(time(NULL));
    int list[SIZE] = {0};

    printf("정렬 전 - [");
    for (int i = 0; i < SIZE; i++){
        list[i] = rand() % 100;
        printf("%d ", list[i]);
    }
    printf("]");

    // 오름차순 정렬
    for(int i=0; i < SIZE; i++){
        for(int j=0; j < SIZE-1; j++){
            if(list[j] > list[j+1]){
                int tmp = list[j];
                list[j] = list[j+1];
                list[j + 1] = tmp;
            }
            
        }
    }

    printf("\n정렬 후 - [");
    for (int i = 0; i < SIZE; i++){
        printf("%d ", list[i]);
    }
    printf("]");
}

//정렬 전 - [82 27 63 55 12 ]
//정렬 후 - [12 27 55 63 82 ]

 

 

[최적화 후]

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 5

int main(void)
{
    srand(time(NULL));
    int list[SIZE] = {0};
    int isSorted = 1; // 이미 정렬되었는지 확인하는 플래그

    printf("정렬 전 - [");
    for (int i = 0; i < SIZE; i++){
        list[i] = rand() % 100;
        printf("%d ", list[i]);
    }
    printf("]");

    // 오름차순 정렬
    for(int i = 0; i < SIZE - 1; i++){
        for(int j = 0; j < SIZE - 1 - i; j++){
            if(list[j] > list[j + 1]){
                // 두 요소를 교환
                int tmp = list[j];
                list[j] = list[j + 1];
                list[j + 1] = tmp;
                isSorted = 0; // 교환이 발생했으므로 정렬되지 않음
            }
        }

        if (isSorted == 1){ 
            // 교환이 발생하지 않으면 정렬 완료, 루프 중단
            break;
        }
        isSorted = 1; // 다음 패스를 위해 플래그를 초기화
    }

    printf("\n정렬 후 - [");
    for (int i = 0; i < SIZE; i++){
        printf("%d ", list[i]);
    }
    printf("]");
}

//정렬 전 - [82 27 63 55 12 ]
//정렬 후 - [12 27 55 63 82 ]

 

 

 

 

 

6. 다차원 배열

 

다차원 배열의 초기화

int arr[3][5] = {
    {0, 1, 2, 3, 4},
    {10, 11, 12, 13, 14},
    {20, 21, 22, 23, 24}
};

 

 

다차원 배열의 모든 요소를 0으로 초기화하는 방법

int arr[3][5] = {0};

 

 

 

 

7. 다차원 배열을 이용한 행렬의 덧셈과 행렬의 곱셈

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 행렬의 덧셈과 닷 프로덕트
	
int main() {
    srand(time(NULL));
	int a[3][3];
	int b[3][3];
	int result_add[3][3];
	int result_dot[3][3] = { 0 };
    
    //a 행렬 초기화
	printf("a = \n");
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			a[i][j] = rand() % 10;
			printf("%d ", a[i][j]);
		}
		printf("\n");
	}
	printf("\n\n");
    
    //b 행렬 초기화
	printf("b = \n");
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			b[i][j] = rand() % 10;
			printf("%d ", b[i][j]);
		}
		printf("\n");
	}
	printf("\n\n");
    
    //a + b
	printf("a + b = \n");
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			result_add[i][j] = a[i][j] + b[i][j];
			printf("%d ", result_add[i][j]);
		}
		printf("\n");
	}
	printf("\n\n");
    
    //a + b
	printf("a * b = \n");
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			for (int k = 0; k < 3; k++) { 
            //a의 i행의 모든 열, b의 j열의 모든 행의 각각의 요소를 곱한 누적합이 dot[i][j]이다. 
				result_dot[i][j] += a[i][k] * b[k][j];
			}
		printf("%d ", result_dot[i][j]);
		}
		printf("\n");
	}
}

 

 

 

 

8. 다차원 배열을 이용한 tiptactoe 게임

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
	
char board[3][3];
void initBoard();
int checkWin();
int who_is_winner(char c);
int isFulled();

int main() {
    int x = 0, y = 0, playerNumber = 0;
    
    initBoard();

    while(1){
        printf("(x, y)좌표 (0~2): ");
        scanf("%d %d", &x, &y);
        
        // 표 작성
        if(board[x][y] == 'X' || board[x][y] == 'O'){
            printf("\n 해당 좌표에 이미 값이 있습니다.\n\n");
            continue;
        }
        if(playerNumber == 0) {
            board[x][y] = 'O';
            playerNumber = 1;
        } else {
            board[x][y] = 'X';
            playerNumber = 0;
        }
        
        // 표 출력
        printf("---|---|---\n");
        for(int i=0; i<3; i++){
            printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
            printf("---|---|---\n");
        }

        //승리 확인

        if(checkWin() == 0){
            printf("player1 승리");
            break;
        } else if(checkWin() == 1){
            printf("player2 승리");
            break;
        } else {

        }

        //표가 꽉찬지 확인
        if(isFulled() == 1){
            initBoard();
            printf("입력 공간이 없어 표를 초기화하고 다시 재시작 합니다.");
        }
        
    }
}

void initBoard(){
    for(int i = 0; i < 3; i++){
        for(int j = 0; j < 3; j++){
            board[i][j] = ' ';
        }
    }
}

int checkWin() {
    for(int i = 0; i < 3; i++){
        
        //행으로 같은 경우
        if(board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ') {
            return who_is_winner(board[i][0]);
        }

        //열으로 같은 경우
        if(board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ') {
            return who_is_winner(board[0][i]);
        }

        //대각선으로 같은 경우 1
        if(board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' '){
            return who_is_winner(board[0][0]);
        }
            
        //대각선으로 같은 경우 2
        if(board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' '){
            return who_is_winner(board[0][2]);
        }  
    }
    return -1;
}

int who_is_winner(char c) {
    if(c == 'O'){
        return 0;
    } else {
        return 1;
    }
}

int isFulled(){
    int result = 1;
    for(int i = 0; i < 3; i++){
        for(int j = 0; j < 3; j++){
            if(board[i][j] == ' '){
                result = 0;
            }
        }
    }
    return result;
}

'2학년 2학기 > c언어' 카테고리의 다른 글

9-1장 포인터란?  (0) 2024.10.28
8장 함수  (0) 2024.10.25
6장  (1) 2024.10.25
5장 조건문  (0) 2024.10.24
4장 수식과 연산자  (0) 2024.10.23