20150401 作业2 结对 四则运算

一、从第一次作业出发,将程序改装成一个单机带用户界面(不是控制台)的程序,这个程序最基本要达到:

  • 生成题目,单个题目最多不能超过4个运算符,操作数小于100。
  • 用户可以输入答案
  • 若用户输入答案正确,则提示正确;若答案错误,则提示错误,并要提示正确答案是多少。

二、

八个可扩展方向: 

  1. 程序可以出带括号的正整数四则运算,支持分数,除法保留两位小数,如:(1/3+1)*2 = 2.67,特别注意:这里是2.67而非2.66,或保持分数形式:8/3
  2. 可以出表达式里含有负整数(负整数最小不小于-100)的题目,且负数需要带括号,用户输入的结果不用带括号。如: 2*(-4) = -8
  3. 用户答题结束以后,程序可以显示用户答题所用的时间
  4. 用户可以选择出题的个数(最多不能超过5个题目),答题结束可以显示用户答错的题目个数和答对的题目个数
  5. 用户在第一次答题时,需要用户输入用户名,用户下次启动后,程序需要记住用户前一次输入的用户名 
  6. 程序可以出单个整数阶乘的题目:如:4!=24
  7. 程序可以设置答题时间,时间设置为整数,单位为秒,最大不能超过120秒,若超过了答题时间未答题,则提示:时间已到,不能答题。
  8. 程序可以设置皮肤功能,可以改变界面的颜色即可。

实际用时: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/

 

转载于:https://www.cnblogs.com/bobbywei/p/4409729.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值