DragonYu 发表于 2022-3-1 16:32:11

c语言小问题

#include<stdio.h>
int search_max(int*p,int sz)
{
        int i;
        for (i = 0; i < sz; i++)
        {
                if (*(p + i) > *p)
                {
                        *p = *(p + i);
                }
        }
        return *p;
}
int main()
{
        int arr = { 7,1,3,9,5 };
        int i;
        int sz = sizeof(arr) / sizeof(arr);
        int ret=search_max(arr,sz);
        for (i = 0; i < sz; i++)
        {
                if (ret==arr)
                {
                        printf("sign=%d\n", i);
                }
        }
        printf("max=%d\n", ret);
        return 0;
}
请大神指导   题目要求打印最大值和最大值的下标代码如上 打印下标时总要打印出sign=0 是为什么呢?

jackz007 发表于 2022-3-1 16:52:23

本帖最后由 jackz007 于 2022-3-1 17:06 编辑

#include<stdio.h>
int search_max(int*p,int sz)
{
      int i;
      for (i = 0; i < sz; i++)
      {
                if (*(p + i) > *p)      // 如果 p > p
                {
                        * p = * (p + i) ; // p = p
                }
      }
      return * p ;                      // return p               
}

int main()
{
      int arr = { 7,1,3,9,5 };
      int i;
      int sz = sizeof(arr) / sizeof(arr);
      int ret = search_max(arr , sz) ;         // 函数调用过后,arr[] = {9 , 1 , 3 , 9 , 5}
      for (i = 0 ; i < sz ; i ++)
      {
                if (ret==arr)
                {
                        printf("sign=%d\n", i) ; // 最大值在 arr,所以,打印出来的 sign 一定为 0
                }
      }
      printf("max=%d\n", ret);
      return 0;
}

      search_max() 应该这样写
      
int search_max(int * p , int sz)
{
      int i , r                     ;
      for (i = 0 , r = * p ; i < sz ; i ++)
      {
                if (* (p + i) > r)
                {
                        r = * (p + i)   ;
                }
      }
      return r                        ;            
}

      我的代码这样写
#include<stdio.h>

int max(int * p , int sz)
{
      int i , k                                                 ;
      for (k = 0 , i = 1 ; i < sz ; i ++) if(p > p) k = i ;
      return k                                                ;
}

int main(void)
{
      int arr = {7 , 1 , 3 , 9 , 5} , k                      ;
      k = max(arr , 5)                                          ;
      printf("max = %d , index = %d\n", arr , k)             ;
}

YSW9527 发表于 2022-3-1 17:38:52

//存在的问题和正确做法已给出,如下

#include<stdio.h>
int search_max(int*p,int sz)
{
      int i,max=*p;//假设第一个元素为最大值
      for (i = 0; i < sz; i++)//正确的写法是第三个for语句,要想得到正确结果,需要把这个for语句整体注释掉,还要把return*p注释掉
      {
                if (*(p + i) > *p)
                {
                        *p = *(p + i);//这条语句结合for循环的意思就是后面哪个元素的值大于第一个元素的值就把那个元素的值赋给第一个元素
                                                //当到9的时候,9大于7,所以第一个元素的值就被改成了9
                }
      }
                for (i = 0; i < sz; i++)//输出一下就知道是怎么会回事了
      {
             printf("%d\t",p);
      }
      return *p;
                /*for (i = 1; i < sz; i++)//使用时去掉注释
      {
                if(max<*(p+i))
                                {
                                        max=*(p+i);
                                }
      }
                return max;*/
               
}
int main()
{
      int arr = { 7,1,3,9,5 };
      int i;
      int sz = sizeof(arr) / sizeof(arr);
      int ret=search_max(arr,sz);
      for (i = 0; i < sz; i++)
      {
                if (ret==arr)
                {
                        printf("sign=%d\n", i);//错误很明显,把9赋值给了第一个元素,所以有两个最大值下标,0和3(数组下标是从0开始的)
                }
      }
      printf("max=%d\n", ret);
      return 0;
}

jhq999 发表于 2022-3-1 18:22:42

本帖最后由 jhq999 于 2022-3-1 18:24 编辑

点错回复了
#include<stdio.h>
int search_maxandmin(int*p,int sz)
{
      int i,sign=0,max=*p,min=*p;
      for (i = 1; i < sz; i++)
      {
                if (*(p + i) > max)
                {
                        max = *(p + i);
                                                *((short*)&sign)=i;
                }
                               if (*(p + i) < min)
                {
                        min = *(p + i);
                                                *((short*)&sign+1)=i;
                }

      }
      return sign;
}
int main()
{
      int arr = { 7,1,3,9,5 };
      int i;
      int sz = sizeof(arr) / sizeof(arr);
      int ret=search_maxandmin(arr,sz);
      
      printf("maxsign=%d,max=%d\n", *((short*)&ret),arr[*((short*)&ret)]);
         
      printf("minsign=%d,min=%d\n", *((short*)&ret+1),arr[*((short*)&ret+1)]);
      return 0;
}
maxsign=3,max=9
minsign=1,min=1

DragonYu 发表于 2022-3-3 14:45:57

YSW9527 发表于 2022-3-1 17:38
//存在的问题和正确做法已给出,如下

#include


谢谢
页: [1]
查看完整版本: c语言小问题