[C语言] 函数:库函数--自定义函数--函数的调用--练习--详解<个人>------(1)

article/2025/8/28 5:54:03

文章目录

  • 前言
  • 一. 函数是什么?
  • 二. C语言中函数的分类
  • 三. 库函数
  • 四. 自定义函数
  • 五. 函数的调用
  • 六. 练习
  • 总结



前言

本节内容主要记录函数的相关内容,其中包括:库函数,自定义函数,函数的调用,函数的习题练习。

在上节的循环语句中加入了 goto语句,有兴趣的朋友们可以去了解了解,有一个小整蛊哦。

循环语句链接:

[ C语言 ]循环语句---while---for---do while---详解及练习题巩固_小白又菜的博客-CSDN博客

本篇文章开始之前,首先感谢大家的关注和支持,让我人生首次在一件事情上粉丝破千!!!(真的想象不到)

         其实我开始写博客的初衷是记录自己的学习过程,通过写博客的方式对知识进行再次总结,加深自己对知识的记忆,我现在的目的如此,以后仍然是!每每看到关注量,浏览量这些数据增加,都会让我变得开心,这是大家给予我的一份肯定。在此,感谢各位一直以来的支持,我以后也会对自己的知识记录更加详细,更加丰富,在记录我进步的同时,希望大家通过看到我的博客也会进步。我们一起朝着自己的大厂梦前进吧!!!

 话不多说,上车!!!

———————————————————————————————————————————                                                            ****正文开始****

一. 函数是什么?

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

二. C言中函数的分类。

1.   库函数
2.   自定义函数

三. 库函数

Q : 为什么会有库函数?

A :

1. 我们知道在我们学习C语言编程的时候,总是在一个代码编写完成之后迫不及待的想知道结果,想把这个结果打印到我们的屏幕上看看。这个时候我们会频繁的使用一个功能:将信息按照一定的格式打印到屏幕上(printf)。

2. 在编程的过程中我们会频繁的做一些字符串的拷贝工作(strcpy)。

3. 在编程是我们也计算,总是会计算nk次方这样的运算(pow)。

像上面我们描述的基础功能,它们不是业务性的代码。我们在开发的过程中每个程序员都可能用的到,为了支持可移植性和提高程序的效率,所以C 语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。
那怎么学习库函数呢?
会查询工具: MSDN(Microsoft Developer Network)
在这里给大家分享两个链接:
1 >  ​​​​​​cplusplus.com - The C++ Resources Network
2 >  cppreference.com       

i>举例:strlen

代码:

#include <stdio.h>
#include <string.h>
int main() {char arr[] = "abc";// size_t  -> unsigned intsize_t len = strlen(arr);printf("%u\n", len);// %d  - 有符号// %u  - 无符号 (没有负数)return 0;
}

ii>举例:strcpy

代码演示:

#include <stdio.h>
#include <string.h>
int main() {char arr1[20] = { 0 };//  目的地char arr2[] = "hello" ;// 源数据strcpy(arr1, arr2);printf("%s\n",arr1);return 0;
}

结果:

我们发现本来是空的arr1中拷贝了arr2中的"hello"

iii>举例:memset

代码演示:

#include <stdio.h>
#include <string.h>
int main(){char arr[] = "hello world";memset(arr, 'x', 5);printf("%s\n", arr);return 0;}

演示结果:

简单的总结,C语言常用的库函数都有:
IO函数
字符串操作函数
字符操作函数
内存操作函数
时间/日期函数
数学函数
其他库函数

四. 自定义函数

1> 自定义函数存在的意义:

由于库函数不能干所有的事情,所以更加重要的是自定义函数

2>函数的组成

自定义函数和库函数一样,有函数名,返回值类型和函数参数。
但是不一样的是这些都是我们自己来设计。

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

3>举例

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

代码:

// 写一个函数,找出两个数的最大值
//返回类型   函数名   参数
int get_max(int x, int y) {int z = 0;z = (x > y ? x : y);return z;
}int main() {int a = 0;int b = 0;scanf("%d %d", &a, &b);int m = get_max(a, b);printf("%d\n", m);return 0;
}

演示结果:

二:写一个函数可以交换两个整形变量的内容。

按照我们正常的书写代码如下:

void Swap1(int x, int y) {int  temp = 0;temp = x;x    = y;y    = temp;
}
int main() {int a = 0, b = 0;scanf("%d %d", &a, &b);// 交换两个变量printf("交换前a = %d, b = %d\n", a, b);Swap1(a,b);   // 传值调用printf("交换后a = %d, b = %d\n", a, b);return 0;
}

正确的写法:

 正确写法    使用指针
void Swap2(int* pa,int* pb) {int t = 0;t = *pa;*pa = *pb;*pb = t;}
int main() {int a = 0, b = 0;scanf("%d %d", &a, &b);// 交换两个变量printf("交换前a = %d, b = %d\n", a, b);Swap2(&a,&b); // 传址调用printf("交换后a = %d, b = %d\n", a, b);return 0;
}

结果演示:

我们观察这段代码发现,a和b并没有交换。

失败的原因是:a 和 b 是实参 , x 和 y 是形参。当函数调用的时候,实参传给形参,形参其实是实参的一份临时拷贝。所以对形参的修改,不会影响实参。

实际参数(实参):
真实传给函数的参数,叫实参。
实参可以是:常量、变量、表达式、函数等。
无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形
参。
形式参数(形参):
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元)
所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效
上面 Swap1 Swap2 函数中的参数 x y px py 都是 形式参数 。在 main 函数中传给 Swap1 的 a ,b和传给 Swap2 函数的 &a  &b  实际参数
这里我们对函数的实参和形参进行分析:

代码对应的内存分配如下:

这里可以看到 Swap1 函数在调用的时候, x y 拥有自己的空间,同时拥有了和实参一模一样的内容。
所以我们可以简单的认为: 形参实例化之后其实相当于实参的一份临时拷贝

五. 函数的调用

1>传值调用

函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。

2>传址调用

传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。

六. 练习

一:写一个函数可以判断一个数字 是不是素数

 //is_prime()//是素数返回 1 ,不是素数返回 0
int is_prime(int n) {// 2 ~ n-1 的数字试除int j = 0;for (j = 2; j <= sqrt(n); j++) {if (n % j == 0) {return 0;}}return 1;}int main() {int i = 0;for (i = 100; i <= 200; i++) {// 判断 i 是否为素数 - 如果是素数就打印// i 取 100 - 200if (is_prime(i) == 1) {printf("%d ", i);}}return 0;
}

演示结果:

二:写一个函数判断一年是不是闰年

 //写一个函数判断一年是不是闰年//是闰年 返回1 不是闰年 返回0
int is_leap_year(int y) {//if (y % 100 != 0 && y % 4 == 0 || y % 400 == 0) {//	return 1;//}//else {//	return 0;//}return (y % 100 != 0 && y % 4 == 0 || y % 400 == 0);
}
int main() {int y = 0;for (y = 1000; y <= 2000; y++) {// 判断 y 是不是闰年if (is_leap_year(y) == 1) {printf("%d ",y);}}return 0;
}

代码演示结果:

三: 写一个函数 ,实现一个整形有序数组的二分查找

//写一个函数 ,实现一个整形有序数组的二分查找
//如果找到了返回 下标
//如果找不到返回  -1 
int binary_search(int arr[], int k,int sz) {int left = 0;int right = sz - 1;while (left<=right) {int mid = (left + right) / 2;if (arr[mid] < k) {left = mid + 1;}else if (arr[mid] > k){right = mid - 1;}else if (left == right) {return mid;}}return -1;}
int main() {int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int k = 7;int sz = sizeof(arr) / sizeof arr[0];//      40        /  4// 数组arr传给binary_search函数的时候,其实传递的arr数组首元素的地址int ret = binary_search(arr,k,sz); // 在arr数组中找kif (-1 == ret) {printf("找不到\n");}else {printf("找到了,下标是%d\n", ret);}return 0;
}

代码演示结果:

四:实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定

如:输入9,输出9 * 9口诀表,输出12,输出12 * 12的乘法口诀表。

void Multiplication_formula_table(int i, int j,int n) {for (i = 1; i <= n; i++) {for (j = 1; j <= i; j++) {printf("%d*%d=%d ", j, i, i* j);}printf("\n");}
}
int main() {int n = 0;scanf("%d",&n);int i = 0;int j = 0;Multiplication_formula_table(i ,j,n);return 0;
}

结果演示:

                 

                                                     ****正文结束**** 

——————————————————————————————————————————


总结

本篇文章的内容就记录完毕,由于本人技术水平有限,若各位读者发现错误,欢迎及时纠正。


http://chatgpt.dhexx.cn/article/j5NlI1et.shtml

相关文章

C语言中的函数 | 库函数和自定义函数

写在前面: 今天我们需要学习和了解的是C语言中的函数,其中C语言的函数划分为库函数和自定义函数两种.接下来我们一起探究两者之间的关系. 一.C语言中函数的分类 库函数自定义函数 二.库函数 库函数到底是什么呢? 顾名思义,可以通俗的理解为库里面的函数.这些函数都是频繁使…

c++自定义函数简单介绍

大家好&#xff0c; 今天给大家介绍一下自定义函数。 如有错误请在评论区指出 正文&#xff1a; 1.简单介绍&#xff1a; 函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数&#xff0c;即主函数 main() &#xff0c;所有简单的程序都可以定义其他额外的函数…

C语言入门系列 - 自定义函数

C语言入门系列 - 自定义函数 第一节 C 语言基础以及基本数据类型 第二节 C 语言运算符 第三节 C 语言控制语句 第四节 C 语言自定义函数 第五节 C 语言修饰变量的关键字 第六节 C 语言构造数据类型–数组 第七节 C 语言字符串 第八节 C 语言指针 第九节 指针与函数、指针函数、…

C语言-函数(自定义函数)

C语言中函数的分类&#xff1a; 1 库函数 2 自定义函数 自定义函数 如果库函数能干所有的事情&#xff0c;那还要程序员做什么&#xff1f; 所以更重要的是自定义函数 函数的组成&#xff1a; ret_type fun_name (part1) { statement; //语句项 &#xff08;函数体&…

C语言自定义函数使用

补充1&#xff1a;优先级&#xff0c;解答问题区分*p,*p0,*p0 <1>.首先要理解前后置的区别&#xff0c;前置&#xff0c;先计算后使用&#xff1b;后置&#xff0c;先使用后计算。 可用示例理解&#xff1a; <2>.其次要理解操作符的优先级 优先级从高到低&#…

C语言【库函数与自定义函数】详解

文章目录 一.什么是函数二.库函数1. 什么是库函数2. 为什么会有库函数&#xff1f;3.使用库函数的注意事项4.对学习库函数的建议 三.自定义函数1.什么是自定义函数2.自定义函数举例 一.什么是函数 提起函数&#xff0c;我们可能并不陌生&#xff0c;我们可能会联想到数学中的函…

C语言中的函数(重点介绍自定义函数)

C语言中的函数分为库函数和自定义函数&#xff0c;本篇重点介绍自定义函数中的函数调用 函数由一个或多个语句块组成&#xff0c;负责完成某项特定任务&#xff0c; 相较于其他代码&#xff0c;具有相对的独立性&#xff0c;一般会有返回值和输入参数&#xff0c;提供对过程的封…

C语言自定义函数的声明

C语言函数为什么要声明呢&#xff1f;我们在创建自定义函数的都知道要将自定义子函数放在主函数前面那么是为什么呢&#xff1f;可不可以不放在前面呢&#xff1f;小问号你是不是也一样有很多朋友呢&#xff1f; 答案是可以不把我们自己的自定义子函数放在前面&#xff1f;但是…

c语言函数详解1——自定义函数

这篇文章理论性知识比较多&#xff0c;不过对于初学者对于函数的理解会有更深层次的帮助 目录 c语言的函数——子程序 自定义函数 c语言的函数——子程序 *是大型程序中的某部分代码&#xff0c;由一个或者多个语句组成&#xff0c;她负责完成某项特定的任务&#xff0c;相较…

自定义函数

目录 一、自定义函数 二、函数参数 、传值调用和传址调用 2、1 传值调用 2、2 传址调用 三、函数的嵌套和链式访问 四、函数递归 一、自定义函数 C语言中有两类函数&#xff0c;一类是库函数&#xff0c;另外一类是自定义函数。自定义函数从字面意思上理解就是自…

C语言自定义函数

函数定义 return_type function_name([datatype1 arg1],[datatype1 arg2],...) { //函数体 } 函数三要素 返回值类型 函数名 参数列表 自定义函数的完整写法 #include <stdio.h> // 函数原型 int sum(int,int); // 调用函数 int main() { int sum(); } // 函数定义 i…

学习pyqt 继承中self的疑问

前面学习了&#xff0c;面对对象编程&#xff0c;继承&#xff0c;有了一些理解。继续学习pyqt5 看到下面有了一些疑问。 import sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtGui import QIconclass Example(QWidget):def __init__(self):super().…

Python中类函数中self是什么

首先我们来看两组代码运行的结果 代码组一&#xff1a; class C1:def func1():x10print("func1的x&#xff1a;",x)def func2(self):x20print("func2的x&#xff1a;",x)C1.func1() C1.func2()结果如下 代码组二&#xff1a; class C1:def func1():x…

python中return self用法详解

直接上代码来理解return self的用法&#xff01; 示例代码1&#xff1a; class Test(object):def __init__(self):self.age 25def add(self):self.age 1print(self.age)obj Test() obj.add()运行结果&#xff1a; 有时候当我们想对实例对象的方法进行连续调用时&#xff0…

Python——self参数

self 的意思是“自己”,表示的是对象自身,当某个对象调用成员方法的时候,Python 解释器会自动把当前对象作为第1个参数传给 self ,用户只需要传递后面的参数就可以了。 self 参数的应用&#xff1a; #program0706.py self 参数的应用 class Animal:类中未定义构造方法&#x…

php 中self什么意思,php中self的用法是什么

php中self的用法&#xff1a; self是指向类本身&#xff0c;也就是PHP self关键字是不指向任何已经实例化的对象&#xff0c;一般self使用来指向类中的静态变量。 1、self可以访问本类中的静态属性和静态方法&#xff0c;可以访问父类中的静态属性和静态方法。 相关推荐&#x…

纯C++实现24位bmp格式图片的读取和修饰

问题:现有一张bmp图片,要求将它读取到程序中并进行灰度化、水平翻转、模糊、茶色滤镜四种效果的一种,并输出新图片,如下所示: 命令行输入: 其中: 参数1:-b/g/s/r,先后表示blur(模糊),grey(灰度化),sepia(褐色),row reverse(水平翻转) 参数2:源文件名 参数3:新文…

SE78上传BMP格式图片出错,出错信息提示上传的不是BMP格式图片

如下图&#xff0c;导入文件为一BMP图片(红框部分), 然后点击确认键&#xff08;黑框部分&#xff09;。 结果却出错&#xff0c;提示不是BMP文件&#xff0c;如下图红框部分。 很纳闷明明是BMP怎么就提示说不是BMP呢&#xff1f;感觉应该是上传的图片有问题&#xff0c;所以想…

C++读取bmp格式图片

类的格式按照bmp的文件头、信息头、调色板和数据域写好即可 因为图片是按字节读的&#xff0c;所以要强制让编译器不对结构体进行字节对齐&#xff0c;否则会出错 因为bmp格式规定存储时每行的像素数要补齐至4的整数倍&#xff0c;所以读入和写出时要加一些对应的操作 ————…

android 图片格式,常见图片格式详解

做了几年有关图形、图像的工作,对图片格式算是小有经验,在此写成一文章总结下。虽然一开始并不想讲很理论的东西,但写完后发现几乎全是理论,细想一下关于图片格式的知识本身就是理论的东西,囧~~ 那就力求用最简单的方式将这些“理论”讲清楚吧。 常见的图片格式有bmp, jpg…