软件工程第一次作业 出题程序
一、功能介绍
程序采用c语言编写,大概用了三小时吧,很久没用c写东西了
实现功能:
1.每次出30道题,并给出答案
2.四则运算(结果不会出现负数,除法全部可以整除)
3.真分数四则运算(结果全为最简形式)
二、完成效果
1.开始界面
2.四则运算出题
3.显示答案
4.真分数四则运算
5.显示答案
三、编写过程
程序的两大功能就是四则运算和真分数的四则运算,所以在主函数设计if分支,按照选择使用不同的功能。
这两个主要部分都是通过生成一个0-3的随机数来控制出的题是加法还是减法还是乘除法,然后用for循环完成30道题的生成。
1.四则运算的编写
生成两个随机的运算数,值控制在10以内。
如果加法就直接加,然后将结果存放在数组answer[30]里面。
如果是减法,要比较两个随机数的大小,避免被减数小于减数而产生负数,如果被减数小于减数,则将两数位置调换,再将结果存放在数组中。
如果是乘法就直接乘,结果存放在数组中。
除法先用随机数生成结果和除数,然后相乘求出被除数,这样可以保证除法答案全是整数。
最后用for循环打印答案。
2.真分数运算的编写
生成四个随机的运算数,值控制在10以内,分别作为两个运算数的分子和分母。
用于保存结果的数组也有一个变为两个,分别存放结果的分子和分母,这样设计方便将分数化成最简形式。
如果是加法,按照最小公倍数通分,然后存放结果。
如果是减法,先求出结果,判断正负,如果为负数则调换两数顺序,然后将结果(负数)取反并保存。
如果是乘法,现将分子相乘,分母相乘,然后求出分子分母的最大公约数化成最简。
如果是除法,将被除数分子分母调换位置,按照乘法方法计算。
最后用for循环打印答案。
四、完整代码
#include<stdio.h> #include<stdlib.h> #include<windows.h> void Function1(); void Function2(); int maxg(int a, int b); int main(void) { int choose; printf("欢迎使用!\n\n请选择以下操作:\n\n"); printf("1.整数四则运算\n\n2.真分数运算\n\n"); printf("输入对应选项数字,按回车确认\n"); //system("pause"); scanf("%d",&choose); if (choose == 1) Function1();//四则运算 else if (choose == 2) Function2();//真分数运算 else printf("非法输入!"); return 0; } void Function1() { int i ; int answer[30], a, b, c,d; for (i = 0; i < 30; i++) { a = (int)rand() % 4; if (a == 0)//加法 { b = (int)rand() % 10; c = (int)rand() % 10; printf("第%d题 %d+%d= \n",i+1,b,c); answer[i] = b + c; } else if (a == 1)//减法 { b = (int)rand() % 10; c = (int)rand() % 10; if (c > b)//避免出现负数 { d = b; b = c; c = d; } printf("第%d题 %d-%d= \n", i + 1, b, c); answer[i] = b - c; } else if (a == 2)//乘法 { b = (int)rand() % 10; c = (int)rand() % 10; printf("第%d题 %dX%d= \n", i + 1, b, c); answer[i] = b * c; } else if (a == 3)//除法 { b = (int)rand() % 10; c = (int)rand() % 10; d = b*c;//保证结果都是整数 printf("第%d题 %d÷%d= \n", i + 1, d, c); answer[i] = b; } } system("pause");//按任意键显示答案 printf("\n"); for (i = 0; i < 30; i++) { printf("第%d题 %d\n", i + 1, answer[i]); } system("pause"); } void Function2() { int fenzi[30],fenmu[30]; int a, b, c, d, e, i; for (i = 0; i < 30; i++) { a = (int)rand() % 4; if (a == 0) { b = ((int)rand() % 9) + 1;//避免分母出现0 c = ((int)rand() % 9) + 1; d = ((int)rand() % 9) + 1; e = ((int)rand() % 9) + 1; printf("第%d题 (%d/%d)+(%d/%d)= \n", i + 1, b, c,d,e);//按最小公倍数化简 fenmu[i] =c*e/maxg(c,e) ; fenzi[i] = fenmu[i] / c*b + fenmu[i] / e*d; } else if (a == 1) { b = ((int)rand() % 9) + 1; c = ((int)rand() % 9) + 1; d = ((int)rand() % 9) + 1; e = ((int)rand() % 9) + 1; fenmu[i] = c*e / maxg(c, e);//按最小公倍数化简 fenzi[i] = fenmu[i] / c*b - fenmu[i] / e*d; if (fenzi[i] < 0)//如果出现负数,将减数与被减数调换 { fenzi[i] = 0 - fenzi[i];//保证结果为正数 printf("第%d题 (%d/%d)-(%d/%d)= \n", i + 1, d, e, b, c); } printf("第%d题 (%d/%d)-(%d/%d)= \n", i + 1, b, c, d, e); } else if (a == 2) { b = ((int)rand() % 9) + 1; c = ((int)rand() % 9) + 1; d = ((int)rand() % 9) + 1; e = ((int)rand() % 9) + 1; printf("第%d题 (%d/%d)X(%d/%d)= \n", i + 1, b, c, d, e); fenzi[i] = b*d; fenmu[i] = c*e; fenzi[i] = fenzi[i] / maxg(fenzi[i], fenmu[i]);//通分后分子分母除以最大公约数 fenmu[i] = fenmu[i] / maxg(fenzi[i], fenmu[i]); } else if (a == 3) { b = ((int)rand() % 9) + 1; c = ((int)rand() % 9) + 1; d = ((int)rand() % 9) + 1; e = ((int)rand() % 9) + 1; printf("第%d题 (%d/%d)÷(%d/%d)= \n", i + 1, b, c, d, e); fenzi[i] = b*e; fenmu[i] = c*d; fenzi[i] = fenzi[i] / maxg(fenzi[i], fenmu[i]); //通分后分子分母除以最大公约数 fenmu[i] = fenmu[i] / maxg(fenzi[i], fenmu[i]); } } system("pause");//按任意键显示答案 printf("\n"); for (i = 0; i < 30; i++) { if (fenzi[i]==0) printf("第%d题 %d\n", i + 1, fenzi[i]);//如果分子为0,直接将0作为结果打印 else printf("第%d题 %d/%d\n", i + 1, fenzi[i],fenmu[i]); } system("pause"); } int maxg(int a, int b)//最大公约数 { int c, d; if (a < b) { c = a; a = b; b = c; } d = a%b; if (d == 0) return b; else maxg(b, d); }
五、存在问题
1.运算数是随机生成的,所以会有极小的几率出现重复的题,这个问题没有解决。
2.由于设计原因没有办法实现带余数的除法运算