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

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

꾸준함. 2017. 8. 5. 12:00

[1번 문제]

/*

[예제 5.3.1]을 응용하여 영문 대소문자와 더불어 숫자나 특수 키에 대해 자판을 연습할 수 있는 프로그램을 작성한다

*/

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <string.h>

#include <time.h>

#include <Windows.h>

 

void intro_game(void);

void keyboard_practice(void);

void display_keyboard(void);

void practice_result(char output[], char input[], char check[], int total);

void gotoxy(int x, int y);

 

int main(void)

{

        intro_game();

        keyboard_practice();

        return 0;

}

 

void intro_game(void)

{

        printf("타자 연습\n\n");

        printf("화면에 영문 소문자, 영문 대문자, 숫자 혹은 특수문자가 나타나면\n");

        printf("바로 해당 문자의 자판을 눌러 줍니다\n");

        printf("문자는 모두 15번 출력됩니다\n\n");

        printf("준비되었으면 키보드를 눌러주세요\n");

        getch();

}

 

void gotoxy(int x, int y)

{

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

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

/*

영문 자판을 표시하고, 자판을 연습하는 함수 keyboard_practice

*/

void keyboard_practice(void)

{

        int i, total = 0;

        char output[15], check[15], input[15];

        srand((unsigned)time(NULL));

        system("cls");

        display_keyboard();

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

        {

               int rnd = rand() % 3 + 1;

               int alpha = rand() % 2 + 1;

               switch (rnd)

               {

               case 1:

                       if (alpha == 1)

                       {

                              output[i] = rand() % 26 + 65; //대문자

                              gotoxy(4, 9);

                              printf("%2d번 문자:%c", i + 1, output[i]);

                              input[i] = getch();

                              if (output[i] == input[i])

                              {

                                      total++;

                                      check[i] = 1;

                              }

                              else

                                      check[i] = 0;

                       }

                       else if (alpha == 2)

                       {

                              output[i] = rand() % 26 + 97; //소문자

                              gotoxy(4, 9);

                              printf("%2d번 문자:%c", i + 1, output[i]);

                              input[i] = getch();

                              if (output[i] == input[i])

                              {

                                      total++;

                                      check[i] = 1;

                              }

                              else

                                      check[i] = 0;

                       }

                       break;

               case 2:

                       output[i] = rand() % 10; //0~9

                       gotoxy(4, 9);

                       printf("%2d번 문자:%d", i + 1, output[i]);

                       input[i] = getch() - 48; //숫자

                       if (output[i] == input[i])

                       {

                              total++;

                              check[i] = 1;

                       }

                       else

                              check[i] = 0;

                       break;

               case 3:

                       output[i] = rand() % 15 + 33; //특수문자

                       gotoxy(4, 9);

                       printf("%2d번 문자:%c", i + 1, output[i]);

                       input[i] = getch();

                       if (output[i] == input[i])

                       {

                              total++;

                              check[i] = 1;

                       }

                       else

                              check[i] = 0;

               }

        }

        gotoxy(4, 10);

        printf("자판연습이 끝났습니다\n");

        gotoxy(4, 11);

        printf("결과를 보려면 아무키나 누르시오");

        getch();

        practice_result(output, input, check, total);

}

 

/*

화면에 영문 소문자 자판을 출력하는 함수 display_keyboard

*/

void display_keyboard(void)

{

        printf("키보드 위치\n");

        printf("-----------------------\n");

        printf("! @ # $ % ^ & * ( ) - +\n");

        printf(" q w e r t y u i o p { } \n");

        printf("  a s d f g h j k l : '\n");

        printf("   z x c v b n m < > ?\n");

        printf("-----------------------\n");

}

 

/*

자판 연습 결과를 출력하는 함수 practice_result

*/

void practice_result(char output[], char input[], char check[], int total)

{

        int i;

        system("cls");

        printf("영문 소문자 자판연습결과\n\n");

        printf("\t출력문자\t입력문자\tOX\n");

        printf("------------------------------------------------\n");

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

        {

               if(output[i]>=65 &&output[i]<=133)

                       printf("%2d:\t  %c\t\t  %c", i + 1, output[i], input[i]);

               else if(output[i]>=33 && output[i]<=47)

                       printf("%2d:\t  %c\t\t  %c", i + 1, output[i], input[i]);

               else if(output[i]>=0 && output[i]<=10)

                       printf("%2d:\t  %d\t\t  %d", i + 1, output[i], input[i]);

               if (check[i] == 0)

                       printf("\t\tX\n");

               else

                       printf("\t\tO\n");

        }

        printf("\n");

        printf("맞은 개수:%d( 15)\n", total);

}


[2번 문제]

/*

문제 1에 대해 정확률을 계산하여 출력하는 프로그램을 작성한다

*/

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <string.h>

#include <time.h>

#include <Windows.h>

 

void intro_game(void);

void keyboard_practice(void);

void display_keyboard(void);

void practice_result(char output[], char input[], char check[], int total);

void gotoxy(int x, int y);

 

int main(void)

{

        intro_game();

        keyboard_practice();

        return 0;

}

 

void intro_game(void)

{

        printf("타자 연습\n\n");

        printf("화면에 영문 소문자, 영문 대문자, 숫자 혹은 특수문자가 나타나면\n");

        printf("바로 해당 문자의 자판을 눌러 줍니다\n");

        printf("문자는 모두 15번 출력됩니다\n\n");

        printf("준비되었으면 키보드를 눌러주세요\n");

        getch();

}

 

void gotoxy(int x, int y)

{

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

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

/*

영문 자판을 표시하고, 자판을 연습하는 함수 keyboard_practice

*/

void keyboard_practice(void)

{

        int i, total = 0;

        char output[15], check[15], input[15];

        srand((unsigned)time(NULL));

        system("cls");

        display_keyboard();

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

        {

               int rnd = rand() % 3 + 1;

               int alpha = rand() % 2 + 1;

               switch (rnd)

               {

               case 1:

                       if (alpha == 1)

                       {

                              output[i] = rand() % 26 + 65; //대문자

                              gotoxy(4, 9);

                              printf("%2d번 문자:%c", i + 1, output[i]);

                              input[i] = getch();

                              if (output[i] == input[i])

                              {

                                      total++;

                                      check[i] = 1;

                              }

                              else

                                      check[i] = 0;

                       }

                       else if (alpha == 2)

                       {

                              output[i] = rand() % 26 + 97; //소문자

                              gotoxy(4, 9);

                              printf("%2d번 문자:%c", i + 1, output[i]);

                              input[i] = getch();

                              if (output[i] == input[i])

                              {

                                      total++;

                                      check[i] = 1;

                              }

                              else

                                      check[i] = 0;

                       }

                       break;

               case 2:

                       output[i] = rand() % 10; //0~9

                       gotoxy(4, 9);

                       printf("%2d번 문자:%d", i + 1, output[i]);

                       input[i] = getch() - 48; //숫자

                       if (output[i] == input[i])

                       {

                              total++;

                              check[i] = 1;

                       }

                       else

                              check[i] = 0;

                       break;

               case 3:

                       output[i] = rand() % 15 + 33; //특수문자

                       gotoxy(4, 9);

                       printf("%2d번 문자:%c", i + 1, output[i]);

                       input[i] = getch();

                       if (output[i] == input[i])

                       {

                              total++;

                              check[i] = 1;

                       }

                       else

                              check[i] = 0;

               }

        }

        gotoxy(4, 10);

        printf("자판연습이 끝났습니다\n");

        gotoxy(4, 11);

        printf("결과를 보려면 아무키나 누르시오");

        getch();

        practice_result(output, input, check, total);

}

 

/*

화면에 영문 소문자 자판을 출력하는 함수 display_keyboard

*/

void display_keyboard(void)

{

        printf("키보드 위치\n");

        printf("-----------------------\n");

        printf("! @ # $ % ^ & * ( ) - +\n");

        printf(" q w e r t y u i o p { } \n");

        printf("  a s d f g h j k l : '\n");

        printf("   z x c v b n m < > ?\n");

        printf("-----------------------\n");

}

 

/*

자판 연습 결과를 출력하는 함수 practice_result

*/

void practice_result(char output[], char input[], char check[], int total)

{

        int i;

        system("cls");

        printf("자판연습결과\n\n");

        printf("\t출력문자\t입력문자\tOX\n");

        printf("------------------------------------------------\n");

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

        {

               if (output[i] >= 65 && output[i] <= 133)

                       printf("%2d:\t  %c\t\t  %c", i + 1, output[i], input[i]);

               else if (output[i] >= 33 && output[i] <= 47)

                       printf("%2d:\t  %c\t\t  %c", i + 1, output[i], input[i]);

               else if (output[i] >= 0 && output[i] <= 10)

                       printf("%2d:\t  %d\t\t  %d", i + 1, output[i], input[i]);

               if (check[i] == 0)

                       printf("\t\tX\n");

               else

                       printf("\t\tO\n");

        }

        printf("\n");

        printf("맞은 개수:%d( 15)\n", total);

        printf("정확률: %.1f\n", (double)total / 15);

}


[3번 문제]

/*

문제 1에 대해 1분에 몇 타를 칠 수 있는지를 계산하는 부분을 추가한다

*/

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <string.h>

#include <time.h>

#include <Windows.h>

 

void intro_game(void);

void keyboard_practice(void);

void display_keyboard(void);

void practice_result(char output[], char input[], char check[], int total);

void gotoxy(int x, int y);

 

int main(void)

{

        intro_game();

        keyboard_practice();

        return 0;

}

 

void intro_game(void)

{

        printf("타자 연습\n\n");

        printf("화면에 영문 소문자, 영문 대문자, 숫자 혹은 특수문자가 나타나면\n");

        printf("바로 해당 문자의 자판을 눌러 줍니다\n");

        printf("1분 안에 최대한 많은 문자를 입력해주세요\n\n");

        printf("준비되었으면 키보드를 눌러주세요\n");

        getch();

}

 

void gotoxy(int x, int y)

{

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

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

/*

영문 자판을 표시하고, 자판을 연습하는 함수 keyboard_practice

*/

void keyboard_practice(void)

{

        int i=0, total = 0;

        char output[100], check[100], input[100];

        time_t start, end; //추가된 부분

        double second;

        srand((unsigned)time(NULL));

        system("cls");

        display_keyboard();

        start = time(NULL);

        do

        {

               end = time(NULL);

               second = difftime(end, start);

               int rnd = rand() % 3 + 1;

               int alpha = rand() % 2 + 1;

               switch (rnd)

               {

               case 1:

                       if (alpha == 1)

                       {

                              output[i] = rand() % 26 + 65; //대문자

                              gotoxy(4, 9);

                              printf("%2d번 문자:%c", i + 1, output[i]);

                              input[i] = getch();

                              if (output[i] == input[i])

                              {

                                      total++;

                                      check[i] = 1;

                              }

                              else

                                      check[i] = 0;

                       }

                       else if (alpha == 2)

                       {

                              output[i] = rand() % 26 + 97; //소문자

                              gotoxy(4, 9);

                              printf("%2d번 문자:%c", i + 1, output[i]);

                              input[i] = getch();

                              if (output[i] == input[i])

                              {

                                      total++;

                                      check[i] = 1;

                              }

                              else

                                      check[i] = 0;

                       }

                       break;

               case 2:

                       output[i] = rand() % 10; //0~9

                       gotoxy(4, 9);

                       printf("%2d번 문자:%d", i + 1, output[i]);

                       input[i] = getch() - 48; //숫자

                       if (output[i] == input[i])

                       {

                              total++;

                              check[i] = 1;

                       }

                       else

                              check[i] = 0;

                       break;

               case 3:

                       output[i] = rand() % 15 + 33; //특수문자

                       gotoxy(4, 9);

                       printf("%2d번 문자:%c", i + 1, output[i]);

                       input[i] = getch();

                       if (output[i] == input[i])

                       {

                              total++;

                              check[i] = 1;

                       }

                       else

                              check[i] = 0;

               }

               i++;

        } while (second < 60.0); //1분 안에

        gotoxy(4, 10);

        printf("자판연습이 끝났습니다\n");

        gotoxy(4, 11);

        printf("걸린 시간: %f", second);

        gotoxy(4, 12);

        printf("결과를 보려면 아무키나 누르시오");

        getch();

        practice_result(output, input, check, total, i);

}

 

/*

화면에 영문 소문자 자판을 출력하는 함수 display_keyboard

*/

void display_keyboard(void)

{

        printf("키보드 위치\n");

        printf("-----------------------\n");

        printf("! @ # $ % ^ & * ( ) - +\n");

        printf(" q w e r t y u i o p { } \n");

        printf("  a s d f g h j k l : '\n");

        printf("   z x c v b n m < > ?\n");

        printf("-----------------------\n");

}

 

/*

자판 연습 결과를 출력하는 함수 practice_result

*/

void practice_result(char output[], char input[], char check[], int correct, int total)

{

        int i;

        system("cls");

        printf("자판연습결과\n\n");

        printf("\t출력문자\t입력문자\tOX\n");

        printf("------------------------------------------------\n");

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

        {

               if (output[i] >= 65 && output[i] <= 133)

                       printf("%2d:\t  %c\t\t  %c", i + 1, output[i], input[i]);

               else if (output[i] >= 33 && output[i] <= 47)

                       printf("%2d:\t  %c\t\t  %c", i + 1, output[i], input[i]);

               else if (output[i] >= 0 && output[i] <= 10)

                       printf("%2d:\t  %d\t\t  %d", i + 1, output[i], input[i]);

               if (check[i] == 0)

                       printf("\t\tX\n");

               else if(check[i] == 1)

                       printf("\t\tO\n");

        }

        printf("\n");

        printf("맞은 개수:%d( %d)\n", correct, total);

        printf("정확률: %.1f\n", (double)correct / total);

}


[4번 문제]

/*

문자가 아닌 문장과 단어에 대해 영문 타자를 연습을 할 수 있는 프로그램을 작성한다

*/

/*

영문 소문자의 자판을 연습하는 프로그램

*/

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <string.h>

#include <time.h>

#include <Windows.h>

 

void intro_game(void);

void keyboard_practice(void);

void display_keyboard(void);

void practice_result(char *output[], char *input[][20], char check[], int total);

void gotoxy(int x, int y);

 

int main(void)

{

        intro_game();

        keyboard_practice();

        return 0;

}

 

void intro_game(void)

{

        printf("영어 단어 연습\n\n");

        printf("화면에 영어 단어가 나타나면\n");

        printf("바로 해당 단어의 자판을 눌러 줍니다\n");

        printf("문자는 모두 15번 출력됩니다\n\n");

        printf("준비되었으면 키보드를 눌러주세요\n");

        getch();

}

 

void gotoxy(int x, int y)

{

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

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

/*

영문 자판을 표시하고, 자판을 연습하는 함수 keyboard_practice

*/

void keyboard_practice(void)

{

        int i, total = 0;

        char *output[15] = { "apple", "banana", "cockroach", "desert", "eagle", "fist", "gesture", "home", "initial", "jack", "kangaroo", "lazy", "monkey", "neck", "ozone" };

        char check[15];

        char *input[15][20] = { NULL, }; //문자 길이 최대 20인 단어 15개를 보관하는 이차원배열

        srand((unsigned)time(NULL));

        system("cls");

        display_keyboard();

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

        {

               gotoxy(4, 9);

               printf("%2d번 단어:%s", i + 1, output[i]);

               gotoxy(4, 10);

               printf("> ");

               gets(input[i]);

               if (!strcmp(output[i], input[i]))

               {

                       total++;

                       check[i] = 1;

               }

               else

                       check[i] = 0;

               gotoxy(4, 9);

               printf("                      ");

               gotoxy(4, 10);

               printf("                      "); //지워준다

        }

        gotoxy(4, 10);

        printf("자판연습이 끝났습니다\n");

        gotoxy(4, 11);

        printf("결과를 보려면 아무키나 누르시오");

        getch();

        practice_result(output, input, check, total);

}

 

/*

화면에 영문 소문자 자판을 출력하는 함수 display_keyboard

*/

void display_keyboard(void)

{

        printf("영문 소문자 자판 위치\n");

        printf("-----------------------\n");

        printf("q w e r t y u i o p\n");

        printf(" a s d f g h j k l\n");

        printf("  z x c v b n m\n");

        printf("-----------------------\n");

}

 

/*

자판 연습 결과를 출력하는 함수 practice_result

*/

void practice_result(char *output[], char *input[][20], char check[], int total)

{

        int i;

        system("cls");

        printf("자판연습결과\n\n");

        printf("\t출력문자\t입력문자\tOX\n");

        printf("------------------------------------------------\n");

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

        {

               printf("%2d:\t  %s        %-10s", i + 1, output[i], input[i]);

               if (check[i] == 0)

                       printf("\tX\n");

               else

                       printf("\tO\n");

        }

        printf("\n");

        printf("맞은 개수:%d( 15)\n", total);

}


[7번 문제]

/*

입력한 문장에 대해 화살표 키를 이용하여 수정할 위치를 선택하고 편집할 수 있는 프로그램을 작성한다

*/

#include <stdio.h>

#include <Windows.h>

#include <conio.h>

 

void gotoxy(int x, int y);

void moveArrow(char chr1, int *arrow, int x_b);

 

int main(void)

{

        char word; //단어 하나하나를 입력할 예정

        int i = 2;

        int arrow = 2;

        char key, key2;

        while (i<=80) //Enter가 아닌 이상

        {

               gotoxy(1, 1);

               printf("    "); //지우기

               gotoxy(1, 1);

               word = getch();

               if (word == '\r') //엔터라면 끝

                       break;

               gotoxy(i, 4);

               printf("%c", word);

               i += 2;

        }

        gotoxy(arrow, 5);

        printf("");

        do

        {

               gotoxy(arrow, 5);

               key = getch();

               if (key == 13)

               {

                       gotoxy(arrow, 4);

                       printf("\b "); //지운다

                       gotoxy(1, 1);

                       word = getch();

                       gotoxy(arrow, 4);

                       printf("%c", word);

                       gotoxy(1, 1);

                       printf("  ");

               }

               else

                       moveArrow(key, &arrow, 80);

        } while (key != 27);

        return 0;

}

 

void gotoxy(int x, int y)

{

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

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

void moveArrow(char chr1, int *arrow, int x_b)

{

        switch (chr1)

        {

        case 75:

               gotoxy(arrow, 5);

               printf("  "); //지운다

               *arrow -= 2;

               if (*arrow < 1)

                       *arrow = 1;

               gotoxy(arrow, 5);

               printf("");

               break;

        case 77:

               gotoxy(arrow, 5);

               printf("  "); //지운다

               *arrow += 2;

               if (*arrow > x_b)

                       *arrow = x_b;

               gotoxy(arrow, 5);

               printf("");

               break;

        default:

               return;

        }

}


[8번 문제]

/*

예제 5.3.5를 이용하여 소리를 들려주고 어느 음인지를 맞추는 청음 프로그램을 작성한다

*/

#include <stdio.h>

#include <math.h>

#include <conio.h>

#include <Windows.h>

#include <stdlib.h>

#include <time.h>

 

int calc_frequency(int octave, int inx);

void practice_piano(void);

 

int main(void)

{

        printf("들려주는 음을 맞추세요\n");

        printf("1: 2: 3: 4: 5: 6: 7: 8:\n");

        printf("프로그램 종료는 Esc\n");

        printf("숙지하셨다면 키보드를 누르세요\n");

        getch();

        practice_piano();

        return 0;

}

 

int calc_frequency(int octave, int inx)

{

        double do_scale = 32.7032;

        double ratio = pow(2., 1 / 12.), temp;

        int i;

        temp = do_scale*pow(2, octave - 1);

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

        {

               temp = (int)(temp + 0.5);

               temp *= ratio;

        }

        return (int)temp;

}

 

void practice_piano(void)

{

        int index[] = { 0, 2, 4, 5, 7, 9, 11, 12 };

        int total = 0;

        char *sound[8] = { "", "", "", "", "", "", "", "높은 도" };

        int freq[8], code, i;

        srand((unsigned)time(NULL));

        do

        {

               int correct = 0;

               i = rand() % 8; //8개 중 하나

               freq[i] = calc_frequency(4, index[i]);

               printf("1초 뒤에 들려주는 음을 맞추시오\n");

               Sleep(1000);

               while (!correct)

               {

                       Beep(freq[i], 1000); //1초동안 들려준다

                       code = getch();

                       if ('1' <= code&&code <= '8')

                       {

                              code -= 49;

                              if (code == i)

                              {

                                      printf("입력하신 음:%s\t맞았습니다\n", sound[code]);

                                      correct += 1;

                              }

                              else

                              {

                                      printf("입력하신 음:%s\t틀렸습니다\n", sound[code]);

                                      printf("다시 시도하세요\n");

                              }

                       }

               }

               total += 1;

        } while (total != 3);

}


[9번 문제]

/*

음을 한글 또는 영문으로 입력하면 해당 음을 스피커로 출력하는 프로그램을 작성합니다

*/

#include <stdio.h>

#include <math.h>

#include <conio.h>

#include <Windows.h>

#include <stdlib.h>

#include <time.h>

 

int calc_frequency(int octave, int inx);

void practice_piano(void);

 

int main(void)

{

        printf("음을 입력하면 소리가 나옵니다\n");

        printf("Ex) '' 'do'을 입력하시면 도 음이 나옵니다\n");

        printf("프로그램 종료는 '종료' 입력\n");

        printf("숙지하셨다면 키보드를 누르세요\n");

        getch();

        practice_piano();

        return 0;

}

 

int calc_frequency(int octave, int inx)

{

        double do_scale = 32.7032;

        double ratio = pow(2., 1 / 12.), temp;

        int i;

        temp = do_scale*pow(2, octave - 1);

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

        {

               temp = (int)(temp + 0.5);

               temp *= ratio;

        }

        return (int)temp;

}

 

void practice_piano(void)

{

        int index[] = { 0, 2, 4, 5, 7, 9, 11, 12 };

        int total = 0;

        char word[20];

        char *sound[8] = { "", "", "", "", "", "", "", "높은도" };

        char *sound2[8] = { "do", "re", "mi", "fa", "sol", "ra", "si", "highdo" };

        int freq[8];

        srand((unsigned)time(NULL));

        while(1)

        {

               int i = 0;

               printf("음을 입력하세요('종료' 입력시 프로그램 종료)");

               scanf("%s", word);

               if (!strcmp(word, "종료"))

                       break;

               while (1)

               {

                       if (!strcmp(sound[i], word) || !strcmp(sound2[i], word))

                              break;

                       else

                              i++;

               }

               freq[i] = calc_frequency(4, index[i]);

               printf("%s(%s) 음이 나옵니다\n", sound[i], sound2[i]);

               Beep(freq[i], 1000);

               total += 1;

        }

}


개발환경:Visual Studio 2017


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


[참고] 명품 C언어 프로젝트 안기수 저


*5, 6번 문제는 토의 문제였기 때문에 게시하지 않았습니다.

*원카드는 여행을 갔다온 다음에 마저 작성하겠습니다(~8/9까지 여행)



반응형