C语言之函数设计(1)

目录

没有返回值的函数

通用性

不含形参的函数

函数返回值的初始化

作用域

 文件作用域

声明和定义

函数原型声明

头文件和文件包含指令


在上节中我们简单的学习了函数的创建方法(函数定义)与函数的使用方法(函数调用),现在我们来学习更为知识的函数创建方法等知识。


没有返回值的函数

在前面的循环结构中我们学习了用*来显示出等腰三角形的程序,下面我们把显示出*的部分作为一个单独的函数,通过调用这个函数显示出直角在左下方的三角形。

#include<stdio.h>

/*连续显示出多个n*/
void put_stars(int n)
{
	while(n-- > 0)
		putchar('*');
}

int main()
{
	int i, len;
	
	printf("生成一个直角在左下方的等腰直角三角形。\n");
	printf("短边:");
	scanf("%d", &len);
	
	for(i = 1; i <= len; i++)
	{
		put_stars(i);
		putchar('\n');
	}
	
	return 0;
}

在put_stars函数中只是用来显示n个*,并没有需要返回的值。这种没有返回值的函数类型,要声明为void

 void就是“空”的意思,在C语言中无论有没有返回的值都同样称为函数,而在其他编程语言中会定义为其他非函数的概念,例如子程序(fortran)或过程(Pascal)。

 这里我们使用put_stars函数把二重循环简化为一重循环,从而提高程序的可读性。


通用性

我们这次来编写一个显示出直角在右下方的等腰三角形的程序。

#include<stdio.h>

/*连续显示出多个ch*/
void put_chars(int ch, int n)
{
	while(n-- > 0)
		putchar(ch);
}

int main()
{
	int i, len;
	
	printf("生成一个直角在左下方的等腰直角三角形。\n");
	printf("短边:");
	scanf("%d", &len);
	
	for(i = 1; i <= len; i++)
	{
		put_chars(' ', len - i); //显示出len-i个空格
		put_chars('*', i);//紧接着显示出i个*
		putchar('\n');
	}
	
	return 0;
}

让我们来解释下:

本程序需要连续显示出多个空白字符,因此需要创建出put_chars来代替函数put_stars。

put_chars可以连续显示出n个通过形参传递来的字符。

前面我们学习过字符常量是int型的,这里还存在显示字符的char型,我们以后会学习到

 函数put_chars和只能显示*的函数put_stars相比较更具有通用的优势。

putchar(ch);
put_chars(' ', len - i); 
		put_chars('*', i);

ch就是put_chars用来传递字符的,既可以传递空白字符又可以传递*,相信这样单独拉出来解释大家有更加明白的认识。


不含形参的函数

我们用下面一段程序来引出不含形参的参数,大家可以先看程序中的特别的代码试着分析它的作用然后再阅读解析。

#include<stdio.h>
//返回输入的正整数
//关于这个函数的名字不必纠结,学的后面我们就能熟练起适当的函数名了
int scan_pint(void)
{
	int tmp;
	do
	{
		printf("请输入一个整数:");
		scanf("%d", &tmp);
		if(tmp <= 0)
			puts("\a请不要输入非负正整数。");
	}while(tmp <= 0);
	return tmp;
}
/*返回正整数倒转后的值*/
int rev_int(int num)
{
	int tmp = 0;
	
	if(num > 0)
	{
		do
		{
			tmp = tmp * 10 + num % 10;
			num /= 10;
		}while(num > 0);
	}
	return tmp;
}
int main()
{
	int nx = scan_pint();//不赋予实参
	printf("该整数倒转后的值是%d。\n", rev_int(nx));
	
	return 0;
}

其中有几段代码是不是有点特殊呢?让我们来看看吧!

int scan_pint(void)

函数scan_pint读取从键盘输入的正整数并返回。该函数不接受形参,为了加以说明在小括号中加入void。

int nx = scan_pint()

调用方也没有必要赋予实参,所以函数调用运算符()是空的,其实在到目前为止我们学习的main函数也可以写为int main(void)


函数返回值的初始化

int nx = scan_pint();

注意main函数中声明变量nx的部分,该变量得初始值是函数scan_pint()的表达式,变量逆向使用函数scan_pint()的返回值进行初始化。

但是该初始化方法只适用于拥有自动存储期的对象,不适合拥有静态存储期的对象。


作用域

函数scan_pint和函数rev_int都包含一个拥有相同的标识符(名称)的变量tmp,但它们是各自不同的变量。

就是说scan_pint中的变量tmp是函数scan_pint特有的变量,对rev_int也是一样。

赋给变量的标识符,它的名称有一个通用的范围就是作用域

在程序块中声明变量的名称,只在该程序块中通用,在其他区域无效,简单来说就是从变量声明的位置开始,到该声明的程序块中的大括号 } 为止这一区间内通用,这样的作用域称为块作用域(block scope)。


 文件作用域

还是老样子,我们用程序来引出,大家可以先观察程序中某一语句的特别之处猜想它们的用法:

/*计算最高分*/
#include<stdio.h>

#define NUMBER 5//学生人数

int tensu[NUMBER];//数组定义:创建数组实体的声明(定义)

int top(void);//函数top的函数原型声明

int main()
{
	extern int tensu[];//数组的声明(可以省略)
	int i;
	
	printf("请输入%d名学生的分数。\n", NUMBER);
	for(i = 0; i < NUMBER; i++)
	{
		printf("%d:", i+1);
		scanf("%d", &tensu[i]);
	}
	printf("最高分=%d\n", top());
	
	return 0;
}
/*返回数组tensu的最大值(函数top的函数定义)*/
int top(void)
{
	extern int tensu[];//数组的声明(可以省略)
    int i;
	int max = tensu[0];
	
	for(i = 1; i < NUMBER; i++)
	{
		if(tensu[i] > max)
			max = tensu[i];
	}
	return max;
}

在函数程序块中声明的变量等标识符是该程序块中特有的部分,而像数组tensu[ ]这样,在函数外声明的变量标识符,其位置从声明的位置开始到程序的结束都是通用的。

int tensu[NUMBER];//数组定义:创建数组实体的声明(定义)

这样的作用域称为文件作用域


声明和定义

像上面的一个语句,创建了一个元素为5、元素类型为int的数组tensu。这样创建变量实体的声明称为定义(definition)声明

extern int tensu[];//数组的声明(可以省略)

像这样使用了extern的声明表示“使用的是在某处创建的tensu”,这里并没有真正创建出变量的实体,因此称为非定义声明

由于数组tensu是在函数外定义的,所以只需要在main函数或top函数中明确声明要使用它就可以放心使用了。

由于数组tensu被赋予了文件作用域,因此在main函数和top函数中无需特意声明,就可以使用它。


函数原型声明

和人一样,编译器在读取数据时也是从头到尾按照顺序进行读取的,因为top函数的函数定义在main函数之后,所以在想要调用top函数,就需要让编译器知道你的想法。

int top(void);//函数top的函数原型声明

像这样明确记述了函数的返回类型,形参类型和个数的声明称为函数原型声明

该语句要以“;”结尾

 函数原型声明只声明了函数的返回值和形参等相关类型,并没有定义函数的实体。

函数定义和函数原型声明的不同之处如下所示:

函数top的函数定义——定义声明(有实体)

函数top的函数原型声明——非定义声明(没有实体)

 如果top函数的需求(返回值类型,形参等)发生了改变那么函数定义和函数原型声明两部分都必须进行修改,不能只改动其中一个!

如果把函数top的函数定义写在main函数之前,就不用特意使用函数原型声明了,我们推荐把main函数放在程序最后的位置。


头文件和文件包含指令

通过函数原型声明,可以指定函数的参数以及返回值的类型等信息,这样就可以放心的使用函数了。

库函数printf或putchar等的函数原型声明都包含在<stdio.h>中,因此必须要使用以下固定的指令:

#include<stdio.h>

通过#include指令,就可以把<stdio.h>中的全部内容都读取到程序中。

包含库函数的函数原型声明的<stdio.h>称为头文件,而取得头文件的#include称为文件包含指令

例如,putchar的函数原型声明在头文件<stdio.h>中的声明格式如下:

	int putchar(int _ _ c);

编译器不同,形参的名称也可能不同。

在函数原型声明的时可以不指定形参的名称,也可以这样进行声明:

	int putchar(int);

我们先学习到这里,之后我们会学习函数的通用性——可以处理任意数组、处理不同元素个数的数组等更加精细的内容。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

谈一谈网络协议中的应用层

文章目录 一&#xff0c;什么是HTTPHTTP的优缺点HTTPS 一&#xff0c;什么是HTTP 我们在通过网络进行传输数据时&#xff0c;我们要保证&#xff0c;我们在发送时构造的数据&#xff0c;在接收时也能够解析出来&#xff0c;这本质上就是一种协议&#xff0c;是一种应用层协议&…

python zblog API实现类似XMLRPC/发布文章

我发现python对Zblog的XML发布并不友好&#xff0c;虽然也有对应的模块&#xff0c;但是远远没有XPCRPC更直接方便&#xff0c;但是使用xmlRpc是直接给发布文章带来了不小的便利&#xff0c;但是对系统也并不友好&#xff0c;但是zblog也开放了Api&#xff0c;但是干部子弟不乐…

测试剪切板贴图,兼测试2023年12月7日更新的Bard

当前的情况好比&#xff0c;&#xff08;居然真的可以通过剪切板把图片放进来&#xff01;&#xff09; 听说2023年12月7日Bard有更新&#xff0c;所以&#xff0c;再测试了一次。这下&#xff0c;对大语言模型应该死心了&#xff1b;AI替代人的传闻应该是过早危言耸听了。

SAP UI5 walkthrough step3 Controls

在上一步&#xff0c;我们是直接用index.html 中的body 里面的DIVision去输出 hello world&#xff0c; 在这个章节&#xff0c;我们将用SAP UI5 的标准控件 sap/m/Text 首先&#xff0c;我们去修改 webapp/index.html <!DOCTYPE html> <html> <head><…

Vue3-02-ref() 响应式详解

ref() 是什么 ref() 是一个函数&#xff1b; ref() 函数用来声明响应式的状态&#xff08;就是来声明变量的&#xff09; ref() 函数声明的变量&#xff0c;是响应式的&#xff0c;变量的值改变之后&#xff0c;页面中会自动重新渲染。ref() 有什么特点 1.ref() 可以声明基础…

java服务调用mysql报错

一、前言 前端服务调用后端服务时出现以下报错&#xff0c;原因是使用mysql5.7版本数据库中存在ONLY_FULL_GROUP_BY这个配置项导致的不兼容 MySQLSyntaxErrorException: Expression #32 of SELECT list is not in GROUP BY clause and contains nonaggregated column demeter…

打造Github首页的动态飞线效果

一、导语 Github首页的地球动态飞线&#xff0c;大家都比较熟悉吧 二、分析 由大量随机的3点构造出贝塞尔曲线&#xff0c;然后开始从起点到终点的飞行后&#xff0c;然后再从起点到终点的消失&#xff0c;就此完成整个过程 三、基础代码 createCurve(startPoint, endPoint…

layui实现下拉框多选

引用layui第三方扩展实现下拉框选择渲染 第三方插件地址xmSelect下拉多选 xmSelect 实现效果 //第三方扩展插件 <script type"text/javascript" src"${ctx }/config/layui/dist/xm-select.js"></script> //jquery渲染 <script type&qu…

【数电笔记】58-同步D触发器

目录 说明&#xff1a; 1. 电路组成 2. 逻辑功能 3. 特性表、特性方程 4. 状态转移图 例题 5. 同步D触发器的特点 6. 集成同步D触发器&#xff1a;74LS375 74LS375内部原理 说明&#xff1a; 笔记配套视频来源&#xff1a;B站本系列笔记并未记录所有章节&#xff0c;…

JRT文件服务实现

网站与客户端打印和导出方面已经无大碍了&#xff0c;今天抽时间整整文件服务&#xff0c;文件服务设计可以查看下面连接。原理一样&#xff0c;代码会有些变化。 文件服务设计 首先实现文件服务的服务端&#xff0c;就是一个业务脚本&#xff0c;用来接收上传、移动和删除文件…

Qt之基于QMediaPlayer的音视频播放器(支持常见音视频格式)

Qt自带了一个Media Player的例子,如下图所示: 但是运行这个例子机会发现,连最基本的MP4格式视频都播放不了。因为QMediaPlayer是个壳(也可以叫框架),依赖本地解码器,视频这块默认基本上就播放个MP4,甚至连MP4都不能播放,如果要支持其他格式需要下载k-lite或者LAVFilte…

Qt槽函数不响应不执行的一种原因:ui提升导致重名

背景&#xff1a; 一个包含了组件提升的ui&#xff0c;有个按钮的槽函数就是不响应&#xff0c;于是找原因。 分析&#xff1a; 槽函数的对应一是通过connect函数绑定信号&#xff0c;二是on_XXX_signal的命名方式。界面上部件的槽函数通常是第二种。 我反复确认细节&#…

cache教程 4.一致性哈希(hash)

本章节是单节点走向分布式节点的一个重要部分。 一致性哈希(consistent hashing)的原理以及为什么要使用一致性哈希。实现一致性哈希代码&#xff0c;添加相应的测试用例 1.多节点部署遇到的问题 上一章节完成了一个单节点的缓存服务器。那对于一个单节点来说&#xff0c;读…

L1-031:到底是不是太胖了

题目描述 据说一个人的标准体重应该是其身高&#xff08;单位&#xff1a;厘米&#xff09;减去100、再乘以0.9所得到的公斤数。真实体重与标准体重误差在10%以内都是完美身材&#xff08;即 | 真实体重 − 标准体重 | < 标准体重10%&#xff09;。已知 1 公斤等于 2 市斤。…

CSS入门(样式表|class类|选择器|背景|!important|文本颜色|字体|注释)

为什么学习CSS&#xff0c;因为QSS vs CSS 相似度极高&#xff0c;学好CSS对于QSS和QML都有潜移默化的作用。记住不管学习什么&#xff0c;我们都在围绕Qt集成。 入门 介绍 CSS 功能丰富&#xff0c;不仅仅是布局页面 外部样式表 <link> 在给定的HTML代码中&#xff…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《考虑移动式储能调度的配电网灾后多源协同孤岛运行策略》

这篇文章的标题表明研究的主题是在配电网发生灾害后&#xff0c;采用一种策略来实现多源协同孤岛运行&#xff0c;并在这个过程中特别考虑了移动式储能的调度。 让我们逐步解读标题的关键词&#xff1a; 考虑移动式储能调度&#xff1a; 文章关注的焦点之一是移动式储能系统的…

neuq-acm预备队训练week 8 P4779 【模板】单源最短路径(标准版)

题目背景 题目限制 题目描述 给定一个 n 个点&#xff0c;m 条有向边的带非负权图&#xff0c;请你计算从 s 出发&#xff0c;到每个点的距离。 数据保证你能从 s 出发到任意点。 输入格式 第一行为三个正整数n,m,s。 第二行起 m 行&#xff0c;每行三个非负整数 ui​,vi​…

2023年【广东省安全员C证第四批(专职安全生产管理人员)】考试总结及广东省安全员C证第四批(专职安全生产管理人员)复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年【广东省安全员C证第四批&#xff08;专职安全生产管理人员&#xff09;】考试总结及广东省安全员C证第四批&#xff08;专职安全生产管理人员&#xff09;复审考试&#xff0c;包含广东省安全员C证第四批&…

File has been changed outside the editor, reload?

编译keil工程&#xff0c;一直提示&#xff1a;该文件在编译器之外被修改&#xff0c;是否重新加载。 解决办法&#xff1a; 关闭.map后缀的文件即可&#xff0c;然后重新build/rebulid可以发现不会重新弹出该错误。

完整方案开放下载!详解中国移动《通信网络中量子计算应用研究报告》

8月30日&#xff0c;中国移动在第四届科技周暨战略性新兴产业共创发展大会上重磅发布了《通信网络中量子计算应用研究报告》。 玻色量子作为中国移动在光量子计算领域的唯一一家合作企业兼战投企业&#xff0c;在量子计算应用于通信行业达成了深入合作&#xff0c;并在5G天线多…
最新文章