理工大课程设计


 

  目录

一.文本文件单词统计... 3

1.【问题描述】... 3

2.【问题分析与设计】... 3

2.1.问题分析... 3

2.2.概要设计... 3

3.【功能实现】... 4

4.【实例测试及运行结果】... 8

5.【心得体会】... 16

二.停车场管理... 17

1.【问题描述】... 17

2.【问题分析与设计】... 17

2.1问题分析... 17

2.2概要设计... 17

3.【功能实现】... 18

4.【实例测试及运行结果】... 23

5.【心得体会】... 25

三.交通咨询系统设计... 26

1.【问题描述】... 26

2.【问题分析与设计】... 26

2.1问题分析... 26

2.2概要设计... 26

3.【功能实现】... 28

3.1建立有向图的存储结构... 28

3.2迪杰斯特拉算法... 28

3.3费洛伊德算法... 30

3.4运行主控程序... 32

3.5完整代码... 33

4.【实例测试及运行结果】... 39

4.1 运行实例一... 39

4.2 运行实例二... 40

5.【心得体会】... 42

四.校园导游咨询... 43

1.【问题描述】... 43

2.【问题分析与设计】... 43

2.1问题分析... 43

2.2概要设计... 43

3.【功能实现】... 44

4.【实例测试及运行结果】... 50

5.【心得体会】... 53

 

一.文本文件单词统计

 

1.【问题描述】

 

假设有如下的英文文本文档:(此处为太原理工大学学校简介英文版)

TAIYUAN UNIVERSITY OF TECHNOLOGY

 

Taiyuan University of Technology (TUT) hasits history traced all the way back to the Western Learning School of ShanxiGrand Academy (1902), which was one of the three earliest national universitiesin China.With the tradition and development of over 100 years, TUT is now a generaluniversity with engineering as the major, sciences and technology integratedand coordinate development of multiple disciplines.  It is a university that is included in the “Project211” --- the nationalhigher education promotion program for 100 top universities in China.

……

Recollecting thecentennial history, generations of TUT have created its mission and glory of acentury with responsibility and confidence; expecting the promising tomorrow,over 30,000 TUT students and faculty are producing splendor and perspectives bytheir wisdom and diligence.  In the newera, Taiyuan University of Technology, following the Conception of ScientificDevelopment, is determined to further the reformation on education, toreinforce the teaching management so as to upgrade its teaching and researchinglevels. Taiyuan University of Technology will be turning itself into aresearch-based university.

设计C或C++程序,统计在这样的英文文本文件中,出现了多少个单词,每个单词出现了几次。连续的英文字符都认为单词(不包括数字),单词之间用空格或标点符号分隔。

   在大数据的时代,信息里蕴含着丰富的价值,需要我们提取出来,以友好界面的方式呈现出来。

2.【问题分析与设计】

2.1.问题分析

要统计英文文本文件中出现了哪些单词,就要从文件中读取字符,读取出来的连续英文字符认为是一个单词,遇空格或标点符号单词结束。数字不是单词,标点符号不能混入单词中。单词还有连接符号。最后将结果输出到文件中,按照字典序统计每个单词出现的次数。

 

2.2.概要设计

#defineLIST_INIT_SIZE 100    //线性表存储空间的初始分配量

#defineLISTINCREMENT 10      //线性表存储空间的分配增量

 

typedefstruct{

    char word[51];            //存储单词,不超过50个字符

    int count;                //单词出现的次数

}ElemType;

 

typedefstruct {

    ElemType *elem;//存储空间基址

    int length;//当前长度

    int listsize;//当前分配的存储容量

}Sqlist;

 

在线性表中查找单词出现的位置时,用二分查找

 

//查找指定的单词

intLocateElem(Sqlist &p, char *word)

{

    int low, high, mid;

    low = 0; high = p.length - 1;

    while (low <= high)

    {

        mid = (low + high) / 2;

        if (strcmp(word, p.elem[mid].word) == 0)//表中进行二分查找

        {

            p.elem[mid].count++;

            return 0;

        }

            else if (strcmp(word,p.elem[mid].word) < 0)

            high = mid - 1;

            else

                low = mid + 1;

    }

        return low + 1; //返回插入点序号

}

3.【功能实现】

运行环境 DevC++

C++源代码如下:

#include<iostream>

using namespace std;

#include<string>

#include<cstring>

#include<cstdlib>

#include<fstream>

#include<iomanip>

#define LIST_INIT_SIZE 100   //线性表存储空间的初始分配量

#define LISTINCREMENT 10     //线性表存储空间的分配增量

 

typedef struct{

       char word[51];            //存储单词,不超过50个字符

       int count;                //单词出现的次数

} ElemType;

 

typedef struct {

       ElemType *elem;//存储空间基址

       int length;//当前长度

       int listsize;//当前分配的存储容量

}Sqlist;

 

//初始化

bool InitList(Sqlist&L)

{

       L.elem = ((ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType)));

       if (!L.elem)

              return false;

       L.length = 0;

       L.listsize =LIST_INIT_SIZE;

       return true;

}

 

//查找指定的单词

int LocateElem(Sqlist &p, char *word)

{

       int low, high, mid;

       low = 0; high =p.length - 1;

       while (low <= high)

       {

              mid = (low +high) / 2;

              if (strcmp(word,p.elem[mid].word) == 0) //表中进行二分查找

              {

                     p.elem[mid].count++;

                     return 0;

              }

                     else if(strcmp(word, p.elem[mid].word) < 0)

                     high =mid - 1;

                     else

                            low= mid + 1;

       }

              return low + 1;//返回插入点序号

}

//插入新的单词

bool InsertList(Sqlist &p, int i, char *word)

{

      

              int j;

       ElemType *base;

       if (p.length >=p.listsize)

       {

             

                     base =(ElemType*)realloc(p.elem, (p.listsize + LISTINCREMENT)*sizeof(ElemType));

              if (base ==NULL) return 0;

              p.listsize =p.listsize + LISTINCREMENT; //扩充表长

              p.elem = base;

       }

              for(j = p.length;j >= i; j--)

              p.elem[j] =p.elem[j - 1];

              strcpy(p.elem[i- 1].word, word);

       p.elem[i - 1].count =1;

       p.length++;

       return 1;

}

 

void PrintList(Sqlist &p){

 

       ofstream fout;

       fout.open("C:/Users/周大哥/Desktop/课程设计/Result.txt");

       int total = 0;

       for (int i = 0; i <p.length; ++i){

              total +=p.elem[i].count;

             

              printf("单词:%-50s                           数量:%i\n", p.elem[i].word, p.elem[i].count);

              fout <<"单词:" << setw(50) <<p.elem[i].word << "数量:" << p.elem[i].count << endl;

       }

       cout << "单词总数为:" << total << endl;

       fout << "单词总数为:" << total << endl;

 

       cout << "写入成功" << endl;

       fout.close();

}

 

 

int  main(){

       string data;

       ifstreamfin("C:/Users/周大哥/Desktop/课程设计/ceshi.txt");

       Sqlist L;

       InitList(L);

       char word[51];

       int cur;

       bool flag = true;

       while (getline(fin,data)){//逐行读取

              if(data.length() == 0)

                     continue;

              if(flag) cur =0;

              else flag =true;

 

      

              for (int i = 0;i < (int)data.length(); ++i){

             

                     if(isalpha(data[i]) || data[i] == '\''){//判断是否为英文字母

                            word[cur]= data[i], cur++;

 

                     }

                     else if(data[i] == '-' && isalpha(data[i - 1]) && i < data.length()- 1 && isalpha(data[i + 1])){

                            word[cur]= data[i], cur++;

                            continue;

                     }

                     else if(data[i] == '-'&&i == data.length() - 1 && isalpha(data[i -1]))

                     {

                            flag= false;

                            continue;

                     }

                     else if(ispunct(data[i]) || data[i] == ' ' || data[i] == '('||data[i]==')')//检测遇到了标点符号

                     {

                            word[cur]= '\0';

                            if(cur>0){

                            inttemp=LocateElem(L, word);//查找位置  找到了返回0

                            if(temp > 0)InsertList(L, temp, word);//表中没有则插入

                            }

                            cur= 0;

                            memset(word,0, sizeof(word) / sizeof(char));//清空

                     }

             

              }

              if(cur>0&&flag){

                     int temp= LocateElem(L, word);//查找位置  找到了返回0

                     if (temp> 0) InsertList(L, temp, word);//表中没有则插入

                     cur = 0;

              }

             

 

 

       }

 

       PrintList(L);

 

       fin.close();

}

4.【实例测试及运行结果】

测试样例(1):

C:/Users/周大哥/Desktop/课程设计/ceshi.txt

文件内容如下:

 My father was aself-taught mandolin player. He was one of the best string instrument playersin our town. He could not read music, but if he heard a tune a few times, hecould play it. When he was younger, he was a member of a small country musicband. They would play at local dances and on a few occasions would play for thelocal radio station. He often told us how he had auditioned and earned aposition in a band that featured Patsy Cline as their lead singer. He told thefamily that after he was hired he never went back. Dad was a very religiousman. He stated that there was a lot of drinking and cursing the day of hisaudition and he did not want to be around that type of environment.

  Occasionally, Dadwould get out his mandolin and play for the family. We three children: Trisha,Monte and I, George Jr., would often sing along. Songs such as the TennesseeWaltz, Harbor Lights and around Christmas time, the well-known rendition ofSilver Bells. "Silver Bells, Silver Bells, its Christmas time in the city"would ring throughout the house. One of Dad's favorite hymns was "The OldRugged Cross". We learned the words to the hymn when we were very young,and would sing it with Dad when he would play and sing. Another song that wasoften shared in our house was a song that accompanied the Walt Disney series:Davey Crockett. Dad only had to hear the song twice before he learned it wellenough to play it. "Davey, Davey Crockett, King of the Wild Frontier"was a favorite song for the family. He knew we enjoyed the song and the programand would often get out the mandolin after the program was over. I could neverget over how he could play the songs so well after only hearing them a fewtimes. I loved to sing, but I never learned how to play the mandolin. This is somethingI regret to this day.

 

程序输出如下:(该目录下的Result文件)

单词:                                          Another数量:1

单词:                                            Bells数量:3

单词:                                        Christmas数量:2

单词:                                             Cline数量:1

单词:                                         Crockett数量:2

单词:                                            Cross数量:1

单词:                                              Dad数量:4

单词:                                            Dad's数量:1

单词:                                            Davey数量:3

单词:                                           Disney数量:1

单词:                                         Frontier数量:1

单词:                                            George数量:1

单词:                                           Harbor数量:1

单词:                                               He数量:6

单词:                                                I数量:5

单词:                                               Jr数量:1

单词:                                             King数量:1

单词:                                           Lights数量:1

单词:                                            Monte数量:1

单词:                                               My数量:1

单词:                                      Occasionally数量:1

单词:                                              Old数量:1

单词:                                              One数量:1

单词:                                            Patsy数量:1

单词:                                           Rugged数量:1

单词:                                           Silver数量:3

单词:                                            Songs数量:1

单词:                                        Tennessee数量:1

单词:                                              The数量:1

单词:                                              They数量:1

单词:                                             This数量:1

单词:                                           Trisha数量:1

单词:                                             Walt数量:1

单词:                                             Waltz数量:1

单词:                                               We数量:2

单词:                                             When数量:1

单词:                                             Wild数量:1

单词:                                                a数量:13

单词:                                      accompanied数量:1

单词:                                            after数量:3

单词:                                            along数量:1

单词:                                               and数量:11

单词:                                           around数量:2

单词:                                               as数量:2

单词:                                               at数量:1

单词:                                          audition数量:1

单词:                                       auditioned数量:1

单词:                                             back数量:1

单词:                                             band数量:2

单词:                                               be数量:1

单词:                                            before数量:1

单词:                                             best数量:1

单词:                                              but数量:2

单词:                                         children数量:1

单词:                                             city数量:1

单词:                                            could数量:4

单词:                                          country数量:1

单词:                                          cursing数量:1

单词:                                           dances数量:1

单词:                                               day数量:2

单词:                                              did数量:1

单词:                                         drinking数量:1

单词:                                           earned数量:1

单词:                                           enjoyed数量:1

单词:                                           enough数量:1

单词:                                      environment数量:1

单词:                                           family数量:3

单词:                                           father数量:1

单词:                                         favorite数量:2

单词:                                         featured数量:1

单词:                                              few数量:3

单词:                                               for数量:3

单词:                                              get数量:3

单词:                                              had数量:2

单词:                                               he数量:11

单词:                                              hear数量:1

单词:                                            heard数量:1

单词:                                          hearing数量:1

单词:                                            hired数量:1

单词:                                              his数量:2

单词:                                             house数量:2

单词:                                              how数量:3

单词:                                             hymn数量:1

单词:                                            hymns数量:1

单词:                                               if数量:1

单词:                                               in数量:4

单词:                                       instrument数量:1

单词:                                               is数量:1

单词:                                                it数量:4

单词:                                              its数量:1

单词:                                             knew数量:1

单词:                                             lead数量:1

单词:                                          learned数量:3

单词:                                            local数量:2

单词:                                              lot数量:1

单词:                                            loved数量:1

单词:                                              man数量:1

单词:                                         mandolin数量:4

单词:                                           member数量:1

单词:                                            music数量:2

单词:                                            never数量:3

单词:                                               not数量:2

单词:                                        occasions数量:1

单词:                                               of数量:8

单词:                                            often数量:4

单词:                                               on数量:1

单词:                                              one数量:1

单词:                                             only数量:2

单词:                                              our数量:2

单词:                                              out数量:2

单词:                                              over数量:2

单词:                                             play数量:8

单词:                                           player数量:1

单词:                                          players数量:1

单词:                                         position数量:1

单词:                                          program数量:2

单词:                                            radio数量:1

单词:                                             read数量:1

单词:                                           regret数量:1

单词:                                         religious数量:1

单词:                                        rendition数量:1

单词:                                             ring数量:1

单词:                                      self-taught数量:1

单词:                                           series数量:1

单词:                                           shared数量:1

单词:                                             sing数量:4

单词:                                           singer数量:1

单词:                                             small数量:1

单词:                                               so数量:1

单词:                                        something数量:1

单词:                                             song数量:5

单词:                                            songs数量:1

单词:                                           stated数量:1

单词:                                          station数量:1

单词:                                           string数量:1

单词:                                             such数量:1

单词:                                             that数量:6

单词:                                              the数量:21

单词:                                            their数量:1

单词:                                             them数量:1

单词:                                             there数量:1

单词:                                             this数量:1

单词:                                            three数量:1

单词:                                       throughout数量:1

单词:                                              time数量:2

单词:                                            times数量:2

单词:                                               to数量:7

单词:                                             told数量:2

单词:                                             town数量:1

单词:                                              tune数量:1

单词:                                            twice数量:1

单词:                                             type数量:1

单词:                                               us数量:1

单词:                                             very数量:2

单词:                                             want数量:1

单词:                                              was数量:12

单词:                                               we数量:2

单词:                                              well数量:2

单词:                                       well-known数量:1

单词:                                             went数量:1

单词:                                             were数量:1

单词:                                              when数量:2

单词:                                             with数量:1

单词:                                            words数量:1

单词:                                            would数量:8

单词:                                            young数量:1

单词:                                           younger数量:1

单词总数为:345

 

 

测试样例(2):TYUT的简介

结果:

单词:                                          Academy数量:1

单词:                                            China数量:2

单词:                                       Conception数量:1

单词:                                      Development数量:1

单词:                                            Grand数量:1

单词:                                               In数量:1

单词:                                               It数量:1

单词:                                         Learning数量:1

单词:                                               OF数量:1

单词:                                          Project数量:1

单词:                                     Recollecting数量:1

单词:                                            School数量:1

单词:                                       Scientific数量:1

单词:                                           Shanxi数量:1

单词:                                          TAIYUAN数量:1

单词:                                       TECHNOLOGY数量:1

单词:                                              TUT数量:4

单词:                                          Taiyuan数量:3

单词:                                       Technology数量:3

单词:                                       UNIVERSITY数量:1

单词:                                        University数量:3

单词:                                          Western数量:1

单词:                                             With数量:1

单词:                                                a数量:4

单词:                                              all数量:1

单词:                                              and数量:9

单词:                                              are数量:1

单词:                                               as数量:2

单词:                                             back数量:1

单词:                                                be数量:1

单词:                                               by数量:1

单词:                                       centennial数量:1

单词:                                          century数量:1

单词:                                        confidence数量:1

单词:                                       coordinate数量:1

单词:                                          created数量:1

单词:                                       determined数量:1

单词:                                      development数量:2

单词:                                        diligence数量:1

单词:                                      disciplines数量:1

单词:                                         earliest数量:1

单词:                                        education数量:2

单词:                                       engineering数量:1

单词:                                              era数量:1

单词:                                        expecting数量:1

单词:                                          faculty数量:1

单词:                                        following数量:1

单词:                                              for数量:1

单词:                                          further数量:1

单词:                                          general数量:1

单词:                                      generations数量:1

单词:                                            glory数量:1

单词:                                              has数量:1

单词:                                             have数量:1

单词:                                           higher数量:1

单词:                                           history数量:2

单词:                                               in数量:3

单词:                                         included数量:1

单词:                                       integrated数量:1

单词:                                             into数量:1

单词:                                               is数量:4

单词:                                              its数量:3

单词:                                           itself数量:1

单词:                                           levels数量:1

单词:                                             major数量:1

单词:                                       management数量:1

单词:                                          mission数量:1

单词:                                         multiple数量:1

单词:                                         national数量:2

单词:                                              new数量:1

单词:                                              now数量:1

单词:                                               of数量:10

单词:                                                on数量:1

单词:                                              one数量:1

单词:                                             over数量:2

单词:                                     perspectives数量:1

单词:                                        producing数量:1

单词:                                          program数量:1

单词:                                        promising数量:1

单词:                                        promotion数量:1

单词:                                      reformation数量:1

单词:                                         reinforce数量:1

单词:                                   research-based数量:1

单词:                                      researching数量:1

单词:                                   responsibility数量:1

单词:                                          sciences数量:1

单词:                                               so数量:1

单词:                                         splendor数量:1

单词:                                         students数量:1

单词:                                         teaching数量:2

单词:                                        technology数量:1

单词:                                             that数量:1

单词:                                              the数量:13

单词:                                            their数量:1

单词:                                            three数量:1

单词:                                               to数量:4

单词:                                         tomorrow数量:1

单词:                                              top数量:1

单词:                                            traced数量:1

单词:                                        tradition数量:1

单词:                                          turning数量:1

单词:                                     universities数量:2

单词:                                       university数量:3

单词:                                          upgrade数量:1

单词:                                              was数量:1

单词:                                              way数量:1

单词:                                            which数量:1

单词:                                              will数量:1

单词:                                           wisdom数量:1

单词:                                             with数量:2

单词:                                            years数量:1

单词总数为:174

 

 

5.【心得体会】

  编程非一日之功,需要每天坚持练习,这样才会成效显著。在编写文本单词统计的时候要仔细,特别要主要到需求的细节。例如:数字不能计算在内、标点符号也不能。在编写小型系统时候要注意人们日常的生活习惯,例如单词之间的连接符号,还有末尾的单词连接符在计算单词个数的时候要特殊处理。

   生活就是这样,汗水预示着结果也见证着收获。劳动是人类生存生活永恒不变的话题。通过实习,我才真正领略到“艰苦奋斗”这一词的真正含义,我才意识到老一辈程序猿为我们的社会的辛勤付出。

       

 

 

 

 

 

 

 

 

 

 

 

二.停车场管理

1.【问题描述】

编写模拟程序,模拟停车场的运营。设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在停车场的最北端),若停车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。

输入车牌号,到达或离去的标志,到达或离去的时间,输出司机该缴纳的费用。

 

 

2.【问题分析与设计】

2.1问题分析

以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。

 

2.2概要设计

栈结构

   struct Stack

{

    stringspace[1024];

    inttop;

};

//队列

 

struct QNode    //定义队列结点的数据结构 

{

    QNode*next; //指针域,指向下一个结点 

    stringdata;    //数据域,存储队列信息 

};

 

struct LinkQueue    //定义队列的数据结构 

{

    QNode*front;      //队首指针,指向QNode类型的指针 

    QNode*rear;       //队尾指针 

};

 

采用自顶向下,逐步细化的方式模拟。

 

3.【功能实现】

 

C++语言描述:

#include<iostream>

using namespace std;

#include<cstring>

#include<map>

#include<string>

//栈结构具体实现

struct Stack

{

       stringspace[1024];

       inttop;

};

 

void init(Stack *s)

{

       s->top= 0;

      

}

 

bool Isfull(Stack *s)

{

       returns->top == 1024;

}

 

string pop(Stack *s)

{

       returns->space[--s->top];

}

 

void push(Stack *s, string c)

{

       s->space[s->top++]= c;

}

 

bool stack_empty(Stack *s)

{

       if(s->top == 0)

              return1;

       return0;

}

 

//***************************

//队列

 

struct QNode   //定义队列结点的数据结构 

{

       QNode*next; //指针域,指向下一个结点 

       stringdata;    //数据域,存储队列信息 

};

 

struct LinkQueue   //定义队列的数据结构 

{

       QNode*front;      //队首指针,指向QNode类型的指针 

       QNode*rear;       //队尾指针 

};

 

void InitQueue(LinkQueue &Q)     //构造一个空的队列 

{

       QNode*q;

       q = newQNode;    //申请一个结点的空间 

       q->next= NULL;   //当作头结点 

       //队首与队尾指针都指向这个结点,指针域为NULL 

       Q.front= q;

       Q.rear= q;

}

 

int IsEmpty(LinkQueue &Q)    //判断队列是否为空 

{

       if(Q.rear == Q.front)

              return0;

       else

              return1;

}

 

void EnQueue(LinkQueue &Q, string e)     //从队列尾部插入元素 

{

 

       QNode*p;    //新创建一个结点 

       p = newQNode;

       p->next= NULL;

       p->data= e;  //输入数据信息 

       //将新结点插入队列尾部 

       Q.rear->next= p;

       Q.rear= p;       //设置新的尾结点 

}

 

void DeQueue(LinkQueue &Q, string &e)   //从队列首部删除一个结点 

{

       QNode*p;

       p =Q.front->next;

       e =p->data;    //保存要出队列的数据 

       Q.front->next= p->next;       //将下一个结点当作头结点后面链接的第一个结点 

       if(Q.rear == p)    //如果要删除的元素即为尾结点,则将头指针赋予尾指针,一同指向头结点,表示队列为空 

              Q.rear= Q.front;

       deletep;

}

 

void DestoryQueue(LinkQueue &Q)       //销毁一个队列 

{

       while(Q.front)

       {

              Q.rear= Q.front;    //从头节点开始,一个一个删除队列结点,释放空间 

              deleteQ.front;

              Q.front= Q.rear;

       }

}

map<string, string>car;

Stack stop;

int n;

double fee;

LinkQueue path;

int biandao = 1;

 

//核心部分

void arrive(){

       //登记

       cout<< "亲 请输入车牌号和到达时间 例如:A12:20\n";

      

       stringid, time;

       cin>> id >> time;

       car[id]= time;

       if(stop.top >= n){

              cout<< "车位已满,您在便道上的位置为:"<< biandao << "\n"; biandao++;

 

              EnQueue(path,id);//在过道等候

       }

       else {

              push(&stop,id);

              cout << "登记成功!\n";

              cout<< "您在停车场的位置为:"<< stop.top << "号位!\n";

       }

 

}

 

void showPart(){

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

              cout<< "位置:"<< i + 1;

              if(stop.space[i]!="")

              cout<<"车牌号:"<< stop.space[i] << "\t\n";

              elsecout << "空\n";

 

       }

 

}

double getTime(string fir,string end){

       doubleone = ((fir[0] - '0') * 10 + (fir[1] - '0')) * 60 + (fir[3] - '0') * 10 +(fir[4] - '0');

       doubletwo = ((end[0] - '0') * 10 + (end[1] - '0')) * 60 + (end[3] - '0') * 10 +(end[4] - '0');

 

       return(two - one) / 60;

}

void getOut(){

       cout<< "亲 请输入车牌号和离开时间 例如:B01:02\n";

 

       stringid, time;

       cin>> id >> time;

       Stacktemp;

       init(&temp);

       stringcha;

 

       while(!stack_empty(&stop)){

              cha= pop(&stop);

              if(cha == id){

              doublex=       getTime(car[cha],time);

              printf("停留时间:%.2f小时!\n",x);

             

              printf("请缴费:%.2f元!     祝您一路顺风!\n",x*fee);

                     break;

              }

              push(&temp,cha);

       }

 

       while(!stack_empty(&temp)){

              cha= pop(&temp);

              push(&stop,cha);

       }

 

       //便道上进入

       if(biandao > 1){

              biandao--;

              strings;

              DeQueue(path,s);

              car[s]= time;

              push(&stop,s);

              cout<<s<< "您在停车场的位置为:"<< stop.top  << "号位!\n";

       }

 

}

 

int main(){

       init(&stop);

       InitQueue(path);

       cout<< "*****停车场管理系统欢迎您*****\n\n"<< endl;

       cout<< "请输入容纳车辆数(整数)和每小时的停车费用 例如:243.5\n";

       cin>> n >> fee;

      

       cout<< "亲,请输入对应字母选择功能!\n\nA.车辆进站登记\nD.车辆出站\nS.显示停车场信息\nE.推出系统\n";

       charflag;

       while(1){

              cout<< "亲,请输入对应字母选择功能!\n";

       cin>> flag;

      

              if(flag == 'A'){

                     arrive();

              }

              elseif (flag == 'D'){

                     getOut();

              }

              elseif (flag == 'S'){

                     showPart();

              }

              elseif (flag == 'E'){

                     cout<< "欢迎下次光临\n";

                     exit(0);

              }

              elsecout << "输入字母不在选项内\n";

 

              cout<< "************\n\n\n";

       }

}

4.【实例测试及运行结果】

   输入容纳车辆数和每小时的停车费用     2 3

功能选项  车牌号 时间

A 豫B1 11:03

A 晋B2 12:05

D 豫B1 13:15

A 京B3 14:30

A 青B414:41   

A 晋B5 15:00

D 晋B2 16:00

D 青B4 21:38

输出:

 

5.【心得体会】

 通过这次实习,培养了我解决现实生活中问题的能力,这为以后的工作生涯打下了坚实的基础,同时巩固了课堂上所学的理论知识,让理论真正联系实际。遇到小问题,可以和同学交流讨论,还可以查博客,学到了许多课外知识。

 从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。

 

 

 

 

 

 

 

 

 

三.交通咨询系统设计

1.【问题描述】

在交通网络非常发达,交通工具和交通方式不断更新的今天,人们在出差、旅游或做其他出行时,不仅关心节省交通费用,而且对里程和所需要的时间等问题也感兴趣。对于这样一个人们关心的问题,可用一个图结构来表示交通网络系统,利用计算机建立一个交通咨询系统。图中的顶点表示城市,边表示城市之间的交通关系。这个交通系统可以回答出行旅客提出的各种路径选择问题。例如,问题之一:“一位旅客要从A城到B城,他希望选择一条途中中转次数最少的路线。”假设图中每一站都需要换车,那么这个问题反映到图上就是要找一条从顶点A到顶点B的所含边数目最少的路径。我们只需要从顶点A出发对图作广度优先搜索,一旦遇到顶点B就终止。由此所得广度优先生成树上,从根顶点A到顶点B的路径就是中转次数最少的路径。路径上A与B之间的顶点就是路径的中转站,但这只是一类最简单的图的最短路径问题。系统还可以回答诸如此类的等等的路径选择问题。

设计一个交通咨询系统,为出差、旅游或做其他出行的客人提供各种路径选择信息查询服务。找出一条代价最小的路径,并将它打印出来。

2.【问题分析与设计】

2.1问题分析

设计一个交通咨询系统,能让旅客咨询从任一个城市顶点到另一城市顶点之间的最短路径(里程)或最低花费或最少时间等问题。对于不同的咨询要求,可输入城市间的路程或所需时间或所需费用。

本设计共分三部分,一是建立交通网络图的存储结构;二是解决单源最短路径问题;三是实现任两个城市顶点之间的最短路径问题。

 

2.2概要设计

a建立图的存储结构

邻接矩阵是表示图形中顶点之间相邻关系的矩阵。图的邻接矩阵是定义如下的n阶方阵:

设G=(V,E)是一个图,结点集为 。

G的邻接矩阵

 

当邻接矩阵的行表头、列表头顺序一定时,一个图的邻接矩阵表示是唯一的。

图的邻接矩阵表示,除了需用一个二维数组存储顶点之间的相邻关系的邻接矩阵外,通常还需要使用一个具有n个元素的一维数组来存储顶点信息,其中下标为i的元素存储顶点i的信息。因此,图的邻接矩阵的存储结构定义如下:

#definf MVNum 50  //最大顶点数

typedef struct

      {                                                                             

  VertexType vexs[MVNum];         //顶点数组,类型假定为char型

  Adjmatrix arcs[MVNum][MVNum];   //邻接矩阵,假定为int型

}MGraph;

 

b.单源最短路径

 最短路径的提法很多。在这里先讨论单源最短路径问题:即已知有向图(带权),我们希望找出从某个源点S V到G中其余各顶点的最短路径。

为了叙述方便,我们把路径上的开始点称为源点,路径的最后一个顶点为终点。

那么,如何求得给定有向图的单源最短路径呢?迪杰斯特拉(Dijkstra)提出按路径长度递增产生诸点的最短路径算法,称之为迪杰斯特拉算法。

迪杰斯特拉算法求最短路径的实现思想是:设G=(V,E)是一个有向图,结点集为, ,cost是表示G的邻接矩阵,cost[i][j]表示有向边<i,j>的权。若不存在有向边<i,j>,则cost[i][j]的权为无穷大(这里取值为32767)。设S是一个集合,其中的每个元素表示一个顶点,从源点到这些顶点的最短距离已经求出。设顶点v1为源点,集合S的初态只包含一个元素,即顶点v1。数组dist记录从源点到其他顶点当前的最短距离,其初值为dist[i]=cost[v1][i],i=1,2,……,n。从S之外的顶点集合V-S中选出一个顶点w,使dist[w]的值最小。于是从源点到达w只通过S中顶点,把w加入集合S中,调整dist中记录的从源点到V-S中每个顶点v的距离:从原来的dist[v]和dist[w]+cost[w][v]中选择较小的值作为新的dist[v]。重复上述过程,直到V-S为空。

最终结果是:S记录了从源点到该顶点存在最短路径的顶点集合,数组dist记录了源点到V中其余各顶点之间的最短路径,path是最短路径的路径数组,其中path[i]表示从源点到顶点i之间的最短路径的前驱顶点。

因此,迪杰斯特拉算法可用自然语言描述如下:

初始化S和D,置空最短路径终点集,置初始的最短路径值;

S[v1]=TRUE;  D[v1]=0;    //S集初始时只有源点,源点到源点的距离为0;

While (S集中顶点数<n)

{

开始循环,每次求得v1到某个v顶点的最短路径,并加v到S集中;

S[v]=TRUE;

更新当前最短路径及距离;

}

 

C.任意一对顶点间最短路径

任意一对顶点间最短路径问题,是对于给定的有向网络图G=(V,E),要对G中任意一对顶点有序对“v,w(v w)”,找出v到w的最短路径。

要解决这个问题,我们可以依次把有向网络图中每个顶点作为源点,重复执行前面讨论的迪杰斯特拉算法n次,即可以求得每对顶点之间的最短路径。

这里还可以用另外一种方法,称作费洛伊德(Floyd)算法。

费洛伊德(Floyd)算法算法的基本思想是:假设求从顶点 vi到vj的最短路径。如果从vi到vj存在一条长度为arcs[i][j]的路径,该路径不一定是最短路径,还需要进行n次试探。首先考虑路径<vi,v1>和<v1,vj>是否存在。如果存在,则比较<vi,vj>和< vi,v1,vj>的路径长度,取长度较短者为当前所求得的最短路径。该路径是中间顶点序号不大于1的最短路径。其次,考虑从vi到vj是否包含有顶点v2为中间顶点的路径<vi,…,v2,…,vj>,若没有,则说明从vi到vj的当前最短路径就是前一步求出的;若有,那么<vi,…,v2,…,vj>可分解为<vi,…v2>和<v2,…,vj>,而这两条路径是前一次找到的中间顶点序号不大于1的最短路径,将这两条路径长度相加就得到路径<vi,…,v2,…,vj>的长度。将该长度与前一次中求出的从vi到vj的中间顶点序号不大于1的最短路径比较,取其长度较短者作为当前求得的从vi到vj的中间顶点序号不大于2的最短路径。依此类推,直到顶点vn加入当前从vi到vj的最短路径后,选出从vi到vj的中间顶点序号不大于n的最短路径为止。由于图G中顶点序号不大于n,所以vi到vj的中间顶点序号不大于n的最短路径,已考虑了所有顶点作为中间顶点的可能性,因此,它就是vi到vj的最短路径。

 

3.【功能实现】

C++(运行环境 devc++)

3.1建立有向图的存储结构

typedef string VertexType;

typedef double   Adjmatrix;

typedef struct

{

     VertexTypevexs[MVNum];//顶点信息

     Adjmatrix  arcs[MVNum][MVNum];//边的代价

}MGraph;

3.2迪杰斯特拉算法

 

void djs(MGraph *G,int yuan,int end){

    

     double dis[MVNum];

     int flag[MVNum];

       int path[MVNum];

    

     doubleedg[MVNum][MVNum];

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

     {

          for (int j =1; j <= n; j++)

          {

               edg[i][j]= G->arcs[i][j];

         

          }

     }

 

 

    

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

     {

          dis[i] =edg[yuan][i];

          flag[i]=0;

          if(dis[i]==MAX)

           path[i]=-1;

           else path[i]=yuan;

     }

 

     flag[yuan] = 1;

     double min; int u;

     for (int i = 1; i<= n-1; i++)//源点到源点不用比较,因次总的次数少一次 

     {

          min = MAX;

          for (int j =1; j<n; j++)

          {

               if(flag[j] == 0 && dis[j]<min)//核心思想:依次比较出离源点最近的点 

               {

                    min= dis[j];

                    u =j;

               }

          }

          flag[u] = 1;

          for (int v =1; v <= n; v++)  //找出离源点最近的点后开始更新dis里面的源点到各个点的值是否最小 

          {

               if(edg[u][v]<MAX)

               {

                    if(dis[v]>dis[u] + edg[u][v])//dis[1][v] 主要是找出离源点最近点的出边来比较 

                    {

                         dis[v]= dis[u] + edg[u][v];

                         path[v]=u;

                    }

               }

          }

     }

   if(dis[end]<MAX){

   cout<<"最短长度为:"<<dis[end]<<"\n"; 

   cout<<"最短路径如下:\n";

     int tt=path[end];

     stack<string>ans;

     ans.push(biao1[end]);

     while(tt!=yuan){

          ans.push(biao1[tt]);

          tt=path[tt];

     }

        cout<<biao1[yuan];

     while(!ans.empty()){

          cout<<"->"<<ans.top();

          ans.pop();

     }

     cout<<endl;

}

else {

     cout<<"无法到达"<<"\n";

     return ;

}

 

 

 

}

3.3费洛伊德算法 

void floy(MGraph *G){

     intA[MVNum][MVNum];

     intpath[MVNum][MVNum];

     int i, j, k;

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

     for (j = 1;j<=n; j++)

     {

          A[i][j] =G->arcs[i][j];

        if(G->arcs[i][j]!=MAX)

         path[i][j]=j;/*j是i的后继*/

       else

        path[i][j]=0;

 

     }

     for (k = 1;k<=n; k++)

     {

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

          for (j = 1;j<=n; j++)

          if(A[i][j]>(A[i][k] + A[k][j]))

          {

               A[i][j] =A[i][k] + A[k][j];

             path[i][j]=path[i][k];

          }

     }

     cout <<"请输入您要查询的两个城市,例如:北京 天津\n输入字母E退出此算法\n";

     string fir, sec;

     int value;

     while (1){

          cin >>fir;

          if (fir =="E")

               return;

          else {

               cin>> sec;

 

               if(biao[fir] > 0 && biao[sec] > 0){

                    value= A[biao[fir]][biao[sec]];

                    if(value>0&&value<MAX){

                    cout<< fir << "和"<< sec << "的最短距离为"<<  value<< "\n";

                   

                      cout<<"路径如下:\n";

                     /*

                      

                       */

                      cout<<fir<<"->";

                       int k=path[biao[fir]][biao[sec]];

                       while(k!=biao[sec]){

                          

                         cout<<biao1[k]<<"->";

                           k=path[k][biao[sec]];

                          

                       }

                       cout<<sec<<"\n";

                     

                    }

                    elsecout << "两个城市之间无法到达\n";

 

               }

               else cout<<fir<< "无法到达"<<sec<<"\n";

          }

     }

    

}

3.4运行主控程序

 

int main(){

       MGraph*G = (MGraph *)malloc(sizeof(MGraph));

       CreateMGraph(G);

       charcontrol;

             cout<<"***********请选择算法************\nA.弗洛伊德算法\nB.迪杰斯特拉算法\nE.推出程序\n";

       while(1){

       cout<<"亲,请输入字母选择功能\n";

       getchar();

       cin>>control;

 

       if(control=='A'){

     cout<<"\n\n 弗洛伊德*\n" ;

       floy(G);

         

       }

       elseif(control=='B'){

          cout<<"\n\n迪杰斯特拉*\n" ;

         panduan(G);

    }

       elseif(control=='E')

       {

              cout<<"已退出\n";

              return0;

       }

       else{

              cout<<"输入字母不合法,请重新输入\n";

       }

  }

}

 

3.5完整代码

#include<iostream>

#include<string>

#include<cstring>

#include<map>

#include<cstdlib>

#include<stack>

using namespace std;

const double MAX = 1000000;

const int MVNum = 100; /*最大顶点数*/

typedef string VertexType;

typedef double   Adjmatrix;

int n, e;//顶点数和边数

map<string, int> biao;//字符地点与顶点对应

map<int,string>biao1;

typedef struct

{

       VertexTypevexs[MVNum];//顶点信息

       Adjmatrix  arcs[MVNum][MVNum];//边的代价

}MGraph;

 

void change(string temp){

       chars[100];

 

 

  strcpy(s, temp.c_str());

   const char *d = " ,";

   char *p;

    p= strtok(s,d);

   int i=1;

   while(p)

    {

      biao[p]=i;

      biao1[i]=p;

      i++;

      

       p=strtok(NULL,d);

    }

 //遍历  

 

}

 

void CreateMGraph(MGraph *G)/*采用邻接矩阵表示法构造有向图G*/

{

       inti, j, k, w;

      

       cout<< "请输入顶点数和边数,例如:4 5\n";

       cin>> n >> e;

      

       printf("请在一行内输入%i个顶点代表的含义,例如: 西安\n", n);

 

       //存储都从1开始

       stringtemp;

  getchar();

       getline(cin,temp);

   change(temp);

 

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

       for(j = 1; j <= n; j++)

              G->arcs[i][j]= MAX;  /*初始化邻接矩阵 */

 

       cout<< "请选择:\n1.有向图。\n2.无向图\n例如:1\n";

       intflag = 0;

       cin>> flag;

       printf("输入%d条边的i,j及w,例如:1 3 14\n", e);

       for(k = 1; k <= e; k++)/*读入e条边,建立邻接矩阵*/

       {

              cin>> i >> j >> w;

              G->arcs[i][j]= w;

              if(flag == 2){

                     G->arcs[j][i]= w;

              }

       }

       printf("图的存储结构建立完毕\n\n");

}

 

 

void djs(MGraph *G,int yuan,int end){

      

       doubledis[MVNum];

       intflag[MVNum];

     int path[MVNum];

      

       doubleedg[MVNum][MVNum];

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

       {

              for(int j = 1; j <= n; j++)

              {

                     edg[i][j]= G->arcs[i][j];

             

              }

       }

 

 

      

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

       {

              dis[i]= edg[yuan][i];

              flag[i]=0;

              if(dis[i]==MAX)

               path[i]=-1;

               else path[i]=yuan;

       }

 

       flag[yuan]= 1;

       doublemin; int u;

       for(int i = 1; i <= n-1; i++)//源点到源点不用比较,因次总的次数少一次 

       {

              min= MAX;

              for(int j = 1; j<n; j++)

              {

                     if(flag[j] == 0 && dis[j]<min)//核心思想:依次比较出离源点最近的点 

                     {

                            min= dis[j];

                            u= j;

                     }

              }

              flag[u]= 1;

              for(int v = 1; v <= n; v++)  //找出离源点最近的点后开始更新dis里面的源点到各个点的值是否最小 

              {

                     if(edg[u][v]<MAX)

                     {

                            if(dis[v]>dis[u] + edg[u][v])//dis[1][v] 主要是找出离源点最近点的出边来比较 

                            {

                                   dis[v]= dis[u] + edg[u][v];

                                   path[v]=u;

                            }

                     }

              }

       }

  if(dis[end]<MAX){

  cout<<"最短长度为:"<<dis[end]<<"\n"; 

  cout<<"最短路径如下:\n";

       inttt=path[end];

       stack<string>ans;

       ans.push(biao1[end]);

       while(tt!=yuan){

              ans.push(biao1[tt]);

              tt=path[tt];

       }

          cout<<biao1[yuan];

       while(!ans.empty()){

              cout<<"->"<<ans.top();

              ans.pop();

       }

       cout<<endl;

}

else {

       cout<<"无法到达"<<"\n" ;

       return;

}

 

 

 

}

void panduan(MGraph *G){

       cout<<"亲,请输入要查询的地点,例如:食堂 体育场\n字母K退出输入\n ";

       stringyuan,end;

       while(cin>>yuan){

      

       if(yuan=="K")

       break;

       elseif(biao[yuan]>0){

              cin>>end;

                 if(biao[end]>0){

                   djs(G,biao[yuan],biao[end]);

                 }

                 else cout<<"地点不存在\n 请重新输入\n";

       }

       else{

              cout<<"地点不存在\n 请重新输入\n";

       }

}

}

void floy(MGraph *G){

       intA[MVNum][MVNum];

       intpath[MVNum][MVNum];

       inti, j, k;

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

       for(j = 1; j<=n; j++)

       {

              A[i][j]= G->arcs[i][j];

          if(G->arcs[i][j]!=MAX)

        path[i][j]=j;/* j是i的后继*/

       else

       path[i][j]=0;

 

       }

       for(k = 1; k<=n; k++)

       {

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

              for(j = 1; j<=n; j++)

              if(A[i][j]>(A[i][k] + A[k][j]))

              {

                     A[i][j]= A[i][k] + A[k][j];

                  path[i][j]=path[i][k];

              }

       }

       cout<< "请输入您要查询的两个城市,例如:北京 天津\n输入字母E退出此算法\n";

       stringfir, sec;

       intvalue;

       while(1){

              cin>> fir;

              if(fir == "E")

                     return;

              else{

                     cin>> sec;

 

                     if(biao[fir] > 0 && biao[sec] > 0){

                            value= A[biao[fir]][biao[sec]];

                            if(value>0&&value<MAX){

                            cout<< fir << "和" << sec << "的最短距离为" <<  value<<"\n";

                           

                              cout<<"路径如下:\n";

                         /*

                              

                               */

                              cout<<fir<<"->";

                               int k=path[biao[fir]][biao[sec]];

                               while(k!=biao[sec]){

                                

                                cout<<biao1[k]<<"->";

                                 k=path[k][biao[sec]];

                                

                               }

                               cout<<sec<<"\n";

                             

                            }

                            elsecout << "两个城市之间无法到达\n";

 

                     }

                     elsecout <<fir<< "无法到达"<<sec<<"\n";

              }

       }

      

}

 

 

int main(){

       MGraph*G = (MGraph *)malloc(sizeof(MGraph));

       CreateMGraph(G);

       charcontrol;

             cout<<"***********请选择算法************\nA.弗洛伊德算法\nB.迪杰斯特拉算法\nE.推出程序\n";

       while(1){

       cout<<"亲,请输入字母选择功能\n";

       getchar();

       cin>>control;

 

       if(control=='A'){

     cout<<"\n\n 弗洛伊德*\n" ;

       floy(G);

         

       }

       elseif(control=='B'){

          cout<<"\n\n迪杰斯特拉*\n" ;

         panduan(G);

    }

       elseif(control=='E')

       {

              cout<<"已退出\n";

              return0;

       }

       else{

              cout<<"输入字母不合法,请重新输入\n";

       }

  }

}

4.【实例测试及运行结果】

4.1 运行实例一

(求给定有向图3-1的最短路径)

 

图3-1 一个有向图

具体要求之一:求顶点 到其余顶点的最短路径;分别求顶点b到顶点d之间的最短路径、顶点 到顶点d之间的最短路径。

提示:为了操作方便,对于图的顶点都是用序号来表示的,所以顶点的字母就用其对应的序号来操作:如 用1来代替,……。

输入

7 10

a b c d e f g

2 1 20

2 4 30

5 4 12

6 5 8

3 5 5

2 3 10

1 7 9

6 7 10

5 7 15

7 3 18

 b d  a d  ac     a e

 

输出

 

4.2 运行实例二

(求给定有向图3-2的最短路径)

 

图3-2 一个简单的交通网络图

图3-2 是一个简单的交通网络图。

具体要求之一:求顶点“北京”到其余各城市之间的最短路径;并分别求“成都”到“上海”之间以及“上海”到“西安”之间的最短路径。

提示:为了操作方便,对于图的顶点都是用序号来表示的,所以顶点的城市名称就用其对应的编号来操作:如北京用1来代替,……。

输入:

7 10

1 2 2553

1 3 695

1 4 704

2 3 511

2 5 812

3 4 349

3 6 1579

5 6 2368

6 7 1385

4 7 651

 

北京 西安 郑州 徐州 成都广州 上海

 

成都 上海       上海 西安   北京 上海        北京 郑州

输出截图:

 

 

 

5.【心得体会】

   通过这次实验,温习了两种最短路径算法,并且尝试将最短路径打印出来,把以前的理论理解的更加深刻了,同时通过模拟现实中人们的操作习惯,将程序代码分层调用,显得非常灵活实用。更加可贵的是,提高了对大型程序调试的能力,采用分块调试,各个击破。看似简单的算法也需要勤加练习,每一次编写都有新的收获。

 

 

 

 

 

 

 

 

四.校园导游咨询

1.【问题描述】

一个可以为来访的客人提供各种信息查询服务的校园导游系统。构造校园交通图的顶点,顶点采用int型,边的权值采用double型,每个顶点代表了校园景点的位置、简介等信息的代号。查询时输入景点的名字(字符串类型)即可输出最短路径长度和具体的线路,若输入景点不存在或者两个景点之间不可到达,程序会有提示信息。

 

 

2.【问题分析与设计】

  2.1问题分析

(1)设计你所在学校的校园平面图,所含景点不少于10个。以图中顶点表示校园内各景点,存放景点名称、代号、简介等信息:以边表示路径,存放路径长度等相关信息。

(2)为来访客人提供图中任意景点相关信息的查询。

(3)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。

 

  2.2概要设计

(1)采用邻接表存储图结构,利用STL库中的vector、map等容器。

struct _edge{//存储边

    intv, cost;

    _edge(intv, int cost){

        this->v= v;

        this->cost= cost;

    }

 

};

vector<_edge>g[MAXN];

(2)调用visualstudio2013中的语音播放接口,实现人性化的语音交互。

(3)核心代码采用迪杰斯特拉算法,有利于稀疏图的迅速计算最短路径。

迪杰斯特拉算法可用自然语言描述如下:

初始化S和D,置空最短路径终点集,置初始的最短路径值;

S[v1]=TRUE;  D[v1]=0;    //S集初始时只有源点,源点到源点的距离为0;

While (S集中顶点数<n)

{

开始循环,每次求得v1到某个v顶点的最短路径,并加v到S集中;

S[v]=TRUE;

更新当前最短路径及距离;

}

 

 

3.【功能实现】

 

  C++源代码  运行环境visual studio2013

#include<iostream>

#include<sstream>

usingnamespace std;

#include<sapi.h> //导入语音头文件

#include<string>

#include<cstring>

#include<cstdlib>

#include<stack>

#pragmacomment(lib,"sapi.lib") //导入语音头文件库

#include<queue>

#include<vector>

#include<map>

constint MAXN = 201;

map<string,int>biao;

stringbiao1[MAXN];

void  MSSSpeak(LPCTSTR speakContent)// speakContent为LPCTSTR型的字符串,调用此函数即可将文字转为语音

{

       ISpVoice *pVoice = NULL;

 

       //初始化COM接口

 

       if (FAILED(::CoInitialize(NULL)))

              MessageBox(NULL,(LPCWSTR)L"COM接口初始化失败!", (LPCWSTR)L"提示",MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2);

 

       //获取SpVoice接口

 

       HRESULT hr =CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice,(void**)&pVoice);

 

 

       if (SUCCEEDED(hr))

       {

              pVoice->SetVolume((USHORT)100);//设置音量,范围是 0 -100

              pVoice->SetRate(2); //设置速度,范围是 -10 - 10

              hr =pVoice->Speak(speakContent, 0, NULL);

 

              pVoice->Release();

 

              pVoice = NULL;

       }

 

       //释放com资源

       ::CoUninitialize();

}

//string转换车wstring 

std::wstring  StringToWString(const std::string& s)

{

       std::wstring wszStr;

 

       int nLength = MultiByteToWideChar(CP_ACP,0, s.c_str(), -1, NULL, NULL);

       wszStr.resize(nLength);

       LPWSTR lpwszStr = new wchar_t[nLength];

       MultiByteToWideChar(CP_ACP, 0, s.c_str(),-1, lpwszStr, nLength);

       wszStr = lpwszStr;

       delete[] lpwszStr;

       return wszStr;

}

voidread(string temp){

      

       wstring a = StringToWString(temp);

       LPCWSTR str = a.c_str();

 

       MSSSpeak(str);

       //cout << "朗读结束\n";

}

 

/*

   ********************核心代码

*/

 

#include<queue>

#include<vector>

 

struct_edge{//存储边

       int v, cost;

       _edge(int v, int cost){

              this->v = v;

              this->cost = cost;

       }

 

};

vector<_edge>g[MAXN];

structnode{

       int u, cost;

       node(){

 

       }

       node(int u, int cost){

              this->u = u;

              this->cost = cost;

       }

       bool operator<(const node rhs)const{

              return cost>rhs.cost;

       }

};

doubleinf = 999999;

doubledist[MAXN];

boolvisit[MAXN];

 

 

 

voiddjs(string fir,string sec){

       int start = biao[fir];

       int end = biao[sec];

       int path[MAXN];//存储路径

       stack<int>ans;

       priority_queue<node>q;

       for (int i = 0; i < MAXN; i++){

              dist[i] = inf;

              visit[i] = false;//初始化

              path[i] = -1;

       }

       dist[start] = 0;

 

       q.push(node(start, 0));

       node f;

       while (!q.empty()){

              f = q.top();

              q.pop();

              int u = f.u;

              if (!visit[u])

                     visit[u] = true;

              for (int i = 0; i <g[u].size(); i++){

                     int v = g[u][i].v;

 

                     if (visit[v])

                            continue;

                     int  tempcost = g[u][i].cost + dist[u];

                     if (dist[v]>tempcost)

                     {

                            dist[v] = tempcost;

                            path[v] = u;

                            q.push(node(v,tempcost));

                     }

              }

       }

       int i = end;

       cout << "最短路:";

       while (path[i] != -1){

              ans.push(path[i]);

              i = path[i];

             

       }

       //输出路径

       if (ans.empty())

       {

              cout << "无法到达\n";

 

       }

       else {

              string temp = "最短路径依次经过的地点是:";

      

      

              while (!ans.empty()){

                    

                     temp +=  biao1[ans.top()]+"->";

                     ans.pop();

 

              }

              temp += sec;

              temp += "  长度为:";

              temp += to_string(dist[end]);

          

              cout << temp <<"\n";

              read(temp);

             

       }

}

 

voidchange(string temp){

       int i = 1;

       string value = "";

       int j;

       for (j = 0; j < temp.length(); ++j){

              if (temp[j] != ' '){

                     value += temp[j];

              }

              else if (temp[j] == ''&&temp[j - 1] != ' '){

                     biao[value] = i;

                     biao1[i] = value, i++;

                     value = "";

              }

              else if (temp[j] == ' '){

                     value = "";

              }

       }

       if (temp[j - 1] != ' ')

       {

              biao[value] = i;

              biao1[i] = value;

       }

       //测试

      

       /*for (map<string, int>::iteratorit = biao.begin(); it != biao.end(); it++){

              cout << it->first<< "  " <<it->second << "\n";

       }

       cout << "测试结束\n";*/

}

 

void creat(){//构建图

       int n, m, s, t;

       int src, dest, cost2;

       cout << "亲,请输入顶点数和边数,例如:4 6\n";

       cin >> n >> m;

       printf("亲,请输入%i个顶点代表的含义 例如:北京 上海 武汉\n",n);

       string temp;

       getchar();

       getline(cin, temp);

       change(temp);

 

       printf("亲,请输入%i条边的源点 终点 代价  例如:2 4 998\n",m);

       for (int i = 0; i < m; i++){//无向图

              cin >> src >> dest>> cost2;

              g[src].push_back(_edge(dest,cost2));

       g[dest].push_back(_edge(src, cost2));

 

       }

 

 

}

voiduse(){

       cout << "亲,请输入您要查询的两个地点,例如:上海 武汉  字母‘E’退出此算法\n";

       string fir, sec;

       while (cin >> fir){

              if(fir == "E")

                     return;

              if (biao[fir] > 0 ){

                     cin >> sec;

                     if (biao[sec]>0)

                     djs(fir,sec);

                     else cout << "输入地点不存在,请重新输入两个地点\n";

              }

              else {

                     cout << "输入地点不存在,请重新输入两个地点\n";

              }

       }

}

stringplace[MAXN];

#include<fstream>

voidfind(){

       string temp;

       cout << "请输入你要查询的地点 字母B退出此算法\n";

       int i;

       while (cin >> temp){

              if (temp == "B")

                     return;

              if (biao[temp] > 0){

                     i = biao[temp];

                     //读取文件

                     string data;

                     ifstreamfin("C:/Users/周大哥/Desktop/课程设计/"+to_string(i)+".txt");

                     while (getline(fin, data)){

                            cout << data;

                            read(data);

                     }

                     cout << endl;

              }

              else {

                     cout << "该地点不存在,请重新输入\n";

              }

       }

}

 

int  main(){

       cout << "****************欢迎来到校园导游咨询系统*****************\n";

       read("****************欢迎来到校园导游咨询系统*****************");

       creat();

 

       use();

      

              find();//查询地点信息

 

       return 0;

}

 

4.【实例测试及运行结果】

1215   (顶点数  边数)

1 3 10    

1 5 30

1 6 100

2 3 5

3 4 50

4 6 10

5 6 60

5 4 20

4 7 30

2 770    

3 10 30

4 8 100

8 9 20

1 12 20

5 11 15

(顶点 顶点 边的权值)

12个顶点分别代表的景点

1->图书馆

2->超市

3->餐厅

4->书店

5->足球场

6->篮球场

7->宿舍

8->教学楼

9->办公楼

10->实验楼

11->操场

12->理工大校门

图书馆 超市 餐厅 书店 足球场 篮球场 宿舍 教学楼 办公楼 实验楼 操场 理工大校门

 

图书馆 超市                 图书馆 篮球场          宿舍 理工大校门

 

将各景点信息存放在  C:/Users/周大哥/Desktop/课程设计/ 目录的txt文件下

 

1.     图书馆始建于1896 年,是我国西南地区藏书规模最大的大学图书馆;馆舍总面积63,100平方米;馆藏纸质文献达699.75万余册,并拥有丰富的电子文献资源。可提供阅览、外借、参考咨询、科技项目查新、文献传递、用户培训、馆际互借、声像视听、复印复制、打印扫描、缩微复制等多种信息服务,并为本科生、研究生开设文献检索与利用课

2.     内有各种便利商品,物美价廉。

3.     本校区餐厅包含各地美食,适合聚会休闲。

4.     内含各科教辅资料、时尚小说、杂志。

5.     面积广阔、设有草坪,欢迎组队踢球。

6.     设施完备,场地大。

7.     内设空调,一室一厅,设有独卫。

8.     含有先进的教学设备,师资力量强大。

9.     场地大,办公设施齐全。

10.  内含各种先进的实验器材。

11.  含有400米跑道2个,主席台高端大气。

12.  太原理工大学的前身是创立于1902年的国立山西大学堂西学专斋,是我国最早成立的三所国立大学之一;历经山西大学校工科、山西大学工学院;1953年独立建校,定名太原工学院,直属高教部;1962年归属山西省;1984年更名为太原工业大学。1997年太原工业大学与始建于1958年直属煤炭部的山西矿业学院合并,组建为太原理工大学。同年,学校被确定为国家“211工程重点建设大学

 

5.【心得体会】

 

编程不是一日练成的,需要每天坚持,这样写代码才有感觉。编写一个大的系统往往很困难,但我们可以把它逐步细化、分解成一个个小的模块,然后精细的设计每一个小的模块,采用自顶向下,逐步细化的方法。遇到不懂的问题,查查等级高的博客,往往会有新思路和高效的解法。c/c++中包含很多库函数,不必要每个都记住,用的时候查询STL就行了。

在程序设计中,和同学多多交流,会有意想不到的收获,例如:两种方法,会有更优的解决方案。

 

 

 

 


  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值