机房机位预约模拟管理系统设计源代码.docx
- 格式:docx
- 大小:18.32 KB
- 文档页数:7
计算机与通信工程学院实验报告(软件实验用)一、实验目的掌握对复杂系统的建模和编码能力,能在正确建模的基础上编写Java程序实现系统功能。
二、实验内容实现会议室预定系统的建模和编码。
三、实验平台Windows操作系统,四、设计流程1、系统分析会议室预定系统的参与者为公司员工、A/V设备中心;用例图如下所示://设备类public class Device//属性public String deviceName;六、调试和测试结果1、登陆界面员工可先输入姓名,再选择用户类型为员工即可进入员工操作界面,如图1和图2:图1 登陆窗口图2 员工操作窗口2、如果选择预定会议室按钮,会出现调查表的界面,并且其中的员工信息由系统自动写入,用户不需输入。
在其中输入有关的会议室参数,输入完后点击查找即可弹出合适的会议室清单,若点击取消,调查表就会消失,如图3、图4所示:图3 调查表图4 显示可用的会议室列表3、在弹出的可用的会议室列表中选择其中任一个,点击选择按钮,会弹出指定日期和时间窗体,先在左边指定日期,单击选中按钮,右边会出现相应日期中可用的时间范围,选择其中一个,然后在指定会议主题文本域中输入会议的主题,最后点击预定即可按照我们输入选择的这些信息预定我们需要的会议室,如图5:图5 指定日期和时间4、如果在员工操作窗口中点击查询会议室按钮,会弹出图6所示的窗口,在此窗口中输入相应的信息,即可查询出谁在指定的日期和时间预定了特定的会议室,如图7所示:图6 查询窗口图7 查询的指定会议室安排者的信息5、如果在员工操作窗口中点击取消会议室预定按钮,会弹出当前登陆的员工准备参加的所有会议列表,选中其中一个,点击取消预定了按钮即可取消这个会议。
如图8所示:图8 取消会议室预定6、如果是A/V设备中心登陆,只需在用户类型中选择A/V设备中心,点击确定按钮就会弹出一个报表,报表指明12个月周期内特定设备被使用了多少次,如图9、图10:图 9 A/V设备中心登陆图10 设备使用报表七、教师批语与成绩评定1、评分指标评分项目等级(1) 是否遵循建模原则(模型、数据、表示层分离)(2) Java代码编写是否规范(3) 模型评价(4) 程序功能是否完整、细致(5) 系统运行情况(6) 系统难度(7) 完成系统的工作量(8) 编写系统的努力程度(9) 数据库或文件访问功能(10)用户界面。
#include<stdio.h>#include<string.h>#include<time.h>#include<stdlib.h> /*颜色控制*/#define MaxSize 100/*定义1符号常量*/FILE *fp;struct student_info{ int seat; //机号char name[10]; //姓名char zhuangtai[30];long stu_num; //学号int time;char kaishi[10];}StudentList[MaxSize];void denglu();void Search();void Show();void xiugai();void xiaji();void satutation();void luru();void exiit();//主菜单void main(){int i,j;system("color 4D"); //字体和背景颜色for(j=1;j<=100;j++){StudentList[j].time=0; //给所有机子上机时间赋值为0,代表空机 StudentList[j].seat=j; //给所有机子编号 }do{printf("\t\t\t★★★★★★★★★★★★★★★★★\n\n");//显示一个简易菜单printf("\t\t\t ◆◆欢迎使用机房管理系统◆◆ \n\n");printf("\t\t\t★★★★★★★★★★★★★★★★★\n\n");printf("\n");printf("☆¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤☆\n");printf("☆\t\t\t1-- -登陆计算机(denglu)☆\n"); printf("☆\t\t\t2----查询单个上机信息(Search)☆\n");printf("☆\t\t\t3----显示所有使用者信息(Show)☆\n");printf("☆\t\t\t4----修改电脑使用者信息(xiugai)☆\n");printf("☆\t\t\t5----下机(xiaji)☆\n");printf("☆\t\t\t6----查询某计算机位置(satutation) ☆\n");printf("☆\t\t\t7----计算机信息录入 (luru) ☆\n");printf("☆\t\t\t8----退出(Exiit)☆\n");printf("☆¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤☆\n");printf("请输入要选择功能的代码:\n");scanf("%d",&i); //接受用户的选择switch(i){case 1:denglu(); //调用学生信息输入函数break;case 2:Search(); //调用上机信息查询函数break ;case 3:Show(); //调用上机信息全显示函数break;case 4:xiugai(); //调用上机信息修改函数break;case 5:xiaji(); //调用计费函数break;case 6:satutation();break;case 7:luru();break;case 8: exiit();break;default:printf("错误选择!请重选");break;}}while(i!=8);}/*模块一登陆计算机*/void denglu(){int i,k=0; /*全局变量*/for(i=1;i<=100;i++){if(StudentList[i].time==0) //检测机房是否有空机位 k=0;elsek=1;}if(k!=0){printf("机房已满!");return;}elseprintf("请输入机号:");scanf("%d",&i);if(i>100){printf("请输入小于等于100的数");return;}if(StudentList[i].time!=0){printf("已经有人正在操作此机:");return;}elseprintf("请输入上机者姓名:");scanf("%s",StudentList[i].name);printf("请输入上机者学号:");scanf("%ld",&StudentList[i].stu_num);printf("请输入上机时刻:");scanf("%s",&StudentList[i].kaishi);printf("请输入上机时间:");scanf("%d",&StudentList[i].time);printf("\n\n");FILE *fp;fp=fopen("c:\\上机信息.doc","w");for (i=0;i<100;i++){ if (fwrite(&StudentList[i],sizeof(struct student_info),1,fp)!=1)printf("file write error\n");}fclose(fp);}//模块二查询单个上机信息void Search(){int i;printf("请输入要查询的机号:");scanf("%d",&i);if(StudentList[i].time!=0) //是否上机{printf("姓名:%s\t\t",StudentList[i].name);printf("学号:%ld\t\t",StudentList[i].stu_num);printf("上机时刻:%s\t\t",StudentList[i].kaishi);printf("上机时间:%d\t\t",StudentList[i].time);printf("状态:计算机正在使用");}elseprintf("计算机未使用");printf("\n\n");}//模块三显示所有使用者信息void Show(){int i;printf("\n");printf("机号\t姓名\t学号\t上机时刻\t上机时间\t计算机状态\n");for(i=1;i<=100;i++)if(StudentList[i].time!=0) //判断标准,检索到则输出 {printf("%d\t",StudentList[i].seat);printf("%s\t",StudentList[i].name);printf("%ld\t",StudentList[i].stu_num);printf("%s\t",StudentList[i].kaishi);printf("%d\t\t",StudentList[i].time);printf(" 计算机正在使用\n");}else{printf("%d\t",i);printf("无\t");printf("无\t");printf("无\t\t");printf("无\t\t");printf(" 计算机未使用\n");} printf("\n\n");}//模块四修改上机信息void xiugai(){int i;printf("请输入要修改数据的机号:");scanf("%d",&i);if(StudentList[i].time!=0){printf("请输入姓名:");scanf("%s",StudentList[i].name);printf("请输入学号:");scanf("%d",&StudentList[i].stu_num);printf("请输入上机时刻:");scanf("%s",&StudentList[i].kaishi);("请输入上机时间:");scanf("%d",&StudentList[i].time);}elseprintf("计算机未使用");printf("\n\n");}//模块五下机void xiaji(){int j,m; char a;printf("您是否要下机?\n");L1:;printf("请输入输入y下机,输入其他返回\n");scanf("%s",&a);if(a=='y'||a=='Y'){printf("\n\t请输入您所使用的计算机的序号(1--100):");scanf("%d",&m);for(j=1;j<=100;j++){if(j==m)StudentList[j].time=0; }printf("\n\n");}elsegoto L1;printf("\n\n");}//模块六查询计算机位置void satutation(){ int i,j,k,m=1;char a[20][5];for (i=0;i<20;i++)for (j=0;j<5;j++){a[i][j]=m;m=++m;}printf("请输入查询的机号:");scanf("%d",&k);if(k>100)printf("请输入小于等于100的数");else{ for (i=0;i<20;i++)for (j=0;j<5;j++)if(a[i][j]==k)printf ("该机号对应的计算机在第%d行,第%d列",i+1,j+1);} printf("\n\n");}//模块七计算机信息录入与显示void luru(){int i;int a;printf("\n您是要重新录入计算机信息,还是要查询计算机信息?\t\n"); printf("1: 重新录入计算机信息,\n2: 查询计算机信息\n");scanf("%d",&a);switch(a){case 1:for(i=1;i<=100;i++){ StudentList[i].seat=i;printf("计算机序号:%d",StudentList[i].seat);printf("\n请输入上机者姓名:\n");scanf("%s",StudentList[i].name);printf("请输入上机者学号:\n");scanf("%ld",&StudentList[i].stu_num);printf("请输入上机时刻:\n");scanf("%s",&StudentList[i].kaishi);printf("请输入上机时间:\n");scanf("%d",&StudentList[i].time);printf("输入计算机状态:\n");scanf("%s",&StudentList[i].zhuangtai);printf("\n");}FILE *fp;fp=fopen("c:\\上机信息.doc","w");for (i=1;i<=100;i++){ if (fwrite(&StudentList[i],sizeof(structstudent_info),1,fp)!=1)printf("file write error\n");}fclose(fp);printf("\n\t\t\t\t数据已成功写入\n\t\t\t请按任意键返回主菜单!\n\n\n\n");getchar();break;case 2: fp=fopen("c:\\上机信息.txt","r");printf("\n\n\n\t序号\t姓名\t学号\t上机时刻\t上机时间\t\t\n\n");break;default:printf("请输入1或2 选择相应功能\n");luru();}printf("\n\n\n\n");}//模块八退出系统void exiit(){ char k;printf("您真的要退出本程序吗?\n");printf("输入 n或N将重新进入本程序,输入其他将退出该程序 !\n");printf("请输入: \n");scanf("%s",&k);switch(k){case 'n':main() ;break;default: printf("\n\n\n\n\n=================================感谢您的使用===================================\n 设计者:西安理工大学自动化学院\n\n\n\n\n ");}}。
目录1需求分析 (2)2 概要分析 (2)2.1 上机管理 (2)2.2 排课管理 (2)2.3 帐务管理 (3)2.4 设备管理 (3)2.5 系统功能 (4)2.6 查询统计 (4)2.7 远程监控 (5)3 概要设计 (5)3.1系统拓扑图 (5)3.2 系统结构流程图 (7)4 详细设计 (10)4.1 数据库定义 (10)1需求分析机房管理系统是一套基于图形用户界面(GUI)、下拉菜单以及导航功能相结合模式下的友好操作界面,易学易用。
系统采用服务器/客户机(C/S)方式,方便地实现多用户端、多机房统一管理。
系统功能齐全,可基本实现机房管理规范化、自动化以及信息化。
该系统主要包括:上机管理(教学任务外的业余上机)、排课管理(教学大纲任务、毕业设计、选修课)、帐务管理、设备管理、档案日志管理、查询统计、系统功能、远程监控等几大子系统,具有稳定、实用、操作简便等特点。
2 概要分析2.1 上机管理主要针对业余自由开放机房,提高机房资源利用,方便学生上机,减轻机房老师管理工作量。
实现网络管理与控制,实时辨别及处理上机、下机情况,实时计费,实时处理各种异常情况。
实现业余上机管理规范自动化、流程化。
主要功能如下:1、上机实时计费(上/下机实时辨别、计费)2、上机情况监控(机器使用情况/登陆情况/最近登陆情况/网络监控等)3、异常数据处理(处理非正常下机,断电等异常情况)4、异常上课处理(处理非正常上/下课,断电等异常情况)5、查询统计(查看及统计上机情况:流水帐/上机情况查询/登陆情况查询)6、机房机器使用统计(已登陆机器、未登陆机器、正常通过机器、非正常通过机器)7、监控日志(监控操作人员操作系统软件系统的日志)2.2 排课管理实现机房上机智能、动态排课及上课,满足正规机房教学任务,实现机房正规上课上机课时量化及细化管理。
集中规划教学任务规定上机实习课时,动态安排上机课程、上机地点、上机时间以及上机实习内容,自动管理识别业余上机和正课上机。
1、Program.csusing System;using System.Collections.Generic;using System.Windows.Forms;using xyq20091204;using System.Data.SqlClient;static class Program{///<summary>///应用程序的主入口点。
///</summary>[STAThread]static void Main(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new用户登录());if (SQL_Class.LoginState == 1)data.data.ConnStr = "Data Source=CAE47;Initial Catalog=xyq20091204;Integrated Security=True";Application.Run(new供应商管理信息系统());}}Property_Class.csusing System;using System.Collections.Generic;using System.Text;using ponentModel;namespace xyq20091204{class Property_Class{private string Id;private string Manager;private string Tel;private string Email;private string Addr;[CategoryAttribute("供应商基本信息"), DescriptionAttribute("显示供应商编号")] public string供应商编号{get { return Id; }set { Id = value; }}[CategoryAttribute("供应商基本信息"), DescriptionAttribute("显示负责人")] public string负责人{get { return Manager; }set { Manager = value; }}[CategoryAttribute("供应商基本信息"), DescriptionAttribute("显示联系电话")] public string联系电话{get { return Tel; }set { Tel = value; }}[CategoryAttribute("供应商基本信息"), DescriptionAttribute("显示电子邮箱")] public string电子邮箱{get { return Email; }set { Email = value; }}[CategoryAttribute("供应商基本信息"), DescriptionAttribute("显示通讯地址")] public string通讯地址{get { return Addr; }set { Addr = value; }}}}2、SQL_Class.csusing System;using System.Collections.Generic;using System.Text;using System.Data;using System.Data.SqlClient;namespace xyq20091204{public class SQL_Class{public static int LoginState = 0;public static SqlConnection xyq_con;public static string xyq_sqlcon = "Data Source=CAE47;InitialCatalog=xyq20091204;Integrated Security=True";public static SqlConnection getcon(){xyq_con = new SqlConnection(xyq_sqlcon); //用SqlConnection对象与指定的数据库相连接 xyq_con.Open(); //打开数据库连接return xyq_con; //返回SqlConnection对象的信息}public void con_close(){if (xyq_con.State == ConnectionState.Open) //判断是否打开与数据库的连接{xyq_con.Close(); //关闭数据库的连接xyq_con.Dispose(); //释放xyq_con变量的所用空间}}public SqlDataReader getcom(string SQLstr){getcon(); //打开与数据库的连接SqlCommand xyq_com = xyq_con.CreateCommand(); //创建一个SqlCommand对象,用于执行SQL语句xyq_mandText = SQLstr; //获取指定的SQL语句SqlDataReader xyq_read = xyq_com.ExecuteReader(); //执行SQL语句,生成一个SqlDataReader结果return xyq_read; //返回读取结果}public void getsqlcom(string SQLstr){getcon(); //打开与数据库的连接SqlCommand SQLcom = new SqlCommand(SQLstr, xyq_con);//创建一个SqlCommand对象,用于执行SQL语句SQLcom.ExecuteNonQuery(); //执行SQL语句SQLcom.Dispose(); //释放SQLcom变量的所有空间con_close(); //调用con_close()方法,关闭与数据库的连接}public DataSet getDataSet(string SQLstr, string tableName){getcon(); //打开与数据库的连接SqlDataAdapter SQLda = new SqlDataAdapter(SQLstr,xyq_con);//创建SqlDataAdapter对象,以读取数据库中的信息DataSet xyq_DataSet = new DataSet(); //创建dataset对象SQLda.Fill(xyq_DataSet, tableName); //把读取的数据写入指定的数据表中return xyq_DataSet; //返回DataSet对象的信息}}}3、供应商管理信息系统.csusing System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using xyq20091204;using System.Collections;namespace xyq20091204{public partial class供应商管理信息系统 : Form{SQL_Class SQLClass = new SQL_Class(); //创建一个SQL_Class对象SQLClass,用以调用SQL_Class类中的函数TreeNode SelectNode = new TreeNode(); //创建一个TreeNode对象SelectNode,用以存储被选中的树节点///<summary>///定义一个全局变量,表示左侧的树结构选择的是哪一个///</summary>private string _treeNode = "";public供应商管理信息系统(){InitializeComponent();}private void供应商管理信息系统_Load(object sender, EventArgs e){TreeNode rootnode = new TreeNode("供应商列表", 1, 2); //创建一个TreeNode对象rootnodetreeView1.Nodes.Add(rootnode); //把创建的rootnode添加为treeview1的根节点}private void UpdateTreeview1() // 加载treeview1根节点下面的子节点{treeView1.Nodes[0].Nodes.Clear(); //把根节点下面的子节点全部清除listView1.Items.Clear(); //清除listView1中的数据//创建一个DataSet对象,并把SQL的查询结果赋值给DSetDataSet DSet = SQLClass.getDataSet("select * from 供应商类别表","供应商类别表");DataTable dt = DSet.Tables["供应商类别表"]; //创建一个DataTable对象if (dt.Rows.Count > 0) //如果查询结果表中有数据for (int i = 0; i < dt.Rows.Count; i++){TreeNode node = new TreeNode(dt.Rows[i]["供应商类别名称"].ToString(), 1, 2);//创建一个TreeNode对象,并对node的属性进行赋值 = dt.Rows[i]["供应商类别编号"].ToString();node.Tag = "供应商类别";treeView1.Nodes[0].Nodes.Add(node); //把node添加到根节点上DataSet DS = SQLClass.getDataSet("select 供应商编号, 供应商名称from 供应商信息表where 供应商类别='"+dt.Rows[i][1].ToString ()+"'", "供应商信息表");DataTable dt1 = DS.Tables["供应商信息表"]; //创建一个DataTable对象if (dt1.Rows.Count > 0)for (int j = 0; j < dt1.Rows.Count; j++){TreeNode node1 = new TreeNode(dt1.Rows[j][1].ToString(), 1, 1);//创建一个TreeNode对象,并对node的属性进行赋值 = dt1.Rows[j][0].ToString();node1.Tag = "供应商";node.Nodes.Add(node1);}} SQLClass.con_close(); //关闭数据库连接,释放资源}private void UpdateListview1(string sql) //加载listview1中的数据,其中sql参数表示传递的SQL语句。
1 设计目的机房机位预定系统2 任务概述20台机器,编号1到20,从早八点到晚八点。
两小时一个时间段,每次可预定一个时间段。
功能要求:(1)系统以菜单方式工作(2)查询,根据输入时间,输出机位信息。
(3)机位预定,根据输入的时间查询是否有空机位,若有则预约,若无则提供最近的时间段,另:若用户在非空时间上机,则将用户信息列入等待列表。
(4)退出预定,根据输入的时间,机器号撤销该事件的预定!(5)查询是否有等待信息,若有则提供最优解决方案(等待时间尽量短),若无则显示提示信息。
.........3 模块划分4 主要函数说明及其N-S图1. 主函数:int main(){Menu(); /*当前状态函数*/}void Menu() /*主界面*/{int n,w;do{puts("\t\t****************机房机位预约系统*******************\n");puts("\t\t*************************菜单***************************\n");puts("\t\t\t 1.查询某时间段机位状态"); /*查询某时间段机位状态*/puts("\t\t\t 2.预定空机位"); /*预定空机位*/puts("\t\t\t 3.取消预订"); /*取消预订*/puts("\t\t\t 4.查询等待信息"); /*查询等待信息*/puts("\t\t\t 5.退出"); /*退出*/puts("\t\t********************************************************\n");printf("选择菜单号(1-5):");scanf("%d",&n);if(n<1||n>5){w=1;getchar();}elsew=0;}while(w==1);switch(n){case 1:Situation();break;case 2:Book();break;case 3:Cancel();break;case 4:SearchWaiting();break;case 5:exit(0);break;}getch();}2.机位查询:void Situation(){int time;printf("输在(8-20)范围内的时间:");scanf("%d",&time);if(time<8||time>20){printf("\t时间输入错误!\n");printf("输入在(8-20)范围内的时间:");scanf("%d",&time);}detail(time); /*函数调用*/getchar();Menu();}3.机位预定:void Book(){int time,i=0,x,y;FILE *fp;char c;printf("在(8-20)时间范围内输入你想要预定的时间:");scanf("%d",&time);if(time<8||time>20){printf("\t时间输入错误!\n");printf("\t在(8-20)时间范围内输入你想要预定的时间:");scanf("%d",&time);}detail(time); /*函数调用*/if(sum[T]>0){ if((fp=fopen("waitlist.txt","a"))==NULL){printf("\n无法打开文件!\n");exit(0);}printf("\n\t请输入你想要预定的机号,并且留下你的电话号码!:\n");scanf("%s %s",wait[i].number,wait[i].telephonenumber);for(i=0;i<1;i++)fwrite(&wait[i],sizeof(struct waitlist),1,fp);fclose(fp);/*向文本文档添加一个结构体单元*/printf("\t再次输入你想要预定的时间!\n");scanf("%d",&x);/*sum[T]--; / *预定后该时间段空机位数减1*//*computer[T][x]=1; / *预定后该机状态变为1*/printf("\t预订成功!\n");getchar();Menu();}else{printf("这是在这个时间段内未预定的电脑!\n");for(i=T+1;i<6;i++){ time=9+2*i;detail(time); /*函数调用*/if(sum[T]>0)printf("\tThe latest free time is %d,%d\n",2*i+8,2*i+10);break;}printf("\t你想要预定吗?:y/n?");scanf("%s",&c);getchar();if(c=='Y'||c=='y'){if((fp=fopen("waitlist.txt","r"))==NULL){printf("\n无法打开文件!\n");exit(0);}else{ printf("waitlist:number telephonenumber\n");for(i=0;!feof(fp);i++){fscanf(fp,"%s %s",&wait[i].number,&wait[i].telephonenumber);}fclose(fp);}for(i=0;i<10;i++){ prione(i);}printf("\n\t请输入你想要预定的机号,并且留下你的电话号码!:\n");if((fp=fopen("waitlist.txt","a"))==NULL){printf("\n无法打开文件!\n");exit(0);}scanf("%s %s",wait[i].number,wait[i].telephonenumber);for(i=0;i<1;i++)fwrite(&wait[i],sizeof(struct waitlist),1,fp);fclose(fp); /*若等待,就用文件的方式列出当时的等待列表并提示输入你的等待序号和联系方式*/printf("再次输入电脑的序号!\n");scanf("%d",&y);sum[T]--;computer[T][y]=1;printf("\t好了,请等待我们的电话!\n");Menu();}else Menu();}}N4.取消预定:void Cancel(){int time,number;printf("在(8-20)时间范围内输入你已经预定的时间:");scanf("%d",&time);if(time<8||time>20){printf("\t输入时间错误!\n");printf("\t在(8-20)时间范围内输入你已经预定的时间:");scanf("%d",&time);}else{printf("\t输入你预定的机号:");scanf("%d",&number);}detail(time);/* sum[T]++; / *预定后该时间段空机位数加1*//*computer[T][number]=0; / *预定后该机状态变为0*/printf("\t取消成功!\n");getchar();Menu();}5.查询等待信息:void SearchWaiting(){int time,i;FILE *fp;printf("\tInput time you want to search between(8-20):");scanf("%d",&time);if(time<8||time>20){printf("\tWrong time!\n");printf("\tInput time you want to search between(8-20):");scanf("%d",&time);}else;if((fp=fopen("waitlist.txt","r"))==NULL){printf("\nCannot open file!\n");exit(0);}else{ printf("waitlist:number telephonenumber\n");for(i=0;!feof(fp);i++){fscanf(fp,"%s %s",&wait[i].number,&wait[i].telephonenumber);}fclose(fp);}for(i=0;i<10;i++){ prione(i);}Menu();}5 程序运行数据及其结果1.主菜单:2.机位查询:3.机位预定:4.查询等待信息:6 课程设计心得课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,当今计算机应用在生活中可以说得是无处不在。
机房预约系统课程设计报告Last updated on the afternoon of January 3, 2021课程设计(论文)任务书软件学院软件+ 信控专业 1 班一、课程设计(论文)题目机房机位预约模拟系统的设计与实现二、课程设计(论文)工作自 2017 年 1月 2日起至2017 年 1月6 日止。
三、课程设计(论文) 地点: 南区创新大楼东楼406四、课程设计(论文)内容要求:1.课程设计的目的《数据结构》课程设计是计算机科学与技术专业集中实践性环节之一,是学习完《数据结构》课程后进行的一次全面的综合练习。
目的是要达到理论与实际应用相结合,使学生能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养良好的程序设计技能。
要求能从实际应用问题出发,合理地选择数据结构,设计相应的数据处理算法,并对算法进行必要的分析;合理选择编程工具,实现数据的物理结构和相应的数据处理算法;对算法进行调试和测试,并对调试及测试结果进行分析;针对数据结构及算法的设计、调试及测试过程认真写出设计分析报告。
2.课程设计的要求及任务(1)基本要求1)初步掌握软件开发过程的问题分析、系统设计、程序编码、调试等基本方法和技能。
2)要求从问题需求入手,完成系统的分析与设计,独立完成系统的数据和功能分析,应用《数据结构》知识,设计抽象数据类型、构思算法、完成系统的设计。
3)结合《数据结构》理论知识,编写程序求解指定问题,程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释。
4)认真完成系统的调试与测试工作,测试数据要完备,详细记录测试结果。
5)规范撰写课程设计报告。
(2)课程设计论文撰写要求1)按照书稿的规格撰写打印课程设计论文;2)论文包括任务书、目录、绪论、正文、总结、参考文献、附录等;3)正文中要有问题描述与分析、数据结构的设计、算法的设计、算法的实现、调试分析与结果;4)课程设计论文装订按学校的统一要求完成(3)课设考核1)考勤和态度;2)任务的难易程度及设计思路;3)编码及调试能力;4)论文撰写的水平、格式的规范性。
一、实验名称:航空客运定票系统二、实验内容描述:航空客运订票的业务活动包括:查询航线、客票预定和办理退票等。
试设计一个航空客运定票系统,以使上述业务可以借助计算机来完成。
三、程序设计指导思想:本系统是利用VB6.0作为开发语言,Microsoft access作为后台数据库的航空预订票系统。
主要掌握VB与数据库的连接,从而来完成系统。
四、程序设计1、系统软件总体设计(1)数据库表设计系统数据库中有航班信息表、乘客信息表。
(2)软件结构设计系统软件设计遵循模块化程序设计的思想。
系统程序由订票管理模块、退票管理模块和退出系统模块组成。
(3)功能结构图2、程序框图及必要的说明3、程序总体设计:(1)、新建工程根据需要添加窗体:在界面添加各类控件特别地,添加用来连接数据库的控件1、首先,在“工程”中“部件”中添加Adodc控件和Datagrid控件2、将控件放入窗体设计界面中3、进行Adodc控件主要属性设置点击“下一步”则:选择数据库测试连接记录源设置:3、进行Datagrid控件主要属性设置:将它的DataSource设置为如图示对相关控件进行属性设置(2)、数据库的建立(3)、程序编写五、设计过程(界面)登录系统界面:首页:查询界面:订票界面:退票界面:六、主要程序代码1.登录系统:Private Sub Command1_Click()If Text1.Text = 1 And Text2.Text = 123 Then 用户登录system.Show 调用首页Else 输入不成功时重新清空MsgBox "用户名或密码错误!请重新输入!", , "提示"Text1.Text = ""Text2.Text = ""Text1.SetFocusEnd IfMe.Hide 隐藏窗体End SubPrivate Sub Command2_Click()Me.HideEnd Sub2.首页:Private Sub mnuback_Click() 调用退票窗体back.ShowMe.HideEnd SubPrivate Sub mnubookfind_Click() 调用查询窗体find.ShowMe.HideEnd SubPrivate Sub mnudingpiao_Click() 调用订票窗体book.ShowMe.HideEnd SubPrivate Sub mnuoutme_Click() 退出系统Unload MeEnd Sub3.查询:Dim cnn As New ADODB.ConnectionDim rst As New ADODB.RecordsetPrivate Sub Calendar1_Click() 日历txt_date.Text = Me.Calendar1.ValueEnd SubPrivate Sub cmdfind_Click() 查询程序Dim sQSql As StringIf (Trim(Combo1(0)) = "") Or (Trim(Combo1(1)) = "") ThenMsgBox "请设置查询条件!", vbOKOnly + vbExclamation, "警告"Exit Sub 根据出发地和目的地查询ElsesQSql = "select * from find where fplace = '" & Trim(Combo1(0).Text) & "' and fdes = '" & Trim(Combo1(1).Text) & "'" 查询语句Adodc1.RecordSource = sQSql 显示查询结果Adodc1.RefreshDataGrid1.ReBindEnd IfEnd SubPrivate Sub Cmdout_Click() 退出Me.Hidesystem.Show 重新显示首页End SubPrivate Sub Command1_Click() 调用订票窗体book.Showfind.HideEnd SubPrivate Sub Command2_Click() 显示全部航班Dim s As Strings = "select * from find"Adodc1.RecordSource = sAdodc1.RefreshDataGrid1.ReBindEnd SubPrivate Sub Form_Load() 初始化combobox控件 Dim sSql As StringDim txtSQL As StringDim MsgText As StringDim mrc As ADODB.RecordsetFor i = 0 To 1Combo1(i).ClearNext itxtSQL = "select DISTINCT fplace from find"Set mrc = ExecuteSQL(txtSQL, MsgText)If Not mrc.EOF ThenDo While Not mrc.EOFCombo1(0).AddItem Trim(mrc.Fields(0))mrc.MoveNextLoopElseMsgBox "请先进行航线信息设置!", vbOKOnly + vbExclamation, "警告"Exit SubEnd Ifmrc.ClosetxtSQL = "select DISTINCT fdes from find"Set mrc = ExecuteSQL(txtSQL, MsgText)If Not mrc.EOF ThenDo While Not mrc.EOFCombo1(1).AddItem Trim(mrc.Fields(0))mrc.MoveNextLoopElseMsgBox "请先进行航线信息设置!", vbOKOnly + vbExclamation, "警告"Exit SubEnd Ifmrc.CloseEnd SubPrivate Sub txt_date_GotFocus()Me.Calendar1.Visible = TrueMe.Calendar1.Top = 480Me.Calendar1.Left = 2760End SubPrivate Sub txt_date_LostFocus()Me.Calendar1.Visible = FalseEnd SubPublic Function ExecuteSQL(ByVal SQL As String, MsgString As String) 初始化ExecuteSQLAs ADODB.RecordsetDim cnn As ADODB.ConnectionDim rst As ADODB.RecordsetDim sTokens() As StringOn Error GoTo ExecuteSQL_ErrorsTokens = Split(SQL)Set cnn = New ADODB.Connectioncnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;DataSource=D:\数据库.mdb;Persist Security Info=False"If InStr("INSERT,DELETE,UPDATE", _UCase$(sTokens(0))) Thencnn.Execute SQLMsgString = sTokens(0) & _" query successful"ElseSet rst = New ADODB.Recordsetrst.Open Trim$(SQL), cnn, _adOpenKeyset, _adLockOptimisticSet ExecuteSQL = rstMsgString = "查询到" & rst.RecordCount & _" 条记录 "End IfExecuteSQL_Exit:Set rst = NothingSet cnn = NothingExit FunctionExecuteSQL_Error:MsgString = "查询错误: " & _Err.DescriptionResume ExecuteSQL_ExitEnd Function4.订票:Dim cnn As New ADODB.ConnectionDim rst As New ADODB.RecordsetPrivate Sub init_ado() 初始化cnn和rstDim strcnnSet cnn = New ADODB.Connectionstrcnn = "Provider=Microsoft.Jet.OLEDB.4.0;DataSource=D:\数据库.mdb;Persist Security Info=False"cnn.Open strcnnSet rst = New ADODB.Recordsetrst.CursorType = adOpenKeysetrst.LockType = adLockOptimisticEnd SubPrivate Sub cmd_insert_Click() 订票,即添加Dim xin As Stringinit_adoxin = "select * from book where fdate='" & Val(txtdate.Text) & "' and fname='" & Val(txtname.Text) & "' and fline='" & Val(txtline.Text) & "'and password='" & Val(pass.Text) & "'"rst.Open xin, cnn, , , adCmdTextrst.AddNewrst!fdate = txtdaterst!fline = txtlinerst!fname = txtnamerst!Password = passrst.UpdateAdodc1.RefreshDataGrid1.ReBindtxtdate.Text = ""txtline.Text = ""txtname.Text = ""pass.Text = ""txtdate.SetFocusMsgBox "预订成功!", , "提示"End SubPrivate Sub cmd_refresh_Click() 更新数据Adodc1.RefreshEnd SubPrivate Sub Cmdout_Click() 退出Unload Mesystem.ShowEnd SubPrivate Sub Form_Load()MsgBox "输入提示:每一项为必填内容(格式说明:航班:1 姓名和身份证不能为空)!", , "提示"End SubPrivate Sub Calendar1_Click()txtdate.Text = Me.Calendar1.ValueEnd SubPrivate Sub txtdate_GotFocus()Me.Calendar1.Visible = TrueMe.Calendar1.Top = 120Me.Calendar1.Left = 2640End SubPrivate Sub txtdate_LostFocus()Me.Calendar1.Visible = FalseEnd Sub5.退票:Dim cnn As New ADODB.ConnectionPrivate Sub Calendar1_Click()tdate.Text = Me.Calendar1.ValueEnd SubPrivate Sub cmdback_Click() 退票,即删除Dim s As Strings = "delete * from book where password ='" & Val(tpass.Text) & "'"cnn.Execute sAdodc1.RefreshDataGrid1.ReBindMsgBox "成功退票!", , "提示"End SubPrivate Sub Command2_Click()Unload Mesystem.ShowEnd SubPrivate Sub Form_Load()cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\数据库.mdb;Persist Security Info=False"MsgBox "请输入您的退票信息(格式说明:航班:1 姓名和身份证不能为空)!", , "提示"End SubPrivate Sub tdate_GotFocus()Me.Calendar1.Visible = TrueMe.Calendar1.Top = 240Me.Calendar1.Left = 2280End SubPrivate Sub tdate_LostFocus()Me.Calendar1.Visible = FalseEnd Sub七、设计总结1、设计心得通过将近两周的时间来实现这个“航空预订票系统”,我学习到了很多知识,同时也对我的专业有了更进一步的认识和了解。
目录一、概述 (1)二、系统分析 (1)1.航班信息的查询与检索 (1)2.航班信息查询与检索数据结构理论 (1)三、概要设计 (2)1.系统的功能 (2)2.系统模块分析及其流程图 (3)四、详细设计 (6)1.各函数说明 (6)2.定义相关数据类型 (8)3.航班信息的查询 (9)五、运行由于测试 (11)六、总结与心得 (16)参考文献 (16)附录 (16)一、概述随着信息产业的飞速发展, 信息化管理及查询已经进入并应用到各行各业, 影响着人们的价值观念和生活方式。
因此, 要提高企业信息化建设, 利用先进的办公自动化系统来实现企业内部信息管理、共享及交流, 从而提高企业综合实力。
本次设计是针对航班的查询系统, 该设计要求对飞机航班信息进行排序和查询。
可按航班的航班号、起点站、终点站等信息进行航班信息的查询。
二、系统分析1.航班信息的查询与检索进入系统后, 首先提示输入航班的信息, 包括: 航班号、起点站、终点站、班期、起飞时间、到达时间、飞机型号及票价等, 票价为整型, 其他为字符型。
当输入完一个信息后会提示是否继续输入, 重复以上步骤输入全部的信息。
进入主菜单后会给出用户操作的界面, 根据提示进行航班信息的查询。
2.航班信息查询与检索数据结构理论针对在本该类系统中的数据的处理情况, 本系统采用二分查找法、基数排序法、最高位优先法。
二分查找法也称为折半查找法, 它充分利用了元素间的次序关系, 采用分治策略, 可在最坏的情况下用O(log n)完成搜索任务。
它的基本思想是, 将n 个元素分成个数大致相同的两半, 取a[n/2]与欲查找的x作比较, 如果x=a[n/2]则找到x, 算法终止。
如果x<a[n/2], 则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。
如果x>a[n/2], 则我们只要在数组a的右半部继续搜索x。
对航班号的排序是采用的基数排序法。
基数排序法又称“桶子法”(bucket sort)或bin sort, 顾名思义, 它是透过键值的部份资讯, 将要排序的元素分配至某些“桶”中, 藉以达到排序的作用, 基数排序法是属于稳定性的排序, 其时间复杂度为O (nlog(r)m), 其中r为所采取的基数, 而m为堆数, 在某些时候, 基数排序法的效率高于其它的比较性排序法。
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>#include<iostream.h>#define MAX 2 //机房电脑总数#define S(r) (r-8)/2#define shijian(g) g*2+8typedef struct Cell{int CNum; //CNum表示这个时间段已预订的机器数struct Student *head;//这是表示这个时间段预订的机器的链表的第一个节点指针struct Student *last;}Cell;Cell TimeQueue_yuding[7][6];//七天,每天分为六个时间段,预订到电脑的队列Cell TimeQueue_paidui[7][6];//七天,每天分为六个时间段,排队队列typedef struct Student{// int times;//次数char number[10];//学号int locat;//机器号int day;//星期几int time;//时间struct Student *next;}Student;char *change(int n){char c[5];switch(n){case 0:strcpy(c,"日");break;case 1:strcpy(c,"一");break;case 2:strcpy(c,"二");break;case 3:strcpy(c,"三");break;case 4:strcpy(c,"四");break;case 5:strcpy(c,"五");break;case 6:strcpy(c,"六");break;}return c;}int Ture(int m,int n){if(m<0||m>6){printf("输入的时间(星期几)非法!请重新输入:\n");return 0;}else if(n<8||n>20){printf("您输入的时间(几点钟)不在上班时间内,请重新输入:\n");return 0;}elsereturn 1;}void waiting(int m,int n){char Infor[10];struct Student *Rem;printf("请输入你的学号\n");scanf("%s",Infor);if(TimeQueue_yuding[m][n].CNum+1<MAX){printf("此时间段有空余电脑,不需要排队!\n");return;}else if(TimeQueue_paidui[m][n].head==NULL){Rem=(Student *)malloc(sizeof(struct Student));strcpy(Rem->number,Infor);Rem->locat=1;Rem->day=m;Rem->time=n;Rem->next=NULL;TimeQueue_paidui[m][n].head=Rem;TimeQueue_paidui[m][n].last=Rem;TimeQueue_paidui[m][n].CNum++;printf("成功排队,在你之前有%d人在排队\n",Rem->locat-1);}else{Rem=(Student *)malloc(sizeof(struct Student));strcpy(Rem->number,Infor);Rem->locat=TimeQueue_yuding[m][n].CNum+1;Rem->day=m;Rem->time=n;Rem->next=NULL;TimeQueue_paidui[m][n].last->next=Rem;TimeQueue_paidui[m][n].last=Rem;TimeQueue_paidui[m][n].CNum++;printf("成功排队,在你之前有%d人在排队\n",TimeQueue_paidui[m][n].CNum-1);}}void inquir_waiting() //查询等待信息{Student *p;int m,n,t,k;char c1[5],c2[5];printf("查找全部请输入1;查找部分请输入2\n");scanf("%d",&t);switch(t){case 1:for(m=0;m<7;m++)for(n=0;n<6;n++){strcpy(c1,change(m));if(TimeQueue_yuding[m][n].CNum<MAX){printf("星期%s在%d到%d时间段内有%d台未被预订的电脑\n",c1,shijian(n),shijian(n)+2,MAX-TimeQueue_yuding[m][n].CNum);}else{printf("星期%s在%d到%d时间段内预订已经满,有%d人在排队\n",c1,shijian(n),shijian(n)+2,TimeQueue_paidui[m][n].CNum);printf("排队学生学号为:\n");p=TimeQueue_paidui[m][n].head;for(k=0;k<TimeQueue_paidui[m][n].CNum;k++){printf("%s\t",p->number );p=p->next ;}}}break;case 2:printf("输入想要查询的时间(0代表星期日;1代表星期一.......6代表星期六)\n");scanf("%d",&m);printf("输入想要查询的时间(24 hours 8~20o'clock,include 8 o'clock)\n");scanf("%d",&n);n=S(n);strcpy(c2,change(m));if(TimeQueue_yuding[m][n].CNum<MAX)printf("星期%s在%d到%d时间段有%d台未被预订的电脑\n",c2,shijian(n),shijian(n)+2,MAX-TimeQueue_yuding[m][n].CNum);elseprintf("星期%s在%d到%d时间段预订已经满,有%d人在排队\n",c2,shijian(n),shijian(n)+2,TimeQueue_paidui[m][n].CNum);break;}}void booking(int m,int n) //预订机位{int k,i,j;char c1,c3,c2,c4,c5[5],c6;char Infor[10];//学号Student *Rem;if(TimeQueue_yuding[m][n].CNum>=MAX){printf("此时间段没有空余电脑!你是否愿意在此时间段排队?,(输入y表排队,输入其他字符表退出)\n");printf("警告!如果你要排队,在没有足够人取消预订定的情况下,你可能不能预订到机位\n");k=m;for(i=k;i<7;i++)for(j=0;j<6;j++){if(TimeQueue_yuding[i][j].CNum<MAX){strcpy(c5,change(i));printf("星期%s在%d到%d时间段有%d个空机位,是否愿意更改预定时间,y/n?\n",c5,shijian(j),shijian(j)+2,MAX-TimeQueue_yuding[i][j].CNum);scanf("%c",&c2);scanf("%c",&c2);if(c2=='y')booking(i,j);if(TimeQueue_yuding[i][j].CNum<MAX){printf("还有%d台电脑,是否想继续在这个时间段预订,是输入y,退出输入t,否输入其他字符,/n?\n",MAX-TimeQueue_yuding[i][j].CNum);scanf("%c",&c6);scanf("%c",&c6);if(c6=='y')booking(i,j);if(c6=='t')return;}}printf("退出自动查询请输入y,否则输入其他字符:\n");scanf("%c",&c4);if(c4=='y')return;}scanf("%c",&c1);scanf("%c",&c1);if(c1=='y')waiting(m,n);else{printf("是否愿意查看预订时间表,y/n?\n");scanf("%c",&c3);scanf("%c",&c3);if(c3=='y')inquir_waiting();}}else{printf("请输入你的学号:\n");scanf("%s",Infor);if(TimeQueue_yuding[m][n].head==NULL){Rem=(Student *)malloc(sizeof(struct Student));strcpy(Rem->number,Infor);Rem->locat=1;Rem->day=m;Rem->time=n;Rem->next=NULL;TimeQueue_yuding[m][n].head=Rem;TimeQueue_yuding[m][n].last=Rem;TimeQueue_yuding[m][n].CNum++;printf("成功预定,机号为%d\n",TimeQueue_yuding[m][n].CNum);}else{Rem=(Student *)malloc(sizeof(struct Student));strcpy(Rem->number,Infor);Rem->locat=TimeQueue_yuding[m][n].CNum+1;Rem->day=m;Rem->time=n;Rem->next=NULL;TimeQueue_yuding[m][n].last->next=Rem;TimeQueue_yuding[m][n].last=Rem;TimeQueue_yuding[m][n].CNum++;printf("成功预定,机号为%d\n",Rem->locat);}}}void inquir(int m,int n)//查询空机位{char c1,c2,c3;if(TimeQueue_yuding[m][n].CNum<=MAX){printf("有%d个空机位,你是否想预订(输入y表预订,输入其他的字符表退出)\n",MAX-TimeQueue_yuding[m][n].CNum);scanf("%c",&c1); scanf("%c",&c1);if(c1=='y')booking(m,n);elsereturn;}else{printf("没有空机位,当前时间段有%d人在排队",TimeQueue_paidui[m][n].CNum);printf("你是否想在这个时间段排队?,(输入y表排队,输入其他字符表退出)\n");printf("警告!如果你要排队,在没有足够人取消预订定的情况下,你可能不能预订到机位\n");scanf("%d",&c2);scanf("%d",&c2);if(c2=='y')waiting(m,n);else{printf("是否愿意查看预订时间表,y/n?\n");scanf("%c",&c3);scanf("%c",&c3);if(c3=='y')inquir_waiting();}}}void Inquir() //查询已预订机位{char a[10],c[5];int m,n,t=0;Student *p;printf("请输入学号:\n");scanf("%s",a);for(m=0;m<7;m++)for(n=0;n<6;n++){p=TimeQueue_yuding[m][n].head;while(p!=NULL){if(!strcmp(p->number,a)){if(t==0){printf("预订的机位信息为:\n");t=1;}strcpy(c,change(p->day));printf("星期%s在%d到%d时间段\n",c,shijian(p->time),shijian(p->time));}p=p->next;}}if(t==0)printf("你没有成功预订的机位!\n");}void cancel(int m,int n) //取消预订{char c;int t=0,i;char Infor[10];struct Student *Rem;struct Student *q;loop:printf("Please input your Nobel!\n");scanf("%s",Infor);Rem=TimeQueue_yuding[m][n].head;q=Rem;for(i=1;Rem!=NULL;q=Rem,Rem=Rem->next,i++){if(!strcmp(Rem->number,Infor)){if(TimeQueue_paidui[Rem->day][Rem->time].head!=NULL){strcmp(Rem->number,TimeQueue_paidui[Rem->day][Rem->time].head->number);TimeQueue_paidui[Rem->day][Rem->time].head=TimeQueue_paidui[Rem->day][Rem->tim e].head->next;TimeQueue_paidui[Rem->day][Rem->time].CNum--;}else{TimeQueue_yuding[Rem->day][Rem->time].head=TimeQueue_yuding[Rem->day ][Rem->t ime].head->next;TimeQueue_yuding[Rem->day][Rem->time].CNum--;}t=1;}}if(t==0){printf("输入学号没有预订,是否再次输入:y/n?\n");scanf("%c",&c);scanf("%c",&c);if(c=='y')goto loop;return;}elseprintf("已取消预订!\n");}void newline(int n) /*此函数的作用是空行,若输入n就输出n行*/ {int i;for(i=1;i<=n;i++)printf("\n");}void space(int n) /*此函数的作用是留空白,输入n就输出n个空白*/ {int i;for(i=1;i<=n;i++){printf(" ");}}void main(){char c;int n,m,i,j,k;for(i=0;i<7;i++)for(j=0;j<6;j++){TimeQueue_paidui[i][j].CNum=0;TimeQueue_paidui[i][j].head=NULL;TimeQueue_paidui[i][j].last=NULL;TimeQueue_yuding[i][j].CNum=0;TimeQueue_yuding[i][j].head=NULL;TimeQueue_yuding[i][j].last=NULL;}while(1){space(20);printf("*********Menu*********\n");printf("1. 查询预定的机位\n2. 查询空机位\n3. 预定\n4. 取消预定\n5. 排队\n6. 查询等待者时间列表\n0. 退出\n");printf("请输入序号!:\n");space(20);printf("**********************\n");printf("请选择:\n");scanf("%d",&k);switch(k){case 1:Inquir();break;case 2:loop1:printf("输入想要查询的时间(0代表星期日;1代表星期一.......6代表星期六)\n");scanf("%d",&m);printf("输入想要查询的时间(24 hours 8~20o'clock,include 8 o'clock)\n");scanf("%d",&n);if(Ture(m,n)){n=S(n);inquir(m,n);}else{goto loop1;}break;case 3:loop2:printf("输入想要预订的时间(0代表星期日;1代表星期一.......6代表星期六)\n");scanf("%d",&m);printf("输入想要预订的时间(24 hours 8~20o'clock,include 8 o'clock)\n");scanf("%d",&n);if(Ture(m,n)){n=S(n);booking(m,n);}else{goto loop2;}break;case 4:loop3:printf("输入想要取消的时间(0代表星期日;1代表星期一.......6代表星期六)\n");scanf("%d",&m);printf("输入想要取消的时间(24 hours 8~20o'clock,include 8 o'clock)\n");scanf("%d",&n);if(Ture(m,n)){n=S(n);cancel(m,n);}elsegoto loop3;break;case 5:loop4:printf("输入想要排队的时间(0代表星期日;1代表星期一.......6代表星期六)\n");scanf("%d",&m);printf("输入想要排队的时间(24 hours 8~20o'clock,include 8 o'clock)\n");scanf("%d",&n);if(Ture(m,n)){n=S(n);waiting(m,n);;}elsegoto loop4;break;case 6:inquir_waiting();break;case 0:exit(0);default:printf("error\n");}printf("按Eeter继续:\n");scanf("%c",&c);scanf("%c",&c);system("cls");}}。
.#include<stdio.h>#include<stdlib.h>#include<string.h>#define SJD 6 /*宏定义定义SJD Z NULL D(r)*/#define Z 20#define D(s) (s-8)/2 /*将输入的时间划分时间段;分别为0,1,2,3,4,5时间段*/ #define NULL 0struct xinxi{int jihao;char xuehao[20];struct xinxi *next;}; /*结构函数包含学生信息:机位,学号,还有下名学生信息*/struct cell{int RS; /*RS 表示总人数 */struct xinxi *first; /* struct xinxi *middle; /* struct xinxi *last; /*} DUILEI[SJD]; /* 学生时间(生*/ /*************************** void yuding(){int n;char m[20]; /*学号*/ struct xinxi *R;struct xinxi *p;第一个预订者记录*/等待队列列表*/最后预订者记录*/SJD)段顺序:人数,第一名学生,排队的学生,最后一名学预定模块 ******************************/printf("输入想要预定的时间\n");scanf("%d",&n);if(n>=8&&n<20){n=D(n); /*将输入的时间划分时间段*/if(DUILEI[n].RS<Z) /*还有机位可供预订*/{printf("请输入你的学号\n");scanf("%s",m);if(DUILEI[n].first==NULL) /*还没有人预订*/{R=(struct xinxi *)malloc(sizeof(struct xinxi));/*给R划分适当的内存*/ R->jihao=1;strcpy(R->xuehao,m); /*将输入的学号复制到R->xuehao */R->next=NULL;DUILEI[n].first=R;DUILEI[n].last=R;DUILEI[n].RS++;printf("成功预定 \n");}else{R=(struct xinxi *)malloc(sizeof(struct xinxi));strcpy(R->xuehao,m); /*将输入的学号复制到R->xuehao */R->next=NULL;p= DUILEI[n].last; /*将最后预订记录赋值给p*/R->jihao= DUILEI[n].RS+1;printf("%d",R->jihao); /*表示该时间段第几位预订*/DUILEI[n].last=R; /*将当前的记录做为最后记录以便形成链表形式指向下一个 */p->next=R;DUILEI[n].RS++; /*记录人数*/printf("预定成功 \n");}}else printf("没有空余机位!\n");}else printf("错误.请输入8~19,再次输入.\n");}/*********************************查询空位模块***********************************/void chaxunkongwei(){int n;printf("输入想要查询的时间(8~19 点,包括8 点)\n");scanf("%d",&n);if(n>=8&&n<20){n=D(n);if(DUILEI[n].RS<Z)printf("这里还有 %d台空电脑 !\n",Z-DUILEI[n].RS);else printf("对不起.没有空余机位!\n");}else printf("错误,请输入8~19,再次输入.\n");}/*********************查询预定机位模块*************************************/void chaxunyuding(){int n;char m[20];struct xinxi *R;printf("输入查询时间 (8~19 点,包括8 点 )\n");scanf("%d",&n);if(n>=8&&n<20){n=D(n);printf("请输入学号 \n");scanf("%s",m);R= DUILEI[n].first; /*将第一名学生的信息赋予R*/if(DUILEI[n].first==0) printf("还没有人预定\n"); /*判断有没有人预订,如果还没有人预订,则输出还没有人预定*/else{for(;R->next!=NULL;R=R->next)/*从第一名学生开始查询直到找到符合的学号,以便确认是否预订*/if(strcmp(R->xuehao,m)==0)break;if(R->jihao!=0) /*已预订,输出相应的信息*/printf("你的机位是 %d\n",R->jihao);else printf("对不起.你依旧在等待列表中或者没有预定");}}else printf("错误,请再次输入.\n");}/*****************************排队系统模块**************************************/void paiduixitong(){int n;char m[20];struct xinxi *R; struct xinxi *p;printf("请输入想要排队的时间\n");scanf("%d",&n);if(n>=8&&n<20){n=D(n);if(DUILEI[n].RS>=Z) /*该时间段没有空位机,需要预订等待*/{printf("请输入你的学号\n"); scanf("%s",m);if((DUILEI[n].RS)==Z){R=(struct xinxi *)malloc(sizeof(struct xinxi));strcpy(R->xuehao,m);R->next=NULL;R->jihao=0;p= DUILEI[n].last;DUILEI[n].last=R;p->next=R;DUILEI[n].middle=R; /*等待预订列表*/DUILEI[n].RS++;printf("成功排队 \n");}/* 将刚输入学生信息拍到最后一名后,成最后一名*/else{R=(struct xinxi *)malloc(sizeof(struct xinxi));strcpy(R->xuehao,m);R->next=NULL;R->jihao=0;p= DUILEI[n].last;DUILEI[n].last=R;p->next=R;DUILEI[n].RS++;printf("成功排队 \n");}}else printf("有空余机位,无须等待\n");}else printf("错误 . 再次输入 .\n");}/******************************取消预订模块****************************************/void cancel(){int n;int i;char m[20];struct xinxi *R;struct xinxi *q;struct xinxi *p;printf("请输入预定的时间 \n");scanf("%d",&n);if(n>=8&&n<20){printf("请输入你的学号 !\n");scanf("%s",m);n=D(n);R= DUILEI[n].first;q=R;for(i=1;;q=R,R=R->next,i++) /*查找符合信息 */if(strcmp(R->xuehao,m)==0)break;if(i>Z)/*i>z表示在等待列表中 */{if(R->next==NULL){q->next=NULL;DUILEI[n].last=q;free(R);DUILEI[n].RS--;printf("取消成功 !\n"); /*如果是排在20 名后,且是最后一名*/}else{q->next=R->next;free(R);DUILEI[n].RS--;printf("取消成功 !\n"); /*如果排在20名后,但不是最后*/}}else /*正在上机者取消预订*/{if(DUILEI[n].RS>Z){DUILEI[n].middle->jihao=R->jihao;DUILEI[n].middle= DUILEI[n].middle->next;} /*如果排在20名内,但总人数(包括等待列表人数)大于20 */if(i==1) DUILEI[n].first=R->next;else q->next=R->next;free(R);DUILEI[n].RS--;printf("成功取消预定 !\n");}}else printf("错误,请再次输入.\n");}/********************************待机者列表模块****************************/ void daijizheliebiao(){int n;struct xinxi *q;printf("查询其他等待者的预定时间\n");scanf("%d",&n);if(n>=8&&n<20){n=D(n);if(DUILEI[n].RS>Z) /*表示有等待上机者*/{printf("等待列表 :\n");q=DUILEI[n].middle;for(;q->next!=NULL;q=q->next)printf("%s\n",q->xuehao);/* 逐个输出等待列表者信息*/printf("%s\n", DUILEI[n].last->xuehao);}else printf("这个时间段没有预定者\n");}else printf("错误。