练习4-1
#include <time.h> #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_TRY_NO 3 /*--- 生成4个不同数字的组合并存入数组x ---*/ void make4digits(int x[]) { int i, j, val; for (i = 0; i < 4; i++) { do { val = rand() % 10; /* 0~9的随机数 */ for (j = 0; j < i; j++) /* 是否已获得此数值 */ if (val == x[j]) break; } while (j < i); /* 循环直至获得不重复的数值 */ x[i] = val; } } /*--- 检查已输入的字符串s的有效性 ---*/ int check(const char s[]) { int i, j; if (strlen(s) != 4) /* 字符串长度不为4 */ return 1; for (i = 0; i < 4; i++) { if (!isdigit(s[i])) return 2; /* 包含了除数字以外的字符 */ for (j = 0; j < i; j++) if (s[i] == s[j]) return 3; /* 含有相同数字 */ } return 0; /* 字符串有效 */ } /*--- hit和blow的判断 ---*/ void judge(const char s[], const int no[], int *hit, int *blow) { int i, j; *hit = *blow = 0; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { if (s[i] == '0' + no[j]) /* 数字一致 */ if (i == j) (*hit)++; /* hit(位置也一致)*/ else (*blow)++; /* blow(位置不一致)*/ } } } /*--- 显示判断结果 ---*/ void print_result(int snum, int spos) { if (spos == 4) printf("回答正确!!"); else if (snum == 0) printf(" 这些数字里没有答案数字。\n"); else { printf(" 这些数字里包括%d个答案数字。\n", snum); if (spos == 0) printf(" 但是数字的位置都不一致。\n"); else printf(" 其中有%d个数字的位置是一致的。\n", spos); } putchar('\n'); } int main(void) { int try_no = 0; /* 输入次数 */ int chk; /* 已输入的字符串的检查结果 */ int hit; /* 位置和数字都正确的数字个数 */ int blow; /* 数字正确但位置不正确的数字个数 */ int no[4]; /* 要猜的数字串 */ char buff[10]; /* 用于存放读取的数字串的字符串 */ clock_t start, end; /* 开始时间/结束时间 */ srand(time(NULL)); /* 设定随机数种子 */ puts("■ 来玩珠玑妙算吧。"); puts("■ 请猜4个数字。"); puts("■ 其中不包含相同数字。"); puts("■ 请像4307这样连续输入数字。"); puts("■ 不能输入空格字符。"); printf("最多输入%d次。\n", MAX_TRY_NO); make4digits(no); /* 生成4个数字各不相同的数字串 */ start = clock(); /* 开始计算 */ do { do { printf("请输入:"); scanf("%s", buff); /* 读取为字符串 */ chk = check(buff); /* 检查读取到的字符串 */ switch (chk) { case 1: puts("\a请确保输入4个字符。"); break; case 2: puts("\a请不要输入除了数字以外的字符。"); break; case 3: puts("\a请不要输入相同的数字。"); break; } } while (chk != 0); try_no++; if (try_no == MAX_TRY_NO) { printf("到达最大输入次数。\n"); break; } judge(buff, no, &hit, &blow); /* 判断 */ print_result(hit + blow, hit); /* 显示判断结果 */ } while (hit < 4); end = clock(); /* 计算结束 */ printf("用了%d次。\n用时%.1f秒。\n", try_no, (double)(end - start) / CLOCKS_PER_SEC); return 0; }练习4-2
#include <time.h> #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int no[4];/* 要猜的数字串 */ /*给出提示*/ void showclue(void) { puts("提示方式为"); puts("提示开头第一个字符"); printf("开头第一个字符为%d\n",no[0]); return; } /*--- 生成4个不同数字的组合并存入数组x ---*/ void make4digits(int x[]) { int i, j, val; for (i = 0; i < 4; i++) { do { val = rand() % 10; /* 0~9的随机数 */ for (j = 0; j < i; j++) /* 是否已获得此数值 */ if (val == x[j]) break; } while (j < i); /* 循环直至获得不重复的数值 */ x[i] = val; } } /*--- 检查已输入的字符串s的有效性 ---*/ int check(const char s[]) { int i, j; if ((s[0] == 'c') && (s[1] == 'l') && (s[2] == 'u') && (s[3] == 'e')) return 4;//show clue if (strlen(s) != 4) /* 字符串长度不为4 */ return 1; for (i = 0; i < 4; i++) { if (!isdigit(s[i])) return 2; /* 包含了除数字以外的字符 */ for (j = 0; j < i; j++) if (s[i] == s[j]) return 3; /* 含有相同数字 */ } return 0; /* 字符串有效 */ } /*--- hit和blow的判断 ---*/ void judge(const char s[], const int no[], int *hit, int *blow) { int i, j; *hit = *blow = 0; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { if (s[i] == '0' + no[j]) /* 数字一致 */ if (i == j) (*hit)++; /* hit(位置也一致)*/ else (*blow)++; /* blow(位置不一致)*/ } } } /*--- 显示判断结果 ---*/ void print_result(int snum, int spos) { if (spos == 4) printf("回答正确!!"); else if (snum == 0) printf(" 这些数字里没有答案数字。\n"); else { printf(" 这些数字里包括%d个答案数字。\n", snum); if (spos == 0) printf(" 但是数字的位置都不一致。\n"); else printf(" 其中有%d个数字的位置是一致的。\n", spos); } putchar('\n'); } int main(void) { int try_no = 0; /* 输入次数 */ int chk; /* 已输入的字符串的检查结果 */ int hit; /* 位置和数字都正确的数字个数 */ int blow; /* 数字正确但位置不正确的数字个数 */ char buff[10]; /* 用于存放读取的数字串的字符串 */ clock_t start, end; /* 开始时间/结束时间 */ srand(time(NULL)); /* 设定随机数种子 */ puts("■ 来玩珠玑妙算吧。"); puts("■ 请猜4个数字。"); puts("■ 其中不包含相同数字。"); puts("■ 请像4307这样连续输入数字。"); puts("■ 不能输入空格字符。\n"); make4digits(no); /* 生成4个数字各不相同的数字串 */ start = clock(); /* 开始计算 */ do { do { printf("请输入:"); scanf("%s", buff); /* 读取为字符串 */ chk = check(buff); /* 检查读取到的字符串 */ switch (chk) { case 1: puts("\a请确保输入4个字符。"); break; case 2: puts("\a请不要输入除了数字以外的字符。"); break; case 3: puts("\a请不要输入相同的数字。"); break; case 4: puts("给出提示。\n"); showclue(); break; } } while ((chk != 0)&&(chk != 4)); try_no++; if (chk != 4) { judge(buff, no, &hit, &blow); /* 判断 */ print_result(hit + blow, hit); /* 显示判断结果 */ } } while (hit < 4); end = clock(); /* 计算结束 */ printf("用了%d次。\n用时%.1f秒。\n",try_no, (double)(end - start) / CLOCKS_PER_SEC); return 0; }练习4-3
#include <time.h> #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_TRY_NO 100 #define MAX_DIGIT_NUM 10 int digit_num; int no[MAX_DIGIT_NUM]; /* 要猜的数字串 */ /*--- 生成4个不同数字的组合并存入数组x ---*/ void makeNdigits(int x[]) { int i, j, val; for (i = 0; i < digit_num; i++) { do { val = rand() % 10; /* 0~9的随机数 */ for (j = 0; j < i; j++) /* 是否已获得此数值 */ if (val == x[j]) break; } while (j < i); /* 循环直至获得不重复的数值 */ x[i] = val; } } /*--- 检查已输入的字符串s的有效性 ---*/ int check(const char s[]) { int i, j; if (strlen(s) != digit_num) /* 字符串长度不为digit_num */ return 1; for (i = 0; i < digit_num; i++) { if (!isdigit(s[i])) return 2; /* 包含了除数字以外的字符 */ for (j = 0; j < i; j++) if (s[i] == s[j]) return 3; /* 含有相同数字 */ } return 0; /* 字符串有效 */ } /*--- hit和blow的判断 ---*/ void judge(const char s[], const int no[], int *hit, int *blow) { int i, j; *hit = *blow = 0; for (i = 0; i < digit_num; i++) { for (j = 0; j < digit_num; j++) { if (s[i] == '0' + no[j]) /* 数字一致 */ if (i == j) (*hit)++; /* hit(位置也一致)*/ else (*blow)++; /* blow(位置不一致)*/ } } } /*--- 显示判断结果 ---*/ void print_result(int snum, int spos) { if (spos == digit_num) printf("回答正确!!"); else if (snum == 0) printf(" 这些数字里没有答案数字。\n"); else { printf(" 这些数字里包括%d个答案数字。\n", snum); if (spos == 0) printf(" 但是数字的位置都不一致。\n"); else printf(" 其中有%d个数字的位置是一致的。\n", spos); } putchar('\n'); } int main(void) { int try_no = 0; /* 输入次数 */ int chk; /* 已输入的字符串的检查结果 */ int hit; /* 位置和数字都正确的数字个数 */ int blow; /* 数字正确但位置不正确的数字个数 */ //int no[4]; /* 要猜的数字串 */ char buff[10]; /* 用于存放读取的数字串的字符串 */ clock_t start, end; /* 开始时间/结束时间 */ srand(time(NULL)); /* 设定随机数种子 */ puts("■ 来玩珠玑妙算吧。"); //puts("■ 请猜4个数字。"); printf("设成几位数?"); scanf("%d",&digit_num); puts("■ 其中不包含相同数字。"); puts("■ 请连续输入数字。"); puts("■ 不能输入空格字符。"); printf("最多输入%d次。\n", MAX_TRY_NO); makeNdigits(no); /* 生成4个数字各不相同的数字串 */ start = clock(); /* 开始计算 */ do { do { printf("请输入:"); scanf("%s", buff); /* 读取为字符串 */ chk = check(buff); /* 检查读取到的字符串 */ switch (chk) { case 1: printf("\a请确保输入%d个字符。",&digit_num); break; case 2: puts("\a请不要输入除了数字以外的字符。"); break; case 3: puts("\a请不要输入相同的数字。"); break; } } while (chk != 0); try_no++; if (try_no == MAX_TRY_NO) { printf("到达最大输入次数。\n"); break; } judge(buff, no, &hit, &blow); /* 判断 */ print_result(hit + blow, hit); /* 显示判断结果 */ } while (hit < digit_num); end = clock(); /* 计算结束 */ printf("用了%d次。\n用时%.1f秒。\n", try_no, (double)(end - start) / CLOCKS_PER_SEC); return 0; }练习4-4
#include <time.h> #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> /*--- 生成4个数字的组合并存入数组x ---*/ void make4digits(int x[]) { int i; for (i = 0; i < 4; i++) { x[i] = rand() % 10; } return; } /*--- 检查已输入的字符串s的有效性 ---*/ int check(const char s[]) { int i, j; if (strlen(s) != 4) /* 字符串长度不为4 */ return 1; for (i = 0; i < 4; i++) { if (!isdigit(s[i])) return 2; /* 包含了除数字以外的字符 */ } return 0; /* 字符串有效 */ } /*--- hit和blow的判断 ---*/ void judge(const char s[], const int no[], int *hit, int *blow) { int i, j; *hit = *blow = 0; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { if (s[i] == '0' + no[j]) /* 数字一致 */ if (i == j) (*hit)++; /* hit(位置也一致)*/ else (*blow)++; /* blow(位置不一致)*/ } } } /*--- 显示判断结果 ---*/ void print_result(int snum, int spos) { if (spos == 4) printf("回答正确!!"); else if (snum == 0) printf(" 这些数字里没有答案数字。\n"); else { printf(" 这些数字里包括%d个答案数字。\n", snum); if (spos == 0) printf(" 但是数字的位置都不一致。\n"); else printf(" 其中有%d个数字的位置是一致的。\n", spos); } putchar('\n'); } int main(void) { int try_no = 0; /* 输入次数 */ int chk; /* 已输入的字符串的检查结果 */ int hit; /* 位置和数字都正确的数字个数 */ int blow; /* 数字正确但位置不正确的数字个数 */ int no[4]; /* 要猜的数字串 */ char buff[10]; /* 用于存放读取的数字串的字符串 */ clock_t start, end; /* 开始时间/结束时间 */ srand(time(NULL)); /* 设定随机数种子 */ puts("■ 来玩珠玑妙算吧。"); puts("■ 请猜4个数字。"); puts("■ 请像4307这样连续输入数字。"); puts("■ 不能输入空格字符。\n"); make4digits(no); /* 生成4个数字的数字串 */ start = clock(); /* 开始计算 */ do { do { printf("请输入:"); scanf("%s", buff); /* 读取为字符串 */ chk = check(buff); /* 检查读取到的字符串 */ switch (chk) { case 1: puts("\a请确保输入4个字符。"); break; case 2: puts("\a请不要输入除了数字以外的字符。"); break; //case 3: puts("\a请不要输入相同的数字。"); break; } } while (chk != 0); try_no++; judge(buff, no, &hit, &blow); /* 判断 */ print_result(hit + blow, hit); /* 显示判断结果 */ } while (hit < 4); end = clock(); /* 计算结束 */ printf("用了%d次。\n用时%.1f秒。\n", try_no, (double)(end - start) / CLOCKS_PER_SEC); return 0; }练习4-5
#include <time.h> #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> /*--- 生成4个不同颜色代号的组合并存入数组x ---*/ void make4digits(int x[]) { int i, j, val; for (i = 0; i < 4; i++) { do { val = rand() % 8 + 1; /* 1~8的随机数 */ for (j = 0; j < i; j++) /* 是否已获得此数值 */ if (val == x[j]) break; } while (j < i); /* 循环直至获得不重复的数值 */ x[i] = val; } } /*--- 检查已输入的字符串s的有效性 ---*/ int check(const char s[]) { int i, j; if (strlen(s) != 4) /* 字符串长度不为4 */ return 1; for (i = 0; i < 4; i++) { if (!isdigit(s[i])) return 2; /* 包含了除数字以外的字符 */ for (j = 0; j < i; j++) if (s[i] == s[j]) return 3; /* 含有相同数字 */ } return 0; /* 字符串有效 */ } /*--- hit和blow的判断 ---*/ void judge(const char s[], const int no[], int *hit, int *blow) { int i, j; *hit = *blow = 0; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { if (s[i] == '0' + no[j]) /* 数字一致 */ if (i == j) (*hit)++; /* hit(位置也一致)*/ else (*blow)++; /* blow(位置不一致)*/ } } } /*--- 显示判断结果 ---*/ void print_result(int snum, int spos) { if (spos == 4) printf("回答正确!!"); else if (snum == 0) printf(" 这些颜色代号里没有答案颜色代号。\n"); else { printf(" 这些颜色代号里包括%d个答案颜色代号。\n", snum); if (spos == 0) printf(" 但是颜色代号的位置都不一致。\n"); else printf(" 其中有%d个颜色代号的位置是一致的。\n", spos); } putchar('\n'); } int main(void) { int try_no = 0; /* 输入次数 */ int chk; /* 已输入的字符串的检查结果 */ int hit; /* 位置和数字都正确的数字个数 */ int blow; /* 数字正确但位置不正确的数字个数 */ int no[4]; /* 要猜的数字串 */ char buff[8];//char buff[10]; /* 用于存放读取的数字串的字符串 */ clock_t start, end; /* 开始时间/结束时间 */ srand(time(NULL)); /* 设定随机数种子 */ puts("■ 来玩珠玑妙算吧。"); puts("颜色版"); puts("1-白色"); puts("2-黑色"); puts("3-红色"); puts("4-蓝色"); puts("5-黄色"); puts("6-绿色"); puts("7-橙色"); puts("8-褐色"); puts("■ 请猜4种颜色。"); puts("■ 请像4317这样连续输入颜色代号。"); puts("■ 其中不包含相同颜色代号。"); puts("■ 请像4317这样连续输入颜色代号。"); puts("■ 不能输入空格字符。\n"); make4digits(no); /* 生成4个数字各不相同的数字串 */ start = clock(); /* 开始计算 */ do { do { printf("请输入:"); scanf("%s", buff); /* 读取为字符串 */ chk = check(buff); /* 检查读取到的字符串 */ switch (chk) { case 1: puts("\a请确保输入4个字符。"); break; case 2: puts("\a请不要输入除了数字以外的字符。"); break; case 3: puts("\a请不要输入相同的数字。"); break; } } while (chk != 0); try_no++; judge(buff, no, &hit, &blow); /* 判断 */ print_result(hit + blow, hit); /* 显示判断结果 */ } while (hit < 4); end = clock(); /* 计算结束 */ printf("用了%d次。\n用时%.1f秒。\n", try_no, (double)(end - start) / CLOCKS_PER_SEC); return 0; }练习4-6 待做
练习4-7
#include <time.h> #include <stdio.h> #include <stdlib.h> int main(void) { int i, j, val; int no; /* 读取的值 */ int ans[3]; /* 目标数字 */ int ansnum; srand(time(NULL)); /* 设定随机数的种子 */ for (i = 0; i < 3; i++) { do { val = rand() % 10; for (j = 0; j < i; j++) if (val == ans[j]) break; } while (j < i); ans[i] = val; } ansnum = ans[0] * 100 + ans[1] * 10 + ans[2] * 1; //ans = rand() % 1000; /* 生成0~999的随机数 */ printf("请猜一个0~999的整数,各位数字不重复。\n\n"); do { printf("是多少呢:"); scanf("%d", &no); if (no > ansnum) printf("\a再小一点。\n"); else if (no < ansnum) printf("\a再大一点。\n"); } while (no != ansnum); /* 重复到猜对为止 */ printf("回答正确。\n"); return 0; }