四则运算2

一、问题描述:

  要求:
    1、题目避免重复
    2、可定制(数量/打印方式)
    3、可以控制下列参数:是否有乘除法,是否有括号,数值范围,加减有无负数,除法有无余数,是否支持分数(真分数假分数),

         是否支持小数(精确到多少位),打印中每行的间隔。

二、问题分析:

  问题一:题目避免重复

    srand(time(NULL))函数;
  问题二:可定制(数量/打印方式)

    数量:将输入的题目数量的n以一个for循环挨个输出;
    打印方式:以用户的输入数字来选择打印方式,1代表一行输出三道题,2代表...;

  问题三:可以控制:是否有乘除法、是否有括号、数值范围、加减有无负数、除法有无余数、是否支持分数(真假分数,、、、)
      是否支持小数(精确带多少位)、打印中每行间隔可调整

    在选则有无上述各种数,用数字表示有无,每行的间隔和数字的有无一样。

三、源代码:

//作者:田永涛
//2015.3.13
//代码实现功能:能随机的生成用户输入四则运算题的数目,且能做相应的控制

#include "stdafx.h"
#include<iostream.h>
#include<stdlib.h>
#include<time.h>
int main(int argc, char* argv[])
{
    srand(time(NULL));
    int    ph[10];                     //建立捕获数组,用以存放输入的选则  
    int Pway,num1,num2;                      //用来表示打印方式
    int i,j;
    int judge;
    do
    {
        printf("以下均用0表示输入“否”,用1表示输入“是”\n");
        printf("请输入要打印的题目数量:");
        scanf("%d",&ph[0]);                      //a[0]存放打印题的数量
        printf("请输入打印的方式(列数):");
        scanf("%d",&ph[1]);                                    //a[1]代表输入的列数
        printf("请输入是否有乘除法:");
        scanf("%d",&ph[2]);                                          //a[2]代表有无乘除法
        printf("请输入数值范围:");
        scanf("%d",&ph[3]);
        printf("请输入加减是否有负数:");
        scanf("%d",&ph[4]);
        printf("请输入间隔数:");
        scanf("%d",&ph[6]);
        if(ph[2] == 1)
        {
            printf("请输入除法的算式中是否有余数出现(0/1):");
            scanf("%d",&ph[5]);
        }
        for(i=0; i<ph[0]; i++)
        {
            num1 = rand()%(ph[3]+1);
            num2 = rand()%(ph[3]+1);
            switch(ph[2])
            {
            case 0:                         //如果没有乘除法
                Pway = rand()%2;            //构造随机函数,输出只有加减法的运算
                if(Pway == 0)                //加法
                {
                    printf("<%d>%d+%d=\t",i+1,num1,num2);
                    if((i+1)%ph[1] == 0)
                    {
                        printf("\n");
                        if(ph[6]!=0)                          //ph[6]表示每行间隔的数量
                        {
                            for(j = 0;j<ph[6];j++)
                            {
                                printf("\n");
                            }
                        }
                    }
                }
                else
                {
                    if(ph[4] == 0)                   //如果不允许出现负数
                    {
                        if(num1<num2)                //确定被减数大于减数    
                        {
                            i = i-1;
                        }
                        else
                        {
                            printf("<%d>%d-%d=\t",i+1,num1,num2);
                            if((i+1)%ph[1] == 0)              //判断是否换行
                            {
                                printf("\n");
                                if(ph[6]!=0)                         //ph[6]表示每行间隔的数量
                                {
                                    for(j = 0;j<ph[6];j++)
                                    {
                                        printf("\n");
                                    }
                                }
                            }
                        }
                    }
                    else                             //如果允许出现负数
                    {
                        printf("<%d>%d-%d=\t",i+1,num1,num2);
                        if((i+1)%ph[1] == 0)              //判断是否换行
                        {
                            printf("\n");
                            if(ph[6]!=0)                         //ph[6]表示每行间隔的数量
                            {
                                for(j = 0;j<ph[6];j++)
                                {
                                    printf("\n");
                                }
                            }
                        }
                    }
                }
                break;
            case 1:                                   //有乘除法的输出
                Pway = rand()%4;
                switch(Pway)                
                {
                case 0:                                     //加法
                    printf("<%d>%d+%d=\t",i+1,num1,num2);
                    if((i+1)%ph[1] == 0)
                    {
                        printf("\n");
                        if(ph[6]!=0)                       //ph[6]表示每行间隔的数量
                        {
                            for(j = 0;j<ph[6];j++)
                            {
                                printf("\n");
                            }
                        }
                    }
                    break;
                case 1:
                    if(ph[4] == 0)
                    {
                        if(num1<num2)                //确定被减数大于减数,其他的控制如上述减法的控制
                        {
                            i = i-1;
                        }
                        else
                        {
                            printf("<%d>%d-%d=\t",i+1,num1,num2); 
                            if((i+1)%ph[1] == 0)
                            {
                                printf("\n");
                                if(ph[6]!=0)                   //ph[6]表示每行间隔的数量   
                                {
                                    for(j = 0;j<ph[6];j++)
                                    {
                                        printf("\n");
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        printf("<%d>%d-%d=\t",i+1,num1,num2);
                        if((i+1)%ph[1] == 0)
                        {
                            printf("\n");
                            if(ph[6]!=0)                            //ph[6]表示每行间隔的数量
                            {
                                for(j = 0;j<ph[6];j++)
                                {
                                    printf("\n");
                                }
                            }
                        }
                    }
                    break;
                case 2:                                //乘法
                    printf("<%d>%d×%d=\t",i+1,num1,num2);
                    if((i+1)%ph[1] == 0)
                    {
                        printf("\n");
                        if(ph[6]!=0)                              //ph[6]表示每行间隔的数量
                        {
                            for(j = 0;j<ph[6];j++)
                            {
                                printf("\n");
                            }
                        }
                    }
                    break;
                case 3:                                //除法
                    if(num2 == 0)                       //除数不能为零
                    {
                        i = i - 1;
                    }
                    else
                    {
                        if(ph[5] == 1)                 //判断选择是否有余数,如果能有余数
                        {
                            printf("<%d>%d÷%d=\t",i+1,num1,num2);
                            if((i+1)%ph[1] == 0)
                            {
                                printf("\n");
                                if(ph[6]!=0)                         //ph[6]表示每行间隔的数量
                                {
                                    for(j = 0;j<ph[6];j++)
                                    {
                                        printf("\n");
                                    }
                                }
                            }
                        }
                        else                          //如果不能有余数
                            if(num1%num2!=0)
                            {
                                i = i-1;
                            }
                            else
                            {
                                printf("<%d>%d÷%d=\t",i+1,num1,num2);
                                if((i+1)%ph[1] == 0)
                                {
                                    printf("\n");
                                    if(ph[6]!=0)                                   //ph[6]表示每行间隔的数量
                                    {
                                        for(j = 0;j<ph[6];j++)
                                        {
                                            printf("\n");
                                        }
                                    }
                                }
                            }
                    }
                    break;
                default:
                    printf("出错!\n");
                    break;
                }
                break;
            default:
                printf("出错!\n");
                break;
            }
        }
        printf("\n");
        printf("是否继续打印:");
        scanf("%d",&judge);
    }while(judge == 1);
    return 0;
}

四、运行结果

五、总结

  在这次的作业中,回顾了大一的c语言的知识,在过程中遇到的问题并不是算法或者数据结构的问题,而是语法和简单的标点

 或者是语句插入位置的问题。当然,这次的作业并没有完全视线全部的功能,这也是为什么没有遇到数据和算法问题的原因。

  除上述的问题外,在作业中,遇到中文字符加减乘除和英语字符加减乘除的输出方面有点不明白。希望在以后的学习中可以

 明白其中的问题,提高自己。

六、周活动总结表

周活动总结表

姓名:田永涛                                            日期:2015.3.13

日期       任务

听课

编写程序

阅读课本

准备考试

 

 

日总计

周日

 

 

 

 

 

 

 

周一

 

 

 

 

 

 

 

周二

 100

 30

 15

 

 

 

 145

周三

 

 68

 

 

 

 

68

周四

 

50

 15

 

 

 

65

周五

 100

 69

 15

 

 

 

 184

周六

 

 34

 

 

 

 

 34

周总结

 200

 251

 45

 

 

 

 496

阶段时间和效率                                            周数(上一次周活动表的周数+1):

不包括上一周在内的累计时间                                                                         

总计

 

 

 

 

 

 

 

平均

 

 

 

 

 

 

 

最大

 

 

 

 

 

 

 

最小

 

 

 

 

 

 

 

以前各周的累计时间                                                                                    

总计

 200

 251

  45

 

 

 

 496

平均

 200

 251

  45

 

 

 

 496

最大

 200

 251

  45

 

 

 

 496

最小

 200

 251

  45

 

 

 

 496

二、时间记录表:

学生        田永涛                                             日期   2015313 

教师        王建民                                             课程           PSP       

日期

开始时间

结束时间

中断时间

净时间

活动

备注

 3.10

 19:12

 19:42

 无

30

编程序 

作业 

 3.11

19:03

20:11

 无

 68

 编程序

作业

 3.12

19:10

20:00

50

编写程序

作业

3.13

15:02

16:11

69

完善程序

作业

 3.14

 10:10

10:44

 无

34

完善程序

 作业

 

 

 

 

 

 

 

 

三、缺陷记录日志:

学生     田永涛       

日期     2015313 

教员       王建民   

程序号                

日期

编号

类型

引入阶段

排除阶段

修复时间

修复缺陷

 3.10

 1

 a2

运行

运行之后马上

1min

 

 在输入scanf中,漏掉取地址符号&

 3.10

 2

a3

编译

 编译

1min

 

 在判断if(ph[] == 1)条件时,将==写成=

 3.10

 3

B1

运行

运行之后

3min

 

 在运行时,输出的结果虽然正确,但格式却不正确,行间距混乱

 3.12

4

a1

编译

编译

1min

 

漏掉;

3.13

5

B2

运行

运行之后

15min

 

在运行时,输出的格式不是按要求的输出的,原因是if语句插入的位置不正确

posted @ 2015-03-14 21:22  我是一个小小小字符串  阅读(155)  评论(0编辑  收藏  举报