New PTA6-1 求出数组中最大数和次最大数
文章目录
- **New PTA6-1** **求出数组中最大数和次最大数**
-
- 为解决 先后交换 最大 与 次大数 顺序引起的 程序结果不同 的问题
-
- 程序要求:
- 要求定义 void fun ( int *a, int n )函数并调用,函数功能是求出数组中最大数和次最大数,并把最大数和a[0]中的数对调、次最大数和a[1]中的数对调,函数形参 a 的类型是整型指针,形参n的类型是int,函数的类型是void。
- 其中 `a`和 `n`都是用户传入的参数。函数 fun 的功能是求出指针`a` 所指数组中的`n`个元素的最大数和次最大数,并把最大数和a[0]中的数对调、次最大数和a[1]中的数对调。
- 如果传入的排序数组大小为0就停止排序
- 分析:1. 排序所用到的数据为
- 2.要做的工作:
- 3 . 需要讨论的情况:
- 第一种情况:a[0],a[1] 与a[Index_Max],a[Index_Sec] ==完全不重合==
- 第二种情况:a[0],a[1] 与a[Index_Max],a[Index_Sec] ==重合==
- 第三种情况:a[0],a[1] 与a[Index_Max],a[Index_Sec] ==部分重合==
- Index_Max==1的情况:最大值在1号位
- Index_Sec==0的情况:次大值在0号位
- 完整代码
- 简化后的代码:
为解决 先后交换 最大 与 次大数 顺序引起的 程序结果不同 的问题
解决重点:有关数组的插入顺序,忽略前面数组内 查找 的内容
解决思路:在原函数体的基础题目稍加改进变成一个用户自己输入数据的编程题目
文末附完整代码及简化后的完整代码
程序要求:
要求定义 void fun ( int *a, int n )函数并调用,函数功能是求出数组中最大数和次最大数,并把最大数和a[0]中的数对调、次最大数和a[1]中的数对调,函数形参 a 的类型是整型指针,形参n的类型是int,函数的类型是void。
其中 a
和 n
都是用户传入的参数。函数 fun 的功能是求出指针a
所指数组中的n
个元素的最大数和次最大数,并把最大数和a[0]中的数对调、次最大数和a[1]中的数对调。
如果传入的排序数组大小为0就停止排序
主程序样例:
#include <stdio.h>
void fun ( int *a, int n );
int main( )
{
int n, i;
while(scanf("%d",&n))
{
if(n==0)
{
break;
}
int b[n];
for ( i=0; i<n; i++ ) scanf("%d", &b[i]);
fun ( b, n );
printf("对掉之后的数组为:\n");
for ( i=0; i<n; i++ ) printf("%d ", b[i]);
printf("\n");
}
return 0;
}
本题的示范数据都使用
a[10]数组元素的不同顺序来演示 如下:
分析:1. 排序所用到的数据为
数组首元素 a[0] 数组第二号元素 a[1]
数组中的最大元素 a[Index_Max] 数组中的第二大元素 a[Index_Sec]
2.要做的工作:
3 . 需要讨论的情况:
第一种情况:a[0],a[1] 与a[Index_Max],a[Index_Sec] 完全不重合
测试样例1
10
3 9 5 0 12 6 11 7 10 8
输出样例1
对掉之后的数组为:
12 11 5 0 3 6 9 7 10 8
实现代码 如下:
else//课上交换最大值 次大值的代码部分
{
int temp=a[0];
a[0]=a[Index_Max];
a[Index_Max]=temp;
temp=a[1];
a[1]=a[Index_Sec];
a[Index_Sec]=temp;
}
此时直接利用临时变量temp进行交换数值即可 (酱油与醋+空瓶子)
第二种情况:a[0],a[1] 与a[Index_Max],a[Index_Sec] 重合
正向重合的时候归入第一种情况的代码
反向重合代码
if(Index_Max==1&&Index_Sec==0)
{
int //将两个数值直接交换就可得到要求的数列 涉及的数据 a[0] 和 a[1]
temp=a[Index_Max];
a[Index_Max]=a[Index_Sec];
a[Index_Sec]=temp;
}
第三种情况:a[0],a[1] 与a[Index_Max],a[Index_Sec] 部分重合
正向重合:a[0]与a[Index_Max]重合 或者 a[1] 与a[Index_Sec] 重合(两项指标 红框表示重合)
输入样例2:
10
6 11 5 0 3 12 9 7 10 8
10
12 9