四则运算2

一.要求:

1、题目避免重复;

2、可定制(数量/打印方式);

3、可以控制下列参数:  

     是否有乘除法、

     是否有括号、  

     数值范围、

     加减有无负数、

     除法有无余数、

     否支持分数 (真分数, 假分数, …)、

     是否支持小数 (精确到多少位)、

     打印中每行的间隔可调整;

二.思路分析:

   (1)实现了1,2以及是否有乘除法、数值范围、加减有无负数、除法有无余数、打印中每行的间隔可调整等控制参数;

   (2)用srand((unsigned)time(NULL));函数题目避免重复;

 (3)利用for循环输出控制数目;

 (4)用户可以输入数字来选择打印方式,输入的数字代表列数;

编译环境:vs2013

三.源代码:

// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}

#include<iostream>
using namespace std;
#include<stdlib.h>
#include<time.h>

int main(int argc,char *argv[])
{
    srand((unsigned)time(NULL));
    int i, j;
    int judge;
    int ph[20]; //建立数组存放输入选择
    int Pway, num1, num2; //打印方式
    do
    {
        printf("###################四则运算出题系统######################\n");
        printf(" 欢迎使用本系统,请按要求依次输入以下控制条件\n题目数量(tip:请输入正整数):");
        scanf_s("%d", &ph[0],1); //a[0]存放打印的题目数量
        printf("打印方式(tip:请输入正整数表示列数):");
        scanf_s("%d", &ph[1],1); //a[1]输入的列数
        printf("否有乘除法(tip:请输入数字0或者1选择,0表示无乘除法/1表示有乘除法):");
        scanf_s("%d", &ph[2],1); //a[2]有无乘除法
        printf("数值范围(tip:请输入一个正整数,如99表示数值范围为0~99):");
        scanf_s("%d", &ph[3],1);
        printf("负数(tip:请输入数字0或者1选择,0表示无负数/1表示有负数):");
        scanf_s("%d", &ph[4],1);
        printf("每行间隔数(tip:输入自然数控制每行间隔):");
        scanf_s("%d", &ph[6],1);
        if (ph[2] == 1)
        {
            printf("除法运算题的结果中能否有余数出现(tip:请输入数字0或者1选择,0表示无余数/1表示有余数):");
            scanf_s("%d", &ph[5],1);
        }
        for (i = 0; i<ph[0]; i++)
        {
            num1 = rand() % (ph[3] + 1);
            num2 = rand() % (ph[3] + 1);
            switch (ph[2])
            {
                case 0: //选择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) 
                                {
                                    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) 
                            {
                                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) 
                        {
                            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) 
                                {
                                    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) 
                            {
                                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) 
                        {
                            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) 
                                {
                                    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) 
                                {
                                    for (j = 0; j<ph[6]; j++)
                                    {
                                        printf("\n");
                                    }
                                }
                            }
                        }
                    }
                    break;
                    default:
                    printf("出错了!\n");
                    break;
                }
                break;
                default:
                printf("出错了!\n");
                break;
            }
        }
        printf("\n");
        printf("需要继续出题吗?(tip:输入1或0,1表示继续/0表示退出)");
        scanf_s("%d", &judge,1);
    } 
    while(judge==1);
    printf("\n################欢迎下次使用,再见!####################\n\n");
    system("pause");
    return 0;
}

 

四.结果截图:

 

输入1继续出题,输入0退出系统

 

 

 

五.实验总结:

   (1)srand(time(NULL))编译时出错,改为了srand((unsigned)time(NULL));

   (2)scanf改为scanf_s;

   (3)#include"stdafx.h"编译时出现错误,经过多次修改终于通过;

   (4)总的来说,出现了许多问题,收获很大。

六.PSP0过程文档 :

 周活动总结表

姓名:孔维春                                       日期:2015.3.15

日期       任务

听课

编写程序

阅读课本

准备考试

 

 

日总计

周日

 

 

 

 

 

 

 

周一

 

 

 

 

 

 

 

周二

 100

 30

 10

 

 

 

 140

周三

 

 20

 

 

 

 

20

周四

 

20

 15

 

 

 

35

周五

 100

 25

 15

 

 

 

 140

周六

 

 

 35

 

 

 

 35

周总结

 200

 95

 75

 

 

 

 375

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

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

总计

 200

 201

 45

 

 

 

 446

平均

 200

 201

 45

 

 

 

 446

最大

 200

 201

 45

 

 

 

 446

最小

 200

 201

 45

 

 

 

 446

以前各周的累计时间                                                                                    

总计

 200

 201

  45

 

 

 

 446

平均

 200

 201

  45

 

 

 

 446

最大

 200

 201

  45

 

 

 

 446

最小

 200

 201

  45

 

 

 

 446

二、时间记录表:

学生        孔维春                                             日期   2015315日 

教师        王建民                                             课程           PSP       

日期

开始时间

结束时间

中断时间

净时间

活动

备注

 3.10

 20:00

 21:00

 

60

编程序 

作业 

 3.11

19:00

21:00

 

 120

 编程序

作业

 3.12

19:10

20:00

50

编程序

作业

3.13

15:00

16:00

60

编程序

作业

 3.14

 10:10

10:40

 

30

完善程序

 作业

 3.15

 10:00

 14:00

 无

 240

完善程序

 作业

 

三、缺陷记录日志:

学生     孔维春       

日期     2015315日 

教员       王建民   

程序号      2          

日期

编号

类型

引入阶段

排除阶段

修复时间

修复缺陷

 3.10

 1

 a2

编译

编译

1min

 

 在输入scanf中,漏掉了一处地址符号&

 3.10

 2

a3

运行

 运行

10min

 

 jurge == 1漏写了一个=

 3.10

 3

B1

运行

运行之后

5min

 

 列行比较乱

 3.12

4

a1

编译

编译

1min

 

漏掉一个}

3.13

5

B2

运行

运行之后

45min

 

没有按要求输入控制条件时无反应

posted @ 2015-03-15 15:05  骑拉帝亚  阅读(186)  评论(1编辑  收藏  举报