学习内容:
4、函数
学习时间:
2020年10月5日18:30-19:30学习产出:
/*
函数
初始函数
函数的概念
最简单的程序模块就是函数
函数的定义
语法格式:
返回值类型 函数名(参数类型 参数名1,参数类型 参数名2...)
{
执行语句
...
return 返回值;
}
函数种类
无参函数
有参函数
函数的返回值
语法格式:
return 表达式;
printf()函数和scanf()函数
printf()函数
printf()函数输出数据
常用printf()格式字符
%s 输出一个字符串
%c 输出一个字符
%d 以十进制输出一个有符号整型
%u 以十进制输出一个无符号整型
%f 以十进制输出一个浮点数
...
scanf()函数
scanf()函数负责从标准输入设备(一般指键盘)上接受用户的输入
内存四区
栈区
栈区时一块连续的内存区域,该区域由编译器自动分配和释放,一般用来存放函数的参数、全局变量等
堆区
堆空间一般由程序员分配或释放,若程序员不释放,程序结束时将被系统强制回收
数据区
根据功能又可以分为静态全局区和常量区两个域
代码区
用于存放函数体的二进制代码
函数调用
函数的调用方式
语法格式:
函数名(实参列表1,实参列表2...)
调用方式
将函数作为表达式带哦用
将函数作为语句调用
将函数作为实参调用
函数调用时的数据传递
形式参数
在定义函数时函数后面括号中的变量名称称为“形式参数”(简称“形参”)或“虚拟参数”
实际参数
在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”(简称“实参”),实参可以时常量、变量或表达式
嵌套调用
在调用函数时,可以在一个函数中调用另一个函数,这就是函数的嵌套调用
递归调用
所谓的递归就是函数内部调用自身的过程,需要注意的是,递归必须要求有结束条件,不然就会陷入无限递归的状态,永远无法结束调用
案例-斐波那契数列
外部函数与内部函数
外部函数
在C语言中,可以被其他源文件调用的函数称为外部函数,在调用外部函数之前需要在当前源文件中定义外部函数
定义外部函数的方式是在函数的返回值类型前面添加extern关键字
eg:extern int add(int x,int y)
为简化编程,C语言中允许在定义外部函数时省略关键字extern
扩展内容:
函数的“定义”和“声明”并不是一个意思。“定义”时指对函数功能的确立,函数定义时一个完整的、独立的函数单位。
而函数的声明则时把函数名、参数列表、返回值类型通知编译系统,以便在调用时系统按照此声明进行对照检查
内部函数
只在它的定义文件中有效,该类函数称为内部函数
语法格式:
需要在函数的返回值类型前面添加static关键字(又称为静态函数)
static 返回值 函数名()
{
代码块
}
局部变量与全局变量
局部变量
局部变量就是在函数内部声明的变量,它只在本函数内有效,也就是说,只能在本函数内使用它
全局变量
在所有函数外部定义的变量称为全局变量(包括main()函数)它不属于哪一个函数,
二十属于源程序。因此全局变量可以为程序中的所有函数所共用
变量的作用域
变量需要在它的作用范围内才可以被使用,这个作用范围称为变量的作用域
进阶案例-汉诺塔
*/
//相关练习
/*
1、编写函数 int mymod ( int a, int b),实现的功能是:用以求a被b除之后的余数。
编写主函数,从键盘上输入两个整数,调用上面定义的函数,求得两个数相除之后的余数,并输出。
*/
#include<stdio.h>
int mymod(int a,int b)
{
int c=a%b;
return c;
}
int main()
{
int x,y,z;
printf("请输入两个整数:");
scanf("%d%d",&x,&y);
z=mymod(x,y);
printf("两数相除后的余数是:%d\n",z);
return 0;
}
/*
2、写一个函数void shuchu(int n),接受一个整数参数n,输出n 个HelloWorld
编写主函数中,从键盘上输入一个整数,调用这个函数输出相应的HelloWorld。
*/
#include<stdio.h>
void shuchu(int n)
{
int i;
for(i=1;i<=n;i++)
printf("HelloWorld\n");
}
int main()
{
printf("请输入一个整数:");
int a;
scanf("%d",&a);
shuchu(a);
return 0;
}
/*
3、输入三角形的三边a, b, c,调用方法判断能否构成三角形. 若能,计算周长。若不能,显示提示信息。
请独立编写一个方法,方法的功能是:接收三个整形参数,判断能否构成三角形,并返回1或0。
*/
#include<stdio.h>
int san(int a,int b,int c)
{
if(a+b>c&&c>a&&c>b)
return 1;
else
return 0;
}
int main()
{
printf("请输入三个整数:");
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
san(x,y,z);
if(san(x,y,z))
printf("%d,%d,%d能构成三角形,它的周长是%d\n",x,y,z,x+y+z);
else
printf("%d,%d,%d不能构成三角形\n",x,y,z);
return 0;
}
/*
进阶案例-汉诺塔
*/
#include<stdio.h>
int getNum(int n)
{
if(n==1)
{
return 1;
}
else
{
return 2*getNum(n-1)+1;
}
}
int main()
{
int n=10;
int num=getNum(n);
printf("汉诺塔中%d片圆盘共需移动%d次\n",n,num);
}