c语言11天笔记

函数的概述

函数:实现一定功能的,独立的代码模块。我们的函数一定是先定义,后使用。

使用函数的优势:

1. 我们可以通过函数提供功能给别人使用。当然我们也可以使用别人提供的函数,减少代码量。

2. 借助函数可以减少重复性的代码。

3. 实现结构化(模块化)

程序设计思想: 结构化程序设计思想:将大型的任务功能划分为相互独立的小型的任务模块来设计。

函数是C语言程序的基本组成单元:

C语言程序是由一个(必然是main函数)或多个函数组成。

函数的分类

从函数实现的角度:

库函数:C语言标准库实现并提供使用的函数,比如常见的有printf(),scanf()

用户自定义函数:需要程序员自行实现,开发中大部分都是这样的函数

从函数形式的角度:

无参函数:函数调用时,无需传参,可配可不配返回值。

有参函数:函数调用时,需要参数传递数据,经常需要配套返回值使用。

相关概念

主调函数:主动去调用其他函数的函数。

被调函数:被调用的函数

很多时候,一个函数既可以是主调函数,也可以是被调函数。这种情况一般出自自定义函 数。

函数的定义

语法

函数首部:

返回类型:函数返回值的类型

函数名:函数的名称,遵循标识符命名(使用英文字母、数字、_、$,不能以数字开头,建议小写 +下划线命名法)

形参列表:用于接收主调函数传递的数据,如果有多个用" , "分隔,且每一个形参都需要指定类 型。

面试题:

注意:

函数类型标识符变量类型说明符相同,它表示返回的函数值的类型。

在C语言中还可以定义无类型(即void类型)的函数,这种函数不返回函数值,只是完成某种功 能。

如果省略函数的类型标识符,则默认为是int型。

函数中返回语句的形式为 return(表达式);或 return 表达式;其作用是将表达式的值作为函数值返 回给调用函数。其中表达式的类型应与函数类型一致。

如果"形参表列"中有多个形式参数,则它们之间要用" , "分隔。

如果形参表中有多个形参,即使它们的类型是相同的,在形参表中也只能逐个进行说明。 fun1(in t a,int b){}

一个完整C程序中的所有函数可以放在一个文件中,也可以放在 多个文件中。

案例

案例1:

案例2:

形参和实参

概念

形参(形式参数):

函数定义时指定的参数,形参是用来接收数据的,函数定义时,系统不会为形参申请内存,只有当函 数调用时,系统才会为形参申请内存,用于存储实际参数,并且当函数返回,系统会自动回收为形参 申请的内存资源。(本质上所有函数都有return,只不过当我们的函数返回类型是void的时候,return 关键字被省略了)

实参(实际参数):

函数调用时主调函数传递的数据参数(常量、变量、表达式..,只要有确定的值),实参是传递的 数据。

实参和形参必须类型相同。若不同时,按赋值规定自动进行类型转换。

在C语言中,参数传递遵循 单向值传递 ,实参只是将自身的值传递给形参,而不是实参本身。形参 的值的改变不会影响实参。

实参与形参在内存中占据不同的内存空间,尽管可能实参和形参名称是一样的。

案例2:

函数的返回值

若不需要返回值,函数中可以没有return语句。

一个函数中可以有多个return语句,但任一时刻只有一个return语句被执行。

被调函数返回给主调函数的结果数据(可以是变量、常量、表达式,只要是有确定值即可。)

返回值类型一般情况下需要和函数中return语句返回的数据类型保持一致,如果不一致,以函数定 义时指定的返回类型为标准。也就是返回值类型和实际返回值可以存在自动类型转换或者强制类型 转换的关系。

案例1:

案例2:

案例3:

函数的调用

调用方式

1. 函数语句: test(); int result = max(2,4);

2. 函数表达式: 4 + max(2,4);

3. 函数参数: printf("%d",max(2,4))

在一个函数中调用另一个函数须具备以下条件

① 被调用的函数必须是已经定义的函数;

② 若使用库函数,应在本文件开头用#include包含;

③ 若使用用户定义的函数,而用户函数又在主调函数的后面,则应在主调函数中对被调用的函数进 行声明。声明的作用是把函数名、函数参数的个数和类型等信息通知编译系统,以便在遇到函数时, 编译系统能正确识别函数,并检查函数调用的合法性。

函数声明

函数调用时,往往要遵循 先定义后调用 ,但如果我们对函数的调用操作出现在函数的定义之前,则需 要对函数进行声明。

函数声明的作用:

是把函数名、函数参数的个数和返回类型等信息通知给编译系统,以便于在遇到函数时,编译系统能 正确识别函数,并检查函数调用的合法性。

声明的方式:

函数首部后加上分号

 

函数首部后加上分号,可省略形参名,但不能省略参数类型。

函数的嵌套调用

函数不允许嵌套定义,但允许嵌套调用。

嵌套调用:在被调函数内有去主动去调用其他函数,这样的函数调用方式,称之为嵌套调用;

案例1:

案例2:

函数的递归调用

递归调用的含义:在一个函数中,直接或者间接调用了函数本身称之为函数的递归调用。

递归调用的本质:

是一种循环结构,它不同于之前所学的while,do-while,for这样的循环结构,这些循环结构是借 助循环变量,而递归是利用函数自身实现循环结构,如果不加以控制,很容易产生死循环。

递归调用的注意事项:

1. 递归调用必须要有出口,一定要终止递归(否则会产生死循环)。

2. 对终止条件的判断一定要放在函数递归之前。

3. 进行函数的递归调用。

4. 函数递归的同时一定要将函数调用向出口逼近。

案例1

案例2:

数组做函数参数

注意:

当用数组做函数的实际参数时,则形参应该也要用数组/指针变量来接收,但请注意,此次并不 代表传递了数组中所有的元素数据,而是传递了第一个元素的内存地址(数组首地址),形参接收这 个地址后,则形参和实参就代表了同一块内存空间,则形参的数据修改会改变实参的。这种数据传递 方式我们可以称之为“引用传递”。

如果用数组做函数形式参数,那么我们提供另一个形参表示数组的元素个数。原因是数组形参代 表的仅仅是实际数组的首地址。也就是说形参只获取到了实际数组元素的开始,并未获取元素的结 束。所以提供另一个形参表示数组的元素个数,可以防止在被调函数对实际数组元素访问的越界。

但有一个例外,如果是用字符数组做形参,且实际数组中存放的是字符串数据(形参是字符数 组,实参是字符串)。则不用表示数组元素的个数的形参,原因是字符串本身会自动结束符\0。

案例-数组元素做函数实参:

案例2:

变量的作用域

引入问题

我们在函数设计过程中,经常要考虑对参数的设计,换句话说,我们需要考虑函数需要几个参数,需 要什么类型的参数,但我并没有考虑函数是否需要提供参数,如果说函数可以访问到已定义的数据, 则就不需要提供函数形参,那么我么到底要不要提供函数参数,取决于什么?答案就是变量的作用域 (如果函数在变量的作用域范围内,则函数可以直接访问数据)

变量的作用域

概念:变量的作用范围,也就是说变量在什么范围是有效的。

变量的分类

根据变量的作用域不同,变量可分为全局变量和局部变量

局部变量

全局变量

建议在全局变量定义时初始化。如果不初始化,系统会将全局变量初始化为0(0 | \0 |0.0)。

使用全局变量的优缺点:

优点:

1. 利用全局变量可以实现一个函数对外输出的多个结果数据。

2. 利用全局变量可以减少函数形参个数,从而降低内存消耗,以及因形参传递带来的时间消耗。

缺点:

1. 全局变量在程序的整个运行期间,始终占据内存空间,会引起资源消耗。

2. 过多的全局变量会引起程序的混乱,造成程序结果错误。

3. 降低程序通用性,特别是当我们进行函数移植时,不仅仅要移植函数,还要考虑全局变量。

4. 违反了“高内聚,低耦合”的程序设计原则。

总结:我们发现弊大于利,建议尽量减少对全局变量的使用,函数之间要产生联系,仅通过实参形参的方式产生联系。

作用域举例:

案例:

注意:

如果全局变量(外部变量)和局部变量同名,程序执行的时候, 就近原则

变量的生命周期

概念:

变量在程序运行中的存在时间。 根据变量存在的时间不同,变量可分为静态存储方式和动态存储方式。

变量的存储类型

存储类型

auto

auto存储类型只能修饰局部变量,被auto修饰的局部变量是存储在动态存储区的。auto也是局部变 量默认的存储类型。

static

修饰局部变量:局部变量会被存储在静态存储区。局部变量的生命周期被延长,但是作用域不发 生改变。

修改全局变量:全局变量的生命周期不变,但作用域被衰减。一般限制全局变量只能在本文件 内。

demo01.c

demo02.c

extern

外部存储类型:只能修饰全局变量,次全局变量可以被其他文件访问。相当于扩展了全局变量的 作用域。

extern修饰外部变量,往往是外部变量进行声明,声明该变量是在外部文件中定义的;不是变量定 义。

demo01.c

demo02.c

register

寄存器存储类型:只能修饰局部变量,用register修饰的局部变量会直接存储到CPU的寄存器中, 往往将循环变量设

置为寄存器存储类型。

面试题

static关键字的作用

1. static修饰局部变量,延长其生命周期,但不影响局部变量的作用域。

2. static修饰全局变量,不影响全局变量的生命周期,会限制全局变量的作用域仅限本文件内使用;

3. static修饰函数:此函数就称为内部函数,仅限本文件内调用。 static int funa(){..}

值传递与引用传递

值传递:发生在整型、浮点型、字符型,数据传递,传递的是数值,也就是内存空间只能被当前变 量独享。

引用传递:发生在数组、指针、结构体..,数据传递,传递的是地址值,也就是内存空间可以被多 个变量共享。

内部函数和外部函数

内部函数:使用static修饰的函数,称作内部函数,内部函数只能在当前文件中调用。

外部函数:使用extern修饰的函数,称作外部函数,extern是默认的,可以不写,也就是说本质上 我们所写的函数都是外部函数,建议外部函数在被其他文件调用的时候,在其他文件中声明的时 候,加上extern关键字。

章节作业

编程题

1. 编写一个函数,通过输入球的半径,返回球的体积;

2. 编写一个函数,通过输入一个数字字符,返回该数字

3. 编写一个函数,输入四个数据分别表示2个点的x,y坐标,返回两点之间的距离;

4. 编写一个函数,通过参数输入一个整型数,返回该数各位上数字的平方和;

5. 编写一个函数,通过参数输入x的值,计算如下的数学函数值,当 x>5时, f(x) = 4x+7;否则 f(x) = -2x+3,返回结果值

6. 设计一个函数,用来求出多个数据的平均值;

7. 设计一个函数,用来查找一个字符串中某个字符的位置;

8. 设计一个函数,把一个整型数字转成对应的字符串格式

9. 设计一个函数,统计字符串中大写字母的个数

10. 设计函数,实现strcmp 的功能;

11. 编写函数,用于判断输入的字符是不是个数字。是返回1,不是返回0.

12. 设计一程序,实现一个简单的计算器。 要求:有菜单函数 和加、减、乘、除的函数 主函数调用这些函数实现程序的功能.要求菜单函数能 够输出如下的界面

1、加法 2、减法 3、乘法 4、除法 0.退出

13. 设计函数实现冒泡排序;

思考题【选做】

14. 编写一个函数,将数组中的数据首尾互换

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于单片机的智能风扇设计

摘 要: 传统风扇无法根据周围环境的温度变化进行风速的调整,必须人为地干预才能达到需求 。 本文基于单片机的智能风扇主要解决以往风扇存在的问题,其有两种工作模式: 手动操作模式和自动运行模式,人们可以根据需要进行模式选择。 在自动运行…

Leetcode每日刷题之面试题01.01.判断字符是否唯一

在学习编程语言的过程中相信大部分同学刚开始接触的循环语句都是 for 循环,今天我将介绍一个比较简洁的循环语句,可以帮助我们减少些许的代码量,也更加快捷,那就是范围 for 在我之前的博文中也有所介绍 详情点击:面向对…

五段式S型算法笔记

设定已知:v0 vmax j; 减加速段:tm到tmax 加加速段:0到tm tm:中点时间 vm:中点速度 vmax:最大速度; j加速度的斜率 -j相反加速度的斜率 这个图首先说明&#xff…

C 语言文件操作详解

目录 引言 一、基本概念 1.什么是文件 2.文件的属性 3.为什么使用文件 4.二进制文件和文本文件 二、文件的打开和关闭 1.流和标准流 2.文件指针 3.文件的打开和关闭 三、⽂件的顺序读写 1.顺序读写函数 2.详细介绍 1.fgetc 2.fputc 3.fgets 4.fputs 5.fscan…

OpenTiny HUICharts 正式开源发布,一个简单、易上手的图表组件库

引言 大家好! 我们非常高兴地跟大家宣布,今天正式发布我们的新产品——OpenTiny HUICharts。这是一款前端 Web 可视化图表库,其基础图表功能构建于 ECharts 之上,而高阶图表则采用了新的底层技术,以满足更广泛的数据…

AI 手机的技术展望

某某领导问到我,AI手机这个产业发展如何?对于,地方科技园区,应该如何发展相关产业?我一时还真说不上来,于是,查了一下资料,大概应对了一下。 一:AI手机的定义 首先&…

python管理mysql

[rootserver1 ~]# pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple //这是设置清华镜像站,提高下载安装速度,如果报错提示找不到config,这是因为版本低,临时使用清华镜像站来升级 pip&…

Python PDF文本处理技巧 - 查找和高亮文字

目录 使用工具 Python在PDF中查找和高亮文字并统计出现次数和页码 Python在PDF的特定页面区域中查找和高亮文字 Python使用正则表达式在PDF中查找和高亮文字 Python在PDF中查找文字并获取它的坐标位置 其他查找条件设置 在日常工作和学习中,我们常常需要处理各…

SAP MM学习笔记 - 豆知识05 - Customer Exit 实例,MM01上定义Customer Exit 来Check评估Class

上一章讲了一些MM模块的豆知识。 - MM01中设定的安全在库和最小安全在库 - MM01/MMSC/Customize自动 扩张物料的保管场所 - MM01中定义生产订单的默认入库保管场所 - VA01受注票中设定禁止贩卖某个物料 SAP MM学习笔记 - 豆知识03 - 安全在库和最小安全在库,扩…

linux文件——深度学习文件fd、文件系统调用

前言:从本片开始正式进入linux文件的学习,本片内容主要是文件的fd。 本篇内容博主将要先带友友回忆C语言中的文件操作接口,然后再过渡到操作系统中的系统调用的学习,最后理解操作系统中的文件操作。 ps:本节内容设计一…

AI 深度学习让金融 β 系数估算更精确

作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话: 传统的金融贝塔系数估计方法往往依赖于严格的假设,难以准确捕捉 Beta 的动态变化,这限制了它们在实际应用中的有效性。为了解决这些问题,本文开发了一种新方法:NeuralBeta,利用神经网络进行Bet…

Centos7安装高版本内核

背景 买到的设备安装Centos7系统,但是新的处理器已经不支持低版本的Linux内核了。而且在 CentOS 使用过程中,高版本的应用环境可能需要更高版本的内核才能支持,所以难免需要升级内核。 内核种类 关于内核种类: kernel-ml:kerne…

趋动科技陈飞:从小模型到大模型,AI时代下的数据中心建设

自AI大模型横空出世,不断推动着AI从学术界到产业界向大众破圈,新的时代正在来临。11月15-16日,由CDCC主办的“2023第11届数据中心标准大会”在北京国家会议中心盛大开幕。 本届大会的主题围绕“AI时代 重塑未来”,聚焦数据中心领…

Spring:springboot集成jetcache循环依赖问题

springboot版本:2.6.14 jetcache版本:2.6.2 启动项目报错如下: 解决方案: jetcache版本升级到2.6.4 https://github.com/alibaba/jetcache/issues/624

phpstudy搭建sqlilabs本地靶场

请先在网上解决好前置条件的下载和安装:phpstudy、vscode、navicat premium(非必要)、sqlilab的压缩包/文件夹 phpstudy--安装sqlilabs 1.打开phpstudy后,我们会用到MySQL5.7.26和Nginx1.15.11 #mysql5.7.26是因为sqlilabs靶场不支持高版本MySQL 2.在软…

Spring配置

1.Spring的两大核心思想IOC和AOP思想 1.1类注解 1.Controller, Service, Configuration, Component, Repository 1.2方法注解 bean(这个方法搭配上面的五大注解进行使用) 2.Bean的名称 2.1.类注解名称 (1)默认首字母小写驼…

【C语言篇】字符和字符串以及内存函数的详细介绍与模拟实现(上篇)

文章目录 字符函数字符输入输出函数字符输入函数字符输出函数 字符分类函数字符转换函数 字符串函数字符串输入输出函数字符串输入函数字符串输出函数 strlen函数的使用和模拟实现strcpy函数的使用和模拟实现strcat函数的使用和模拟实现strcmp函数的使用和模拟实现strncpy函数的…

三十三、【人工智能】【机器学习】【监督学习】- LightGBM算法模型

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…

【计算机操作系统】死锁的概念

文章目录 死锁的定义死锁、饥饿、死循环的区别死锁产生的必要条件死锁的处理策略小结(思维导图) 死锁的定义 死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推…

二维差分日常练习

前言&#xff1a;一开始写题的时候以为自己还记得&#xff0c;但是写的时候忘记了一个易错点 定义长度为 len , 那么 左上角的坐标为 &#xff08; i , j ) , 那么右下角的坐标为 为 ( i len -1 ,j len -1 ) #define _CRT_SECURE_NO_WARNINGS #include<bits/stdc.h> us…