C语言程序设计P5-2【应用函数进行程序设计 | 第二节】——知识要点:函数的参数及返回值和函数的调用及声明

知识要点:函数的参数及返回值和函数的调用及声明

视频:

目录

一、任务分析

二、必备知识与理论

三、任务实施


一、任务分析

1.求x的n次方的值也就是求n个x的乘积,可把x和n作为函数的形参,定义一个函数power来完成这个功能;

2.主调函数里提供实参,通过函数调用将实参的值传递给形参,调用完成后,power函数将所求的x的n次方的值作为返回值返回主调函数;

3.数据从主调函数里传递,可以增加程序的灵活性。

二、必备知识与理论

1.函数的参数

函数的参数用于建立函数之间的数据联系。当一个函数调用另一个函数时,实际参数的值会传递给形式参数,以实现主调函数与被调函数之间的数据通信。同时,函数参数的运用还可以提高函数的灵活性和通用性。

(1)形式参数和实际参数

形式参数(简称形参)是指在定义函数时,跟在函数名后面的小括号中的变量名。实际参数(简称实参)是指调用函数时,跟在函数名后面的小括号中的表达式。

(2)参数的传递

在调用函数时,主调函数和被调函数之间有数据的传递——实参传递给形参。

关于形参与实参的说明:

(1)在定义函数中指定的形参变量,在未出现函数调用时,它们并不占内存中的存储单元。只有在发生函数调用时,函数中的形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放。

(2)实参可以是常量、变量、表达式、函数等,无论实参是何种类型的变量,在进行调用时,它们都必须具有确定的值,以便在调用时将实参的值赋给形参,因此,实参在使用前必须事先赋值。

(3)实参和形参,名称可相同也可不同,但实参与形参的类型应一致,参数个数、对应顺序上也必须保持一致,否则,会发生“类型不匹配”的错误。在C语言中,字符型数据与0~255之间的整型数据可以互相通用。

(4)实参向形参传递数据,有两种方式:

①数值传递,也称传数值,如常量值、变量值、表达式值、数组元素值、函数值等,这些值都是由用户程序决定。

②地址传递,也称传地址,如变量地址、指针、数组名所代表的地址等,值由系统分配决定,用户不能指定。当然,地址也是数值,是一个地址数据值。

③数值传递和地址传递的区别:只是传递的数据类型不同。

(5)实参变量对形参变量的数值传递属于单向传递,只由实参传给形参,而不能由形参传回来给实参。

(6)函数调用,如果是数值传递,传递后实参仍保留原值并不改变。如果是地址传 递,传递后实参地址的值也不会改变,但地址的内容可能会改变。

2.函数的返回值

通常,希望通过函数调用使主调函数能得到一个确定的值,这就是函数的返回值。下面对函数值作一些说明:

(1) return语句:函数的返回值是通过函数中的return语句获得的。return语句的一般形式为:

return(表达式);

return语句将被调用函数中的一个确定值带回主调函数中,如果需要从被调用函数带回一个函数值(供主调函数使用),被调用函数中必须包含return语句。如果不需要从被调用函数带回函数值可以不要return语句。

①return语句后面的括弧也可以不要,如“return(z);”与“return z;”等价。

②return后面的值可以是一个表达式,例如:任务一中的max函数可以改写为:

max(int x,int y)

{ 

return(x>y?x:y);  

 }

这样的函数体更为简短,return语句的功能是计算表达式的值,并返回给主调函数。

③在函数中允许有多个return语句,但要求每个return后面的表达式的类型应相同。每次调用只能有一个return 语句被执行,因此只能返回一个函数值。

④如果被调函数中没有return语句,并不带回一个确定的、用户所希望得到的函数值,但实际上,函数并不是不带回值,而只是不带回有用的值,带回的是一个不确定的值。

(2)函数值的类型。既然函数有返回值,这个值当然应属于某一个确定的类型,应当在定义函数时指定函数值的类型。例如:

int max(int x,int y)    /* 函数值为整型 */

double min(int x,int y)  /*函数值为双精度型*/

C语言规定,凡不加类型说明的函数,一律自动按整型处理。为了便于以后代码在不同编译环境下重复使用,建议在定义时对所有的函数都要指定函数类型。

(3)在定义函数时指定的函数类型一般应该和return语句中的表达式类型一致。如果两者不一致,则以函数类型为准。对数值型数据,可以自动进行类型转换。即函数类型决定返回值的类型。

(4)对于“不带回值”的函数,应当使用“void”定义为“空类型”。这样,系统就保证在函数中不能使用return带回任何值。但系统仍然允许void类型函数使用return语句,此时语句的作用是结束函数的运行,返回到主调函数。

3.函数的调用

(1)函数调用的一般形式

函数定义一旦完成,我们就可以通过函数名来调用函数,执行函数体的内容,其过程与其它语言的子程序调用相类似。C语言中,函数调用的一般形式为:

函数名(实际参数表);

如果是调用无参函数,则实参表列可以没有,但括号不能省略。实参表列中的参数可以是常量、变量或其它构造类型数据及表达式。如果实参表列包含多个实参,则各实参之间用逗号分隔。实参与形参的个数应相等,类型应匹配。实参与形参按顺序一一对应传递数据。

(2)函数调用的方式

在C语言中,按照函数在程序中出现的位置,函数的调用方式有三种:

①函数表达式:

②函数语句:

③函数实参:

4.函数的声明

(1)对被调用函数的声明在主调函数中调用另一函数(即被调用函数)需要满足如下条件:

①首先被调用的函数必须是已经存在的函数(是库函数或用户自己定义的函数)。

②如果使用库函数,一般还应该在本文件开头用#include命令将调用有关库函数时所需用到的信息包含到本文件中来。例如,前面已经使用过的命令:

#include <stdio.h> 也可以写成 #include "stdio.h"

③如果使用用户自己定义的函数,而且该函数与主调函数在同一个文件中,一般还 应该在主调函数中对被调函数作声明,即向编译系统声明将要调用此函数,并将有关信息通知编译系统。

(2)函数声明的形式

从程序中可以看到对函数的声明与函数定义首部基本上是相同的,只差一个分号,因此可以简单地照写已定义的函数的首部,再加一个分号,就成为了对函数的“声明”。

函数声明的一般形式为:

函数类型 函数名(参数类型1,参数类型2,,参数类型n);

函数类型 函数名(参数类型1  形参1,参数类型2  形参2,,参数类型n  形参n);

其中,第一种形式是基本的形式。为了便于阅读程序,也允许在函数原型中加上参数名,就成了第二种形式。但编译系统不检查参数名,因此参数名是什么都无所谓,并不要求和函数的定义处保持一致。

(3)函数声明的位置:

三、任务实施

编写一函数,求x的n次方的值,其中n是整数。

算法分析:

(1)求x的n次方的值也就是求n个x的乘积,可把x和n作为函数的形参,定义一个函数power来完成这个功能。

(2)主调函数里提供实参,通过函数调用将实参的值传递给形参,调用完成后,power函数将所求的x的n次方的值作为返回值返回主调函数。

(3)power函数中用循环结构来实现该算法。

#include <stdio.h>

long power(int x,int n)   /* 函数定义 */

{ int i;

long p=1;

  for(i=1;i<=n;i++)

p*=x;

  return p;

}

main()   /* 主调函数 */

{ int x,n;

long y;

printf("Enter two numbers: x,n!\n");

scanf("%d,%d",&x,&n);   

  y=power(x,n);    /* 函数调用 */

  printf("Value=%ld\n",y);

}

运行结果如下:

Enter two numbers: x,n!

2,10↙

Value=1024

注意:本程序中power函数的定义在主调函数main之前,所以在程序中省略了对power函数的声明。

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

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

相关文章

【sgUploadList】自定义组件:基于elementUI的el-upload封装的上传列表组件,适用于上传附件时

sgUploadList源码 <template><div :class"$options.name"><ul class"files"><li v-for"(a, i) in files" :key"i"><el-link click.stop"clickFile(a)"><img :src"getFlieThumbSrc(a…

位运算(一)位运算简单总结

191. 位1的个数 给定一个正整数 n&#xff0c;编写一个函数&#xff0c;获取一个正整数的二进制形式并返回其二进制表达式中 设置位 的个数&#xff08;也被称为 汉明重量&#xff09;。 示例 1&#xff1a; 输入&#xff1a;n 11 输出&#xff1a;3 解释&#xff1a;输入的二…

聚合支付系统/官方个人免签系统/三方支付系统稳定安全高并发 附教程

聚合支付系统/官方个人免签系统/三方支付系统稳定安全高并发 附教程 系统采用FastAdmin框架独立全新开发&#xff0c;安全稳定,系统支持代理、商户、码商等业务逻辑。 针对最近一些JD&#xff0c;TB等业务定制&#xff0c;子账号业务逻辑API 非常详细&#xff0c;方便内置…

声音克隆GPT-SoVITS

作者&#xff1a;吴业亮 博客&#xff1a;wuyeliang.blog.csdn.net 一、原理介绍 GPT-SoVITS&#xff0c;作为一款结合了GPT&#xff08;生成预训练模型&#xff09;和SoVITS&#xff08;基于变分信息瓶颈技术的歌声转换&#xff09;的创新工具&#xff0c;正在声音克隆领域掀…

WLAN AutoConfig服务假死?重启服务恢复网络连接!

目录 背景&#xff1a; 过程&#xff1a; 可能引起原因&#xff1a; 具体解决步骤&#xff1a; 步骤一: 步骤二&#xff1a; 总结&#xff1a; 背景&#xff1a; 这个问题困扰我好长一段时间了&#xff0c;每次下班将电脑关机后&#xff0c;次日早上电脑开机的时候无线…

鸿蒙面试题 -生命周期的执行顺序

在开始之前&#xff0c;我们先明确自定义组件和页面的关系&#xff1a; 自定义组件&#xff1a;Component装饰的UI单元&#xff0c;可以组合多个系统组件实现UI的复用&#xff0c;可以调用组件的生命周期。 页面&#xff1a;即应用的UI页面。可以由一个或者多个自定义组件组成…

Midjourney Describe API 的对接和使用

Midjourney Describe API 的对接和使用 Midjourney Describe API 的主要功能是通过上传图片&#xff0c;获取对图片的描述。使用该 API&#xff0c;只需要传递图片文件地址&#xff0c;API 会返回图片的详细描述。无需繁琐的参数设置&#xff0c;即可获得高质量的图片描述。 …

顶会新宠!KAN-LSTM完美融合新方案

2024深度学习发论文&模型涨点之——KANLSTM KAN-LSTM混合预测模型是一种结合了自注意力机制&#xff08;KAN, Key-attention network&#xff09;和长短时记忆网络&#xff08;LSTM&#xff09;的深度学习模型&#xff0c;主要用于序列数据的预测任务&#xff0c;如时间序…

RabbitMQ介绍及安装

文章目录 一. MQ二. RabbitMQ三. RabbitMQ作用四. MQ产品对比五. 安装RabbitMQ1. 安装erlang2. 安装rabbitMQ3. 安装RabbitMQ管理界⾯4. 启动服务5. 访问界面6. 添加管理员用户7. 重新登录 一. MQ MQ( Message queue ), 从字⾯意思上看, 本质是个队列, FIFO 先⼊先出&#xff…

小程序 - 美食列表

小程序交互练习 - 美食列表小程序开发笔记 目录 美食列表 功能描述 准备工作 创建项目 配置页面 配置导航栏 启动本地服务器 页面初始数据 设置获取美食数据 设置onload函数 设置项目配置 页面渲染 页面样式 处理电话格式 创建处理电话格式脚本 页面引入脚本 …

筑起厂区安全--叉车安全防护装置全解析

在繁忙的工业生产领域中&#xff0c;叉车作为搬运工&#xff0c;穿梭于仓储与生产线之间。然而&#xff0c;叉车的高效运作背后&#xff0c;也隐藏着诸多安全风险&#xff0c;尤其是在那些空间狭小、物流繁忙的环境中。为了降低这些潜在的危险&#xff0c;叉车安全防护装置便成…

java基础概念47-ArrayList、LinkList和迭代器

一、ArrayList集合 1-1、ArrayList的两种添加信息的方式 1-2、ArrayList集合底层逻辑 1、利用空参创建的集合&#xff0c;在底层创建一个默认长度为0的数组 2、添加第一个元素时&#xff0c;底层会创建一个新的长度为10的数组 3、存满时&#xff0c;会扩容1.5倍。 4、如果…

亚马逊云科技大语言模型加速OCR应用场景发展

目录 前言Amazon Bedrock关于OCR解决方案Amazon Bedrock进行OCR关键信息提取方案注册亚马逊账号API调用环境搭建 总结 前言 大语言模型是一种基于神经网络的自然语言处理技术&#xff0c;它能够学习和预测自然语言文本中的规律和模式&#xff0c;可以理解和生成自然语言的人工…

Day7 苍穹外卖项目 缓存菜品、SpringCache框架、缓存套餐、添加购物车、查看购物车、清空购物车

目录 1.缓存菜品 1.1 问题说明 1.2 实现思路 1.3 代码开发 1.3.1 加入缓存 1.3.2 清除缓存 1.3.2.1 新增菜品优化 1.3.2.2 菜品批量删除优化 1.3.2.3 修改菜品优化 1.3.2.4 菜品起售停售优化 1.4 功能测试 1.4.1 加入缓存 1.4.2 菜品修改 1.5 代码提交 2.缓存套餐 2.1 Spring C…

OpenGL环境配置

首先我们需要一个OpenGL上下文&#xff08;context&#xff09;和一个用于显示的窗口。这些操作在每个系统上都是不一样的&#xff0c;我们需要自己处理创建窗口&#xff0c;定义OpenGL上下文以及处理用户输入。 我们可以选择使用库来节省我们书写操作系统相关代码的时间&…

Sarcomere仿人灵巧手ARTUS,20个自由度拓宽机器人作业边界

Sarcomere Dynamics 是一家深度技术先驱&#xff0c;通过开发和商业化仿人机械来改变机器人行业。专注于为科研人员&#xff0c;系统集成商和制造商提供更实惠、更轻便且更灵活的末端执行器替代品。凭借创新的致动器技术&#xff0c;创造了一款紧凑、轻便且非常坚固的机械手Art…

qt QNetworkAccessManager详解

1、概述 QNetworkAccessManager是QtNetwork模块中的一个核心类&#xff0c;它允许应用程序发送网络请求并接收响应。该类是网络通信的基石&#xff0c;提供了一种方便的方式来处理常见的网络协议&#xff0c;如HTTP、HTTPS等。QNetworkAccessManager对象持有其发送的请求的通用…

聊点技术 | AI赋能:根因定位如何深入到SQL级别

作者信息 背 景 在当今数字化时代&#xff0c;企业对IT系统的依赖日益加深&#xff0c;系统故障的影响也愈发严重。因此&#xff0c;快速准确地定位故障根因成为了IT运维领域的重要课题。传统的故障排查方法往往只能触及表面&#xff0c;无法深入到最核心的SQL级别&#xff0c…

scss文件内引入其他scss文件报错

1、今天在编译一些老项目的时候&#xff0c;老是提示下面信息 2、而且有很多Sass import rules are deprecated and will be removed in Dart Sass 3.0.0.警告 3、用npm view sass versions看&#xff0c;其中sass的最新版本是1.82.0 4、经过测试"sass": "1.75…

楼房销售系统设计与实现

文末获取源码和万字论文&#xff0c;制作不易&#xff0c;感谢点赞支持。 毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;楼房销售系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xf…