求助!c语言问题,

qq_33746752 2017-06-29 03:58:32
随机出十道100以内计算题,要求加减乘除概率相等
出现的问题:有的时候运行到一半就不行了。
希望大神帮帮忙
#include <stdio.h>
#include <ctype.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>
#define IDNO_LENGTH 6
#define CALC_KIND 4
#define CALC_NUM 10

bool checkNo(char idNo[]);
char getSignal();
int getResult(int,int,char);
void takeTest();

//main函数
int main()
{
printf("Please input your four digit ID no(begin with two letters):");
char idNo[IDNO_LENGTH];
do
{
scanf("%s",&idNo);
fflush(stdin);
} while(checkNo(idNo)==false);

printf("1.Start a test\t2.Check score\t3.Exitb\n");
int choose;
do
{
printf("选择:");
scanf("%d",&choose);
fflush(stdin);
} while(choose!=1 && choose!=2&& choose!=3);

if(choose==1)
{
takeTest();
}else if(choose==2)
{
FILE *fp;
char ch;
if((fp=fopen("score.txt","w+"))==NULL)
{
printf("\n你还没做过题目测试");
getchar();
exit(1);
}
ch=fgetc(fp);
while(ch!=EOF)
{
putchar(ch);
ch=fgetc(fp);
}
fclose(fp);
}
else
{
exit(0);
}
}

//获取随机运算符
char getSignal()
{
char signal[CALC_KIND]={'+','-','*','/'};
srand((unsigned)time(NULL));
return signal[rand()%4];
}

//获取随机数
int random(void)
{
int i;
i=rand() % 100;
return (i);
}


//运算
int getResult(int num1,int num2,char signal)
{
float res;
switch(signal)
{
case '+':
res=num1+num2;break;
case '-':
res=num1-num2;break;
case '*':
res=num1*num2;break;
case '/':
res=num1/num2;break;
default:
res=0;
printf("运算符不符合规则\n");
}
return res;
}

//int checkresult(int h)
//{
// float res;
// res=getresult(num1,num2,signal);
// if (int(res)!=res|res>=100) h=0;
// else h=1;
// return h;
//}

//列出10道题
void takeTest()
{
printf("开始答题,每道题10分,总共100分\n");
clock_t startTime;
startTime=clock();
int index;
int res;
int giveRes;
int l,k,h;
int num1;
int num2;
int score=0;
char signal;
for(index=0;index<CALC_NUM;index++)
{
signal=getSignal();

srand((unsigned)time(NULL));
if(signal=='+'||signal=='-')
{
num1=random();
num2=rand()%(100-num1);
}
if(signal=='-')
{
num1=random();
num2=rand()%num1;
}
res=getResult(num1,num2,signal);
if(res>100||res<0) k=0;
else k=1;
if(signal=='*')
{
num1=random();
num2=rand()%(100/num1);
}
if(signal=='/')
{
do
{
num1=random();
num2=rand() % num1;
int c;
c=num1/num2;
if(num2*c==num1) h=1;
else h=0;
}while(h==0);
}

printf("%d%c%d=",num1,signal,num2);
scanf("%d",&giveRes);
fflush(stdin);
if(getResult(num1,num2,signal)==giveRes)
{
printf("correct\n");
score+=10;
}
else
{
printf("wrong\n");
}
}
FILE *fp=fopen("score.txt","w");
fprintf(fp,"分数为%d",score);
fclose(fp);
printf("解10道题用了%lf秒\n",(double)(clock()- startTime)/CLOCKS_PER_SEC);
}

//检测idNo是否合规则,合规则返回true
bool checkNo(char idNo[])
{
int index;
bool flag;
flag=true;
for(index=0;index<IDNO_LENGTH;index++)
{
if(index<2)
{
if(!isalpha(idNo[index]))
{
flag=false;
printf("ID no 不符合规则,重新输入:");
break;
}
}
else
{
if(!isdigit(idNo[index]))
{
flag=false;
printf("ID no 不符合规则,重新输入:");
break;
}
}
}
return flag;
}
...全文
250 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-07-03
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
qq_33746752 2017-07-01
  • 打赏
  • 举报
回复
顶一下
qq_33746752 2017-07-01
  • 打赏
  • 举报
回复
可是程序运行的时候有时会出现停止运行的问题,请问怎么解决呢。
自信男孩 2017-06-29
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <ctype.h>
#include <time.h>
//#include <stdbool.h>
#include <stdlib.h>

#include <windows.h>


#define IDNO_LENGTH 6
#define CALC_KIND 4
#define CALC_NUM 10

bool checkNo(char idNo[]);
char getSignal();
int getResult(int,int,char);
void takeTest();

//main函数
int main()
{
    printf("Please input your four digit ID no(begin with two letters):");
    char idNo[IDNO_LENGTH];
    do
    {
        scanf("%s", idNo);
        //fflush(stdin);
    } while(checkNo(idNo) == false);

    printf("1.Start a test\t2.Check score\t3.Exitb\n");
    int choose;
    do
    {
        printf("选择:");
        scanf("%d", &choose);
        //fflush(stdin);
    } while(choose != 1 && choose !=2 && choose!=3);

    if(choose==1)
    {
        takeTest();
    }else if(choose==2)
    {
        FILE *fp;
        int ch;
        if((fp=fopen("score.txt","r+"))==NULL)
        {
            printf("\n你还没做过题目测试");
            getchar();
            exit(1);
        }
        ch = fgetc(fp);
        while(ch!=EOF)
        {
            putchar(ch);
            ch = fgetc(fp);
        }
        fclose(fp);
    }
    else
    {
        exit(0);
    }

    return 0;
}

//获取随机运算符
char getSignal()
{
    char signal[CALC_KIND]={'+','-','*','/'};
    srand((unsigned)time(NULL));
    return signal[rand()%4];
}

//获取随机数
int get_random(void)
{
    int i;
    i=rand() % 100;
    return (i);
}


//运算
int getResult(int num1,int num2,char signal)
{
    float res;
    switch(signal)
    {
        case '+':
            res=num1+num2;break;
        case '-':
            res=num1-num2;break;
        case '*':
            res=num1*num2;break;
        case '/':
            res=num1/num2;break;
        default:
            res=0;
            printf("运算符不符合规则\n");
    }
    return res;
}

//int checkresult(int h)
//{
//    float res;
//    res=getresult(num1,num2,signal);
// if (int(res)!=res|res>=100) h=0;
// else h=1;
// return h;
//}

//列出10道题
void takeTest()
{
    printf("开始答题,每道题10分,总共100分\n");
    clock_t startTime;
    startTime=clock();
    int index;
    int res;
    int giveRes;
    int l,k,h;
    int num1;
    int num2;
    int score=0;
    char signal;
    for(index=0;index<CALC_NUM;index++)
    {
        signal=getSignal();

        srand((unsigned)time(NULL));
        if(signal=='+'||signal=='-')
        {
            num1=get_random();
            num2=rand()%(100-num1);
        }
        if(signal=='-')
        {
            num1=get_random();
            num2=rand()%num1;
        }
        res=getResult(num1,num2,signal);
        if(res>100||res<0) k=0;
        else k=1;
        if(signal=='*')
        {
            num1=get_random();
            num2=rand()%(100/num1);
        }
        if(signal=='/')
        {
            do
            {
                num1=get_random();
                num2=rand() % num1;
                int c;
                c=num1/num2;
                if(num2*c==num1) h=1;
                else h=0;
            }while(h==0);
        }

        printf("%d%c%d=",num1,signal,num2);
        scanf("%d", &giveRes);
        //fflush(stdin);
        if(getResult(num1,num2,signal)==giveRes)
        {
            printf("correct\n");
            score+=10;
        }
        else
        {
            printf("wrong\n");
        }
    }
    FILE *fp=fopen("score.txt","w");
    fprintf(fp,"分数为%d",score);
    fclose(fp);
    printf("解10道题用了%lf秒\n",(double)(clock()- startTime)/CLOCKS_PER_SEC);
}

//检测idNo是否合规则,合规则返回true
bool checkNo(char idNo[])
{
    int index;
    bool flag;
    flag=true;
    for(index=0;index<IDNO_LENGTH;index++)
    {
        if(index<2)
        {
            if(!isalpha(idNo[index]))
            {
                flag=false;
                printf("ID no 不符合规则,重新输入:");
                break;
            }
        }
        else
        {
            if(!isdigit(idNo[index]))
            {
                flag=false;
                printf("ID no 不符合规则,重新输入:");
                break;
            }
        }
    }
    return flag;
}
以上是修改你的代码; 问题主要是以下几点: 1. idNo是数组名,因此scanf输入时,要去掉前面的&,数组名本身就是地址呢; 2. fflush(stdin);fflush操作stdin是未定义行为;所以使用fflush对stdin不一定有效,如果需要建议使用其他方式;从你的程序里暂为发现需要fflush,清空输入缓冲区; 3. ch应定义成int类型,因为EOF在系统上定义的是-1,并且这个-1是int类型的-1; 4. 文件打开方式,建议将w+改成r+,因为你的操作主要是读,没有写。 5. random函数名,建议不要和库函数名重名,建议改成get_random,符合函数功能的名字; 6. 注意,fgetc读到的数字1,实际上是'1',使用时,建议注意下。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧