一、问题描述:
要求:
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表示输入“是” "); 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= ",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) //ph[6]表示每行间隔的数量 { 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) //ph[6]表示每行间隔的数量 { 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) //ph[6]表示每行间隔的数量 { 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) //ph[6]表示每行间隔的数量 { 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) //ph[6]表示每行间隔的数量 { 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) //ph[6]表示每行间隔的数量 { 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) //ph[6]表示每行间隔的数量 { 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) //ph[6]表示每行间隔的数量 { for(j = 0;j<ph[6];j++) { printf(" "); } } } } } break; default: printf("出错! "); break; } break; default: printf("出错! "); break; } } printf(" "); 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 |
二、时间记录表:
学生 田永涛 日期 2015年3月13日
教师 王建民 课程 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 |
完善程序 |
作业 |
|
|
|
|
|
|
|
三、缺陷记录日志:
学生 田永涛
日期 2015年3月13日
教员 王建民
程序号
日期 |
编号 |
类型 |
引入阶段 |
排除阶段 |
修复时间 |
修复缺陷 |
|||||
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语句插入的位置不正确 |