动态数组的C++实现

动态数组的C++实现
动态数组的C++实现

动态数组的C++实现

动态数组在C++中有广泛的应用,但实现起来比较麻烦。这是我编写的一个动态数组的实现程序,程序的大部分功能都能实现,比如插入元素、向动态数组末尾追加元素、显示动态数组的大小、显示动态数组的容量、显示动态数组的元素。还有一些功能我虽然写了实现函数,但没有测试程序的结果,只写了最常见的几种操作。程序的最大优点是测试程序方便。

程序代码

/*

* Array.cpp

*

* Created on: 2011-1-19

* Author: jiayanbo

*/

#include

#include

#include

#include

using namespace std;

//定义一个动态数组类

class Array {

int _size;

int _capacity;

int* items;

public:

typedef int* iterator;

typedef const int* const_iterator;

enum { DEFAUL_CAP = 16 };

explicit Array(const int& capcity = DEFAUL_CAP);

Array(const Array& other);

Array& operator=(const Array& other);

~Array();

iterator begin();

const_iterator begin() const;

iterator end();

const_iterator end() const;

const int& operator[](const int& index) const;

int& operator[](const int& index);

void insert(const int& index, const int& value);

void remove(const int& index);

void append(const int& value);

int size() const;

int capacity() const;

bool empty() const;

void run();

};

//构造函数

Array::Array(const int& capcity) :

_size(0), _capacity(capcity) {

items = new int[_capacity];

}

//copy构造函数

Array::Array(const Array& other) :

_size(other._size), _capacity(other._capacity) {

items = new int[_capacity];

//for (int i = 0; i < _size; ++i)

// items[i] = other.items[i];

std::memcpy(items, other.items, _size * sizeof(int));

}

//运算符"="重载

Array& Array::operator=(const Array& other) {

if (&other != this) {

_size = other._size;

_capacity = other._capacity;

delete[] items;

items = new int[_capacity];

std::memcpy(items, other.items, _size * sizeof(int));

}

return *this;

}

//查找数组开始位置

Array::iterator Array::begin() {

return items;

}

//查找数组开始位置(不能改变)

Array:: const_iterator Array::begin() const {

return items;

//查找数组结束位置

Array::iterator Array::end() {

return items + _size;

}

//查找数组结束位置(不能改变)

Array::const_iterator Array::end() const {

return items + _size;

}

//查找数组中index下标的元素

const int& Array::operator[](const int& index) const {

if (index < 0 || _size <= index)

throw std::out_of_range("Array::operator[](const int&) const");

return items[index];

}

//查找数组中index下标的元素(不能改变其大小)

int& Array::operator[](const int& index) {

if (index < 0 || _size <= index)

throw std::out_of_range("Array::operator[](const int&) const");

return items[index];

}

//在动态数组中插入元素

void Array::insert(const int& index, const int& value) {

if (index < 0 || _size <= index)

throw std::out_of_range("Array::insert(const int&, const int&)");

if (_size < _capacity) {

std::memmove(items + (index + 1), items + index, (_size - index)

* sizeof(int));

items[index] = value;

} else {

_capacity *= 2;

int* tmp = new int[_capacity];

std::memcpy(tmp, items, index * sizeof(int));

std::memcpy(tmp + (index + 1), items + index, (_size - index)* sizeof(int));

tmp[index] = value;

delete[] items;

items = tmp;

}

++_size;

}

//在动态数组末尾追加元素

void Array::append(const int& value) {

if (_size < _capacity) {

items[_size] = value;

} else {

_capacity *= 2;

int* tmp = new int[_capacity];

std::memcpy(tmp, items, _size * sizeof(int));

tmp[_size] = value;

delete[] items;

items = tmp;

}

++_size;

}

//删除动态数组的元素

void Array::remove(const int& index) {

if (index < 0 || _size <= index)

throw out_of_range("Array::remove(const int&)");

--_size;

if (index != _size) // _size already decreased.

memmove(items + index, items + (index + 1), (_size - index) * sizeof(int)); // for (int i = index; i < _size; ++i)

// items[i] = items[i + 1];

}

//查找动态数组的大小

int Array::size() const {

return _size;

}

//查找动态数组的容量

int Array::capacity() const {

return _capacity;

}

//判断动态数组是否为空

bool Array::empty() const {

return 0 == _size;

}

//运行函数

void Array::run(){

char key;

int i,num,value;

cout<<"请输入你的选择:"<<"\t";

cin>>key;

while(key!='0')

{

switch(key)

{

case '1':{

cout<<"请输入插入元素的位置:\t";

cin>>num;

cout<<"请输入插入元素的值:\t";

cin>>key;

insert(num, key);

break;

}case '2':{

cout<<"请输入追加元素的值:\t";

cin>>key;

append(key);

break;

}case '3':{

cout<<"动态数组的大小为:\t"<

break;

}case '4':{

cout<<"动态数组的容量为:\t"<

break;

}case '5':{

cout<<"请输入你想删除的元素的位置:\t";

cin>>num;

remove(num);

break;

}

default:break;

}

cout<<"请输入你的选择:"<<"\t";

cin>>key;

}

}

//析构动态数组

Array::~Array() {

delete[] items;

}

int main() {

Array a(10);

cout<<"********请输入你想对动态数组的操作:(按0退出程序)**********"<

cout<<"******1、插入元素,2、追加元素,3、查看数组的大小,********"<

cout<<"***********4、查看数组的容量,5、删除元素***************"<

a.run();

}

运行结果:

1、

********请输入你想对动态数组的操作:(按0退出程序)**********

******1、插入元素,2、追加元素,3、查看数组的大小,*******

***4、查看数组的容量,5、删除元素、6显示动态数组中的元素***

请输入你的选择: 1

请输入插入元素的位置: 2

请输入插入元素的值: 2

terminate called after throwing an instance of 'std::out_of_range'

what(): Array::insert(const int&, const int&)

已放弃

2、

********请输入你想对动态数组的操作:(按0退出程序)**********

******1、插入元素,2、追加元素,3、查看数组的大小,*******

***4、查看数组的容量,5、删除元素、6显示动态数组中的元素***

请输入你的选择: 2

请输入追加元素的值: 6

请输入你的选择: 2

请输入追加元素的值: 8

请输入你的选择: 2

请输入追加元素的值: 7

请输入你的选择: 2

请输入追加元素的值: 3

请输入你的选择: 1

请输入插入元素的位置: 2

请输入插入元素的值: 3

请输入你的选择: 3

动态数组的大小为: 5

请输入你的选择: 4

动态数组的容量为: 10

请输入你的选择: 5

请输入你想删除的元素的位置: 2

请输入你的选择: 4

动态数组的容量为: 10

请输入你的选择: 3

动态数组的大小为: 4

请输入你的选择: 0

补充说明:

这是在linux系统下的gcc编程通过的,如果在VC下运行,可以把#include改为

#include应该没有问题。因为在gcc环境下,C++用C的库的话,必须包含的文件名前面加c.

C++定义动态数组

C++定义动态数组 首先:为什么需要动态定义数组呢? 这是因为,很多情况下,在预编译过程阶段,数组的长度是不能预先知道的,必须在程序运行时动态的给出 但是问题是,c++要求定义数组时,必须明确给定数组的大小,要不然编译通不过 如:int Array[5];正确 int i=5; int Array[i]; 错误因为在编译阶段,编译器并不知道i 的值是多少 那么,我们该如何解决定义长度未知的数组呢? 答案是:new 动态定义数组 因为new 就是用来动态开辟空间的,所以当然可以用来开辟一个数组空间 这样,下面的语句: int size=50; int *p=new int[size]; 是正确的 但是二维动态数组能不能也这样定义呢 int size=50,Column=50; int (*p)[Column]=new int [size][Column] 这样的语句,编译器通不过,为什么呢? 首先new int[size][Column] 就是动态生成时确定的,所以它没有错 那么就是int(*p)[Column],这句有问题了,这句为什么不对呢,那是因为,这是一个定义语句,而定义语句先经过编译器进行编译,当编译器运行到此处时,发现Column 不是常数,因此不能通过编译。而之所以编译器认为Column 不是常数,是因为编译阶段,编译器起的作用是查语法错误,和预分配空间,它并不执行程序,因此,没有执行那个赋值语句(只是对这个语句检查错误,和分配空间),因此编译阶段,它将认为column 是个变量。所以上面的二维数组定义是错误的,它不能通过编译。 改成这样: int size=50 int (*p)[50]=new int [size][50] 便正确了。 由此可见,这种动态分配数组,仅对一维数组空间是真正动态分配的。 但是如何真正的动态分配二维数组呢,即如果Column 也不能预先知道的话,该如何处理呢? 上面的动态分配已经不能满足我们的要求,因为上面动态分配只对一维数组是真正动态的,对二维

c#中动态数组的使用

在向大家详细介绍C#动态数组之前,首先让大家了解下C#动态数组的方法及属性,然后全面介绍C#动态数组。 下面的例子向你演示C#动态数组的方法及属性,这样通过实例的演示介绍能够更加深刻的理解C#动态数组的各项基本概念和应用,希望对你有所帮助。 C#动态数组的详解实例: 1.ArrayList AL = new ArrayList(); 2.AL.Add("Hello"); 3.AL.Add(" World"); 4.Console.WriteLine("给数组添加元素:"); 5.foreach (Object obj in AL) 6.{ Console.Write(obj); } 7.Console.WriteLine(); 8.Console.WriteLine("个数:" + AL.Count); 9.Console.WriteLine("容量: " + AL.Capacity); 10.AL.Insert(1, " c#"); 11.//C#动态数组的详解实例 12.Console.Write("在索引值为1的地方插入 "); 13.foreach (Object obj in AL) 14.{Console.Write(obj); } 15.Console.WriteLine(); 16.Console.WriteLine("个数:" + AL.Count); 17.Console.WriteLine("容量: "+AL.Capacity); 18.AL.Add("。");//给集合添加“。”,查看集合的容量 19.Console.WriteLine("容量。: " + AL.Capacity); 20.AL.Add("---");//给集合添加“---”,查看当集合的容量不够时,倍数变化 21.Console.WriteLine("容量---: " + AL.Capacity); 22.Console.WriteLine("3号索引的:"+AL[3]); 23.//用索引方式获取集合元素值 24.//C#动态数组的详解实例 25.Console.WriteLine("数组中是否包含?:"+AL.Contains ("?")); 26.//利用contains方法,查找集合中是否包含“?” 27.Console.WriteLine("经过之前操作后的数组元素:"); 28.foreach (Object obj in AL) 29.{ Console.Write(obj); } 30.Console.WriteLine(); 31.Console.WriteLine("个数:" + AL.Count);

C语言中动态数组的实现

C语言中动态数组的实现 (2009-05-10 10:19:30) 转载 分类:C语言学习 标签: c中动态数组 教育 近来编写几个程序,很多都用到了数组。但是对于数组的大小却是没有固定的,也就是说可以更改数组大小,其大小是可以变化的。并不像初学时的那样,告诉你一个范围,你就必须取最大值以满足要求。那样可能就会浪费很多不必要的内存单元!那么到底应该怎样定义一个动态数组列? 在数组一章中,曾介绍过数组的长度是预先定义好的,在整个程序中固定不变。C语言中不允许动态数组类型。例如: int n;scanf("%d",&n);int a[n]; 用变量表示长度,想对数组的大小作动态说明,这是错误的。但是在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。对于这种问题,用数组的办法很难解决。为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数可以按需要动态地分配内存空间,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。其它文献中所提到的"动态数组",指的就是利用内存的申请和释放函数,在程序的运行过程中,根据实际需要指定数组的大小.其本质是一个指向数组的指针变量.常用的内存管理函数有以下三个: 1.分配内存空间函数malloc 调用形式: (类型说明符*) malloc (size) 功能:在内存的动态存储区中分配一块长度为"size" 字节的连续区域。函数的返回值为该区域的首地址。“类型说明符”表示把该区域用于何种数据类型。(类型说明符*)表示把返回值强制转换为该类型指针。“size”是一个无符号数。例如: pc=(char *) malloc (100); 表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量pc。 2.分配内存空间函数 calloc calloc 也用于分配内存空间。调用形式: (类型说明符*)calloc(n,size) 功能:在内存动态存储区中分配n块长度为“size”字节的连续区域。函数的返回值为该区域的首地址。(类型说明符*)用于强制类型转换。calloc函数与malloc 函数的区别仅在于一次可以分配n块区域。例如: ps=(struet stu*) calloc(2,sizeof (struct stu)); 其中的sizeof(struct stu)是求stu的结构长度。因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu 类型,并把其首地址赋予指针变量ps。

Delphi之动态数组使用总结

Delphi之动态数组使用总结 传统的Pascal 语言其数组大小是预先确定的,当你用数组结构声明数据类型时,你必须指定数组元素的个数。专业程序员也许知道些许动态数组的实现技术,一般是采用指针,用手工分配并释放所需的内存。 Delphi 4中增加了非常简单的动态数组实现方法,实现过程效仿我前面讲过的动态长字符串。与长字符串一样,动态数组的内存动态分配并且引用记数,不过动态数组不支持copy-on-write 技术。这不是个大问题,因为你可以把变量值设置为nil释放数组内存。 这样你就可以声明一个不指定元素个数的数组,并用SetLength 过程给数组分配一个特定大小的内存,SetLength 过程还可以改变数组大小而不影响其内容,除此外还有一些字符串过程也可用于数组,如Copy 函数。 以下摘录的代码突出了一点,这就是:定义数组后必须先为它分配内存,然后才能开始使用: procedure TForm1.Button1Click(Sender: TObject);var Array1: array of Integer;begin Array1 [1] := 100; // error SetLength (Array1, 100); Array1 [99] := 100; // OK ...end; 如果你只定义一个数组元素个数,那么索引总是从0开始。Pascal 中的普通数组既能用不为零的下标,也能用非整数的下标,但动态数组均不支持这两种下标。象普通数组一样,你可以通过Length、High和Low 函数了解到动态数组的状况,不过对于动态数组,Low 函数返回值总是0,High函数返回数组大小减1,这意味着空的动态数组其函数High返回值是-1,这是一个很怪的值,因为它比Low的返回值还小。 图8.1:例DynArr 窗体 以上作了简短的介绍,现在举个简例,例名DynArr ,见图8.1。例子实在是很简单,其实动态数组没有什么特别复杂地方。我想通过该例说明几个程序员可能犯的错误。程序中声明了两个全程数组并在OnCreate 事件中初始化了第一个数组: var Array1, Array2: array of Integer;procedure TForm1.FormCreate(Sender: TObject);begin // allocate SetLength (Array1, 100);end; 这样就把数组所有值设置为0。完成这段代码你马上就能读写数组元素的值,而不用害怕内存出错,当然条件是你没有试图访问超过数组上界的元素。为了更好地初始化,程序中添加了一个按钮,执行数组元素赋值操作:

vc 创建动态数组

如何在VC中创建动态数组 关键词:VC 动态数组 怎样给多维数组动态分配内存 //Allocate: int **p = new int* [m]; for(int i = 0 ; i < m ; i++) p[i] = new int[n]; //Use: for(int i = 0 ; i < m; i++) for(int j = 0 ; j < n ; j++) p[i][j] = i * j; //Free: for(int i = 0 ; i < m ; i++) delete[] p[i]; delete[] p; 1. 演示形为int[2][3]的二维动态数组 /////////////////////////////////////////////////////////////////// int n1, n2; const int DIM1 = 2; const int DIM2 = 3; // 构造数组 int **ppi = new int*[DIM1]; for(n1 = 0; n1 < DIM1; n1++) { ppi[n1] = new int[DIM2]; } // 填充数据 for(n1 = 0; n1 < DIM1; n1++) { for(n2 = 0; n2 < DIM2; n2++) { ppi[n1][n2] = n1 * 10 + n2; } } // 输出 for(n1 = 0; n1 < DIM1; n1++) { for(n2 = 0; n2 < DIM2; n2++) { afxDump << "ppi[" << n1 << "][" << n2 << "] = " << ppi[n1][n2] << "\n"; } }

一维动态数组

用动态内存分配方法设计一个数组类,实现排序、插入等基本功能(特别注意拷贝构造函数的写法)#pragma once #include using namespace std; class myArrayList { public: myArrayList(int n=0); myArrayList(const int *a,int n); myArrayList(const int *a,int n,int max); myArrayList(const myArrayList &tList); ~myArrayList(void); void sort(); void show(); bool orderInsert(int num); private: int maxLen; int Len; int *arrPtr; }; #include"myArrayList.h" myArrayList::myArrayList(int n) { this->arrPtr=NULL; maxLen=Len=0; } myArrayList::~myArrayList(void) { delete [] arrPtr; } myArrayList::myArrayList(const int a[], int n) { maxLen=Len=n; this->arrPtr=new int[maxLen]; for(int i=0;iarrPtr=new int[maxLen];

C语言动态数组

动态数组是指在声明时没有确定数组大小的数组,即忽略圆括号中的下标;当要用它时,可随时用ReDim语句(C语言中用malloc语句)重新指出数组的大小。使用动态数组的优点是可以根据用户需要,有效利用存储空间。 动态数组,是相对于静态数组而言。静态数组的长度是预先定义好的,在整个程序中,一旦给定大小后就无法改变。而动态数组则不然,它可以随程序需要而重新指定大小。动态数组的内存空间是从堆(heap)上分配(即动态分配)的。是通过执行代码而为其分配存储空间。当程序执行到这些语句时,才为其分配。程序员自己负责释放内存。(欲详细了解堆请见堆栈) 为什么要使用动态数组? 在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。对于这种问题,用静态数组的办法很难解决。为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数结合指针可以按需要动态地分配内存空间,来构建动态数组,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。 动态数组与静态数组的对比 对于静态数组,其创建非常方便,使用完也无需释放,要引用也简单,但是创建后无法改变其大小是其致命弱点! 对于动态数组,其创建麻烦,使用完必须由程序员自己释放,否则严重会引起内存泄露。但其使用非常灵活,能根据程序需要动态分配大小。 如何构建动态数组 遵循原则 申请的时候从外层往里层,逐层申请; 释放的时候从里层往外层,逐层释放。 构建所需指针 对于构建一维动态数组,需要一维指针;对于二维,则需要一维,二维指针;三维需要一,二,三维指针; 依此类推。 构建所需函数 函数原型返回 功能说明 void *malloc(unsigned int size); 成功:返回所开辟空间首地址失败:返回空指针向系统申请size字节的堆空间 void *calloc(unsigned int num, unsigned int size);成功:返回所开辟空间首地址失败:返回空指针按类型申请num个size字节的堆空间 void free(void *p); 无返回值 释放p指向的堆空间 void *realloc(void *p,unsigned int size); 成功:返回新开辟空间首地址失败:返回空指针将p指向的堆空间变为size 说明: (1)规定为void *类型,这并不是说该函数调用后无返回值,而是返回一个结点的地址,该地址的类型为void(无类型或类型不确定),即一段存储区的首址,其具体类型无法确定,只有使用时根据各个域值数据再确定。可以用强制转换的方法将其转换为别的类型。例

动态数组vector用法

Vector用法介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作。本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用。通过阅读这篇文章读者应该能够有效地使用vector容器,而且应该不会再去使用C类型的动态数组了。 Vector总览 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。为了可以使用vector,必须在你的头文件中包含下面的代码: #include vector属于std命名域的,因此需要通过命名限定,如下完成你的代码: using std::vector; vector vInts; 或者连在一起,使用全名: std::vector vInts; 建议使用全局的命名域方式: using namespace std; 在后面的操作中全局的命名域方式会造成一些问题。vector容器提供了很多接口,在下面的表中列出vector的成员函数和操作。 Vector的函数 c.assign(beg,end) 将[beg; end)区间中的数据赋值给c。 c.assign(n,elem) 将n个elem的拷贝赋值给c。 c.at(idx) 传回索引idx所指的数据,如果idx越界,抛出out_of_range。

c.back() 传回最后一个数据,不检查这个数据是否存在。 c.begin() 传回迭代器中的一个数据。 c.capacity() 返回容器中数据个数。 c.clear() 移除容器中所有数据。 c.empty() 判断容器是否为空。 c.end() 指向迭代器中的最后一个数据地址。 c.erase(pos) 删除pos位置的数据,传回下一个数据的位置。 c.erase(beg,end) 删除[beg,end)区间的数据,传回下一个数据的位置。 c.front() 传回地一个数据。 get_allocator 使用构造函数返回一个拷贝。 c.insert(pos,elem) 在pos位置插入一个elem拷贝,传回新数据位置。 c.insert(pos,n,elem) 在pos位置插入n个elem数据。无返回值。 c.insert(pos,beg,end) 在pos位置插入在[beg,end)区间的数据。无返回值。

动态数组的创建

摘要的重要性是不言而喻的,每次发文章我都很纠结如何写出一个有特色的摘要来,能够以最为简短的文字向读者描述出我所要表达的东西。但是常常出现的问题是,摘要写得太简短了,读者看了不清楚文章究竟要讲啥;摘要写得稍微长点的话自然能够描述清楚所要表达的东西,但是却也出现了另外一个问题,就是读者看到大段的文字描述,觉得枯燥无味,直接二话不说给文章判了个“死刑”,导致这种情况下愿意真正的花时间看完摘要的读者屈指可数,更不用说文章的正文部分了,所以时长感慨写文章最头疼的莫过于摘要了。 很多人在编写C语言代码的时候很少使用动态数组,不管什么情况下通通使用静态数组的 方法来解决,在当初学习C语言的时候我就是一个典型的例子,但是现在发现这是一个相 当不好的习惯,甚至可能导致编写的程序出现一些致命的错误。尤其对于搞嵌入式的人来所,嵌入式系统的内存是宝贵的,内存是否高效率的使用往往意味着嵌入式设备是否高质量和高性能,所以高效的使用内存对我们来说是很重要的。那么我们在自己编写C语言代码的时 候就应该学会使用动态数组,这也就是我这篇博客要给大家讲的,我尽我所能的用一些简单的代码来讲解动态数组,希望我所讲的对你有所帮助。 那么我们首先来看看什么是动态数组,动态数组是相对于静态数组而言,从“动”字我们也可以看出它的灵活性,静态数组的长度是预先定义好的,在整个程序中,一旦给定大小后就无法改变。而动态数组则不然,它可以随程序需要而重新指定大小。动态数组的内存空间是从堆动态分配的。是通过执行代码而为其分配存储空间。当程序执行到我们编写的分配语句时,才为其分配。对于静态数组,其创建非常方便,使用完也无需释放,要引用也简单,但是创建后无法改变其大小是其致命弱点!对于动态数组,其创建麻烦,使用完必须由程序员自己释放,否则将会引起内存泄露。但其使用非常灵活,能根据程序需要动态分配大小。所以相对于静态数组的来说我们对于使用动态数组有很大的自由度。 在创建动态数组的过程中我们要遵循一个原则,那就是在创建的时候从外层往里层,逐层创建;而释放的时候从里层往外层,逐层释放。这个话你读了可能理解并不深刻,不过不要急,接下来我们看看两段代码。 一维动态数组的创建: #include #include int main() { int n1,i; int *array; printf("请输入所要创建的一维动态数组的长度:");

c加加动态数组加无限内存人员管理系统

c加加动态数组加无限内存人员管理 系统

”信息与计算科学”专业 《C++语言程序设计》课程设计 班级计算科学 姓名 学号 指导教师 设计日期·春·19周~20周

( 一) 、设计菜单选择程序。 菜单是应用程序的界面, 经过控制语句改变程序执行的顺序, 设计菜单是程序设计的基础。本设计分两步: 第一步: 设计一个菜单程序。 1.菜单内容: 程序运行后, 给出3个菜单项的内容和输入提示, 如下: 1)利用克莱姆法则求解线性方程组 2)统计一篇英文文章的单词数 3)退出程序 第二步: 为上述菜单项配上相应的功能。

2.程序优缺点: 优点: 采用了动态开辟二维数组, 传递不知道大小的二维数组, 程序规范, 可读性强。 缺点:采用递归算法, 增加了程序的时间复杂度。 3.代码段: #include #include #include #include using namespace std; double **open_up(int row,int line); double Price(int row,int line,double *a); void Head(); void Cramer();

void Statis_Words(); int main() { char ch; // 选择变量 while(1) { Head(); cout<<"\t\t选择要进行的程序: "<

C#动态数组动态分配长度的方法

C#之动态数组 C#中的数组是可以动态分配长度的,实现动态数组有以下几种途径,这里说的动态数组包括动态分配大小和动态增加数据. 先来看原始数组: int m = 5; int[] array = new int[m]; array[0] = 2; label1.Text = array[0].ToString() + " + " + array.Length.ToString(); 结果的输出自然是2 + 5; 动态分配: 1:m++; array = new int[m];//相当于重新初始化,原来的值被冲掉了 label2.Text = array[0].ToString() + " + " + array.Length.ToString(); 结果输出自然是0 + 6; 2:m++; Array.Resize(ref array, m); label2.Text = array[0].ToString() + " + " + array.Length.ToString(); 结果输出自然是2 + 6;

3:再有就是通过ArrayList的方法 第1种方案适合能够事先能从某处读出来长度的情况;第2,3种方案最适合在事先不知道数据长度究竟有多少,只能来一个算一个的情况,个人感觉,这才是动态数组真正的用途,也就是能够随着数据的增加而自动扩容。 在这方面ArrayList毫无疑问是首选,能够真正实现这个功能. ArrayList al = new ArrayList(); al.Add(NewData);//单个添加 如果增加的是同一类型的数据,用Array.Resize()也是能够实现的: if(产生了新数据)//增加个判断 { m++;//假设数组原来的长度是m Array.Resize(ref array,m); array[m] = NewData; } 虽然有同样的效果,但本质上是有差异的.ArrayList是真正的在变长. 而System.Array.Resize这个泛型方法是重新创建新设置大小的数组,用的是旧数组的元素初始化。随后以前的数组就废弃!也就是说并不是在原先的基础上扩容,而是新建了一个.但是无论如何在表面上看来确实实现了我们想要的功能.

动态数组的建立使用

1.动态数组的定义和实验 Option Base 1 Private Sub Command1_Click() Dim s() As Integer Dim n%, i%, ave! n = Val(Text1.Text) ReDims(n) For i = 1 To n s(i) = val(InputBox("输入数据")) Picture1.Print s(i); ave = ave + s(i) If i Mod 5 = 0 Then Picture1.Print Next i Text2.Text = Str(ave / n) End Sub 2.在动态数组重新定义中使用Preserve参数,保留数组原来的数据Dim a() as integer ˊ定义一个空数组 Private Sub Command1_Click() n = 5 ' 一开始第一维、第二维的大小是5 ReDima(n, n) For i = 0 To n For j = 0 To n a(i, j) = 5 Next j Next i Print "原始数据" For i = 0 To n For j = 0 To n Print a(i, j); Next j Print '换行 Next i m = 10 ReDim Preserve a(n, m) '只改变第二维值的上限第一维不能改 Print "重新设置后数据" For i = 0 To n For j = 0 To m Print a(i, j); Next j Print '换行 Next i

End Sub 3.用Array函数为一维数组赋初值。 Private Sub Command1_Click() Dim c As Variant c = Array(4, 5, 3, 7, 2, 9,10,12) For i = LBound(c) To UBound(c) Print c(i); Next i Print Print For i = 0 To 7 Print c(i); Next i End Sub 4.控件数组的设定和使用,先拖进一命令按钮,复制出3个同名的命令按钮,在窗体上作出如下的设计:“控件数组”在标签中。 4.控件数组的设定和使用,先拖进一命令按钮,复制出3个同名的命令按钮,在窗体上作出如下的设计:“控件数组”在标签中。 Private Sub Command1_Click(Index As Integer) Select Case Index Case 0 Text1.Text = "现在选定的序列号是" & Index Label1.BackColor = RGB(255, 0, 0) Case 1 Text1.Text = "现在选定的序列号是" & Index Label1.BackColor = RGB(0, 255, 0) Case 2 Text1.Text = "现在选定的序列号是" & Index Label1.BackColor = RGB(0, 0, 255) Case 3

动态数组选择题答案

1、如下程序段中包含一个错误。 X=4 Dim a(X) For m=4 to 0 step -1 a(m)=m +1 Next m 出错的原因是( C )。 A、第四行,数组元素a(m)下标越界 B、第四行,不能用循环变量m进行运算 C、第二行,不能用变量定义数组下标 D、以上原因都不对 2、运行下列程序,单击窗体后输出的结果是( B )。 Private Sub Form_Click() Dim a Dim s As Integer, i As Integer a = Array(1, 2, 3, 4, 5, 6) s = 1 For i = 5 To 1 Step -2 s = s * a(i) Next i Print s End Sub A、15 B、48 C、120 D、720 3、运行下列程序,单击窗体时在窗体上显示的结果是( B )。 Private Sub Form_Click() Dim a Dim s As Integer, i As Integer a = Array(1, 2, 3) For i = 2 To 0 Step -1 s = s + a(i) * a(i) Next i Print s End Sub A、13 B、14 C、不确定 D、程序出错 4、运行下列程序,单击窗体后输出的结果是( C )。 Option base 0 Private sub form_click() Dim a Dim I as integer A=Array(1,2,3,4,5,6,7,8,9) For I=1 to 3 Print a(5-I);

Next I End sub A、3 2 1 B、4 3 2 C、5 4 3 D、6 5 4 5、要将字符串数组a中所有学生姓名按数组下标顺序追加到列表框list1中,可以使用的程 序段为( C )。 A、List1.AddItem a B、For i = 0 To UBound(a) - 1 List1.AddItem a(i), 0 Next i C、For i = 0 To UBound(a) - 1 List1.AddItem a(i) Next i D、For i = 0 To UBound(a) - 1 List1.List(i) = a(i) Next I 6、以下定义数组或给数组元素赋值的语句中,正确的是( A )。 A、Dim a As Variant a=Array(1,2,3,4,5) B、Dim a(10) As Integer a=Array(1,2,3,4,5) C、Dim %A(10) a(1)="ABCD" D、Dim a(3),b(3)As Integer a(0)=0:a(1)=1:a(2)=2: b=a 7、设arr是一个上界为K的一维动态数组。能使arr元素个数增加1,但保留数组中原有数 据的语句是(D)。 A、ReDim arr(K+1) B、ReDim Static arr(K+1) C、Public arr(1ToK+1) D、ReDim Preserve arr(K+1) 8、能使一维数组arr(6)元素个数加1,但保留数组中原有元素的语句是( B )。 A、ReDim arr(7) B、ReDim Preserve arr(7) C、Public arr(1 to 7) D、Static arr(7)

在C++中实现变长数组动态创建数组

在C++中实现变长数组 1.变长一维数组 这里说的变长数组是指在编译时不能确定数组长度,程序在运行时需要动态分配内存空间的数组。实现变长数组最简单的是变长一维数组,你可以这样做: //文件名: array01.cpp #include using namespace std; int main() { int len; cin>>len; //用指针p指向new动态分配的长度为len*sizeof(int)的内存空间 int *p=new int[len]; ........... delete[] p; return 0; } 注意int *p=new int[len];这一句,你不能这样做: int p[len]; C++编译器会报错说len的大小不能确定,因为用这种形式声明数组,数组的大小需要在编译时确定。而且这样也不行: int p[]=new int[len]; 编译器会说不能把int*型转化为int[]型,因为用new开辟了一段内存空间后会返回这段内存的首地址,所以要把这个地址赋给一个指针,所以要用int *p=new int[len]; array01.cpp实现了一个变长的一维数组,但是要养成一个好习惯,就是注意要注销指针p,使程序释放用new开辟的内存空间,delete []p; 当然使用C++标准模版库(STL)中的vector(向量)也可以实现变长数组: #include #include using namespace std; int main(void) { vector a; int i; for (i=0;i<10;++i) a.push_back(i);//添加元素

C++编程练习1:动态数组(Dynamic Array)类的封装练习

C++编程练习1:动态数组(Dynamic Array)类的封装练习 程序环境 学习使用Visual C++ 6.0环境开始编程:学习最简单的使用Win32 Console Project (类似于Turbo C中的环境),使用说明可见: https://www.360docs.net/doc/cc13258297.html,/ligangliu/Courses/DataStructure_2005-2006/SourceCodes/C2C++/NewConsole.htm 编程规范 编写程序一定要养成良好的代码习惯。“程序不是写给自己看的,是写给别人看的”。 学习规范化编程,养成良好的习惯。可参考编程规范及技巧的文档: https://www.360docs.net/doc/cc13258297.html,/ligangliu/ForStudents/C++/CodingSkills.rar https://www.360docs.net/doc/cc13258297.html,/ligangliu/_download/Training/Documents/Talks/Coding/CodingBasicSkills.rar 注意:不同的团体、公司都有各自的编程规范,没有统一的编程规范。在编程训练的初期,只要选择自己喜欢的一套比较统一的编程规范来写即可,不必追求与上述文档完全一致的编程规范。以后随着编程水平的提高以及查看其他规范的代码后,可根据自己的喜好和合作团队的要求来不断调整自己的编程规范。 动态数组类的演示过程 使用固定大小的数组,如 double a[100]; 有使用不方便的地方:数组大小固定,不灵活;如果程序使用的情况数组元素的个数多于100,则要改数组大小,然后重新编译程序;如果程序使用的情况数组元素的个数很少,则有大量的空间被浪费。 为了解决这个矛盾,可以使用动态分配内存空间的方法(需要对内存的动态分配的机制和原理了解和熟悉),即, 采用一个指针p记录数组的头地址;采用一个整数n记录数据元素的个数 程序运行时,用多少个元素n,就从内存中申请多少空间来存储数组p;p所指向的内存空间的数组元素总是n。n一旦变化,p即申请新的空间用来存储数组(当然需释放掉以前的内存空间,以免造成内存泄漏)。这样,对数组的操作是通过一些函数来操作:这些函数就是对操作这个数组的“接口”。 上述的程序大概形式可见: https://www.360docs.net/doc/cc13258297.html,/ligangliu/Courses/DataStructure_2005-2006/SourceCodes/C2C++/Array0.rar 由于p 和n之间有强烈的逻辑关系,自然可以用struct将它们“包”在一起处理,见: https://www.360docs.net/doc/cc13258297.html,/ligangliu/Courses/DataStructure_2005-2006/SourceCodes/C2C++/Array1.0.rar https://www.360docs.net/doc/cc13258297.html,/ligangliu/Courses/DataStructure_2005-2006/SourceCodes/C2C++/Array1.1.rar

动态数组的C++实现

动态数组的C++实现 动态数组在C++中有广泛的应用,但实现起来比较麻烦。这是我编写的一个动态数组的实现程序,程序的大部分功能都能实现,比如插入元素、向动态数组末尾追加元素、显示动态数组的大小、显示动态数组的容量、显示动态数组的元素。还有一些功能我虽然写了实现函数,但没有测试程序的结果,只写了最常见的几种操作。程序的最大优点是测试程序方便。 程序代码 /* * Array.cpp * * Created on: 2011-1-19 * Author: jiayanbo */ #include #include #include #include using namespace std; //定义一个动态数组类 class Array { int _size; int _capacity; int* items; public: typedef int* iterator; typedef const int* const_iterator; enum { DEFAUL_CAP = 16 }; explicit Array(const int& capcity = DEFAUL_CAP); Array(const Array& other); Array& operator=(const Array& other); ~Array(); iterator begin(); const_iterator begin() const; iterator end(); const_iterator end() const; const int& operator[](const int& index) const; int& operator[](const int& index); void insert(const int& index, const int& value); void remove(const int& index);

动态数组的基本应用与实现实验报告

设计动态数组的基本应用与实现 1.1需求陈述 数组是应用程序中经常要用到的一种数据结构。虽然通过数组可以对大量的数据和对象进行有效的管理,但很多情况下,在程序运行之前,并不能够确切地知道数组中会有多少元素,这时候数组到底声明为多大,就是一个很麻烦的问题。在C++中,动态内存分配技术可以保证程序在运行过程中按照实际需要申请适量的内存,使用结束后还可以释放。这样就使得在运用数组时更加方便,有效。 1.2 需求分析 1.2.1功能分析 表1 函数库功能分析 1.2.2数据分析

数组最初默认为空,并且容量为10。由于使用动态内存分配,所以在存入数据时不必担心数组大小的影响,数组容量不够时可以自动分配新的内存存储数据。对数组进行不同的操作时,数组也会根据实际需要进行动态的内存分配。这样使得数组的应用更加方便、灵活,同时提高了效率。为提高函数的可靠性,我们对每个函数的测试准备了2-3套测试数据。 1.2.3技术约束 本函数库的测试系统已在code blocks下编译通过。 1.3 总体设计 1.3.1 数据结构 数组所采用的数据结构是类。声明一个数组类,在将对数组进行的各项操作声明为类的函数,通过调用各个函数来实现对数组的各项操作功能。具体定义形式为: class Array { int _size;//元素个数 int _capacity;//容量 int* items;//动态数组 public: Array(const int& capcity = 16);//构造函数 Array(const Array& other);//拷贝构造函数 Array& operator = (const Array& other);// ~Array();//析构函数 void insert(const int& index, const int& value);//插入函数 void remove(const int& index);//删除函数 void append(const int& value);//追加函数 void run();//运行函数 };

MFC中动态数组CArray的使用

MFC中动态数组CArray的使用 数组——这个C语言中的怪物,自从被直接继承到C++中,便让无数有识之士们前赴后继、绞尽脑汁,试图寻找一种可以动态增长的替代数据类型。当然,最著名的,应该就是vector向量。但是,它的数据定义极其复杂,还有迭代的出现,几乎彻底摧毁了它仅存的一点优势。所以,引入MFC之后,微软斩钉截铁地抛弃了标准C++的模板库。 CArray是MFC中非常重要的几个类模板之一,其他的还有CList、CMap等,但它们的定义略微有点晦涩。以我自己的经验,在MFC中使用CArray定义动态数组是非常方便的。在MSDN中,CArray的声明如下: template< class TYPE, class ARG_TYPE > class CArray : public CObject 参数 TYPE 模板参数,指定存储在数组中对象的类型。TYPE是CArray返回的参数类型。 ARG_TYPE 模板参数,指定用来访问存储在数组中对象的变量类型,通常是TYPE的引用。ARG_TYPE 是传递给CArray的参数类型。 备注 CArray类支持与C中相似的数组,但是必要时可以动态收缩和增长。数组索引总是从0开始。你可以决定是固定数组上界还是允许当添加元素超过当前边界时扩展数组。内存被连续地分配到上界,即使一些元素可能为空。和C中数组一样,CArray索引元素的访问时间是不变的,与数组大小无关。 提示在使用一个数组之前,使用SetSize建立它的大小和为它分配内存。如果不使用SetSize,则为数组添加元素就会引起频繁地重新分配和拷贝。频繁地重新分配和拷贝不但没有效率,而且会导致内存碎片。 如果需要一堆数组中的个别数据,必须设置CDumpContext对象的深度为1或更大。 此类的某些成员函数调用全局帮助函数,它必须为CArray的大多数使用而定制。请参阅宏和全局量章节中的Collection Class Helpers。 当从一个CArray对象中移去元素时,帮助函数DestructElements被调用。当添加元素时,帮助函数ConstructElements被调用。 数组类的派生与列表的派生类似。 有关使用CArray类的更多信息,请参考Visual C++ Programmer's Guide中的论文集。 #include 看到上面这么一大段文字是不是觉得有点头晕?MSDN就是这样的,不然怎么能体现出它的“权威”呢。其实不要觉得它很复杂,使用CArray类构造动态数组非常简单。首先,你需要包含头文件Afxtempl.h,然后就可以定义自己的动态数组了。例如定义一个int型和CPoint型的动态数组: #include CArray num; CArray pt; // 也可以这样:CArray pt;

相关主题
相关文档
最新文档