我要做个C++程序 其功能为:要用户自己输入两组未知大小的数据 把两组数组升序排列 然后以升序形式合并

这是我的程序但出了问题求教谢谢#include<iostream>usingnamespacestd;voidsort(int[],int);intmain(){intn... 这是我的程序 但出了问题 求教 谢谢
#include<iostream>
using namespace std;
void sort(int[],int);
int main()
{ int n,m;
cout<<"请输入a数组的大小:";
cin>>n;
cout<<"请输入b数组的大小:";
cin>>m;
int i, j , k = 0,a[n],b[m],c[n+m];

cout<<"请输入数组a的元素:"<<endl;
for(i=0;i<n;i++)
cin>>a[i];
cout<<"请输入数组b的元素:"<<endl;
for(j=0;j<m;j++)
cin>>b[j];
sort(a,n);
cout<<"a数组元素升序排列为:"<<endl;
for(i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
sort(b,n);
cout<<"b数组元素升序排列为:"<<endl;
for(j=0;j<m;j++)
cout<<b[j]<<" ";
i=0,j=0;
while (i < n && j < m) {
if (a[i] > b[j]) c[k++] = a[i++];
else c[k++] = b[j++];
}
while (i < n) {
c[k++] = a[i++];
}
while (j < m) {
c[k++] = b[j++];
}
cout<<"合并后:"<<endl;
for (i = 0; i < n + m; i++)
cout << c[i] << " ";
cout<<endl;
return 0;
}
void sort(int x[],int y)
{int min;
for(int i=0;i<y-1;i++)
{for(int j=i;j<y;j++)
if(x[i]>x[j])
{min=x[i]; x[i]=x[j];x[j]=min;}
}
}
展开
 我来答
GiraKoo
2012-05-12 · 还没有任何签名哦
GiraKoo
采纳数:3949 获赞数:11110

向TA提问 私信TA
展开全部
C++里的数组要求使用常量来定义。
可以定义c[10],但是不能定义m=10; c[m];
这个C的机制有关,在函数运行之前,就为这个函数在栈区分配好空间。
如果你用m来声明数组,编译器就无法预先给数组进行分配空间
这样规定能够提高运行效率

如果你完成你的目的,就必须使用new操作符生成数组。new是在静态区分配空间。
new返回的是申请空间的首地址。是一个指针。你可以像数组一样使用它。
#include<iostream>
using namespace std;
void sort(int[],int);
int main()
{
int n,m;
cout<<"请输入a数组的大小:";
cin>>n;
cout<<"请输入b数组的大小:";
cin>>m;
int i, j , k = 0;
int* a = new int[n];
int* b = new int[m];
int* c = new int[m + n];

cout<<"请输入数组a的元素:"<<endl;
for(i=0;i<n;i++)
cin>>a[i];
cout<<"请输入数组b的元素:"<<endl;
for(j=0;j<m;j++)
cin>>b[j];
sort(a,n);
cout<<"a数组元素升序排列为:"<<endl;
for(i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
sort(b,n);
cout<<"b数组元素升序排列为:"<<endl;
for(j=0;j<m;j++)
cout<<b[j]<<" ";
i=0,j=0;
while (i < n && j < m) {
if (a[i] > b[j])
c[k++] = a[i++];
else
c[k++] = b[j++];
}
while (i < n) {
c[k++] = a[i++];
}
while (j < m) {
c[k++] = b[j++];
}
cout<<"合并后:"<<endl;
for (i = 0; i < n + m; i++)
cout << c[i] << " ";
cout<<endl;
return 0;
}
void sort(int x[],int y)
{
int min;
for(int i=0;i<y-1;i++)
{
for(int j=i;j<y;j++)
if(x[i]>x[j])
{
min=x[i];
x[i]=x[j];
x[j]=min;
}
}
}
更多追问追答
追问
你太棒了  
果然编译成功 你上面的程序忘了释放空间了吧?呵呵
new是动态吧? 使用new操作符生成数组不也是不知道空间大小吗?为什么就可以?刚学不懂
还有执行时 输入数组a,b的元素个数竟然可以超过n,m个 这是为什么? 谢谢 我加分
追答
首先,的确是忘记释放空间了。。。delete一下
程序运行的时候,编译器会给函数预先分配栈空间,好像默认是2M。
然后,程序为将函数内的变量分配空间。
然后执行代码。
如果你不用常量声明数组大小,程序在执行语句之前,是不能够得知数组大小的。也就没法分配空间。
而new是在堆区(之前那个回答中,我写错了)
堆区很大,而且不像栈区那样要求先进后出。所以使用很自由。
你使用new分配一个数组,执行代码的时候,就会申请一个空间。
越界使用堆区和栈区是非常危险的。程序无法检测是否越界。当然也就不会报错。
#include
void main()
{
int a = 5;
int b[5];
b[5] = 2;
printf("%d", a);
}
上面这段程序就是数组越界书写。2008的编译器会报错。有些编译器就会把a改成2.
匿名用户
2012-05-12
展开全部
int i, j , k = 0,a[n],b[m],c[n+m];
数组的大小不能是变量,因为a[n]等数组的长度n等都使变量所以出错。
追问
但是之前不是有个输入—赋值—存储吗
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Zz小虾米
2012-05-12 · TA获得超过186个赞
知道小有建树答主
回答量:503
采纳率:0%
帮助的人:240万
展开全部
#include<iostream>
using namespace std;
void sort(int[], int);
int main()
{
int n, m;
cout << "请输入a数组的大小:";
cin >> n;
cout << "请输入b数组的大小:";
cin >> m;
int i, j , k = 0, *a=new int[n], *b= new int[m], *c = new int[n + m];

cout << "请输入数组a的元素:" << endl;
for(i = 0; i < n; i++)
cin >> a[i];
cout << "请输入数组b的元素:" << endl;
for(j = 0; j < m; j++)
cin >> b[j];
sort(a, n);
cout << "a数组元素升序排列为:" << endl;
for(i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
sort(b, m);
cout << "b数组元素升序排列为:" << endl;
for(j = 0; j < m; j++)
cout << b[j] << " ";
i = 0, j = 0;
while (k< n + m)
{
if (k<n) c[k++] = a[i++];
else c[k++] = b[j++];
}

sort(c, n+m);
cout << "合并后:" << endl;
for (i = 0; i < n + m; i++)
cout << c[i] << " ";
cout << endl;
delete [] a;
delete [] b;
delete []c;
return 0;
}
void sort(int x[], int y)
{
int min;
for(int i = 0; i < y - 1; i++)
{
for(int j = i; j < y; j++)
if(x[i] > x[j])
{
min = x[i];
x[i] = x[j];
x[j] = min;
}
}
}
更多追问追答
追问
你这样想挺不错的   有创意
非常感谢 执行时 输入数组a,b的元素个数竟然可以超过n,m个 这是为什么?
追答
a 的元素个数是n, b的元素个数是m, c的元素个数是n+m哦,a,b不能分别超过n, m的,输入过多可能不会错,但可能会有溢出的危险!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
砍侃看
2012-05-12 · TA获得超过6154个赞
知道大有可为答主
回答量:6584
采纳率:69%
帮助的人:2112万
展开全部
你可以用vector容器来做,要简单很多
追问
vector容器? 什么东东
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式