【C++/函数】实验2
1.实验内容
- 函数声明和函数定义:
- 形参和实参: 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。
- 形参:形式参数,表示主调函数与被调函数之间的联系。标识了在形参出现的位置应该有一个什么类型的数据。 特性:在调用时才分配内存空间,用完即释放。
- 实参:实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参
- 返回值的作用:1.返回函数的运算结果。 2.return; 用于结束当前的函数执行。
- 函数的参数传递:
- 值传递:单向值传递 函数调用时,给形参分配内存空间,并由实参对形参进行初始化。一旦形参获得值便与实参脱离,此后形参不再影响实参。
- 引用传递:作用:子函数中形参做的更改对实参有效。声明一个引用时,必须对他进行初始化,使它指向一个存在的对象,并且不能再指向其他对象。引用作为形参时,初始化在调用该函数时发生,这样引用类型的形参就成了实参的别名,对形参的修改可以直接作用于实参。
2.题目及代码:
- 实现一个简单的菜单程序输入。运行时显示“Menu:A(dd) D(elete) S(ort) Q(uit) Select one:”,输入A D S Q分别表示数据的增加,删除,排序,退出。(分别运用if...else,switch )第一个用if else 实现
#include<iostream>
using namespace std;
//使用if...else
int main(){
char n;
cout<<"Menu:A(dd) D(elete) S(ort) Q(uit) Select one:";
while(cin>>n){ if(n=='A')
cout<<"数据已增加"<<endl;
else if(n=='D')
cout<<"数据已删除"<<endl;
else if(n=='S')
cout<<"数据已排序"<<endl;
else{
cout<<"退出"<<endl;
break;}
cout<<endl;
cout<<"请再次输入"<<endl;
}
return ; }用switch实现
#include<iostream>
using namespace std;
int main(){
char n;
cout<<"Menu:A(dd) D(elete) S(ort) Q(uit) Select one:";
while(cin>>n){
switch(n){
case 'A':{
cout<<"数据已增加"<<endl;
break;}
case 'D':{
cout<<"数据已删除"<<endl;
break;
}
case 'S':{
cout<<"数据已排序"<<endl;
break;
}
case 'Q':{
cout<<"退出"<<endl;
break;
}
}
if(n=='Q')
break;
cout<<"请再次输入"<<endl; }
return ;
}
- 实现一个简单的菜单程序输入。运行时显示“Menu:A(dd) D(elete) S(ort) Q(uit) Select one:”,输入A D S Q分别表示数据的增加,删除,排序,退出。(分别运用if...else,switch )第一个用if else 实现

- 用穷举法找出1—100之间的质数并显示出来。
思路:将判断质数单独写成一个函数,如果一个数从2开始到他本身都没有能整除他的数即为质数。利用三个子函数(分别采用while,do...while,for)输出打印质数。
#include<iostream>
using namespace std;
//判断质数:1到sqrt(n)都没有能整除它的数
int zspan(int n){
int i;
for( i=;i<n;i++){
if(n%i==)break;
}
if(i>=n) return ;
else return ;
}
//输出质数 三种不同的循环语句实现
int coutzhishu1(int n){
while(n<=){
if(zspan(n))
cout<<n<<" ";
n++;
}cout<<endl;
return ;
}
int coutzhishu2(int n){
do{
if(zspan(n))
cout<<n<<" ";
n++;
}while(n<);
cout<<endl;
return ;
}
int coutzhishu3(int n){
for(int i=n;i<=;i++){
if(zspan(i))
cout<<i<<" ";
}
cout<<endl;
return ;
} int main(){
int n=;
coutzhishu1(n);
coutzhishu2(n);
coutzhishu3(n);
return ;
}

- 题目:在程序中定义一个整型变量,赋予1-100的值。要求用户猜这个数,比较两个数的大小,把结果提供给用户,直到猜对为止。
#include<iostream>
using namespace std;
int main()
{
int i=;
int n;
while( cin>>n){
if(n!=){
if(n<)
{cout<<"你的数比目标值小,重新猜"<<endl;
continue;
}
else{
cout<<"你的数比目标值大,重新猜"<<endl;
continue;
}
}
else{ cout<<"答对了!"<<endl;
break;}
}
}
题目:口袋中有红黄蓝白黑5种颜色的球若干个,每次从口袋中取出3个颜色不同的球。问有几种取法。
#include<iostream>
using namespace std;
enum color{ red,yellow,blue,white,black
};
int main(){
int i,j,k,n=;
for(i=red;i<=black;i++){
for(j=red;j<=black;j++){
if(i!=j){
for(k=red;k<=black;k++){
if(i!=k&&j!=k){
n=n+;
cout<<i<<j<<k<<" ";
}
}
}
}
}
cout<<"一共取法:"<<n<<endl;
return ; }
- 题目:在程序中定义一个整型变量,赋予1-100的值。要求用户猜这个数,比较两个数的大小,把结果提供给用户,直到猜对为止。
3.第三章收获:
- 递归算法:实质是将原有问题分解成新的问题,解决新问题又用到原有问题的解。最终的子问题,是一个已知的解,合并起来能形成原问题的解。步骤:
- 递推:将原问题不断的分解为新的问题。一直到最小已知的解答项。
- 回归:从已知条件出发,逐一求值回归、。

- 递归的运行机制:
- 计算当前函数的实参值
- 分配空间,并将首地址压栈
- 转到函数体,执行语句,递归调用
- 到出口值,从栈顶取出相应的数据,回收空间,转到上一层的调用位置继续执行本次调用未完成的语句。直到取出最后一个值,返回结果。

- 递归的效率:递归调用具体要保存的内容包括:局部变量、形参、调用函数地址、返回值。那么,如果递归调用N次,就要分配N*局部变量、N*形参、N*调用函数地址、N*返回值。这势必是影响效率。递归就是利用系统的堆栈保存函数当中的局部变量来解决问题的,并且这些变量一直不被释放,直到遇到简单情境时才一一出栈释放,所以总的开销就很大。如何改进递归效率是一个需要思考的问题。c++中提供一个inline函数,可以避免参数压栈。能不能用在递归里面?
- 内联函数:不是在调用时发生转移,而是在编译时将函数体嵌入在每一个调用处。这样在被调用处进行代码展开,就省去了参数压栈、栈帧开辟与回收,结果返回等,从而提高程序运行速度。但是在书中P82页上注明,对自身直接调用的递归函数不能使用。原因是,内联函数只是程序员给编译器的一个建议,而递归函数被调用之前也不知道自己要被调用多少次的函数,展开过于庞大,使得代码臃肿。
- 递归函数转化成非递归:迭代:就是利用已知的值推算出下一步的值,可以避免调用栈。大多数的递归都可以转化成迭代函数,使用迭代效率更高,但是没有递归表达更清晰。
- 举例:斐波那契数列:
#include <iostream>
using namespace std; //迭代实现斐波那契数列
long fab_iteration(int index)
{
if(index == || index == )
{
return ;
}
else
{
long f1 = 1L;
long f2 = 1L;
long f3 = ;
for(int i = ; i < index-; i++)
{
f3 = f1 + f2; //利用变量的原值推算出变量的一个新值
f1 = f2;
f2 = f3;
}
return f3;
}
} //递归实现斐波那契数列
long fab_recursion(int index)
{
if(index == || index == )
{
return ;
}
else
{
return fab_recursion(index-)+fab_recursion(index-); //递归求值
}
} int main(int argc, char* argv[])
{
cout << fab_recursion() << endl;
cout << fab_iteration() << endl;
return ;
}
- 举例:斐波那契数列:
- C++的系统函数:很多函数继承C而来,因此继承自C的函数前缀为c,比如cmath.注意少用math.h。(仅仅是能兼容)推荐网址:http://www.cppreference.com 可以查询标准函数原型,头文件。
- 递归算法:实质是将原有问题分解成新的问题,解决新问题又用到原有问题的解。最终的子问题,是一个已知的解,合并起来能形成原问题的解。步骤:
参考资料:
- 《C++语言程序设计》
- https://www.cnblogs.com/bakari/p/5349383.html
- http://blog.csdn.net/K346K346/article/details/52065524
【C++/函数】实验2的更多相关文章
- SQL_wm_concat函数实验:实现字段合并
原创作品,出自 "深蓝的blog" 博客.欢迎转载.转载时请务必注明下面出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlo ...
- 【Azure 应用服务】本地创建Azure Function Kafka Trigger 函数和Kafka output的HTTP Trigger函数实验
问题描述 在上一篇博文(https://www.cnblogs.com/lulight/p/16525902.html)中,我们成功的以VM作为Kafka服务器运行,并且验证了从其他机器中远程访问.在 ...
- 实验与作业(Python)-04 数据类型、数学函数与字符串
截止日期 实验目标 继续熟悉for循环与turtle 数值运算符 math库常用函数 字符串转化为数值类型(int, float, complex) 字符串常用函数 实验内容 任务1.使用for代替w ...
- SEED实验系列文章目录
美国雪城大学SEEDLabs实验列表 SEEDLabs是一套完整的信息安全实验,涵盖本科信息安全教学中的大部分基本原理.项目组2002年由杜文亮教授创建,目前开发了30个实验,几百所大学已采用.实验楼 ...
- 2018-2019-2 20165225《网络对抗技术》Exp1 缓冲区溢出实验
2018-2019-2 20165225<网络对抗技术>Exp1 缓冲区溢出实验 声明 虽然老师在邮箱中要求要把虚拟机名改为个人名字缩写,但是我的kali好像不是很听话...重启数次也没用 ...
- PTA循环,函数,数组作业
PTA循环实验作业 题目一:统计素数并求和 ### 1.PTA提交列表 2.设计思路(+流程图) 先定义变量(包含素数区间,循环次数,除数,素数个数记录和和的记录) 输入范围 一重循环:循环提取自然数 ...
- ARM实验5 —— 按键中断实验
key_int按键中断实验 实验内容: 通过开发板上的按键中断控制led灯进行跑马灯并打印信息. 通过简单事例说明猎户座4412处理器的GIC中断处理的应用,设置key2按键连接的引脚为中断模式,当识 ...
- Python实验案例
Python 运算符.内置函数 实验目的: 1.熟练运用 Python 运算符. 2.熟练运用 Python 内置函数.实验内容: 1.编写程序,输入任意大的自然数,输出各位数字之和. 2.编写程序, ...
- 进程相关的API函数
0x01. ID与句柄 如果我们成功创建一个进程之后,CreateProcess会返回四个数据,id和句柄 句柄的话就是 当前进程私有的句柄表索引(这是当前进程,给别进程也没用) 每个进程都有一张自己 ...
- 开创学习的四核时代-迅为iTOP4412学习开发板
产品特点: 处理器: Exynos 4412 处理器,Cortex-A9四核,功耗性能俱佳! 性能: 1GB(可选2GB) 双通道 64bit数据总线 DDR3: 4GB(可选16GB)固态硬盘EMM ...
随机推荐
- Vue Element使用icon图标(第三方)
element-ui自带的图标库还是不够全,还是需要需要引入第三方icon,自己在用的时候一直有些问题,参考了些教程,详细地记录补充下 对于我们来说,首选的当然是阿里icon库 教程: 1.打开阿里i ...
- 给已经存在的项目添加git
1.打开终端,cd到已存在项目的目录 2.输入以下命令行,初始化一个本地仓库: git init 3.输入以下命令,把工程所有文件都添加到该仓库中(千万别忘记后面的.号!!!): git ...
- No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer
异常信息如下所示: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for cla ...
- PHP知识梳理
前端 HTML.CSS. JS(DOM操作.事件操作).Jquery(选择器.属性/值操作.事件操作).ajax PHP基础 变量(类型.类型转换) 常量(系统.自定义) 运算(算术.字符串.赋值 ...
- PHP 实现自动加载
自动载入主要是省去了一个个类去 include 的繁琐,在 new 时动态的去检查并 include 相应的 class 文件. 先上代码: //index.php <?php class Cl ...
- error running git
I ran xcode-select --install and everything worked for me.
- Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -
mysql -A不预读数据库信息(use dbname 更快)—Reading table information for completion of table and column names Y ...
- IntelliJIdea 2016.2 使用 tomcat 8.5 调试spring的web项目时,bean被实例化两次导致timer和thread被启动了两遍的问题的解决
今天新搭建了一个spring的web项目,项目启动时会启动一个线程,线程里定时执行任务,另外还启动了一个定时器,每秒钟统计系统吞吐量等业务性能数据.但是调试的时候惊奇的发现定时器和线程均被启动了两次. ...
- FFmpeg中的时间基(time_base), AV_TIME_BASE
AV_TIME_BASE 经常在FFmpeg的代码中看到一个奇怪的单位 AV_TIME_BASE ,比如 AVFormatContext 结构体中就有这样一个字段: duration ,它在FFmpe ...
- Variable number of arguments (Varargs)
A parameter of a function (normally the last one) may be marked with vararg modifier: fun <T> ...
