max=num【0】和min=num【0】等号两边可不可以互换

img


max=num【0】等号两边互换后运行错误
min=num【0】等号两边互换后运行错误
求原因

如果改为num[0]=max, num[0]=min,那数组第一个元素的值就被设置为max或min的值,这就会让求数组最大值和最小值出现错误,因为数组第一个元素的值改变了,有很大可能不是原来第一个元素的值,因为max和min都未赋初始化,其值就是内存位置的随机值,所以这就会出现错误;

而如果让max=num[0],和min=num[0],然后再拿这个max和min与数组其他元素的值比较,将较大的值赋值给max,较小的值赋值给min,循环结束,就可得出数组的最大值和最小值。

测试代码如下:


#include <stdio.h>

int main(void){
    
    int num[100];
    int i,a,min,max;
    printf("输入数组长度:\n");
    scanf("%d",&a);
    
    printf("请输入数组中的元素:\n");
    for(i=0;i<a;i++){
        scanf("%d",&num[i]);
    } 
    
    // 赋值前先备份数组第一个元素的值 
    int tnum0=num[0];  
    num[0]=min;
    for(i=0;i<a;i++){
        if(num[i]<min){
            min=num[i];
        }
    }
    
    num[0]=max;
    for(i=0;i<a;i++){
        if(num[i]>max){
            max=num[i];
        }
    }
    printf("\nnum[0]=max, num[0]=min,求得数组最大值最小值为:\n");
    printf("max=%d,min=%d",max,min);
    
    
    // 将数组第一个元素的值复原 
    num[0]=tnum0;
    min=num[0];
    for(i=0;i<a;i++){
        if(num[i]<min){
            min=num[i];
        }
    }
    
    max=num[0];
    for(i=0;i<a;i++){
        if(num[i]>max){
            max=num[i];
        }
    }
    printf("\n\nmax=num[0], min=num[0],求得数组最大值最小值为:\n");
    printf("max=%d,min=%d",max,min);
    
    return 0;
    
} 

img

不能互换,除非你定义的min,max有初始值

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客也许可以解决你的问题👉 :编程函数保证接收的一定是一个介于min和max之间([min, max]区间内)的一个整数并最后返回该整数。它负责接收用户的输入,进行验证,如果用户输入的数不在min和max之间,则会提示继续输入,直
  • 除此之外, 这篇博客: C语言二级考试编程题(在传入的num个字符中找出最长的字符串,将此字符串的地址返回)中的 从传入的num个字符中找出最长的字符串,并通过形参指针max传回该串地址(用****作为结束输入的标志) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    (注意:函数的实现包括文件打开的相关代码,个人复制代码可能实现不了运行结果所示的效果。主要关注函数fun的代码实现即可)
    代码实现

    #include<conio.h>
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    char *fun(char (*a)[81], int num, char *max)
    {
    	int i;//定义循环变量 
    	max = a[0];//将形参数组a的第一个元素赋值给max 
    	for(i = 0; i < num; i++)//循环num次 
    	{
    		if(strlen(max)<strlen(a[i]))//判断数组中a[i]与max的字符串长度 
    		max = a[i];	//将判断的两者中长的字符串放入max中 
    	}			
    	return max;//返回max 
    }
    void main()
    {
      FILE *wf;
      char ss[10][81],*ps=NULL;
      char s[3][81]={"abcd","deg","diegns"},*p=NULL;
      int  i=0,n;
      system("CLS");
      printf("输入若干个字符串:");
      gets(ss[i]);
      puts(ss[i]);
      while(!strcmp(ss[i], "****")==0)  /*用4个星号作为结束输入的标志*/
         {
          i++;
          gets(ss[i]);
          puts(ss[i]);
         }
      n=i;
      ps=fun(ss,n,ps);
      printf("\nmax=%s\n",ps);
    /******************************/
      wf=fopen("out.dat","w");
      p=fun(s,3,p);
      fprintf(wf,"%s",p);
      fclose(wf);
    /*****************************/
    }
    

    运行结果:
    在这里插入图片描述

  • 以下回答来自chatgpt:

    回答:

    如果把max=num[0]和min=num[0]的等号两边互换,则程序不会出现语法上的错误,但运行结果可能会出现问题,因为max和min的初值应该是相反的,当互换后可能会导致结果出现偏差。

    具体上下文信息需要根据具体的情况来确定,但一般来说,这段代码应该是在求一个数组中的最大值和最小值,这时候可以使用以下的代码框架。

    // 假设要求的数组是num
    int max = num[0];
    int min = num[0];
    for(int i=1; i<num.length; i++){
        if(num[i] > max){
            max = num[i];
        }
        if(num[i] < min){
            min = num[i];
        }
    }
    // max和min即为所求
    

    这段代码中,max和min的初值都应该是num[0],然后通过遍历数组来更新他们的值。如果将它们的初值互换,可能会让程序出现偏差,例如如果数组中所有元素都比num[0]小,但是max和min的初值互换了,会导致max一直等于num[0],无法得到正确的结果。

    代码示例使用的是Java语言。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^