第二次结对编程—四则运算自动生成程序

一、题目要求

我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:

  • 能够自动生成四则运算练习题
  • 可以定制题目数量
  • 用户可以选择运算符
  • 用户设置最大数(如十以内、百以内等)
  • 用户选择是否有括号、是否有小数
  • 用户选择输出方式(如输出到文件、打印机等)
  • 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)

二、任务分配

驾驶员:王旭
领航员:张昊辰
驾驶员负责写代码,浏览文件,还有基础实现方法。
领航员则着眼更长远的考虑并且检查错误。进行代码测试和检查错误。

三、代码分析

代码一共分为三个主要模块:
Subject_Manu主要实现程序主菜单操作的实现;
Subject_Output_Screen主要实现四则运算式的生成;
Evaluate主要用于实现四则运算式的计算功能。
代码地址:点我
主菜单的实现

void Subject_Manu()
{
	printf("本程序中输入“1”为是,“0”为否\n\n");
	printf("请输入所生成题的数目:\n");
	scanf("%d",&problem_num);
	printf("请输入运算符号:(“0”为加减运算,“1”为乘除运算,“2”为混合运算)\n");
	scanf("%d",&problem_operate);
	printf("请输入所生成数的范围:\n");
	printf("下界:");
	scanf("%d",&number_min);
	printf("上界:");
	scanf("%d",&number_max);
	printf("请输入是否包含小数:(“1”or“0”)\n");
	scanf("%d",&if_decimal);
	printf("请输入是否包含小括号:(“1”or“0”)\n");
	scanf("%d",&if_bracket);
	printf("请输入是否输入到文件:(“1”or“0”)\n");
	scanf("%d",&if_file);
	Subject_Control();
}

四则运式的生成

void Subject_Output_Screen()
{
	printf("题目列表:\n");
	for (int i = 0; i < problem_num; ++i) {
		int id = 0;
		int num;
		int num_opera;
		int N = rand() % 4 + 2;
		bool f = true, flag = true;
		double number;
		printf("(%d)", i + 1);
		if (if_file) {
			fprintf(file, "(%d)  ", i + 1);
		}
		for (int j = 0; j < N; ++j) {
			if (rand() % 2 && N > 2 && flag && if_bracket) {
				printf("(");
				if (if_file) fprintf(file, "(");
				flag = false;
				id = j;
				//str += "(";
			}
			num = (rand() % abs(number_max - number_min)) + number_min;
			number = num + (double)(rand() % 100) / 100;
			num_opera = rand() % problem_operate;
			if (back_operate == 2) {
				num_opera += 2;
			}
			//不是小数
			if (!if_decimal) {
				//str += to_string(num);
				printf("%d", num);
			}
			//是小数
			else {
				//str += to_string(number);
				printf("%.2f", number);
			}
			//输出文件
			if (if_file) {
				if (!if_decimal) {
					fprintf(file, "%d", num);
				}
				else {
					fprintf(file, "%.2f", number);
				}
			}
			if (id != j && rand() % 2 && !flag && f) {
				printf(")");
				if (if_file) fprintf(file, ")");
				f = false;
				//str += ")";
			}
			//str += subject_operator[num_opera];
			printf("%s", subject_operator[num_opera]);
			if (if_file) {
				fprintf(file, "%s", subject_operator[num_opera]);
			}
		}

		num = (rand() % (number_max - number_min)) + number_min;
		number = num + (double)(rand() % 100) / 100;

		if (!if_decimal) {
			//str += to_string(num);
			printf("%d", num);
			if (if_file) {
				fprintf(file, "%d", num);
			}
		}
		else {
			//str += to_string(number);
			printf("%.2f", number);
			if (if_file) {
				fprintf(file, "%.2f", number);
			}
		}
		if (f && !flag) {
			printf(")");
			if (if_file)fprintf(file, ")");
			//str += ")";
		}
		printf("=\n");
		if (if_file) {
			fprintf(file, "=\n");
		}
	}
	if (if_file) {
		printf("\nquestion.txt文件生成成功啦!\n\n");
	}
	fclose(file);
}

四、运行结果

选择的条件是带括号和小数的四则混合运算,并生成文件,下面是代码运行结果图:

图形界面运行结果图:

所生成文件的结果图:

从结果中可以看到代码中还是有着不完美的地方,有着一些BUG,比如生成的计算式不是特别合理,小括号的位置过于随机,这些都是不完善的地方。

五、总结

对队友评价

这次我们这个项目的的领航员是张昊辰同学。在选择完作业的题目时,我们对这次作业进行了任务和角色的分配,我是驾驶员,他是领航员。之后我们一起设计了程序的思路,部分功能的实现。他在这些设计工作中起到了重要的作用,拓宽了我的编程思路,使得代码更加完善。在我编程中,张昊辰同学能够对我进行很好的监督并给予帮助,遇到问题时,能够和我讨论出现的问题,使得我们工作效率有了提高。在我完成编程工作后,他也进行结果的检查,认真的进行了单元测试。

对自己总结

总体上,这次结对编程把作业要求的基本功能都实现了,并用MFC实现了简单的图形化界面,但是由于自己和队友之前没有接触过GUI,由于时间分配等问题导致没能把图形界面实现的更加完美。在这次结对编程中我主要负责代码功能及图形界面的实现,这也促进了自己编程能力的进步。领航员张昊辰也起到了至关重要的作用。从最开始的设计,之后的编程工作,以及最后的测试,如果没有他的帮助,我自己一个人是不容易很好的完成这些工作的。

附上一张和队友的工作照

posted @ 2019-05-04 00:17  Aky什么都不会  阅读(347)  评论(0编辑  收藏  举报