編寫一個幫助小學生練習數學的程序 (驗證ID格式) (隨機加減乘除) (信息存讀文件)

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

相關文章
相關標籤/搜索