码迷,mamicode.com
首页 > 其他好文 > 详细

c实现的四则运算程序

时间:2018-09-30 22:45:39      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:0day   估计   测试   scan   sub   输入输出   需要   直接   添加   

github项目地址:https://github.com/xinxianquan/ruangong

成员:马朝滨,王志聪。

题目:实现一个自动生成小学四则运算题目的命令行程序。

需求:

1. 使用 -n 参数控制生成题目的个数

例如,Myapp.exe -n 10, 将生成10个题目。

2. 使用 -r 参数控制题目中数值(自然数、真分数和真分数分母)的范围

例如,Myapp.exe -r 10,将生成10以内(不包括10)的四则运算题目。该参数可以设置为1或其他自然数。该参数必须给定,否则程序报错并给出帮助信息。

3. 生成的题目中计算过程不能产生负数,也就是说算术表达式中如果存在形如e1 ? e2的子表达式,那么e1 ≥ e2

4. 生成的题目中如果存在形如e1 ÷ e2的子表达式,那么其结果应是真分数。

5. 每道题目中出现的运算符个数不超过3个。

6. 程序一次运行生成的题目不能重复,即任何两道题目不能通过有限次交换+和×左右的算术表达式变换为同一道题目。例如,23 + 45 = 和45 + 23 = 是重复的题目,6 × 8 = 和8 × 6 = 也是重复的题目。3+(2+1)和1+2+3这两个题目是重复的,由于+是左结合的,1+2+3等价于(1+2)+3,也就是3+(1+2),也就是3+(2+1)。但是1+2+3和3+2+1是不重复的两道题,因为1+2+3等价于(1+2)+3,而3+2+1等价于(3+2)+1,它们之间不能通过有限次交换变成同一个题目。

生成的题目存入执行程序的当前目录下的Exercises.txt文件,格式如下:

1. 四则运算题目1

2. 四则运算题目2

……

其中真分数在输入输出时采用如下格式,真分数五分之三表示为3/5,真分数二又八分之三表示为2’3/8。

7. 在生成题目的同时,计算出所有题目的答案,并存入执行程序的当前目录下的Answers.txt文件,格式如下:

1. 答案1

2. 答案2

特别的,真分数的运算如下例所示:1/6 + 1/8 = 7/24。

8. 程序应能支持一万道题目的生成。

9. 程序支持对给定的题目文件和答案文件,判定答案中的对错并进行数量统计,输入参数如下:

Myapp.exe -e <exercisefile>.txt -a <answerfile>.txt

统计结果输出到文件Grade.txt,格式如下:

Correct: 5 (1, 3, 5, 7, 9)

Wrong: 5 (2, 4, 6, 8, 10)

其中“:”后面的数字5表示对/错的题目的数量,括号内的是对/错题目的编号。

 

PSP2.1表格

 

PSP2.1

Personal Software Process Stages

预估耗时(分钟)

实际耗时(分钟)

Planning

计划

 7day  5day

· Estimate

· 估计这个任务需要多少时间

 10day  8day

Development

开发

 6day  6day

· Analysis

· 需求分析 (包括学习新技术)

 7day  7day

· Design Spec

· 生成设计文档

 60  60

· Design Review

· 设计复审 (和同事审核设计文档)

 180  180

· Coding Standard

· 代码规范 (为目前的开发制定合适的规范)

 60  60

· Design

· 具体设计

 1day  2day

· Coding

· 具体编码

 3day  3day

· Code Review

· 代码复审

 60  60

· Test

· 测试(自我测试,修改代码,提交修改)

 1day  3day

Reporting

报告

 60  60

· Test Report

· 测试报告

 60  60

· Size Measurement

· 计算工作量

 30  20

· Postmortem & Process Improvement Plan

· 事后总结, 并提出过程改进计划

 60  120

合计

     

 

效能分析

在完成程序时发现不能循环运行程序,每运行一次需要执行一次,感觉有点繁琐,所以我在原程序中添加了循环调用的语句;此外发现没程序不是通过参数控制的,是直接运行后产生了结果,然后就重新加上了参数功能。

程序的改进大概花了3个小时左右。

设计实现过

这个程序共有9个函数,分别是:

参数r实现的函数:void rcommad(int m);参数n实现的函数:void ncommad(int n);表达式生成函数:void generatearithmetic(int n,int m);

生成单运算符表达式的函数:void level_1(int n, int m,int nm);生成双运算符表达式的函数:void level_2(int n, int m);产生表达式结果的函数:void Answers(int num, FILE *fpanswers);

产生表达式的函数:void Exercises(int rdnum[], char rdchar[], int rd_num, int rd_char, FILE  *fpexercises);

产生结果的函数:void Grade(int m);获取键盘输入的算术结果的函数:void  answerschar(int m)。

函数间的关系:rcommad,ncommad会产生题目的数值范围和题目的数量,然后传参数到generatearithmetic函数,接着generatearithmetic函数调用函数level_1,level_2来生成不同的题目。而函数Answers,Exercises是用来将生成题目和结果写进文本文件的,

answerschar函数是用来将键盘输入的结果写入文件存储起来和统计做对或做错的题目的函数,Grade函数是用写入统计出来的做对或着做错的题目。

代码说明

void generatearithmetic(int n,int m)  //生成表达式的函数
{
    void level_1(int n, int m,int nm);  //单运算符算术表达式产生函数
    void level_2(int n, int m);  //双运算符算术表达式产生函数
    void  answerschar(int m);   //获取键盘输入运算结果的函数
    void Grade(int m);          //统计成绩结果的函数

    FILE *fpan;
    char Filewirteanswers[] = "wirteanswers.txt";
    char gchar[10];
    int nm;

    fpan = fopen(Filewirteanswers, "w");     //生成键盘输入运算结果的文本文件
    if (fpan == NULL)
    {
        printf("open anfile fail!");
    }
    nm = n / 2;
    if (n%2==0)
    {
           
            level_1(n/2,m,nm);
            level_2(n/2,m);
            printf("\n请输入你的答案(每道题的答案用回车键作结束):\n");
            printf("(提示:真分式书写方式:3‘5/8)\n");
            for (int i = 0; i < n; i++)
            {
                scanf("%s", gchar);
                fprintf(fpan, "%s", gchar);
                fputc(\n, fpan);
            }
            fclose(fpan);
            answerschar(n);
            Grade(n);
    }
    else
    {
        level_1((n / 2)+1, m,nm);
        level_2(n / 2, m);
        printf("\n请输入你的答案(每道题的答案用回车键作结束):\n");
        printf("(提示:真分式书写方式:3‘5/8)\n");
        for (int i = 0; i < n; i++)
        {
            scanf("%s", gchar);
            fprintf(fpan, "%s", gchar);
            fputc(\n, fpan);
        }
        fclose(fpan);
        answerschar(n);
        Grade(n);
    }

}

 

从函数rcommad,ncommad传来的题目数量n,题目数值范围m到函数generatearithmetic(int n,int m)后,其将调用函数 level_1(int n, int m,int nm); //单运算符算术表达式产生函数

level_2(int n, int m); //双运算符算术表达式产生函数,来生成表达式。而answerschar(int m); 是获取键盘输入运算结果的函数,Grade(int m); 是统计成绩结果的函数,

函数generatearithmetic调用answerschar,Grade就能得到做对或做错的统计结果。

测试运行

技术分享图片          技术分享图片          技术分享图片          技术分享图片           技术分享图片

技术分享图片            技术分享图片          技术分享图片          技术分享图片             技术分享图片

同过计算并比对结果验证了程序是正确的。

 

项目小结

这次项目总的来说有点一波三折,刚开始时发现打不开文本文件,后发现是文件放错了目录,然后出现没法将题目和结果写入文件,重复测试后发现是格式不正确,导致整型转为字符型后产生了错误。

接着就是在比较键盘输入的结果和程序产生的结果时,结果明明是一致的但是判成了错的,百度后也没能解决,后来通过不断的检查发现从文件读取的字符串比键盘输入的会多一个转行符,于是

就想到了先用文件存储起来在对它读取,这样可以了。

这个程序虽然基本实现了产生表达式和统计结果的功能,但是不够简洁,而且如过结果是分数时没有进行约分处理。

这个项目总的来说收获挺多的,因为自己原本基础就不好,又没有做过什么项目,能通过这种基础的项目夯实基础还是挺不错的。

 

c实现的四则运算程序

标签:0day   估计   测试   scan   sub   输入输出   需要   直接   添加   

原文地址:https://www.cnblogs.com/hsgddj/p/9729931.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!