一、从第一次作业出发,将程序改装成一个单机带用户界面(不是控制台)的程序,这个程序最基本要达到:
- 生成题目,单个题目最多不能超过4个运算符,操作数小于100。
- 用户可以输入答案
- 若用户输入答案正确,则提示正确;若答案错误,则提示错误,并要提示正确答案是多少。
二、
八个可扩展方向:
- 程序可以出带括号的正整数四则运算,支持分数,除法保留两位小数,如:(1/3+1)*2 = 2.67,特别注意:这里是2.67而非2.66,或保持分数形式:8/3
- 可以出表达式里含有负整数(负整数最小不小于-100)的题目,且负数需要带括号,用户输入的结果不用带括号。如: 2*(-4) = -8
- 用户答题结束以后,程序可以显示用户答题所用的时间
- 用户可以选择出题的个数(最多不能超过5个题目),答题结束可以显示用户答错的题目个数和答对的题目个数
- 用户在第一次答题时,需要用户输入用户名,用户下次启动后,程序需要记住用户前一次输入的用户名
- 程序可以出单个整数阶乘的题目:如:4!=24
- 程序可以设置答题时间,时间设置为整数,单位为秒,最大不能超过120秒,若超过了答题时间未答题,则提示:时间已到,不能答题。
- 程序可以设置皮肤功能,可以改变界面的颜色即可。
实际用时:4天
优点:进入系统需要输入用户姓名,随机生成算术题,自动验证答案是否正确,输出成绩,文档外输出成绩TXT。
缺点:只能运用一种运算法则,不能混合运算。
源程序:
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <conio.h> #include <string.h> #define TIME_OUT 60000 //定义时间毫秒 #define TOTAL 20 //总题数 int total;//题目总数 int yes = 0;//答对题数 int start;//开始时间 int stop;//结束时间 int answer;//答案 int user_answer;//用户答案寄存 char user_name[20];//用户姓名 int init(); int main_body();// int print_math();//输出问题 int do_question();//回答问题 int random(int x);//返回0-x之间的随机数 int see_grade();//查看成绩 int copyRight(); int getName(); int writeEile(); int main(){ srand(clock());//随机函数初始化 getName(); while(1){ int i; init(); i = getch(); fflush(stdin);//清除缓冲区 if(i == '1') { yes = 0; main_body();see_grade(); } else if(i == '2') see_grade(); else if(i == '3') break; } copyRight(); system("pause"); return 0; } int main_body(){ total = TOTAL; yes = 0; print_math(); while(total >= 0 ){ stop = clock();//获取当前时间 if(total == 0){ //给最后一题等待时间 if(do_question() || stop - start > TIME_OUT ) total--; }else if(stop - start > TIME_OUT) print_math();//如果时间超过,就输出下一题 else if(do_question()) print_math(); } return 1; } int print_math(){ char c[] = {'+','-','*','/'}; char *pc; int x; int y; int r; x = random(100); y = random(100); r = random(4); start = clock();//时间初始化 user_answer = 0;//用户答案初始化 pc = c; pc += r; switch(r){ case 0: answer = x + y; if(answer > 100){ x = x % 50; y = y % 50; answer = x + y; } break; case 1: answer = x - y; break; case 2: x = x % 10; answer = x * y; if(answer >100 ){ y = y % 10; answer = x * y; } break; case 3: if(y == 0) y++; answer = x / y; x = answer * y; break; } system("cls"); printf("第%d题\n",TOTAL - total + 1); printf("输入数字后请用回车确认\n"); printf("结果保留整数\n"); printf("%d%c%d=\n",x,*pc,y); total--; return 1; } int do_question(){ if(kbhit()){ int ch; ch = getch(); putch(ch); if(ch >= '0' && ch <= '9') { user_answer = user_answer * 10 + ch - '0'; return 0; }else if( ch == 13){ if(user_answer == answer) yes++;//验证答案 return 1; }else if(ch == 45){ answer = -answer; }else if(ch == 8){ user_answer = 0; printf("\r \r"); return 0; }else { getchar();//丢弃其他字符 return 0; } } return 0; } int random(int x){ int i; i = rand(); return (int)((float) i / RAND_MAX * x); } int init(){ system("cls"); printf(" 学生四则运算考试模拟系统\n"); printf(" | \n"); printf(" | \n"); printf(" 1.开始 | 2.查看分数 \n"); printf(" | \n"); printf("------------+-------------\n"); printf(" | \n"); printf(" 3.退出 | \n"); printf(" | \n"); printf(" | \n"); printf("请选择(输入数字):\n"); return 1; } int see_grade(){ system("cls"); printf("尊敬的%s\n",user_name); printf("您的上一次答题情况\n"); printf("答对题数%d\n",yes); printf("得分为:%d分\n",yes * 100 / TOTAL);//百分制 printf("满分为100分\n"); printf("按任意键返回\n"); writeFile(); while(!kbhit()); fflush(stdin); return 1; } int copyRight(){ system("cls"); printf("感谢您的使用!\n"); return 0; } int getName(){ printf("欢迎您使用学生四则运算考试模拟系统\n"); printf("请输入您的姓名:\n"); scanf("%s",user_name); fflush(stdin); return 1; } int writeFile(){ char ch[100]; char num[10]; FILE * write; write = fopen("data.txt","w"); if(write == NULL){ perror("data.txt"); return 0; } strcpy(ch,user_name); strcat(ch,"\n您的成绩如下\n您共作对"); itoa(yes,num,10); strcat(ch,num); strcat(ch,"道题\n您的得分为"); itoa(yes * 100 / TOTAL , num, 10); strcat(ch,num); strcat(ch,"分\n满分为100分\n"); fputs(ch,write); fclose(write); return 1; }
进入系统需要输入姓名:
开始界面(菜单)
按“1”后开始答题
答题后输出结果
退出时,界面
导出成绩txt方便查看
伙伴链接:http://www.cnblogs.com/Roc201306114311Roc/