路易大魔王 发表于 2019-3-14 11:49:10

SOS:用C编写函数出现错误,求解决~

函数要求1:编写函数 int mergearr( int a[], int m, int b[], int n),将两个严格增序数组a[],b[]合并,并保证合并后数组严格增序,函数值返回合并后的数组a[]中元素个数。
函数要求2:不能定义额外新数组。
由于本人才开始学习C,经常出现各种BUG,却不知道错在哪,请各位大佬帮忙~
本人思路文字描述:将b[]中小于a的元素按序插入数组a,大于a的元素插入a[]尾部。

      i=0,j=0;
      a与b进行循环对比(i<a[]长度,j<b[]长度):
      1,如果a<b时,a位置不变,i++后重新对比;
      2,如果a=b时,a不变,i++;j++后重新对比;
      3,如果a>b时,数组a[]中第【i】位元素之后整体后移一位,再将b赋值给a,数组a[]长度++;j++后重新对比。
      循环后两种情况:
      1,数组a[]包含所有数组b[]元素,实现函数要求。
      2,数组a[]未包含所有b[]元素,需要将数组b[]剩余元素插入数组a[]尾部,实现函数要求。


#include<stdio.h>
int mergearr(int a[],int m,int b[],int n)
{
      int i=0,j=0,k,len=m;//m是数组a[]初始长度,len是a[]可变长度。
      printf("函数内m=%d,n=%d\n",m,n);//验证函数各项数值,可忽略。
      while(i<len&&j<n)//while循环逐一判断数组a,b中的元素大小
      {
                if(a<b)
                {
                        i++;
                }
                else if(a==b)
                {
                        i++;j++;
                }
                else if(a>b)
                {
                        for(k=len;k>i;k--)//数组a[]从a之后整体后移
                        {
                              a=a;
                        }
                        a=b;//插入b
                        len++;
                        j++;
                }
      }
      printf("j=%d,a=%d,b=%d,len=%d\n",j,a,b,len);//验证函数各项数值,可忽略。
      while(a<b&&j<n)//循环判断数组a[]是否包含全部数组b[],并将剩余数组b[]元素插入数组a[]尾部。
      {
                a=b;
                len++;
                j++;
      }
      printf("j=%d,a=%d,b=%d,len=%d\n",j,a,b,len);//验证函数各项数值,可忽略。
      printf("函数内m=%d,n=%d\n",m,n);//验证函数各项数值,可忽略。
      for(i=0;i<len;i++)
      {
                printf("%d,\n",a);
      }
      return len;
}
int main()
{
      int i,j,p,q,length;
      int c[]={1,2,3,5,7,9};
      int d[]={2,4,5,6,8,9,10};
      p=sizeof(c)/sizeof(c);//求c[]长度
      q=sizeof(d)/sizeof(d);
      printf("调用前p=%d,q=%d\n",p,q);//验证函数各项数值,可忽略
      int mergearr(int a[],int m,int b[],int n);
      length=mergearr(c,p,d,q);
      printf("length=%d\n",length);
      printf("调用后p=%d,q=%d\n",p,q);//验证函数各项数值,可忽略
      for(i=0;i<length;i++)
      {
                printf("%d,",c);
      }
}


输出结果如下:这里:调用后p=10,以及最后输出的结果1,2,3,4,5,6,7,8,10,10均不是想要的答案,却不知道在哪里出错,如何更改,请各位大佬帮忙。

jackz007 发表于 2019-3-14 12:36:20

本帖最后由 jackz007 于 2019-3-14 12:42 编辑

    我重写了 mergearr() 楼主可以对照参考
mergearr(int a[] , const int m , const int b[] , const int n)
{
      int i = 0 , j = 0 , k                               ;
      for(i = 0 ; i < n ; i ++) a = b         ; // 合并两个数组
      for(i = 1 ; i < m + n ; i ++) {                     // 对合并后的数组排序
                j = i                                       ;
                while(j > 0 && a < a) {
                        k = a                            ;
                        a = a                     ;
                        a = k                        ;
                        j --                              ;
                }
      }
      for(i = 0 ; i < m + n ; i ++) printf("%d\n" , a) ; // 输出
      return m + n                                        ;
}
      我使用 TDM-GCC 编译,需要把 main() 中的 mergearr()的函数声明删除才能编译通过,就是这一行:
      int mergearr(int a[],int m,int b[],int n);

路易大魔王 发表于 2019-3-14 13:29:26

jackz007 发表于 2019-3-14 12:36
我重写了 mergearr() 楼主可以对照参考

      我使用 TDM-GCC 编译,需要把 main() 中的 mergearr() ...

emmmm有两个地方不明白,第一个是为何用const,第二个是我将函数替换我原来函数之后,p和q的值依然发生了变化,一直不理解为何p,q值会变。

jackz007 发表于 2019-3-14 14:13:52

本帖最后由 jackz007 于 2019-3-14 14:17 编辑

路易大魔王 发表于 2019-3-14 13:29
emmmm有两个地方不明白,第一个是为何用const,第二个是我将函数替换我原来函数之后,p和q的值依然发生 ...

    main() 函数中对 c[] 定义的时候,没有为 d[] 预留空间,导致拼接后 c[] 严重越界
      int c[]={1,2,3,5,7,9};
    所以,我对 main() 也做了修改:
#include <stdio.h>

mergearr(int a[] , const int m , const int b[] , const int n)
{
      int i = 0 , j = 0 , k                               ;
      for(i = 0 ; i < n ; i ++) a = b         ;
      for(i = 1 ; i < m + n ; i ++) {
                j = i                                       ;
                while(j > 0 && a < a) {
                        k = a                            ;
                        a = a                     ;
                        a = k                        ;
                        j --                              ;
                }
      }
      for(i = 0 ; i < m + n ; i ++) printf("%d\n" , a) ;
      return m + n                                        ;
}

main(void)
{
      int i , j , p , q , length                           ;
      int c = {1 , 2 , 3 , 5 , 7 , 9}                  ;
      int d[] ={2 , 4 , 5 , 6 , 8 , 9 , 10}                ;
      p = 6                                                ; // 求c[]长度
      q = sizeof(d) / sizeof(int)                        ;
      printf("调用前 p = %d , q = %d\n" , p , q)         ; //验证函数各项数值,可忽略
      length = mergearr(c , p , d , q)                     ;
      printf("length = %d\n" , length)                     ;
      printf("调用后 p = %d , q = %d\n" , p , q)         ; //验证函数各项数值,可忽略
      for(i = 0 ; i < length ; i ++) printf("%d ," , c) ;
}

      const 的意思是变量在函数内只读,不允许修改,编译程序在检查语法的时候会更加严格。

路易大魔王 发表于 2019-3-14 16:40:48

jackz007 发表于 2019-3-14 14:13
main() 函数中对 c[] 定义的时候,没有为 d[] 预留空间,导致拼接后 c[] 严重越界

    所以,我 ...

明白了,原来我输出错误的原因是因为数组c[]的溢出,可纠结死我了,非常感谢。
页: [1]
查看完整版本: SOS:用C编写函数出现错误,求解决~