1.实验内容

  1. 函数声明和函数定义

  2. 形参和实参: 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。
    • 形参:形式参数,表示主调函数与被调函数之间的联系。标识了在形参出现的位置应该有一个什么类型的数据。  特性:在调用时才分配内存空间,用完即释放。
    • 实参:实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参
  3. 返回值的作用:1.返回函数的运算结果。 2.return; 用于结束当前的函数执行。
  4. 函数的参数传递:
    • 值传递:单向值传递 函数调用时,给形参分配内存空间,并由实参对形参进行初始化。一旦形参获得值便与实参脱离,此后形参不再影响实参。
    • 引用传递:作用:子函数中形参做的更改对实参有效。声明一个引用时,必须对他进行初始化,使它指向一个存在的对象,并且不能再指向其他对象。引用作为形参时,初始化在调用该函数时发生,这样引用类型的形参就成了实参的别名,对形参的修改可以直接作用于实参。

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 ;
      }

    • 用穷举法找出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 ; }

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的更多相关文章

  1. SQL_wm_concat函数实验:实现字段合并

    原创作品,出自 "深蓝的blog" 博客.欢迎转载.转载时请务必注明下面出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlo ...

  2. 实验与作业(Python)-04 数据类型、数学函数与字符串

    截止日期 实验目标 继续熟悉for循环与turtle 数值运算符 math库常用函数 字符串转化为数值类型(int, float, complex) 字符串常用函数 实验内容 任务1.使用for代替w ...

  3. SEED实验系列文章目录

    美国雪城大学SEEDLabs实验列表 SEEDLabs是一套完整的信息安全实验,涵盖本科信息安全教学中的大部分基本原理.项目组2002年由杜文亮教授创建,目前开发了30个实验,几百所大学已采用.实验楼 ...

  4. 2018-2019-2 20165225《网络对抗技术》Exp1 缓冲区溢出实验

    2018-2019-2 20165225<网络对抗技术>Exp1 缓冲区溢出实验 声明 虽然老师在邮箱中要求要把虚拟机名改为个人名字缩写,但是我的kali好像不是很听话...重启数次也没用 ...

  5. PTA循环,函数,数组作业

    PTA循环实验作业 题目一:统计素数并求和 ### 1.PTA提交列表 2.设计思路(+流程图) 先定义变量(包含素数区间,循环次数,除数,素数个数记录和和的记录) 输入范围 一重循环:循环提取自然数 ...

  6. ARM实验5 —— 按键中断实验

    key_int按键中断实验 实验内容: 通过开发板上的按键中断控制led灯进行跑马灯并打印信息. 通过简单事例说明猎户座4412处理器的GIC中断处理的应用,设置key2按键连接的引脚为中断模式,当识 ...

  7. Python实验案例

    Python 运算符.内置函数 实验目的: 1.熟练运用 Python 运算符. 2.熟练运用 Python 内置函数.实验内容: 1.编写程序,输入任意大的自然数,输出各位数字之和. 2.编写程序, ...

  8. 进程相关的API函数

    0x01. ID与句柄 如果我们成功创建一个进程之后,CreateProcess会返回四个数据,id和句柄 句柄的话就是 当前进程私有的句柄表索引(这是当前进程,给别进程也没用) 每个进程都有一张自己 ...

  9. 开创学习的四核时代-迅为iTOP4412学习开发板

    产品特点: 处理器: Exynos 4412 处理器,Cortex-A9四核,功耗性能俱佳! 性能: 1GB(可选2GB) 双通道 64bit数据总线 DDR3: 4GB(可选16GB)固态硬盘EMM ...

  10. spring学习笔记---Jackson的使用和定制

      前言: JAVA总是把实体对象(数据库/Nosql等)转换为POJO对象再处理, 虽然有各类框架予以强力支持. 但实体对象和POJO, 由于"饮食习惯", "民族特色 ...

随机推荐

  1. Git时间(第一次写,这个怎么玩啊)

    1.安装 Liunx直接打开shell界面,输入:sudo apt-get install git-core ,按下回车之后输入密码即可完成安装: Windows系统在https://git-for- ...

  2. [转载]jQuery中wrap、wrapAll和wrapInner用法以及区别

    原文地址:jQuery中wrap.wrapAll和wrapInner用法以及区别作者:伊少君 原文: <ul>   <li title='苹果'>苹果</li>   ...

  3. JSHelper时间格式化

    Helper.prototype.FormatDate = function (format) { var _now = new Date(); var o = { "M+": _ ...

  4. 基于iSCSI的SQL Server 2012群集测试(四)--模拟群集故障转移

    6.模拟群集故障转移 6.1 模拟手动故障转移(1+1) 模拟手动故障转移的目的有以下几点: 测试群集是否能正常故障转移 测试修改端口是否能同步到备节点 测试禁用full-text和Browser服务 ...

  5. spring环境的搭建及作用和定义&lt;一&gt;

    问题?spring的定义及作用.spring的环境搭建 一.spring的定义及作用 1.spring由Rod Johnson创建的一个开源框架,它是为了解决企业应用开发的复杂性而创建的.框架的主要优 ...

  6. mysql数据库全局只读和会话只读问题解析

    对于系统的发布是经常有的事情,有些时候需要隔绝外界对数据库的更改但是还要求可以读取数据,对于mss sql 这个就是很简单,直接属性—>选项—>只读 ,但是对于mysql这是不同的,今天仔 ...

  7. Linux学习笔记8——VIM编辑器的使用

    在ubuntu中,敲入命令行:sudo apt-get install vim,然后输入系统密码,确认Y,即可下载vim 按下vim,在后面跟上文件的路径,即可进入文件到编辑模式,如果不存在该文件,将 ...

  8. python爬虫从入门到放弃(七)之 PyQuery库的使用

    PyQuery库也是一个非常强大又灵活的网页解析库,如果你有前端开发经验的,都应该接触过jQuery,那么PyQuery就是你非常绝佳的选择,PyQuery 是 Python 仿照 jQuery 的严 ...

  9. hadoop多文件格式输入

    版本号: CDH5.0.0 (hdfs:2.3.mapreduce:2.3,yarn:2.3) hadoop多文件格式输入,一般能够使用MultipleInputs类指定不同的输入文件路径以及输入文件 ...

  10. animate动画效果

    $(selector).animate({params},speed,callback); 转载:https://www.runoob.com/jquery/jquery-animate.html j ...