函数的概念
1.函数就是function也就是功能的意思,函数就是用来实现某些功能的。
常用的函数
1.printf(),scanf();函数,puts()函数,gets函数等等。
(1)puts函数的一般形式为:
puts (字符数组);如:
puts (str);其中str是一个字符数组名,则执行完这个语句程序输出这个字符数组中存放的字符串。
(2)gets函数的一般形式为:
gets (字符数组);
注意的是puts和gets都只能输入或者输出一个字符串,不能写成
puts(str1,str2);
(3)strcat函数——字符串连接函数
一般形式为:strcat (字符数组1,字符数组2);
作用就算是把字符数组中的字符串连接起来,如
char a[30] = {"i am a "};
char a[30] = {"student "};
printf("%d",strcat(a,b));
输出:
i am a student.
需要注意得是a字符数组必须足够大,不然会因为放不下出错。
(4)strcpy和strncpy函数——字符串复制函数
一般形式为
strcpy (字符数组1,字符数组2);
其作用是将字符串2复制到字符串1中,如:
char a[10];
char b[3] = {"car"};
strcpy(a,b);
这里应该注意的是字符数组一应该写成数组名形式,而字符数组2可以是数组名也可以是字符串常量。另外不能把一个字符串直接赋值给一个字符数组,如下面是不合法的
str = "china";
str1 = str;
赋值语句只能将一个字符赋值给一个字符串变量或者数组元素。
(5)strcmp()函数——字符串比较函数
一般形式为:
strcmp(字符串1,字符串2);
下面三中都是合法的:
strcmp(str1,str2);
strcmp("beijing","china");
strcmp(str1,"china");
说明:字符串比较的规则是将字符串由左自右逐个比较(按照ascii码)直到出不同的字符或者\0为止,如过全部相同,则认为相等,否则一第一个不相同的为准,相同则返回0,大于返回一个正值小于则返回一个负值。
(6)strlen()函数——测字符串长度函数
一般形式为:strlen(字符数组)
作用为测量字符串的实际长度,一定要注意是实际长度不是定义的数组长度。如:
#include<stdio.h>
int main()
{
char a[10] = "china";
int len = strlen(a);
printf("%d",len);
return 0;
}
结果为:
(7)strlwr()函数——转换为小写的函数
一般形式:strlwtr(字符串);
(8)strupr()函数——转化为大写的函数
一般形式strupr(字符串);
小练习:
/*
有三个字符串,求其中的最大者
*/
#include<stdio.h>
#include<sttring.h>
int main()
{
char str[3][20];
char str1[20];
for(int i = 0;i<3;i++)
{
gets(str[i]);
}
if(strcmp(str[0],str[1])>0)
strcpy(str1,str[0]);
else
strcpy(str1,str[0]);
if(strcmp(str[2],str1)>0)
strcpy(str1,str[2]);
printf("%s",str1);
return 0;
}
运行结果如下:
函数的定义
1.在程序中用到的所有函数都实行先定义后使用的原则,函数的定义应该包含一下几个内容:
(1)指定函数的名字以后按照名字调用函数。
(2)指定函数的类型,即函数返回值的类型。
(3)指定函数的参数的名字和类型。对于无参函数则不需要。
(4)指定函数应该完成的操作,也就是实现的功能。
定义无参函数的一般形式为:
类型名 函数名(形参列表)
{
函数体
}
定义无参函数的一般形式为:
类型名 函数名()
{
函数体
}
定义有参函数举例:
int sun(int ,int )
{
return
}
2.函数的调用
调用的一般形式为:函数名(实参表列),如上面的printf()函数等。
3.调用函数时的数值传递
调用时形参需要接收实参的值,实参可以是常量,变量或者表达式,如果形参和实参类型不一样则应该进行数制转换。
4.函数声明
在一个函数调用另一个函数应该具备以下条件”
(1)首先被调用的函数应该是已经定义的函数。
(2)如果使用库函数,应该在本文件开头用#include命令将调用库函数所使用的信息包含到头文件中来。
(3)如果是用户自己定义的函数,而该函数的位置在调用他的函数的后面应该在调用该函数前进行声明。声明的作用是把函数名,函数参数个数,函数参数类型通知编译系统,不然编译系统会报错。
小练习:
/*
输入两个实数,调用函数求和
*/
#include<stdio.h>
#include<sttring.h>
int main()
{
int sum(int a,int b);
int a,b;
printf("请输入两个整数");
scanf("%d %d",&a,&b);
printf("%d",sum(a,b));
return 0;
}
int sum(int a,int b){
return a+b;
}
运行结果如下:
函数的递归调用
1.一个函数间接的或者直接的调用函数本身,称为函数的递归调用。
竟说些概念也不好理解,下面通过一个例子理解递归的概念。
示例:
/*
有5个人坐在一起,问第5个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。
问第3个人,又说比第2个人大2岁。问第2个人,说比第1个人大2岁。最后问第1个人,他说是10岁。
请问第5个人多大。
*/
#include<stdio.h>
#include<sttring.h>
int main()
{
int age(int n);
int age(int n);
printf("第五个年龄是%d",age(5));
return 0;
}
int age(int n){
int c;
if(n == 1)
c = 10;
else
c = age(n-1)+2;
return c;
}
运行结果如下:
数组作为函数参数
1.实参可以是常量,变量和表达式,同样也可以用数组名当实参或者形参,传递的是一个地址。用数组元素做实参时传递的是值。
示例:
/*
定义一个一维数组score,内放十个学生成绩,求平均成绩。
*/
#include<stdio.h>
#include<string.h>
int main()
{
float average(float array[10]);
float score[10],aver;
int i;
printf("请输入是个数\n");
for(i = 0;i<10;i++)
{
scanf("%f",&score[i]);
printf("\n");
aver = average(score);
}
printf("%s",str1);
return 0;
}
float average(float array[10])
{
int i;
float aver,sum = array[0];
for(i = 0;i<10;i++)
{
sum = sum+array[i];
aver = sum/10;
return aver;
}
}
上面传递的就是数组名,实质是地址,传递地址有很多好处,以后的学习中慢慢理解。