티스토리 뷰

포인터


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]);
    *= &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 + 1string[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 샘플
        { 103104105106107108109110101102 },    // 0
        { 107108109110101102103104105106 },    // 1
        { 103107108109110101104105106102 },    // 2
        { 103104105106107108109110101102 },    // 3
        { 108103104105106107109110101102 },    // 4
        { 103104105106107108109110101102 },    // 5
        { 107108109110101102103104105106 },    // 6
        { 103104105106107108109110101102 },    // 7
        { 103104105110106107108109101102 },    // 8
        { 107108109110101102103104105106 }    // 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 *= &(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


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/01   »
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
글 보관함