资源简介 第十五课 函数 目 标 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; } 展开更多...... 收起↑ 资源预览