pk7912
2022.01.31
@pk7912님이 새 포스트를 작성했습니다.
[모각코+ 출석 인증] 15일차 - C언어 심화문법 1월 과정 A조
오늘의 문제 : 복습하기 main #include "header.h" int main(void) { int row = 2, col = 1; char level; CursorView(0); // 커서 없애기 (커서의 노출 여부 = 0) GotoXY(XP, YP - 3); printf("미로 찾기 게임\n"); // 콘솔 출력 위치 변경 GotoXY(XP, YP - 2); printf("난이도를 선택하세요.(1,2,3)"); scanf_s("%c", &level); LoadMaze(level); // 1. 미로 불러오는 함수 start = clock(); while (1)  { PrintMazeGame(); // 2. 미로를 출력하는 함수 MoveMaze(&row, &col); // 3. 키 입력을 받아, 이동 혹은 클리어를 판정하는 함수 } return 0; } header.h #ifndef HEADER #define HEADER #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <Windows.h> #include <conio.h> #include <time.h> #define SIZE 19 #define XP 40 // 콘솔 창 중간에 미로를 출력하기 위해 XP와 YP라는 이름으로 기본 좌표값 설정 #define YP 5 #define LEFT 75 #define RIGHT 77 #define UP 72 #define DOWN 80 #define ARROW 224 void LoadMaze(char num); // 미로 내부 구성 함수 void GotoXY(int x, int y); // 콘솔 출력 위치 변경 함수 void PrintMazeGame(); // 콘솔 창에 미로 그리는 함수 void CursorView(char show); // 커서 없애는 함수 void MoveMaze(int * row, int * col); /*현재 플레이어의 위치좌표(x), (y)포인터*/ int IsBlock(int i, int j); // 막힌곳 혹은 도착지 판정 함수 int IsFinish(int i, int j); // 도착지인지 확인하는 함수 void Complete(); // 걸린 시간 측정 함수 char maze[SIZE][SIZE]; clock_t start, end; float res; #endif header.c #include "header.h" // 미로 내부 구성 함수 void LoadMaze(char num) { char path[20] = "./Maze"; strncat(path, &num, 1); strcat(path, ".txt"); char str_tmp[50] = { 0, }; FILE* f = fopen(path, "r"); for (int i = 0; i < SIZE; i++) { fgets(str_tmp, 50, f); char* ptr = strtok(str_tmp, "\t"); for (int j = 0; j < SIZE; j++) { maze[i][j] = *ptr; ptr = strtok(NULL, "\t"); } } fclose(f); } // 콘솔 출력 좌표 이동 함수 void GotoXY(int x, int y) { COORD Pos; Pos.X = x; Pos.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos); } // 미로 변환 및 출력 함수 void PrintMazeGame() { for (int i = 0; i < SIZE; i++) { GotoXY(XP, YP + i); for (int j = 0; j < SIZE; j++) { if (maze[i][j] == '1') printf("■"); else if (maze[i][j] == 'y') printf("★"); else if (maze[i][j] == '0') printf("□"); else printf("●"); } puts(""); } } // 커서 없애기 CursorView 함수 void CursorView(char show) { CONSOLE_CURSOR_INFO ConsoleCursor; ConsoleCursor.bVisible = show; ConsoleCursor.dwSize = 1; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &ConsoleCursor); } // 키 입력을 받는 함수 void MoveMaze(int* row, int* col) { int nkey; if (_kbhit()) { nkey = _getch(); if (nkey == ARROW) { nkey = _getch(); switch (nkey) { case UP: if (!(IsBlock(*row - 1, *col))) { maze[*row][*col] = '0'; maze[*row - 1][*col] = 'x'; *row -= 1; } else if (IsFinish(*row - 1, *col)) { maze[*row][*col] = '0'; maze[*row - 1][*col] = 'x'; PrintMazeGame(); Complete(); } break; case DOWN: if (!(IsBlock(*row + 1, *col))) { maze[*row][*col] = '0'; maze[*row + 1][*col] = 'x'; *row += 1; } else if (IsFinish(*row + 1, *col)) { maze[*row][*col] = '0'; maze[*row + 1][*col] = 'x'; PrintMazeGame(); Complete(); } break; case LEFT: if (!(IsBlock(*row, *col - 1))) { maze[*row][*col] = '0'; maze[*row][*col - 1] = 'x'; *col -= 1; } else if (IsFinish(*row, *col - 1)) { maze[*row][*col] = '0'; maze[*row][*col - 1] = 'x'; PrintMazeGame(); Complete(); } break; case RIGHT: if (!(IsBlock(*row, *col + 1))) { maze[*row][*col] = '0'; maze[*row][*col + 1] = 'x'; *col += 1; } else if (IsFinish(*row, *col + 1)) { maze[*row][*col] = '0'; maze[*row][*col + 1] = 'x'; PrintMazeGame(); Complete(); } break; } } } } int IsBlock(int i, int j) { if (maze[i][j] == '1' || maze[i][j] == 'y') return 1; else return 0; } int IsFinish(int i, int j) { if (maze[i][j] == 'y') return 1; else return 0; } void Complete() { end = clock(); res = (float)(end - start) / CLOCKS_PER_SEC; GotoXY(XP, YP + SIZE); printf("Complete!\n"); GotoXY(XP, YP + SIZE + 1); printf("경과시간 : %.2f초\n", res); exit(0); }
quantsz
2022.01.28
@quantsz님이
[모각코+ 출석 인증] 14일차 - C언어 심화문법 1월 과정 A조
포스트에 댓글을 남겼습니다.
quantsz
2022.01.28
jm0347
2022.01.28
@jm0347님이
[모각코+ 출석 인증] 14일차 - C언어 심화문법 1월 과정 A조
포스트에 댓글을 남겼습니다.
pk7912
2022.01.27
@pk7912님이 새 포스트를 작성했습니다.
[모각코+ 출석 인증] 14일차 - C언어 심화문법 1월 과정 A조
✅ 오늘의 문제 : 선에 닿으면 게임이 끝나는 프로그램 만들기 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <Windows.h> #include <conio.h> #define LEFT 75 #define RIGHT 77 #define UP 72 #define DOWN 80 #define ARROW 224 #define COL 30 void CursorView(char show); void GotoXY(int x, int y); void Movezero(/*현재 플레이어의 위치좌표(x), (y)포인터*/int* x, int* y); void FinishLine(); int main(void) { int x = 5; int y = 10; // 시작 좌표  CursorView(0); // 커서 없애기 while (1) { FinishLine(); GotoXY(x, y); Movezero(&x, &y); } } void GotoXY(int x, int y) { COORD Pos; // COORD 는 단순하게 x 값과 y 값을 멤버로 가지는 구조체타입 Pos.X = x; Pos.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos); // 첫번째는 표준콘솔출력 핸들값이며, 두번째 인자는 위치값 // SetConsoleCursorPosition 함수에, 콘솔의 출력 핸들을 주고, 위치를 정해주면 커서가 이동하는 것 // 콘솔에서 가로의 크기는 80칸, 세로의 크기는 25칸이므로 최대 좌표는 (0, 0) 부터 (79, 24) 까지 입력할 수 있다. // x, y좌표 위치는 좀 다르다, 그 이유는 알파벳의 크기에 있다.  // 예를 들어 'a'는 높이가 1이라 하면, 가로가 0.5이기 때문에 알파벳 두 개가 연속적으로 있어야 정사각형 인 것을 알 수 있다.  // 모든 알파벳의 크기가 1x0.5이며, 한글이나 한자는 1x1이다. // 테트리스 블럭같은 경우 크기가 1x1이므로 좌표계를 재설정 할 필요가 있다.----> COORD pos = { x * 2,y };//여기만 바뀜(가로를 두배로) // } void CursorView(char show) { CONSOLE_CURSOR_INFO ConsoleCursor; ConsoleCursor.bVisible = show; ConsoleCursor.dwSize = 1; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &ConsoleCursor); } void Movezero(int* x, int* y) { int nkey; printf("0"); if (_kbhit()) // kbhit함수는 사용자로부터 키 입력을 받았는지 안 받았는지 검사하는 함수 { nkey = _getch(); // kbhit함수를 getch함수와 같이 씀!! getch함수는 버퍼가 없어서 코드가 잠시 정지하는 일이 없기 떄문 if (nkey == ARROW) // 방향키일 경우 224 { nkey = _getch(); switch (nkey) { case UP: GotoXY(x, y - 1); *y = *y - 1; break; case DOWN: GotoXY(x, y + 1); *y = *y + 1; break; case LEFT: GotoXY(x - 1, y); *x = *x - 1; break; case RIGHT: if (*x == COL - 1) { system("cls"); printf("선에 닿았어요 ㅠㅠ"); exit(0); } GotoXY(x + 1, y); *x = *x + 1; break; } /* Sleep(100); */ // C언어와 C++에서의 Sleep은 잠시 대기 /*printf("  ");*/ } system("cls"); // system() 함수는 가로안에 있는 문자열을 명령 프롬프트에 직접 치는 효과를 발휘,  clean screen!! } } void FinishLine() // 부딛히면 아웃되는 선 { for (int row = 0; row < COL; row++) { GotoXY(COL, row); printf("|"); } }
pk7912
2022.01.26
@pk7912님이 새 포스트를 작성했습니다.
[모각코+ 출석 인증] 13일차 - C언어 심화문법 1월 과정 A조
오늘의 문제 : 방향키를 통해 움직이는 0 만들어보기 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <Windows.h> #include <conio.h> #define LEFT 75 #define RIGHT 77 #define UP 72 #define DOWN 80 #define ARROW 224 void CursorView(char show); void GotoXY(int x, int y); void Movezero(/*현재 플레이어의 위치좌표(x), (y)포인터*/int* x, int* y); int main(void) { int x = 50; int y = 10; // 시작 좌표  CursorView(0); // 커서 없애기 while (1) { GotoXY(x, y); Movezero(&x, &y); } } void GotoXY(int x, int y) { COORD Pos; // COORD 는 단순하게 x 값과 y 값을 멤버로 가지는 구조체타입 Pos.X = x; Pos.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos); // 첫번째는 표준콘솔출력 핸들값이며, 두번째 인자는 위치값 // SetConsoleCursorPosition 함수에, 콘솔의 출력 핸들을 주고, 위치를 정해주면 커서가 이동하는 것 // 콘솔에서 가로의 크기는 80칸, 세로의 크기는 25칸이므로 최대 좌표는 (0, 0) 부터 (79, 24) 까지 입력할 수 있다. // x, y좌표 위치는 좀 다르다, 그 이유는 알파벳의 크기에 있다.  // 예를 들어 'a'는 높이가 1이라 하면, 가로가 0.5이기 때문에 알파벳 두 개가 연속적으로 있어야 정사각형 인 것을 알 수 있다.  // 모든 알파벳의 크기가 1x0.5이며, 한글이나 한자는 1x1이다. // 테트리스 블럭같은 경우 크기가 1x1이므로 좌표계를 재설정 할 필요가 있다.----> COORD pos = { x * 2,y };//여기만 바뀜(가로를 두배로) // } void CursorView(char show) { CONSOLE_CURSOR_INFO ConsoleCursor; ConsoleCursor.bVisible = show; ConsoleCursor.dwSize = 1; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &ConsoleCursor); } void Movezero(int * x, int * y) { int nkey; printf("□"); if (_kbhit()) // kbhit함수는 사용자로부터 키 입력을 받았는지 안 받았는지 검사하는 함수 { nkey = _getch(); // kbhit함수를 getch함수와 같이 씀!! getch함수는 버퍼가 없어서 코드가 잠시 정지하는 일이 없기 떄문 if (nkey == ARROW) // 방향키일 경우 224 { nkey = _getch(); switch (nkey) { case UP: GotoXY(x, y - 1); *y = *y - 1; break; case DOWN: GotoXY(x, y + 1); *y = *y + 1; break; case LEFT: GotoXY(x - 2, y); *x = *x - 2; break; case RIGHT: GotoXY(x + 2, y); *x = *x + 2; break; } Sleep(100); // C언어와 C++에서의 Sleep은 잠시 대기 /*printf("  ");*/ system("cls"); // system() 함수는 가로안에 있는 문자열을 명령 프롬프트에 직접 치는 효과를 발휘,  clean screen!! } } }
pk7912
2022.01.26
@pk7912님이 새 포스트를 작성했습니다.
#12-1. 미로찾기
header.h // header.h #ifndef HEADER #define HEADER #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <Windows.h> #define SIZE 19 #define XP 40 #define YP 5 void LoadMaze(char num); void GotoXY(int x, int y); void PrintMazeGame(); void CursorView(char show); char maze[SIZE][SIZE]; #endif header.c // header.c #include "header.h" void LoadMaze(char num) { char path[20] = "./Maze"; strncat(path, &num, 1); strcat(path, ".txt"); // path는 아래 값을 가지게 되요. // ./Maze1.txt char str_tmp[50] = { 0. }; FILE* f = fopen(path, "r"); if (f == NULL) { printf("파일열기 실패\n"); exit(1); } else { printf("파일열기 성공\n"); } for (int i = 0; i < SIZE; i++) { fgets(str_tmp, 50, f); char* ptr = strtok(str_tmp, "\t"); for (int j = 0; j < SIZE; j++) { maze[i][j] = *ptr; ptr = strtok(NULL, "\t"); } } fclose(f); } void GotoXY(int x, int y) { COORD Pos; Pos.X = x; Pos.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos); } void PrintMazeGame() { for (int i = 0; i < SIZE; i++) { GotoXY(XP, YP + i); for (int j = 0; j < SIZE; j++) { if (maze[i][j] == '1') printf("■"); else if (maze[i][j] == 'y') printf("★"); else if (maze[i][j] == '0') printf("□"); else printf("●"); } printf("\n"); } } void CursorView(char show) { CONSOLE_CURSOR_INFO ConsoleCursor; ConsoleCursor.bVisible = show; ConsoleCursor.dwSize = 1; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &ConsoleCursor); } header.c // main.c #include "header.h" int main(void) { char level; CursorView(0); GotoXY(XP, YP - 3); printf("미로 찾기 게임\n"); GotoXY(XP, YP - 2); printf("난이도를 선택하세요.(1,2,3)"); scanf_s("%c", &level); LoadMaze(level); while (1)  { PrintMazeGame(); } }
pk7912
2022.01.25
@pk7912님이
[모각코+ 출석 인증] 11일차 - C언어 심화문법 1월 과정 A조
포스트에 댓글을 남겼습니다.
fighting03
2022.01.25
@fighting03님이
[모각코+ 출석 인증] 11일차 - C언어 심화문법 1월 과정 A조
포스트에 댓글을 남겼습니다.
fighting03
2022.01.25
pk7912
2022.01.22
fighting03
2022.01.21
@fighting03님이
[모각코+ 출석 인증] 9일차 - C언어 심화문법 1월 과정 A조
포스트에 댓글을 남겼습니다.
fighting03
2022.01.21
pk7912
2022.01.19
pk7912
2022.01.16
@pk7912님이 새 포스트를 작성했습니다.
[모각코+ 출석 인증] 5일차 - C언어 심화문법 1월 과정 A조
int sum(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; } int mul(int a, int b) { return a * b; } int div(int a, int b) { return a / b; } int main(void) { int a, b; char o; int result = 0; int(*fptr[4])(int, int) = { sum, sub, mul, div }; printf("연산종류를 입력해주세요.(+,-,*,/): "); scanf_s("%c", &o); printf("연산할 두수를 입력하세요.\n"); printf("a :"); scanf_s("%d", &a); printf("b :"); scanf_s("%d", &b); switch (o) { case'+': result = fptr[0](a, b); break; case'-': result = fptr[1](a, b); break; case'*': result = fptr[2](a, b); break; case'/': result = fptr[3](a, b); break; default: printf("연산 기호를 잘못 입력하셨습니다."); return 1; // NULL 값 } printf("\n%d %c %d = %d\n", a, o, b, result); return 0; } *함수로 만든 계산기가 함수 없이 만든것보다 코드가 더많은것 같은데 ... 뭘 잘못한걸까???
pk7912
2022.01.14
@pk7912님이 새 포스트를 작성했습니다.
[모각코+ 출석 인증] 4일차 - C언어 심화문법 1월 과정 A조
int main() { int A[3][3]; int B[3][3]; int S[3][3] = { 0. }; int(*AA)[3] = A; int(*BB)[3] = B; printf("[행렬 A]\n"); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { scanf("%d", &A[i][j]); } } printf("\n\n"); printf("[행렬 B]\n"); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { scanf("%d", &B[i][j]); } } printf("\n\n"); printf("[행렬 A]\n"); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { printf("%d ", A[i][j]); } printf("\n"); } printf("\n\n"); printf("[행렬 B]\n"); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { printf("%d ", B[i][j]); } printf("\n"); } printf("\n\n"); for (int R = 0; R < 3; R++) { for (int C = 0; C < 3; C++) { S[R][C] = 0; for (int K = 0; K < 3; K++) { S[R][C] = S[R][C] + (A[R][K] * B[K][C]); } } } printf("[행렬 곱]\n"); for (int R = 0; R < 3; R++) { for (int C = 0; C < 3; C++) { printf("%d ", S[R][C]); } printf("\n"); } return 0; }
pk7912
2022.01.13
@pk7912님이 새 포스트를 작성했습니다.
[모각코+ 출석 인증] 3일차 - C언어 심화문법 1월 과정 A조
👉 입력 void print_max(int* arr, int** maxx, int size); int main() { int arr[5] = { 0, };//배열 초기화 int* max; // 최대값을 저장하는 이중 포인터 변수 초기화 int size = sizeof(arr) / sizeof(int); //배열 입력받기 printf("5개의 숫자를 입력하시오.\n"); for (int i = 0; i < 5; i++) { scanf_s("%d", &arr[i]); } //함수 사용 print_max(arr,&max, size); //싱글 포인터의 주소 값을 넘겨줌 return 0; } //최대값 구하는 함수 정의 void print_max(int* arr, int ** maxx, int size) { int * max_num = arr; //임의의 포인터 변수 값에 매개변수 배열 arr의 주소값으로 초기화 for (int i = 0; i < size; i++) { if (*max_num <= arr[i]) max_num = &arr[i]; } *maxx = max_num; //반복문을 통해 도출한 최대값의 주소값을 maxx의 포인터 변수값에 저장 //그럼 결국 maxx의 이중 포인터 값은 최대값을 가리키고 있게 된다. printf("\n\n최대값 : %d\n", **maxx); } 👉 출력
kweonsk
2022.01.11
kweonsk
2022.01.11
@kweonsk님이
[모각코+ 출석 인증] 1일차 - C언어 심화문법 1월 과정 A조
포스트에 댓글을 남겼습니다.
sunnyineve
2022.01.10
@sunnyineve님이
[모각코+ 출석 인증] 1일차 - C언어 심화문법 1월 과정 A조
포스트에 댓글을 남겼습니다.
sunnyineve
2022.01.10
fighting03
2022.01.10
@fighting03님이
[모각코+ 출석 인증] 1일차 - C언어 심화문법 1월 과정 A조
포스트에 댓글을 남겼습니다.
fighting03
2022.01.10