【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 ...
随机推荐
- ABAP非Unicode系统中字符串拼接(CONCATENATE)时吃字符问题
系统是老R3,非Unicdoe系统,某些表字段是从外界系统过来的,由于接口设计的固定长度,外界系统传超长字符串过来后,就可能从最后一个中文字符中间截断,这问题到还没什么,只不过显示时最后一个字符显示成 ...
- shell编程学习笔记(六):cat命令的使用
这一篇不是讲shell编程的,专门讲cat命令.shell编程书用到了这个cat命令,顺便说一下cat命令. cat命令有多种用法,我一一来列举(以下蓝色字体部分为Linux命令,红色字体的内容为输出 ...
- 有钱人都用iphone?
身边的朋友用iphone, 大家都会调侃真有钱. 大数据显示, 人家是真的有钱. 看看来自腾讯移动分析数据 你玩过抖音就知道, 拍视频, 传视频的过的看着都挺滋润的. 反观用安卓的用户, 前20个应用 ...
- 招中高级web开发工程师
>>招中高级web开发工程师
- 【Docker江湖】之docker部署与理解
转载请注明出处:http://blog.csdn.net/gamer_gyt 博主微博:http://weibo.com/234654758 Github:https://github.com/thi ...
- Linux 互斥锁
互斥的概念 在多线程编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性. 每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻, 只能有一个线程访问该 ...
- canvas 水滴图、液体进度条、仿加速球、圆球水波图
传送门:https://github.com/guoyoujin/WaterMoire <!DOCTYPE html> <html lang="en"> & ...
- 一分钟内搭建全web的API接口神器json-server详解
JSON-Server 是一个 Node 模块,运行 Express 服务器,你可以指定一个 json 文件作为 api 的数据源. 安装json-server npm install -g json ...
- 【iCore1S 双核心板_ARM】例程二十:UART_IAP_ARM实验——更新升级STM32
实验现象及操作说明: 1.本例程共有两个代码包,APP和IAP,IAP程序功能实现将APP程序升级至STM32中. 2.直接上电或烧写程序将执行升级的APP应用程序. BIN升级文件产生方法: 1.编 ...
- (转)The C10K problem翻译
The C10K problem 如今的web服务器需要同时处理一万个以上的客户端了,难道不是吗?毕竟如今的网络是个big place了. 现在的计算机也很强大了,你只需要花大概$1200就可以买一个 ...