鱼C论坛

 找回密码
 立即注册
查看: 1359|回复: 5

[已解决]这个程序哪里有问题

[复制链接]
发表于 2020-12-21 22:46:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
int main (void)
{
    int a[100],max,min,n,i,temp1,temp2,x,y;
    printf("请输入数据的个数\n");
    scanf("%d",&n);
    printf("请输入数据\n");
    for (i=0;i<n;i++)
    scanf ("%d",&a[i]);
    max=a[0];
    min=a[0];
    for (i=0;i<n;i++)
    {
        if (a[i]>max)
        {
            temp1=i;
            max=a[i];
        }
        else if (a[i]<min)
        {
            temp2=i;
            min=a[i];
        }
        else
            continue;
    }
x=a[0];
y=a[i];
a[0]=a[temp2];
a[i]=a[temp1];
a[temp1]=y;
a[temp2]=x;
for (i=0;i<n;i++)
    printf("%3d",a[i]);
}
功能是:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组
但是为啥运行的结果和预想的不一样,求大佬解答
最佳答案
2020-12-21 23:26:24
你的程序只用一只循环,而且是最大值与最小值同时进行遍历数组,所以不能将所有元素都互相比较。举个例子:当 a[ i ] < a[1] 时, 将 a[1] 作为新的最大值这没有问题,但却跳过了 a[ i ] > a[1] 对最小值的比较,故而,为了做到每一个元素都能与最大值和最小值互相比较,需要用双重循环。你的程序不是用指针,也没有用函数,我就给你一个既不用指针,也不用函数的程序。如下:
  1. #include<stdio.h>

  2. int main()
  3. {
  4.         int i, j, temp, a[10];
  5.         printf("输入10个整数:\n");
  6.         for (i = 0;i < 10;i++)
  7.         {
  8.                 scanf("%d", &a[i]);
  9.         }

  10.         temp = a[9];              // 假设最大的数在最后一个单元
  11.         for (i = 9;i >= 0;i--)
  12.         {
  13.                 if (temp < a[i])     // 数组中每一个元素都与假设的最大数比较
  14.                 {
  15.                         temp = a[i];     // 找到大于假设的最大的数
  16.                         j = i;           // 记录该数的位置
  17.                 }
  18.         }
  19.         a[j] = a[9];             // 最大的数与最后一个单元交换
  20.         a[9] = temp;

  21.         temp = a[0];             // 假设最小的数在第一个单元
  22.         j = 0;                       //
  23.         for (i = 1;i < 10;i++)
  24.         {
  25.                 if (temp > a[i])     // 数组中每一个元素都与假设的最小数比较
  26.                 {
  27.                         temp = a[i];     // 找到小于假设的最小的数
  28.                         j = i;           // 记录该数的位置
  29.                 }
  30.         }
  31.         a[j] = a[0];             // 最小的数与第一个单元交换
  32.         a[0] = temp;

  33.         for (i = 0;i < 10;i++)    // 输出交换后的数组
  34.         {
  35.                 printf("%d ", a[i]);
  36.         }
  37.         printf("\n");
  38. }
复制代码


对第25行的说明:前面 j 的记录是最大值的位置,如果查找最小值时不让它回到初始位置,那么如果最小值原本就在a[0] 处,第28行到第31行就不会有任何动作,所查找的最小值的位置就会出错
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-12-21 22:56:02 | 显示全部楼层
先给你我的程序,再来看你的
  1. #include<stdio.h>

  2. int main()

  3. {
  4.         void max(int *p, int n);
  5.         void min(int *p, int n);
  6.         int a[10];
  7.         int i, n = 10, *p;
  8.         p = a;
  9.         printf("输入10个整数:\n");
  10.         for (i = 0;i < 10;i++)
  11.         {
  12.                 scanf("%d", &a[i]);
  13.         }
  14.         max(a, n);
  15.         min(a, n);
  16.         for (i = 0;i < n;i++)
  17.         {
  18.                 printf("%d ", a[i]);
  19.         }
  20.         printf("\n");

  21. }

  22. void max(int *p, int n)
  23. {
  24.         int i, j, temp;
  25.         temp = *p;              // 将首个元素设为最大值
  26.         j = 0;                  // 记录其所在的位置
  27.         for (i = 9;i >= 0;i--)
  28.         {
  29.                 if (temp < *(p + i))
  30.                 {
  31.                         temp = *(p + i);
  32.                         j = i;
  33.                 }
  34.         }
  35.         *(p + j) = *p;
  36.         *p = temp;
  37. }

  38. void min(int *p, int n)
  39. {
  40.         int i, j, temp;
  41.         temp = *(p + 9);              // 将最后的元素设为最小值
  42.         j = 9;                                                  // 记录其所在的位置
  43.         for (i = 1;i < n;i++)
  44.         {
  45.                 if (temp > *(p + i))
  46.                 {
  47.                         temp = *(p + i);
  48.                         j = i;
  49.                 }
  50.         }
  51.         *(p + j) = *(p + 9);
  52.         *(p + 9) = temp;
  53. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-21 23:26:24 | 显示全部楼层    本楼为最佳答案   
你的程序只用一只循环,而且是最大值与最小值同时进行遍历数组,所以不能将所有元素都互相比较。举个例子:当 a[ i ] < a[1] 时, 将 a[1] 作为新的最大值这没有问题,但却跳过了 a[ i ] > a[1] 对最小值的比较,故而,为了做到每一个元素都能与最大值和最小值互相比较,需要用双重循环。你的程序不是用指针,也没有用函数,我就给你一个既不用指针,也不用函数的程序。如下:
  1. #include<stdio.h>

  2. int main()
  3. {
  4.         int i, j, temp, a[10];
  5.         printf("输入10个整数:\n");
  6.         for (i = 0;i < 10;i++)
  7.         {
  8.                 scanf("%d", &a[i]);
  9.         }

  10.         temp = a[9];              // 假设最大的数在最后一个单元
  11.         for (i = 9;i >= 0;i--)
  12.         {
  13.                 if (temp < a[i])     // 数组中每一个元素都与假设的最大数比较
  14.                 {
  15.                         temp = a[i];     // 找到大于假设的最大的数
  16.                         j = i;           // 记录该数的位置
  17.                 }
  18.         }
  19.         a[j] = a[9];             // 最大的数与最后一个单元交换
  20.         a[9] = temp;

  21.         temp = a[0];             // 假设最小的数在第一个单元
  22.         j = 0;                       //
  23.         for (i = 1;i < 10;i++)
  24.         {
  25.                 if (temp > a[i])     // 数组中每一个元素都与假设的最小数比较
  26.                 {
  27.                         temp = a[i];     // 找到小于假设的最小的数
  28.                         j = i;           // 记录该数的位置
  29.                 }
  30.         }
  31.         a[j] = a[0];             // 最小的数与第一个单元交换
  32.         a[0] = temp;

  33.         for (i = 0;i < 10;i++)    // 输出交换后的数组
  34.         {
  35.                 printf("%d ", a[i]);
  36.         }
  37.         printf("\n");
  38. }
复制代码


对第25行的说明:前面 j 的记录是最大值的位置,如果查找最小值时不让它回到初始位置,那么如果最小值原本就在a[0] 处,第28行到第31行就不会有任何动作,所查找的最小值的位置就会出错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-22 19:52:11 | 显示全部楼层
我的回答是你的最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-22 19:56:07 | 显示全部楼层
  1. #include <stdio.h>
  2. int main()
  3. {
  4.     int n,max,min,k,t;
  5.         printf("请输入数组的个数:");
  6.         scanf("%d",&n);
  7.     int *p,a[n];
  8.         printf("Please input 当前数值:\n");
  9.         for(int i=0;i<n;i++)
  10.         {
  11.                 scanf("%d",&a[i]);
  12.         }
  13.         max=a[0];
  14.         for(int i=0;i<n;i++)
  15.         {
  16.             if(max<a[i])
  17.             {
  18.                     k=i;
  19.                         max=a[i];
  20.             }
  21.         }
  22.     min=a[0];       
  23.         for(int j=0;j<n;j++)
  24.         {
  25.                 if(min>a[j])
  26.                 {
  27.                         t=j;
  28.                         min=a[j];
  29.                 }
  30.         }
  31.         printf("max=%d,min=%d",max,min);
  32.         printf("\n");
  33.         for(int i=0;i<n;i++)
  34.         {
  35.                 if(i==0)
  36.                 {
  37.                         int temp;
  38.                         temp=a[i];
  39.                         a[i]=a[k];
  40.                 }
  41.                 if(i==n-1)
  42.                 {
  43.                         int temp1;
  44.                         temp1=a[i];
  45.                         a[i]=a[t];
  46.                 }
  47.                 printf("%d ",a[i]);
  48.         }
  49.         printf("\n");
  50.         return 0;
  51. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-22 21:32:58 | 显示全部楼层
  1. #include <stdio.h>
  2. int main()
  3. {
  4.     int n,max,min,k,t;
  5.         printf("请输入数组的个数:");
  6.         scanf("%d",&n);
  7.     int a[n];
  8.         printf("Please input 当前数值:\n");
  9.         for(int i=0;i<n;i++)
  10.         {
  11.                 scanf("%d",&a[i]);
  12.         }
  13.         max=a[0];
  14.         for(int i=0;i<n;i++)
  15.         {
  16.             if(max<a[i])
  17.             {
  18.                     k=i;
  19.                         max=a[i];
  20.             }
  21.         }
  22.     min=a[0];       
  23.         for(int j=0;j<n;j++)
  24.         {
  25.                 if(min>a[j])
  26.                 {
  27.                         t=j;
  28.                         min=a[j];
  29.                 }
  30.         }
  31.         printf("max=%d,min=%d",max,min);
  32.         printf("\n");
  33.         for(int i=0;i<n;i++)
  34.         {
  35.                 if(i==0)
  36.                 {
  37.                         int temp;
  38.                         temp=a[i];
  39.                         a[i]=a[k];
  40.                         a[k]=temp;
  41.                 }
  42.                 if(i==n-1)
  43.                 {
  44.                         int temp1;
  45.                         temp1=a[i];
  46.                         a[i]=a[t];
  47.                         a[t]=temp1;
  48.                 }
  49.         }
  50.         for(int i=0;i<n;i++)
  51.         {
  52.                 printf("%d ",a[i]);
  53.         }
  54.         printf("\n");
  55.         return 0;
  56. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-7 12:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表