当前位置: 首页 > news >正文

【C语言】用函数实现模块化程序设计

前言:如果把所有的程序代码都写在一个主函数(main函数)中,就会使主函数变得庞杂、头绪不清,使阅读和维护程序变得困难。此外,有时程序中要多次实现某一功能,如果重新编写实现此功能就会使得程序冗长、不精炼。

💖 博主CSDN主页:卫卫卫的个人主页 💞
👉 专栏分类:C程序设计谭浩强版本 👈
💯代码仓库:卫卫周大胖的学习日记💫
💪关注博主和博主一起学习!一起努力!
在这里插入图片描述


目录

    • 怎样定义函数
      • 为什么要定义函数
    • 调用函数
      • 函数调用的形式
      • 函数调用时的数据传递
      • 函数调用的过程
      • 函数的返回值
    • 习题练习


怎样定义函数

为什么要定义函数

C语言要求,在程序中所用到的所有函数,必须“先定义,后使用”。例如max函数去求两个数的较大者,必须事先先按规范对它进行定义,指定它的名字、函数返回值类型、函数实现的功能以及参数的个数与类型,将这些信息通知编译系统。这样,在程序执行max时,编译系统就会按照定义时所指定的功能执行。如果事先不定义,编译系统怎么能知道max是什么、要实现什么功能。

定义函数应包括以下几个内容

  1. 指定函数的名字,以便以后按名调用
  2. 指定函数的类型,即函数的返回值类型
  3. 指定函数的参数的名字和类型,以便在调用函数时向它们传递数据。对无参函数不需要这项。
  4. 指定函数应当完成什么操作,也就是函数是做什么的,即函数的功能。这是最重要的,是在函数体中解决的。

定义函数的方法

  1. 定义无参函数

注:函数名后面括号内的void表示"",即函数没有参数。
函数体内包括声明部分语句部分


  1. 定义有参函数
    类型名 函数名()
    {
    函数体
    }
    函数体包括声明部分和语句部分


    类型名 函数名(void)
    {
    函数体
    }

以下定义的max函数是有参函数:

int max(int x,int y)
{int z;    //声明部分z = x > y? x:y;return z;

类型名 函数名(形式参数列表)
{
函数体
}

函数体包含声明部分和语句部分


  1. 定义空函数
void dummy()  //类型名:void,函数名:dummy
{}

调用函数

函数调用的形式

函数调用一般形式为:
函数名(实参列表)

  1. 函数调用语句
    把函数调用单数作为一个语句。例如:
void print()
{printf("***********\n");
}
int main()
{print();//此时函数不带回任何值return 0;
}
  1. 函数表达式
    函数调用出现在另一个表达式中,例如c=max(a,b); max(a,b) 是一次函数调用,它是赋值表达式的一部分。这时函数带回一个确定的值以参加运算。例如:
c = max(a,b);//将a和b中的较大值赋给c值

3.函数参数
函数调用作为另一个函数调用时的实参。例如:

m = max(a,max(b,c));//将b,c中的较大值与a比较,在将他们的最大值赋值给m

函数调用时的数据传递

1.形式参数和实际参数
在调用有参函数时,主调函数和被调用函数之间有数据传递关系。从前面已知:在定义函数时函数名后面括号中的变量名称为"形式参数"(简称形参)或"虚拟参数"。在主函数中调用一个函数时,函数名后面括号中的参数称为"实际参数"(简称实参)。实际参数可以是常量、变量或表达式。
2. 实际参数和形参间的数据传递
在调用函数的过程中,系统会把实参的值传递给被调用函数的形参。或者说,形参从实参得到了一个值。该值在函数调用期间有效,可以参加该函数的运算。


例题:输入两个整数,要求输出其中值较大者。要求用函数来找到大数。

int Max(int x, int y)
{return x > y ? x : y;
}
int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);int ret = Max(a, b);printf("max = %d\n", ret);return 0;
}

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


函数调用的过程

  1. 在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。在发生函数调用时,函数max的形参才被临时分配内存单元。可以通俗的理解成,形参是对实参的一份临时拷贝。
  2. 将实参的值传递给对应的形参。
  3. 在执行max函数期间,由于形参已经有值,就可以利用形参进行有关的运算。
  4. 通过return语句将函数值带回主调函数。且应当注意返回值的类型与函数类型一致。如果函数不需要返回值,则不需要return语句。这时函数的类型定义为void类型。
  5. 调用结束,形参单元被释放。注意:实参单元仍保留并维持原值,没有改变。

函数的返回值

通常,希望通过函数调用使用主调函数能得到一个确定的值,这就是函数值(函数的返回值)。

  1. 函数的返回值是通过函数中的return语句获得的。
  2. 函数值的类型。既然函数有返回值,这个值当然应属于某一个确定的类型,应当在定义函数时指定函数值的类型。
  3. 在定义函数时指定的函数类型一般应该和return语句中的表达式一致。

习题练习

例题1:写两个函数分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数并输出结果。

int common_divisor(int x, int y)
{int max = x > y ? x : y;int min = x < y ? x : y;while (min){if (x % min  == 0 && y % min == 0)//将它们两个数的较小的数往下除{return min;}min--;}
}
int common_multiple(int x, int y)
{int n = 1;while (n * x % y != 0)//最小公倍数一定是他们两个的倍数{n++;}return n * x;
}
int main()
{int num1 = 0;int num2 = 0;scanf_s("%d %d", &num1, &num2);int divisor = common_divisor(num1, num2);//最大公约数int multiple = common_multiple(num1, num2);//最小公倍数printf("divisor = %d multiple = %d\n", divisor,multiple);return 0;
}

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


例题2:写一个判素数的函数,在主函数输入一个整数,输出是否为素数的信息。

void prime_number(int x)//素数只有1和它本身能被整除
{int flag = 0;int i = 0;if (x == 1)//如果该数是1就直接返回素数{printf("是素数\n");}else if (x == 0)//是0就返回不是{printf("不是素数\n");}else{for (i = 2; i < x; i++)//从2开始到它本身看是否有能被整除的数{if (x % i == 0){flag = 1;break;}}if (flag){printf("不是素数\n");}else{printf("是素数\n");}}
}
int main()
{int n = 0;scanf_s("%d", &n);prime_number(n);return 0;
}

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


例题3:写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。

void reverse_arr(char* str, int len)//逆序字符串
{char* left = str;//保存左边的地址char* right = str + len - 1;//保存右边的地址while (left < right)//两两进行交换{char tmp = *left;*left = *right;*right = tmp;left++;right--;}
}
int main()
{char arr[100] = { 0 };gets(arr);printf("initial:%s\n", arr);int len = strlen(arr);reverse_arr(arr,len);int i = 0;printf("reverse:%s\n", arr);return 0;
}

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


结语:今天的内容就到这里吧,谢谢各位的观看,如果有讲的不好的地方也请各位多多指出,作者每一条评论都会读的,谢谢各位。

🫵🫵🫵 祝各位接下来好运连连 💞

相关文章:

【C语言】用函数实现模块化程序设计

前言&#xff1a;如果把所有的程序代码都写在一个主函数(main函数)中&#xff0c;就会使主函数变得庞杂、头绪不清&#xff0c;使阅读和维护程序变得困难。此外&#xff0c;有时程序中要多次实现某一功能&#xff0c;如果重新编写实现此功能就会使得程序冗长、不精炼。 &#x…...

忆联SR-IOV解决方案:助力云数据中心节能提效,向“绿”而行

随着AI时代的到来&#xff0c;云数据中心如何实现节能提效正成为热门话题。其中&#xff0c;SR-IOV技术凭借灵活度高以及可节约虚拟化业务算力等优势&#xff0c;是打造绿色低碳云数据中心的重要解决方案之一。 一、什么是SR-IOV 技术 SR-IOV 是由国际组织 PCI-SIG 组织定义的…...

LeetCode:1402. 做菜顺序、2316. 统计无向图中无法互相到达点对数

1. 1402 做菜顺序 题目详细为&#xff1a; 一个厨师收集了他 n 道菜的满意程度 satisfaction &#xff0c;这个厨师做出每道菜的时间都是 1 单位时间。 一道菜的 「 like-time 系数 」定义为烹饪这道菜结束的时间&#xff08;包含之前每道菜所花费的时间&#xff09;乘以这道菜…...

【消费战略】解读100个食品品牌|意面突起,“空刻”的品类心智占位!

空刻意面&#xff0c;一个开创意大利面速食化的新消费品牌&#xff0c;凭借着核心大单品意大利面&#xff0c;在过去短短的几年中&#xff0c;获得不俗的市场成绩和品牌影响力&#xff0c;占领了空刻意面的消费心智&#xff1a; 2019年&#xff0c;AIRMETER氢刻意面上线天猫旗舰…...

地图金字塔所在块的经纬度方位

地图金字塔所在块的经纬度方位 算法 #define LON_SPAN 360.0 // 开始经度(最左端) #define LAT_SPAN 180.0 #define GLOBAL_LEFT -180.0 // 开始纬度(最上端) #define GLOBAL_TOP 90.0 #define GLOBAL_RIGHT 180.0 #define GLOBAL_BOTTOM -90.0 // 地球的纬度跨度(180-(-180))…...

【干货】Java函数式编程公式大全,收藏学习!

函数操作是现代编程领域中的核心概念之一&#xff0c;它以类似 Excel 表格的方式进行数据处理和计算。它的特点是使用公式和函数来描述数据之间的关系和计算逻辑&#xff1b;它允许我们以更高效、更有组织的方式管理和处理数据。 在函数式编程中&#xff0c;数据被组织成表格的…...

django基于Python的房价预测系统+爬虫+大屏可视化分析

欢迎大家点赞、收藏、关注、评论 文章目录 前言一、项目介绍二、开发环境三、功能需求分析1 数据采集功能设计2数据管理功能设计3爬虫功能需求分析4 数据可视化功能需求分析数据库表的设计 四、核心代码五、效果图六、文章目录 前言 房价是一个国家经济水平的重要体现&#xff…...

异地组网企业怎么办理手续?

对于那些具有异地分支机构的企业来说&#xff0c;SDWAN(Software Defined Wide Area Network)可以是 提供高性能通信和数据传输的理想解决方案。那么&#xff0c;对于企业来说&#xff0c;SDWAN异地组网需要办理哪 些手续呢?下面将介绍一些关键的办理步骤。 1. 资质准备&…...

Android 13.0 根据包名授予OP_REQUEST_INSTALL_PACKAGES权限

1.概述 在系统13.0的定制化开发中,对于在app中调用安装第三方app的时候,会在这时弹出安装未知来源弹窗,需要默认授予REQUEST_INSTALL_PACKAGES 权限,来安装第三方app的安装未知来源权限,所以就是今天需要解决的这个问题 2.根据包名授予OP_REQUEST_INSTALL_PACKAGES的核心…...

民安智库(湖北知名满意度测评公司)乘客高铁出行调查:从需求到满意

随着科技的飞速发展&#xff0c;高铁已成为我们日常出行的重要选择。然而&#xff0c;什么样的服务才是乘客真正需要的&#xff1f;什么样的调查才能真实反映乘客的感受&#xff1f;民安智库&#xff08;政务服务第三方评估公司&#xff09;作为一家中国独立第三方调研咨询的公…...

Oracle的dbms.rls实现数据访问控制

在大部份系统中&#xff0c;权限控制主要定义为模块进入权限的控制和数据列访问权限的控制(如&#xff1a;某某人可以进入某个控制&#xff0c;仓库不充许查看有关部门的字段等等)。 但在某些系统中&#xff0c;权限控制又必须定义到数据行访问权限的控制&#xff0c;此需求一般…...

Python 自定义函数的基本步骤

一、Python 自定义函数的基本步骤 1、什么是函数 函数&#xff0c;其实我们一开始学 Python 的时候就接触过。 不过我们使用的大多数都是 Python 的内置函数。 比如基本每个章节都会出现的 print() 函数。 而现在&#xff0c;我们主要学习的是自定义函数。 各位有没有想过…...

阿里云新品云服务器实例,经济型e实例,价格便宜,性价比高

前不久&#xff0c;阿里云推出了一款全新云服务器实例&#xff0c;他是阿里云面向个人开发者、学生、小微企业&#xff0c;在中小型网站建设、开发测试、轻量级应用等场景推出的全新入门级云服务器&#xff0c;基于“飞天CIPU”黄金技术架构设计&#xff0c;可轻松满足网站建设…...

统信操作系统UOS上安装arm64版nginx

原文链接&#xff1a;统信操作系统UOS上安装arm64版nginx hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇在统信桌面操作系统UOS上安装arm64版nginx的文章&#xff0c;本篇文章主要是给大家提供一种下载离线nginx软件包的方法&#xff0c;拿到软件包可以去不能链接互…...

2017年高热度编程语言简介

世上语言千千万&#xff0c;我却独爱这一种!”这句话用来形容程序员和编程语言之间的爱恨情仇实在是再精准不过了。根据GitHub 2016年的开源报告&#xff0c;其上所有开源项目共包含了316种编程语言&#xff0c;这是一个什么概念呢?举个例子来说&#xff0c;世界上共有226个国…...

python爬虫入门(一)web基础

HTTP基本要点 HTTP请求&#xff0c;由客户端向服务端发出&#xff0c;可以分为 4 部分内容&#xff1a;请求方法&#xff08;Request Method&#xff09;、请求的网址&#xff08;Request URL&#xff09;、请求头&#xff08;Request Headers&#xff09;、请求体&#xff08…...

利用TreeMap来解决P3029 [USACO11NOV] Cow Lineup S

P3029 [USACO11NOV] Cow Lineup S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 好了&#xff0c;我们首先要统计奶牛的种类数量n&#xff0c;好与接下来我们记录一个范围内的奶牛的数量作比较&#xff0c;一旦我们统计范围内的奶牛的数量m达到我们刚开始记录的奶牛的数量n我…...

zzy-project-cli,提供多个框架的脚手架

npm地址 install npm install zzy-project-cli -g做什么&#xff1f; 将多个可选的框架提供给使用者选择&#xff0c;选中后自动下载对应模板&#xff0c;快捷使用。 使用 step1 zzy-cli create [项目名称]step2 获取模板之后选取任一进行下载 下载完成之后即可使用 模…...

C++类和对象中(构造函数,析构函数,拷贝构造函数)详解

C类和对象中[构造函数,析构函数,拷贝构造函数]详解 一.前言1.类的6个默认成员函数 二.构造函数1.构造函数的引出2.无参构造函数3.缺省参数在构造函数中的应用4.编译器实现的默认构造函数5.广义的默认构造函数6.默认构造函数的形成规则 三.析构函数1.析构函数的语法2.编译器实现…...

智能矩阵系统解决的问题?

智能矩阵系统可以解决的问题多种多样&#xff0c;它主要通过人工智能技术应用于矩阵系统&#xff0c;解决一些传统方法难以处理的问题。 以下是一些常见的应用场景&#xff1a; 1. 数据管理&#xff1a;智能矩阵系统可以有效地管理大量的数据&#xff0c;包括数据的存储、检索…...

程序员相亲指南:软件测试从业者的高光自我介绍术

当“软件测试工程师”遇上“相亲局”&#xff0c;如何用三句话破除“点按钮的”“找bug的”刻板印象&#xff1f;本文从专业视角拆解表达策略&#xff0c;助你展现职业价值与人格魅力。一、困境篇&#xff1a;软件测试相亲的三大认知陷阱1. 致命三连问的杀伤力场景还原&#xf…...

玻璃的前世今生,了解一下?

玻璃的前世今生,了解一下? 玻璃的前世今生 改革开放40年,我国基础建设飞速发展。一栋栋高耸入云端的摩天大楼,一片片一望无边的居民住宅,房地产行业为我国的GDP画上了浓墨重彩的一笔。毫无疑问,为建筑物穿上漂亮外衣的玻璃行业也是突飞猛进,为我们建筑表皮的安全节能美…...

优化labelme中AI Model权重下载体验:手动配置onnx文件的完整指南

1. 为什么需要手动配置onnx权重文件 最近在用labelme做图像标注的朋友可能已经发现了&#xff0c;新版本内置的AI Model功能确实能大幅提升效率。这个功能基于SegmentAnything和EfficientSam等先进模型&#xff0c;可以智能识别图像中的目标区域。但第一次使用时&#xff0c;系…...

深入拆解Java线程:生命周期流转与核心方法底层原理

线程是Java并发编程的核心执行单元&#xff0c;理解其生命周期与状态转换机制&#xff0c;以及interrupt()、wait()、notify()、join()等核心方法的底层原理&#xff0c;是编写高效、稳定并发程序的基础。一、Java线程的生命周期与状态转换Java线程的状态由java.lang.Thread.St…...

SolidWorks2020多版本共存攻略:如何在同一台电脑上安装多个版本

SolidWorks多版本共存实战指南&#xff1a;从安装到优化的完整方案 对于机械设计师、工程师和学生而言&#xff0c;有时需要在同一台计算机上运行多个版本的SolidWorks。可能是为了兼容不同客户的项目文件&#xff0c;或是测试新版本功能的同时保留稳定版本。本文将深入探讨如何…...

RevokeMsgPatcher防撤回工具:5个简单步骤解决微信3.9.10.19版本兼容性问题

RevokeMsgPatcher防撤回工具&#xff1a;5个简单步骤解决微信3.9.10.19版本兼容性问题 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址:…...

PvZ Toolkit:解锁植物大战僵尸无限潜能的终极修改工具

PvZ Toolkit&#xff1a;解锁植物大战僵尸无限潜能的终极修改工具 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit 还在为植物大战僵尸中的资源限制而烦恼吗&#xff1f;想要体验创意玩法却受限于游…...

Web Components 实战:构建原生可复用组件

摘要&#xff1a;在 React、Vue 等框架百花齐放的今天&#xff0c;Web Components 作为浏览器原生支持的组件化方案&#xff0c;正悄然回归。本文将带你从零开始&#xff0c;使用原生技术栈构建可复用的 Web Components&#xff0c;让你的组件真正的"一次编写&#xff0c;…...

从零到一:OpenSPG Docker化部署全流程实战

1. 环境准备&#xff1a;Docker与Docker Compose安装 第一次接触OpenSPG时&#xff0c;我花了两天时间才把环境折腾明白。现在回头看&#xff0c;其实只要把Docker和Docker Compose装对版本&#xff0c;后面基本不会踩坑。建议直接用官方脚本安装&#xff0c;比手动配置省心得多…...

毕业季自救指南:用百考通AI告别论文焦虑,高效搞定学术写作

当论文截止日期步步紧逼&#xff0c;你是否正在经历深夜查文献、反复修改格式、为降重焦头烂额的无助时刻&#xff1f;或许&#xff0c;你需要的不仅是一杯咖啡&#xff0c;更是一个懂学术、更懂你的智能伙伴。 深夜两点&#xff0c;图书馆的灯光依然零星亮着。电脑屏幕上闪烁的…...