标题:新手c语言问题求助!!写一个程序帮助出数学题
只看楼主
shihk
Rank: 1
等 级:新手上路
帖 子:8
专家分:9
注 册:2017-7-1
结帖率:0
已结贴  问题点数:20 回复次数:4 
新手c语言问题求助!!写一个程序帮助出数学题
帮小学生出题练习算数的程序,出十道题,加减乘除都有,要求结果在一百以内。
问题:有的时候,程序运行中间会出现已停止工作的问题,求问怎么改进!!
程序代码:
#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;
                while(num2==0) 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;
}
搜索更多相关主题的帖子: char int res printf index 
2017-07-01 14:31
shihk
Rank: 1
等 级:新手上路
帖 子:8
专家分:9
注 册:2017-7-1
得分:0 
2017-07-01 16:05
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:7 
看代码看多了~编辑掉~先休息~~~


   if(signal=='+'||signal=='-')
   {
       num1=get_random();
       num2=rand()%(100-num1);
    }
    if(signal=='-')
    {
        num1=get_random();
        num2=rand()%num1;
    }

不过还是感觉这里逻辑可以优化一下~

[此贴子已经被作者于2017-7-1 18:41编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-07-01 18:37
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
得分:7 
是不是没考虑num1为0的情况。
2017-07-03 09:33
lmlm1001
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:4
帖 子:107
专家分:550
注 册:2015-3-1
得分:7 
个人认为楼主的程序在出题逻辑上有些复杂。之前我给我外甥女做过类似的,当时的算法是宏定义一个限值,
然后用随机对其加一后的值取余,值作为结果,再逆运算,
注意乘除要排除零的情况,以及逆运算的结果超限.
2017-07-03 10:45



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-479093-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.212602 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved