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题
",TOTAL - total + 1);
    printf("输入数字后请用回车确认
");
    printf("结果保留整数
");
    printf("%d%c%d=
",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("
           
");
            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("  学生四则运算考试模拟系统
");
    printf("            |             
");
    printf("            |             
");
    printf("   1.开始   |  2.查看分数 
");
    printf("            |             
");
    printf("------------+-------------
");
    printf("            |             
");
    printf("   3.退出   |             
");
    printf("            |             
");
    printf("            |             
");
    printf("请选择(输入数字):
");
    return 1;
}

int see_grade(){
    system("cls");
    printf("尊敬的%s
",user_name);
    printf("您的上一次答题情况
");
    printf("答对题数%d
",yes);
    printf("得分为:%d分
",yes * 100 / TOTAL);//百分制
    printf("满分为100分
");
    printf("按任意键返回
");
    writeFile();
    while(!kbhit());
    fflush(stdin);
    return 1;
}

int copyRight(){
    system("cls");
    printf("感谢您的使用!
");
    return 0;
}

int getName(){
    printf("欢迎您使用学生四则运算考试模拟系统
");
    printf("请输入您的姓名:
");
    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,"
您的成绩如下
您共作对");
    itoa(yes,num,10);
    strcat(ch,num);
    strcat(ch,"道题
您的得分为");
    itoa(yes * 100 / TOTAL , num, 10);
    strcat(ch,num);
    strcat(ch,"分
满分为100分
");
    fputs(ch,write);
    fclose(write);
    return 1;
}


进入系统需要输入姓名:

开始界面(菜单)

按“1”后开始答题

答题后输出结果

退出时,界面

导出成绩txt方便查看

伙伴链接:http://www.cnblogs.com/Roc201306114311Roc/

原文地址:https://www.cnblogs.com/bobbywei/p/4409729.html