一、函数
具体分为库函数和自定义函数
其中库函数指scanf printf strlen...
而自定义函数指由程序员封装函数,而自定义函数又分为有参无参函数和有无返回值函数
void sum() 无参无返函数
void sum(int a,int b) 有参无返函数
int sum() 无参有返函数
int sum(int a,int b); 有参有返函数
当自定义函数在主函数上方时不需要声明直接使用即可,但可读性差,运行速度慢
当自定义函数在主函数下方时需要声明,可读性好,运行速度快
可使用:vsp 文件名.h 生成一个.h文件存储声明,只需要在文件头使用“”引出来
1.1全局与局部变量
1.2有参函数
有参是因为被调函数需要使用主调函数的局部变量
要求:实参和形参一一对应,个数相同否则会报错
实参名和形参名可以一致也可以不一致,
类型最好一致,否则会以形参为主发生强转
void Sum(int arr[],int len)//当传递数组是,形参的数组长度可以省略不写,默认是实际实参的元素个数
{
int sum=0;
printf("形参=%ld\n",sizeof(arr));
for(int i=0;i<len;i++)
{
sum+=arr[i];
}
printf("sum=%d\n",sum);
}
//写一个自定义函数Bubble,实现冒泡排序:
//参数:数组名,长度
void Bubble(int arr[],int len)
{
for(int i=1;i<len;i++)//循环轮数
{
int count=0;
for(int j=0;j<len-i;j++)//每一轮比较的次数
{
if(arr[j] >arr[j+1])
{
int temp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;
count++;
}
}
if(count==0)
break;
}
for(int i=0;i<len;i++)
{
printf("%d ",arr[i]);
}
}
int main(int argc, const char *argv[])
{
//int arr[]; int []表示数组的类型
//char arr[5][6]: char [5][6] 二维数组的数据类型
//
int arr[]={11,9,3,4,55};//局部,只能main使用
int len=sizeof(arr)/sizeof(arr[0]);
printf("实参=%ld\n",sizeof(arr));
// Sum(arr[0]);//传递一个元素
Sum(arr,len);//数组做参数一般传递数组名,表示传递的整个数组
//冒泡函数
Bubble(arr,len);
return 0;
}
由示例可见,当数组作为参数时传递数组名,数组名就代表整个数组,在被调函数中并不是以数组形式来接的,而是指针
1.3有返回值函数
因为主调函数需要被调函数的局部变量,故有了返回值
void就是无返回值
其他数据类型需要返回值
使用格式1:
return(表达式)
使用格式2:
return 表达式
注意:返回的类型和函数数据类型一致,如果不一致会发生自动或强制转换
练习1:自定义函数Sum计算一维数组的和,返回和
#include<stdio.h>
int Sum(int arr[],int len)
{
int sum=0;
for(int i=0;i<len;i++)
{
sum+=arr[i];
}
return sum;
size_t count=0;
}
int main(int argc, const char *argv[])
{
int arr[]={1,2,3,4,5};
int s=Sum(arr,sizeof(arr)/sizeof(arr[0]));
printf("s=%d\n",s);
return 0;
}
练习2:返回字符串长度
#include<stdio.h>
size_t my_strlen(char str[]){
size i=0;
while(str[i])
i++;
return i;
}
int main(int argc, const char *argv[])
{
char str[120]="";
gets(str);
unsigned int len=my_strlen(str);
printf("%u\n",len);
return 0;
}
练习3:字符串比较,返回s1和s2的差值。
#include<stdio.h>
int my_strcmp(char s1[],char s2[]){
int i=0;
int j=0;
while(s1[i]==s2[j]&&s2[j]!='0'){
i++;
j++;
}
if(s1[i]>s2[j])
return s1[i]-s2[j];
else if(s1[i]<s2[j])
return s1[i]-s2[j];
else
return 0;
}
int main(int argc, const char *argv[])
{
char s1[127]="";
char s2[127]="";
gets(s1);
gets(s2);
int cmp=my_strcmp(s1,s2);
if(cmp>0){
printf("no %d\n",cmp);
}else if(cmp<0){
printf("no %d\n",cmp);
}else{
printf("yes %d\n",cmp);
}
return 0;
}
#include<stdio.h>
void Bubble_sort(int arr[],int m);
int Max_add_value(int a,int b);
int Max_dif_value(int c,int b);
int main(int argc, const char *argv[])
{
int m;
printf("有几位数:");
scanf("%d",&m);
int arr[m];
printf("它们分别是:");
for(int i=0;i<m;i++){
scanf("%d",&arr[i]);
}
Bubble_sort(arr,m);
if(m>1){
int max_add_value=Max_add_value(arr[m-2],arr[m-1]);
printf("最大和为%d\n",max_add_value);
int max_dif_value=Max_dif_value(arr[0],arr[m-1]);
printf("最大差为%d\n",max_dif_value);
}else if(1==m){
printf("只有一个数,所以最大和和最大差都是该数:%d\n", arr[0]);
} else {
printf("没有输入任何数。\n");
}
return 0;
}
void Bubble_sort(int arr[],int m){
int i=0;
int j=0;
int temp=0;
for(i=0;i<m-1;i++){
for(j=0;j<m-1-i;j++){
if(arr[j]>arr[j+1]){
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
int Max_add_value(int a,int b){
return a+b;
}
int Max_dif_value(int c,int b){
return b-c;
}