c++如何用动态数组和函数

#include<iostream>usingnamespacestd;constintSLEN=30;structstudent{charfullname[SLEN];... #include<iostream>
using namespace std;
const int SLEN = 30;
struct student
{
char fullname[SLEN];
char hobby[SLEN];
int ooplevel;
};

int getinfo(student pa[],int n);
void display1(student st);
void display2(const student *ps);
void display3(const student pa[],int n);

int main()
{
cout<<"Enter class size: ";
int class_size;
cin>>class_size;
while(cin.get()!='\n')
continue;

student *ptr_stu = new student[class_size];
int entered = getinfo(ptr_stu,class_size);
}

int getinfo(student pa[],int n)
{
for(int i=0;i<n;i++)
{
student pa[i]= new student;
cout<<"Please input full name ."<<endl;
while(cin.getline(pa[i]->fullname,'\0'))
{
cout<<"Please input hobby ."<<endl;
cin.getline(pa[i]->hobby,'\0');
cout<<"Please input ooplevel ."<<endl;
cin>>pa[i]->ooplevel;
}
}
}
展开
 我来答
zhaozhi6862179
2015-11-05 · TA获得超过3546个赞
知道小有建树答主
回答量:269
采纳率:0%
帮助的人:16.3万
展开全部
  1.变长一维数组 这里说的变长数组是指在编译时不能确定数组长度,程序在运行时需要动态分配内存空间的数组。实现变长数组最简单的是变长一维数组,你可以这样做:
  1: //文件名: array01.cpp
  2: #include<iostream>
  3: using namespace std;
  4: int main()
  5: {
  6: int len;
  7: cin>>len;
  8: //用指针p指向new动态分配的长度为len*sizeof(int)的内存空间
  9: int *p=new int[len];
  10: ...........
  11: delete[] p;
  12: return 0;
  13: }
  注意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开辟的内存空间。 当然使用C++标准模版库(STL)中的vector(向量)也可以实现变长数组:
  1: //文件名: array02.cpp
  2: #include<iostream>
  3: #include<vector>
  4: using namespace std;
  5: int main()
  6: {
  7: int len;
  8: cin>>len;
  9: vector<int> array(len);//声明变长数组
  10: for(int i=0;i<len;i++)
  11: {
  12: array[i]=i;
  13: cout<<array[i]<<"/t";
  14: }
  15: return 0;
  16: }
  这里的变长数组让我联想到了java的java.util包中的vector和C#中的ArrayList,它们也可以在各自的语言中实现变长数组。不过C++中的vector不能像C#一样有托管的垃圾回收机制回收被占用的内存空间,但是你可以在使用完vector后调用~vector()析构函数释放内存。 2.变长n维数组 变长的n维数组实现起来有些麻烦,但是在工程与软件设计应用中常使用的是二维数组,所以在这里着重介绍变长的二维数组,变长的n维数组可以按照类似的方法实现。首先看一个经典的用C实现变长二维数组的例子:
  1: //文件名: array03.c
  2: #include <stdio.h>
  3: #include <malloc.h>
  4: void main()
  5: {
  6: int x,y,i,j;
  7: float **a,*b;
  8: printf("请输入你所求解的线性方程组的行数x:x=");
  9: scanf("%d",&x);
  10: printf("请输入你所求解的线性方程组的列数y:y=");
  11: scanf("%d",&y);
  12: a=(float **)malloc(sizeof(float *) *x);
  13: b=(float *)malloc(sizeof(float) *x);
  14: for(i=0;i<x;i++)
  15: {
  16: *(a+i)=(float *)malloc(sizeof(float) *y);
  17: }
  18: /*读入数据*/
  19: printf("请按行的顺序依次输入系数的值(共%d项):",x*y);
  20: for(i=0;i<=x-1;i++)
  21: for(j=0;j<=y-1;j++)
  22: scanf("%f",&a[i][j]);
  23: printf("请按列的顺序依次输入常数的值(共%d项):",x);
  24: for(j=0;j<=x-1;j++)
  25: scanf("%f",&b[j]);
  26: printf("您输入方程组的增广矩阵为:/n");
  27: for(i=0;i<=x-1;i++)
  28: {
  29: for(j=0;j<=y-1;j++)
  30: printf("%.5f ",a[i][j]);
  31: printf("%.5f ",b[i]);
  32: printf("/n");
  33: }
  34: free(b);
  35: for(i=0;i<x;i++)
  36: free (*(a+i));
  37: }
  那么用C++怎样实现呢?在C++中可以通过new和delete运算符动态开辟和释放空间,其中new与C中malloc函数的功能相似,delete与C中free函数的功能相似。用C++实现变长二维数组时可以采用两种方法:双指针方法和使用STL中vector(向量)的方法。 首先介绍一下双指针方法,在这里双指针就是指像指针的指针,比如你可以这样声明一个数组: int **p = new int*[num1]; 而对每一个*p(一共num1个*p)申请一组内存空间: for(int i=0; i<num1; ++i) p[i] = new int[num2]; 其中,num1是行数,num2是数组的列数。测试的源程序如下:
  1: //文件名: array04.cpp
  2: #include <iostream>
  3: #include <iomanip>
  4: using namespace std;
  5: int main()
  6: {
  7: int num1,//行数
  8: num2;//列数
  9: cout<<"Please enter the number for row and column: "<<endl;
  10: cin >> num1 >> num2;
  11: //为二维数组开辟空间
  12: int **p = new int*[num1];
  13: for(int i=0; i<num1; ++i)
  14: p[i] = new int[num2];
  15: for(int j=0;j<num1;j++)
  16: {
  17: for(int k=0;k<num2;k++)
  18: {
  19: p[j][k]=(j+1)*(k+1);
  20: cout<<setw(6)<<p[j][k]<<':'<<setw(8)<<&p[j][k];
  21: }
  22: cout<<endl;
  23: }
  24: //释放二维数组占用的空间
  25: for(int m=0;m<num1;m++)
  26: delete[] p[m];
  27: delete[] p;
  28: return 0;
  29: }
  以下是运行结果: Please enter the number for row and column: 4 5 1:004915F0 2:004915F4 3:004915F8 4:004915FC 5:00491600 2:00491180 4:00491184 6:00491188 8:0049118C 10:00491190 3:00491140 6:00491144 9:00491148 12:0049114C 15:00491150 4:00491100 8:00491104 12:00491108 16:0049110C 20:00491110 Press any key to continue 程序清单array04.cpp可以显示分配的内存空间单元的地址,大家可以看到,由于数组空间是动态分配的,数组行之间的地址空间是不连续的,因为不同行的数组元素的地址空间是用不同的new来分配的。而每一行之中列之间的地址空间是连续的。 那么用vector(向量)怎样实现二维数组呢?以下给出源程序:
  1: //文件名: array05.cpp
  2: #include <iostream>
  3: #include <vector>
  4: #include <iomanip>
  5: using namespace std;
  6: int main()
  7: {
  8: int i,
  9: j,
  10: m, //行数
  11: n; //列数
  12: cout << "input value for m,n:";
  13: cin>>m>>n;
  14: //注意下面这一行:vector<int后两个">"之间要有空格!否则会被认为是重载">>"。
  15: vector<vector<int> > vecInt(m, vector<int>(n));
  16: for (i = 0; i < m; i++)
  17: for (j = 0; j < n; j++)
  18: vecInt[i][j] = i*j;
  19: for (i = 0; i < m; i++)
  20: {
  21: for (j = 0; j < n; j++)
  22: cout<<setw(5)<<vecInt[i][j]<<":"<<setw(9)<<&vecInt[i][j];
  23: cout<<endl;
  24: }
  25: return 0;
  26: }
  以下是运行结果: input value for m,n:3 4 0: 00491180 0: 00491184 0: 00491188 0: 0049118C 0: 00491140 1: 00491144 2: 00491148 3: 0049114C 0: 00491100 2: 00491104 4: 00491108 6: 0049110C Press any key to continue 大家可以看到,这里vector中元素的内存的地址分配也有同双指针实现的二维数组有同样的特点。不过用vector的方法比使用双指针简单地多,分配内存空间时会更安全,数组初始化代码也更简单,所以本人建议使用STL中的vector来实现变长多维数组。以下是一个变长三维数组:)
  1: //文件名: array06.cpp
  2: #include <iostream>
  3: #include <vector>
  4: #include <iomanip>
  5: using namespace std;
  6: int main()
  7: {
  8: int i,
  9: j,
  10: k,
  11: m, //一维坐标
  12: n, //二维坐标
  13: l; //三维坐标
  14: cout << "input value for m,n,l:";
  15: cin>>m>>n>>l;
  16: vector<vector<vector<int> > > vecInt(m, vector<vector<int> >(n, vector<int>(l)));
  17: for (i = 0; i < m; i++)
  18: for (j = 0; j < n; j++)
  19: for(k = 0; k < l; k++)
  20: vecInt[i][j][k] = i+j+k;
  21: for (i = 0; i < m; i++)
  22: {
  23: for (j = 0; j < n; j++)
  24: {
  25: for(k = 0; k<l; k++)
  26: cout<<setw(5)<<vecInt[i][j][k]<<":"<<setw(9)<<&vecInt[i][j][k];
  27: cout<<endl;
  28: }
  29: cout<<endl;
  30: }
  31: return 0;
  32: }
  运行结果: input value for m,n,l:2 3 4 0: 00492FE0 1: 00492FE4 2: 00492FE8 3: 00492FEC 1: 00492FA0 2: 00492FA4 3: 00492FA8 4: 00492FAC 2: 00492F60 3: 00492F64 4: 00492F68 5: 00492F6C 1: 00492EC0 2: 00492EC4 3: 00492EC8 4: 00492ECC 2: 00492E80 3: 00492E84 4: 00492E88 5: 00492E8C 3: 00492E40 4: 00492E44 5: 00492E48 6: 00492E4C
sine882010
推荐于2016-10-02 · TA获得超过320个赞
知道小有建树答主
回答量:167
采纳率:0%
帮助的人:210万
展开全部
//修改代码如下:如有问题,再探讨~~~
#include<iostream>
using namespace std;
const int SLEN = 30;
struct student
{
char fullname[SLEN];
char hobby[SLEN];
int ooplevel;
};

int getinfo(student pa[],int n);
void display1(student st);
void display2(const student *ps);
void display3(const student pa[],int n);

int main()
{
cout<<"Enter class size: ";
int class_size;
cin>>class_size;
while(cin.get()!='\n')
continue;

student *ptr_stu = new student[class_size];
int entered = getinfo(ptr_stu,class_size);
return 0;
}

int getinfo(student pa[],int n)
{
for(int i=0;i<n;i++)
{
//student pa[i]= new student;/////////////数组不需要动态分配内存,它在定义的时候就会自动分配的。
cout<<"Please input full name ."<<endl;
while(cin.getline(pa[i].fullname,'\0'))/////////
{
cout<<"Please input hobby ."<<endl;
cin.getline(pa[i].hobby,'\0');////////////对象访问,不是指针
cout<<"Please input ooplevel ."<<endl;
cin>>pa[i].ooplevel;////////////同理
}
}
//返回值怎么忘记了
return 0;//这里是我随便返回的,你用的时候按照你的意思改一下
}
追问
谢谢你的回答,请问你会哈希表的基础到深入吗?
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2018-03-11
展开全部

# include <iostream>

# include <array>

# include <string>

using namespace std;

const int SLEN =30;

struct student{

char fullname[SLEN ];

char hobby[SLEN ];

int ooplevel;

};

int getinfo(student pa[],int n);

void display1(student);

void display2(student*);

void display3(student*,int);

void main()

{

cout<<"Enter class size:";

int class_size;

cin>>class_size ;

while(cin.get() !='\n')

continue ;

student  *ptr_stu= new student [class_size ];

int entered=getinfo(ptr_stu ,class_size );

for(int i=0;i<entered;i++)

{

display1 (ptr_stu [i]);

display2(&ptr_stu [i]);

}

cin.get();

display3 (ptr_stu ,entered );

delete [] ptr_stu ;

cout<<"Done\n";

}

int getinfo(student pa[],int n)

{

int i;

for( i=0;i<n;i++)

{

cout<<"Enter the student's name #"<<i+1<<": ";

if(cin.getline(pa[i].fullname,SLEN )==0) break; 

cout<<"Enter the student's hobby #"<<i+1<<": ";

cin.getline(pa[i].hobby ,SLEN ); 

cout<<"Enter the student's ooplevel #"<<i+1<<": ";

cin>>pa[i].ooplevel ; 

cin.get();

}

return i;

}

void display1(student arry)

{

cout<<"student's name : "<<arry.fullname<<endl;

cout<<"student's hobby: "<<arry.hobby <<endl;

cout<<"student's ooplevel : "<<arry.ooplevel <<endl;

}

void display2(student* arry)

{

cout<<"student's name : "<<(*arry).fullname<<endl;

cout<<"student's hobby : "<<(*arry).hobby <<endl;

cout<<"student's ooplevel : "<<(*arry).ooplevel <<endl;

}

void display3(student* arry,int n)

{

for(int i=0;i<n; i++)

{

cout<<"student's name : "<<(*(arry+i)).fullname<<endl;

cout<<"student's hobby : "<<(*(arry+i)).hobby <<endl;

cout<<"student's ooplevel : "<<(*(arry+i)).ooplevel <<endl;

}

}


// 刚好练到这题,来自C++小白~

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式