求教二维数组和指针的关系,望高手们改动使它正确运行,其中返回的二维数组是有用的,也要正确返回。下面是我写的一段程序:
#include <iostream.h>#include <time.h>
#include <math.h>
#include <stdlib.h>
#include <fstream.h>
#define M 3600
int peo_num_from_4_30_to_5_30=0;
class Person
{
public:
int from;//出发楼层
int to;//到达楼层
int time;//到达时刻
int which_lift;//乘坐的电梯(南或北)
friend Person* Create_Person_from_4_30_to_5_30();//随机产生person的函数
friend int* Create_Person_num_from_4_30_to_5_30();//用于统计产生person的人数的函数
friend Person* South_peo_from_4_30_to_5_30(int,Person*);//用于记录乘坐南面电梯的人的函数
friend int* South_peo_num_from_4_30_to_5_30(int,Person*);//用于统计乘坐南面电梯的人数的函数
friend Person* North_peo_from_4_30_to_5_30(int,Person*);//用于记录乘坐北面电梯的人的函数
friend int* North_peo_num_from_4_30_to_5_30(int,Person*);//用于统计乘坐北面电梯的人数的函数
};
int Random()//用于产生1-30的随机数
{
double probabilities[31];
int i;
ifstream file1("lift.dat",ios::in);
for(i=1;i<=30;i++)
file1>>probabilities[i];
file1.close();
int j;
double p=rand()/(double)RAND_MAX;
double probabilities_sum=0;
for (j=1; j<=30; j++)
{
probabilities_sum+=probabilities[j];
if (probabilities_sum>p)
break;
}
return j;
}
Person* Create_Person_from_4_30_to_5_30()
{
Person (*peo)[M];
peo=new Person[31][M];//开辟31个大小为3600的person类型的数组(我们用到了1-30)
int from_floor;//记录到达的目的层
int pre=0;//记录当前的那个人的到达时刻,初始化为0
int t;
int peo_num[31]={0};//记录产生person的数目
int which=0;//记录选择的是南面的电梯还是北面的电梯,0表示南面电梯,1表示北面电梯
while (1)
{
t=rand()%31;//随机产生一个0-30平均分布的时间间隔
if (pre+t>3600) break;//如果到达的时间超过3600秒,即超过9:00a.m.跳出循环
pre=pre+t;
from_floor=Random();//生成随机的to_floor
if (from_floor<=15)//如果到达的目的层不高于15层,就随机选择南北电梯
{
int wh=rand()%2;//随机产生一个0或1的数
peo[from_floor][peo_num[from_floor]].to=1;
peo[from_floor][peo_num[from_floor]].from=from_floor;//to_floor的产生方法参考提示2
peo[from_floor][peo_num[from_floor]].time=pre;
peo[from_floor][peo_num[from_floor]].which_lift=wh;
peo_num[from_floor]++;
}
else
{
peo[from_floor][peo_num[from_floor]].to=1;
peo[from_floor][peo_num[from_floor]].from=from_floor;
peo[from_floor][peo_num[from_floor]].time=pre;
peo[from_floor][peo_num[from_floor]].which_lift=0;
peo_num[from_floor]++;
}
}
return peo[M];
delete []peo;
}
int* Create_Person_num_from_4_30_to_5_30()
{
Person (*peo)[M];
peo=new Person[31][M];//开辟31个大小为3600的person类型的数组(我们用到了1-30)
int from_floor;//记录到达的目的层
int pre=0;//记录当前的那个人的到达时刻,初始化为0
int t;
int peo_num[31]={0};//记录产生person的数目
int which=0;//记录选择的是南面的电梯还是北面的电梯,0表示南面电梯,1表示北面电梯
while (1)
{
t=rand()%31;//随机产生一个0-30平均分布的时间间隔
if (pre+t>3600) break;//如果到达的时间超过3600秒,即超过9:00a.m.跳出循环
pre=pre+t;
from_floor=Random();//生成随机的to_floor
if (from_floor<=15)//如果到达的目的层不高于15层,就随机选择南北电梯
{
int wh=rand()%2;//随机产生一个0或1的数
peo[from_floor][peo_num[from_floor]].to=1;
peo[from_floor][peo_num[from_floor]].from=from_floor;//to_floor的产生方法参考提示2
peo[from_floor][peo_num[from_floor]].time=pre;
peo[from_floor][peo_num[from_floor]].which_lift=wh;
peo_num[from_floor]++;
}
else
{
peo[from_floor][peo_num[from_floor]].to=1;
peo[from_floor][peo_num[from_floor]].from=from_floor;
peo[from_floor][peo_num[from_floor]].time=pre;
peo[from_floor][peo_num[from_floor]].which_lift=0;
peo_num[from_floor]++;
}
}
return peo_num;
delete []peo;
}
Person* South_peo_from_4_30_to_5_30(int peo_num[31],Person (*peo)[M])
{
Person (*south_peo)[M];
south_peo=new Person[31][M];//需要开辟一个大小为3600的person类型的数组
int s_num[31]={0};
for (int i=1;i<31;i++)
{
for(int j=0;j<peo_num[i];j++)
if (peo[i][j].which_lift==0)
{
south_peo[i][s_num[i]]=peo[i][j];
s_num[i]++;
}
}
return south_peo[M];
delete []south_peo;
}
int* South_peo_num_from_4_30_to_5_30(int peo_num[31],Person (*peo)[M])
{
Person (*south_peo)[M];
south_peo=new Person[31][M];//需要开辟一个大小为3600的person类型的数组
int s_num[31]={0};
for (int i=1;i<31;i++)
{
for(int j=0;j<peo_num[i];j++)
if (peo[i][j].which_lift==0)
{
south_peo[i][s_num[i]]=peo[i][j];
s_num[i]++;
}
}
return s_num;
delete []south_peo;
}
Person* North_peo_from_4_30_to_5_30(int peo_num[31],Person (*peo)[M])
{
Person (*north_peo)[M];
north_peo=new Person[16][M];//需要开辟一个大小为3600的person类型的数组
int n_num[16]={0};
for (int i=1;i<16;i++)
{
for(int j=0;j<peo_num[i];j++)
if (peo[i][j].which_lift==1)
{
north_peo[i][n_num[i]]=peo[i][j];
n_num[i]++;
}
}
return north_peo[M];
delete []north_peo;
}
int* North_peo_num_from_4_30_to_5_30(int peo_num[31],Person (*peo)[M])
{
Person (*north_peo)[M];
north_peo=new Person[16][M];//需要开辟一个大小为3600的person类型的数组
int n_num[16]={0};
for (int i=1;i<16;i++)
{
for(int j=0;j<peo_num[i];j++)
if (peo[i][j].which_lift==1)
{
north_peo[i][n_num[i]]=peo[i][j];
n_num[i]++;
}
}
return n_num;
delete []north_peo;
}
int main()
{
srand((unsigned)time(NULL));
Person* p=Create_Person_from_4_30_to_5_30();//随机产生person的函数
int* i=Create_Person_num_from_4_30_to_5_30();//用于统计产生person的人数的函数
Person* q=South_peo_from_4_30_to_5_30(i,p);//用于记录乘坐南面电梯的人的函数
int* j=South_peo_num_from_4_30_to_5_30(i,p);//用于统计乘坐南面电梯的人数的函数
Person* r=North_peo_from_4_30_to_5_30(i,p);//用于记录乘坐北面电梯的人的函数
int* k=North_peo_num_from_4_30_to_5_30(i,p);//用于统计乘坐北面电梯的人数的函数
cout<<i<<endl;
cout<<j<<endl;
cout<<k<<endl;
return 0;
}