티스토리 뷰
포인터
1.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #include <stdio.h> void set_proverb(char **q, int n) { static char * array[10] = { "Think like a man of action and act like man of thought.", "Courage is very important.Like a muscle, it is strengthened by use.", "Life is the art of drawing sufficient conclusions from insufficient premises.", "By doubting we come at the truth.", "A man that hath no virtue in himself, ever envieth virtue in others.", "When money speaks, the truth keeps silent.", "Better the last smile than the first laughter.", "In the morning of life, work; in the midday, give counsel; in the evening, pray.", "Painless poverty is better than embittered wealth.", "A poet is the painter of the soul." }; printf("%s\n", array[n - 1]); printf("%d\n", &array[n - 1]); *q = &array[n - 1]; // (char *) * == char * [] }; int main() { char *s; // char를 가르키는 어떤 포인터 int choice; printf("1~10사이의 속담을 선택하세요 : "); scanf("%d", &choice); set_proverb(&s, choice); // 어떤 포인터의 주소를 넘김 printf("%d", s); return 0; } | cs |
3.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #include <stdio.h> #include <stdlib.h> #include <string.h> #define s_size 10 // 문자열 배열의 크기 #define buffer_size 30 // 입력버퍼 크기 void pr_str_array(char **dp, int n) { for (int i = 1; i <= s_size; i++) { printf("%02d : %s\n", i, dp[i - 1]); // 자리 맞춰서 출력, %2d 빈칸 두개, %02d 빈칸 대신 0 free(dp[i - 1]); // 메모리 해제, malloc() 이나 calloc() 에서 할당 받은 메모리를 시스템에 반환합니다. 포인터 값이 NULL이면 작업을 취소합니다. dp[i - 1] = NULL; // string 배열의 포인터 제거 } } int main() { char * string[s_size]; // s_size 크기의 포인터 char buffer[buffer_size]; // 입력버퍼 int s_length; // 문자열 길이 int arr_count = 0; // 배열 갯수 for (int i = 0; i < s_size; i++) { printf("%d번째 문자열을 입력하세요 : ", i + 1); scanf("%s", buffer); // buffer에 문자열 할당 s_length = strlen(buffer); // \n 직전까지의 문자의 갯수를 반환 if (s_length > 0) { char * str_pointer = (char *)malloc(sizeof(char)* (s_length + 1)); strcpy(str_pointer, buffer); string[arr_count] = str_pointer; arr_count++; } else { break; } } pr_str_array(string, s_size); /* for (int i = 0; i < s_size; i++) { printf("%02d : %s\n", i, string[i]); // 자리 맞춰서 출력, %2d 빈칸 두개, %02d 빈칸 대신 0 free(string[i]); // 메모리 해제 } */ return 0; } | cs |
5.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #include <stdio.h> #include <stdlib.h> #include <string.h> #define s_size 3 // 문자열 배열의 크기 #define buffer_size 30 // 입력버퍼 크기 void sort_strings(char *s[], int size) { for (int i = 0; i < size; i++) { for (int j = i + 1; j < size; j++) { if (strcmp(s[i], s[j]) > 0) { // 문자열 비교함수 char *sub = s[i]; s[i] = s[j]; s[j] = sub; } } printf("%02d : %s\n", i + 1, s[i]); } } int main() { char * string[s_size]; // s_size 크기의 포인터 char buffer[buffer_size]; // 입력버퍼 int s_length; // 문자열 길이 int arr_count = 0; // 배열 갯수 for (int i = 0; i < s_size; i++) { printf("%d번째 문자열을 입력하세요 : ", i + 1); scanf("%s", buffer); // buffer에 문자열 할당 s_length = strlen(buffer); // \n 직전까지의 문자의 갯수를 반환 if (s_length > 0) { char * str_pointer = (char *)malloc(sizeof(char)* (s_length + 1)); strcpy(str_pointer, buffer); string[arr_count] = str_pointer; arr_count++; } else { break; } } sort_strings(string, s_size); for (int i = 0; i < s_size; i++) { // main 내에서 확인 printf("%02d : %s\n", i + 1, string[i]); } return 0; } | cs |
7.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | #include <stdio.h> #define ROWS 10 #define COLS 10 typedef unsigned char pixel; void trun_binary(pixel s[][COLS], int k) { for (int i = 0; i < ROWS; i++) { for (int j = 0; j < ROWS; j++) { (s[i][j] < k) ? printf("0 ") : printf("1 "); } printf("\n"); } } void turn_bw(pixel s[][COLS]) { for (int i = 0; i < ROWS; i++) { for (int j = 0; j < ROWS; j++) { s[i][j] = 255 - (int)s[i][j]; printf("%d", s[i][j]); } printf("\n"); } } int main() { int k; // 임계값 pixel image[ROWS][COLS] = { // 10 X 10 샘플 { 103, 104, 105, 106, 107, 108, 109, 110, 101, 102 }, // 0 { 107, 108, 109, 110, 101, 102, 103, 104, 105, 106 }, // 1 { 103, 107, 108, 109, 110, 101, 104, 105, 106, 102 }, // 2 { 103, 104, 105, 106, 107, 108, 109, 110, 101, 102 }, // 3 { 108, 103, 104, 105, 106, 107, 109, 110, 101, 102 }, // 4 { 103, 104, 105, 106, 107, 108, 109, 110, 101, 102 }, // 5 { 107, 108, 109, 110, 101, 102, 103, 104, 105, 106 }, // 6 { 103, 104, 105, 106, 107, 108, 109, 110, 101, 102 }, // 7 { 103, 104, 105, 110, 106, 107, 108, 109, 101, 102 }, // 8 { 107, 108, 109, 110, 101, 102, 103, 104, 105, 106 } // 9 }; /* pixel image[ROWS][COLS]; for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { int insert_color; printf("%d행 %d열의 명암값을 입력하세요(0~255) : ", i + 1, j + 1); scanf("%d", &insert_color); image[i][j] = insert_color; } } */ printf("임계값을 입력해주세요(1~255) : "); // 임계값보다 크거나 같은 경우 255, 작은경우 0 scanf("%d", &k); trun_binary(image, k); turn_bw(image); trun_binary(image, k); return 0; } | cs |
9.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 | #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <Windows.h> #define WIDTH 19 #define HEIGHT 19 #define RIGHT 77 #define LEFT 75 #define UP 72 #define DOWN 80 #define SPACE 32 #define ENTER 13 typedef enum target { EMPTY = 0, MAN = 1 } TARGET; typedef unsigned char shortchar; typedef struct arrow { int col, row; } ARROR; void gotoxy(int x, int y) { COORD CursorPosition = { x,y }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), CursorPosition); } void draw_board(TARGET locate[][WIDTH]); int took_stone(TARGET locate[][WIDTH], ARROR pointLocation); ARROR get_position(); // 이동키로 위치를 입력받을 함수 int next_generation(TARGET present[][WIDTH]) { int count = 0; TARGET future[HEIGHT][WIDTH] = { EMPTY }; // 현재 줄의 변화가 다음 줄에 영향을 주므로 매개값 생성 for (int i = 0; i < HEIGHT; i++) { for (int j = 0; j < WIDTH; j++) { int neighbor = 0; TARGET *p = &(present[i][j]); neighbor += *(p - HEIGHT - 1); neighbor += *(p - HEIGHT); neighbor += *(p - HEIGHT + 1); neighbor += *(p - 1); neighbor += *(p + 1); neighbor += *(p + HEIGHT - 1); neighbor += *(p + HEIGHT); neighbor += *(p + HEIGHT + 1); if (present[i][j] == EMPTY) { if (neighbor == 3) { future[i][j] = MAN; } } else if (present[i][j] == MAN) { ++count; if (neighbor == 2 || neighbor == 3) { future[i][j] = MAN; } } } } memcpy(present, future, sizeof(future)); return count; } int main() { shortchar generation = 0; // 세대 정보 ARROR pointLocation; // 위치 입력 TARGET status[HEIGHT][WIDTH] = { EMPTY }; // 격자 상황 ROW, COLS shortchar gameSetting = 0; // 게임 진행 상황 do { draw_board(status); // 격자 그리기 printf("생명의 위치를 지정하세요(방향키로 이동, SPACE로 배치, ENTER로 저장)\n"); pointLocation = get_position(); if (pointLocation.col == -1 && pointLocation.row == -1) { gameSetting = 1; continue; } else if (took_stone(status, pointLocation)) { continue; } } while (!gameSetting); do { ++generation; draw_board(status); // Sleep(1000); // 속도 제어 } while (next_generation(status)); printf("남은 생존자가 없습니다.\n"); return 0; } void draw_board(TARGET locate[][WIDTH]) { system("cls"); for (int i = 64; i <= 64 + WIDTH; i++) { // X좌표계 출력 if (i == 64) { printf(" "); } else { printf("%c ", (char)i); } } printf("\n"); // 윗줄 격자 생성 printf(" ┌─"); for (int j = 0; j < WIDTH; j++) { printf("┬─"); } printf("┐\n"); // 메인 게임판 for (int i = 0; i < HEIGHT; i++) { printf("%02d├─", i + 1); // Y좌표계 출력 for (int j = 0; j < WIDTH; j++) { if (locate[i][j] == 0) { printf("┼─"); } else if (locate[i][j] == -1) { printf("○"); } else { printf("●"); } } printf("┤\n"); } // 아래줄 격자 생성 printf(" └─"); for (int j = 0; j < WIDTH; j++) { printf("┴─"); } printf("┘\n"); } int took_stone(TARGET locate[][WIDTH], ARROR pointLocation) { int c = pointLocation.col - 1; int r = pointLocation.row - 1; if (locate[r][c] != 0) { return 1; // 해당 위치 생명이 있는 경우 } else { locate[r][c] = MAN; // status[HEIGHT][WIDTH]에 대입 } return 0; } ARROR get_position() { ARROR instance; ARROR end = { -1, -1 }; int k = 1; int x = 1, y = 1; int cursor_x = 5, cursor_y = 2; do { int z = _getch(); // char c 변수에 문자를 입력 받는다 switch (z) { case RIGHT: ++x, cursor_x += 2; if (x > WIDTH) { --x, cursor_x -= 2; // 만약 게임판을 넘어선다면 입력이 무시가 됩니다. } gotoxy(cursor_x, cursor_y); // 아니라면 커서를 입력한 좌표로 이동합니다. break; // 그리고 다시 입력을 받기 위해 swtich문을 빠져 나가며 다시 루트가 됩니다. case LEFT: --x, cursor_x -= 2; if (x <= 0) { ++x, cursor_x += 2; } gotoxy(cursor_x, cursor_y); break; case UP: --y, --cursor_y; if (y <= 0) { ++y, ++cursor_y; } gotoxy(cursor_x, cursor_y); break; case DOWN: ++y, ++cursor_y; if (y > HEIGHT) { --y, --cursor_y; } gotoxy(cursor_x, cursor_y); break; case SPACE: // SPACE가 입력되면 현재 위치를 게임판에 저장 instance.col = x; instance.row = y; k = 0; // 무한루프를 벗어납니다. break; case ENTER: // ENTER가 입력되면 life game 시작 instance = end; k = 0; // } } while (k); return instance; } | cs |
'프로그래밍 > C' 카테고리의 다른 글
[자료구조] 4일차_과제(180323) - 재귀함수 (0) | 2018.03.30 |
---|---|
[창의적it 프로그래밍] 2차 과제 -동적메모리와 연결리스트- (0) | 2018.03.21 |
[자료구조] 2일차_과제(180316) - 오목 (0) | 2018.03.16 |
[창의적it 프로그래밍] 1차 과제 -구조체- (0) | 2018.03.13 |
[자료구조] 1일차_생각해 볼 내용(180312) (0) | 2018.03.08 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- SQLite
- node.js
- 이진탐색 #중복
- Quasar
- RDBMS
- aws
- Remix
- nosql
- vue.js
- vue
- svelte
- alpine.js
- Cloud
- PostgreSQL
- Gatsby.js
- MySQL
- gcp
- Next.js
- DevOps
- Azure
- nuxt.js
- Angular
- REACT
- oracle
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함