当前位置:   article > 正文

C语言:输入正整数n,再输入n个互不相同的整数,将最小值与第一个数交换,最大值与最后一个数交换,然后输出交换后的n个数。_输入1个正整数n(1<=n<=10),然后输入n个整数并存放在数组中,将这n个整数从大到小排

输入1个正整数n(1<=n<=10),然后输入n个整数并存放在数组中,将这n个整数从大到小排

题目:

输入正整数n(1<n<=10),再输入n个互不相同的整数,将最小值与第一个数交换,最大值与最后一个数交换,然后输出交换后的n个数。

解题思路:

  1. 定义数组,将n个整数存入数组中。
  2. 利用循环遍历数组,找出数组中最大元素的下标和最小元素的下标。
  3. 将最小值与第一个数交换,最大值与最后一个数交换。
  4. 输出交换后的数。

代码:

注:这是一段存在错误的代码,想直接看完整的正确代码请往下划到代码改进

  1. #include<stdio.h>
  2. #define N 10
  3. void swap(int* a, int* b)//定义两数交换函数
  4. {
  5. int temp = *a;
  6. *a = *b;
  7. *b = temp;
  8. }
  9. int main()
  10. {
  11. int n;
  12. int a[N] = { };
  13. int i, min = 0, max = 0;
  14. printf("输入正整数n(1<n<=10):");
  15. scanf("%d", &n);
  16. printf("输入%d个互不相同的整数:", n);
  17. for (i = 0; i < n; i++)
  18. scanf("%d", &a[i]);//将n个整数存入数组中
  19. for (i = 0; i < n; i++)//找出最大元素下标
  20. if (a[i] > a[max])
  21. max = i;
  22. for (i = 0; i < n; i++)//找出最小元素下标
  23. if (a[i] < a[min])
  24. min = i;
  25. swap(&a[max], &a[n - 1]);//调用函数
  26. swap(&a[min], &a[0]);
  27. for (i = 0; i < n; i++)//输出交换后的数
  28. printf("%d", a[i]);
  29. return 0;
  30. }

运行结果:

 代码改进:

作者收到小伙伴的私信说输入3 1 0时输出了错误的结果,也就是如果最小值在数组的最后一项,将得到一个错误结果

我重新看了一遍我的代码,这个小伙伴是对的,我的代码确实有误,这是思维不够严谨导致的

我们跟着错误的代码走一遍流程,先明确为什么代码会出现这样的错误:

我们输入3 1 0,首先,程序找出了最大值下标为0,最小值下标为2

接着,将最大值与最后一个数交换,也就是下标为0的数将与下标为2的数交换,交换的结果是:0 1 3

然后,程序会将最小值与第一个数交换,也就是下标为2的数将与下标为0的数交换,这时候小伙伴们应该已经能发现问题了:在上一轮交换中,最小值0已经从下标为2的位置调换到了下标为0的位置,最小值的位置改变了,所以min中存储的最小值下标2已经失效了,再交换就会导致结果的错误

那么我们应该如何改进代码呢?

在上述错误的代码中,我们是先将最大值下标和最小值下标都找出来之后再交换,这可能导致再第一次交换之后第二次交换的下标失效。所以我们可以调整代码顺序:先找出最大值下标,将最大值与最后一个数交换,接着,再找出最小值下标,将最小值与第一个数交换

调整后的代码如下:

  1. #include <stdio.h>
  2. #define N 10
  3. void swap(int* a, int* b)//定义交换函数
  4. {
  5. int temp = *a;
  6. *a = *b;
  7. *b = temp;
  8. }
  9. int main()
  10. {
  11. int n;
  12. int a[N] = { };
  13. int i, min = 0, max = 0;
  14. printf("输入正整数n(1<n<=10):");
  15. scanf("%d", &n);
  16. printf("输入%d个互不相同的整数:", n);
  17. for (i = 0; i < n; i++)
  18. scanf("%d", &a[i]);//将n个整数存入数组中
  19. for (i = 0; i < n; i++)//找出最大元素下标
  20. if (a[i] > a[max])
  21. max = i;
  22. swap(&a[max], &a[n - 1]);//调用函数
  23. for (i = 0; i < n; i++)//找出最小元素下标
  24. if (a[i] < a[min])
  25. min = i;
  26. swap(&a[min], &a[0]);
  27. for (i = 0; i < n; i++)//输出交换后的数
  28. printf("%d", a[i]);
  29. return 0;
  30. }

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号