明解C语言 中级篇 第四章答案
练习4-1
/* 珠玑妙算 */ #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() % 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; /* 开始时间/结束时间 */
int cnt;
srand(time(NULL)); /* 设定随机数种子 */ puts("■ 来玩珠玑妙算吧。");
puts("■ 请猜4个数字。");
puts("■ 其中不包含相同数字。");
puts("■ 请像4307这样连续输入数字。");
puts("■ 不能输入空格字符。\n"); make4digits(no); /* 生成4个数字各不相同的数字串 */
printf("请输入限定次数:");
scanf("%d", &cnt);
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&&try_no<cnt); end = clock(); /* 计算结束 */
if(try_no==cnt)
{
printf("次数已经耗尽,游戏结束");
}
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> /*--- 生成4个不同数字的组合并存入数组x ---*/
void make4digits(int x[])
{
int i, j, val; for (i = ; i < ; i++) {
do {
val = rand() % ; /* 0~9的随机数 */
for (j = ; 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 */
return ; for (i = ; i < ; i++) {
if (!isdigit(s[i]))
return ; /* 包含了除数字以外的字符 */
for (j = ; j < i; j++)
if (s[i] == s[j])
return ; /* 含有相同数字 */
}
return ; /* 字符串有效 */
} /*--- hit和blow的判断 ---*/
void judge(const char s[], const int no[], int* hit, int* blow)
{
int i, j; *hit = *blow = ;
for (i = ; i < ; i++) {
for (j = ; j < ; j++) {
if (s[i] == '' + no[j]) /* 数字一致 */
if (i == j)
(*hit)++; /* hit(位置也一致)*/
else
(*blow)++; /* blow(位置不一致)*/
}
}
} /*--- 显示判断结果 ---*/
void print_result(int snum, int spos)
{
if (spos == )
printf("回答正确!!");
else if (snum == )
printf(" 这些数字里没有答案数字。\n");
else {
printf(" 这些数字里包括%d个答案数字。\n", snum); if (spos == )
printf(" 但是数字的位置都不一致。\n");
else
printf(" 其中有%d个数字的位置是一致的。\n", spos);
}
putchar('\n');
} int main(void)
{
int try_no = ; /* 输入次数 */
int chk; /* 已输入的字符串的检查结果 */
int hit; /* 位置和数字都正确的数字个数 */
int blow; /* 数字正确但位置不正确的数字个数 */
int no[]; /* 要猜的数字串 */
char buff[]; /* 用于存放读取的数字串的字符串 */
int tips;
int tem, i, j;
int cnt = ;
int m;
int p = ;
clock_t start, end; /* 开始时间/结束时间 */
srand(time(NULL)); /* 设定随机数种子 */ puts("■ 来玩珠玑妙算吧。");
puts("■ 请猜4个数字。");
puts("■ 其中不包含相同数字。");
puts("■ 请像4307这样连续输入数字。");
puts("■ 不能输入空格字符。\n");
printf("限定提示次数:");
scanf("%d", &m);
make4digits(no); /* 生成4个数字各不相同的数字串 */
start = clock(); /* 开始计算 */ do {
do {
printf("请输入:");
scanf("%s", buff); /* 读取为字符串 */ chk = check(buff); /* 检查读取到的字符串 */ switch (chk) {
case : puts("\a请确保输入4个字符。"); break;
case : puts("\a请不要输入除了数字以外的字符。"); break;
case : puts("\a请不要输入相同的数字。"); break;
}
} while (chk != ); try_no++;
judge(buff, no, &hit, &blow); /* 判断 */
print_result(hit + blow, hit); /* 显示判断结果 */
if (hit != &&(try_no%==)&&(p!=m)) { puts("需要提示吗?需要----1 不需要----0");
scanf("%d", &tem);
if (tem == ) {
printf("请选择提示类型:1.提示hit数字中最前面的字符。2提示blow的数字中最末尾的1个字符");
scanf("%d", &tips);
if (tips == )
{
for (i = ; i < ; i++) {
if ((buff[i] - '') == no[i]) {
printf("hit第一位是%d\n", no[i]);
p++;
break;
}
} }if (tips == ) {
cnt = ;
for (i = ; i >= ; i--) {
for (j = ; j >= ; j--) {
if ((buff[j] - '') == no[i]) {
if (i != j) {
printf("blow的最后一位是%d\n", (buff[j] - ''));
p++;
cnt++;
}
}
}
if (cnt != )
break;
} } }
}
} while (hit < ); end = clock(); /* 计算结束 */
printf("用了%d次。\n用时%.1f秒。\n",
try_no, (double)(end - start) / CLOCKS_PER_SEC); return ;
}
练习4-3
/* 珠玑妙算 */ #include <time.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h> /*--- 生成num个不同数字的组合并存入数组x ---*/
void make4digits(int x[],int num)
{
int i, j, val; for (i = ; i < num; i++) {
do {
val = rand() % ; /* 0~9的随机数 */
for (j = ; j < i; j++) /* 是否已获得此数值 */
if (val == x[j])
break;
} while (j < i); /* 循环直至获得不重复的数值 */
x[i] = val;
}
} /*--- 检查已输入的字符串s的有效性 ---*/
int check(const char s[],int num)
{
int i, j; if (strlen(s) != num) /* 字符串长度不为num */
return ; for (i = ; i < num; i++) {
if (!isdigit(s[i]))
return ; /* 包含了除数字以外的字符 */
for (j = ; j < i; j++)
if (s[i] == s[j])
return ; /* 含有相同数字 */
}
return ; /* 字符串有效 */
} /*--- hit和blow的判断 ---*/
void judge(const char s[], const int no[], int* hit, int* blow, int num)
{
int i, j; *hit = *blow = ;
for (i = ; i <num ; i++) {
for (j = ; j < num; j++) {
if (s[i] == '' + no[j]) /* 数字一致 */
if (i == j)
(*hit)++; /* hit(位置也一致)*/
else
(*blow)++; /* blow(位置不一致)*/
}
}
} /*--- 显示判断结果 ---*/
void print_result(int snum, int spos,int num)
{
if (spos == num)
printf("回答正确!!");
else if (snum == )
printf(" 这些数字里没有答案数字。\n");
else {
printf(" 这些数字里包括%d个答案数字。\n", snum); if (spos == )
printf(" 但是数字的位置都不一致。\n");
else
printf(" 其中有%d个数字的位置是一致的。\n", spos);
}
putchar('\n');
} int main(void)
{
int try_no = ; /* 输入次数 */
int chk; /* 已输入的字符串的检查结果 */
int hit; /* 位置和数字都正确的数字个数 */
int blow; /* 数字正确但位置不正确的数字个数 */
static int num;
int no[]; /* 要猜的数字串 */
char buff[]; /* 用于存放读取的数字串的字符串 */
clock_t start, end; /* 开始时间/结束时间 */ srand(time(NULL)); /* 设定随机数种子 */ puts("■ 来玩珠玑妙算吧。");
puts("■ 其中不包含相同数字。");
puts("■ 请像4307这样连续输入数字。");
puts("■ 不能输入空格字符。\n");
printf("请设置珠玑妙算的位数:");
scanf("%d", &num); make4digits(no,num); /* 生成4个数字各不相同的数字串 */ start = clock(); /* 开始计算 */ do {
do {
printf("请输入:");
scanf("%s", buff); /* 读取为字符串 */ chk = check(buff,num); /* 检查读取到的字符串 */ switch (chk) {
case : puts("\a请确保输入个字符。"); break;
case : puts("\a请不要输入除了数字以外的字符。"); break;
case : puts("\a请不要输入相同的数字。"); break;
}
} while (chk != ); try_no++;
judge(buff, no, &hit, &blow,num); /* 判断 */
print_result(hit + blow, hit,num); /* 显示判断结果 */ } while (hit < num); end = clock(); /* 计算结束 */ printf("用了%d次。\n用时%.1f秒。\n",
try_no, (double)(end - start) / CLOCKS_PER_SEC); return ;
}
练习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, j, val; for (i = ; i < ; i++) {
val = rand() % ; /* 0~9的随机数 */
x[i] = val;
}
} /*--- 检查已输入的字符串s的有效性 ---*/
int check(const char s[])
{
int i, j; if (strlen(s) != ) /* 字符串长度不为4 */
return ; for (i = ; i < ; i++) {
if (!isdigit(s[i]))
return ; /* 包含了除数字以外的字符 */
}
return ; /* 字符串有效 */
} /*--- hit和blow的判断 ---*/
void judge(const char s[], const int no[], int* hit, int* blow)
{
int i, j; *hit = *blow = ;
for (i = ; i < ; i++) {
for (j = ; j < ; j++) {
if (s[i] == '' + no[j]) /* 数字一致 */
if (i == j)
(*hit)++; /* hit(位置也一致)*/
else
(*blow)++; /* blow(位置不一致)*/
}
}
} /*--- 显示判断结果 ---*/
void print_result(int snum, int spos)
{
if (spos == )
printf("回答正确!!");
else if (snum == )
printf(" 这些数字里没有答案数字。\n");
else {
printf(" 这些数字里包括%d个答案数字。\n", snum); if (spos == )
printf(" 但是数字的位置都不一致。\n");
else
printf(" 其中有%d个数字的位置是一致的。\n", spos);
}
putchar('\n');
} int main(void)
{
int try_no = ; /* 输入次数 */
int chk; /* 已输入的字符串的检查结果 */
int hit; /* 位置和数字都正确的数字个数 */
int blow; /* 数字正确但位置不正确的数字个数 */
int no[]; /* 要猜的数字串 */
char buff[]; /* 用于存放读取的数字串的字符串 */
clock_t start, end; /* 开始时间/结束时间 */
int i;
srand(time(NULL)); /* 设定随机数种子 */ puts("■ 来玩珠玑妙算吧。");
puts("■ 请猜4个数字。");
puts("■ 请像4307这样连续输入数字。");
puts("■ 不能输入空格字符。\n"); make4digits(no); /* 生成4个数字各不相同的数字串 */
for (i = ; i < ; i++) {
printf("%d", no[i]);
}
start = clock(); /* 开始计算 */ do {
do {
printf("请输入:");
scanf("%s", buff); /* 读取为字符串 */ chk = check(buff); /* 检查读取到的字符串 */ switch (chk) {
case : puts("\a请确保输入4个字符。"); break;
case : puts("\a请不要输入除了数字以外的字符。"); break;
}
} while (chk != ); try_no++;
judge(buff, no, &hit, &blow); /* 判断 */
print_result(hit + blow, hit); /* 显示判断结果 */ } while (hit < ); end = clock(); /* 计算结束 */ printf("用了%d次。\n用时%.1f秒。\n",
try_no, (double)(end - start) / CLOCKS_PER_SEC); return ;
}
练习4-5
想不出来可以直接输入汉字的办法,所以一般来说就将数字赋予不同的数字,然后生成0~7的随机数来猜吧
练习4-7
想不出来
练习4-8
/* 猜数游戏(其五:显示输入记录)*/ #include <time.h>
#include <stdio.h>
#include <stdlib.h> #define MAX_STAGE 10 /* 最多可以输入的次数 */
void make4digits(int x[])
{
int i, j, val; for (i = ; i < ; i++) {
do {
val = rand() % ; /* 0~9的随机数 */
for (j = ; j < i; j++) /* 是否已获得此数值 */
if (val == x[j])
break;
} while (j < i); /* 循环直至获得不重复的数值 */
x[i] = val;
}
}
int main(void)
{
int i;
int stage; /* 已输入的次数 */
int no; /* 读取的值 */
int ans[]; /* 目标数字 */
int num[MAX_STAGE]; /* 读取的值的历史记录 */
srand(time(NULL)); /* 设定随机数的种子 */
make4digits(ans);
int x;
x = ans[] + ans[] * + ans[] *; printf("请猜一个0~999的整数。\n\n");
printf("%d", x);
stage = ;
do {
printf("还剩%d次机会。是多少呢:", MAX_STAGE - stage);
scanf("%d", &no);
num[stage++] = no; /* 把读取的值存入数组 */ if (no > x)
printf("\a再小一点。\n");
else if (no < x)
printf("\a再大一点。\n");
} while (no != x && stage < MAX_STAGE); if (no != x)
printf("\a很遗憾,正确答案是%d。\n", x);
else {
printf("回答正确。\n");
printf("您用了%d次猜中了。\n", stage);
} puts("\n--- 输入记录 ---");
for (i = ; i < stage; i++)
printf(" %2d : %4d %+4d\n", i + , num[i], num[i] - x); return ;
}
明解C语言 中级篇 第四章答案的更多相关文章
- 明解C语言 入门篇 第四章答案
练习4-1 #include <stdio.h> int main(void) { int no; int x; do{ printf("请输入一个整数:"); sca ...
- 明解C语言 中级篇 第三章答案
练习3-1 /* 猜拳游戏(其四:分割函数/显示成绩)*/ #include <time.h> #include <stdio.h> #include <stdlib.h ...
- 明解C语言 入门篇 第六章答案
练习6-1 /* 求两个整数中的最小值 */ #include <stdio.h> /*--- 返回三个整数中的最小值 ---*/ int min2(int a, int b) { int ...
- 明解C语言 入门篇 第五章答案
练习5-1 /* 依次把1.2.3.4.5 赋值给数组的每个元素并显示(使用for语句) */ #include <stdio.h> int main(void) { int i; ]; ...
- 明解C语言 入门篇 第三章答案
练习3-1 #include <stdio.h> int main() { int x; int y; puts("请输入两个整数."); printf("整 ...
- 明解C语言 入门篇 第十三章答案
练习13-1 /* 打开与关闭文件 */ #include <stdio.h> int main(void) { ]; FILE* fp; printf("请输入你要打开的文件& ...
- 明解C语言 入门篇 第十一章答案
练习11-1 /* 用指针实现的字符串的改写 */ #include <stdio.h> int main(void) { "; printf("p = \" ...
- 明解C语言 入门篇 第七章答案
练习7-1 #include <stdio.h> int main() { int n; printf(,, ); //此行显示结果为 4 3 6 因为1的字节就是为4,而-1的字节也是4 ...
- 明解C语言 中级篇 第二章答案
练习2-1 /* 倒计时后显示程序运行时间 */ #include <time.h> #include <stdio.h> /*--- 等待x毫秒 ---*/ int slee ...
随机推荐
- [03]使用 VS2019 创建 ASP.NET Core Web 程序
使用 VS2019 创建 ASP.NET Core Web 程序 本文作者:梁桐铭- 微软最有价值专家(Microsoft MVP) 文章会随着版本进行更新,关注我获取最新版本 本文出自<从零开 ...
- pandas 学习 第5篇:DataFrame - 访问数据框
数据框是用于存储数据的二维结构,分为行和列,一行和一列的交叉位置是一个cell,该cell的位置是由行索引和列索引共同确定的.可以通过at/iat,或loc/iloc属性来访问数据框的元素,该属性后跟 ...
- 记一次token安全认证的实践
阅读此文前请先阅读上一篇SpringBoot整合JWT实现用户认证了解JWT. 背景介绍: 因项目需求,有PC端 APP端和小程序端,但登陆接口是同一个,然而微服务也无法使用传统的session解决用 ...
- 动态类型dynamic转换为特定类型T的方案
需求场景:有时候我们抓到一段请求数据,JSON格式的字符串数据,需要放在接口里重现问题,我们就可能会用dynamic先接受数据,然后再转换成特定数据发出请求. 方案一:直接使用特定对象T,来接受请求数 ...
- 关于Spring Boot你不得不知道的事--Spring Boot的基本操作
1 Pom文件 1.1 spring-boot-starter-parent 表示当前pom文件从spring-boot-starter-parent继承下来,在spring-boot-starter ...
- 【面试突击】-RabbitMQ常见面试题(三)
1.什么是RabbitMQ?为什么使用RabbitMQ? 答:RabbitMQ是一款开源的,Erlang编写的,基于AMQP协议的,消息中间件: 可以用它来:解耦.异步.削峰. 2.RabbitMQ有 ...
- JS基础语法---一元运算符
* ++ -- 都是运算符 * ++ 和 -- 可以分为:前+ 和后+ and 前- 和后- * 如果++在后面:如: num++ +10参与 ...
- ECAMScript中的let和const
let与const命令都是用来在js中声明变量的,在使用上与var相似,但存在一些区别,下面先讲let同var的区别 let 怎么使用呢,同var一样,let 变量名 就可以声明了 区别一:其作 ...
- js监听屏幕方向如何第一次默认不监听
this.supportOrientation = typeof window.orientation === 'number'; // 检查屏幕方向 checkScreenOrientation() ...
- VectorMap.js 矢量地图库 – 快速入门
VectorMap.js是一个开源地图渲染JavaScript库, 可以使用WebGL或者HTML5两种方式进行交互式矢量地图 (包括“矢量瓦片地图”,一般性矢量数据地图)和 栅格瓦片地图的渲染. W ...