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%,若想轉載請注明原鏈接,歡迎下次再來!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/208781.html
標籤:其他
上一篇:CSP-S 2020 游記
