2.0版,除限制结果在100以内以外,大致没有问题。
1.【问题描述】
编写一个帮助小学生练习数学的程序,帮助小学生练习 100 以内的四种数学运算:加、减、乘、除。
2.【基本要求】
a) 程序应先询问用户的 ID 号(ID 号包括两个大写字母和 4 位数字),例如:
请输入用户 ID 号:AB1234
程序应对输入的 ID 号验证,符合 ID 号要求的格式,然后程序提示三种选择:
(1)开始测试
(2)检查分数
(3)退出
b) 测试:该程序将给出 10 道数学题,例如:
12 * 3 =36
48 + 32 =80
56 / 28 =2
注意:
i)学生将依次回答每一个问题(在等于号后面给出答案),然后给出下一道题。
ii)试题应包含四种数学运算:加、减、乘、除,它们是随机产生的。相邻的问题应该是不同的操作,
每个操作必须至少出现一次。
iii)为每道题随机生成数字,但必须确保参与运算的数字和结果都小于 100 且大于零的整数。
iv)十道题做完后,记录学生完成这十道题所用的时间。
v)给每个学生一个分数。将该学生的 ID、成绩和使用时间保存到一个名为 record.txt 的文件中。
vi)在屏幕上输出以下信息:
问题 | 正确答案 | 你的答案
c) 成绩检查:从文件“record.txt”中列出该学生的所有历史成绩。例如:
你以前的记录是:
AB1234 80 150 秒
AB1234 50 182 秒
AB1234 90 98 秒
代码为:
#include<time.h>
#include<stdlib.h>
#include<stdio.h>
#include<windows.h>
#include<shlwapi.h>
int check(char ID[]) //判断输入用户名是否合法
{
int j=0,k=0;
char *p;
p=ID;
while(*p!='\0') //字符串存储时后面自动补0
{
if((*p>='A')&&(*p<='Z'))
j++;
else if((*p>='0')&&(*p<='9'))
k++;
p++;
}
return (j==2&&k==4?1:0);
}
void store(char ID[],int score,int time){ //存储ID、成绩、答题时间
FILE *fp;
fp=fopen("record.txt","a+"); //a+只打开,不新建新的文件
if(fp==NULL)
{
fp=fopen("record.txt","w");
}
fprintf(fp,"%s\t%d\t%d秒\n",ID,score,time);
fclose(fp);
}
void read_file(char new_ID[]){ //读取以前的记录
char ID[100];
int score,time;
FILE *fp;
fp=fopen("record.txt","r");
if(fp==NULL)
{
printf("新玩家,没有做题记录\n");
exit(1);
}
while(!feof(fp)){
fscanf(fp,"%s\t%d\t%d秒\n",ID,&score,&time);
if(strcmp(new_ID,ID)==0){
printf("%s\t%d\t%d秒\n",ID,score,time);
}
}
fclose(fp);
}
int main()
{
char ID[100];
srand((unsigned long)time(0));
clock_t start,end;
int w=0,j=0,k=0;
char t;
int a,b,c,d,score,i;
while(!k){
printf("请输入用户ID号:");
gets(ID);
k=check(ID);
if(k==0)
printf("ID不规范,Input again\n");
}
printf("ID:%s通过检查\n请玩家请做好准备,即将开始旅程\n",&ID);
printf("输入提示:\n(1)开始测试\n(2)检查分数\n(3)退出\n");
LOOP:
scanf("%d",&w);
switch(w){
case 3:
printf("游戏结束\n");
printf("等待下次见面\n");
exit(1);
break;
case 2:
printf("你以前的记录是:\n");
read_file(ID);
printf("输入提示:\n(1)继续测试\n(2)检查分数\n(3)退出\n");
goto LOOP;
break;
case 1:
char answer[10][100];
j=0; //必须重新复制为0,要不第二次时会因判断跳过做题循环
start=0;
end=0;
start = clock(); //计时开始
while(w==1&&j<10){ //10道加减乘除题目
a=rand()%101;
b=rand()%101;
c=rand()%4;
switch(c)
{
case 3:t='/',d=a/b;break;
case 2:t='*',d=a*b;break;
case 1:t='-',d=a-b;break;
case 0:t='+',d=a+b;break;
}
printf("%d%c%d=",a,t,b);
scanf("%d",&c);
sprintf(answer[j],"%d%c%d|%d|%d",a,t,b,d,c); //直接输入数组一行
if(c==d)
{
printf("正确!+10分\n");
score+=10;
}else
printf("错啦~\n");
j++;
}
end = clock(); //计时结束
int time=(int)(end-start)/CLOCKS_PER_SEC;
printf("答题结束\n");
printf("玩家分数为:%d,所用时间为%ds\n",score,time);
printf("输出:问题 | 正确答案 | 你的答案\n");
for(int i=0;i<10;i++){
puts(answer[i]);
}
store(ID,score,time);
printf("输入提示:\n(1)继续测试\n(2)检查分数\n(3)退出\n");
goto LOOP;
break;
}
}
其他实现:
1. 读取以往信息:
void read_file(char new_ID[]){
FILE *fp;
char ch;
if((fp=fopen("record.txt","rt+"))==NULL)
{
printf("您还未做题\n");
system("pause");
return 0;
exit(1);
}
ch=fgetc(fp); //从文件里获取一个字符,赋值给ch
while(ch!=EOF) //判断文件是否结束
{
putchar(ch); //输出一个字符
ch=fgetc(fp);
}
fclose(fp);
}
这里是平平无奇的77,妄想优秀 ▇ ▇ ▇ ▇ ▇ ▇ ▇ ▇ ▇ … 0%,若想转载请注明原链接,欢迎下次再来!!