【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 ...
 
随机推荐
- centos安装系统全过程
			
--查看系统 lsb_release -a --查看端口 netstat -lnp|grep 80 ps 进程ID #查看进程的详细信息 kill -9 进程ID --查看Java 版本 java - ...
 - spring boot 中添加mongodb支持
			
1.添加maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactI ...
 - RestTemplate发送请求并携带header信息  RestTemplate post json格式带header信息
			
原文地址: http://www.cnblogs.com/hujunzheng/p/6018505.html RestTemplate发送请求并携带header信息 v1.使用restTempl ...
 - 【转】Selenium - 封装WebDrivers (C#)
			
本文转载自:http://www.cnblogs.com/qixue/p/3977135.html Web element仍然使用OpenQA.Selenium.IWebElement, 本类库将Se ...
 - Activity class {com.../com....MainActivity} does not exist.
			
报错信息如上图所示,解决步骤: 1. 首先是检查这个MainActivity.java是不是真的存在,且包名和路径无误: 2. 如果文件存在,且包名和路径没有问题,那么就打开你项目所在的/androi ...
 - 基于cefsharp的用户浏览器
			
技术:vc++2015 概述 用于需要制作一个浏览器 winfrom 中浏览器的插件有很多种 如:WebBrowser , Web.kit等 但用于比较稳定 功能齐全的还是cefsharp 详细 ...
 - numpy中的方差、协方差、相关系数
			
一.np.var 数学上学过方差:$$ D(X)=\sum_{i\in [0,n)} ({x-\bar{x}})^2 $$ np.var()实际上是均方差,均方差的意义就是将方差进行了平均化,从而使得 ...
 - 【PHP】解析PHP中的错误和异常处理
			
目录结构: contents structure [-] 错误级别 自定义处理器 设置异常日志 自定义异常类 在这篇文章中,笔者将会阐述PHP中的异常处理,希望能够对你有所帮助. 1.错误级别 PHP ...
 - 【C#】解析C#中管道流的使用
			
目录结构: contents structure [+] 匿名管道(anonymous pipe) 命名管道(named pipe) 管道为进程间通信提供了一种可能.管道分为两种,一种是匿名管道,另一 ...
 - 【Spark深入学习 -15】Spark Streaming前奏-Kafka初体验
			
----本节内容------- 1.Kafka基础概念 1.1 出世背景 1.2 基本原理 1.2.1.前置知识 1.2.2.架构和原理 1.2.3.基本概念 1.2.4.kafka特点 2.Kafk ...
 
			
		