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