2.0版,除限制结果在100之内之外,大体没有问题。windows
1.【问题描述】
编写一个帮助小学生练习数学的程序,帮助小学生练习 100 之内的四种数学运算:加、减、乘、除。api
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. 读取以往信息:
spa
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%,若想转载请注明原连接,欢迎下次再来!!code