小学生plus版

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<time.h>
void startpic(void);    //开始的欢迎页面
void end(void);         //结束的页面

struct student
{
    char name[20];
    long int a;
};
int main()
{
    startpic();
    printf("请输入您的选择:>");       //提示用户做出选择
    short int userc;
    scanf("%hd",&userc);    //输入用户的选择
    system("cls");      //清空页面只出现答题页面

    if(userc==1)    //选择1为开始答题
    {
        srand(time(NULL));  //使用当前时间初始化随机数发生器
        short int a,b;  //保持随机数
        short int answer,userAns;   //定义系统的正确答案以及用户的答案
        bool judge; //定义布尔值来判断题目是否正确
        const int numRang = 101;    //定义随机数的范围
        unsigned int proNum;
        unsigned int stuNum;
        printf("请输入做题的人数:>");
        while(1)    //防止用户错误输入过大的数
        {
            scanf("%ud",&stuNum);   //输入答题的人数
            if(stuNum>=1&&stuNum<=50)
                break;
            else
                printf("无效输入,请重新输入\n");
        }
        printf("做几道题:>");
        while(1)       //防止用户错误输入过大的数
        {
            scanf("%ud",&proNum); //输入做题的组数
            if(proNum>=1&&proNum<=100)
                break;
            else
                printf("无效输入,请重新输入\n");
        }
        printf("\n");
        struct student std[stuNum]; //定义多个结构体来存储个人数据
        int i,j;
        FILE *fp1,*fp2,*fp3,*fp4,*fp5;   //文件指针
        fp5 = fopen("studentsteet","a");        //将答题的情况做成成绩单
        fprintf(fp5," 共有%d人答题\n",stuNum);
        int sum[stuNum],score[stuNum];    //定义答题的数量和分数
        system("cls");      //清屏,处理多余信息

        /*开始根据做题人数循环*/
        for(i=0;i<stuNum;i++)
        {
            printf("请输入第%d的姓名和学号:>\n",i+1);
            scanf("%s %ld",&std[i].name,&std[i].a);
            printf("Welcome %s!\n",std[i].name);

            /*将数据保存到文件中*/
            char filename[80];
            sprintf(filename,"question_%ld_%s.txt",std[i].a,std[i].name);
            fp1 = fopen(filename,"a");
            sprintf(filename,"answer_%ld_%s.txt",std[i].a,std[i].name);
            fp2 = fopen(filename,"a");
            sprintf(filename,"user_%ld_%s.txt",std[i].a,std[i].name);
            fp3 = fopen(filename,"a");
            sprintf(filename,"userscore_%ld_%s.txt",std[i].a,std[i].name);
            fp4 = fopen(filename,"a");

            score[i]=0;     //分数初始化
            sum[i]=0;       //答对题目数初始化
            for(j=1;j<=proNum;j++)   //开始循环做题
            {
                /*加减乘除的随机运算*/
                char oper[5]={'+','-','*','/','%'};
                char op = oper[rand()%5];
                a = rand()%numRang;
                b = rand()%numRang;
                if(op=='-')
                {
                    while(a<b)  //目的使减数大于被减数
                    {
                        a = rand()%numRang;
                        b = rand()%numRang;
                    }
                }
                else if(op=='/')
                {
                    while(a%b!=0)   //目的使算出的结果是整数
                    {
                        a = rand()%numRang;
                        b = rand()%numRang;
                    }
                }
                else    //对于模运算的数据处理
                {
                    while(a<b)
                    {
                        a = rand()%numRang;
                        b = rand()%numRang;
                    }
                }
                switch(op)
                {
                    case '+':   answer = a + b; break;      //保存加法情况下的正确答案
                    case '-':   answer = a - b; break;      //保存减法情况下的正确答案
                    case '*':   answer = a * b; break;      //保存乘法情况下的正确答案
                    case '/':   answer = a / b; break;      //保存除法情况下的正确答案
                    case '%':   answer = a % b; break;      //保存模运算情况下的正确答案
                }


                printf("%hd %c %hd = ", a, op, b);   //显示随机生成的题目
                fprintf(fp1,"%4hd %c %4hd = \n", a, op, b);    //将题目保存到文件中
                fprintf(fp2,"%4hd %c %4hd = %4hd\n", a, op, b, answer);  //将题目加正确答案保存到文件中

                scanf("%hd", &userAns); //输入用户的答案
                fprintf(fp3,"%4hd %c %4hd = %4hd  ", a, op, b, userAns);     //将题目加用户的答案保存

                judge = answer == userAns;  //作为判断答案是否正确
                printf("%s", judge?"right!\n":"wrong!\n");
                fprintf(fp3,"\t%s\n", judge?"right!\n":"wrong!\n");//
                if(op=='*')
                    score[i]+=judge*5;
                else if(op=='/'&&op=='%')
                    score[i]+=judge*3;
                else
                    score[i]+=judge*2;
                sum[i]+=judge;
                printf("%hd %c %hd = %hd\n", a, op, b, answer);  //正确答案
                
            }

            fclose(fp1);
            fclose(fp2);
            fclose(fp3);
            /*分个人答题总结统计*/
            printf("------------------------------\n");     //与题分隔开
            printf("姓名:%s\n学号:%ld\n",std[i].name,std[i].a);
            fprintf(fp4,"姓名:%s\n学号:%ld\n",std[i].name,std[i].a);
            printf("答对题的数:%d\n",sum[i]);    //输出答对题的数
            fprintf(fp4,"答对题的数:%d\n",sum[i]);
            printf("题目正确率:%.2f%%\n",(float)sum[i]*100/proNum);   //输出答题正确率
            fprintf(fp4,"题目正确率:%.2f%%\n",(float)sum[i]*100/proNum);
            printf("------------------------------\n");     //与下一个人分隔开

            fprintf(fp5,"姓名:%s\t学号:%ld\t得分:%2d\n",std[i].name,std[i].a,score[i]);//
            fclose(fp4);
        }
        int addscore=0;
        float average;
        for(i=0;i<stuNum;i++)
        {
            addscore+=score[i];
        }
        average=(float)addscore/stuNum;
        fprintf(fp5,"总分:%d\t平均分:%.2f\t\n",addscore,average);
        fclose(fp5);
    }
    else if(userc==2)       //用户选择2直接返回
        return 0;
    else                    //输入无效字符直接返回
    {
        printf("无效字符,结束答题,请重新进入\n");
        return 0;
    }
    end();
    return 0;
}

void startpic(void)     //开始窗口的函数
{
    int i,j;
    for(i=0;i<45;i++)
        printf("*");
    printf("\n");
    for(j=0;j<6;j++)
    {
        if(j==2)
            printf("*\t\t1.开始答题\t\t    *");
        else if(j==3)
            printf("*\t\t2.结束答题\t\t    *");
        else
            printf("*\t\t\t\t\t    *");
        printf("\n");
    }
    for(i=0;i<45;i++)
        printf("*");
    printf("\n");
}

void end(void)      //结束窗口的函数
{
    int i,j;
    for(i=0;i<45;i++)
        printf("*");
    printf("\n");
    for(j=0;j<6;j++)
    {
        if(j==2)
            printf("*\t\t欢迎下次继续使用!!\t    *");
        else
            printf("*\t\t\t\t\t    *");
        printf("\n");
    }
    for(i=0;i<45;i++)
        printf("*");
    printf("\n");
}

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柒只纸鸢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值