深圳大学-电信院-C程序设计实验-函数综合编程

实验目的

一、 学习和掌握C 语言函数的定义与调用;
二、 进一步掌握随机数、选择结构、循环控制、交互式输入输出等程序设计方法;
三、 进一步掌握C 语言中的数组定义和引用方法;
四、 学习和掌握根据流程图进行模块化程序设计的思想。

实验内容

给学龄前儿童编写一个100 以内的四则运算游戏,程序的具体要求如下:

1) 定义一个函数randN1N2(int rN1, int rN2 )。该函数有两个整型的输入参数rN1 和 rN2,其中,rN1 <= rN2。该函数的功能是生成rN1 到 rN2 之间均匀分布的随机整数,该函数的返回值类型是整型。每调用一次该函数,函数返回一个rN1 至 rN2 之间的随机整数(随机数产生方法参考实验七);
提示:生成rN1 到 rN2之间的随机数方法为:rand()%(rN2-rN1+1)+rN1

2) 定义函数char randOperator( ),该函数没有输入参数,功能是随机返回 ’+’、 ’-’、 ’’、 ’/’ 这四个字符的其中一个。要求在该函数内部调用上述randN1N2( )函数来实现。
提示:先用n=randN1N2(1,4)产生一个1到4之间的随机数n, 根据n的值返回四个字符中的一个。若n为1,返回’+’; n为2,返回’-’; n为3,返回’
’; n为4,返回’/’。
3) 定义一个函数randLmt100( )。该函数没有输入参数,函数的返回类型是整型。该函数内部调用上述函数randN1N2。每调用一次函数randLmt100( ),返回一个0-99 之间的随机整数。

4) 定义一个函数addLmt100(int num1, int num2)。该函数有两个整型的输入参数num1 和 num2;函数返回值类型为整型。该函数的功能是:在屏幕上列出一个算式num1 + num2 =,然后接受一个键盘输入的计算答案answer。若结果正确,则屏幕输出一句赞扬的语句,然后返回函数值1;若结果错误,则屏幕输出一句鼓励的语句,并输出正确答案,然后返回函数值0。

5) 定义一个函数subLmt100(int num1, int num2)。该函数有两个整型输入参数num1 和 num2;函数返回值类型为整型。该函数的功能是:在屏幕上列出一个算式 numM1 - numM2 =,其中:numM1 是num1 和 num2 中较大的一个数,numM2 是num1 和 num2 中较小的一个数;然后接受一个键盘输入的计算答案answer。若结果正确,则屏幕输出一句赞扬的语句,然后返回函数值1;若结果错误,则屏幕输出一句鼓励的语句,并输出正确答案,然后返回函数值0。

6) 定义一个函数mulLmt100(int num1, int num2)。该函数有两个整型输入参数num1 和 num2;函数返回值类型为整型。该函数的功能是:在屏幕上列出一个算式num1 × num2 =,然后接受一个键盘输入的计算答案answer。若结果正确,则屏幕输出一句赞扬的语句,然后返回函数值1;若结果错误,则屏幕输出一句鼓励的语句,并输出正确答案,然后返回函数值0。

7) 定义一个函数divLmt100(int num1, int num2)。该函数有两个整型输入参数num1 和 num2;函数返回值类型为整型。该函数的功能是:首先判定num1是否为0, 以及num2 是否可以被num1整除,若num1为0或者num2 不能被num1整除,则调用randLmt100( )函数重新生成两个新的num1 和 num2,然后再重新判断,直到num1不为0且num2能被num1整除为止;在num2 能被num1整除的情况下,在屏幕上列出一个算式num2 ÷ num1 =,然后接受一个键盘输入的计算答案answer。若结果正确,则屏幕输出一句赞扬的语句,然后返回函数值1;若结果错误,则屏幕输出一句鼓励的语句,并输出正确答案,然后返回函数值0。

8) 主函数的功能如下:在主函数中调用上面定义的五个函数,在屏幕上随机循环出一道100 以内的四则运算题。其中,定义一个整型数组proNum[4] 和整型数组ansNum[4],这两个数组中分别存储在上述游戏循环过程中加、减、乘、除四种类型的题出现的次数,以及这四种类型的题被答对的次数。在用户不想继续游戏退出时,在屏幕上显示本次游戏中的加、减、乘、除四种类型题出现的数量,以及每一种题被答对的次数。主程序可参照附录A给出的参考流程图编写。

注:流程图中proNum[0]、proNum[1]、proNum[2]、proNum[3]分别用于统计加、减、乘、除运算的次数,而ansNum[0]、ansNum[1]、ansNum[2]、ansNum[3]分别用于统计加、减、乘、除运算中答对的次数。

附图:主程序的参考流程图(见下一页):
在这里插入图片描述

实验代码

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int randN1N2(int rN1, int rN2)
{
    return rand() % (rN2 - rN1 + 1) + rN1;
}
char randOperator()
{
    int a = randN1N2(1, 4);
    if (a == 1)
        return '+';
    if (a == 2)
        return '-';
    if (a == 3)
        return '*';
    if (a == 4)
        return '/';
}
int randLmt100()
{
    return randN1N2(0, 99);
}
int addLmt100(int num1, int num2)
{
    int answer;
    printf("%d+%d=", num1, num2);
    scanf("%d", &answer);
    if (num1 + num2 == answer)
    {
        printf("你厉害,我给你大拇哥!\n");
        return 1;
    }
    else
    {
        printf("真的是太逊啦,继续加油吧!\n");
        printf("正确答案是:%d\n", num1 + num2);
        return 0;
    }
}
int subLmt100(int num1, int num2)
{
    int answer;
    int max = (num1 > num2 ? num1 : num2);
    printf("%d-%d=", max, num2 + num1 - max);
    scanf("%d", &answer);
    if (2 * max - num1 - num2 == answer)
    {
        printf("你厉害,我给你大拇哥!\n");
        return 1;
    }
    else
    {
        printf("真的是太逊啦,继续加油吧!\n");
        printf("正确答案是:%d\n", 2 * max - num1 - num2);
        return 0;
    }
}
int mulLmt100(int num1, int num2)
{
    int answer;
    printf("%d*%d=", num1, num2);
    scanf("%d", &answer);
    if (num1 * num2 == answer)
    {
        printf("你厉害,我给你大拇哥!\n");
        return 1;
    }
    else
    {
        printf("真的是太逊啦,继续加油吧!\n");
        printf("正确答案是:%d\n", num1 * num2);
        return 0;
    }
}
int divLmt100(int num1, int num2)
{
    while (num1 == 0 || num2 % num1 != 0 || num1 > num2)
    {
        num1 = randLmt100();
        num2 = randLmt100();
    }
    int answer;
    printf("%d/%d=", num2, num1);
    scanf("%d", &answer);
    if (num2 / num1 == answer)
    {
        printf("你厉害,我给你大拇哥!\n");
        return 1;
    }
    else
    {
        printf("真的是太逊啦,继续加油吧!\n");
        printf("正确答案是:%d\n", num2 / num1);
        return 0;
    }
}
int main()
{
    int probNum[4] = {0};
    int ansNum[4] = {0};
    int sFlag = 1;
    srand((unsigned int)time(NULL));
    while (1)
    {
        char oper, c;
        int num1, num2;
        oper = randOperator();
        num1 = randLmt100();
        num2 = randLmt100();
        if (oper == '+')
        {
            probNum[0]++;
            ansNum[0] += addLmt100(num1, num2);
        }
        if (oper == '-')
        {
            probNum[1]++;
            ansNum[1] += subLmt100(num1, num2);
        }
        if (oper == '*')
        {
            probNum[2]++;
            ansNum[2] += mulLmt100(num1, num2);
        }
        if (oper == '/')
        {
            probNum[3]++;
            ansNum[3] += divLmt100(num1, num2);
        }
        printf("若继续玩,直接打回车:\n");
        printf("若不想继续,键盘输入字母'N'或'n'后打回车\n\n\n");
        rewind(stdin);
        c = getchar();
        if (c == 'N' || c == 'n')
        {
            sFlag = 0;
            break;
        }
    }
    printf("出现加法类型的题目有%d次\n", probNum[0]);
    printf("加法类型的题目答对次数为:%d\n", ansNum[0]);
    printf("出现减法类型的题目有%d次\n", probNum[1]);
    printf("减法类型的题目答对次数为:%d\n", ansNum[1]);
    printf("出现乘法类型的题目有%d次\n", probNum[2]);
    printf("乘法类型的题目答对次数为:%d\n", ansNum[2]);
    printf("出现除法类型的题目有%d次\n", probNum[3]);
    printf("除法类型的题目答对次数为:%d", ansNum[3]);
    return 0;
}

实验结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值