资源描述
软件技术课程设计车票管理系统一 目的通过课程设计,加深对C语言程序设计和数据结构课程所学知识的理解,熟练掌握和巩固C语言的基本知识和语法规范,包括:数据类型(整形、实型、字符型、指针、数组、结构等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(顺序结构、判断选择结构、循环结构);库函数应用等;复杂任务功能分解方法(自顶向下逐步求精、模块化设计、信息隐藏等),熟练掌握和巩固三种基本的数据结构(线性结构、树形结构、图形结构)的逻辑结构、存储结构以及相关运算和应用。学会编制结构清晰、风格良好、数据结构适当的C语言程序,从而具备利用计算机编程分析解决综合性实际问题的初步能力二 需求分析1、首先本演示程序要实现录入班次信息的功能,并且要用文件来保存这些信息,还可以不定时的增加班次数据。2、需要浏览班次信息是可以一次性输出当前的班次状况,并且要从实际考虑,若当前系统时间已经超过了某班次的发车时间,则要显示“此班已发出”的提示信息。3、此程序既为车票管理系统,就要实现查询路线、售票、退票等功能。当使用查询路线功能时,要分两种情况:按班次号查询和按终点站查询。若使用售票功能,则只有在查询出已定票人数小于额定载量且当前系统时间小于发车时间时才能售票,并且要自动跟新已售票人数。退票要输入退票的班次,当本班车尚未出发时才能退票,也要自动更新已售票人次。4、演示程序以用户和计算机的对话方式执行,即在计算机的屏幕上显示“提示信息”下,用户根据自己的意愿自行操作,每次测试完毕,新增加的班次信息要保存在data.txt文件中。三 概要设计1、本程序各个模块的功能及调用关系:(1)主程序模块main()函数:此主程序的主要目的是用来调用读取文件函数、功能菜单函数以及保存文件信息函数。(2)文件读入与保存函数read()、save()以及功能菜单MainMenu()函数:这三个函数的主要目的是为了读取文件,保存文件和为用户创造一个功能菜单以便于用户的操作。(3)在MainMenu()函数中调用的各级功能函数:这个模块中有六个函数,MainMenu()函数调用这六个函数来分别实现增加班次、浏览班次信息、查找班次、售票、退票、退出的功能。 2、程序中出现的数据类型定义及含义:本程序采用链表存储相关信息,定义如下typedef struct Node int num; /班次号 int sTimeH, sTimeM; /发车时间(小时sTimeH和分钟sTimeM) int sumSeat, soldSeat; /总座位数, 已订票人数 float lastTime; /行车时间 char begin20, end20; /起始站,终点站 struct Node * next; /指向下一个节点Node, * LinkedNode; 四 详细设计读文件开始主菜单getch()=?1增加2查看3查询4售票5卖票结束ESC存储用全局变量List保存链表的头结点LinkedNode List;ShowHead()、ShowNode(Node * p);这两个函数用于显示链表信息: ShowHead()输出航班、发车时间、站点等标题信息; ShowNode()输出链表中存储的确切信息。Read()函数读取文件信息并存入链表:定义一个指针*fp指向所要打开的文件,List = (LinkedNode)malloc(sizeof(Node);LinkedNode p = List; 为头结点申请空间并用p指向头结点;fseek()函数来移动*fp指针;ftell()函数返回指针;然后用fscanf()从文件中输入信息。最后用fclose(fp)来关闭文件。Save()函数将链表存储的信息存进文件并释放所占空间: 用fopen()函数打开fp指向的文件; 然后用fprintf()函数输出链表信息并存到文件里; 最后用fcolse(fp)关闭文件。IsSetOff(Node * p)函数用于判断班次是否已经出发:time_t t; time(&t);struct tm * timeinfo = localtime(&t)获取系统时间,然后与班次出发时间比较并将结果用return()函数返回。 Add()函数是增加一个班次:LinkedNode p = List;定义p指向头结点;然后用malloc()函数为结点申请空间;用scanf()函数输入各种信息;ShowHead(); ShowNode(p); 输出新增加的班次信息。Lookup()函数显示各班次信息:if (IsSetOff(p) printf(nn此班已出发);ShowNode(p);p = p-next; 依次显示文件中的班次信息。SearchPath()函数查询路线:int n; printf(请输入要出售的车票班次:); scanf(%d, &n); 按班次号来售票;char ch20; printf(请输入终点站:); scanf(%s, &ch);按终点站来查询。SaleTicket()、ReturnTicket()函数用来卖票退票:if (IsSetOff(p) printf(此班已出发!n); 此时班次出发时间超过系统时间;+p-soldSeat; printf(售票成功n);ShowHead();ShowNode(p);输出卖票后的该班次信息。退票功能的实现与以上功能相似,+p-soldSeat改成-p-soldSeat表示退票后soldSeat数减少一个。Quit()函数退出:MainMenu()函数是主菜单,各个功能的选择:switch(getch() 用一个switch函数来选择一个功能;用getch()从键盘输入一个数字来选择功能。主函数void main()主函数来调用Read()、MainMenu()、Save()三个函数;实现从文件读取信息,打开主菜单,保存信息到文件中的功能。五 调试分析1、该程序的关键是用一个结构体来存储每个班次的各种信息,然后建立一个单链表存储所有的班次。要注意的是正确的定义头结点指针,还有保证每次循环都能正确的进行下去。只有保证这些细节都正确,程序才能正常的运行。2、在设计程序的时候要设计多个模块,比如程序中的查询、售票、退票、功能菜单等,最后用一个主函数来调用其他的函数,我在调试时发现每次卖票后都不能正常的返回,经检查后才发现是因为掉了一句p=p-next,所以在以后写程序时都要认真仔细,这样才不至于在调试程序的时候出现问题,浪费很多时间。3、在写这个程序的时候,调试过程中发现了很多错误,这样很不容易修改,所以最好循序渐进,认真写好每一个程序,检查后再写下一个,这样更能保证整个程序的正确性,也便于随时调整。4、在调试的过程中同样出现文件写入和读出的问题,所以文件的格式必须熟练掌握,这样才能正确的实现功能,达到目的。六 测试结果1、将程序在VC6中打开后点击编译、运行后出现主界面如下图:2、我们先查看已有的班次,选择2,则出现下图:3、按任意键返回主菜单,然后我们选择增加一个班次,选择1,根据提示分别输入班次:5、发车时间:22:30、起始站:武汉、终点站:南京、行车时间3.5、额定载量:50则出现下图:此时按任意键返回主菜单,再选择2查看班次,我们发现班次5已经增加进去了,如图:4、按任意键返回主菜单选择3查询功能,则出现按班次号查询和按终点站查询,我们先选择1并输入3,则会出现班次3的信息如图:然后我们选择2继续按终点站查询,输入南京,则会显示如图:5、按ESC返回主菜单选择4售票,然后输入要购买的班次号,若该班次已发出,则会显示:此班已出发。否则显示售票成功,并输出该班次的信息:,6、现在我们按任意键返回主菜单并选择5,实现退票功能,输入要退票的班次,我们输入5,则显示如图:此时我们发现已经退票成功。7、若想退出,则按ESC,显示如图:七 用户使用说明1、本程序可以在VC6的环境下运行。2、程序运行后,会自动从文件读取数据,并出现功能菜单用户要根据自己的意愿自己选择所要执行的功能,每次用户选择功能后都会有提示输入信息,用户只需根据提示输入信息便可轻松使用各种功能。3、当用户使用完并退出后,新增加的班次信息会自动保存在data.txt八 课程设计总结通过本次的课程设计,让我又重新拿起了程序设计和数据结构课本,好好的复习了一下以前学过的知识。对循环结构、指针、结构体,函数调用,switch语句, for循环语句等有了更为系统的了解,也学会了制作流程图,明白了一个设计精良的程序要的不仅是它的正确输出结果,还要有简明可靠地思路,良好的稳定性等。通过这次课程设计,让我能把相关的知识联系起来解决要解决的问题。更为重要的是,经过这次课程设计,我学会了要有模块化的思想进行程序设计,提高了对问题的分析和解决能力。增强了程序设计过程中对程序的调试能力,知道如何解决调试过程中遇到的问题,从中提高对问题分析的能力。总之,设计程序是一件很需要毅力的事,不仅让我懂得了一个程序设计者基本的工作素质要求,也让我懂得今后无论做什么事情都需要决心、耐心、细心、专心、恒心、信心。11
展开阅读全文