函数(1)
小白必看
基础知识+例题
函数
:子程序,输入参数有返回值,相对独立性
eg.
#include<stdio.h>
int Add(int x,int y)
{
int z=0;
z= x+y;
return z;
}
int main()
{
int a =10;
int b = 20;
int sum = Add(a,b);
printf("%d\n",sum);
return 0;
}
分类:
1.库函数(C语言本身提供)
2.自定义函数
库函数
IO函数
字符串操作函数
字符操作函数
内存操作函数
时间/日期函数
数学函数
其他库函数
strcpy
#include<stdio.h>
#include<string.h>
int mian()
{
char arr1[ ]=“Hellow“;
char arr2[20]=”###########";//’\0’也会拷贝过去
strcpy(arr2,arr1);
printf("%s\n",arr2);
//strcpy-string copy -字符串拷贝
//strlen -string lenth -字符串长度
return 0;
}
memset
内存-set-设置
#include<stdio.h>
#include<string.h>
int mian()
{
char arr[ ] = “hello world”;
memset(arr, ‘*’ , 5);
printf("%s\n",arr);
//***** world
return 0;
}
自定义函数
返回类型 函数名(函数参数)
{
语句项 //函数体,交代的是函数的实现
}
eg.
int Add(int x,int y)
{
int z=0;
z=x+y;
return z;
}
题1:找出两个数的最大值
int get-max(int x, int y)
{
if(x>y)
return x;
else
return y;
}
int main()
{
int a=20;
int b=19;
//函数的使用
int max = get-max(a,b);
printf(“max=%d\n”,max);
return 0;
}
题2:两数字交换
void Swap(int* x,int* y) //void–没有返回值
{
int tmp=0;
tmp=*x;
*x=*y;
*y=tmp;
}
int main()
{
int a=10;
int b=20;
printf(“a=%d,b=%d\n”,a,b);
Swap(&a,&b);//调用函数
printf(“a=%d,b=%d\n”,a,b);
return 0;
}
// 如果不用指针,函数内会自动申请一个新地址,无法返回值
函数的参数
实际参数:常量,变量,表达式,函数eg.Swap(&a,&b);
形式参数:变量eg.void Swap(int* x,int* y)
当实参传给形参时,形参时实参的一份临时拷贝,对形参的修改是不会改变实参的
函数的调用
传值调用
Swap(a,b);
传址调用 : 函数内部直接操作函数外部的变量
Swap(&a,&b);
练习
1.打印100-200的素数
//是素数返回91,不是返回0
int is-prime(int n)
{
// 2–>n-1
int j=0;
for(j=2 ; j<n ;j++)
{
if(n%j == 0)
return 0;
}
return 1;
}
int main()
{
int i=0;
for(i=100 ; i<=200 ;i++)
{
//判断i是否为素数
if(is-prime(i) == 1)
printf("%d",i);
}
return 0;
}
2.打印1000-2000的闰年
int is_leap_year(int y)
{
if((y%4 == 0) && (y%100 !=0) || (y%400 == 0))
return 1;
else
return 0;
}
int main()
{
int year =0;
for(year =1000 ; year<=2000 ; year++)
{
//判断year是否为闰年
if( 1== is_leap_year(year))
{
printf("%d",year);
}
}
return 0;
}
题3.有序数组的二分查找
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
{
return mid ;
}
}
return -1;
}
int main()
{
//如果找到了返回,这个数的下标,找不到返回-1
int arr[ ] = {1,2,3,4,5,6,7,8,9,10};
int k =7;
int sz = sizeof(arr)/sizeof(arr[0]);
//传递过去的数组arr是首元素的地址,所以求数组个数不能在函数内进行
int ret =binary_search(arr[ ], k , sz)
if(ret == -1)
{
printf(“error”);
}
else
{
printf(“找到了,下标是%d\n”,ret);
}
return 0;
}
题4.函数调用一次,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);
return 0;
}
函数的嵌套调用和链式访问
嵌套调用
#include<stdio.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;
}
链式访问
把一个函数的返回值作为另一个函数的参数
#include int main()
{
printf("%d", printf("%d", printf("%d", 43)));
return 0
}
结果:4321
printf("%d", printf("%d", 43))----打印出字符的个数—2
函数的声明和定义
函数要先声明后使用
声明一般在头文件中
函数定义:
int Add(int x, int y)
{
return x+y;
}