C/명품 C언어 프로젝트(안기수 저)

명품 C언어 프로젝트 3.2장 연습문제

꾸준함. 2017. 6. 9. 15:29

[1번 문제]

/*

화살표 키를 눌러 숫자를 증가시키거나 감소시키는 프로그램을 작성하시오.

기본 숫자 1000 대해 위쪽 방향 화살표 키를 입력하면 숫자를 증가시키고,

아래쪽 방향 화살표 키를 입력하면 숫자를 감소하게 합니다.

왼쪽 방향 화살표 키와 오른쪽 방향 화살표 키는 감소하거나 증가시킬 단위를 조절하도록 합니다

*/

#include <stdio.h>

#include <conio.h>

#include <Windows.h>

 

#define X_MAX 79

#define Y_MAX 24

 

void gotoxy(int x, int y);

void move_arrow_key(char key, int *num, int *unit);

 

int main(void)

{

        char key;

        int num = 100;

        int unit = 1;

        do

        {

               gotoxy(20, 10);

               printf("증가/감소 시키는 단위:%d", unit);

               gotoxy(20, 5);

               printf("%d", num);

                key = getch();

               move_arrow_key(key, &num, &unit);

        } while (key != 27);

        return 0;

}

 

void gotoxy(int x, int y)

{

        COORD Pos = { x - 1, y - 1 };

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

void move_arrow_key(char key, int *num, int *unit)

{

        switch (key)

        {

        case 72:

               *num = *num + *unit;

               break;

        case 75:

               *unit = *unit - 1;

               if (*unit < 1) //최소 1

                       *unit = 1;

               break;

        case 77:

               *unit = *unit + 1;

               break;

        case 80:

               *num = *num - *unit;

               if (*num < 100) //최소 100

                       *num = 100;

               break;

        default:

               return;

        }

}

 


[2번 문제]

/*

화면 중앙에 문자를 위치시키고, 숫자 키패드를 이용하여 상하좌우의 화살표 외에

그림과 같이 대각선 방향으로도 문자를 이동시키는 프로그램을 작성하시오

55 56 57

52 53 54

49 50 51

*/

#include <stdio.h>

#include <conio.h>

#include <Windows.h>

 

#define X_MAX 79

#define Y_MAX 24

 

void gotoxy(int x, int y);

void move_arrow_key(char key, int *x1, int *y1, int x_b, int y_b);

 

int main(void)

{

        char key;

        int x = 10, y = 5;

        do

        {

               gotoxy(x, y);

               printf("A");

               key = getch();

               printf("\b ");

               move_arrow_key(key, &x, &y, X_MAX, Y_MAX);

        } while (key != 27);

        return 0;

}

 

void gotoxy(int x, int y)

{

        COORD Pos = { x - 1, y - 1 };

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

void move_arrow_key(char key, int *x1, int *y1, int x_b, int y_b)

{

        switch (key)

        {

        case 49:

               *x1 = *x1 - 1;

               if (*x1 < 1)

                       *x1 = 1;

               *y1 = *y1 + 1;

               if (*y1 > y_b)

                       *y1 = y_b;

               break;

        case 50:

               *y1 = *y1 + 1;

               if (*y1 > y_b)

                       *y1 = y_b;

               break;

        case 51:

               *x1 = *x1 + 1;

               if (*x1 > x_b)

                       *x1 = x_b;

               *y1 = *y1 + 1;

               if (*y1 > y_b)

                       *y1 = y_b;

               break;

        case 52:

               *x1 = *x1 - 1;

               if (*x1 < 1)

                       *x1 = 1;

               break;

//53 아무 동작을 취하지 않는다

        case 54:

               *x1 = *x1 + 1;

               if (*x1 > x_b)

                       *x1 = x_b;;

               break;

        case 55:

               *x1 = *x1 - 1;

               if (*x1 < 1)

                       *x1 = 1;

               *y1 = *y1 - 1;

               if (*y1 < 1)

                       *y1 = 1;

               break;

        case 56:

               *y1 = *y1 - 1;

               if (*y1 < 1)

                       *y1 = 1;

               break;

        case 57:

               *x1 = *x1 + 1;

               if (*x1 > x_b)

                       *x1 = x_b;

               *y1 = *y1 - 1;

               if (*y1 < 1)

                       *y1 = 1;

               break;

        }

}


[3번 문제]

/*

화면 중앙에 문자를 위치시키고, 다음의 숫자 키패드를 이용하여 상하좌우의 화살키 외에

그림과 같이 해당 위치로 문자를 이동시키는 프로그램을 작성하시오

Home:해당 line에서 첫번째 열로 이동

End:해당 line에서 마지막 열로 이동

Pg Up:해당 열에서 번째 행으로 이동

Pg Dn:해당 열에서 마지막 행으로 이동

*/

#include <stdio.h>

#include <conio.h>

#include <Windows.h>

 

#define X_MAX 79

#define Y_MAX 24

 

void gotoxy(int x, int y);

void move_arrow_key(char key, int *x1, int *y1, int x_b, int y_b);

 

int main(void)

{

        char key;

        int x = 10, y = 5;

        do

        {

               gotoxy(x, y);

               printf("A");

               key = getch();

               printf("\b ");

               move_arrow_key(key, &x, &y, X_MAX, Y_MAX);

        } while (key != 27);

        return 0;

}

 

void gotoxy(int x, int y)

{

        COORD Pos = { x - 1, y - 1 };

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

void move_arrow_key(char key, int *x1, int *y1, int x_b, int y_b)

{

        switch (key)

        {

        case 49:

               *y1 = y_b;

               break;

        case 50:

               *y1 = *y1 + 1;

               if (*y1 > y_b)

                       *y1 = y_b;

               break;

        case 51:

               *x1 = 1;

               break;

        case 52:

               *x1 = *x1 - 1;

               if (*x1 < 1)

                       *x1 = 1;

               break;

               //53 아무 동작을 취하지 않는다

        case 54:

               *x1 = *x1 + 1;

               if (*x1 > x_b)

                       *x1 = x_b;;

               break;

        case 55:

               *y1 = 1;

               break;

        case 56:

               *y1 = *y1 - 1;

               if (*y1 < 1)

                       *y1 = 1;

               break;

        case 57:

               *x1 = x_b;

               break;

        }

}



[4번 문제]

/*

화살표 키를 한번만 입력하면 해당 방향으로 문자를 연속적으로 이동시키는 프로그램을 작성하시오.

초기 상태에서 문자의 위치는 화면 중앙에 위치시킵니다

*/

#include <stdio.h>

#include <conio.h>

#include <Windows.h>

 

#define X_MAX 79

#define Y_MAX 24

 

void gotoxy(int x, int y);

void move_arrow_key(char chr, int *x, int *y, int x_b, int y_b);

 

int main(void)

{

        char str[50];

        int x = 40, y = 20;

        int key;

        printf("문자열 입력:");

        scanf("%s", str);

        system("cls");

        do

        {

               gotoxy(x, y);

               printf("%s", str);

               key = getch();

               while (!kbhit()) //별도의 입력 전까지

               {

                       system("cls");

                       gotoxy(x, y);

                       printf("%s", str);

                       move_arrow_key(key, &x, &y, X_MAX, Y_MAX);

               }

        } while (key != 27);

        return 0;

}

 

void gotoxy(int x, int y)

{

        COORD Pos = { x - 1, y - 1 };

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

void move_arrow_key(char key, int *x1, int *y1, int x_b, int y_b)

{

        switch (key)

        {

        case 72: //위쪽() 방향의 화살표 입력

               *y1 = *y1 - 1;

               if (*y1 < 1)

                       *y1 = 1; //y좌표의 최소값

               break;

        case 75: //왼쪽() 방향의 화살표 입력

               *x1 = *x1 - 1;

               if (*x1 < 1)

                       *x1 = 1;

               break;

        case 77:

               *x1 = *x1 + 1;

               if (*x1 > x_b)

                       *x1 = x_b;

               break;

        case 80:

               *y1 = *y1 + 1;

               if (*y1 > y_b)

                       *y1 = y_b;

               break;

        default:

               return;

        }

}

 


[5번 문제]

/*

숫자키와 문자 , 화살표 키의 입력을 구분하여 숫자 키나 문자 키를 입력하면 이동시킬 대상의

문자를 입력된 숫자나 문자로 바꾸어서 출력하고, 화살표 키를 입력하면 변환된 문자를

해당 방향으로 이동시키는 프로그램을 작성하시오

*/

#include <stdio.h>

#include <conio.h>

#include <Windows.h>

 

#define X_MAX 79

#define Y_MAX 24

 

void gotoxy(int x, int y);

void move_arrow_key(char chr, int *x, int *y, int x_b, int y_b);

 

int main(void)

{

        char str[2];

        int x = 40, y = 20;

        int key;

        char character;

        system("cls");

        do

        {

               gotoxy(x, y);

               key = getch();

               if (key == 72|| key == 75|| key == 77|| key == 80) //화살표일 경우

               {

                       system("cls");

                       gotoxy(x, y);

                       printf("%c", character);

                       move_arrow_key(key, &x, &y, X_MAX, Y_MAX);

               }

               else if(key>=32&&key<=122)//아스키 코드값으로 알파벳이나 숫자

               {

                       system("cls");

                       gotoxy(x, y);

                       character = key;

                       printf("%c", character);

               }

        } while (key != 27);

        return 0;

}

 

void gotoxy(int x, int y)

{

        COORD Pos = { x - 1, y - 1 };

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

void move_arrow_key(char key, int *x1, int *y1, int x_b, int y_b)

{

        switch (key)

        {

        case 72: //위쪽() 방향의 화살표 입력

               *y1 = *y1 - 1;

               if (*y1 < 1)

                       *y1 = 1; //y좌표의 최소값

               break;

        case 75: //왼쪽() 방향의 화살표 입력

               *x1 = *x1 - 1;

               if (*x1 < 1)

                       *x1 = 1;

               break;

        case 77:

               *x1 = *x1 + 1;

               if (*x1 > x_b)

                       *x1 = x_b;

               break;

        case 80:

               *y1 = *y1 + 1;

               if (*y1 > y_b)

                       *y1 = y_b;

               break;

        default:

               return;

        }

}

 


[6번 문제]

/*

문자열을 입력한 다음에 화살표 키를 누르면 입력된 문자열이 해당 방향으로 이동하는 프로그램을 작성하시오

스페이스 키를 누르면 새로운 문자열을 입력받도록 합니다

*/

#include <stdio.h>

#include <conio.h>

#include <Windows.h>

 

#define X_MAX 79

#define Y_MAX 24

 

void gotoxy(int x, int y);

void move_arrow_key(char chr, int *x, int *y, int x_b, int y_b);

 

int main(void)

{

        char str[50];

        int x = 40, y = 20;

        int key;

        printf("문자열 입력:");

        scanf("%s", str);

        system("cls");

        do

        {

               gotoxy(x, y);

               printf("%s", str);

               key = getch();

               if (key == 72 || key == 75 || key == 77 || key == 80)

               {

                       while (!kbhit()) //별도의 입력 전까지

                       {

                              system("cls");

                              gotoxy(x, y);

                              printf("%s", str);

                              move_arrow_key(key, &x, &y, X_MAX, Y_MAX);

                       }

               }

               else if (key == 32) //스페이스 누르면

               {

                       system("cls");

                       gotoxy(20, 10);

                       printf("새로운 문자열 입력:");

                       scanf("%s", str);

                       system("cls");

                       gotoxy(x, y);

                       printf("%s", str);

               }

        } while (key != 27);

        return 0;

}

 

void gotoxy(int x, int y)

{

        COORD Pos = { x - 1, y - 1 };

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

void move_arrow_key(char key, int *x1, int *y1, int x_b, int y_b)

{

        switch (key)

        {

        case 72: //위쪽() 방향의 화살표 입력

               *y1 = *y1 - 1;

               if (*y1 < 1)

                       *y1 = 1; //y좌표의 최소값

               break;

        case 75: //왼쪽() 방향의 화살표 입력

               *x1 = *x1 - 1;

               if (*x1 < 1)

                       *x1 = 1;

               break;

        case 77:

               *x1 = *x1 + 1;

               if (*x1 > x_b)

                       *x1 = x_b;

               break;

        case 80:

               *y1 = *y1 + 1;

               if (*y1 > y_b)

                       *y1 = y_b;

               break;

        default:

               return;

        }

}

 


[7번 문제]

/*

영화 매트릭스의 시작화면과 같이 숫자와 문자가 연속적으로 이동하는 화면을 화살표 키로 제어하는 프로그램을 작성하시오.

화살표 아래방향을 누르면 화면 위에서 아래 방향으로, 위방향키를 누르면 화면 아래에서 방향으로,

옆으로 누르면 각각 우측에서 좌측으로, 좌측에서 우측으로 이동하게 제어합니다

*/

#include <stdio.h>

#include <conio.h>

#include <Windows.h>

#include <time.h> //srand(time(NULL));

#include <stdlib.h> //rand

 

#define X_MAX 60

#define Y_MAX 30

 

void gotoxy(int x, int y);

void print(int x, int y);

void move_arrow_key(char key, int *x, int *y, int x_b, int y_b);

 

int main(void)

{

        int x = 0, y = 0;

        int key;

        do

        {

               key = getch();

               while (!kbhit())

               {

                       if (key == 72 || key == 75 || key == 77 || key == 80) //화살표일 경우

                       {

                              system("cls");

                              print(x, y);

                              move_arrow_key(key, &x, &y, X_MAX, Y_MAX);

                              Sleep(100); //잠시 시간

                       }

               }

        } while (key != 27);

        return 0;

}

 

void gotoxy(int x, int y)

{

        COORD Pos = { x - 1, y - 1 };

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

void move_arrow_key(char key, int *x1, int *y1, int x_b, int y_b)

{

        switch (key)

        {

        case 72: //위쪽() 방향의 화살표 입력

               *y1 = *y1 - 1;

               if (*y1 < 1)

                       *y1 = 1; //y좌표의 최소값

               break;

        case 75: //왼쪽() 방향의 화살표 입력

               *x1 = *x1 - 1;

               if (*x1 < 1)

                       *x1 = 1;

               break;

        case 77:

               *x1 = *x1 + 1;

               if (*x1 > x_b)

                       *x1 = x_b;

               break;

        case 80:

               *y1 = *y1 + 1;

               if (*y1 > y_b)

                       *y1 = y_b;

               break;

        default:

               return;

        }

}

 

void print(int x, int y) //junhyeon2.cafe.24.com/archves/364 참고

{

        char str[61];

        int i, j;

 

        system("cls");

        for (j = 1; j <= y; j++) //gotoxy->(x-1, y-1) 이므로

        {

               srand(time(NULL));

               for (i = 0; i<X_MAX; i++)

               {

                       if (i % 3 == 0)

                              str[i] = 32;

                       else if (i % 5 == 0)

                              str[i] = rand() % (90 - 65 + 1) + 65;

                       else if (i % 7 == 0)

                              str[i] = rand() % (57 - 48 + 1) + 48;

                       else

                              str[i] = rand() % (122 - 97 + 1) + 97;

               }

               str[i] = '\0';

               gotoxy(x, j);

               printf("%s\n", str);

        }

}


[8번 문제]

/*

[예제 3.2.3] 대해 space bar 키를 누를 경우 화살표를 이용한 그리기와 지우기가 번갈아

실행되도록 프로그램을 수정하시오

*/

#include <stdio.h>

#include <conio.h>

#include <Windows.h>

 

#define X_MAX 79 //가로() 방향의 최댓값

#define Y_MAX 24 //세로()방향의 최댓값

 

void move_arrow_key(char chr, int *x, int *y, int x_b, int y_b);

void gotoxy(int x, int y);

 

int main(void)

{

        char key;

        int x = 10, y = 5;

        while (1)

        {

               do

               {

                       gotoxy(x, y);

                       printf("A");

                       key = getch();

                       move_arrow_key(key, &x, &y, X_MAX, Y_MAX);

               } while (key != 32);//스페이스바 멈춤

               do

               {

                       gotoxy(x, y);

                       printf(" \b "); //출력된 문자의 삭제

                       key = getch();

                       move_arrow_key(key, &x, &y, X_MAX, Y_MAX);

               } while (key != 32);

        }

 

        return 0;

}

 

void gotoxy(int x, int y)

{

        COORD Pos = { x - 1, y - 1 };

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

void move_arrow_key(char key, int *x1, int *y1, int x_b, int y_b)

{

        switch (key)

        {

        case 72: //위쪽() 방향의 화살표 입력

               *y1 = *y1 - 1;

               if (*y1 < 1)

                       *y1 = 1; //y좌표의 최소값

               break;

        case 75: //왼쪽() 방향의 화살표 입력

               *x1 = *x1 - 1;

               if (*x1 < 1)

                       *x1 = 1;

               break;

        case 77:

               *x1 = *x1 + 1;

               if (*x1 > x_b)

                       *x1 = x_b;

               break;

        case 80:

               *y1 = *y1 + 1;

               if (*y1 > y_b)

                       *y1 = y_b;

               break;

        default:

               return;

        }

}


개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


[참고] 명품 C언어 프로젝트 안기수 저, http://junhyeon2.cafe24.com/archives/364



반응형