车辆调度程序C语言课设报告

沈阳航空航天大学

课 程 设 计 报 告

课程设计名称:C语言课程设计

  课程设计题目: 车辆调度调度程序设计

院(系): 计算机学院

专    业: 计算机科学与技术

班    级:  

学    号:  

姓    名:  

指导教师: 

完成日期: 20##年3月17日

   

第1章  概要设计... 2

1.1题目的内容与要求... 2

1.2总体结构... 3

第2章  详细设计... 4

2.1主程序模块... 4

2.2车辆调用模块... 5

2.3车辆归还模块... 6

2.4车辆总览模块... 7

2.5车辆查询模块... 8

2.6新车登记模块... 9

2.7车辆注销模块... 10

第3章  调试分析... 11

3.1调试前期... 11

3.2调试中期... 12

3.3调试后期... 12

第4章  使用说明与执行结果... 13

4.1车辆调度:... 13

4.2车辆归还:... 14

4.3车况一览:... 16

4.4车辆查询:... 16

4.5新车登陆:... 17

4.6车辆注销:... 18

4.7退出系统:... 18

参考文献... 19

附   录(程序清单)... 20

第1章  概要设计

1.1题目的内容与要求

内容:用文件系统设计实现一个简单的车辆调度系统。实现用车要求的登记、车辆的管理等功能。

建立车辆基本的情况表,内容包含车辆所有信息,包括车辆目前状态,认为司机和车辆是一一对应的,在用户要求时进行信息动态匹配,并且可以智能选择最合理的车辆资源满足用户要求,为简单起见,可以不考虑司机的情况即仅对车辆进行管理,程序最终输出结果是:本次调出的车辆或者司机。

要求:

1)        系统利用C语言实现;

2)        车辆调用或归还结束后,需要把新的车辆状况保存到文本文件中;

3)        采用VC环境进行调试运行。

1.2总体结构

本程序主要分为七个模块(功能模块图见图1.1):主程序模块,车辆调用模块,车辆归还模块,车辆总览模块,车辆查询模块,新车登记模块,车辆注销模块。

主程序模块:用于实现整个程序功能引导。

车辆调用模块:实现车辆调用功能。

车辆归还模块:实现车辆归还功能。

车辆总览模块:实现车辆总体情况查看功能。

车辆查询模块:实现单一车辆查询功能。

新车登记模块:实现新车登记,并存入到文件的功能。

车辆注销模块:实现车辆注销,并从文件中删除的功能。

组织结构图

1.1 功能模块图

第2章  详细设计

2.1主程序模块

引导整个程序的运行,通过主函数模块分别调用各个模块,实现各项功能,流程如图2.1所示。

         

2.1 主模块流程图

注释:

1).先定义相关变量;

2).调用主菜单函数,并判断其返回值,进行相关操作。

2.2车辆调用模块

     用于实现车辆调出的功能,用户使用时,需要输入身份证号码,姓名,计划归还车辆时间,输入完毕后进行车辆条件选择阶段,系统会列出符合条件的车辆,用户可输入希望调用的车辆编号或让系统自动选择距离上次出车时间最长的汽车,选择完毕后,按任意键返回主菜单。流程如图2.2所示。

2.2 车辆调用模块流程图

2.3车辆归还模块

      用于实现车辆归还操作,进入该功能后,用户需输入调用车辆时输入的姓名及身份证号,如果信息不符,还车失败,并且如果换车时间晚于与预还车时间,还车也会失败。流程如图2.3所示。

2.3 车辆归还模块流程图

2.4车辆总览模块

      该模块主要实现用户对所有车辆在库车辆的总体情况查看功能。用户进入该功能后,系统将会列出所有车辆信息。流程如图2.4所示。

2.4 车辆总览模块流程图

2.5车辆查询模块

     该模块主要实现单一车辆信息查询功能,用户只需输入所希望查找车辆编号,即可查找到相关车辆信息。流程如图2.4所示。

2.5 车辆总览模块流程图

2.6新车登记模块

     该模块主要实现将新的车辆信息加入到车辆信息库中,并可以在车辆调用以及车辆查询,车辆总览功能中发现车辆信息。使用时用户需输入车牌号,司机姓名,车辆类型即可,系统会自动为新车辆编号,并且状态改为可调出。流程如图2.6所示。

2.6 新车登陆模块流程图

2.7车辆注销模块

           该模块主要实现将车辆信息从车辆信息库中删除,并不可以在车辆调用以及车辆查询,车辆总览功能中发现车辆信息。使用时用户需输入车辆编号,系统便会删除车辆信息。流程如图2.7所示。

2.7 车辆注销模块流程图

第3章  调试分析

3.1调试前期

     调试前期,错误比较多,都是语法错误,只需细心根据提示逐条改正即可。

      错误1:

C:\Users\Administrator\Desktop\课设\vehicle.cpp(32) : error C2146: syntax error : missing ';' before identifier 'VehicleList'

改法:在前一末尾增加分号。

错误2:

C:\Users\Administrator\Desktop\课设\vehicle.cpp(32) : error C2057:expected constant expression is not integral

改法:意思是在此处需要一个整型常量表达式,查看此处代码,发现少定义一个表达式,定义一个即可。

错误3:

C:\Users\Administrator\Desktop\课设\vehicle.cpp(32) : error C2084:function 'main_menu' already has a body

改法:删除对此函数的定义。

错误4:

C:\Users\Administrator\Desktop\课设\vehicle.cpp(32) : error C2446:can not allocate an array of costant size 0

改法:查看对表达式是否赋值正确。

3.2调试中期

     调试中期,已无语法错误,调试程序各个功能是否能够实现。

     错误:

进入新车登陆功能后,输入车辆信息后并显示成功,但实际新车信息并没有存入文件中。

改法:检查新车登陆函数编写时了逻辑是否有误。发现对链表节点设置错误,改正节点。

3.3调试后期

    调试后期,语法,逻辑均无错误。各项功能都已实现,菜单还不够完美,反复调试,使菜单界面清爽易懂。

第4章  使用说明与执行结果

主菜单:

******************************************************

*                     汽车调度程序                   *

******************************************************

*                      1.汽车调度                    *

*                      2.汽车归还                    *

*                      3.车辆总况一览                *

*                      4.车辆查询                    *

*                      5.新车登记                    *

*                      6.车辆注销                    *

*                      7.退出系统                    *

******************************************************

*                      请选择: 1-7                   *

******************************************************

请输入您的选项:

4.1车辆调度:

进入车辆调度功能!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

请输入租车人姓名: WAHAHA

请输入租车人身份证号: 123456789987654321

请输入计划归还时间(格式YYYY-MM-DD,如 20##-03-24): 20##-3-26

请选择您需要的车型(A.大型车 B.中型车 C.小型车 E.返回主菜单 请输入大写字母!):B

**************************可选车辆列****************************

车辆编号   车牌号  驾驶员     车辆类型    车辆状态    上次出车时间(DDYYMM)

  1005     KDF005 LILIU        B        可调出             NEW

  1009     KDF009 ZHAOJIE     B        可调出      20##-03-11

*****************************************************************

请输入车辆编号或输入W智能筛选(输入E返回主菜单):W

****************************车辆调度结果************************

已调出车辆:1005,驾驶员:LILIU,出车日期:20##-03-24

*****************************************************************

请按任意键继续. . .

4.2车辆归还:

1.信息输入错误

进入车辆归还功能!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

请输入汽车编号: 1001

请输入租车人姓名: YANGZHENPU

请输入租车人身份证号: 123456789987654321

租车人姓名或身份证号输入有误!

请按任意键继续. .

2.归还太迟:

进入车辆归还功能!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

请输入汽车编号: 1003

请输入租车人姓名: LIUZHIGONG

请输入租车人身份证号: 123456789123456789

归还失败,您的车辆已超期,请到总服务台办理超期还车手续!

请按任意键继续. . .

3.归还成功:

进入车辆归还功能!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

请输入汽车编号: 1005     

请输入租车人姓名: WAHAHA

请输入租车人身份证号: 123456789987654321

汽车归还成功!

请按任意键继续. . .

4.3车况一览:

      

      

进入车况一览功能!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

车辆编号 车牌号     驾驶员   车型  车辆状态 上次出车时间  租车人姓名  计划归还时间

  1001   KDF001 ZHANGSAN   A    可调出   20##-03-12         N/A          N/A

  1002   KDF002    LISI       B    出车中   20##-03-15   LIUZHIGONG   20##-03-20

  1003   KDF003  ZHAOLIU    A    出车中   20##-03-11   LIUZHIGONG   20##-03-14

  1004   KDF004 ZHANGWU    C    可调出   20##-03-12         N/A          N/A

  1005   KDF005 LILIU         B    可调出   20##-03-24         N/A          N/A

  1006   KDF006 ZHAOLI       B    出车中   20##-03-11   LIUZHIGONG   20##-03-17

  1007   KDF007 ZHANGXUE    A    出车中   20##-03-17     QIANGGE    20##-3-18

  1008   KDF008 LIJIE          C    可调出      NEW          N/A          N/A

  1009   KDF009 ZHAOJIE      B     可调出   20##-03-11        N/A          N/A

  1010   KDF010 ZHOUSU      A     可调出   20##-03-14         N/A          N/A

  1011   DFD222 ZHIGONG     C     可调出       NEW          N/A          N/A

  1012   KDF010 ZHOULANG   A     可调出   20##-03-15         N/A          N/A

请按任意键继续. . .

4.4车辆查询:

进入车辆查询功能!

请输入汽车编号或车牌号: 1005

***************找到了符合条件的车辆信息*****************************

车辆编号 车牌号  驾驶员   车型 车辆状态 上次出车时间  租车人姓名  计划归还时间

  1005   KDF005 LILIU      B    可调出   20##-03-24         N/A          N/A

请按任意键继续. . .

4.5新车登陆:

   

进入车新车登陆功能!

请输入车牌号: KSF008

请输入驾驶员: LEHAHA

请选择车辆类型(A/B/C): C

成功登记牌号为:KSF008的车辆,车辆编号为:1013!

请按任意键继续. . .

4.6车辆注销:

进入车辆注销功能!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

请输入需要注销的车辆编号: 1011

已注销编号为1011的车辆!

请按任意键继续. . .

4.7退出系统:

******************************************************

*                     汽车调度程序                   *

******************************************************

*                      1.汽车调度                    *

*                      2.汽车归还                    *

*                      3.车辆总况一览                *

*                      4.车辆查询                    *

*                      5.新车登记                    *

*                      6.车辆注销                    *

*                      7.退出系统                    *

******************************************************

*                      请选择: 1-7                   *

请输入您的选项:7

您确定要退出系统?输入Y确定,输入N返回主菜单

Y

参考文献

[1] 张长海. C语言程序设计[M] . 北京:高等教育出版社,2006

[2] 裘宗燕. 从问题到程序:程序设计与C语言引论[M] . 北京:机械工业出版社,2005.9

[3] 王敬华,林萍,张清国. C语言程序设计教程[M] . 北京:清华大学出版社,2009.8、

[4] 谭浩强. C程序设计[M] . 北京:清华大学出版社,2005

[5] 谭浩强. C程序设计题解与上机指导[M]  . 北京:清华大学出版社,2005

[6] 胡建平. C语言程设计学习指导书[M] . 天津:天津大学出版社,2005

[7] 谭明金,余海英. C语言程序设计实例精粹[M] . 北京:电子工业出版社,2006

附   录(程序清单)

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <windows.h>

int feature;//定义输入的功能选项

char now_date[12];//定义系统当前日期存储缓冲区

SYSTEMTIME sys; //定义系统时间变量

//定义车辆数据结构

typedef struct Vehicle

{

       char *ver_id;//定义车辆编号

       char *ver_no;//定义车辆牌号

       char *driver;//定义车辆对应驾驶员

       char *ver_type;//定义车辆类型

       char *ver_status;//定义车辆状态

       char *ver_last_date;//定义车辆归还日期

       char *lender_name;//定义租车人姓名

       char *lender_id;//定义租车人身份证号码

       char *return_time;//定义归还时间

}Vehicle,*VData;

//定义车辆链表

typedef struct VNode

{

       Vehicle data;

       struct VNode *next;

}VNode,*VehicleList;

//声明函数

VehicleList select_vehicle(VehicleList L, char * key);//定义车辆查询函数

VehicleList InitList(VehicleList L);//定义链表初始化函数

VehicleList LoadData(VehicleList L, char *filename);//定义信息读取函数

void SaveData(VehicleList L, char *filename);//定义存储数据函数

int main_menu();//定义主菜单

int dispatch(VehicleList L, char *lender_name, char *lender_id, char *return_time);//定义车辆调度函数

void back_vehicle(VehicleList L, char * key, char *lender_name, char *lender_id);//定义车辆归还函数

void list_all(VehicleList L);//定义车辆总览函数

VehicleList select_vehicle(VehicleList L, char * key);//定义车辆查询函数

VehicleList register_vehicle(VehicleList L);//定义车辆登记函数

void delete_vehicle(VehicleList L, char * key);//定义车辆删除函数

int datecmp(char *a,char *b);//定义日期比较函数

int quit();//定义退出函数

char *getS();

//定义字符串输入接口函数

char *getS()

{

       char *c;

       char s[30];   

       scanf("%s",s);

       c=(char*)malloc(sizeof(char)*(strlen(s)+1));

       strcpy(c,s);

       return c;

}

//定义链表初始化函数

VehicleList InitList(VehicleList L)

{

       L=(VehicleList)malloc(sizeof(VNode));

       L->next=NULL;

       return L;

}

//定义比较日期大小函数

int datecmp(char *a,char *b)

{

       int i;

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

       {

              if(a[i]>b[i])

                     return 1;

              else if(a[i]==b[i])

                     continue;

              else

                     return -1;

             

       }

       return 0;

}

//定义从文件加载数据函数

VehicleList LoadData(VehicleList L,char *filename)

{

       VehicleList p,q;

       //Vehicle v,v2,v3;

       Vehicle vdata;

       FILE *fp;//定义文件指针

       char ver_id[20],ver_no[20],driver[20],ver_type[20],ver_status[20],ver_date[20];

       char lender_name[20],lender_id[20],return_time[20];

       q=L;

      

       if((fp = fopen(filename,"r+")) == NULL)

       {

              printf("文件数据读取失败!\n");

       }

       else

       {

              while (!feof(fp))//将文件中数据读取到链表中

              {

                     fscanf(fp,"%s %s %s %s %s %s %s %s %s\r\n",ver_id,ver_no,driver,

                               ver_type,ver_status,ver_date,lender_name,lender_id,return_time);

                     vdata.ver_id=(char*)malloc(sizeof(char)*(strlen(ver_id)+1));

                     vdata.ver_no=(char*)malloc(sizeof(char)*(strlen(ver_no)+1));

                     vdata.driver=(char*)malloc(sizeof(char)*(strlen(driver)+1));

                     vdata.ver_type=(char*)malloc(sizeof(char)*(strlen(ver_type)+1));

                     vdata.ver_status=(char*)malloc(sizeof(char)*(strlen(ver_status)+1));

                     vdata.ver_last_date=(char*)malloc(sizeof(char)*(strlen(ver_date)+1));

                     vdata.lender_name=(char*)malloc(sizeof(char)*(strlen(lender_name)+1));

                     vdata.lender_id=(char*)malloc(sizeof(char)*(strlen(lender_id)+1));

                     vdata.return_time=(char*)malloc(sizeof(char)*(strlen(return_time)+1));

                     strcpy(vdata.ver_id,ver_id);

                     strcpy(vdata.ver_no,ver_no);

                     strcpy(vdata.driver,driver);

                     strcpy(vdata.ver_type,ver_type);

                     strcpy(vdata.ver_status,ver_status);

                     strcpy(vdata.ver_last_date,ver_date);

                     strcpy(vdata.lender_name,lender_name);

                     strcpy(vdata.lender_id,lender_id);

                     strcpy(vdata.return_time,return_time);

                     p=(VehicleList)malloc(sizeof(VNode));

                     p->data=vdata;

                     q->next=p;

                     q=p;

              }

       }

       q->next=NULL;

       fclose(fp);

       return L;

}

//定义存储数据函数

void SaveData(VehicleList L, char *filename)

{

       VehicleList p;

       FILE *fp;//定义文件指针

       p=L;

      

       if((fp = fopen(filename,"w+")) == NULL)

       {

              printf("文件写入失败!\n");

       }

       else

       {

              while (p->next != NULL)

              {

                     fprintf(fp,"%s %s %s %s %s %s %s %s %s\r\n",p->next->data.ver_id,p->next->data.ver_no,

                                   p->next->data.driver,p->next->data.ver_type,p->next->data.ver_status,

                                   p->next->data.ver_last_date,p->next->data.lender_name,

                                   p->next->data.lender_id,p->next->data.return_time);

                     p=p->next;

              }

       }

       fclose(fp);

}

//定义主菜单

int main_menu()

{

       int i;

       printf("******************************************************\n");

       printf("*                     汽车调度程序                   *\n");

       printf("******************************************************\n");

       printf("*                      1.汽车调度                    *\n");

       printf("*                      2.汽车归还                    *\n");

       printf("*                      3.车辆总况一览                *\n");

       printf("*                      4.车辆查询                    *\n");

       printf("*                      5.新车登记                    *\n");

       printf("*                      6.车辆注销                    *\n");

       printf("*                      7.退出系统                    *\n");

       printf("******************************************************\n");

       printf("*                      请选择: 1-7                   *\n");

       printf("******************************************************\n");

       printf("请输入您的选项:");

       scanf("%d", &i);

       feature=i;

       return i;

}

//定义功能1--汽车调度

int dispatch(VehicleList L, char *lender_name, char *lender_id, char *return_time)

{

       char *vtype,*vid;//车型

       VehicleList p,q1,q2;

       char tmpdate[20];

       int i=0;

       p=L;

       q1=L;

       q2=L;

       strcpy(tmpdate,now_date);

       printf("\n请选择您需要的车型(A.大型车 B.中型车 C.小型车 E.返回主菜单 请输入大写字母!):");

       vtype = getS();

       if (strcmp("E",vtype) == 0) return 0;//如果输入E,返回主菜单

       printf("\n****************************************可选车辆列表******************************************");

       printf("\n车辆编号   车牌号  驾驶员    车辆类型    车辆状态    上次出车时间(DDYYMM)\n");

       while (L->next != NULL)

       {//显示符合条件的在库车辆信息

              if (strcmp("出车中",L->next->data.ver_status) !=0 && strcmp(vtype,L->next->data.ver_type) ==0)

              {

                     if(datecmp(tmpdate,L->next->data.ver_last_date) > -1)//调用比较未调度时间的函数

                     {

                            q1=L;//获得最长时间没有被调度的车的节点指针

                            strcpy(tmpdate,q1->next->data.ver_last_date);

                     }

                           

                     printf("%6s %10s %-10s %8s %13s %15s\n",

                            L->next->data.ver_id,L->next->data.ver_no,L->next->data.driver,L->next->data.ver_type,

                            L->next->data.ver_status,L->next->data.ver_last_date);

              }

              if (strcmp("NEW",L->next->data.ver_last_date) ==0 && strcmp(vtype,L->next->data.ver_type) ==0)

              {

                     i++;//计算新车数量

                     q2=L;//获得新车的节点指针

              }

             

              L=L->next;

       }

       L=p;

       printf("**************************************************************************\n");

       printf("请输入车辆编号或输入W智能筛选(输入E返回主菜单):");

       vid = getS();

       if (strcmp("W",vid) == 0)

       {

                     if(i>0)

                     {

                            printf("\n****************************************车辆调度结果****************************************");

                            printf("\n已调出车辆:%s,驾驶员:%s,出车日期:%s\n",q2->next->data.ver_id,q2->next->data.driver,now_date);

                     printf("**********************************************************************************************\n");                                  

                            q2->next->data.ver_status="出车中";//修改车辆状态和上次出车时间

                            q2->next->data.ver_last_date=(char*)malloc(sizeof(char)*(strlen(now_date)+1));

                            strcpy(q2->next->data.ver_last_date,now_date);

                            strcpy(q2->next->data.lender_name,lender_name);

                            strcpy(q2->next->data.lender_id,lender_id);

                            strcpy(q2->next->data.return_time,return_time);

                            return 1;

                     }

                     else

                     {

                            printf("\n****************************************车辆调度结果****************************************");

                            printf("\n已调出车辆:%s,驾驶员:%s,出车日期:%s\n",q1->next->data.ver_id,q1->next->data.driver,now_date);

                     printf("**********************************************************************************************\n");                                  

                            q1->next->data.ver_status="出车中";//修改车辆状态和上次出车时间

                            q1->next->data.ver_last_date=(char*)malloc(sizeof(char)*(strlen(now_date)+1));

                            strcpy(q1->next->data.ver_last_date,now_date);

                            strcpy(q1->next->data.lender_name,lender_name);

                            strcpy(q1->next->data.lender_id,lender_id);

                            strcpy(q1->next->data.return_time,return_time);

                            return 1;                     

                     }           

       }

       else if ((p=select_vehicle(L,vid)) != NULL)

       {

              p->next->data.ver_status="出车中";//修改车辆状态和上次出车时间

              p->next->data.ver_last_date=(char*)malloc(sizeof(char)*(strlen(now_date)+1));

              strcpy(p->next->data.ver_last_date,now_date);

              strcpy(p->next->data.lender_name,lender_name);

              strcpy(p->next->data.lender_id,lender_id);

              strcpy(p->next->data.return_time,return_time);

              printf("\n****************************************车辆调度结果****************************************");

              printf("\n已调出车辆:%s,驾驶员:%s,出车日期:%s\n",p->next->data.ver_id,p->next->data.driver,now_date);

       printf("**********************************************************************************************\n");

              return 1;

       }

       else if (strcmp("E",vid) == 0)

       {

              return 0;

       }

       else

       {

              printf("输入错误,请返回!\n");

              return 3;

       }    

       return 3;

}

//定义功能2--汽车归还

void back_vehicle(VehicleList L, char * key, char *lender_name,

                              char *lender_id)

{

       VehicleList p;

       if ((p=select_vehicle(L,key)) != NULL)

       {

              if (strcmp(lender_name,p->next->data.lender_name) == 0 &&

                     strcmp(lender_id,p->next->data.lender_id) == 0)//姓名和身份证号输入正确才可还车

              {

                     if (datecmp(now_date,p->next->data.return_time) < 1)//如果实际归还时间超出预定归还时间,提示到服务台办理

                     {

                            p->next->data.ver_status="可调出";//恢复车辆状态及租车人信息为初始状态

                            p->next->data.lender_name="N/A";

                            p->next->data.lender_id="N/A";

                            p->next->data.return_time="N/A";

                            printf("\n汽车归还成功!\n\n");

                     }

                     else

                     {

                            printf("\n归还失败,您的车辆已超期,请到总服务台办理超期还车手续!\n\n");

                     }

              }

              else

              {

                     printf("\n租车人姓名或身份证号输入有误!\n\n");

              }

       }else{

              printf("\n没有查询到编号为:%s的车辆信息!\n\n",key);

       }

}

//定义功能3--车辆总况一览

void list_all(VehicleList L)

{

       printf("\n车辆编号 车牌号  驾驶员   车型 车辆状态 上次出车时间  租车人姓名  计划归还时间\n");

       while (L->next != NULL)

       {

        //显示所有已登记车辆信息

              //if(strcmp("出车中",L->next->data.ver_status) !=0)

              printf("%6s %8s %-10s %1s %9s %12s   %9s %12s\n",

                     L->next->data.ver_id,L->next->data.ver_no,L->next->data.driver,

                     L->next->data.ver_type,L->next->data.ver_status,L->next->data.ver_last_date,

                     L->next->data.lender_name,L->next->data.return_time);

              L=L->next;

       }

       printf("\n");

       system("pause");

}

//定义功能4--车辆查询

VehicleList select_vehicle(VehicleList L, char * key)

{

       VehicleList p;

       p=L;

       while (p->next != NULL)

       {

         //如果查找到符合条件的车辆信息,则返回这个车辆信息节点的指针,strcmp,字符串比较函数

              if (strcmp(key,p->next->data.ver_id) == 0 || strcmp(key,p->next->data.ver_no) == 0)

              {

                     return p;//P为该车辆信息节点的指针

              }

              else

              {

                     p=p->next;

              }           

       }

       return NULL;

}

//定义功能5--新车登记

VehicleList register_vehicle(VehicleList L)

{

       VehicleList p,q;

       Vehicle v;//定义新增车辆结构体

       int id=1001;//初始车辆编号起始ID

       char tmpID[5];//车辆编号格式化为字符串

       q=L;

       while (q->next != NULL)

       {

              q=q->next;//将指针调至链表尾部以插入新数据

       }    

       //printf("请输入车辆编号: ");

       //v.ver_id=getS();

       printf("请输入车牌号: ");

       v.ver_no=getS();

       printf("请输入驾驶员: ");

       v.driver=getS();

       printf("请选择车辆类型(A/B/C): ");

       v.ver_type=getS();

       v.ver_status="可调出";

       v.ver_last_date="NEW";

       v.lender_name="N/A";

       v.lender_id="N/A";

       v.return_time="N/A";

       //自动生成车辆编号

       sprintf(tmpID, "%d", id);

       while(select_vehicle(L,tmpID) != NULL)

        {

              id++;

              sprintf(tmpID, "%d", id);//将id转为字符串存储到tmpID中

       }

       v.ver_id=(char*)malloc(sizeof(char)*(strlen(tmpID)+1));//分配内存空间

       strcpy(v.ver_id,tmpID);//将tmpID拷贝到车辆信息结构中

       if(select_vehicle(L,v.ver_no) == NULL)

        {

         //检查是否已有该车牌号

              p=(VehicleList)malloc(sizeof(VNode));//创建新的车辆节点

              p->data=v;

              q->next=p;//连接新的车辆节点

              q=p;       //将q指针移至最后节点

              q->next=NULL;//将最后一个节点的next设为NULL

              printf("\n成功登记牌号为:%s的车辆,车辆编号为:%s!\n\n",v.ver_no,v.ver_id);

       }

        else

            {

              printf("\n已存在该车辆!\n\n");

           }

      

       return L;

}

//定义功能6--车辆注销

void delete_vehicle(VehicleList L, char * key)

{

       VehicleList p,q;

       p=L;

       if ((p=select_vehicle(L,key)) != NULL)

       {

              q=p->next;

              p->next=q->next;//将节点p连接到下下一个节点,即删除找到的节点

              free(q);

              printf("\n已注销编号为%s的车辆!\n\n",key);

       }

       else

       {

              printf("\n没有找到符合条件的车辆!\n\n");

       }

       system("pause");

}

//定义功能7--退出系统函数

int quit()

{

    char *temp;

       temp=getS();//接受用户输入

       if(strcmp("Y",temp)==0)

       {

              return 1;//返回1,为确实退出

       }

       else if(strcmp("N",temp)==0)

       {

              return 0;//返回0,则不退出,并清屏,加载主菜单

       }

       else

       {

              return 2;//返回2,说明输入错误,任意键返回主菜单

       }

       return 2;//默认返回2

}

int main()

{    

       VehicleList L1,tmpL;

       char *vehicle_key,*lender_name,*lender_id,*return_time;

       char *filename="vehicle.txt";//设置数据文件

       GetLocalTime(&sys);

       sprintf(now_date,"%4d-%02d-%02d",sys.wYear,sys.wMonth,sys.wDay);

       L1=(VehicleList)malloc(sizeof(VNode));

       L1=InitList(L1);

       L1=LoadData(L1,"vehicle.txt");

main_menu:

       //SaveData(L1,filename);//每完成一个操作都保存数据到文件,默认选择7程序退出时才保存数据

       main_menu();//加载主菜单

       switch (feature)

       {

       case 1:

              {

                     int i;

                     printf("请输入租车人姓名: ");

                     lender_name = getS();

                     printf("请输入租车人身份证号: ");

                     lender_id = getS();

                     printf("请输入计划归还时间(格式YYYY-MM-DD,如 %s): ",now_date);

                     return_time = getS();

                     if (datecmp(now_date,return_time) > 0)

                     {

                            printf("\n归还时间输入错误,最少需要租一天,即时间应该大于等于 %s\n\n",now_date);

                            system("pause");

                            system("cls");

                            goto main_menu;

                     }

                     i=dispatch(L1,lender_name,lender_id,return_time);          //调用车辆调度函数

                     if (i==0)

                     {

                            system("cls");

                            goto main_menu;

                     }

                     else

                     {

                            system("pause");

                            system("cls");

                            goto main_menu;

                     }                  

              }

       case 2:

              {

                     printf("请输入汽车编号: ");

                     vehicle_key = getS();

                     printf("请输入租车人姓名: ");

                     lender_name = getS();

                     printf("请输入租车人身份证号: ");

                     lender_id = getS();

                     back_vehicle(L1,vehicle_key,lender_name,lender_id);//调用车辆归还函数

                     system("pause");

                     system("cls");

                     goto main_menu;

              }

       case 3:

              {

                     list_all(L1);//调用车辆总览函数

                     system("cls");

                     goto main_menu;

              }

       case 4:

              {

                     printf("请输入汽车编号或车牌号: ");

                     vehicle_key=getS();

                     tmpL=select_vehicle(L1,vehicle_key);//调用车辆查找函数

                     if (tmpL != NULL)//返回不为空,说明找到了

                     {

                            printf("\n*********************找到了符合条件的车辆信息*****************************\n");

                            printf("\n车辆编号 车牌号  驾驶员   车型 车辆状态 上次出车时间  租车人姓名  计划归还时间\n");

                            printf("%6s %8s %-10s %1s %9s %12s   %9s %12s\n\n",

                                   tmpL->next->data.ver_id,tmpL->next->data.ver_no,tmpL->next->data.driver,

                                   tmpL->next->data.ver_type,tmpL->next->data.ver_status,

                                   tmpL->next->data.ver_last_date,tmpL->next->data.lender_name,

                                   tmpL->next->data.return_time);

                            system("pause");

                     }

                     else

                     {

                            printf("\n\n没有找到符合条件的车辆信息!\n\n");

                            system("pause");//按任意键继续

                     }

                     system("cls");

                     goto main_menu;

              }

       case 5:

              {

                     L1=register_vehicle(L1);//调用车辆登记函数

                     system("pause");

                     system("cls");

                     goto main_menu;

              }

       case 6:

              {

                     vehicle_key = "0008";

                     printf("请输入需要注销的车辆编号: ");

                     vehicle_key=getS();

                     delete_vehicle(L1,vehicle_key);//调用车辆注销函数

                     system("cls");

                     goto main_menu;

              }

       case 7:

              {

                     int temp;

                     printf("您确定要退出系统?输入Y确定,输入N返回主菜单\n");

                     temp = quit();

                     if(1 == temp)

                     {

                            SaveData(L1,filename);//保存数据

                            return 0;

                     }

                  else if(0 == temp){

                                   ystem("cls");

                                   goto main_menu;//如果返回真则退出,否则返回主菜单

                           }

                       else

                       {

                                     printf("输入错误!");

                                     system("pause");

                                 }

                        }

       default:

              {

                     system("cls");

                     getchar();

                     goto main_menu;//如果输入不在1-7内,则返回主菜单

              }

       }

       return 0;

}

相关推荐