本部分包含函数的嵌套调用和链式访问、以及函数的递归。
练习题4道:1.函数的递归练习:接受一个整型值(无符号),按照顺序打印它的每一位。2.编写函数不允许创建临时变量,求字符串的长度。3.求n的阶乘。(不考虑溢出)4.求第n个斐波那契数。(不考虑溢出)
笔记:
图片(c语言笔记).
文字(基于c++修改后的c语言笔记).
- 6 函数
- 6.1 概述
- 作用:将一段经常使用的代码封装起来,减少重复代码
- 一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能。
- 6.2 函数的定义
- 函数的定义一般主要有5个步骤:
- 1、返回值类型
- 2、函数名
- 3、参数表列
- 4、函数体语句
- 5、return 表达式
- 语法:
- 图示:
- 返回值类型 :一个函数可以返回一个值。在函数定义中
- 函数名:给函数起个名称
- 参数列表:使用该函数时,传入的数据
- 函数体语句:花括号内的代码,函数内需要执行的语句
- return表达式: 和返回值类型挂钩,函数执行完后,返回相应的数据
- 图示:
- 函数的定义一般主要有5个步骤:
- 6.3 函数的调用
- 功能:使用定义好的函数
- 语法:函数名(参数)
- 参数列表里的变量叫形式参数,简称形参
- int add(int num1, int num2)//定义中的num1,num2称为形式参数,简称形参
- 调用时的变量称为实际参数,简称实参
- int sum = add(a, b);//调用时的a,b称为实际参数,简称实参
- 总结:函数定义里小括号内称为形参,函数调用时传入的参数称为实参
- 6.4 值传递
- 所谓值传递,就是函数调用时实参将数值传入给形参
- 值传递时,如果形参发生改变,并不会影响实参
- 注意:如果函数不需要返回值,定义返回值类型时可以学void
- 总结: 值传递时,形参是修饰不了实参的
- 6.5 函数的常见样式
- 常见的函数样式有4种
- 无参无返
- 有参无返
- 无参有返
- 有参有返
- 6.6 函数的声明
- 意义:函数声明后,可以在main主方法后面编译函数的具体内容。
- 作用: 告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。
- 函数的声明可以多次,但是函数的定义只能有一次
- 6.7 函数的分文件编写
- 作用:让代码结构更加清晰
- 函数分文件编写一般有4个步骤
- 创建后缀名为.h的头文件
- 创建后缀名为.cpp的源文件
- 在头文件中写函数的声明
- 在源文件中写函数的定义
- 6.1 概述
代码:
add.h头文件
void Add(int x, int y);
void Addprint();
add.c源文件
#include<windows.h>
#include <stdio.h>
void Add(int x, int y)
{
printf("结果为:%d", x + y);
}
void Addprint()
{
printf("下面进行加法运算\n");
Sleep(1000);
}
源.c源文件
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<windows.h>
#include "add.h"
//函数的递归练习:接受一个整型值(无符号),按照顺序打印它的每一位。
void print(unsigned int num)
{
if (num > 9)
{
print(num / 10);
}
printf("%d ", num%10);
}
//编写函数不允许创建临时变量,求字符串的长度。
int my_strlen(char* p)
{
if (*p != 0)
return 1 + my_strlen(p + 1);
else
return 0;
}
int factorial(int n)
{
if (n >= 1)
return n * factorial(n - 1);
else
return 1;
}
int Fib(int n)
{
if (n > 2)
return Fib(n - 1) + Fib(n - 2);
else if (n <= 2)
return 1;
}
int main()
{
//函数的嵌套调用和链式访问
int x = 0;
int y = 0;
printf("输入两个数相加\n");
scanf("%d %d", &x, &y);
Add(x, y);
//函数的递归
//main();//死递归
//函数的递归练习:接受一个整型值(无符号),按照顺序打印它的每一位。
unsigned int num = 0;
scanf("%d", &num);
print(num);
//编写函数不允许创建临时变量,求字符串的长度。
char arr1[] = "hello";
printf("%s的字符串长度为%d.", arr1, my_strlen(arr1));
//求n的阶乘。(不考虑溢出)
int n = 0;
printf("输入n,求n的阶乘:");
scanf("%d", &n);
printf("值为%d", factorial(n));
//求第n个斐波那契数。(不考虑溢出)
int n = 0;
printf("输入n,求n的斐波那契数:");
scanf("%d", &n);
printf("值为%d", Fib(n));
}