C语言初阶-函数(2)

目录

一.函数的调用

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

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

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

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

二.函数与变量的声明与定义

1.函数

2.变量

三.函数的嵌套调用和链式访问

1.嵌套调用

2.链式访问

(1)strcat函数

(2)printf函数


一.函数的调用

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

#include
//求100-200之间的素数
//是返回1,不是返回0
is_prime(int n) {
	int j = 0;
	for (j = 2; j <= sqrt(n); j++)
	{
		if (n % j == 0)
			return 0;
	}
	return 1;//要放在外面,只有当n整除了2到n-1的数,无法整除才能证明n是素数

}
int main()
{
	int i = 0,cnt=0;
	for (i = 100; i <= 200; i++)
	{
		if (is_prime(i) == 1)
		{
			cnt++;
			printf("%d ", i);
		}
	}
	printf(" 100-200间共有素数:%d", cnt);
}

说明一下,j<=sqrt(n)。当m=a*b,a和b至少有一个数字是<=√n,可以优化代码,提高效率。(只需要遍历前面的元素,比n小的遍历完,后面就不用遍历了。)

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

打印1000-2000的闰年,cnt是计数器;

#include
is_leap_year(int year)
{
	return ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0));
}
int main()
{
	int y = 0;
	int cnt = 0;
	for (y = 1000; y <= 2000; y++)
	{
		if (is_leap_year(y)) {
			cnt++;
			printf("%d ", y);
		}
	}
	printf(" %d", cnt);
}

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

//二分查找binary_search
int binary_search(int arr[],int k,int sz)
{
   //sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0;
	int right = sz - 1;
	 //printf("%d %d \n", sizeof(arr),sizeof(arr[0]));
	while (left <= right) {
		int mid = (left + right) / 2;
		if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else {
			return mid;
		}
	}
	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]);
	//找到了就返回下标
	//找不到返回-1
	//计算数组的元素个数

	//printf("%d\n", sizeof(arr));//40,这里计算整个数组的大小,单位是字节
	//printf("%d\n", sizeof(arr[0]));//4,计算数组第一个元素的大小,单位是字节
	int pos = binary_search(arr,k,sz);
	if (-1 == pos)
		printf("找不到\n");
	else
		printf("找到了,下标是:%d\n", pos);
	return 0;

}

注意:

sz的值要在main函数里算完再传过去,否则在自定义函数内算的sizeof(arr)的大小是指针大小,在32位机器上所占字节数是4,sizeof(arr[0])一个int元素所占字节是4,4/4=1,结果错误。

 C语言初阶-函数(2)_第1张图片

C语言初阶-函数(2)_第2张图片

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

void Add(int* p)
{
	//*p = *p+1;
	(*p)++;//要加括号,++的优先级高于*
}
int main()
{
	int num = 0;
	Add(&num);//取地址远程操作
	printf("%d\n", num);//1
	Add(&num);
	printf("%d\n", num);//2
	Add(&num);
	printf("%d\n", num);//3
	return 0;
}

二.函数与变量的声明与定义

1.函数

(1)声明

//函数的声明
int add(int x, int y);

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	//求和
	int ret = add(a, b);
	printf("%d\n", ret);

	return 0;
}

(2)定义

//函数的定义
//函数的定义也是一种特殊的声明
int add(int x, int y)
{
	return x + y;
}

2.变量

(1)声明:有定义的时候使用它,叫变量的声明,放在开头,已经初始化了变量

//变量的声明,下面有赋值
int g_val;
//全局变量不初始化的时候,默认是0

int main()
{
	printf("g_val = %d\n", g_val);

	return 0;
}

//变量的定义
int g_val = 2022;

(2)定义:没有定义的时候使用它就叫变量的定义,没有初始化变量。


//定义,//没有赋值
int val;
//全局变量不初始化的时候,默认是0
int main()
{
	printf("%d\n", val);
	return 0;
}

三.函数的嵌套调用和链式访问

1.嵌套调用

可理解为像乐高一样拼起来,你调用我,我调用你。一个程序就是由函数嵌套调用组成的(包括main函数)。

#include 
void m()
{
	printf("hehe\n");
}
void test()
{
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		m();
	}
}
int main()
{
	test();
	return 0;
}

函数可以嵌套调用,但是不能嵌套定义。

2.链式访问

把一个函数的返回值作为另外一个函数的参数。

链式访问
#include
#include 

int main()
{
	char arr[20] = "hello";
	int len = strlen(strcat(arr,"world"));//返回字符的个数
	printf("%s\n", arr);
	printf("%d\n",len);

	return 0;
}

(1)strcat函数

char *strcat(char *destination, const char *source) 把 source 所指向的字符串追加到 destination 所指向的字符串的结尾

C语言初阶-函数(2)_第3张图片

(2)printf函数

printf函数的返回值是打印在屏幕上字符的个数 

#include C

int main()
{
	char arr[20] = "hello";
	int len = strlen(strcat(arr,"world"));//返回字符的个数
	printf("%s\n", arr);
	printf("%d\n",len);

	return 0;
}

C语言初阶-函数(2)_第4张图片

你可能感兴趣的:(函数初阶,学习笔记,c语言)