20150401 作业2 结对 四则运算
一、从第一次作业出发,将程序改装成一个单机带用户界面(不是控制台)的程序,这个程序最基本要达到:
- 生成题目,单个题目最多不能超过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/