C learning_9 (函数篇)

news2024/11/25 0:43:03

目录

函数

函数的概念

函数的作用

函数的分类

函数的参数

函数的调用


函数

函数的概念

        概念:C语言中的函数是一种封装了一定功能的代码块,可以在程序的任意位置调用。

返回值类型 函数名(参数列表)

{

        函数体

        return 返回值;

}

1.返回值类型指定了函数返回的数据类型

2.函数名是函数的名字

3.参数列表包含了函数所需的输入参数

4.函数体包含了函数实现的具体功能

5.return语句用于将计算结果传递给函数调用者。

维基百科中对函数的定义:子程序 

        在计算机科学中,子程序(英语:Subroutine, procedure, function, routine, method, subprogram, callable unit),是一个大型程序中的某部分代码, 由一个或多个语句块组 成。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。 一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软件库。

函数的作用

        作用:将程序中的具体功能逻辑封装在一个函数中,可以大大提高程序的可读性和可维护性。在程序中,通过调用函数来实现相应的功能,避免了冗长、重复的代码出现,也方便了代码的复用。

函数的分类

        1.库函数

        库函数是指一些已经编写好的、经过测试和优化的程序函数集合,这些函数可以被其他程序调用。库函数通常是为了实现一些常见的功能而编写的,如scnaf函数、printf函数、strlen函数等。库函数有助于程序开发人员提高开发效率和代码质量,避免重复造轮子。在程序开发中,使用库函数可以简化代码,提高代码的可读性和可维护性。C语言并不直接去实现库函数,而是提供了C语言的标准和库函数的约定。

总结 - C语言常用的库函数都有:

IO函数:输入输出函数  scanf  printf getchar putchar

字符串操作函数:strlen strcmp

字符操作函数:islower isupper

内存操作函数:menset memcmp

时间/日期函数:time

数学函数:sqrt pow

其他库函数

        接下来,我们来学习两个库函数 :

(1).strcpy

但是这个函数到底有没有拷贝'\0'呢,我们还需验证一下。

 

(2).memset 

2.自定义函数 

        自定义函数是指程序员自己编写的函数,可以和库函数一样被其他程序调用。和库函数不同的是,自定义函数是根据程序员的需求和特定的功能来编写的,可以根据具体的业务需求进行设计,可以实现一些复杂的算法或流程。

函数的组成:

ret_type fun_name(para1, *)
{
    statement;//语句项
}
ret_type 返回类型
fun_name 函数名
para1    函数参数

写一个自定义函数可以找出两个整数中的最大值。

函数的参数

这里我们先来写一个函数实现两个整型变量的交换

这里我们就需要介绍一下函数参数。

3.1 实际参数(实参)

真实传给函数的参数,叫实参。 实参可以是:常量变量表达式函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。

3.2 形式参数(形参)

形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函 中有效。

!!!!!!最终写法:

//写一个函数实现两个整型变量的交换
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void swap(int* x, int* y)//形式参数 - 形参
{
	int temp = 0;
	temp = *x;
	*x = *y;
	*y = temp;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	printf("交换前:%d %d\n", a, b);
	swap(&a, &b);	//实际参数 - 实参
	printf("交换前:%d %d\n", a, b);
	return 0;
}

那我们什么时候需要传地址,什么时候又需要传值呢?这时我们就需要了解函数的调用

函数的调用

传值调用:
        函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。
传址调用:
        传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操
作函数外部的变量。

 总结:

写下写几个代码好好理解传址传值的实际应用。

1. 写一个函数可以判断一个数是不是素数。

#include<stdio.h>
#include<math.h>
int is_prime(int n)
{
	int i = 0;
	for (i = 2; i <= sqrt(n); i++)
	{
		if (n % i == 0)//不是素数
			return 0;
	}
	return 1;
}
int main()
{
	int i = 0;
	for (i = 101; i <= 200; i += 2)
	{
		//判断i是否是素数
		//由于这里只是使用这个值,并不需要修改,所以传值
		if (is_prime(i) == 1)
			printf("%d ", i);
	}
	return 0;
}

  2. 写一个函数判断一年是不是闰年。

#include<stdio.h>
int is_leap_year(int year)
{
	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
		return 1;
	return 0;
}
int main()
{
	int year = 0;
	scanf("%d", &year);
	//判断闰年
	//由于这里只是使用这个值,并不需要修改,所以传值
	if (is_leap_year(year) == 1)
		printf("%d年是闰年!", year);
	return 0;
}

3. 写一个函数,实现一个整形有序数组的二分查找。

#include<stdio.h>
int binary_search(int arr[],int sz,int k)
{
	int left = 0;
	int right = sz - 1;

    //int mid = (left + right) / 2;//容易超出int类型的范围
	int mid = left + (right - left);
	while (left<=right)
	{
		if (arr[mid] > k)
			right = mid - 1;
		else if (arr[mid] < k)
			left = mid + 1;
		else
			return mid;
	}
	return -1;
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int k = 5;
	//二分查找k值
	//由于这里只是使用这个值,并不需要修改,所以传值
	int ret = binary_search(arr, sz, k);
	if (ret == -1)
		printf("没找到!\n");
	else
		printf("找到了,下标是:%d\n", ret);
	return 0;
}

4. 写一个函数,每调用一次这个函数,就会将 num 的值增加1。

​#include<stdio.h>
void num_addtion(int* n)
{
	*n += 1;
}
int main()
{
	int num = 0;
	//每次调用函数num都会+1
	//由于这里需要修改num的值,所以传址
	num_addtion(&num);
	printf("%d\n", num);

	num_addtion(&num);
	printf("%d\n", num);

	num_addtion(&num);
	printf("%d\n", num);
	return 0;
}

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

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

相关文章

Vue的路由实现:hash模式 和 history模式原理及区别

目录标题 1、hash模式2、history模式 Vue-Router有两种模式: ** hash 模式和 history**模式。默认的路由模式是hash模式。 1、hash模式 简介&#xff1a;hash模式是开发中默认的模式&#xff0c;它的URL带着一个#&#xff0c;例如:http://www.abc.com/#/vue&#xff0c;它的…

从广交会,看懂海尔智家逆势增长的秘密

中国企业的全球化战略应从何处、以何种方式推进&#xff1f;作为行业全球化最彻底的企业&#xff0c;海尔智家是个很好的参考。 4月15日&#xff0c;在第133届中国进出口贸易交易会&#xff08;以下简称“广交会”&#xff09;上&#xff0c;海尔智家展示了其扎根本土&#xf…

Learning Dynamic Facial Radiance Fields for Few-Shot Talking Head Synthesis 笔记

Learning Dynamic Facial Radiance Fields for Few-Shot Talking Head Synthesis 笔记 摘要 Talking head synthesis is an emerging technology with wide applications in film dubbing, virtual avatars and online education. Recent NeRF-based methods generate more n…

举个栗子~Tableau 技巧(253):让筛选器只显示全部以及需要的类别

用户反馈了一个需求&#xff1a;我的业务数据有很多类别&#xff0c;但其实经常查看的只有几个&#xff0c;Tableau 筛选器能不能设置一下&#xff0c;只显示全部和经常查看的那几个类别&#xff1f; 这个是可以实现的&#xff01;如下示例&#xff0c;数据类别有&#xff1a;…

好用的思维导图软件有哪些

ProcessOn &#xff0c;一款让“工具回归工具、让你回归你的"软件&#xff01; 当“在线”成为当今时代的主流时、 如果让你选择一款好用的思维导图软件、 你希望Ta 是什么样的&#xff1f; ProcessOn&#xff01; 它可以是你的待办清单、笔记工具、社区分享工具、PPT演…

vector(入门知识点)

目录 vector的介绍 ​编辑 例&#xff1a;遍历 拷贝&#xff1a; 初始化&#xff1a; 反向迭代器&#xff1a; 扩容&#xff1a; insert与erase vector的介绍 例&#xff1a;遍历 拷贝&#xff1a; 初始化&#xff1a; &#xff08;10个1&#xff09; vector<int>注意…

Jetpack Compose 中使用分页 API 调用的无限滚动

Jetpack Compose 中使用分页 API 调用的无限滚动 最近&#xff0c;我在DashCoin 的硬币屏幕上添加了一个带有分页 API 调用的无限滚动。它使浏览硬币列表变得非常困难&#xff0c;并且确实减少了初始加载时间&#xff0c;比以前少了。如果没有正确实施&#xff0c;实施无限滚动…

基数排序详解

本期内容是对之前排序内容的一部分补充&#xff0c;需要有一定的基础 (14条消息) 万字解析&#xff0c;带你深入掌握多种排序算法&#xff01;-C语言-CSDN博客 基数排序 基数排序&#xff08;Radix Sorting&#xff09;是和前面所述各类排序方法完全不相同的一种排序方法。从…

【C++】面试官:你小子,继承与多态的题你都会

文章目录 前言一、理论知识类二、编程题选择类 前言 上一篇文章我们详细了介绍了多态&#xff0c;用汇编一步一步的查看了多态的实现原理&#xff0c;讲解了这么多理论知识该做一些面试题了&#xff0c;这些面试题都是历年来大厂所出的笔试题&#xff0c;希望大家可以把我今天…

php动态密码和加密解密函数的使用(动态密码、Discuz核心函数AuthCode、任意输入密码验证)

php加密解密的使用 一、项目说明二、项目分析1.js外部文件2.HTML容器构建3.layui前端验证4.php后端验证封装函数密码验证规则strpos内置函数 三、经典的核心加密函数1.Discuz!开发之核心加密解密函数2.常用简单加密解密函数 一、项目说明 在开发大屏时&#xff0c;需要在前端输…

【Linux】4、Linux 的用户、用户组和权限等

目录 一、Linux 的 root 用户二、切换用户相关命令(1) su(2) sudo 三、用户和用户组(1) 用户组命令(2) 用户相关命令(3) 查看当前系统中有哪些用户和用户组 四、认识权限控制信息(1) 权限控制信息分析(2) chmod 命令(3) 权限的数字序号(4) chown 命令 一、Linux 的 root 用户 …

【Android入门到项目实战-- 6.2】—— 如何访问其他应用程序的数据?

目录 一、ContentResolver基本用法 如何查询&#xff1f; 如何向表中添加一条数据&#xff1f; 如何更新这条新添加的数据&#xff1f; 如何删除这条数据&#xff1f; 二、读取系统联系人 要想你的APP访问其他应用程序的数据&#xff0c;需要使用内容提供器&#xff0c;下面使…

Springboot结合线程池的使用

1.使用配置文件配置线程的参数 配置文件 thread-pool:core-size: 100max-size: 100keep-alive-seconds: 60queue-capacity: 1配置类 Component ConfigurationProperties("thread-pool") Data public class ThreadPoolConfig {private int coreSize;private int ma…

数据结构与算法(三):数论(树形结构、二叉树、二叉搜索树、红黑树、Btree、B+Tree、赫夫曼树、堆树)

数论&#xff08;树形结构、二叉树、二叉搜索树、红黑树、Btree、BTree、赫夫曼树、堆树&#xff09; 树形结构概念 在树形结构里面重要的术语&#xff1a; 结点&#xff1a;树里面的元素。 父子关系&#xff1a;结点之间相连的边 子树&#xff1a;当结点大于1时&#xff0…

19学习提升:gRPC源码中的那些优秀设计(上)

gRPC作为高性能的RPC框架,离不开它优雅的设计和编码,无论是作为一名底层开发者还是上层的业务开发者,能够写出一手好的代码一直都是决定自身水平高低的一个重要体现,如果想要达到一个较高层次的水平,离不开长时间的学习和训练以及不断的感悟,而一些优秀的开源软件和框架往…

Idea 配置 maven 离线使用

首先&#xff0c;项目中的依赖已经下载到本地仓库&#xff0c;在没有网络或者没办法连通公司的maven仓库时&#xff0c;需要配置离线使用。 1. 配置 setting.xml 在 maven 使用的 setting.xml 文件中&#xff0c;加入以下配置。 默认在 maven安装目录下的 conf 文件夹下 。 &…

Web安全 XSS靶场搭建(玩转整个XSS环境.)

Web安全 XSS靶场搭建 XSS又叫CSS&#xff08;Cross Site Script&#xff09;跨站脚本攻击&#xff0c;指的是攻击者在Web页面&#xff0c;插入恶意JS代码&#xff0c;当用户浏览该页之时&#xff0c;嵌入其中JS代码就会被执行&#xff0c;从而达到攻击的目的.&#xff08;包含&…

美颜sdk开发实践:如何构建美颜sdk功能?

美颜功能是现今很多应用中必不可少的一项功能。而要实现美颜功能&#xff0c;除了自己编写美颜算法外&#xff0c;还可以使用美颜sdk来实现。本文将介绍如何从零开始构建美颜功能&#xff0c;利用美颜sdk实现美颜效果。 一、简介 美颜sdk可以向用户提供多种美颜效果&#xff…

HopeHomi脚手架(五)远程调用Feign与Sentinel

代码示例 cloudB cloudA-api cloudA feign对象注册源码解析 FeignClientsRegistrar FeignClientsRegistrar实现了ImportBeanDefinitionRegistrar 当启动类自动扫描构造beanDefinition的时候&#xff0c;进行beanDefinition注册 ImportBeanDefinitionRegistrar回调registerB…

TryHackMe-Second(boot2root)

Second 排名第二并不是一件坏事&#xff0c;但在这种情况下并非如此。 端口扫描 循例nmap Web枚举 进到8000 注册个账号进去&#xff0c;没啥用 二次注入 虽然登录框那里没有sql注入&#xff0c;但是可以尝试注册个非法账户名尝试二次注入 登录进去之后使用单词计数器 说明…