一.要求:
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("###################四则运算出题系统###################### "); printf(" 欢迎使用本系统,请按要求依次输入以下控制条件 题目数量(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= ", i + 1, num1, num2); if ((i + 1) % ph[1] == 0) { printf(" "); if (ph[6] != 0) //ph[6]每行间隔的数量 { for (j = 0; j<ph[6]; j++) { printf(" "); } } } } else { if (ph[4] == 0) //若不允许出现负数 { if (num1<num2) //比较被减数减数的大小 { i = i - 1; } else { printf("<%d>%d-%d= ", i + 1, num1, num2); if ((i + 1) % ph[1] == 0) //判断是否换行 { printf(" "); if (ph[6] != 0) { for (j = 0; j<ph[6]; j++) { printf(" "); } } } } } else //若可以有负数 { printf("<%d>%d-%d= ", i + 1, num1, num2); if ((i + 1) % ph[1] == 0) { printf(" "); if (ph[6] != 0) { for (j = 0; j<ph[6]; j++) { printf(" "); } } } } } break; case 1: //有乘除法 Pway = rand() % 4; switch (Pway) { case 0: //加法 printf("<%d>%d+%d= ", i + 1, num1, num2); if ((i + 1) % ph[1] == 0) { printf(" "); if (ph[6] != 0) { for (j = 0; j<ph[6]; j++) { printf(" "); } } } break; case 1: if (ph[4] == 0) { if (num1<num2) //比较减数被减数 { i = i - 1; } else { printf("<%d>%d-%d= ", i + 1, num1, num2); if ((i + 1) % ph[1] == 0) { printf(" "); if (ph[6] != 0) { for (j = 0; j<ph[6]; j++) { printf(" "); } } } } } else { printf("<%d>%d-%d= ", i + 1, num1, num2); if ((i + 1) % ph[1] == 0) { printf(" "); if (ph[6] != 0) { for (j = 0; j<ph[6]; j++) { printf(" "); } } } } break; case 2: //乘法 printf("<%d>%d×%d= ", i + 1, num1, num2); if ((i + 1) % ph[1] == 0) { printf(" "); if (ph[6] != 0) { for (j = 0; j<ph[6]; j++) { printf(" "); } } } break; case 3: //除法 if (num2 == 0) //除数不为零 { i = i - 1; } else { if (ph[5] == 1) //判断选择余数 { printf("<%d>%d÷%d= ", i + 1, num1, num2); if ((i + 1) % ph[1] == 0) { printf(" "); if (ph[6] != 0) { for (j = 0; j<ph[6]; j++) { printf(" "); } } } } else //无余数情况下 if (num1%num2 != 0) { i = i - 1; } else { printf("<%d>%d÷%d= ", i + 1, num1, num2); if ((i + 1) % ph[1] == 0) { printf(" "); if (ph[6] != 0) { for (j = 0; j<ph[6]; j++) { printf(" "); } } } } } break; default: printf("出错了! "); break; } break; default: printf("出错了! "); break; } } printf(" "); printf("需要继续出题吗?(tip:输入1或0,1表示继续/0表示退出)"); scanf_s("%d", &judge,1); } while(judge==1); printf(" ################欢迎下次使用,再见!#################### "); 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 |
二、时间记录表:
学生 孔维春 日期 2015年3月15日
教师 王建民 课程 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 |
完善程序 |
作业 |
三、缺陷记录日志:
学生 孔维春
日期 2015年3月15日
教员 王建民
程序号 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 |
|
没有按要求输入控制条件时无反应 |