鱼C论坛

 找回密码
 立即注册
查看: 3029|回复: 26

[已解决]数组求最大值最小值及其下标

[复制链接]
发表于 2022-6-6 20:26:58 | 显示全部楼层 |阅读模式

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

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

x
  1. #include <stdio.h>
  2. #include <string.h>
  3. #define N 8
  4. int main()
  5. {
  6.         int a[N]={122,12,15,88,65,78,99,43};
  7.         int i,j,min,max,x,y;
  8.         min=a[0];
  9.         max=a[0];
  10.         for(i=0,j=0;i<N&&j<N;i++,j++)
  11.         {
  12.                 if(min>a[i])
  13.                 {
  14.                         min=a[i];
  15.                         x=i;       
  16.                 }       
  17.                 if(max<a[j])
  18.                 {
  19.                         max=a[j];
  20.                         y=j;
  21.                 }
  22.         }       
  23.        
  24.         printf("%d  %d\n",min,x);
  25.         printf("%d  %d\n",max,y);
  26. }
复制代码


我想求最大值和最小值及其他们的下标;
为什么是错的呢??



还有这样的问题,在获取 最小或者最大数  的下标的时候:
比如最小值的下标,我给最小值放在自定义数组的最开始的位置(也就是a【0】);

然后我用这样的代码:

int min,i,x;
min=a[0];
for(i=0;i<N;i++)
{
        if(min>a[i])
        {
                min=a[i];
                x=i;
        }
}


这个时候这个打印出来的x的值是什么呢?
(x未赋初值);
最佳答案
2022-6-6 21:56:22
我看网上有很多人也加上了初始值,如果你不加的话,因为最大值就在第一位,所以全程都没有对y进行赋值操作,所以,输出时,C语言就会输出一个乱七八糟的东西给你
  1. #include <stdio.h>
  2. #include <string.h>
  3. #define N 8
  4. int main()
  5. {
  6.         int a[N]={122,12,15,88,65,78,99,43};
  7.         int i,j,min,max,x,y;
  8.         min=a[0];
  9.         max=a[0];
  10.         x=0;
  11.         y=0;
  12.         for(i=0,j=0;i<N&&j<N;i++,j++)
  13.         {
  14.                 if(min>a[i])
  15.                 {
  16.                         min=a[i];
  17.                         x=i;        
  18.                 }        
  19.                 if(max<a[j])
  20.                 {
  21.                         max=a[j];
  22.                         y=j;
  23.                 }
  24.         }        
  25.         
  26.         printf("%d  %d\n",min,x);
  27.         printf("%d  %d\n",max,y);
  28. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-6-6 20:39:14 | 显示全部楼层
  1. #include <stdio.h>
  2. #define N 8

  3. int main(void) {
  4.         int arr[N] = { 122, 12, 15, 88, 65, 78, 99, 43 };
  5.         int m, n = m = 0;
  6.         for (int i = 0; i < N; ++i) {
  7.                 if (arr[i] > arr[m]) {
  8.                         m = i;
  9.                 }
  10.                 if (arr[i] < arr[n]) {
  11.                         n = i;
  12.                 }
  13.         }
  14.         printf("max: %d\n", arr[m]);
  15.         printf("min: %d\n", arr[n]);
  16. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-6 20:46:54 | 显示全部楼层

这个我知道,我只是想知道为啥我的那个y会等于1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-6 20:48:05 | 显示全部楼层
tyf1218405122 发表于 2022-6-6 20:46
这个我知道,我只是想知道为啥我的那个y会等于1

只是因为我没有给初值的话,我看网上很多人的代码都没有给,
然后他们是没有考虑这个情况还是什么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-6 21:14:48 | 显示全部楼层
就像你先预设最大值和最小值是 a[0] 一样,为什么不把下标也初始化为 0 呢
你这数组最大值就在 a[0],if(max<a[j]) 永远为假,到循环结束 y 都不曾赋值,最后却要打印 y 的值,当然报错了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-6-6 21:56:22 | 显示全部楼层    本楼为最佳答案   
我看网上有很多人也加上了初始值,如果你不加的话,因为最大值就在第一位,所以全程都没有对y进行赋值操作,所以,输出时,C语言就会输出一个乱七八糟的东西给你
  1. #include <stdio.h>
  2. #include <string.h>
  3. #define N 8
  4. int main()
  5. {
  6.         int a[N]={122,12,15,88,65,78,99,43};
  7.         int i,j,min,max,x,y;
  8.         min=a[0];
  9.         max=a[0];
  10.         x=0;
  11.         y=0;
  12.         for(i=0,j=0;i<N&&j<N;i++,j++)
  13.         {
  14.                 if(min>a[i])
  15.                 {
  16.                         min=a[i];
  17.                         x=i;        
  18.                 }        
  19.                 if(max<a[j])
  20.                 {
  21.                         max=a[j];
  22.                         y=j;
  23.                 }
  24.         }        
  25.         
  26.         printf("%d  %d\n",min,x);
  27.         printf("%d  %d\n",max,y);
  28. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-6 22:08:48 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-6-7 00:30:15 | 显示全部楼层
6666666666666666666
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-7 02:20:00 | 显示全部楼层
本帖最后由 leletatann 于 2022-6-7 02:56 编辑
  1. #include <stdio.h>
  2. #include <string.h>
  3. #define N 8
  4. int main()
  5. {
  6.         int a[N]={122,12,15,88,65,78,99,43};
  7.         int i,j,min,max,x,y;
  8.         min=a[0];
  9.         max=a[0];
  10.         for(i=0,j=0;i<N&&j<N;i++,j++)
  11.         {
  12.                 if(min>=a[i])
  13.                 {
  14.                         min=a[i];
  15.                         x=i;        
  16.                 }        
  17.                 if(max<=a[j])    //这里如果不加等于,y的值就没有不会被j给赋值,因为122已经是最大的了(122<122,是不会执行里面的语句的),那么y就会赋值为垃圾值(通常为垃圾值,要看用什么编译器)
  18.                 {
  19.                         max=a[j];
  20.                         y=j;
  21.                 }
  22.         }        
  23.         
  24.         printf("%d  %d\n",min,x);
  25.         printf("%d  %d\n",max,y);
  26. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-7 02:53:44 | 显示全部楼层
本帖最后由 leletatann 于 2022-6-7 03:08 编辑


打个比方来说
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int x;
  5.         printf("%d",x);     //这里x的值通常会自动赋值为0或者报错(要看是什么编译器)

  6. }
复制代码


那再加多一个int y
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int x,y;
  5.         printf("%d %d",x,y);     //这里的x通常也是0或者报错,这里的y有可能是0也有可能是垃圾值或者报错(同样要看是什么编译器)

  6. }
复制代码


那再加多一个int z呢
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int x,y,z;
  5.         printf("%d %d %d",x,y,z);     //这里的x,y,z有可能是0也有可能是垃圾值或者报错(同样要看是什么是编译器)

  6. }
复制代码


如果换一个方式写
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int x,y;
  5.         x = y;
  6.         printf("%d %d",x,y);    //这里x,y的值通常会自动赋值为0或者报错(同样要看是什么编译器)

  7. }
复制代码


那再加一个int z
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int x,y,z;
  5.         x = y;
  6.         printf("%d %d %d",x,y,z);     //这里的x,y,z有可能是0也有可能是垃圾值或者报错(同样要看是什么编译器)

  7. }
复制代码


这样什么情况下不会报错呢
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int x,y=1;                 //这里的x虽然开始的时候没有给于赋值,但是y初始值为1,而下一行的y赋值给于x,所以x就有了一个值
  5.         x = y;
  6.         printf("%d %d",x,y);        

  7. }
复制代码


所以结论就是如果你没有给于初始值或者赋值,那有可能是垃圾值或者自动赋值为0又或者编译器报错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-7 08:34:34 | 显示全部楼层
帮顶下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-7 11:13:21 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-6-7 11:34:30 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-6-7 18:47:48 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-6-7 19:24:04 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-6-8 13:37:41 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-6-8 16:46:13 | 显示全部楼层
你这个代码错就错在了没有给X,y赋初值,同时最大值还就是a[0];

回答第二个问题:
这种情况下,打印出来的会是个随机数,
说是随机数,但说白了,就是你定义的x的地址中的数据;
因为你定义x的时候没有赋初值,
所以x的数值(或是说x的地址中的数据)对于你来说就是一个随机数,
它可以是任何一个值(不超过你定义的数据类型大小范围的)。

另外,写代码的时候,一定要注意给定义的数据赋初值,
不然可是会出问题的,代码多的情况下,出问题了,你甚至都不知道出在哪了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-9 09:04:27 | 显示全部楼层
正在学习中
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-9 09:14:22 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-6-9 09:15:25 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-24 01:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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