软件工程第一次作业 出题程序

  一、功能介绍

  程序采用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("欢迎使用!

请选择以下操作:

");
    printf("1.整数四则运算

2.真分数运算

");
    printf("输入对应选项数字,按回车确认
");
    //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= 
",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= 
", i + 1, b, c);
            answer[i] = b - c;
        }
        else
        if (a == 2)//乘法
        {
            b = (int)rand() % 10;
            c = (int)rand() % 10;
            printf("第%d题 %dX%d= 
", 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= 
", i + 1, d, c);
            answer[i] = b;
        }
    }
    system("pause");//按任意键显示答案
    printf("
");
    for (i = 0; i < 30; i++)
    {
        printf("第%d题  %d
", 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)= 
", 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)= 
", i + 1, d, e, b, c);
            }
            printf("第%d题 (%d/%d)-(%d/%d)= 
", 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)= 
", 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)= 
", 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("
");
    for (i = 0; i < 30; i++)
    {
        if (fenzi[i]==0)
            printf("第%d题  %d
", i + 1, fenzi[i]);//如果分子为0,直接将0作为结果打印
        else
            printf("第%d题  %d/%d
", 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.由于设计原因没有办法实现带余数的除法运算

原文地址:https://www.cnblogs.com/wangtianning1223/p/5256260.html