七天学会C语言-第五天(函数)

2023-09-20 17:54:55

在这里插入图片描述

1. 调用有参函数

有参函数是一种接受输入参数(参数值)并执行特定操作的函数。通过向函数传递参数,你可以将数据传递给函数,让函数处理这些数据并返回结果。

例1:编写一程序,要求用户输入4 个数字,输出前两个数中的最大数、后两个数中的最大数以及四个数中的最大数。

#include <stdio.h>

double max(double x, double y);

int main() {
    double a[4];
    int i;

    for (i = 0; i < 4; i++) {
        if (scanf("%lf", &a[i]) != 1) {
            printf("输入不合法,请输入一个有效的数字。\n");
            return 1;  // 退出程序,返回错误代码
        }
    }

    double t = max(a[0], a[1]);
    double u = max(a[2], a[3]);
    double v = max(t, u);

    printf("前两个数中的最大数为%.2lf\n", t);
    printf("后两个数中的最大数为%.2lf\n", u);
    printf("四个数中的最大数为%.2lf\n", v);

    return 0;
}

double max(double x, double y) {
    return (x > y ? x : y);
}

运行结果:
在这里插入图片描述

例 2:有两个小组,分别有5名学生和10名学生。请编程输入这些学生的成绩,并调用一个 average 函数求这两个小组的平均分。

#include <stdio.h>

float average(float a[], int n);

int main() {
    float zu1[5], zu2[10];
    int i;

   
    for (i = 0; i < 5; i++) {
        if (scanf("%f", &zu1[i]) != 1) {
            printf("输入不合法,请输入一个有效的数字。\n");
            return 1;  // 退出程序,返回错误代码
        }
    }

    
    for (i = 0; i < 10; i++) {
        if (scanf("%f", &zu2[i]) != 1) {
            printf("输入不合法,请输入一个有效的数字。\n");
            return 1;  // 退出程序,返回错误代码
        }
    }

    printf("第 1 组平均分是%.2f\n", average(zu1, 5));
    printf("第 2 组平均分是%.2f\n", average(zu2, 10));

    return 0;
}

float average(float a[], int n) {
    float sum = 0.0, average;
    int i;
    for (i = 0; i < n; i++) {
        sum += a[i];
    }
    average = sum / n;
    return average;
}

运行结果:
在这里插入图片描述

2. 调用无参函数

无参函数是一种不需要接受任何输入参数的函数。它们通常用于执行一些固定的任务或打印消息,而不依赖于外部数据。

1:请编程输出以下内容:
123456
小翟是大帅逼
654321
小翟是大帅逼
654321
小翟是大帅逼
#include<stdio.h>

void a();
void b();
void c();

int main() {
    a();
    b();
    c();
    b();
    c();
    b();
    return 0;
}
void a() {
    printf("123456\n");
}
void b() {
    printf("小翟是大帅逼\n");
}
void c() {
    printf("654321\n");
}

运行结果:在这里插入图片描述

例 2:请编程输入 10 个整数,并将这 10 个数由小到大排序。

#include<stdio.h>

void paixu(int a[], int n); // 修正参数列表

int main() {
    int a[10], i;
    printf("请输入 10 个整数:\n");
    for (i = 0; i < 10; i++)
        scanf("%d", &a[i]);
    
    paixu(a, 10);
    
    printf("排序后的整数依次是:\n");
    for (i = 0; i < 10; i++)
        printf("%d\t", a[i]);
    printf("\n");
    
    return 0;
}

void paixu(int a[], int n) {
    int i, j, t;
    for (i = 0; i < n - 1; i++)
        for (j = i + 1; j < n; j++)
            if (a[i] > a[j]) {
                t = a[i];
                a[i] = a[j];
                a[j] = t;
            }
}

运行结果:
在这里插入图片描述

3. 函数的嵌套

函数的嵌套是指在一个函数内部调用另一个函数。这允许你将程序分解成更小的、可管理的部分。嵌套函数通常有助于提高代码的可读性和可维护性。

例 1:请编程输入 4 个整数,并找出其中最大的数。

#include <stdio.h>

int max4(int a, int b, int c, int d);
int max2(int a, int b);

int main()
{
    int a, b, c, d, zuidashu;
    scanf("%d %d %d %d", &a, &b, &c, &d);

    zuidashu = max4(a, b, c, d);
    printf("最大数为%d\n", zuidashu);
    return 0;
}

int max4(int a, int b, int c, int d)
{
    int max2(int a, int b);
    return (max2(max2(max2(a, b), c), d));
}

int max2(int a, int b)
{
    return (a > b ? a : b);
}

运行结果:
在这里插入图片描述

4. 函数的递归

递归是一种函数调用自身的过程。递归函数通常包括两个部分:基本情况和递归情况。基本情况是一个停止条件,它指定何时结束递归。递归情况则定义了函数如何继续调用自身以解决更小的子问题。递归在解决需要重复分解的问题时非常有用,如计算阶乘或斐波那契数列等。

例1:有5个学生,第5个学生比第4个学生大2岁,第4个学生比第3个学生大2岁,第3个学生比第2个学生大2岁,第2个学生比第1个学生大2岁,第1个学生是10岁。请编程计算出第5个学生的年龄。

#include <stdio.h>

int calculateAge(int studentNumber);

int main() {
    int ageOfFifthStudent = calculateAge(5);
    printf("第5个学生的年龄:%d岁\n", ageOfFifthStudent);
    return 0;
}

int calculateAge(int studentNumber) {
    if (studentNumber == 1) {
        return 10; // 第1个学生是10岁
    } else {
        // 递归计算年龄,每个学生比前一个学生大2岁
        return calculateAge(studentNumber - 1) + 2;
    }
}


运行结果:
在这里插入图片描述

例 2:用递归方法求 n!(注意取值范围)

#include <stdio.h>

int factorial(int n);

int main()
{
    int num;
    printf("Please enter an integer: ");
    scanf("%d", &num);

    printf("%d! = %d\n", num, factorial(num));
    return 0;
}

int factorial(int n)
{
    int result;
    if (n < 0)
        printf("n < 0, incorrect input!\n");
    else if (n == 0 || n == 1)
        result = 1;
    else
        result = factorial(n - 1) * n;

    return result;
}

运行结果:
在这里插入图片描述

更多推荐

第二章 进程与线程 十二、进程同步与进程互斥

目录一、进程同步1、定义二、进程互斥1、定义2、四个部分3、原则一、进程同步1、定义进程同步是指在多个进程之间协调执行顺序的一种机制,使得进程按照一定的顺序执行,以避免出现不一致的情况。常见的实现方式有信号量、管程、屏障等。二、进程互斥1、定义进程互斥是指在多个进程之间共享资源时,为了避免多个进程同时访问该资源而出现冲

利用亚马逊 云服务器 EC2 和S3免费套餐搭建私人网盘

网盘是一种在线存储服务,提供文件存储,访问,备份,贡献等功能,是我们日常中不可或缺的一种服务。很多互联网公司都为个人和企业提供免费的网盘服务。但这些免费服务都有一些限制,比如限制下载速度,限制文件大小,不能多人同时管理,不能实现一些定制化功能。如果想取消这些限制,就要付费。现在我给大家介绍一种免费,且功能无限制的私人网

ActiveMQ、RabbitMQ、RocketMQ、Kafka区别

一、消息中间件的使用场景消息中间件的使用场景总结就是六个字:解耦、异步、削峰1.解耦如果我方系统A要与三方B系统进行数据对接,推送系统人员信息,通常我们会使用接口开发来进行。但是如果运维期间B系统进行了调整,或者推送过程中B系统网络进行了调整,又或者后续过程中我们需要推送信息到三方C系统中,这样的话就需要我们进行频繁的

数据结构与算法:排序算法(2)

目录堆排序使用步骤代码实现计数排序适用范围过程代码实现排序优化桶排序工作原理代码实现堆排序二叉堆的特性:1.最大堆的堆顶是整个堆中的最大元素2.最小堆的堆顶是整个堆中的最小元素以最大堆为例,如果删除一个最大堆的堆顶(并不是完全删除,而是跟末尾的节点交换位置),经过自我调整,第2大的元素就会被交换上来,成为最大堆的新堆顶

Ae 效果:CC Wide Time

时间/CCWideTimeTime/CCWideTimeCCWideTime(CC宽泛时间)能够将前后不同时间的帧叠加在一起,从而创建移动物体的运动轨迹,实现重影、运动模糊、光影跟随等效果。可以配合其它的效果使得本效果有更多的可控性。比如,“CCComposite”效果可使得原始内容清晰可见。“色调”Tint效果可改变

Kotlin Android中错误及异常处理最佳实践

KotlinAndroid中错误及异常处理最佳实践Kotlin在Android开发中的错误处理机制以及其优势Kotlin具有强大的错误处理功能:Kotlin提供了强大的错误处理功能,使处理错误变得简洁而直接。这个特性帮助开发人员快速识别和解决错误,减少了调试代码所需的时间。Kotlin的错误处理特性:Kotlin具有一

Windows下,快速部署开发环境,第三方库管理,以及项目迁移工具介绍

对于在windows下做c++开发的同学,你是否有以下痛点?:1.每次构建c++项目,搭配第三方库环境,都要不停的include,lib,dll等配置,如果4-5个还好,要是10几个...人都麻了...2.一个环境也无所谓,问题x64/32位系统,Debug,Release都要配置一遍..每次配置完成后,还要运行检测.

Hadoop初识及信息安全(大数据的分布式存储和计算平台)

目录什么是HadoopHadoop的特点Hadoop优点Hadoop的缺点Hadoop的重要组成信息安全什么是HadoopHadoop是一个适合大数据的分布式存储和计算平台。Hadoop的广义和狭义区分:狭义的Hadoop:指的是一个框架,Hadoop是由三部分组成:HDFS:分布式文件系统--》存储;MapReduc

虚拟IP技术

1.说明虚拟IP(VirtualIPAddress,简称VIP)是一个未分配给真实弹性云服务器网卡的IP地址。弹性云服务器除了拥有私有IP地址外,还可以拥有虚拟IP地址,用户可以通过其中任意一个IP(私有IP/虚拟IP)访问此弹性云服务器。同时,虚拟IP地址拥有私有IP地址同样的网络接入能力,包括VPC内二三层通信、V

【面试经典150 | 双指针】判断子序列

文章目录写在前面Tag题目来源题目解题解题思路方法一:双指针方法二:动态规划写在最后写在前面本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:Tag:介绍本题牵涉到的知识点、

zookeeper —— 分布式服务协调框架

zookeeper——分布式服务协调框架一、Zookeeper概述1、Zookeeper的基本概念2、Zookeeper的特点3、Zookeeper的数据结构二、Zookeeper的安装部署1、Zookeeper的下载2、Zookeeper的安装本地模式(单机模式standalone)安装部署分布式(集群模式clust

热文推荐