目标成为嵌入式大牛的第十天之函数的一般形式和调用

函数

函数的定义

类型标识符  函数名 (形式参数)

{

     语句声明

     语句声明

}

(1).类型标识符 (返回值的类型的标识符)

        返回值类型 
        返回值 如果没有,返回值类型 一般写成void 
        返回的结果的类型 与 定义返回值类型 不一致 ,以定义的返回值类型为准 
        返回值的类型如果不写,默认为int型 

(2).函数名-------一般和函数功能对应

(3).形式参数------函数接收数据的入口

           形参不是一定要有,需要看函数的需要,在没有形参的时候,一般要写成void。

(4).函数体--------完成函数具体功能的代码

函数调用的形式

add(a,b)//函数调用语句

或者

int ret;

ret = add(a,b);    //说明函数调用在表达始中

ret = add(a,b)+3;   //函数调用成为表达式的一部分

printf(”sum = %d\n“,add(a,b));//表示函数作为某个函数的实际参数;

函数的格式;

返回值的类型标识符  函数名(形式参数)//函数头-----规定了下一个函数的形式

{

      函数体        //实现函数功能的代码

      返回结果        //return   返回结果

}

函数定义的位置:

1.main函数之前

2.main函数之后:要加函数声明即-----函数头 + 分号  ;函数声明最次要放在使用之前

练习:

实现函数 找出两个数中的最大值
#include 

int max(int a,int b)
{
	if (a>b)
	{
		return a;
	}else

	return b;
}


int main(void)
{
	int a,b;
	scanf ("%d%d",&a,&b);

	int num=max(a,b);

	printf("max=%d\n",num);

	return 0;
}
判断素数;
#include 

int	Prime(int a)
{
	int i=0;
	for (i=2;i
打印100以内素数
#include 

void Prime100(void)
{
	int i=0;
	for(i=2;i<100;++i)
	{
		if (Prime(i)!=0)
		{
			printf("%d ",i);
		}
	}
		putchar('\n');

	return ;
}



int main(void)
{
      Prime100();
	  return 0;
}
打印每个月的天数:
#include 

int Year(int a)
{
	if (a%4==0 && a%100!=0 || a%400==0)
	{
		return 1;
	}else
	{
		return 0;
	}
}


int Days(int y,int m)
{
	int day=0;
	int mon[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	day=m==2?mon[m-1]+Year(y):mon[m-1];

	return day;
}


int main(void)
{
	int y=0;
	int m=0;

	printf("Enter Year Month: \n");
	scanf("%d%d",&y,&m);

	printf("%d\n",Days(y,m));
    
    return 0;
}

总结:

1.函数实现:主要是代码的逻辑

2.流程图:主要是某个功能块儿

3.main函数:指的是主函数  针对每个功能块

4.函数调用的本质:函数调用就是一个函数调到另一个函数中实现其功能 结束之后返回到原来位置,也就是所谓的”进栈“和”出栈“。

特点:先进后出(FILO)  栈的空间默认是8M 同时也可以更改

主要:局部变量

           自动申请     自动释放

            int      a;

堆:

特点:空间大  手动申请  手动释放

字符串常量区:

常量区是全局区中划分的一个小区域,里面存放的是常量,如const修饰的全局变量、字符串常量等。

全局区(静态区)

      全局将变量区

代码区

以上就是内存的五个区

程序 = 代码 + 数据

函数的嵌套调用:

递归

有一种特殊的嵌套调用------递归(自己调用自己)

递归就是循环

分为直接递归和间接递归

递归求1+-----+100的和:

//sum()
递归来实现: //倒着来 

sum(100)
 |--sum(99)+100
     |--sum(98)+99
         |--sum(97)+98
           ...
            |--sum(2)+3
                |--sum(1)+2
                      |--1

 写出代码:
1.递推关系 //重复的 
 第n项 与 第n-1项之间的关系 
2.结束条件 

sum(100) = sum(99)+100
sum(99) = sum(98) + 99

……

sum(2) = sum(1)+2
sum(1) = 1

sum(n) = sum(n-1) + n
int sum(int n)   //n = 2
{
    if 递归是否结束? (n==1)
   { //结束
         return 1;
    }else  
    {
        return sum(n-1)+n;
     }
   
}

递归函数内部的逻辑:
1.看是否递归结束了?

如果结束,返回结束时的值

2.如果没结束 
递归继续往

作业:

1. 封装一个函数,获得两个数的最大公约数 5 3 封装一个函数,获得两个数的最小公倍数 5 3

返回值类型: int 参数: int a,int b

函数名: Gcd //greatest common divisor(gcd)

lowest common multiple (LCM)

least common multiple

函数体: 实现思路

#include 


int Gcd(int a,int b)
{
	int p=0;

	if (a>b)
	{
		p=b;
	}else
	{
		p=a;
	}
	while(p>1&&a%p==0&&b%p==0)
	{
		return p;
		p--;
		break;
	}
	return 1;
}



int Lcm(int a,int b)
{
	int q=(a*b)/Gcd(a,b);

	return q;
}


int main(void)
{
	int a,b;

	printf("Enter two natural numbers: \n");
	scanf("%d %d",&a,&b);

	printf("Greatest common divisor=%d\n",Gcd(a,b));
	printf("Least common multiple=%d\n",Lcm(a,b));

	return 0;
}

2. 打印1000以内的所有回文数,用函数实现 应该拆分成两部分 判断回文数 打印回文数。

#include 

int Pas(int n)
{
	int p=0;

	if (n>9 && n<=99)
	{
		if (n/10==n%10)
		{
			p=1;
		}
	}
	if(n>99 && n<1000)
	{
		if (n/100==n%10)
		{
			p=1;
		}
	}
	return p;
}


int main(void)
{
	int num;
	for(num=10;num<1000;++num)
	{
		if (Pas(num))
		{
			printf("%d ",num);
		}
	}
	putchar('\n');
	return 0;
}

你可能感兴趣的:(算法,c语言,学习,开发语言)