文章目录
前言
函数,库函数,自定义函数,函数的参数,函数的调用的整体简单介绍,以及一些小案例,函数的嵌套调用,函数的链式访问等。
一、函数
以下为函数在网络上的定义:需要慢慢理解
- 在计算机科学中,子程序(函数),是一个大型程序中的某部分代码,由一个或多个语句块组成。她负责完成某项特定任务,而且较于其他代码,具备相对的独立性。
- 一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软件库。
- c语言有库函数和自定义函数。
二、库函数
- 库函数在使用时要注意引入对应的#include 头文件。
三、自定义函数
- 自定义函数需要有函数名,函数参数,函数体,以及函数返回值类型的定义。
函数返回值类型 函数名(函数参数)
{
函数体;
}
代码如下(示例):
void change(int x, int y)
{
int z = 0;
z = x;
x = y;
y = z;
}
四、函数的参数
1.函数的实参
- 函数的实参是实际传入函数的参数。
- 函数的实参可以是常量,变量,表达式,函数等等。
- 在函数调用时,作为实参的函数必须确定一个返回值。
2.函数的形参
- 函数的形参只有在函数被调用时才会分配空间(内存单元)。函数执结束就会被销毁。
- 所以说形参是实参的一份临时拷贝。形参的改变不能影响实参。
五、函数的调用
1.传值调用
- 将变量的值直接传递给形参,称为传值调用。
#include <stdio.h>
int get_sum(int x, int y)
{
return (x + y);
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int z = get_sum(a, b);
printf("%d", z);
return 0;
}
2.传址调用
- 把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
- 这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
#include <stdio.h>
// 交换两个数字
//void change(int x, int y)
//{
// int z = 0;
// z = x;
// x = y;
// y = z;
//}
//以上代码不能实现a b的交换
//形式参数是实际参数的一份临时拷贝,它有自己的存储位置和存储空间
//交换形参不会改变实参的位置
-------------------------------------------------------------------------------------------
void change(int* x, int* y)
{
int z = 0;
z = *x;
*x = *y;
*y = z;
}
int main()
{
int a = 0;
int b = 0;
//输入
scanf("%d %d", &a, &b);
//打印交换前的a b
printf("交换前a = %d, b = %d\n", a, b);
//交换
//change(a, b);
change(&a, &b);
//输出
printf("交换后a = %d, b = %d\n", a, b);
return 0;
}
六、小案例
1. 打印100-200之间的素数
- 判断一个数x是否为素数,可以通过判断2到x-1有没有能使x被整除的数。没有,则为素数,反之,则不是。
#include <stdio.h>
int main()
{
int i = 0;
int count = 0;
for (i = 100; i <= 200; i++)
{
// 判断是否素数
int j = 0;
int flag = 1;
for (j = 2; j <= i - 1; j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag)
{
count++;
printf("%d ", i);
}
}
printf("\ncount = %d", count);
return 0;
}
(1)对素数判断的优化:
-
- 偶数一定不是素数,奇数可能是素数。
-
- 如果一个数X不是素数,则一定存在<=sqrt(X)的数使得这个数被整除。
-
- 优化代码如下:
sqrt()是数学库函数,需要引入math.h头文件。
- 优化代码如下:
#include <stdio.h>
#include <math.h>
int main()
{
int i = 0;
int count = 0;
for (i = 101; i <= 200; i+=2) // 偶数不是素数,故从101开始
{
// 判断是否素数
int j = 0;
int flag = 1;
for (j = 2; j <= sqrt(i); j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag)
{
count++;
printf("%d ", i);
}
}
printf("\ncount = %d", count);
return 0;
}
(2)使用函数打印100-200之间的素数
#include <stdio.h>
#include <math.h>
// 定义判断素数的函数
int is_prime(int n)
{
int j = 0;
for (j = 2; j <= sqrt(n); j++)
{
if (n % j == 0)
{
return 0;
}
}
return 1;
}
int main()
{
int i = 0;
int count = 0;
for (i = 101; i <= 200; i += 2) // 偶数不是素数,故从101开始
{
// 判断是否素数
if (is_prime(i))
{
printf("%d ", i);
count++;
}
}
printf("\ncount = %d", count);
return 0;
}
2. 函数二分法查数字
- 数组作为参数传递时,传递的是数组首元素的地址,而不是整个数组。
- 所以在函数内部计算函数参数的数组的元素个数时不靠谱的。
// 定义二分法查找的函数
int MidSearch(int arr[], int num, int sz)
{
int left = 0;
int right = sz - 1;
do
{
int mid = left + (right - left) / 2;
if (arr[mid] > num)
{
right = mid - 1;
}
else if (arr[mid] < num)
{
left = mid + 1;
}
else
{
return mid;
}
} while (left <= right);
if (left > right)
{
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]);
// 调用函数查找
int n = MidSearch(arr, k, sz);
if (n == -1)
{
printf("没找到,数组中没有要找的值");
}
else
{
// 打印位置和值
printf("arr[%d] = %d", n, arr[n]);
}
return 0;
}
- 形参arr表面上是数组,本质上是指针变量。
- 所以,以上sz不能再函数内部计算。
3.调用函数增加变量值
//每调用一次函数,令变量值+1
#include <stdio.h>
void Add(int* p)
{
(*p)++;
}
int main()
{
int num = 0;
Add(&num);
printf("%d\n", num);
Add(&num);
printf("%d\n", num);
Add(&num);
printf("%d\n", num);
Add(&num);
printf("%d\n", num);
Add(&num);
printf("%d\n", num);
return 0;
}
七、函数的嵌套调用
- 函数可以嵌套调用,但不能嵌套定义。
- 代码示例如下:
void new_line()
{
printf("hello!!!\n");
}
void three_line()
{
int i = 0;
for (i = 1; i <= 3; i++)
{
new_line();
}
}
#include <stdio.h>
int main()
{
three_line();
return 0;
}
八、函数的链式访问
- 把一个函数返回值,作为另一个函数的参数。
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "abcdef";
int n = strlen(arr);
printf("%d\n", n);
// 链式访问
printf("%d\n", strlen("abcdef"));
printf("%d", printf("%d", printf("%d", 43)));// 输出结果为 4321
return 0;
}
总结
函数,库函数,自定义函数,函数的参数,函数的调用的整体简单介绍,以及一些小案例。比如打印100-200之间的素数,100-200之间的素数,函数二分法查常数位置等。