课程设计-----大学建筑信息管理系统(C++课程设计,数据结构,软件过程与管理)

#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include//getch  
#include//清屏函数头文件 
#include   
#include   
#include   
#include   
#define M 100  
#define INF 999666333   
#define l 1<<10  
#define mod (1<<10)-1 
using namespace std;  

struct Matrix  
{  
    string Sname;// 建筑名称,为了解决哈希冲突  
    int count;// 建筑总数量  
    int edge;//道路数量  
    int m[M][M];// 建筑邻接矩阵  
    string Pname[M];//各个建筑的名称  
};  
struct Scenic  
{  
   Scenic(): next(NULL){}  
    Matrix mat;  
   struct Scenic *next;  
};     
 
int hash(string name);  
void Welcome();
void create_graph();
void print_graph(); 
void DFS(int c,struct Scenic *p);//深度优先搜索建筑线路  
void guide_line();//建筑线路  
void dfs(int i,struct Scenic *p);//递归实现  
void check_circuit();//判断回路  
void Floyd(int a,int b,struct Scenic *&p); 
void min_distance();
void prime(struct Scenic *&p,string name);//最小生成树(prime算法)  
void build_road(); 
void scenic_message();
void change_sceic_name(struct Scenic *&p);
void change_weight(struct Scenic *&p);//修改该校区某条道路上的权值  
void increase_number(struct Scenic *&p);//增加该校区小路的数量  
void change_information();//修改校区建筑信息  
void MainFace();//主界面  
void returnMainFace();//返回主界面 
using namespace std;  
Scenic S[10000]; 
using namespace std;  
int hash(string name)  
{  
    int key=0,t=name.size();  
    for(int i=0;i>name;  
    getchar();  
    key=hash(name);  
    Scenic *p=new Scenic,*q=new Scenic;  
    q=S[key].next;  
    while(q)//不为空时说明该位置存在校区(ASCII可以相同)  
    {  
        if(q->mat.Sname==name)//名称不能相同,才可以输入校区  
          {  
             cout<<"该建筑名称已存在,重新输入建筑名称: ";  
             cin>>name;  
             getchar();  
             key=hash(name);  
             q=S[key].next;  
             break;  
          }  
          else  
            q=q->next;  
    }  
    delete q;  
    p->mat.Sname=name;  
    //包含文件操作  
    outFile<<"*****************************************************************"<>p->mat.count;  
    outFile<<"该生活区的建筑总数目为:"<mat.count<>p->mat.edge;  
    outFile<<"该生活区的道路数目为:"<mat.edge<mat.m,0,sizeof(p->mat.m));  
    for(i=1;i<=p->mat.edge;i++)  
    {  
            cout<<"\n*第 "<>n1;  
            outFile<<"************************第"<>p->mat.Pname[n1];  
            outFile<<"建筑编号为"<mat.Pname[n1]<>n2;  
            cout<<"\t-建筑 2 名称:";cin>>p->mat.Pname[n2];  
            outFile<<"建筑编号为"<mat.Pname[n2]<>p->mat.m[n1][n2];  
            outFile<mat.Pname[n1]<<"和"<mat.Pname[n2]<<"之间的直接道路长度是"<mat.m[n1][n2]<mat.m[n2][n1]=p->mat.m[n1][n2];  
  
    }  
    p->next=S[key].next;  
    S[key].next=p;  
    cout<<"\n*生活区创建成功!";  
    outFile.close();  //关闭文件  
     returnMainFace();  
}  
//输出建筑分布(邻接矩阵的形式输出) 
 
void print_graph()  
{  
    string name;  
    int key,tag=1;  
    Scenic *p;  
    cout<<"*生活区名称:"<>name;  
    getchar();  
    key=hash(name);  
    p=S[key].next;  
    if(p==NULL)  
     cout<<"\n*生活区建筑分布图为"<mat.Sname==name)//找到的地址不为空,只有名字相同时才,进行输出有关信息  
          {  
            cout<<"*************查询生活区名称为 "<mat.count;++i)  
            {  
                cout<<"建筑名称 "<mat.Pname[i];  
                for(int j=1;j<=p->mat.count;++j)  
                    cout<<' '<mat.m[i][j];  
                    cout<next;  
        }  
        if(tag)  
        cout<<"\n*生活区建筑分布图为"<mat.count)  
    {  
        cout<mat.Pname[c]<mat.Pname[c]<<" --> ";  
    visited[c]=1;  
     for(int i=1;i<=(p->mat.count);i++)  
    {  
        if(p->mat.m[c][i]>0&&!visited[i])  
        {  
              DFS(i,p);  
        if(p->mat.count>np)  
        {  
            cout<mat.Pname[c]<<"-->";  
        }  
        }  
    }  
     if(np==p->mat.count)  
        returnMainFace();  
}  
//建筑线路  
void guide_line()  
{  
     //checked();  
     Scenic *p;  
     int key,c,tag=1;  
     cout<<"\n*请输入对应生活区的名称:";  
     string name;  
     cin>>name;  
     getchar();  
     key=hash(name);  
    p=S[key].next;  
    if(p==NULL)  
      cout<<"\n*生活区建筑分布图(邻接矩阵表示)查询不存在!\n";  
    else  
    {  
        while(p)  
        {  
            if(p->mat.Sname==name)  
            {  
                memset(visited,0,sizeof(visited));  
                np=0;  
                cout<<"输入对应建筑的编号"<>c;  
                cout<<"*形成的出行线路图(采用深度优先策略)如下所示:\n\n\t";  
                DFS(c,p);  
                tag=0;  
                break;  
            }  
            else  
                p=p->next;  
        }  
        if(tag)  
        cout<<"\n*生活区建筑分布图为"<mat.count;j++)  
    {  
        if(p->mat.m[i][j]!=0&&vis[j]==0)  
            dfs(j,p);  
    }  
}  
//判断回路  
void check_circuit()  
{  
    int key,tag=1;  
    Scenic *p;  
    string name;  
    cout<<"*生活区名称:"<>name;  
    getchar();  
    key=hash(name);  
    p=S[key].next;  
    if(p==NULL)  
     cout<<"\n*生活区建筑分布图查询不成功!\n";  
    else  
    {  
        while(p)  
        {  
            if(p->mat.Sname==name)  
            {  
                memset(vis,0,sizeof(vis));//初始化vis数组,表示一开始所有顶点都未被访问过  
                DFS_Count=0;  
                for(int i=1;i<=p->mat.count;i++)//深度优先搜索  
                {  
                    if(vis[i]==0)//如果这个顶点为被访问过,则从i顶点出发进行深度优先遍历  
                    {  
                        DFS_Count++;//统计调用void dfs(int i);的次数  
                        dfs(i,p);  
                    }  
                }  
                if(p->mat.edge+DFS_Count>p->mat.count)//遍历结束,若联通的数量个数加上边的数量个数>节点的数量个数,就判定为有环  
                    cout<<"该生活区中存在环"<next;  
        }  
        if(tag)  
          cout<<"\n*生活区建筑分布图查询不成功!\n";  
    }  
    returnMainFace();  
}  
//Floyd算发求最短路  
void Floyd(int a,int b,struct Scenic *&p)  
{  
    int i,j,k;  
    int A[M][M],path[M][M];  
    for(i=1;i<=p->mat.count;i++)//对进行求最短路的矩阵进行处理  
    {  
        for(j=1;j<=p->mat.count;j++)  
        {  
        if(p->mat.m[i][j]==0&&i!=j)  
             A[i][j]=INF;  
        else if(i==j)  
            A[i][j]=0;  
        else  
            A[i][j]=p->mat.m[i][j];  
        if(i!=j&&p->mat.m[i][j]mat.count;k++)  
    {  
          for(i=1;i<=p->mat.count;i++)  
            {  
              for(j=1;j<=p->mat.count;j++)  
              {  
                  if(A[i][j]>A[i][k]+A[k][j])  
                  {  
                       A[i][j]=A[i][k]+A[k][j];  
                       path[i][j]=path[k][j];  
                  }  
              }  
            }  
    }  
    int apath[M],d;  
    if(A[a][b]mat.Pname[a]<<" 到 "<mat.Pname[b]<<" 的最短路径为:";  
        k=path[a][b];  
        d=0;  
        apath[d]=b;  
       while(k!=-1&&k!=a)//循环实现记录对应的节点编号  
       {  
           d++;  
           apath[d]=k;  
           k=path[a][k];  
       }  
         d++;  
         apath[d]=a;  
         cout<mat.Pname[apath[d]];  
         cout<=0;s--)//输出节点名称  
         {  
            cout<<" --> "<mat.Pname[apath[s]];  
             cout<<','<>name;  
    getchar();  
    key=hash(name);  
    p=S[key].next;  
    if(p==NULL)  
     cout<<"\n*生活区分布图查询不成功!\n";  
    else  
    {  
        while(p)  
        {  
            if(p->mat.Sname==name)  
            {  
                cout<<"*******下面为该生活区的一些信息:"<mat.Sname<mat.count;++i)  
                {  
                    cout<<"编号为 "<mat.Pname[i];  
                    for(int j=1;j<=p->mat.count;++j)  
                        cout<<' '<mat.m[i][j];  
                        cout<>a;  
                getchar();  
                cout<<"\t-建筑 2:";  
                cin>>b;  
                getchar();  
                Floyd(a,b,p);  
                tag=0;  
                break;  
            }  
            else  
                p=p->next;  
        }  
        if(tag)  
        cout<<"\n*生活区建筑分布图查询不成功!\n";  
    }  
        returnMainFace();  
}  
void prime(struct Scenic *&p,string name)  
{  
    int A[M][M],a,b,tag=1;  
    while(p)  
        {  
            if(p->mat.Sname==name)  
            {  
                for(int i=1;i<=p->mat.count;i++)  
                {  
                    for(int j=1;j<=p->mat.count;j++)  
                    {  
                        if(p->mat.m[i][j]==0&&i!=j)  
                        A[i][j]=INF;  
                        else if(i==j)  
                        A[i][j]=0;  
                        else  
                        A[i][j]=p->mat.m[i][j];  
                    }  
                }  
                cout<<"请输入您开始要建造的建筑编号";  
                cin>>a;  
                cout<<"请输入您要完成到的达建筑编号";  
                cin>>b;  
                cout<<"\n*道路修建规划图(prime算法)规划如下:\n";  
                int lowcost[M],closest[M],k=0,sum=0,num=0;  
                for(int i=1;i<=p->mat.count;++i)  
                {  
                    lowcost[i]=A[a][i];  
                    closest[i]=a;  
                }  
                for(int i=1;imat.count;++i)  
                {  
                    int min=INF;  
                    for(int j=1;j<=p->mat.count;++j)  
                    {  
                        if(lowcost[j]&&(lowcost[j]mat.Pname[closest[k]]<<"  到建筑  "<mat.Pname[k]<<"  ,该条道路长度为:"<mat.count;++j)  
                    {  
                        if(A[k][j]&&A[k][j]next;  
        }  
        if(tag)  
            cout<<"\n*景区建筑分布图查询不成功!\n";  
}  
void build_road()//道路修建规划图、最小生成树(prime算法)  
{  
    Scenic *p;  
     int key;  
     cout<<"\n*请输入对应生活区的名称:";  
  
     string name;  
     cin>>name;  
     getchar();  
    key=hash(name);  
    p=S[key].next;  
    if(p==NULL)  
      cout<<"\n*生活区建筑分布图查询不存在!\n";  
    else  
    {  
        prime(p,name);  
        returnMainFace();  
    }  
}  
void scenic_message()//文件输出所有信息  
{  
    system("cls");  
    char ch[200];  
   ifstream inFile; //输入流对象  
   inFile.open("生活区建筑信息表.txt",ios::in);  
   while(!inFile.eof())  
   {  
       inFile.getline(ch,sizeof(ch),'\n');  
       cout< v;  
    cout<<"请输入原先的建筑名称: ";  
    cin>>name;  
    cout<<"请输入要修改后的名称: ";  
    cin>>rname;  
    for(i=1;i<=p->mat.count;++i)  
    {  
        if(p->mat.Pname[i]==name)  
           {  
              p->mat.Pname[i]=rname;  
              break;  
           }  
    }  
    while(inFile)  
    {  
        getline(inFile, str);  
        v.push_back(str);  
    }  
    stringstream stream;  
    string result,s,a,r;// std::string result;  
    stream << i; //将int输入流  
    stream >> r; //从stream中抽取前面插入的int值  
    s="建筑编号为"+r;  
    s+="名称为";  
    a=s;  
    s+=name;  
    a+=rname;  
    ofstream outFile("生活区建筑信息表.txt",ios::out);  
    vector::const_iterator it=v.begin();  
    for(;v.end()!=it;++it)  
    {  
       if(*it==s)  
        {  
            //v.erase(v.begin()+j);  
            outFile< v;  
    cout<<"请输入的该道路上建筑1的名称: ";  
    cin>>name1;  
    cout<<"请输入的该道路上建筑2的名称: ";  
    cin>>name2;  
    cout<<"请输入的该道路上原先的权值: ";  
    cin>>weight;  
    cout<<"请输入该道路上要修改后的的权值: ";  
    cin>>weight1;  
    for( i=1;i<=p->mat.count;++i)//修改到程序里面  
    {  
        if(p->mat.Pname[i]==name1)  
            x=i;  
        if(p->mat.Pname[i]==name2)  
            y=i;  
    }  
    p->mat.m[x][y]=p->mat.m[y][x]=weight1;  
    while(inFile)//下面修改到文件里面  
    {  
        getline(inFile, str);  
        v.push_back(str);  
    }  
    //outFile<mat.Pname[n1]<<"和"<mat.Pname[n2]<<"之间的直接道路长度是"<mat.m[n1][n2]<> w; //从stream中抽取前面插入的int值  
    stream1 << weight1; //将int输入流  
    stream1 >> w1; //从stream中抽取前面插入的int值  
    s=name1;ss=name2;  
    s+="和";ss+="和";  
    s+=name2;ss+=name1;  
    s+="之间的直接道路长度是";ss+="之间的直接道路长度是";  
    a=s;b=ss;  
    s+=w;ss+=w;  
    a+=w1;b+=w1;  
    ofstream outFile("生活区建筑信息表.txt",ios::out);  
    vector::const_iterator it=v.begin();  
    for(;v.end()!=it;++it)  
    {  
       if(*it==s)  
            outFile< v;  
    cout<<"请输入小路两旁的1生活区";  
    cin>>name1;  
    cout<<"请输入小路两旁的2生活区";  
    cin>>name2;  
    cout<<"请输入该小路的权值";  
    cin>>weight;  
    for(i=1;i<=p->mat.count;++i)  
    {  
        if(p->mat.Pname[i]==name1)  
            x=i;  
        if(p->mat.Pname[i]==name2)  
            y=i;  
    }  
    p->mat.m[x][y]=p->mat.m[y][x]=weight;  
    while(inFile)//下面修改到文件里面  
    {  
        getline(inFile, str);  
        v.push_back(str);  
    }  
    ofstream outFile("生活区建筑信息表.txt",ios::out);  
     stringstream stream,stream1,stream2;  
    string s,s1,ss,num,num1,w,m;  
    vector::const_iterator it=v.begin();  
    stream<mat.edge;  
    stream>>num;  
    p->mat.edge+=1;  
    stream1<mat.edge;  
    stream1>>num1;  
    s="该生活区的道路数目为:";s1="该生活区的道路数目为:";  
    s+=num;s1+=num1;  
    for(;v.end()!=it;++it)  
    {  
       if(*it==s)  
            outFile<>num;  
    stream1<>num1;  
    s="建筑编号为"+num+"名称为"+name1;  
    outFile<>w;  
    s=name1+"和"+name2+"之间的直接道路长度是"+w;  
    outFile<>name;  
    getchar();  
    key=hash(name);  
    p=S[key].next;  
    if(p==NULL)  
     cout<<"\n*您要修改的"<mat.Sname==name)  
          {  
              cout<<"*******下面为该生活区的一些信息:"<mat.Sname<mat.count;++i)  
              {  
                cout<<"编号为 "<mat.Pname[i];  
                for(int j=1;j<=p->mat.count;++j)  
                cout<<' '<mat.m[i][j];  
                cout<>n;  
              switch(n)  
              {  
              case 1:  
                  change_sceic_name(p);  
                  break;  
              case 2:  
                  change_weight(p);  
                  break;  
              case 3:  
                  increase_number(p);  
                  break;  
              case 0:  
                  returnMainFace();  
                  break;  
              }  
            tag=0;  
            break;  
          }  
          else  
            p=p->next;  
        }  
        if(tag)  
            cout<<"*您要修改的"<='0'&&c<='8'))  
    {  
        cout<<"*输入有误,请重新输入:";  
        c=getch();  
        cout<

 

你可能感兴趣的:((^-^),--------杂项,--------(^-^))