金子涵778 2022-09-09 14:41 采纳率: 75%
浏览 61
已结题

一个C语言的简单的小问题

#include <stdio.h>
#include <time.h>
#include <assert.h>
#define MAX_NUMBER 100
#define MIN_NUMBER 0
#define MAX_TIMES 10
int MakeNumber(void);
void GuessNumber (const int number);
int IsValidNumber (const int number);
int IsRight (const int number,const int guess);

int main()
{
int number;
char reply;
srand(time(NULL));
do {
number = MakeNumber();
GuessNumber(number);
printf("Do you want to continue(Y/N or y/n)\n");
scanf(" %c",&reply);
}while (reply =='Y'||reply =='y');
return 0;
}
int MakeNumber (void)
{
int randnumber;
randnumber = (rand()%(MAX_NUMBER-MIN_NUMBER+1))+MIN_NUMBER;
return randnumber;
}

int IsValidNumber (const int number)
{
if(number>=MIN_NUMBER||number<=MAX_NUMBER)
return 1;
else
return 0;
}
void GuessNumber(const int number)
{
int guess;
int count = 0;
int right = 0;
int ret;
do{
printf("Try %d\n",++count);
ret = scanf("%d",&guess);
while(ret!=1||!IsValidNumber(guess))
{
printf("PLEASE INPUT RIGHT FORMAT!\n");
while (getchar()!='\n');
printf("Try %d",++count);
ret =scanf("%d",&guess);
}

right = IsRight (number,guess);
}while (!right&&count <= MAX_NUMBER);
if (right!=1)
printf("Congratulations!You are fucking niubi!");
else
printf("Mission failed after %d attemps.",MAX_TIMES);

}
int IsRight(const int guess,const int number)
{
if (guess>number)
{
printf("WRONG!Too big!");
return 1;
}
else if(guess<number)
{
printf("WRONG!Too small!");
return 1;
}
else return 0;
}
一: 我在编译运行的时候发现这个程序不能将猜数字的次数每次往上加一,我感觉我编的对啊,++count不就可以做到这个功能吗
二: 我输入的数字大于MAX_NUMBER程序没有警告啊,为什么呢
三 :我把头文件<assert.h>删除为什么程序显示错误呢,难道头文件<time.h>不起作用吗

  • 写回答

5条回答 默认 最新

  • a5156520 2022-09-09 15:19
    关注

    1、关于count不起效的原因应该是你在判断是否超出指定次数时是用count <= MAX_NUMBER来判断的,而不是用count <= MAX_TIMES来判断的,根据你的代码,MAX_TIMES应该才是定义指定猜数游戏进行几次的常量,代码测试我是用MAX_TIMES=3测试的。
    2、输入的数字为什么大于大于MAX_NUMBER没有警告,应该是因为number>=MIN_NUMBER||number<=MAX_NUMBER这个判断输入数据是否符合要求的判断不对,应该改为:number<=MIN_NUMBER||number>=MAX_NUMBER, 同时在调用这个函数时的判断也需要该一下。
    3、至于把头文件<assert.h>删除为什么程序显示错误,应该是因为rand()函数需要一个一个头文件,你加上<stdlib.h>应该就可以了,但为什么加上<assert.h>也可以,我不知道是为什么。
    代码修改如下:

    
    #include <stdio.h>
    #include <time.h>
    #include <assert.h>
    #define MAX_NUMBER 100
    #define MIN_NUMBER 0
    #define MAX_TIMES 10
    
    int MakeNumber(void);
    void GuessNumber (const int number);
    int IsValidNumber (const int number);
    int IsRight (const int number,const int guess);
    
    int main()
    {
    
        int number;
        char reply;
        srand(time(NULL));
        do {
            number = MakeNumber();
            GuessNumber(number);
            printf("Do you want to continue(Y/N or y/n)\n");
            scanf(" %c",&reply);
        }while (reply =='Y'||reply =='y');
        return 0;
    
        
    
    }
    int MakeNumber (void)
    {
        int randnumber;
        randnumber = (rand()%(MAX_NUMBER-MIN_NUMBER+1))+MIN_NUMBER;
        return randnumber;
    }
    
    int IsValidNumber (const int number)
    {
        if(number<=MIN_NUMBER||number>=MAX_NUMBER)
            return 1;
        else
            return 0;
    }
    void GuessNumber(const int number)
    {
    
        int guess;
        int count = 0;
        int right = 0;
        int ret;
        
    
            
            
            
        do{
            printf("Try %d\n",++count);
            ret = scanf("%d",&guess);
            while(ret!=1||IsValidNumber(guess)==1)
            {
                printf("PLEASE INPUT RIGHT FORMAT!\n");
                while (getchar()!='\n');
                printf("Try %d\n",count);
                ret =scanf("%d",&guess);
            }
            right = IsRight (guess,number);
        //    printf("count=%d\n",count);
            
        }while (right==1&&count < MAX_TIMES);
    
        if (right!=1)
        printf("Congratulations!You are fucking niubi!\n");
        else
        printf("Mission failed after %d attemps.\n",MAX_TIMES);
        
        
            
    
        
    
    }
    int IsRight(const int guess,const int number)
    {
        if (guess>number)
        {
            printf("WRONG!Too big!\n");
            return 1;
        }
        else if(guess<number)
        {
            printf("WRONG!Too small!\n");
            return 1;
        }
        else return 0;
    }
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 9月17日
  • 已采纳回答 9月9日
  • 创建了问题 9月9日

悬赏问题

  • ¥100 对反编译和ai熟悉的开发者。
  • ¥15 带序列特征的多输出预测模型
  • ¥15 Python 如何安装 distutils模块
  • ¥15 关于#网络#的问题:网络是从楼上引一根网线下来,接了2台傻瓜交换机,也更换了ip还是不行
  • ¥15 资源泄露软件闪退怎么解决?
  • ¥15 CCF-CSP 2023 第三题 解压缩(50%)
  • ¥30 comfyui openpose报错
  • ¥20 Wpf Datarid单元格闪烁效果的实现
  • ¥15 图像分割、图像边缘提取
  • ¥15 sqlserver执行存储过程报错