c语言入门 day5

  •        今天学习了函数的,了解了函数分为库函数以及自定义函数,库函数可以直接调用函数库里自带的函数进行使用如strcpy(交换数值)char * strcpy ( char * destination, const char * source ); ,memset(将某一内容设定为指定值)void * memset ( void * ptr, int value, size_t num );

库函数的使用必须包含 #include 对应的头文件 

如果使用自定义函数不带返回值,那么必须加上void如 void Swap2(int *px, int *py) ;

  • 函数的参数分为实际参数和形式参数
实际参数可以是常量、变量、表达式、函数等。
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化。
※对于数组来说,实际参数到形式参数仅仅是数组的首个元素地址(本质上就是收到了一个指针)
如交换函数代码如下
#include
void swap(int *num1,int *num2)
{
   int tem=0;
   tem=*num1;
   *num1=*num2;
   *num2=tem;
}
int main()
{
   int x;
   int y;
   swap(&x,&y);
   printf("%d %d",x,y);
   return 0;
}

交换时要取&,这样才能找到x,y的地址,交换xy的内容时要加上‘ * ’

即当用参数改变实参时必须用&取地址如add(&a)  void add(int *p)

  • 函数的调用分为

传值调用:函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。

传址调用:传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。

这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操
作函数外部的变量。
  • 函数的嵌套调用和链式访问,即函数和函数之间可以有机的组合的。
  • 函数的声明和定义
函数的声明: 函数的声明一般出现在函数的使用之前。要满足 先声明后使用 函数的声明一般要放在头文件中。如下
//test.h中的内容

#ifndef __TEST_H__
#define __TEST_H__
//函数的声明
int Add(int x, int y);
#endif //__TEST_H__
函数的定义:是指函数的具体实现,交待函数的功能实现。如下
//tset.c中的内容

#include "test.h"
//函数Add的实现
int Add(int x, int y) {
 return x+y; }
  • 递归函数:它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求
    解。  递归的主要思考方式在于:把大事化小 。
递归的两个必要条件
①存在限制条件,当满足这个限制条件的时候,递归便不再继续。
②每次递归调用之后越来越接近这个限制条件。

例题1 接受一个整型值(无符号),按照顺序打印它的每一位。 例如:输入:1234,输出 1 2 3 4.

#include
void print(int n)
{
	if(n>9)
	{
		print(n/10);
	}
	printf("%d ",n%10);
}
int main()
{
	unsigned int num=0;
	scanf("%d",&num);
	print(num);
	return 0;
}

例题2 编写函数不允许创建临时变量,求字符串的长度。

#include
int my_strlen(char* str)
{
	if(*str!=0)
	{
		return 1+my_strlen(str+1);
	}
	else
		return 0;
}
int main()
{
	char arr[]="bit";
	//int len=strlen(arr);
	//printf("%d\n",len);
	int len = my_strlen(arr);
	printf("len=%d\n",len);
	return 0;
}

例题3 求n的阶乘。

#include
int fac2(int n)
{
	if(n<=1)
		return 1;
	else
		return n*fac2(n-1);
}
int main()
{
	int n=0;
	int ret=0;
	scanf("%d",&n);
	ret = fac2(n);
	printf("%d\n",ret);
	return 0;
}

例题4 求第n个斐波那契数。


#include
int fib(int n)
{
	if(n<=2)
		return 1;
	else
		return fib(n-1)+fib(n-2);
}
int main()
{
	int n=0;
	int ret=0;
	scanf("%d",&n);
	ret= fib(n);
	printf("ret=%d\n",ret);
	return 0;
}

此方法求斐波那契数并不是一个好方法,因为其中会重复好多遍同一计算,而系统分配给程序的栈空间是有限的,所以会导致栈溢出。

※printf函数的返回值是打印在屏幕上字符的个数

你可能感兴趣的:(c语言)