(七).函数

发布于:2024-04-28 ⋅ 阅读:(28) ⋅ 点赞:(0)

** 函数调用流程:

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. 设计一个函数,实现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;
}

总结 

函数声明在编译阶段

单文件函数定义的时候需要注意功能函数是否在主函数后面,如果在后面的话需要在头文件后面作声明处理,在做项目的时候,往往有着多个文件,在库文件中声明,主函数文件中直接调用库

函数参数传递有两种形式:

值传递:实参将数值传递个形参,实参和形参就没有关系了,对于形参的操作不会影响实参。

地址传递:实参将地址值传递个形参,在函数内容通过解地址可以获取外部空间,可以操作外部空间。


网站公告

今日签到

点亮在社区的每一天
去签到