#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");
}
小学生plus版
最新推荐文章于 2024-06-16 17:03:25 发布