第三章 函数 C++语言程序设计第五版 - 郑莉
本专栏为C++学习笔记,参考书籍为:C++语言程序设计 第五版 -清华大学出版社- 郑莉
B站视频:https://space.bilibili.com/702528832/video
PPT与代码已上传:https://download.csdn.net/download/weixin_45755332/75626784
版权归原作者所有如有侵权请立即与我联系,必将及时处理。
本想考东软的,结果今年缩招,直接改隔壁科软,当时的学习笔记发出来供大家参考指正。科软23分肯定会升,但肯定不会到380,撑死350。冲就完了!!!
函数的定义与使用
**作用:**将一段经常使用的代码封装起来,减少重复代码
函数定义
函数定义的语法形式
函数的定义一般主要有5个步骤:
1、返回值类型
2、函数名
3、参数表列
4、函数体语句
5、return 表达式
类型标识符 函数名(形式参数表)
{ 语句序列return表达式
}
形式参数表:
name_1, name_2, …, name_n 是被初始化的内部变量,寿命和可见性仅限于函数内部
语句序列:
- 表示返回值类型,由 return 语句给出返回值
- 若无返回值,写void,不必写return语句。
函数的调用
调用前先声明函数:
若函数定义在调用点之前,可以不另外声明;
若函数定义在调用点之后,必须要在调用函数前声明函数原型:
- 类型标识符 被调用函数名(含类型说明的形参表);
调用形式
- 函数名(实参列表)
嵌套调用
- 在一个函数的函数体中,调用另一函数。
递归调用
- 函数直接或间接调用自身。
// 3.1编写一个求x的n次方的函数#include <iostream>
using namespace std;double power(double x, int n);int main() {cout << "5 to the power 2 is " << power(5, 2) << endl;return 0;
}
//计算x的n次方
double power(double x, int n) {double val = 1.0;while (n--) val *= x;return val;
}
// 3.2 输入一个8位二进制数,将其转换为十进制数输出。#include <iostream>
using namespace std;
int power(int a){int p = 1;for (int i=0;i<a;i++ )p *= 2;return p;
}
int main(){int s = 0;int c;char a;for (int i=7;i>=0;i--){cin>>a;cout << "Enter an 8 bit binary number :";if(a=='1'){c = power(i);s += c;}}cout << "Decimal value is :" <<s<<endl; }
嵌套调用
// 输入两个整数,求平方和#include <iostream>
using namespace std;
int fun2(int m) {return m * m;
}
int fun1(int x,int y) {return fun2(x) + fun2(y);
}
int main() {int a, b;cout<<"Please enter two integers (a and b): ";cin >> a >> b;cout << "The sum of square of a and b: " << fun1(a, b) << endl;return 0;
}
递归调用
函数直接或间接地调用自身,称为递归调用。
//Fibonacci数列的第一项为0,第二项为1,后续的每一项是前两项的和
//该数列的前两项的比例趋于一个常量:1.168...,成为黄金分割 数列形如:0 1 1 2 3 5 8 13 21 34...
#include <iostream>
using namespace std;
int leo(int n);int main(){int a =8;int b;b = leo(a);cout<< b<<endl;
}
int leo(int n){// cout<<n;if(n==0 || n==1)return n;elsereturn leo(n-1)+leo(n-2);}
汉诺塔问题:
有三根针A、B、C。A针上有N个盘子,大的在下,小的在上,要求把这N个盘子从A针移到C针,在移动过程中可以借助B针,每次只允许移动一个盘,且在移动过程中在三根针上都保持大盘在下,小盘在上。
#include <iostream>
using namespace std;
//将src针的最上面一个盘子移动到dest针上
void move(char src, char dest) { cout << src << " --> " << dest << endl;
}
//将n个盘子从src针移动到dest针,以medium针作为中转
void hanoi(int n, char src, char medium, char dest)
{if (n == 1)move(src, dest);else {hanoi(n - 1, src, dest, medium);move(src, dest);hanoi(n - 1, medium, src, dest);}
}int main() {int m;cout << "Enter the number of diskes: ";cin >> m;cout << "the steps to moving " << m << " diskes:" << endl;hanoi(m,'A','B','C');return 0;
}
函数的参数传递
- 在函数被调用时才分配形参的存储单元
- 实参可以是常量、变量或表达式
- 实参类型必须与形参相符或可隐式转换为形参类型
- 值传递是传递参数值,即单向传递
- 引用传递可以实现双向传递
- 常引用作参数可以保障实参数据的安全
引用类型
引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。
这两个变量指向同样的地址,对一个操作另一个随着改变。
Type& ref = val; // Type* const ref = &val;int & ref = val; // int * const ref = &val;
- 引用(&)是标识符的别名,例如:
int i, j;
int &ri = i; //定义int引用ri,并初始化为变量i的引用
j = 10;
ri = j; //相当于 i = j;
- 声明一个引用时,必须同时对它进行初始化,使它指向一个已存在的对象。
- 一旦一个引用被初始化后,就不能改为指向其它对象。
- 引用可以作为形参
void swap(int &a, int &b) {...}
输入两个整数并交换(值传递)
#include<iostream>
using namespace std;
void swap(int a, int b) {int t = a;a = b;b = t;
}
// 引用传递
void swap1(int &a, int &b) {int t = a;a = b;b = t;
}
// 指针传递
void swap2(int *a, int *b) {int *t = a;a = b;b = t;
}
int main() {int x = 5, y = 10;cout<<"前: "<<"x = "<<x<<" y = "<<y<<endl;swap(x, y);cout<<"swap: "<<"x = "<<x<<" y = "<<y<<endl;swap1(x, y);cout<<"swap1: "<<"x = "<<x<<" y = "<<y<<endl;swap2(&x, &y);cout<<"swap2: "<<"x = "<<x<<" y = "<<y<<endl;return 0;
}
可变数量形参
- 使用模板类initializer_list(T为类模板,模板将于第9章介绍)可向函数传递同类型不定个数参数,例如:
for (auto &info: lst)cout << info << ‘ ’;cout << endl;}log_info({“Hello”, ”world”, “!”});
- initializer_list lst 接受不定个数字符串实参
- 注意,实参以大括号列表方式给出
- 使用范围for语句遍历 lst,auto自动推断元素为string类型
内联函数
声明时使用关键字 inline
。
编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销。
注意:
- 内联函数体内不能有循环语句和switch语句;
- 内联函数的定义必须出现在内联函数第一次被调用之前;
- 对内联函数不能进行异常接口声明。
#include <iostream>
using namespace std;const double PI = 3.14159265358979;
inline double calArea(double radius) {return PI * radius * radius
}int main() {double r = 3.0;double area = calArea(r);cout << area << endl;return 0;
}
带默认参数值的函数
可以预先设置默认的参数值,调用时如给出实参,则采用实参值,否则采用预先设置的默认参数值。
例如:
int add(int x = 5,int y = 6) {return x + y;
}
int main() {add(10,20); //10+20add(10); //10+6add(); //5+6
}
默认参数值的说明次序:
有默认参数的形参必须列在形参列表的最右,即默认参数值的右面不能有无默认值的参数
调用时实参与形参的结合次序是从左向右
例:
int add(int x, int y = 5, int z = 6);//正确
int add(int x = 1, int y = 5, int z);//错误
int add(int x = 1, int y, int z = 6);//错误
默认参数值与函数的调用位置
如果一个函数有原型声明,且原型声明在定义之前,则默认参数值必须在函数原型声明中给出;而如果只有函数的定义,或函数定义在前,则默认参数值需在函数定义中给出。
例:
int add(int x = 5,int y = 6);
//原型声明在前
int main() {add();
}
int add(int x,int y) {
//此处不能再指定默认值return x + y;
}------------------------------------------------------
int add(int x = 5,int y = 6) {
//只有定义,没有原型声明return x + y;
}
int main() {add();
}
函数重载
C++允许功能相近的函数在相同的作用域内以相同函数名声明,从而形成重载。方便使用,便于记忆。
例:
// 形参类型不同
int add(int x, int y);
float add(float x, float y);// 形参个数不同
int add(int x, int y);
int add(int x, int y, int z);
注意事项:
- 重载函数的形参必须不同:个数不同或类型不同。
- 编译程序将根据实参和形参的类型及个数的最佳匹配来选择调用哪一个函数。
// 编译器不以形参名来区分
int add(int x,int y);
int add(int a,int b);// 编译器不以返回值来区分
int add(int x,int y);
void add(int x,int y);
不要将不同功能的函数声明为重载函数,以免出现调用结果的误解、混淆。
int add(int x, int y)
{ return x + y; }float add(float x,float y)
{ return x - y; }
使用C++系统函数
C++的系统库中提供了几百个函数可供程序员使用,例如:
- 求平方根函数(sqrt)
- 求绝对值函数(abs)
使用系统函数时要包含相应的头文件,例如:cmath
题目:
从键盘输入一个角度值,求出该角度的正弦值、余弦值和正切值。
分析:
系统函数中提供了求正弦值、余弦值和正切值的函数:sin()、cos()、tan(),函数的说明在头文件cmath
中。
#include <iostream>
#include <cmath>
using namespace std;
const double PI = 3.14159265358979;int main() {double angle;cout << "Please enter an angle: ";cin >> angle; //输入角度值double radian = angle * PI / 180; //转为弧度cout << "sin(" << angle << ") = " << sin(radian) <<endl;cout << "cos(" << angle << ") = " << cos(radian) <<endl;cout << "tan(" << angle << ") = " << tan(radian) <<endl;return 0;
}
头文件cmath
中。
#include <iostream>
#include <cmath>
using namespace std;
const double PI = 3.14159265358979;int main() {double angle;cout << "Please enter an angle: ";cin >> angle; //输入角度值double radian = angle * PI / 180; //转为弧度cout << "sin(" << angle << ") = " << sin(radian) <<endl;cout << "cos(" << angle << ") = " << cos(radian) <<endl;cout << "tan(" << angle << ") = " << tan(radian) <<endl;return 0;
}
第三章 函数 C++语言程序设计第五版 - 郑莉相关推荐
- C++语言程序设计第五版 - 郑莉(第三章课后习题)
第3章 函数 3-8 编写函数把华氏温度转换为摄氏温度,公式为:C = (F - 32) * 5/9 在主程序中提示用户输入一个华氏温度,转化后输出相应的摄氏温度. #include<iost ...
- C++语言程序设计第五版 - 郑莉(第六章课后习题)
第6章 数组.指针与字符串 6-20 实现一个名为 SimpleCircle 的简单圆类.其数据成员 int* itsRadius 为一个指向其半径值的指针,存放其半径值.设计对数据成员的各种操作 ...
- C++语言程序设计第五版 - 郑莉(第四章课后习题)
第4章 类与对象 4-9设计并测试一个名为rectangle的矩形类,其属性为矩形的左下角与右上角坐标,根据坐标能计算矩形的面积. #include <iostream> using n ...
- C++语言程序设计第五版 - 郑莉(第七章课后习题)
第7章 继承与派生 7-5 定义一个基类 Shape,在此基础上派生出 Rectangle 和 Circle,二者都有 getArea()函数计算对象的面积.使用 Rectangle类创建一个派生类 ...
- C++语言程序设计第五版 - 郑莉(第五章课后习题)
第5章 数据的共享与保护 5-7定义一个Cat类,拥有静态数据成员 numOfCats,记录Cat的个体数目:静态成员函数getNumOfCats(),读取numOfCats.设计程序测试这个类,体 ...
- C++语言程序设计第五版 - 郑莉(第九章课后习题)
第9章 群体类和群体数据的组织 9-1 编写程序提示用户输入一个班级中的学生人数 n,再依次提示用户输入 n 个人在课程 A 中的考试成绩,然后计算出平均成绩,显示出来.请使用本书第 9 章中的数组 ...
- C++语言程序设计第五版 - 郑莉(第二章课后习题)
第2章 C++简单程序设计 2-25 编写一个完整的程序,实现功能:向用户提问"现在正在下雨吗?",提示用户输入Y 或N.若输入为Y,显示"现在正在下雨.": ...
- C++语言程序设计第五版 - 郑莉(第十一章课后习题)
第11章 流类库与输入输出 11-3 使用 I/O 流以文本方式建立一个文件 test1.txt,写入字符"已成功写入文件!",用其他字处理程序(例如 Windows 的记事本程 ...
- C++语言程序设计第五版 - 郑莉(第八章课后习题)
第8章 多态性 8-4 请编写一个计数器 Counter类,对其重载运算符"+". #include <iostream> using namespace std;cl ...
最新文章
- php转java知乎_php程序员来谈谈php和java
- python程序设计祁瑞华答案_【单选题】有六个元素 6 , 5 , 4 , 3 , 2 , 1 的顺序进栈,问下列哪一个不是合法的出栈序列? (2.0分)...
- 关于CSS中的相对路径和绝对路径
- 领域驱动设计 pdf_什么是领域驱动设计?
- 23. 合并K个排序链表
- python在线投票系统讲解_在线投票系统功能分析
- cordova mismatch of cpu architecture问题的解决
- Linux Kernel 5.8 发布,华为内核代码贡献全球持续领先
- [转载] 这100道练习,带你玩转Numpy
- CSV Converter Pro for Mac(CSV数据转换工具)
- mser python车牌识别_HyperLPR车牌识别
- matlab随机抽样模拟,随机抽样一致性算法(matlab)
- 使用VUE前端开发Lodop打印程序,实现网页打印模块
- 将PDF文件进行文件的编辑需要利用什么软件
- 安卓期末大作业——番茄小说APP
- 台式计算机截图快捷键,电脑截屏的快捷键是什么
- TensorRT:NvInfer.h-上篇
- 辩证法中包括一个关系、两大特征、三大规律、四种方法、五对范畴
- 【考前冲刺整理】20220812
- 对于通用计算机而言,MIT论文:通用计算机时代即将终结
热门文章
- java五子棋_Java初级项目——从零开始制作一个简易五子棋游戏
- java 504错误怎么解决_求助java.lang.NoClassDefFoundError怎么解决,报错信息如下
- easyswoole事务mysql_easyswoole ORM 事务操作管理
- linux下java转储线程_Java线程转储prio值与linux上的真实线程优先级不对应?
- php 面试靠快速排序,搞定PHP面试 - 常见排序算法及PHP实现
- java nio 事件_Java NIO原理及实例
- bzoj 1974: [Sdoi2010]代码拍卖会
- Codeforces Codeforces Round #383 (Div. 2) E (DFS染色)
- 关于Python对齐问题
- 实现远程连接MySQL