[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까지 여행)
'C > 명품 C언어 프로젝트(안기수 저)' 카테고리의 다른 글
명품 C언어 프로젝트 5.5장 연습문제 (0) | 2017.08.19 |
---|---|
명품 C언어 프로젝트 5.4장 연습문제 (0) | 2017.08.12 |
명품 C언어 프로젝트 5.2장 연습문제 (0) | 2017.07.30 |
명품 C언어 프로젝트 5.1장 연습문제 (0) | 2017.07.26 |
명품 C언어 프로젝트 4.6장 연습문제 (4) | 2017.07.18 |