一、问题描述:
要求:
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 |
二、时间记录表:
学生 田永涛 日期 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语句插入的位置不正确 |