C程序设计(7.0安徽专升本函数)

news2024/12/24 20:43:14

在之前我很多代码执行都是放在函数里的,这样方便我管理和演示,现在能和大家更好的去了解函数了

考纲教材关于这个的理论知识太多了,且废话占大多数,甚至有些对于小白很晦涩难懂或容易搞混!所以在这我就尽量缩减理论知识,方便大家的理解!!!

一、认识函数

  • 函数(function):是就是子程序是一个大型程序中的实现某特定功能的部分代码,由一个或多个语句块自称。而且相较于其他的代码,具备相对的独立性
  • 注(第五版):函数就是功能。每个函数用来实现一个特定的功能。函数的名字应反映其代表的功能
  • 函数的分类:库函数、自定义函数。(考纲不着重考,属于补充知识)

二、函数的定义

  • 函数是需要先定义,后使用(补:库函数需要调用外部文件在调用)
  • 定义函数的要求
    1. 指定函数的名字
    2. 指定函数的类型,即函数返回值的类型
    3. 指定函数的参数的名字和类型,以便在调用是向他们传递数据。无参函数不需要!
    4. 指定函数应完成什么操作,即指定函数的功能

2.1 函数的定义格式

类型  函数名([形参]){  //不需要参数的函数此处可以不加形参。甚至可以不用加类型

    函数体;
    [return语句]  //如果是无返回值函数可以不需要return

}
  • 演示创建一个计算输入的两个数大小的函数,即max函数
#include <stdio.h>
int max(int x,int y) {  //定以int返回类型函数max,形参为x,y
	if (x > y) {  //如果x>y
		return x;
	}else if (y>x) {  //如果y>x
		return y;
	}else {  //相等返回1
		return 1;
	}
}
main() {
	int a, b;
	printf("请输入第一个数字:");
	scanf("%d",&a);
	printf("请输入第二个数字:");
	scanf("%d",&b);
	printf("最大的数为:%d\n",max(a, b)); //调用max函数,传入实参a,b
}

三、函数的调用

各位道友看到我这么多帖子(没吃过猪肉,也见过猪跑了;我可不是猪哈)基本的调用都明白的大差不差了,所以我在这里提一提理论就行了,我在这只强调一个外部调用自定义函数(考纲不考,只为有兴趣人准备)

  • 函数的调用一般为函数名调用:函数名([参数])
  • 根据考纲教材所述:调用函数时若函数定义在mian函数之后或不在同一路径,需要在mian函数中或mian函数之前声明。如下3.1
  • 但在大部分编译器中是可以不需要声明的,因为在某些情况下可能会对函数调用进行一定程度的推测和延迟解析,即使没有严格按照标准在调用前进行函数声明,也有可能在编译和链接过程中成功找到函数定义而不报错。然而,按照 C 语言标准,为了确保程序的正确性和可移植性,应该在调用一个函数之前对其进行声明,如果函数定义在调用之后。

3.1 调用外部xxxx.c中定义的自定义函数和main函数之后自定义函数(Visual Studio编译器)

  •  源文件function.c代码
#include <stdio.h>
int min(int,int);   //函数声明(也称为函数原型)
/*
告知编译器有一个名为min的函数,它接受两个int类型的参数并返回一个int类型的值。
这样当在function.c的main函数中调用min函数时,编译器在编译function.c时就知
道这个函数的存在、参数类型和返回值类型,从而能够正确地进行编译,而不会因为找
不到函数定义而报错。
*/
int max(int x,int y) {  //定以int返回类型函数max,形参为x,y
	if (x > y) {  //如果x>y
		return x;
	}else if (y>x) {  //如果y>x
		return y;
	}else {  //相等返回1
		return 1;
	}
}
main() {
	int a, b;
    int add(int,int);  //只要是在调用之前声明位置可以任意(但要合规)  
	printf("请输入第一个数字:");
	scanf("%d",&a);
	printf("请输入第二个数字:");
	scanf("%d",&b);
	printf("最大的数为:%d\n",max(a, b)); //调用max函数,传入实参a,b
	printf("最小的数为:%d\n",min(a,b));
    printf("两个数相加的结果为:%d",add(a,b)); //调用add函数
}
int add(int x,int y){
    int a=x+y;
    return a;
}
  • 外部文件minTest.c代码
int min(int x,int y) {
	if (x < y) {
		return x;
	}else if (y<x) {
		return y;
	}else {
		return 1;
	}
}
  • 如下是没有声明的运行结果

  • 函数的声明有以下两种格式
函数类型 函数名(类型1 参数名,类型2 参数名,.....); //函数的首部称为函数原型
函数类型 函数名(类型1,类型2,类型3,.......); //所以使用函数原型做声明

四、认识实参与形参

在上文中,本帅哥也提到了什么是实参与形参,但是在这我将详细讲解

4.1 实参

  • 定义:在函数调用时传递给函数的具体值或变量。
  • 作用:
    1. 实参将具体的数据传递给函数,使得函数能够根据这些数据进行操作。实参可以是常量、变量、表达式等。
    2. 实参的值会被复制(对于值传递方式)或其地址会被传递(对于指针传递方式)给相应的形参,以便函数内部可以使用这些数据。

4.2 形参

  • 定义:形参是在函数定义中声明的参数变量,出现在函数名后的括号内。它们仅在函数被调用时才被分配内存空间,用于接收来自调用者传递过来的值。
  • 作用:
    1. 形参作为函数内部的局部变量,用于接收外部传递的值,并在函数内部参与运算和处理。
    2. 函数通过形参与外部进行数据交互,实现特定的功能。

4.3 实参与形参的关系

  • 数据传递:

    • 当函数被调用时,实参的值被传递给形参。这个过程可以是值传递(将实参的值复制给形参)或引用传递(将实参的地址传递给形参,通过指针操作可以修改实参的值)。
    • 例如,在值传递中,修改形参的值不会影响实参的值;而在引用传递中,修改形参(实际上是通过指针修改实参所指向的内存区域)可以影响实参的值。
  • 类型匹配:

    • 实参的类型必须与对应的形参类型相匹配,或者能够进行自动类型转换。否则,会导致编译错误。
  • 数量一致:

    • 实参的数量必须与形参的数量一致。如果实参数量多于形参数量,多余的实参将被忽略;如果实参数量少于形参数量,未被初始化的形参将具有未定义的值。

4.4 补充(当定义的函数不知道需要的形参个数时)

这个会在后续具体讲到,关于宏

1、使用va_listva_startva_argva_end宏来实现可变参数函数。

   #include <stdio.h>
   #include <stdarg.h>

   int sum(int numArgs,...) {
       va_list args;
       int sum = 0;
       int arg;

       va_start(args, numArgs);
       for (int i = 0; i < numArgs; i++) {
           arg = va_arg(args, int);
           sum += arg;
       }
       va_end(args);

       return sum;
   }

   int main() {
       int result = sum(3, 10, 20, 30);
       printf("Sum: %d\n", result);
       return 0;
   }

2、使用预处理器宏来模拟可变参数函数。

   #include <stdio.h>

   #define SUM(...) sum(__VA_ARGS__, 0)

   int sum(int num,...) {
       int result = num;
       va_list args;
       va_start(args, num);
       int arg;
       while ((arg = va_arg(args, int))!= 0) {
           result += arg;
       }
       va_end(args);
       return result;
   }

   int main() {
       int result = SUM(10, 20, 30);
       printf("Sum: %d\n", result);
       return 0;
   }

五、函数的递归

  • 函数递归:简而言之就是自己调用自己!!!!!
  • 明白这个,我用用此题帮助大家理解:等差数列,输入第一个数,公差为2,求第18项为多少,只能用函数的递归!!!!(第五版p182题目改编,更易懂!!)
#include <stdio.h>
main(){
    int grade;
    printf("请输入第一项数的值:");
    scanf("%d",&grade);
    int c=Function_grade(grade,18); //调用递归函数求等差数列项函数
    printf("第18项结果为:%d", c);
}
int Function_grade(int x,int y) {
    int c;
    if (y == 1) {
        return x;
    }
    else {
        c= Function_grade(x, y - 1)+2;
    }
    return c;
}

 

理解: 当y不满足1时是不是一致在调用其本身,所以我们可以直接看y=1时结果为x,然后y减到1需要减17此,加上最后这一次不用减故为18此,所以当我们知道了递归次数和每次减时加2,我们就能知道最终值了!(懵的套数学等差公式看看我这个解释算出来的结果对不对)

本7.0就先讲这么多后面还有关于局部变量全局遍历,生命周期等知识在7.1讲解!感谢大家的支持

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2123152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言——希尔排序

希尔排序是对于插入排序的一种优化 代码&#xff1a; #include <stdio.h> #include <stdlib.h> void shell_sort(int* p, int len) { int i; int j; int step; int tmp; for (step len / 2; step > 0; step step / 2) { fo…

手把手教你实现微信小程序定位

实现小程序的定位 框架&#xff1a;uniappvue 1&#xff0c;用户授权配置 在pages.json文件中配置 "pages": [{"path": "pages/home/index","style": {"navigationBarTitleText": "首页","navigationBarBac…

监控-zabbix

1运维监控 是指对计算机系统、网络、服务器等关键IT基础设施进行实时监控&#xff0c;以确保系统的稳定运行和及时发现潜在问题 2老监控框架&#xff08;不会用但需要知道&#xff09; Cacti&#xff1a; Cacti是一款基于PHP、MySQL开发的网络流量监测图形分析工具。主要监…

CSP-J算法基础 计数排序

文章目录 前言计数排序计数排序的过程总结 代码实现计数排序总结 前言 计数排序 计数排序&#xff08;Counting Sort&#xff09;是一种线性时间复杂度的排序算法&#xff0c;适用于范围有限的整数排序。它通过计数每个值出现的次数&#xff0c;依次排列这些值。该算法不通过比…

LVGL 控件之线条(lv_line)

目录 一、概述二、线条1、设置连接点2、自适应大小3、翻转 y 轴4、样式4.1 设置宽度4.2 末端形态 4.3 虚线5、API 函数 一、概述 线条部件只有一个组成部分&#xff1a;主体 LV_PART_MAIN。 通过一组点绘制出相连的直线&#xff0c;通过 lv_line_create 创建相应的对象。 二…

利用深度学习实现验证码识别-4-ResNet18+imagecaptcha

在当今的数字化世界中&#xff0c;验证码&#xff08;CAPTCHA&#xff09;是保护网站免受自动化攻击的重要工具。然而&#xff0c;对于用户来说&#xff0c;验证码有时可能会成为一种烦恼。为了解决这个问题&#xff0c;我们可以利用深度学习技术来自动识别验证码&#xff0c;从…

5.第二阶段x86游戏实战2-认识内存

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

Cesium 展示——Cesium 初始化视角在中国并加载数据(china.json)

文章目录 需求一:初始化视角在中国分析需求二:加载中国数据(china.json)需求一:初始化视角在中国 在初始化 Cesium 的 Viewer 后,视角是在美国,如何让其视角指向中国 分析 viewer.value = new Cesium.Viewer(cesiumContainer.value, {homeButton

redis基本数据结构-string

文章目录 1. redis的string数据结构2. 常见的业务场景2.1 缓存功能案例讲解背景优势解决方案代码实现 2.2 计数器案例讲解背景优势解决方案代码实现 2.3 分布式锁案例讲解背景优势解决方案代码实现 2.4 限流案例讲解背景优势解决方案代码实现 2.5 共享session案例讲解背景优势解…

Docker突然解封,直接拉取!

文章目录 Docker突然解封&#xff0c;直接拉取&#xff01;封禁的原因是什么&#xff1f;解封的原因是什么&#xff1f;封禁对开发的影响经验教训 最近开始公众号文章也开始同步更新了&#xff0c;对Java、大数据、人工智能、开发运维相关技术分享&#xff0c;文章对您有用的话…

Linux 8250串口控制器

1 8250串口类型的识别 Intel HW都使用DesignWare 8250&#xff1a; drivers/mfd/intel-lpss-pci.c drivers/tty/serial/8250/8250_dw.c IIR寄存器的高2位bit7、bit6用来识别8250串口的类型&#xff1a; 0 - 8250&#xff0c;无FIFO 0 - 并且存在SCR&#xff08;Scratch registe…

SQL优化(二)统计信息

收集统计信息 数据库的统计信息非常重要&#xff0c;如果没有正确地收集表的统计信息&#xff0c;或者没有及时地更新表的统计信息&#xff0c;SQL就有可能走错执行计划&#xff0c;也就会出现性能问题。 统计信息主要分为表的统计信息、列的统计信息、索引的统计信息、系统的…

TeamTalk数据库代理服务器

文章目录 main函数主流程关键步骤线程池redis缓存未读消息计数未读消息计数-单聊未读消息计数-群聊 群成员管理 main函数主流程 关键步骤 初始化epoll 线程池数据入口 reactor CProxyConn::HandlePduBuf异步task任务封装&#xff0c;把任务放入线程池&#xff1b;线程池里的…

【AI学习】AI科普:专有名词介绍

这里是阿川的博客&#xff0c;祝您变得更强 ✨ 个人主页&#xff1a;在线OJ的阿川 &#x1f496;文章专栏&#xff1a;AI入门到进阶 &#x1f30f;代码仓库&#xff1a; 写在开头 现在您看到的是我的结论或想法&#xff0c;但在这背后凝结了大量的思考、经验和讨论 目录 1.AI序…

TCP通信三次握手、四次挥手

前言 前面我说到了&#xff0c;UDP通信的实现&#xff0c;但我们经常说UDP通信不可靠&#xff0c;是因为他只会接收和发送&#xff0c;并不会去验证对方收到没有&#xff0c;那么我们说TCP通信可靠&#xff0c;就是因为他会进行验证接收端是否能够接收和发送&#xff0c;并且只…

给大家推荐好用的AI网站

地址&#xff1a;https://ai.ashuiai.com/auth/register?inviteCode8E8DIC1QCR 个人觉得挺好用的&#xff0c;可以免费&#xff0c;免费有限制次数&#xff0c;也可以会员升级200永久免费&#xff0c;我用的200永久免费。 可以在国内使用以下ai模型 回答问题更智能&#xff…

计算机毕业设计 校内跑腿业务系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

分享6个我喜欢的常用网站,来看看有没有你感兴趣的!

分享6个我自己很喜欢的常用网站&#xff0c;平时工作生活中经常会打开&#xff0c;来看看有没有你感兴趣的&#xff01; 1.Crazygames crazygames.com/ 一个超赞的在线小游戏平台&#xff0c;上面有超过7000种游戏任你选。不管你喜欢冒险、解谜、闯关&#xff0c;还是装扮、赛…

概要设计例题

答案&#xff1a;A 知识点&#xff1a; 概要设计 设计软件系统的总体结构&#xff1a;采用某种方法&#xff0c;将一个复杂的系统按照功能划分成模块&#xff1b;确定每个模块的功能&#xff1b;确定模块之间的调用关系&#xff1b;确定模块之间的接口&#xff0c;即模块之间…

返工(Rework)与返修(Repair)有何不一样

IATF 16949 汽车业质量管理体系,以客户需求为基础,组织透过相关单位了解客户需求后,向内部流程展开,目的是确保从研发到出货每个环节都能满足客户需求,同时管控制造过程的效率及良率,使产线能够稳定及准时交货给客户。 IATF 16949 条文中,针对「返工(Rework)」与「返修(…