(第二周)软件工程第二周之四则运算

  

  为了让小学生可以更加便捷的练习各种难度梯度的四则运算题,更加牢固的掌握运算技巧,并且可以提高练习的效率,拥有一款简单易操作,有良好界面设计的出题软件就必不可少。此程序可以实现各难度梯度的四则运算的单独练习,又可以实现混合运算练习。随机数的产生是由srand()和rand()配合使用来完成的。产生的随机数保存在数组p[20]中,当算式中出现除法运算时,就要对p[20]数组中的整数强制类型转换成浮点数并保存在数组q[20]中,而且如果除数为0就要从新产生一个非零随机数替换0,除法运算支持真分数以及假分数形式。数组m[4]预置了数字,用于限定所产生随机数的范围,从而可以产生不同难度的题目。

  此程序共有两个子函数,int Showmenu(int num1)用于生成操作菜单,void DoExercise(char choose)则用于完成随机生成四则运算题,判断输入答案的正误,统计答对、答错题目的数量等功能,用switch分支语句来根据用户的输入选择相应的操作。

  本次编程练习我最大的收获是又了解了两个C语言库函数flushall()和sleep(),以前编程练习时也遇到过在程序执行第一次循环时可以正常执行输入语句,当第二次执行时就会直接跳过scanf的输入语句,但是一直不知道是什么与原因。其实是由于第一次执行过后,缓冲区中保留了换行符,所以在第二次执行获取输入字符的语句时就会直接跳过。而flushall()函数可以清除缓冲区,这样在第二次执行时就不会出现以上问题。sleep()是用于计时的函数,此函数在本次练习中的应用是当用户输入有误时,会提示用户输入信息错误,依次执行sleep(1000);和system("cls");就可以完成提示信息显示一秒钟后清屏的功能,这样就会使界面简易,不会让人感觉杂乱。 

  当然,程序还有很多地方有待完善和优化,希望大家多提建议和意见。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include <ctype.h> 
#include<windows.h>

int Showmenu(int num1);         //显示菜单界面
void DoExercise(char choose);   //随机生成各难度梯度的四则运算

int main()
{
    system("color 1E");         //改变窗口及字体颜色
    char choose;
    int num1=1;
    while(1)
    {
        num1=Showmenu(num1);
        flushall();            //清除缓冲区的换行符
        scanf("%c",&choose);
        if((int)choose<48||(int)choose>54)  //判断用户的输入是否符合要求(ASCII码)
        {
            printf("\n\t您的输入有误,请重新输入!\n");
            Sleep(1000);       //计时函数,产生1秒的延时
            system("cls");
            num1=1;
            continue;
        }
        DoExercise(choose);
    }
    return 0;
}

int Showmenu(int num1)
{
    char ch;
    if(num1==1)
        num1++;
    else
    {
        while(1)
        {
            printf("是否清除练习记录(Y/N):");
            flushall();  
            scanf("%c",&ch);
            if((int)ch==89||(int)ch==121)
            {
                system("cls");         //清屏操作
                break;
            }
            else if((int)ch==78||(int)ch==110) break;
            else
                printf("您的输入有误!\n");
        }
    }
    printf("**************************************************\n");
    printf("\t    小学生四则运算练习软件\n");
    printf("\t 1、加法练习\t2、减法练习\n");
    printf("\t 3、乘法练习\t4、除法练习\n");
    printf("\t 5、混合练习\t0、退出系统\n");
    printf("请输入你的选择(0--5):\n");
    printf("\n*************************************************\n");
    return num1;
}

void DoExercise(char choose)
{
    int i,j,num,k;
    int truenum=0,falsenum=0;
    int p[20],m[4]={10,100,200,500};
    float q[20],result;
    srand(time(NULL));
    printf("请给出出题数量:");
    scanf("%d",&num);
    for(i=0;i<num;i++)
    {
        if(choose==49||choose==50)
        {
            if(i==0)
            {
                printf("请选择难度系数:1、小学一年级      2、小学二年级\n");
                printf("                3、小学三,四年级  4、小学五,六年级\n\n");
                printf("                    难度等级:");
                scanf("%d",&j);
            }
            for(k=0;k<j+1;k++)
                p[k]=rand()%m[j-1];
            k=0;
            p[j+1]=p[0];
            printf("%d",p[k]);
            k++;
        }
        switch(choose)   //根据用户的输入选择不同的操作
        {
        case '1':{
                    while(k<j+1)
                    {
                        printf(" + %d",p[k]);
                        p[j+1]+=p[k];
                        k++;
                    }
                    break;
                }
        case '2':{
                    while(k<j+1)
                    {
                        printf(" - %d",p[k]);
                        p[j+1]-=p[k];
                        k++;
                    }
                    break;
               }
        case '3':{
                    if(i==0)
                    {
                        printf("请选择难度系数:1、小学二年级  2、小学三年级\n");
                        printf("                3、小学四年级  4、小学五,六年级\n\n");
                        printf("                    难度等级:");
                        scanf("%d",&j);
                    }
                    for(k=0;k<j+1;k++)
                        p[k]=rand()%m[j-1];
                    k=0;
                    p[j+1]=p[0];
                    printf("%d",p[k]);
                    k++;
                    while(k<j+1)
                    {
                        printf(" * %d",p[k]);
                        p[j+1]*=p[k];
                        k++;
                    }
                    break;
                }
        case '4':{
                    int m[4]={50,100,500,1000};
                    if(i==0)
                    {
                        printf("请选择难度系数:1、小学三年级  2、小学四年级\n");
                        printf("                3、小学五年级  4、小学六年级\n\n");
                        printf("                    难度等级:");
                        scanf("%d",&j);
                        printf("\t若结果为小数,请将结果保留两位小数\n");
                    }
                    for(k=0;k<j+1;k++)
                        p[k]=rand()%m[j-1];
                    k=0;
                    printf("%d",p[k]);
                    q[0]=(float)p[0];
                    k++;
                    while(k<j+1)
                    { 
                        q[k]=(float)p[k];
                        printf(" / %d",p[k]);
                        q[0]/=q[k];
                        k++;
                    }
                    break;
               }
        case '5':{
                    if(i==0)
                    {
                        printf("请选择难度等级:1. *   2. **\n");
                        printf("                3. *** 4. ****\n");
                        scanf("%d",&j);
                    }
                    for(k=0;k<4;k++)
                    {
                        p[k]=rand()%m[j-1];
                        q[k+1]=(float)p[k];
                    }
                    if(i%4==0)
                    {
                        printf("%d + %d - %d * %d",p[0],p[1],p[2],p[3]);
                        q[0]=q[1]+q[2]-q[3]*q[4];
                    }
                    else if(i%4==1)
                    {
                        while(p[1]==0)
                            p[1]=rand()%m[j-1];
                        q[2]=(float)p[1];
                        printf("%d / %d + %d * %d",p[0],p[1],p[2],p[3]);
                        q[0]=q[1]/q[2]+q[3]*q[4];
                    }
                    else if(i%4==2)
                    {
                        printf("%d + %d * (%d - %d)",p[0],p[1],p[2],p[3]);
                        q[0]=q[1]+q[2]*(q[3]-q[4]);
                    }
                    else
                    {
                        printf("%d * (%d + (%d - %d))",p[0],p[1],p[2],p[3]);
                        q[0]=q[1]*(q[2]+(q[3]-q[4]));
                    }
               }
        case '0':{ 
                    printf("\t   感谢您的使用^_^,再见\n");
                    exit(0);
            break; } } printf(
"="); if(choose==49||choose==50||choose==51) { scanf("%f",&result); if(result==p[j+1]) { printf("true\n"); truenum+=1; } else { printf("false\n"); falsenum+=1; } } if(choose==52||choose==53) { scanf("%f",&result); if(fabs(result-q[0])<0.01) //若运算结果为小数,则保留两位小数即可 { printf("true\n"); truenum+=1; } else { printf("false\n"); falsenum+=1; } } } printf("\n 答对 %d 道题,答错 %d 道题\n\n",truenum,falsenum); printf(" 本轮练习完成,望继续努力^_^\n\n"); }

 

 

posted on 2016-03-14 01:10  zhaoweiliang  阅读(159)  评论(0编辑  收藏  举报

导航