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

这是我的程序 但出了问题 求教 谢谢
#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;}
}
}

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.

追问

谢谢 貌似懂了
你看 执行的时候 元素个数竟然可以多于n,m个 还出现了这样的问题

追答

你可以用编译器提供的单步调试,查看每个元素的存储地址。看他是怎么处理的。C和C++的效率是很大的一门学问啊。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-05-12
int i, j , k = 0,a[n],b[m],c[n+m];
数组的大小不能是变量,因为a[n]等数组的长度n等都使变量所以出错。追问

但是之前不是有个输入—赋值—存储吗

第2个回答  2012-05-12
#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的,输入过多可能不会错,但可能会有溢出的危险!

追问

啊? 帮我用VC2008 看一下
怪怪的 我感觉 谢谢了 高手

第3个回答  2012-05-12
你可以用vector容器来做,要简单很多追问

vector容器? 什么东东

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网