⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ask.c

📁 这是一个使用了 cursor 编程技术实现的车站自动售票系统的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<fcntl.h>#include<signal.h>#include<curses.h>#include<malloc.h>#include<time.h>#include<errno.h>#include<unistd.h>#include<pwd.h>#define	MAXSEAT	60#define	ROWS	15#define	ROW	4#define	SHOWROW	24#define	MSGROW	22#define	NITEM	8#define	BEGINYEAR	1970#define	DSEC	86400#define	HSEC	3600#define	MSEC	60struct	time{	int	second;		/* 0--59	*/	int	minute;		/* 0--59	*/	int	hour;		/* 0--23	*/	int	mday;		/* 1--31	*/	int	month;		/* 1--12	*/	int	year;		/* 1970--	*/	int	wday;		/* 0--6(0=Sunday)*/	int	yday;		/* 1--365(366)	*/	long	tseconds;	/* seconds from 1970.1.1,0:0:0	*/};struct	ticket{	int	bus;	int	sta;	unsigned	user;	/* sale user */	char	flag;	/* 0-all  1-half */	int	date;	/* date saled */	int	time;	/* time saled */	char	checkflag;	/* checked or not */	unsigned	number;	/* number of ticket */	int	seat;	/* seat of ticket in bus */	int	price;	/* all price or half price */	int	ruser;	/* return user(normal -1) */	int	rdate;	/* date returned */	int	rtime;	/* time returned */	unsigned	rprice;	/* price returned */}*tic;	struct	ticketlib{	int	bus;	int	state;	int	time;	int	nseat;	int	lseat;	int	gate;	int	model;	int	laststa;	char	tab[MAXSEAT];}*tl;int	*order;int	ntl;struct	statobus{	int	sta;	int	bus;	unsigned	price;	unsigned	bprice;}*sb,*cursb;int	nsb,ncursb;struct	station{	int	no;	char	code[5];	char	name[10];	unsigned int	howfar;}*sta;int	nsta;struct	model{	int	no;	char	name[50];}*mod;int	nmod;struct	buses{	int	psb;	int	ptl;}*bus;int	nbus;char	*tab[]={	"*** 服 务 台 查 询 系 统 ***",	"----------------------------------------"	"---------------------------------------",	"Q-退出   空格--到站   '-'-前一天   '+'-后一天"};char	*title[]={"班次","时间","座数","余座","检票口","车型","终点","票价"};int	col[NITEM]={4,12,20,28,36,44,60,70};int	uno;struct	passwd	*upwd;int	date,psta;char	ucode[5],uname[10],csta[10];int	showcol[5]={20,40,60};enum	Key{	NONE,Up,Down,Right,Left,Center,End,PgDn,Home,	PgUp,Ins,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12};char	*RP;main(int argc,char *argv[]){	char	c;	int	sbus,pbus,quit;		long	tn;	struct	time	t;	int	n;	RP=getenv("ROOTPATH");	if(RP==NULL)		return	-1;	uno=getuid();	upwd=getpwuid(uno);	if(upwd==NULL)	{		printf("\nTHE USER %d DOS NOT EXIST!\n",uno);		return	-1;	}	else	{		strcpy(ucode,upwd->pw_name);		strcpy(uname,upwd->pw_comment);	}	init();	tn=time(0);	gettime(tn,&t);	date=t.year*10000+t.month*100+t.mday;	psta=311;	nsta=readsta();	nmod=readmod();	nsb=readsb(date);	ntl=readtl(date);	if(nsta==-1||nmod==-1||nsb==-1||ntl==-1)		quit=1;	else	{		showitem();		nbus=takebus();		quit=0;		sbus=0;		pbus=0;	}	show(1,sbus,pbus);	while(quit==0)	{		move(ROW+ROWS+1,41+strlen(tab[2])/2);		refresh();		alarm(1);		c=getkey();		refresh();		if(c!=-1)			clrmsg();		if(c>='A'&&c<='Z')			c=c-'A'+'a';		switch(c)		{			case	-1:	/* return of alarm */				tn=time(0);				gettime(tn,&t);				if(t.hour==0&&t.minute==0&&t.second==0)				{					n=t.year*10000+t.month*100+t.mday;					if(n>date)						date=n;				}				if(t.second%10==0)				{					showitem();					nsb=readsb(date);					ntl=readtl(date);					n=takebus();					if(n!=nbus)					{						sbus=0;						pbus=0;						nbus=n;					}					show(1,sbus,pbus);				}				break;			case	Down:				if(pbus<nbus-1)					pbus++;				if(pbus-sbus>=ROWS)				{					sbus++;					show(1,sbus,pbus);				}				else					show(0,sbus,pbus);				break;			case	Up:				if(pbus>0)					pbus--;				if(pbus<sbus&&sbus>0)				{					sbus--;					show(1,sbus,pbus);				}				else					show(0,sbus,pbus);				break;			case	PgUp:				if(pbus>ROWS)					pbus-=ROWS;				else					pbus=0;				if(sbus>ROWS)				{					sbus-=ROWS;					show(1,sbus,pbus);				}				else					if(sbus>0)					{						sbus=0;						show(1,sbus,pbus);					}					else						show(0,sbus,pbus);				break;			case	PgDn:				if(pbus<nbus-ROWS)					pbus+=ROWS;				else					pbus=nbus-1;				if(sbus<nbus-ROWS)				{					sbus+=ROWS;					show(1,sbus,pbus);				}				else					show(0,sbus,pbus);				break;			case	Home:				pbus=0;				if(sbus>0)				{					sbus=0;					show(1,sbus,pbus);				}				else					show(0,sbus,pbus);				break;			case	End:				pbus=nbus-1;				if(pbus-sbus>=ROWS)				{					sbus=nbus-ROWS;					show(1,sbus,pbus);				}				else					show(0,sbus,pbus);				break;			case	' ':				if(insta()!=-1)				{					nbus=takebus();					sbus=0;					pbus=0;					show(1,sbus,pbus);				}				showitem();				break;			case	'+':				tn=time(0);				do{					tn+=86400;	/* 24h. * 3600Sec. */					gettime(tn,&t);					n=t.year*10000+t.month*100+t.mday;				}while(n<=date);				date=n;				showitem();				nsb=readsb(date);				ntl=readtl(date);				nbus=takebus();				sbus=0;				pbus=0;				show(1,sbus,pbus);				break;			case	'-':				n=date;				tn=time(0);				while(1)				{				    gettime(tn,&t);				    if(t.year*10000+t.month*100+t.mday<date)				    {					n=t.year*10000+t.month*100						+t.mday;					tn+=86400;				    }				    else					break;				}				if(n<date)				{					date=n;					showitem();					nsb=readsb(date);					ntl=readtl(date);					nbus=takebus();					sbus=0;					pbus=0;					show(1,sbus,pbus);				}				break;			case	'q':				quit=1;				break;			default:				printf("\07");				break;		}	}	getch();	sigignore(SIGALRM);	erase();	refresh();	endwin();}init(){	int	i;	void	showtime();	signal(SIGINT,SIG_IGN);	sigset(SIGALRM,showtime);	initscr();	raw();	nonl();	noecho();	erase();	mvaddstr(ROW-4,40-strlen(tab[0])/2,tab[0]);	for(i=0;i<NITEM;i++)		mvaddstr(ROW-2,col[i],title[i]);	mvaddstr(ROW-1,0,tab[1]);	mvaddstr(ROW+ROWS,0,tab[1]);	mvaddstr(ROW+ROWS+1,40-strlen(tab[2])/2,tab[2]);	mvaddstr(ROW+ROWS+2,0,tab[1]);	refresh();}int	readmod(){	char	fn[80];	char	errs[128];	int	fd;	long	size;	sprintf(fn,"%s/bas/model.dat",RP);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		sprintf(errs,"文件%s打开失败!",fn);		showmsg(errs);		return	fd;	}	size=lseek(fd,0L,2);	mod=(struct model *)malloc(size);	if(mod==NULL)	{		showmsg("为车型数据分配内存出错!");		return	-1;	}	else	{		lseek(fd,0L,0);		read(fd,(char *)mod,size);		close(fd);		return	size/sizeof(struct model);	}}int	readsta(){	char	fn[80];	char	errs[128];	int	fd;	long	size;	int	i,nsta;	sprintf(fn,"%s/bas/stas.dat",RP);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		sprintf(errs,"文件%s打开失败!",fn);		showmsg(errs);		return	fd;	}	size=lseek(fd,0L,2);	sta=(struct station *)malloc(size);	if(sta==NULL)	{		showmsg("为站点数据分配内存出错!");		return	-1;	}	else	{		lseek(fd,0L,0);		read(fd,(char *)sta,size);		close(fd);		nsta=size/sizeof(struct station);		for(i=0;i<nsta&&psta!=sta[i].no;i++)			;		if(i<nsta)			strcpy(csta,sta[i].name);		else			csta[0]='\0';		return	nsta;	}}int	readsb(int date){	char	fn[80];	char	errs[128];	int	i,fd;	long	size;	if(sb!=NULL)		free(sb);	sprintf(fn,"%s/data/idex/%d",RP,date);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		sprintf(errs,"文件%s打开失败!",fn);		showmsg(errs);		return	fd;	}	size=lseek(fd,0L,2);	sb=(struct statobus *)malloc(size);	if(sb==NULL)	{			showmsg("为站点-班车数据分配内存出错!");		return	-1;	}	lseek(fd,0L,0);	read(fd,(char *)sb,size);	close(fd);	return	size/sizeof(struct statobus);}int	readtl(int date){	char	fn[80];	char	errs[128];	int	fd;	long	size;	int	i;	if(tl!=NULL)		free(tl);	if(order!=NULL)		free(order);	sprintf(fn,"%s/data/ticlib/%d",RP,date);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		sprintf(errs,"文件%s打开失败!",fn);		showmsg(errs);		return	fd;	}	size=lseek(fd,0L,2);	ntl=size/sizeof(struct ticketlib);	tl=(struct ticketlib *)malloc(size);	order=(int *)malloc(ntl*sizeof(int));	if(tl==NULL||order==NULL)	{		showmsg("为排序数据分配内存出错!");		return	-1;	}	lseek(fd,0L,0);	read(fd,(char *)tl,size);	close(fd);	for(i=0;i<ntl;i++)		order[i]=i;	sorttl(ntl);	return	ntl;}sorttl(int ntl){	int	i,j,k,n;	k=ntl/2;	while(k>0)	{		for(j=k;j<ntl;j++)		{			n=order[j];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -