| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 850 人关注过本帖
标题:求教二维数组和指针的关系,望高手们改动使它正确运行,其中返回的二维数组 ...
只看楼主 加入收藏
Woodswift
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-12-13
收藏
 问题点数:0 回复次数:2 
求教二维数组和指针的关系,望高手们改动使它正确运行,其中返回的二维数组是有用的,也要正确返回。下面是我写的一段程序:
#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;
}
搜索更多相关主题的帖子: 指针 关系 
2008-12-13 16:20
PcrazyC
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:5652
专家分:0
注 册:2006-10-20
收藏
得分:0 
你要想获得多个函数中计算所得的值必须使用指针或引用。你使用指针或引用作参数就行了。自己先百度一下,改改吧。

雁无留踪之意,水无取影之心
2008-12-14 15:12
hitcolder
Rank: 1
等 级:新手上路
威 望:1
帖 子:124
专家分:0
注 册:2008-10-28
收藏
得分:0 
不短啊 看看能不能看明白

不要在你的智慧中夹杂傲慢,也不要使你们的谦卑缺乏智慧的成分。
2008-12-15 23:23
快速回复:求教二维数组和指针的关系,望高手们改动使它正确运行,其中返回的二维 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035704 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved