作业一

博客班级 软件工程
作业要求 作业要求
作业目标 能够精准高效完成四则运算并输出结果;迅速理解需求制定功能
学号 3180701217

二.题目要求

写一个能自动生成小学四则运算题目的程序,然后在此基础上扩展:

1)除了整数以外,还要支持真分数的四则运算,例如:1/6+1/8=7/24

2)程序要求能处理用户的输入,判断对错,累积分数

3)程序支持可以由用户自行选择加、减、乘、除运算

4)使用-n参数控制生成题目的个数,例如Myapp.exe -n 10,将生成10个题目

三.代码提交

1)提交你的源代码在你的博客上,注释好各个函数,给出相应解释,并把运行成功的界面粘贴到博客上;

2)要求逻辑清晰,界面整洁

#include<stdio.h>
#include<math.h>
#include<windows.h>
#include<time.h> 


int right=0;//答对的正确的题目个数 
int wrong=0;//答错的题目个数

void add() //整数的加法
{
      int a,b,c;
      a=rand()%100; //随机生成
      b=rand()%100;
      printf("请回答:\n\t\t %d + %d = ",a,b);
      scanf("%d",&c);
      if(a+b==c)
      {
            printf("回答正确!\n");
            right++;
      }
      else
      {
            printf("回答错误!\n");
            wrong++;
      }
}

void Add() //真分数的加法
{
      int zhenfenshu1_m=0, zhenfenshu1_z=0, zhenfenshu2_m=0, zhenfenshu2_z=0;
      int a,b,c;
      zhenfenshu1_m=0+rand()%100;
      zhenfenshu1_z=0+rand()%100;
      //判断产生的真分数正确性
      while(zhenfenshu1_m<zhenfenshu1_z)
      {
          zhenfenshu1_m=0+rand()%100;
          zhenfenshu1_z=0+rand()%100;    
      }

      zhenfenshu2_m=0+rand()%100;
      zhenfenshu2_z=0+rand()%100;

      //判断产生的真分数正确性
      while(zhenfenshu2_m<zhenfenshu2_z)
      {
          zhenfenshu2_m=0+rand()%100;
          zhenfenshu2_z=0+rand()%100;    
      }
      printf("请回答:\n\t\t %d / %d + %d / %d = ",zhenfenshu1_z,zhenfenshu1_m,zhenfenshu2_z,zhenfenshu2_m);
      scanf("%d",&c);
      a=zhenfenshu1_z/zhenfenshu1_m, b=zhenfenshu2_z/zhenfenshu2_m;
      if(a+b==c)
      {
          printf("回答正确!\n");
          right++;
      }
      else
      {
          printf("回答错误!\n");
          wrong++;
      }
}

void minu() //整数减法
{
      int a,b,c;
      a=rand()%100;
      b=rand()%100;
      printf("请回答:\n\t\t %d - %d = ",a,b);
      scanf("%d",&c);
      if(a-b==c)
      {
      printf("回答正确!\n");
      right++;
      }
      else
      {
      printf("回答错误!\n");
      wrong++;
      }
}
void Minu() //真分数的减法
{
      int zhenfenshu1_m=0, zhenfenshu1_z=0, zhenfenshu2_m=0, zhenfenshu2_z=0;
      int a,b,c;
      zhenfenshu1_m=0+rand()%100;
      zhenfenshu1_z=0+rand()%100;
      //判断产生的真分数正确性
      while(zhenfenshu1_m<zhenfenshu1_z)
      {
          zhenfenshu1_m=0+rand()%100;
          zhenfenshu1_z=0+rand()%100;    
      }

      zhenfenshu2_m=0+rand()%100;
      zhenfenshu2_z=0+rand()%100;

//判断产生的真分数正确性
      while(zhenfenshu2_m<zhenfenshu2_z)
      {
    zhenfenshu2_m=0+rand()%100;
    zhenfenshu2_z=0+rand()%100;    
      }
      printf("请回答:\n\t\t %d / %d - %d / %d = ",zhenfenshu1_z,zhenfenshu1_m,zhenfenshu2_z,zhenfenshu2_m);
      scanf("%d",&c);
      a=zhenfenshu1_z/zhenfenshu1_m, b=zhenfenshu2_z/zhenfenshu2_m;
      if(a-b==c)
      {
          printf("回答正确!\n");
          right++;
      }
      else
      {
          printf("回答错误!\n");
          wrong++;
      }
}

void mul() //整数乘法
{
      int a,b,c;
      a=rand()%100;
      b=rand()%100;
      printf("请回答:\n\t\t %d * %d = ",a,b);
      scanf("%d",&c);
      if(a*b==c)
      {
      printf("回答正确!\n");
      right++;
      }
      else
      {
      printf("回答错误!\n");
      wrong++;
      }
}
void Mul() //真分数的乘法
{
      int zhenfenshu1_m=0, zhenfenshu1_z=0, zhenfenshu2_m=0, zhenfenshu2_z=0;
      int a,b,c;
      zhenfenshu1_m=0+rand()%100;
      zhenfenshu1_z=0+rand()%100;
//判断产生的真分数正确性
      while(zhenfenshu1_m<zhenfenshu1_z)
      {
          zhenfenshu1_m=0+rand()%100;
          zhenfenshu1_z=0+rand()%100;    
      }

      zhenfenshu2_m=0+rand()%100;
      zhenfenshu2_z=0+rand()%100;

//判断产生的真分数正确性
while(zhenfenshu2_m<zhenfenshu2_z)
{
    zhenfenshu2_m=0+rand()%100;
    zhenfenshu2_z=0+rand()%100;    
}
printf("请回答:\n\t\t %d / %d * %d / %d = ",zhenfenshu1_z,zhenfenshu1_m,zhenfenshu2_z,zhenfenshu2_m);
a=zhenfenshu1_z/zhenfenshu1_m, b=zhenfenshu2_z/zhenfenshu2_m;     
scanf("%d",&c);
if(a*b==c)
{
    printf("回答正确!\n");
    right++;
}
else
{
    printf("回答错误!\n");
    wrong++;
}
}
void di() //整数除法
{
      int a,b,c;
      a=rand()%100;
      b=rand()%100;
      printf("请回答:\n\t\t %d / %d = ",a,b);
      scanf("%d",&c);
      if(a/b==c)
      {
      printf("回答正确!\n");
      right++;
      }
      else
      {
      printf("回答错误!\n");
      wrong++;
      }
}
void Di() //真分数的除法
{
      int zhenfenshu1_m=0, zhenfenshu1_z=0, zhenfenshu2_m=0, zhenfenshu2_z=0;
      int a,b,c;
      zhenfenshu1_m=0+rand()%100;
      zhenfenshu1_z=0+rand()%100;
//判断产生的真分数正确性
while(zhenfenshu1_m<zhenfenshu1_z)
{
    zhenfenshu1_m=0+rand()%100;
    zhenfenshu1_z=0+rand()%100;    
}

zhenfenshu2_m=0+rand()%100;
zhenfenshu2_z=0+rand()%100;

//判断产生的真分数正确性
while(zhenfenshu2_m<zhenfenshu2_z)
{
    zhenfenshu2_m=0+rand()%100;
    zhenfenshu2_z=0+rand()%100;    
}
printf("请回答:\n\t\t %d / %d ÷ %d / %d = ",zhenfenshu1_z,zhenfenshu1_m,zhenfenshu2_z,zhenfenshu2_m);
scanf("%d",&c);
a=zhenfenshu1_z/zhenfenshu1_m, b=zhenfenshu2_z/zhenfenshu2_m;
if(a/b==c)
{
    printf("回答正确!\n");
    right++;
}
else
{
    printf("回答错误!\n");
    wrong++;
}
}
int main(void)
{
      int choise,bot;
      srand(time(NULL)); //随机数每次循环都不一样
      int con=0;
      printf("\n\t\t\t小学简易四则运算\n\n");
      while(1)
      {
      if(con==0)
      {
            printf("\t\请选择:\n");
            printf("\t\t 整数计算(请输入1)\n\t\t真分数计算(请输入2)\n");
            scanf("%d",&choise);
            switch(choise)
            {
            case 1:
            printf("\t\t\t 加法运算(请输入1)\n");
            printf("\t\t\t 减法运算(请输入2)\n");
            printf("\t\t\t 乘法运算(请输入3)\n");
            printf("\t\t\t 除法运算(请输入4)\n");
            printf("\t\t\t 退出运算(请输入5)\n");
            scanf("%d", &bot);
            switch(bot)
            {
            case 1:
            add();
            break;
            case 2:
            minu();
            break;
            case 3:
            mul();
            break;
            case 4:
            di();
            break;
            case 5:
            return 0; 
            }
      break;
            case 2:
            printf("\t\t\t 加法运算(请输入1)\n");
            printf("\t\t\t 减法运算(请输入2)\n");
            printf("\t\t\t 乘法运算(请输入3)\n");
            printf("\t\t\t 除法运算(请输入4)\n");
            printf("\t\t\t 退出运算(请输入5)\n");
            scanf("%d", &bot);
            switch(bot)
            {
            case 1:
            Add();
            break;
            case 2:
            Minu();
            break;
            case 3:
            Mul();
            break;
            case 4:
            Di();
            break;
            case 5:
            return 0; 
            }
      break;
          }
      }
      if(con==1)
    {
        switch(choise)
          {
              case 1:
                  printf("\t\t\t  加法运算(请输入1)\n");
                  printf("\t\t\t  减法运算(请输入2)\n");
                  printf("\t\t\t  乘法运算(请输入3)\n");
                  printf("\t\t\t  除法运算(请输入4)\n");
                  printf("\t\t\t  退出运算(请输入5)\n");
                  scanf("%d", &bot);
                  switch(bot)
                  {
                      case 1:
                          add();
                           break;
                      case 2:
                           minu();
                          break;
                      case 3:
                           mul();
                           break;
                      case 4:
                           di();
                           break;
                      case 5:
                           return 0;    
                }
                break;
            case 2:
                  switch(bot)
                  {
                      case 1:
                          Add();
                           break;
                      case 2:
                           Minu();
                          break;
                      case 3:
                           Mul();
                           break;
                       case 4:
                           Di();
                           break;
                      case 5:
                           return 0;    
                }
                break;

          }
    }
      printf("\n\t\t\t继续运算?(请输入1)\n");
      printf("\n\t\t\t重新选择?(请输入2)\n");
      printf("\n\t\t\t退出运算?(请输入3)\n");
      scanf("%d",&con);
      if(con==1)
           con=1;
      else if(con==2)
           con=0;
      else if(con==3)
           break;
      else
           printf("抱歉!,你输入的指令有误!请重新输入!\n");
}
fflush(stdin);   //清空输入缓冲区
printf("您总共完成了 %d 道题\n正确 %d 道\n错误 %d 道\n",right+wrong,right,wrong);
}

四、运行截图

五、个人小结
知识总结:
Fraction()-->完成分数的表示和计算,并且用分数表示出来。
eval()-->可以自动进行四则混合运算(带括号),但是本次题目没有加入括号运算
代码测试-->可以发现程序隐藏的错误。
性能测试-->能够很方便地看到程序的运行时间及效率,对于以后的修改可以更加专业且有针对性。

个人感悟:
在我们设计程序时候,将一个大的问题分成几个模块,运用不同的函数将这些模块分别设计出来,然后运用函数调用,我们就可以将这些功能不同的模块联系在一起。在设计程序过程中,我原先定义的变量 总出问题,比预期的时间多花费了好多,Debug也比想像的花的时间长,深知自己技术水平还不高,编这样的程序遇到了很多困难,但我相信经过今后的不断学习,我的变成能力会有很大的提高。

psp2.1 任务内容 计划完成需要的时间(min) 实际完成需要的时间(min)
Planning 计划 340 550
Estimate 估计这个任务需要多少时间,并规划大致工作步骤 30 70
Development 开发 20 40
Analysis 需求分析(包括学习新技术) 30 25
Design Spec 生成设计文档 10 20
Design Review 设计复审 10 15
Coding Standard 代码规范 10 10
Design 具体设计 30 60
Coding 具体编码 60 180
Code Review 代码复审 30 60
Test 测试(自我测试,修改代码,提交修改) 40 45
Reporting 报告 10 20
Test Report 测试报告 10 15
Size Measurement 计算工作量 20 15
Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 20 20
posted @ 2020-11-07 23:53  SHIWUYU  阅读(83)  评论(0编辑  收藏  举报