** 函数调用流程:
1、给形参开空间
2、将实参的数据传递给形参
3、执行函数中的逻辑
4、有返回值就返回给调用者,没有返回值结束
5、函数结束的时候会销毁形参以及函数里面定义的局部变量。
函数参数传递有两种形式:
值传递:实参将数值传递个形参,实参和形参就没有关系了,对于形参的操作不会影响实参。
地址传递:实参将地址值传递个形参,在函数内容通过解地址可以获取外部空间,可以操作外部空间。
函数的声明
在函数调用的时候做语法检查。 -- 编译
函数返回类型要和接收的类型一致
函数的实参在类型 个数 顺序必须和形参完全一样。
函数的定义和函数调用放在不同的文件里面或者按照不同的顺序。
项目:
.c 函数定义 -- 功能实现
.h 函数声明
#include “x.h”
单文件里面
函数定义在main函数后面
想要在main函数里面使用
函数声明怎么写?
函数头+ ;
int MyStrLen(char *s); // 单文件 预处理下面main函数的上面 项目 :.h文件里面
如果要在main函数的里面调用,函数是在main函数后面定义,没有声明的时候,编译器会默认这个函数返回值是int.
如果函数定义的时候返回值不是int就会报错:[Error] conflicting types for '函数名'
练习
设计一个函数,实现1+2+3+...+n的求和。//实际上了解函数的概念
#include<stdio.h>
#include<math.h>
#include<string.h>
int f(int x)
{
int sum=0,i;
for(i=1;i<x+1;i++)
{
sum+=i;
}
return sum;
}
int main()
{
int a;
scanf("%d",&a);
printf("%d",f(a));
return 0;
}
2.设计一个函数,能统计出m--n年之间一共有多少个闰年
#include<stdio.h>
#include<math.h>
#include<string.h>
void year(int x,int y);
int main()
{
int a,b;
printf("请输入两个年份:");
scanf("%d%d",&a,&b);
year(a,b);
return 0;
}
void year(int x,int y)
{
int scond=0;
if(x<y)
{
x=x+1;
for(;x<y;x++)
{
if(x%4==0&&x%100!=0||x%400==0)
{
printf("%d年\n",x);
scond++;
}
}
printf("差%d个闰年",scond);
}
else
{
y=y+1;
for(;y<x;y++)
{
if(y%4==0&&y%100!=0||y%400==0)
{
printf("%d年\n",y);
scond++;
}
}
printf("差%d个闰年",scond);
}
}
3.输入一个年,月,日,求出这一天和2010年1月1日之间差多少天。要求编写函数解决问题
#include<stdio.h>
#include<math.h>
#include<string.h>
void year(int x,int y,int z);
int day1(int x,int y);//返回某个月的天数
int year1(int x);//闰年返回1,平年返回0
int main()
{
int a,b,c;
printf("请输入年份,月份,日期:");
scanf("%d%d%d",&a,&b,&c);
year(a,b,c);
return 0;
}
void year(int x,int y,int z)
{
int scond=0,i;
int day=0;
if(x>=2010&&y>=1&&z>=1)
{
for(i=2011;i<x;i++)
{
if(i%4==0&&i%100!=0||i%400==0)
{
scond++;
}
}
day=scond*366+(x-1-2010)*365;
for(i=1;i<y;i++)
{
day+=day1(x,i);
}
printf("一共差%d天",day+z-1);
}
else
printf("输入错误");
}
int day1(int x,int y)//返回某个月的天数
{
switch(y)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:return 31;
case 4:
case 6:
case 9:
case 11:return 30;
case 2:
if(year1(x)==1)
{
return 29;
}
else
{
return 28;
}
default:printf("月份输入有误,请重新输入!");
}
}
int year1(int x)//闰年返回1,平年返回0
{
if(x%4==0&&x%100!=0||x%400==0)
return 1;
else
return 0;
}
4.设计一个函数将整数颠倒输出。比如:输入1234,输出4321
#include<stdio.h>
#include<math.h>
#include<string.h>
void f(int x);
int main()
{
int a;
printf("请输入一个整数:");
scanf("%d",&a);
f(a);
return 0;
}
void f(int x)
{
int a[5],i=0,j,scond=0;
while(x!=0)
{
a[i]=x%10;
x=x/10;
i++;
}
for(j=0;j<5;j++)
{
a[j]=a[j]*pow(10,i-1-j);
scond+=a[j];
}
printf("%d",scond);
}
5.个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
int i,j,sum;
for(j=2;j<=1000;j++)
{
sum=0;
for(i=1;i<j;i++)
{
if(j%i==0)
sum+=i;
}
if(sum==j)
printf("%d ",j);
}
return 0;
}
6.请编写一个函数,输出1到n(包括n)中数字2出现了几次。将次数作为返回值 在主函数打印
在主函数中输入
测试样例:
10 返回1 12 返回2
20 返回3 21 返回4
22 返回6 23 返回7
#include<stdio.h>
#include<math.h>
#include<string.h>
int cishu(int x);
int main()
{
int a,b;
printf("请输入一个整数:");
scanf("%d",&a);
b=cishu(a);
printf("%d",b);
return 0;
}
int cishu(int x)
{
int i,j=0,scond=0;
for(i=1;i<=x;i++)
{
scond=i;
while(scond!=0)
{
if(scond%10==2)
{
j+=1;
}
scond=scond/10;
}
}
return j;
}
总结
函数声明在编译阶段
单文件函数定义的时候需要注意功能函数是否在主函数后面,如果在后面的话需要在头文件后面作声明处理,在做项目的时候,往往有着多个文件,在库文件中声明,主函数文件中直接调用库
函数参数传递有两种形式:
值传递:实参将数值传递个形参,实参和形参就没有关系了,对于形参的操作不会影响实参。
地址传递:实参将地址值传递个形参,在函数内容通过解地址可以获取外部空间,可以操作外部空间。