编程论坛's Archiver

linren 发表于 2008-7-9 14:51

[推荐]看起来很简单的一道题

[bo]题目:[/bo]
假定用一维数组a [ 0:s i z e - 1 ]来存储一组元素。如果有n个元素,可以把它们存储在a [ 0 ] , . . . , a [ n - 1 ]中。当n超过s i z e时,数组将不足以存储所有元素,必须分配一个更大的数组。类似地,如果元素的数目比s i z e小很多,我们又可能希望减少数组的大小,以便释放出多余的空间为其他地方所用。试编写一个[color=Red]模板函数[/color]C h a n g e S i z e 1 D把数组a的大小从s i z e变成To S i z e。函数首先应该分配一个新的、大小为To S i z e的数组,然后把原数组a中的n个元素复制到新数组a中,最后释放原数组a所占用的空间。上机测试该函数。

[bo]题目:[/bo]
这道题看起来很简单……
第一次写完后,虽然通过了编译……
却在运行时失败了[tk02]……

很有意思的一道题……
推荐给大家[tk03]……
请注意[color=Red]红字部分[/color]的要求[tk10]……

linren 发表于 2008-7-9 19:24

[bo]参考答案:[/bo]
#include <iostream>
using namespace std;

template<class T>
void ChangeSize1D(T* &a,int size,int ToSize)
{
        if(size==ToSize) return;
        T* b=new T[ToSize];
        if(size<ToSize)
        {
                for(int i=0;i<size;i++)
                        b[i]=a[i];
        }
        else
        {
                for(int i=0;i<ToSize;i++)
                        b[i]=a[i];
        }       
        delete [] a;
        a=b;
}

int main()
{
        int* a=new int[4];
        a[0]=1;
        a[1]=2;
        a[2]=3;
        a[3]=4;

        try
        {
                ChangeSize1D(a,4,5);
        }
        catch(const char* s)
        {
                cout<<s<<endl;
                return 1;
        }

        a[4]='x';
       
        cout<<"a[4]="<<a[4]<<endl;
        cout<<"a[3]="<<a[3]<<endl<<endl;

        try
        {
                ChangeSize1D(a,5,2);
        }
        catch(const char* s)
        {
                cout<<s<<endl;
                return 1;
        }
       
        cout<<"a[2]="<<a[2]<<endl;
        cout<<"a[1]="<<a[1]<<endl<<endl;

        return 0;
}

/**************************************************************
运行结果:
a[4]=120
a[3]=4

a[2]=-33686019
a[1]=2

Press any key to continue
**************************************************************/

[bo]说明:[/bo]
这样的数组只能通过指针来创建和删除[tk03]……
值得注意的是,数组的大小需要用户来记住[tk10]……

[[it] 本帖最后由 linren 于 2008-7-9 19:26 编辑 [/it]]

mqh21364 发表于 2008-7-10 09:17

没有人顶。我来顶一下!

angel2213 发表于 2008-7-10 11:12

初学者真的是很多编译出现问题,不知问题在哪....

我是杨过 发表于 2008-7-12 21:57

呵呵 ,好问题

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.