华中科技大学课程设计--C语言课程设计-- 列车时刻表信息管理系统

这篇博客介绍了华中科技大学的一次课程设计项目,内容涉及使用C语言编写列车时刻表信息管理系统。作者分享了设计文档的GitHub链接,并提供了C语言代码实现详情。
摘要由CSDN通过智能技术生成

设计文档:GitHub传送门
C语言代码:

/************************************************************************/
/*   项目名称:列车时刻表信息管理系统
/*   最后修改时间:2016-09-24
/*   开发环境: VC6.0;
/*   作者:QJW                                                        
/************************************************************************/

#include <stdio.h>
#include "info.H"
#include <malloc.h>
#include <windows.h>

int main()
{
   
	while(1)
	{
   
		
		Menu();	
		system("pause");

	}
	
	return 0;
}

/**
*	函数名称:Menu
*   函数功能:显示菜单
*	输入参数:无
*	返回值:无
**/
void Menu()
{
   

	int option = 0;

	//修改控制台标题
	system("title 列车时刻表信息管理系统");
	//设置控制台尺寸
	system(WIN_SIZE);
	
	//把背景设置为 浅绿色
	system("color 3e");

	//显示主菜单
	showMenu(0);
}
int Scanf(int left,int top)
{
   
	int option;

	setTop(top);
	setLeft(left);
	printf("请选择:");
	scanf("%d",&option);
	
	return option;
}
/**
*	函数名称:showMenu
*   函数功能:显示菜单
*	输入参数:option选项值
*	返回值:选项序号
**/
int showMenu(int option)
{
   

	
	//选项item
	int select;
	//主菜单list
	char *title[]={
   "数据管理","数据查询","数据统计","退出系统",""};
	//数据管理list
	char *title_data[]={
   "车次管理","经停车站管理","经停车站信息管理","返回主菜单","退出系统",""};
	//车次管理list
	char *title_trains[]={
   "新增车次","修改车次","删除车次","返回上一级菜单","返回主菜单","退出系统",""};
	//经停车站list
	char *title_stops[]={
   "新增经停车站","修改经停车站","删除经停车站","返回上一级菜单","返回主菜单","退出系统",""};
	//经停车站信息
	char *title_stops_inf[]={
   "新增经停车站信息","修改经停车站信息","删除经停车站信息","返回上一级菜单","返回主菜单","退出系统",""};
	//查询
	char *query_list[]={
   "简单列表","复合查询","返回主菜单","退出系统",""};
	//简单列表
	char *query_simple_list[]={
   "车次列表","车次经停站列表","经停站列表","返回上一级菜单","返回主菜单","退出系统",""};
	switch(option) {
   
	case 0:
		//主菜单
		drawMenu(title,50,10,2,true);

		load();//加载数据

		select = Scanf(50,0) ;
		
		if(select == 1) showMenu(1);
		if(select == 2) showMenu(3);
		if(select == 3) tongji();
		if(select == 4) exit(0);

		break;
	case 1:
		//数据管理
		drawMenu(title_data,50,10,2,true);
		select = Scanf(50,0) ;
		
		if(select == 1) showMenu(2);
		if(select == 2) showMenu(4);
		if(select == 3) showMenu(5);
		
		break;
	case 2:
		//车次管理
		system("cls");
		drawMenu(title_trains,50,10,2,true);
		select = Scanf(50,0) ;
		if(select == 1) add_train();
		if(select == 2) change_train();
		if(select == 3) delete_train();
		if(select == 4) showMenu(1);
		if(select == 5) showMenu(0);
		if(select == 6) exit(0);
		
		break;
	case 3:
		drawMenu(query_list,50,10,2,true);
		select = Scanf(50,0) ;

		if(select == 1) showMenu(6);
		if(select == 2) sigle(1);
		if(select == 3) showMenu(0);
		if(select == 4) exit(0);

		break;
	case 4:
		//经停车站管理
		drawMenu(title_stops,50,10,2,true);
		select = Scanf(50,0) ;

		if(select == 1) add_stop();
		if(select == 2) change_stop();
		if(select == 3) delete_stop();
		if(select == 4) showMenu(1);
		if(select == 5) showMenu(0);
		if(select == 6) exit(0);
		break;
	case 5:
		//经停车站信息	
		drawMenu(title_stops_inf,50,10,2,true);
		select = Scanf(50,0) ;

		if(select == 1) add_stop_inf();
		if(select == 2) change_stop_inf();
		if(select == 3) delete_stop_inf();
		if(select == 4) showMenu(1);
		if(select == 5) showMenu(0);
		if(select == 6) exit(0);

		break;
	case 6:
		drawMenu(query_simple_list,50,10,2,true);
		select = Scanf(50,0) ;
		
		if(select == 1) simple_list(1);
		if(select == 2) simple_list(2);
		if(select == 3) simple_list(3);
		if(select == 4) showMenu(3);
		if(select == 5) showMenu(0);
		if(select == 6) exit(0);
		break;
	}
	
	return option;
}
/**
*	函数名称:drawMenu
*   函数功能:绘制一个菜单
*	输入参数:
*			str:选项名称  多个选项用空格隔开(如:"数据管理","数据查询","数据统计","退出系统","")
*			left(>0): 列表与左边的宽度  按空格计算  
*			top(>0): 列表离顶端的高度   按行计算
*			line_height(>0):行高
*			line_flag(true|false):是否显示行标号
*	返回值:列表项目数量
**/
int drawMenu(char *str[],int left,int top,int line_height,bool line_flag)
{
   
	int i = 0,j,k,p;
	int count = 1;
	int max=0;
	int maxStrLength = 0;
	int last;

	//
	while(strcmp(str[i],"")!=0)
	{
   
		max = strlen(str[i]);
		if(max>maxStrLength)
			maxStrLength = max;
		i++;
	}
	i=0;
	system("cls");
	//控制上间距
	setTop(top);
	while(strcmp(str[i],"")!=0)
	{
   
		//控制左间距
		setLeft(left);

		if(i==0 )
			for(k=1;k<=maxStrLength/2+1;k++)
			{
   
				if(k==1)printf("┌");
				printf("——");
				if(k==maxStrLength/2+1)
					printf("┐\n\n\n\n");	
			}
		
		if(i==0)
		{
   
			setLeft(50);
	
		}

		if(line_flag) printf("¤     %d.",count);
		
		printf("%s",str[i++]);

		count ++;
		
		
		//控制行高
		setTop(line_height);
	}

	printf("\n\n\n\n");	
	setLeft(50);
	for(k=1;k<=maxStrLength/2+1;k++)
	{
   
		if(k==1)printf("└");
		printf("——");
		if(k==maxStrLength/2+1)
			printf("┘\n");	
	}
	return count-1;
}
/**
*	函数名称:setLeft
*   函数功能:控制左间距
*	输入参数:left(>0) 左间距
*	返回值:左间距
**/

int setLeft(int left)
{
   
	for(int j = 0;j<left;j++)
		printf(" ");
	return left;
}
/**
*	函数名称:setTop
*   函数功能:控制上间距
*	输入参数:top>0) 上间距
*	返回值: 上间距
**/
int setTop(int top)
{
   
	for(int j =0 ;j<top;j++)
		printf("\n");
	return top;
}


void add_train()
{
   
	PTrainInfo head,p1,p2;
	FILE *fp;
	head = p1 = (PTrainInfo)malloc(TRAINSIZE);
	
	if((fp = fopen("train.txt","ab+"))==NULL || p1==NULL)
		Error();

	system("cls");
	setTop(10);
	
	setLeft(50);  printf("        车次编号:");            scanf("%s",p1->trainId);          printf("\n");
	
	//判断车次编号是否重复
	
	p2 =findTrain(-1,p1->trainId,-1);
	if(p2!=NULL)
	{
   
		printf("记录重复,录入失败.\n");
		system("pause");
		return;
	}
	

	setLeft(50);  printf("        车次名称:");			scanf("%s",p1->trainName);        printf("\n");
	setLeft(50);  printf("        车次类型编码:");	    scanf("%s",p1->trainCode);        printf("\n");
	setLeft(50);  printf("        车次类型名称:");        scanf("%s",p1->typeName);         printf("\n");
	setLeft(50);  printf("        所属路局编号:");        scanf("%s",p1->rodeId);           printf("\n");
	setLeft(50);  printf("        所属路局名称:");        scanf("%s",p1->rodeName);         printf("\n");
	setLeft(50);  printf("        始发站:");              scanf("%s",p1->startStaion);      printf("\n");
	setLeft(50);  printf("        始发时间:");            scanf("%s",p1->startTime);        printf("\n");	
	setLeft(50);  printf("        终到站:");              scanf("%s",p1->endStation);       printf("\n");
	setLeft(50);  printf("        终到时间:");            scanf("%s",p1->endTime);          printf("\n");//float f=0.0;//避免floating not load
	setLeft(50);  printf("        硬卧下铺全程票价:");    scanf("%f",&p1->hardLwr);       printf("\n");
	setLeft(50);  printf("        硬卧中铺全程票价:");    scanf("%f",&p1->hardMid);         printf("\n");
	setLeft(50);  printf("        硬卧上铺全程票价:");    scanf("%f",&p1->hardUpper);       printf("\n");
	setLeft(50);  printf("        软卧下铺全程票价:");    scanf("%f",&p1->softLwr);         printf("\n");	
	setLeft(50);  printf("        软卧上铺全程票价:");    scanf("%f",&p1->softUpper);       printf("\n");
	setLeft(50);  printf("        硬座全程票价:");        scanf("%f",&p1->hardSit);         printf("\n");
	setLeft(50);  printf("        全程运行时间:");        scanf("%s",p1->fullTime);         printf("\n");
	setLeft(50);  printf("        全程运行里程:");        scanf("%d",&p1->fullMile);        printf("\n");

	fwrite(p1,TRAINSIZE,1,fp);
	
     目录 第一章 列车车次管理系统需求分析 2 1.1 需求分析和概述 2 1.2 系统分析 2 第二章 数据库的设计 4 2.1 E-R图 4 2.2 表的结构说明 4 第三章 前台主界面的设计 5 3.1主界面概述 5 3.2前台主界面的实现 5 3.3数据库的连接 8 3.4界面事件监听 8 附录 14 第一章 列车车次管理系统需求分析 1.1 需求分析和概述    中国地域辽阔,铁路线纵横繁多,给人们的出行带来了极大的方便,但随着火车站客流量的不断增长,越来越多的弊端暴露在人们面前,如:    火车查询效率低下    浪费乘客大量时间    浪费大量人力资源 在这样的情景下更需要良好的系统来管理列车的时间及列车所到车站。      本系统对于指定的列车车次,可以对它的出发时间、到站时间、途经车站等进行添加、修改和删除。 1.2 系统分析 本系统是针对管理员对列车车次的管理的开发的,其主要功能是:   1)增加、修改、删除一个列车车次信息。   2)按条件显示车次信息(条件有按车次、出发时间、到站时间、途经车站等)。       系统结构图如下 第二章 数据库的设计 2.1 E-R图   这一设计阶段是在系统功能结构图的基础上进行的,设计出能够满足用户需求的各种实体以及它们之间的关系,为后面的逻辑结构设计打下基础。根据以上的分析设计结果,得到列车实体。下面来介绍车次实体的E-R图。 列车实体包括:车次,出发时间,结束时间,途径车站。E-R图如图2.1.1所示。    2.2 表的结构说明   在本系统中,。train数据表中保存婴儿出生信息,该表的结构如下表 表2.2.1 train表结构 字段名 信息说明 类型 最大字符数 备注 number 列车车次 char 4 主键 starttime 出发时间 char 10 允许为空 endtime 到站时间 char 10 允许为空 via 途经车站 char 10 允许为空 第三章 前台主界面的设计 3.1主界面概述   界面是用户与程序进行交互的接口,用户可以从界面中查看程序显示给用户的信息,程序可以从界面中获取用户输入的数据。通常用户不会去关心程序的界面是如何实现的,更多的会在意界面中提供的信息、功能及界面的布局是否合理。所以在进行界面设计时,不仅要从程序开发的角度上分析,还要考虑到界面的美观及布局。   本系统前台主界面的运行效果如图4.1所示。    前台主界面效果图 3.2前台主界面的实现 为了方便的实现查询功能,在jtable里面显示数据库信息,主界面里自定义了CreateTable类。 class CreateTable{ public Vector vector = null; public AbstractTableModel tm = null; public JScrollPane scroll; public String[] title;//表格表头 public CreateTable(String[] head) { JTable table; title=(String[])head.clone(); vector = new Vector(); tm = new AbstractTableModel() { //通过重写table来定义自己的表格模式 public int getColumnCount() { return title.length; } public int getRowCount() { return vector.size(); } public Object getValueAt(int row, int column) { if (!vector.isEmpty()) { return ((Vector) vector.elementAt(row)).elementAt(column); } else { return null; } } public void setValueAt(Object value, int row, int column) { } public String getColumnName(int column) { return title[column]; } public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); } public boolean isCellEditable(int row, int column) { return false; } }; table = new JTable(tm); scroll = new JScrollPane(table); } } 主界面代码如下class Train extends JFrame implements ActionListener{ public JTextField jt_num,jt_stt,jt_ent,jt_pas; public JButton jb_seh,jb_add,jb_rec,jb_del; Train(){ super("列车车次管理系统"); String[] cond={"车次","出发时间","到站时间","途径车站"}; Object[][] data=new Object[4][4]; JLabel jl_num=new JLabel("车次"); JLabel jl_stt=new JLabel("出发时间"); JLabel jl_ent=new JLabel("到站时间"); JLabel jl_pas=new JLabel("途经车站"); jt_num=new JTextField(6); jt_stt=new JTextField(10); jt_ent=new JTextField(10); jt_pas=new JTextField(20); jb_seh=new JButton("查询"); jb_seh.addActionListener(this); jb_add=new JButton("添加"); jb_add.addActionListener(this); jb_rec=new JButton("修改"); jb_rec.addActionListener(this); jb_del=new JButton("删除"); jb_del.addActionListener(this); CreateTable table=new CreateTable(cond); JPanel jp1=new JPanel(); JPanel jp2=new JPanel(); JPanel jp3=new JPanel(); JPanel jp4=new JPanel(); jp1.add(jl_num); jp1.add(jt_num); jp1.add(jl_stt); jp1.add(jt_stt); jp2.add(jl_ent); jp2.add(jt_ent); jp2.add(jl_pas); jp2.add(jt_pas); jp3.add(jb_seh); jp3.add(jb_add); jp3.add(jb_rec); jp3.add(jb_del); jp4.add(table.scroll); setLayout(new GridLayout(4,1)); this.add(jp1); this.add(jp2); this.add(jp3); this.add(jp4); setResizable(false); } } 3.3数据库的连接 数据库的连接有DBConnect类实现提代码如下 import java.sql.*; public class DBConnect { public static Connection getConn() throws Exception{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); return DriverManager.getConnection("jdbc:odbc:123",""); } } 3.4界面事件监听 在前台中,每个按钮都有库的操作的事件。当用户想要增或删除时,点击按钮,而系统会对这些按钮进行监听,并做相应的处理,其实现代码如下: public void actionPerformed(ActionEvent e){ if(e.getSource()==jb_add){ num=jt_num.getText(); stt=jt_stt.getText(); ent=jt_ent.getText(); pas=jt_pas.getText(); try { con = DBConnect.getConn(); st= con.createStatement(); st.executeUpdate("insert into Train values('"+num+"','"+stt+"','"+ent+"','"+pas+"')"); jt_num.setText(""); jt_stt.setText(""); jt_ent.setText(""); jt_pas.setText(""); JOptionPane.showMessageDialog(this, "添加成功!"); }catch(SQLException ae){ while (ae != null) { JOptionPane.showMessageDialog(this, "ERROR" ); ae = ae.getNextException(); } }catch(Exception ex){ ex.printStackTrace(); }finally { try { if (st != null) { st.close(); } if (con != null) { con.close(); } } catch (SQLException t) { JOptionPane.showMessageDialog(this, "ERROR:" + "----- SQLException -----\r\n" ); } } } if(e.getSource()==jb_del){ num= jt_num.getText(); if (JOptionPane.showConfirmDialog(this, "确认要删除吗?") == JOptionPane.YES_OPTION) { try { Connection con = DBConnect.getConn(); Statement st = con.createStatement(); st.executeUpdate("delete from Train where number='"+ num + "'"); JOptionPane.showMessageDialog(this, "已删除!"); jt_num.setText(""); }catch(SQLException ae){ while (ae!= null) { JOptionPane.showMessageDialog(this, "ERROR" ); ae = ae.getNextException(); } }catch(Exception ex){ ex.printStackTrace(); }finally { try { if (st != null) { st.close(); } if (con != null) { con.close(); } } catch (SQLException ex) { JOptionPane.showMessageDialog(this, "ERROR"); } } } } if(e.getSource()==jb_rec){ num=jt_num.getText(); stt=jt_stt.getText(); ent=jt_ent.getText(); pas=jt_pas.getText(); try { Connection con = DBConnect.getConn(); Statement st = con.createStatement(); st.executeUpdate("update Train set starttime='"+stt+"',endtime='"+ent+"',via='"+pas+"' where number='"+num+"'"); jt_num.setText(""); jt_stt.setText(""); jt_ent.setText(""); jt_pas.setText(""); JOptionPane.showMessageDialog(this, "修改成功!"); }catch (SQLException ex) { while (ex != null) { JOptionPane.showMessageDialog(this, "ERROR"); ex = ex.getNextException(); } } catch (Exception ex) { ex.printStackTrace(); } finally { try { if (st != null) { st.close(); } if (con != null) { con.close(); } } catch (SQLException ex) { JOptionPane.showMessageDialog(this, "ERROR" ); } } } if(e.getSource()==jb_seh){ num=jt_num.getText(); try { Connection con = DBConnect.getConn(); Statement st = con.createStatement(); ResultSet rst = null; rst=st.executeQuery("select * from Train where number='"+num+"'"); if (rst.next() == false) { JOptionPane.showMessageDialog(this, "找不到该列车"); }else{ ResultSet rs=st.executeQuery("select * from Train where number='"+num+"'"); jt_num.setText(""); table.vector.removeAllElements(); table.tm.fireTableStructureChanged(); while (rs.next()) { Vector vector=new Vector(); vector.addElement(rs.getString(1)); vector.addElement(rs.getString(2)); vector.addElement(rs.getString(3)); vector.addElement(rs.getString(4)); table.vector.addElement(vector); } table.tm.fireTableStructureChanged(); } }catch (SQLException ex) { while (ex != null) { JOptionPane.showMessageDialog(this, "ERROR" ); ex = ex.getNextException(); } } catch (Exception ex) { ex.printStackTrace(); } finally { try { if (st != null) { st.close(); } if (con != null) { con.close(); } } catch (SQLException ex) { JOptionPane.showMessageDialog(this, "ERROR:" + "----- SQLException -----\r\n"); } } } }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值