2020-2021学年信息学奥赛资料 第十五课 函数(适用于高中)课件(22张PPT)

文档属性

名称 2020-2021学年信息学奥赛资料 第十五课 函数(适用于高中)课件(22张PPT)
格式 pptx
文件大小 286.2KB
资源类型 教案
版本资源 通用版
科目 信息技术(信息科技)
更新时间 2021-05-19 20:53:02

图片预览

文档简介

第十五课 函数

目 标
01、学会函数的定义和调用。
02、 应用函数解决一些实际问题。
一个 C++ 程序无论大小,都由一个或者多个“函数”组成,而且其中必须有且只有一个函数main(),称之为“主函数”,由函数 main()调用其他函数来完成程序的特定功能。当然,其他函数之间也可以按照规则互相调用。
C++ 中的函数由一段相对独立的代码组成,这段代码能实现某一项具体、独立、完整的功能。
函数在程序设计中的作用主要有两个,一是“代码重用”;二是“问题分解”。
代码重用是保证同一个函数可以被一个或多个函数调用任意多次,从而减少重复代码的编写。问题分解可以保证一个大的程序(或者说软件),按照模块化编程思想,由大化小,分解成若干个结构清晰、功能独立、调试方便的函数,甚至给若干人合作完成,从而提高开发效率。
C++提供了很多常用的系统函数,如输入单个字符的函数getchar()等。但是有些函数,必须要加上相关头文件才能使用,例如整数取绝对值的函数abs()、求算术平方根的函数sqrt()等,必须要包含“cmath”。
例1、曼哈顿距离
【问题描述】
平面直角坐标系中位于坐标(x1,y1)的 i 点与位于坐标(x2,y2)的 j 点的曼哈顿距离为 d(i,j) = |x1-x2| + |y1-y2|。请编程输入两个点的坐标,输出它们之间的曼哈顿距离。
【输入格式】
一行四个整数(100 以内),分别表示两个点的坐标(x1,y1)和(x2,y2)。
【输出格式】
一行一个整数,表示两个点之间的曼哈顿距离。
【输入样例】
10 5 6 20
【输出样例】
19
#include
#include
using namespace std;
int main(){
long long x1,y1,x2,y2,mht;
cin >> x1 >> y1 >> x2 >> y2;
mht = abs(x1 - x2) + abs(y1 - y2);
cout << mht << endl;
return 0;
}
例2、回文数个数
【问题描述】
输入一个正整数 n,求 1~n 之间“回文数”的个数。回文数是指一个数倒过来和原数一样,如 12121、11、1221、1 是回文数,而 1231 不是回文数。
【输入格式】
一行一个正整数 n,1≤n≤10000。
【输出格式】
一行一个正整数,表示 1~n 之间回文数的个数。
【输入样例】
12
【输出样例】
10
【问题分析】
定义一个计数器变量并初始化为 0,然后穷举 1~n 中的每一个整数 i,判断是否是回文数,是则计数器加一。如何判断 i 是回文数呢? C++ 系统函数里没有,只能自己编写一个。
#include
using namespace std;
// 在此自定义一个函数 check(),如果 i 是回文数返回 true,否则返回 false
int main(){
int n,i,ans = 0;
scanf( “ %d ” ,&n);
for(i = 1; i <= n; i++)
if(check(i)) ans++;
printf( “ %d\n ” ,ans);
return 0;
}
C++ 要求函数必须先定义、后使用。定义函数,就是要说明函数的返回值类型、函数名、函数参数,以及完成特定功能的语句组合(函数体)。
函数的定义和调用
1. 函数的定义
定义函数的格式如下:
返回值类型 函数名(参数列表){
函数体
}
其中,第一行称为函数头部。函数名是标识这个函数的合法标识符。返回值类型是指一个函数结束后返回给调用者的一个“返回值”的数据类型。有些函数的功能是执行一系列操作,而不返回任何值,这种情况下,返回值类型是关键字void。参数列表是当函数被调用时,调用者向函数传递的各种“参数”,此处的参数称为形式参数,参数列表包括参数的数据类型和参数名,参数是可选的,没有参数就是“无参”函数,但是括号不能省略。
1. 函数的定义
大括号之间的部分称为“函数体”,主要包括变量说明语句、表达式语句等。如果有返回值,则函数体内至少有一条语句“return 表达式”。在执行函数体的过程中,一旦遇到return语句,执行完就立刻退出函数,不再执行后续的语句。无返回值函数不需要return语句。
2. 函数的调用
在程序中以任何方式对函数的使用,都称为函数的调用。函数调用是通过“函数名”进行的,一般格式为:
函数名(参数列表)
此处的参数列表称为“实际参数”,是传递给调用函数的,必须严格对应函数定义时函数头部的形式参数列表,包括参数个数、参数顺序、数据类型。调用无参函数时参数列表可以没有,但括号不能省略。如果参数列表包含多个参数,则各参数间用逗号隔开。
函数调用方式
以函数在程序中出现的位置和形式来看,函数调用方式分为三种。
(1)函数调用作为一条独立语句,完成一件事情(一系列操作),没有任何返回值。例如:print (n); doit(dep,total); input( );
(2)函数调用的结果作为表达式的一部分。例如:int t = compute(i,j) + i*j;
(3)以实参形式出现在其他函数调用中。例如:number = min(sum(-5,100),n); num = max(max(a,b), c);
例3、阅读程序,写出程序的运行结果,体会“代码重用”和“有返回值函数”的调用。
#include
using namespace std;
int fac(int n){
int z = 1;
for(int i = 1; i <= n; i++) z = z * i;
return z;
}
int main(){
int x = fac(5) + fac(4);// 函数调用出现在表达式中
cout << x << endl;
return 0;}
例2、阅读程序,写出程序的运行结果,体会“无返回值函数”的调用。
#include
using namespace std;
void maxnum(int x,int y){
int w = x > y ? x : y;
cout << w << endl;
}
int main(){
int a = 5,b = 22;
maxnum(a,b);// 函数调用作为一条独立语句
return 0;
}
例3、阅读程序,写出程序的运行结果,体会函数的“提前声明”。
#include
using namespace std;
int big(int x,int y);// 函数的提前声明
int main(){
int x,y,z;
cin >> x >> y >> z;
cout << big(big(x,y),z) << endl;
// 函数调用的返回值又作为其他函数调用的实际参数
return 0;
}
int big(int x,int y){// 函数定义
if(x > y) return x;
else return y;}
例3、阅读程序,写出程序的运行结果,体会函数的“提前声明”。
#include
using namespace std;
int big(int x,int y);// 函数的提前声明
int main(){
int x,y,z;
cin >> x >> y >> z;
cout << big(big(x,y),z) << endl;
// 函数调用的返回值又作为其他函数调用的实际参数
return 0;
}
int big(int x,int y){// 函数定义
if(x > y) return x;
else return y;}
例4、统计闰年
【问题描述】
输入两个年份 x 和 y,统计并输出公元 x 年到公元 y 年之间的所有闰年数(包括 x 年和 y 年),1≤x≤y≤3000。
【输入格式】
一行两个正整数表示 x 和 y,之间用一个空格隔开。
【输出格式】
一行一个正整数,表示公元 x 年到公元 y 年之间的所有闰年数。
【输入样例】
2000 2004
【输出样例】
2
#include
using namespace std;
bool rn(int n){
if((n % 4 == 0) && (n % 100 != 0) || (n % 400 == 0)) return true;
else return false;
}
int main(){
int x,y,t = 0;
cin >> x >> y;
for(int i = x; i <= y; i++)
if(rn(i)) t++;
cout << t << endl;
return 0;
}
例5、数的分离
【问题描述】
定义一函数 digit (n,k) 分离出整数 n 从右边数第 k 个数字。如 digit(2076,1) 等于 6,而 digit(2076,5) 等于 0。main 函数输入 n 和 k,调用 digit(n,k) 输出答案,n 在 long long 范围内。
【输入格式】
一行两个整数分别表示 n 和 k,之间用一个空格隔开。
【输出格式】
一行一个整数,表示整数 n 从右边数第 k 个数字。
【输入样例】
31859 3
【输出样例】
8
#include
using namespace std;
int digit(long long n,int k){
int tmp;
for(int i = 1; i <= k; i++){
tmp = n % 10;
n = n / 10;
}
return tmp;
}
int main(){
long long n;
int k;
cin >> n >> k;
cout << digit(n,k) << endl;
return 0;
}
同课章节目录