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 |