程序设计部分 指针(三) 第1关:指针作为函数参数

任务描述
本关任务:计算一个数组中除最大数字之外的数字之和。

相关知识
指针形参
指针既然也是一种数据类型,自然也可以作为函数的形式参数。一般使用指针来让函数能修改外部内容,或者传递体积比较大的内容,比如:

void Swap(int *a,int *b)
{
    int t = *a;
    *a = *b;
    *b = t;
}
int main()
{
    int a = 10,b = 20;
    Swap(&a,&b);
    cout <<a << endl << b << endl;
}
得到的结果是:
20
10

实现了两个变量的交换。

数组形参
之前说到数组作为形参时,第一个维度是可以省略长度的,这实际上是因为数组形参会被变成其元素指针类型,比如:

void Func(int a1[],int a2[][10]); //等价于 void Func(int *a1,int (*a2)[10])
通过sizeof运算符也可以发现这一点:

void Size(int arr[10][10])
{
    cout << sizeof(arr) << endl;
}
int main()
{
    int arr[10][10];
    Size(arr);
    cout << sizeof(arr) << endl;
}
得到的结果是:
4
400

4是因为输出的是指针,而400则因为输出的是数组。

常量指针
有时候我们只想让别的代码读取指针所指数据,而不想让它写入,这个时候就可以用常量指针了。

常量指针虽然说是指向常量的指针,但其实可以指向变量,比如:

int a = 0;
const int b = 0; //一个整型常量
const int *ptr; //声明一个常量指针
ptr = &b; //指向一个常量
ptr = &a; //指向一个变量,也是可以的
cout << *ptr << endl; //只是读取,正确
*ptr = 1; //尝试写入,错误!
将常量指针用在形参上,就可以防止函数修改指针所指的内容,常用于字符串,比如:

void Print(const char *str) //字符串常量指针,只允许读
{
    cout << str << endl;
    str[0] = 'h'; //错误!
}
int main()
{
    char str[] = "Hello";
    Print(str); //变量传递给常量,没问题
    str[0] = 'h'; //在这里可以随意修改
}
另外,需要注意的是常量指针说的是指向一个常量,不能修改的是所指向对象的内容,指针本身是可以修改。与此对应的是指针常量,比如:

int a,b;
const int *p1 = &a; //常量指针
p1 = &b; //正确
*p1 = 0; //错误
int * const p2 = &b; //指针常量,只能初始化
p2 = &b; //错误
p2 = &a; //错误
*p2 = 0; //正确
const int * const p3 = &a; //指向常量的指针常量,等于上面两种之和
编程要求
右侧编辑器中有一个函数Sum,它有两个参数arr和len,代表一个数组和这个数组的长度。

请在这个函数中补充代码,计算除数组最大元素之外其他元素的和,并将其输出,占一行。

注意:如果数组长度为0,则结果也是0。

输入数据由评测系统读取,并传递给Sum函数。具体见测试说明。

测试说明
平台会对你编写的代码进行测试:

测试输入:
5
1 2 3 7 9
预期输出:
13

测试输入:
4
1 2 4 4
预期输出:
3

每组输入有两行,第一行是数组的长度,第二行是数组的内容。
 

参考代码

#include <iostream>

using namespace std;

void Sum(const int * arr, int len) {
  /**********   Begin   **********/
  if (len == 0) {
    printf("0\n");
    return;
  }

  int max = arr[0];
  int sum = 0;

  // 找到数组中的最大值  
  for (int i = 0; i < len; i++) {
    if (arr[i] > max) {
      max = arr[i];
    }
  }

  // 计算所有元素的总和,并同时减去所有等于最大值的元素  
  for (int i = 0; i < len; i++) {
    sum += arr[i];
    if (arr[i] == max) {
      sum -= max;
    }
  }

  // 输出结果  
  printf("%d\n", sum);
  /**********   End   **********/
}

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值