zoukankan      html  css  js  c++  java
  • 软件工程第一次作业 出题程序

      一、功能介绍

      程序采用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.由于设计原因没有办法实现带余数的除法运算

  • 相关阅读:
    DOS命令行
    很好的GDAL初学者资料
    VC++工程文件
    C#操作word文档
    vue 如何不复用组件的 DOM All In One
    2021 最新 XBOX 打丧尸游戏 All In One
    gti gc All In One
    custom height drawer All In One
    Redux & React Hooks All In One
    StackOverflow sites All In One
  • 原文地址:https://www.cnblogs.com/wangtianning1223/p/5256260.html
Copyright © 2011-2022 走看看