八、函数(1)

1.函数的基本概念

函数包括:函数名,返回值类型,参数

        库函数

函数

        自定义函数

2.库函数

C语言本身自带的函数,使用库函数,需要声明头文件。

(1)strcpy函数

字符串拷贝函数     <string.h>

strcpy(目的地,源头)//要保证源头<=目的地1,否则溢出。

例:strcpy(arr2,arr1)//将arr1中的内容拷贝给arr2,连带 \0 也会被拷贝过去,作为字符串结束的标志。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
//strcpy函数
int main()
{  
	char arr1 [] = "hello";
	char arr2 [] = "###########";
	strcpy(arr2,arr1);
	printf("%s\n",arr2);
	printf("%s\n",arr1);
	return 0;
}

(2)memset函数

memset(地址,valve,num);

地址通常是字符数组名(首元素地址)        

把地址后num个字节设置成valve这个值,所以通常是对字符串数组内容替换修改。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
//memset函数
int main()
{  
	char arr [] = "Hello,World!";
	memset(arr,'2',2);
	printf("%s\n",arr);
	return 0;
}
	

3.自定义函数

自定义函数:

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

                        {

                              函数体;  

                        }

(1)交换两个整型变量的内容

                实参

函数参数                

                形参

形参和实参占不同的内存块,当实参传给形参时,形参只是实参的一份临时拷贝,对形参的改变不会影响实参。

形参就好比是一个戏中的角色是唯一的

实参就好比是一个戏中的演员,并不唯一。

传值调用:例:Swap(a,b);

                         void Swap(int x,int y);

                        形参改变不会改变实参

传址调用:例:Swap(&a,&b);

                        void Swap(int* x,int* y);        

                        形参改变会改变实参

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
//交换两个整型变量的内容
void Swap (int* x,int* y)
{
	int tmp = 0;
	tmp = *x;
	*x = *y;
	*y = tmp;
}
int main()
{	
	int a = 0;
	int b = 0;
	printf("a=");
	scanf("%d",&a);
	printf("b=");
	scanf("%d",&b);
	Swap(&a,&b);
	printf("交换后为:\n");
	printf("a=%d\n",a);
	printf("b=%d\n",b);
	return 0;
}
	

(2)判断素数

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
//判断素数
void is_prime (int x)
{
	int i = 0;
	for(i=2;i<=sqrt(x*1.0);i++)
	{
		if(x%i==0)
			{
				printf("该数不是素数\n");
				break;
			}	
	}
	if(i>sqrt(x*1.0))
	{
		printf("该数是素数\n");
	}
}
int main()
{	
	int a = 0;
	printf("请输入要判断的数:");
	scanf("%d",&a);
	is_prime(a);
	return 0;
}
	

(3)判断闰年

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
//判断闰年
void is_leap_year (int x)
{
	if((x%4==0 && x%100!=0)||(x%400==0))
	{
		printf("%d是闰年\n",x);
	}
	else 
	{
		printf("%d不是闰年\n",x);
	}
}
int main()
{	
	int year = 0;
	printf("请输入年份:");
	scanf("%d",&year);
	is_leap_year(year);
	return 0;
}
	

(4)整形有序数组的二分查找

数组元素地址连续,在函数传参时,数组只传数组首元素地址。(数组名为数组首元素地址)

所以在函数外部计算好数组元素个数后再传入函数内部

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
//整型有序数组的二分查找函数
void binary_search (int arr [],int k,int sz)
{
	int left = 0;
	int right = sz-1;
	int mid = 0;
	while(left<=right)
	{
		mid=(left+right)/2;
		if(arr[mid]>k)
		{
			right=mid-1;
		}
		else if(arr[mid]<k)
		{
			left=mid+1;
		}
		else if(arr[mid]==k)
		{
			printf("这个数下标为%d\n",mid);
			break;
		}
	}
	if(left>right)
	{
		printf("不存在这个数\n");
	}
}
int main()
{	
	int arr [] = {1,2,3,4,5,6,7,8,9,10};
	int k = 0;
	int sz = (sizeof(arr)/sizeof(arr[0]));
	printf("请输入要查找的数:");
	scanf("%d",&k);
	binary_search(arr,k,sz);
	return 0;
}
	

(5)每调用一次函数,num的值加1

传址调用 -> 解引用操作   (*p)++;

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
//每调用一次函数,num的值加1
void Add (int* p)
{
	(*p)++;
}
int main()
{	
	int num = 0;
	Add(&num);
	printf("num=%d\n",num);
	Add(&num);
	printf("num=%d\n",num);
	Add(&num);
	printf("num=%d\n",num);
	return 0;
}
	

4.函数的嵌套调用

函数嵌套:在一个函数内部调用另一个函数

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
//函数的嵌套调用
void new_line ()
{
	printf("hehe\n");
}
void three_line ()
{
	int i = 0;
	for(i=0;i<3;i++)
	{
		new_line();
	}
}
int main()
{	
	three_line();
	return 0;
}
	

5.函数的链式访问

链式访问:把一个函数的返回值作为另一个函数的参数

例:printf函数的返回值是打印字符的个数,\n也算。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
//函数的链式访问
int main()
{	
	printf("%d\n",printf("%d\n",printf("%d\n",43)));
	printf("%d",printf("%d",printf("%d",43)));
	return 0;
}
	

6.函数的声明、定义、调用

.c主函数源文件中调用自定义函数用"  ",例:#include "Add.h"

(1)函数声明

.h函数头文件

#define _CRT_SECURE_NO_WARNINGS 1
//函数声明
int Add (int x,int y);

(2)函数定义

.c函数定义源文件

#define _CRT_SECURE_NO_WARNINGS 1
//函数定义
int Add (int x,int y)
{
	int z = x+y;
	return z;
}

(3)函数调用

.c主函数源文件

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include "Add.h"
//函数调用
int main()
{	
	int a = 0;
	int b = 0;
	int sum = 0;
	printf("a=");
	scanf("%d",&a);
	printf("b=");
	scanf("%d",&b);
	sum=Add(a,b);
	printf("sum=%d\n",sum);
	return 0;
}

7.思维导图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值