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: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); jackz007 发表于 2019-3-14 12:36
我重写了 mergearr() 楼主可以对照参考
我使用 TDM-GCC 编译,需要把 main() 中的 mergearr() ...
emmmm有两个地方不明白,第一个是为何用const,第二个是我将函数替换我原来函数之后,p和q的值依然发生了变化,一直不理解为何p,q值会变。 本帖最后由 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 的意思是变量在函数内只读,不允许修改,编译程序在检查语法的时候会更加严格。 jackz007 发表于 2019-3-14 14:13
main() 函数中对 c[] 定义的时候,没有为 d[] 预留空间,导致拼接后 c[] 严重越界
所以,我 ...
明白了,原来我输出错误的原因是因为数组c[]的溢出,可纠结死我了,非常感谢。
页:
[1]