编写函数 maxIncrease,用于计算一个销售额序列中的最大销售增幅并返回。这里的销售额都是非负整数。

对于给定的销售额序列 A,假设序列 A 的长度为 ,最大销售额增幅是指满足 的  的最大值。

例如,销售额序列 11,3,5,7,9,2,4,6,8,10 的最大增幅为 8(在时)。

函数 maxIncrease 需要将数组作为参数传入,在该数组中计算最大销售额增幅并返回。

数组作为函数的参数

由于数组的存储是内存中一块连续的单元,数组元素的个数也是不确定的(不同的数组可能包含不同个数的数组元素),因此函数传递数组需要传递两个信息,一个是数组的地址(数组名就是数组地址),告诉被调用函数该数组存放在内存什么地方,另一个是数组元素个数,告诉被调用函数访问该数组时允许的下标范围(防止访问越界)。

参数传入一个整型数组的函数的函数原型如下:

void convertScores(int a[], int len);
第一个参数 a 是一个数组类型的形式参数。该参数 a 接收传入数组的数组名,也就是数组的首地址,其后的方括号中的数组长度不需要,即使有,编译器也会将其忽略;第二个参数 len 是整型参数。该参数 len 传入数组 a 的长度,即 a 有 len 个数组元素,访问 a 的元素的下标范围就是 0 到 len-1。

例如:下面的程序将一个整型数组中存放的10名同学的百分制成绩转换为5分制,并输出。

    #include <iostream>using namespace std;// 分数转换函数的函数原型,其中:s-学生成绩数组名,len-学生成绩个数void convertScores(int s[], int len);int main(){// 定义学生成绩数组并初始化int scores[10] = {85, 63, 72, 52, 95, 82, 77, 69, 88, 73};convertScores(scores, 10);     // 调用分数转换函数convertScores// 转换完成后输出分数数组中的分数for(int i = 0; i < 10; i++)cout << "scores["<<i<<"] = " << scores[i] << endl;return 0;}// 函数convertScoresvoid convertScores(int s[], int len){// 逐个访问数组中的每个元素,并做转换for (int i = 0; i < len; i++)s[i] = s[i]/20;
// 修改 s[i] 实际上就是修改 main 函数中的 scores[i],因为 s 和 scores 拥有相同的地址值}

程序的输出为:

  1. scores[0] = 4
  2. scores[1] = 3
  3. scores[2] = 3
  4. scores[3] = 2
  5. scores[4] = 4
  6. scores[5] = 4
  7. scores[6] = 3
  8. scores[7] = 3
  9. scores[8] = 4
  10. scores[9] = 3

上述示例中函数调用 convertScores(scores, 10); 导致数组 scores 中的每个元素都被转换了。也就是说,在被调用函数体内对数组 s(形式参数)的元素进行的修改操作实际上作用在了数组 scores(实在参数)的元素上。

实际上,C 和 C++ 在处理数组参数时是严格地采取了传值方式。

参数传递数组的方式有比较特殊的地方,要理解传递数组的机制,首先要明确下面两点:

  1. 和一般变量一样,数组名也是有值的,数组名的值就是数组的第一个元素的地址(首地址);

  2. 和一般变量一样,数组作为函数参数进行传递时,传递的也是数组变量的值,即数组第一个元素的地址。

由于数组名的值就是数组的第一个元素的地址,而访问数组元素的方式是数组名加下标(也就是首地址加下标),才使得尽管采取的是传值方式,但在被调用函数 convertScores 中,通过 s 加下标的方式访问数组元素,实际上访问的就是 main 函数中定义的数组 scores 的数组元素,因为 s 和 scores 代表了同样的地址位置。

也就是说,函数调用数组时是采用了传值方式,但是可以对数组里的元素进行直接修改。

预期输出

程序

#include <iostream>
using namespace std;// 函数maxIncrease:计算销售额增幅
// 参数:s-销售额数组,n-销售额数组长度,n>1
// 返回值:销售额最大增幅
int maxIncrease(int s[], int n);int main()
{int n, a[30], i;     // 定义变量及数组,n-销售额个数,a-销售额数组cin >> n;      // 输入销售额数量,n>1// 输入n个销售额,分别存入a[0]到a[n-1]for(i = 0; i < n; i++)cin >> a[i];i = maxIncrease(a,n);cout << "最大销售增幅为:" << i << endl;return 0;
}int maxIncrease(int s[], int n)
{//请在此添加代码,实现函数maxIncrease/********** Begin *********/int a[n], h, b;int j;for (int i = 0; i < n; i++){j = i + 1;b = s[j - 1];for (; j < n; j++){if (b < s[j]){b = s[j];}}a[i] = b - s[i];b = 0;}h = a[0];for(int k = 0; k < n; k++){if (h < a[k]){h = a[k];}}return h;/********** End **********/
}

测试

【CC++】数组作为函数的参数相关推荐

  1. 数组作为函数的参数传参时,数组名会退化为指针

    1.数组作为函数的参数传参时,数组名会退化为指针 数组作为函数的参数传参时,数组名会退化为指针,数值传参时,需要把数值的长度一起传过去,另外,sizeof()运算符包含字符串的哨兵'/0',而strl ...

  2. 求一个二维数组外围元素之和_C++数组作为函数的参数(学习笔记:第6章 04)...

    数组作为函数的参数[1] 数组元素作实参,与单个变量一样. 数组名作参数,形.实参数都应是数组名(实质上是地址,关于地址详见后续章节),类型要一样,传送的是数组首地址.对形参数组的改变会直接影响到实参 ...

  3. C++笔记 二维数组作为函数的参数详解 三种传参的方法总结 注意要点总结

    文章目录 1.C/C++ 二维数组作为函数的参数 2.不合法写法总结 3.测试案例 3.1 传参方式1 3.2 传参方式2 3.3 传参方式3 4.运行结果 5.总结 1.C/C++ 二维数组作为函数 ...

  4. 二维数组作为函数的参数和返回值

    1. 二维数组作为函数的参数  (1)错误的做法:将二维数组传递给二维指针 //实参是二维数组,形参是int**,这样做的话编译器会报错 int main() {int arr[3][4] = { 1 ...

  5. C语言-二维数组做函数的参数

    文章目录 1 引例 2 观点1 这种使用方法是错误的 3 观点2 根本不需要这么做 4 二维数组做函数参数的方法 4.1 方法1 4.2 方法2 4.3 方法3 5 与Java的不同 1 引例 下面的 ...

  6. 如何调用形参数组_函数的参数

    # 一.形参和实参 # 1.形参:在定义函数阶段定义的参数称之为形式参数,简称形参 # 2.实参:在调用函数阶段传简称实参入的值称为实际参数, # 形参与实参的关系: # 1.在调用阶段,实参(变量值 ...

  7. C++实现字符串数组作为函数的参数的反序输出

    #include<iostream> using namespace std; const int N=10; char inverse(char ss[],int n);//函数声明 i ...

  8. C++二维数组作为函数参数

    #include <iostream> #include <Windows.h>//版本一 省略函数 //二维数组省略一个高维函数 但低维位函数必须定义 void printf ...

  9. 使用数组作为函数参数

    #include <iostream> #include <Windows.h>using namespace std;void scoreprint(int score[], ...

最新文章

  1. “我太喜欢你了”——友情的表达方式?
  2. EOS 智能合约源代码解读 (11)wrap合约“action_wrapper类”
  3. 图像处理之直方图均衡MATLAB代码实现
  4. [转载] MFC绘制动态曲线,用双缓冲绘图技术防闪烁
  5. javaScript事件(一)事件流
  6. 牛客网 【每日一题】6月10日 失衡天平
  7. Linux 下挂载新硬盘方法(转)
  8. 服务机器人占领智能安防哪些领域?
  9. 分布式,去中心化,协作性,可适应性
  10. 解决html中图片自适应屏幕大小的问题
  11. 微信开发之测试号申请
  12. 基因组所三代单分子测序PacBio完成技术升级—超长读长助力基因组学研究
  13. 2018中国大学生程序设计竞赛 – 网络选拔赛 1001 Buy and Resell [模拟]
  14. 华为手机SD卡升级指导
  15. 由于找不到mscoree.dll无法继续执行代码
  16. react学习—ref Hook
  17. c#跳出循环break与continue
  18. 盐城北大青鸟十二月十日小报
  19. 1455: 数列有序
  20. 共享单车技术含量,一篇文章全说透了!

热门文章

  1. notes——快捷键
  2. 有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
  3. vert.x+java入门_vertx从入门到精通
  4. 上下Div固定,中间div高度自适应(随浏览器高度变化而变化)
  5. 星系超级计算机,超级计算机创造了数以百万计的虚拟宇宙来了解星系的进化
  6. 常见无线定位技术的基本原理
  7. 电销机器人帮助你提高工作效率
  8. 2017网易前端笔试题总结
  9. 龙测案例-拼多多小程序
  10. python boss直聘爬取2019-09