题目要求:计算机想一个数,由用户猜,若猜对则输出right,若猜错则输出wrong,并告诉用户所猜的数是大是小,每次程序可以准许用户猜多个数,
每次准许用户猜十次,并且记录猜的次数,并且要具有容错能力,即输入的并非为正数时,可接着输,猜对或者未猜对一个数时,给出提示信息(yes/no),询问用户是否要猜下一个数。
将任务分为多个子任务;
任务一:
//分解为 计算机生成一个数、用户猜数两个 任务
#include
#include
#include
#define MAX_NUMBER 100
#define MIN_NUMBER 1
#define MAX_TIMES 10 //都是宏常量
int MakeNumber(viod);
void GuessNumber(int number);
int IsRight(int number,const int guess);
int IsValidNum(int number);
int main()
{
int number;
char reply; //用户对于是否继续猜数的回答 yes or no!
srand(time(NULL)); //初始化随机种子,是为了保证计算机每次随机生成的数是不一样的,只要随机种子不同,数就不同
do
{
number = MakeNumber(); //用函数的方法,计算机随机生成一个数
GuessNumber(number); //用户猜数字
printf("Do you want to continue(Y/N or y/n)?"); //提示是否
scanf(" %c",&reply); //空格,拿走缓冲区域的换行符号即回车;若不空格,当输入 //输入是否继续的回答
}while(reply=='y'||reply=='Y'); //输入y/Y才会循环
return 0;
}
/任务2:定义所需要的函数 --- MakeNumber和GuessNumber
//#include "MakeNumber.h" ---- 后文当中有很多include " " 的语句,其为命名的作用,在程序中无功能的实现
#include //assert 为断言语句是为了测试算法的正确性,调试某个阶段程序表达式的真与假,断言仅用于调试程序,不能作为程序的功能;
int MakeNumber(viod)
//函数参数:无
//函数返回值:返回计算机生成的随机数
{
int number;
number=(rand() % (MAX_NUMBER - MIN_NUMBER + 1)) + MIN_NUMBER; //函数:随机生成一个数 eg:rand() % 100+1;表示1到100之间的随机数
assert(number >= MIN_NUMBER && number <= MAX_NUMBER); //调试生成的随机数是否位于1-100之间;
return number;
}
//随即生成数已经完成,接下来是猜数;
猜数又要细分为小任务,主的:记录猜的次数、重复输入猜的数;
副的:分解为“判断用户的猜的数是否合法”和“判断用户猜的数是大是小及判断并输出是否猜中(用返回值 --- 0、1)”两个任务
//GuessNumber.c
//#include "IsRight.h" //判断猜的数是否正确
//#include "IsValidNum.h" //判断猜的数是否合法
void GuessNumber(int number)
//函数参数:计算机随机生成的数字;
//函数返回值:无
{
int guess; //用户猜的数
int count=0; //猜的次数
int right = 0; //猜的数是否猜中
int ret; //用于保存scanf()的返回值
do
{
printf("try %d:",count+1);
ret = scanf("%d",&guess);
//处理读入的数,判断输入是否有误,是否在合理范围内
while(ret != 1 || !IsValidNum(guess)) //调用后的函数了,猜的数不是合法的 //ret != 1 --- 存在输入错误 //返回值不是1
{
printf("Input error! \n");
while(getchar() != ' \n '); //清除输入缓冲区中的错误数据,SANF读取缓冲区的数,非数字字符不会被读取,若不清除,则会一直读取失败
printf("try %d: ",count+1);
ret = scanf("%d",&guess);
}
count++; //开始为0,后+1;每次循环都+1;但是在非法输入的那个循环里,未+1,保持不变;+1不是++;++每次都要调用的
right = IsRight(number,guess); //判断用户猜的数是大是小,有输出,(too small/too big);判断是否正确,就是用1、0的返回值判断,表示的是”是或非“
}while(!right&&count<MAX_NUMBER); //返回值不是1
if(right) //如果猜对了,给出相应的提示信息 //返回值为1
printf("congratulations! \n");
else
printf("failed after %d times \n",MAX_TIMES);
}
//最后,对两个合法和是否正确的函数定义
//void GuessNumber(const int number) const的作用是变量不变,guess是实参
//合法
//#include ”IsValidNum,h"
//函数返回值:若合法,返回1;若不合法,返回0
//函数功能:判断是否在1-100内
//函数参数:number为用户输入的数,用时变为guess就好了
int IsValidNum(int number)
{
if(number>=MIN_NUMBER && number <= MAX_NUMBER)
return 1;
else
return 0;
}
//#include "IsRight.h"
//函数功能:判断谁大谁小,分别给出提示信息
//函数返回值:猜对,1;猜错,0
int IsRight(int number,const int guess)
{
if(guess<number)
{
printf("Wrong!Too smal! \n");
return 0;
}
else if(guess>number)
{
printf("Wrong!Too big! \n");
return 0;
}
else return 1;
}