前言
本文为业余学习《明解C语言中级篇》的记录,包含代码清单和练习题。
开始学习时间:2022年12月14日
+++++++++++++++++++++++++++++++
第1章 猜数游戏
+++++++++++++++++++++++++++++++
1-1 猜数判定
list 1-1
//猜数游戏(其一:测试版)
#include <stdio.h>
int main()
{
int no;
int ans=7;
printf("请猜一个0~9的整数。\n\n");
printf("是多少呢:");
scanf("%d",&no);
if(no>ans)
{
printf("\a再小一点。\n");
}
else if(no<ans)
{
printf("\a再大一点。\n");
}
else
{
printf("\a回答正确。\n");
}
return 0;
}
1-2 重复到猜对为止
list 1-2
//猜数游戏(其二:重复到猜对为止——利用do语句)
#include <stdio.h>
int main()
{
int no;
int ans=7;
printf("请猜一个0~9的整数。\n\n");
do
{
printf("是多少呢:");
scanf("%d",&no);
if(no<ans)
{
printf("\a再大一点。\n");
}
else if(no>ans)
{
printf("\a再小一点。\n");
}
}while(no != ans);
printf("\a回答正确。\n");
return 0;
}
list 1-3
//猜数游戏(另一种解法):重复到猜对为止——利用while语句
#include <stdio.h>
int main()
{
int no;
int ans=7;
printf("请猜一个0~9的整数。\n\n");
while(1)
{
printf("是多少呢:");
scanf("%d",&no);
if(no<ans)
{
printf("\a再大一点。\n");
}
else if(no>ans)
{
printf("\a再小一点。\n");
}
else
{
break;
}
}
printf("\a回答正确。\n");
return 0;
}
1-3 随机设定目标数字
list 1-4
//生成随机数(其一)
#include <stdio.h>
#include <stdlib.h>
int main()
{
int retry;
printf("在这个编程环境中能够生成0~%d的随机数。\n",RAND_MAX);
do
{
printf("\n生成了随机数%d。\n",rand());
printf("再运行一次?…(0)否(1)是:");
scanf("%d",&retry);
}while(retry == 1);
return 0;
}
list 1-5
//生成随机数(其二:根据当前时间设定随机数的种子)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int retry;
srand(time(NULL));
printf("在这个编程环境中能够生成0~%d的随机数。\n",RAND_MAX);
do
{
printf("\n生成了随机数%d。\n",rand());
printf("再运行一次?…(0)否(1)是:");
scanf("%d",&retry);
}while(retry == 1);
return 0;
}
list 1-6
//猜数游戏(其三:目标数字是0~999的随机数)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int no;
int ans;
srand(time(NULL));
ans=rand() % 1000;
printf("请猜一个0~999的整数。\n\n");
do
{
printf("是多少呢:");
scanf("%d",&no);
if(no>ans)
{
printf("\a再小一点。\n");
}
else if(no<ans)
{
printf("\a再大一点。\n");
}
}while(no != ans);
printf("回答正确。\n");
return 0;
}
list 1-7
//猜数游戏(其四:限制输入次数)
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
int no;
int ans;
const int max_stage = 10;
int remain = max_stage;
srand(time(NULL));
ans = rand() % 1000;
printf("请猜一个0~999的整数。\n\n");
do
{
printf("还剩%d次机会。是多少呢:",remain);
scanf("%d",&no);
remain--;
if (no > ans)
{
printf("\a再小一点。\n");
}
else if (no < ans)
{
printf("\a再大一点。\n");
}
}while (no != ans && remain > 0);
if (no != ans)
{
printf("\a很遗憾,正确答案是%d。\n",ans);
}
else
{
printf("\a回答正确。\n");
printf("您用了%d次猜中了。\n",max_stage - remain);
}
return 0;
}
1-4 保存输入记录
list 1-8
//猜数游戏(其五:显示输入记录)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_STAGE 10
int main()
{
int no;
int ans;
int num[MAX_STAGE];
int stage;
int i;
srand(time(NULL));
ans = rand() % 1000;
printf("请猜一个0~999的整数。\n\n");
stage = 0;
do
{
printf("还剩%d次机会。是多少呢:",MAX_STAGE - stage);
scanf("%d",&no);
num[stage++] = no;
if (no > ans)
{
printf("再小一点。\n");
}
else if (no < ans)
{
printf("再大一点。\n");
}
}while (no != ans && stage < MAX_STAGE);
if (no != ans)
{
printf("很遗憾,正确答案是%d。\n",ans);
}
else
{
printf("回答正确。\n");
printf("您用了%d次猜中了。\n",stage);
}
puts("\n--- 输入记录 ---");
for (i=0;i<stage;i++)
{
printf("%2d : %4d %+6d\n",i + 1,num[i],num[i] - ans);
}
return 0;
}
list 1-9
//显示数组的元素个数和各个元素的值
#include <stdio.h>
int main()
{
int i;
int a[] = {1,2,3,4,5};
int na = sizeof (a) / sizeof (a[0]);
printf("数组a的元素个数是%d。\n",na);
for (i = 0; i < na ; i++)
{
printf("a[%d] = %d\n", i, a[i]);
}
return 0;
}
自由演练
练习 1-1
//练习1-1 抽签程序
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
int no;
char arr[][5] = {"大吉","中吉","小吉","吉","末吉","凶","大凶"};
srand(time(NULL));
no = rand() % 7;
printf("您抽中了第%d签,是%s签。\n", no + 1, arr[no]);
return 0;
}
练习 1-2
//改写练习1-1代码,使“末吉”、“凶”、“大凶”的概率减小
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
int no;
char arr[][5] = {"大吉","中吉","小吉","吉","末吉","大吉","凶","中吉","大凶","小吉","吉"};
srand(time(NULL));
no = rand() % 11;
printf("您抽中了第%d签,是%s签。\n", no + 1, arr[no]);
return 0;
}
练习 1-3
//编写“猜数游戏”,使目标数字是一个在-999和999之间的整数,考虑输入次数定多少合适
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define MAX_STAGE 11 //MAX_STAGE = 2为底1999的对数(约等于11)(-999至999共1999个整数)
int main()
{
int no;
int stage;
int ans;
int num[MAX_STAGE];
int i;
srand(time(NULL));
ans = rand() % 1999 - 999; //rand() % 1999的范围为0~1998
stage = 0;
do
{
printf("还剩%d次机会。是多少呢:",MAX_STAGE - stage);
scanf("%d", &no);
num[stage++] = no;
if (no > ans)
{
printf("再小一点。\n");
}
else if (no < ans)
{
printf("再大一点。\n");
}
}while (no != ans && stage < MAX_STAGE);
if (no != ans)
{
printf("很遗憾,正确答案是%d。\n", ans);
}
else
{
printf("回答正确。\n");
printf("您用了%d次猜中了。\n", stage);
}
printf("\n--- 输入记录 ---\n");
for (i = 0; i < stage; i++)
{
printf(" %2d : %4d %+4d\n", i + 1, num[i], num[i] - ans);
}
return 0;
}
练习 1-4
/*
编写“猜数游戏”。
一、使目标数字是一个在3和999之间3的倍数
二、考虑输入次数定多少合适
三、提供两种功能:
1.输入值不是3的倍数时直接退出游戏;
2.输入值不是3的倍数时,不显示比较结果,直接让玩家再次输入新的值,不计算次数。
*/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
// 999 / 3 = 333,MAX_STAGE = 2为底333的对数为8.3(取9)
#define MAX_STAGE 9
int main()
{
int no;
int stage = 0;
int ans;
int model;
srand(time(NULL));
ans = (rand() % 333 + 1) * 3;
do
{
printf("请选择游戏模式【当输入值不是3的倍数时:1…结束游戏,2…重新输入】:");
scanf("%d", &model);
}while (model < 1 || model > 2);
printf("请猜一个3~999之间的整数。\n");
switch (model)
{
case 1 :
do
{
printf("还剩%d次机会。是多少呢:",MAX_STAGE - stage);
scanf("%d", &no);
stage++;
if (no % 3 != 0)
{
puts("您猜了不是3的倍数的值,GAME OVER!");
return 0;
}
else if (no < ans)
{
printf("再大一点。\n");
}
else if (no > ans)
{
printf("再小一点。\n");
}
}while (no != ans && stage < MAX_STAGE);
if (no != ans)
{
printf("很遗憾,超次数了。正确答案是%d。\n", ans);
}
else
{
printf("回答正确。\n");
printf("您用了%d次猜中了。\n", stage);
}
break;
case 2 :
do
{
printf("是多少呢:");
scanf("%d", &no);
stage++;
if (no == ans)
{
printf("恭喜你猜对了,你用了%d次猜中了。\n",stage);
return 0;
}
}while (no % 3 != 0 || no != ans);
break;
}
return 0;
}
练习 1-5
/*
编写“猜数游戏”。
目标范围运行时的随机数决定。
自动选定一个合适的值作为最多输入的次数。
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
int main()
{
int i;
int stage = 0;
int no;
int ans;
int BeginNum;
int EndNum;
int MAX_STAGE;
//因目标范围随机,无法提前计算合适的次数,按RAND_MAX=32767计算,最大为2的15次方
int num[15];
srand(time(NULL));
BeginNum = rand();
EndNum = rand();
if (BeginNum > EndNum)
{
int temp = BeginNum;
BeginNum = EndNum;
EndNum = temp;
}
ans = rand() % (EndNum - BeginNum + 1) + BeginNum;
MAX_STAGE = (int)ceil(log(EndNum - BeginNum) / log(2)); //合适的猜测次数
printf("请猜一个%d至%d之间的整数。\n", BeginNum, EndNum);
do
{
printf("还有%d次机会,是多少呢:",MAX_STAGE - stage);
scanf("%d", &no);
num[stage++] = no;
if (no < ans)
{
printf("再大一点。\n");
}
else if (no > ans)
{
printf("再小一点。\n");
}
}while (no != ans && stage<MAX_STAGE);
if (no != ans)
{
printf("真遗憾,答案是%d。\n", ans);
}
else
{
printf("恭喜你,你用了%d次猜中!\n", stage);
}
printf("\n--- 输入记录 ---\n");
for (i = 0; i < stage; i++)
{
printf(" %2d : %4d %+4d\n", i + 1, num[i], num[i] - ans);
}
return 0;
}
练习 1-6
//编写“猜数游戏”,让玩家选择游戏等级
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int i;
int no;
int ans;
int stage;
int choose;
int num[15];
int max_stage;
puts("----难度等级----");
puts("[1] 1~9");
puts("[2] 1~99");
puts("[3] 1~999");
puts("[4] 1~9999");
puts("----------------");
do
{
printf("请选择:");
scanf("%d", &choose);
}while (choose < 1 || choose > 4);
srand(time(NULL));
stage = 0;
putchar('\n');
switch (choose)
{
case 1 :
ans = 1 + rand() % 9;
max_stage = (int) ceil(log(9) / log(2));
do
{
printf("还剩%d次机会,是多少呢:", max_stage - stage);
scanf("%d", &no);
num[stage++] = no;
if (no < ans)
{
printf("再大一点。\n");
}
else if (no > ans)
{
printf("再小一点。\n");
}
}while (no != ans && stage < max_stage);
break;
case 2 :
ans = 1 + rand() % 99;
max_stage = (int) ceil(log(99) / log(2));
do
{
printf("还剩%d次机会,是多少呢:", max_stage - stage);
scanf("%d", &no);
num[stage++] = no;
if (no < ans)
{
printf("再大一点。\n");
}
else if (no > ans)
{
printf("再小一点。\n");
}
}while (no != ans && stage < max_stage);
break;
case 3 :
ans = 1 + rand() % 999;
max_stage = (int) ceil(log(999) / log(2));
do
{
printf("还剩%d次机会,是多少呢:", max_stage - stage);
scanf("%d", &no);
num[stage++] = no;
if (no < ans)
{
printf("再大一点。\n");
}
else if (no > ans)
{
printf("再小一点。\n");
}
}while (no != ans && stage < max_stage);
break;
case 4 :
ans = 1 + rand() % 9999;
max_stage = (int) ceil(log(9999) / log(2));
do
{
printf("还剩%d次机会,是多少呢:", max_stage - stage);
scanf("%d", &no);
num[stage++] = no;
if (no < ans)
{
printf("再大一点。\n");
}
else if (no > ans)
{
printf("再小一点。\n");
}
}while (no != ans && stage < max_stage);
break;
}
if (no != ans)
{
printf("真遗憾,答案是%d。\n", ans);
}
else
{
printf("恭喜你猜对了!你用了%d次猜中答案。\n", stage);
}
printf("\n----输入记录----\n");
for (i = 0; i < stage; i++)
{
printf(" %2d : %4d %+4d\n", i + 1, num[i], num[i] - ans);
}
return 0;
}
练习 1-7
//改进List1-8程序,让差值0不带符号
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_STAGE 10
int main()
{
int no;
int ans;
int num[MAX_STAGE];
int stage;
int i;
srand(time(NULL));
ans = rand() % 1000;
printf("请猜一个0~999的整数。\n\n");
stage = 0;
do
{
printf("还剩%d次机会。是多少呢:", MAX_STAGE - stage);
scanf("%d", &no);
num[stage++] = no;
if (no > ans)
{
printf("再小一点。\n");
}
else if (no < ans)
{
printf("再大一点。\n");
}
}while (no != ans && stage < MAX_STAGE);
if (no != ans)
{
printf("很遗憾,正确答案是%d。\n", ans);
}
else
{
printf("回答正确。\n");
printf("您用了%d次猜中了。\n", stage);
}
puts("\n--- 输入记录 ---");
for (i = 0; i < stage; i++)
{
printf("%2d : %4d ", i + 1, num[i]);
if ((num[i] - ans) != 0)
{
printf("%+6d\n", num[i] - ans);
}
else
{
printf("%6d\n", num[i] - ans);
}
}
return 0;
}
练习 1-8
//把list1-8里的do语句改写成for语句
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_STAGE 10
int main()
{
int no;
int ans;
int num[MAX_STAGE];
int stage;
int i;
srand(time(NULL));
ans = rand() % 1000;
printf("请猜一个0~999的整数。\n\n");
stage = 0;
for (; stage < MAX_STAGE; )
{
printf("还剩%d次机会。是多少呢:", MAX_STAGE - stage);
scanf("%d", &no);
num[stage++] = no;
if (no == ans)
{
break;
}
if (no > ans)
{
printf("再小一点。\n");
}
else if (no < ans)
{
printf("再大一点。\n");
}
}
if (no != ans)
{
printf("很遗憾,正确答案是%d。\n", ans);
}
else
{
printf("回答正确。\n");
printf("您用了%d次猜中了。\n", stage);
}
puts("\n--- 输入记录 ---");
for (i = 0; i < stage; i++)
{
printf("%2d : %4d ", i + 1, num[i]);
if ((num[i] - ans) != 0)
{
printf("%+6d\n", num[i] - ans);
}
else
{
printf("%6d\n", num[i] - ans);
}
}
return 0;
}