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

📄 sale.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	14#define	ROW	4#define	SHOWROW	24#define	INROW	21#define	MSGROW	22#define	NITEM	8#define	MAXBUS	20#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-退出   S-售票   空格--到站   '-'-前一天   '+'-后一天   N-票号"};char	*title[]={"班次","时间","票价","终点","座数","余座","检票口","车型"};int	col[NITEM]={4,12,20,30,40,48,56,64};int	uno;struct	passwd	*upwd;int	date,psta,number=-1;char	ucode[5],uname[10],csta[10];int	showcol[4]={15,35,55,70};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;int	prebus[MAXBUS];int	pretime;main(int argc,char *argv[]){	char	c,envvars[20],*envs;	int	sbus,pbus,quit;		long	tn;	struct	time	t;	int	n;	char	msg[80];	RP=getenv("ROOTPATH");	if(RP==NULL)		return	-1;	envs=getenv("PRETIME");	if(envs==NULL)		pretime=0;	else		pretime=atoi(envs);	for(n=0;n<MAXBUS;n++)	{		prebus[n]=-1;		sprintf(envvars,"PREBUS%d",n);		envs=getenv(envvars);		if(envs==NULL)			continue;		prebus[n]=atoi(envs);	}	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)		{			clrin();			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	' ':				n=insta();				showitem();				if(n!=-1)				{					nbus=takebus();					sbus=0;					pbus=0;					show(1,sbus,pbus);				}				break;			case	'0':			case	's':				if((n=sale(pbus))!=-1)				{					sprintf(msg,"此次售票成功! (%d.%02d元)",						n/100,n%100);					showmsg(msg);					showitem();					show(1,sbus,pbus);				}				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	'n':				number=inticnum();				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];			i=j-k;			while(i>=0&&tl[order[i]].time>tl[n].time)			{				order[i+k]=order[i];				i-=k;			}			order[i+k]=n;		}		k/=2;	}}int	takebus(){	int	i,j,k;	struct	time	t;	long	tn;	int	tm;	int	*ptl,*psb;	int	nptl,npsb;	if(nsb<=0||ntl<=0)		return	0;	tn=time(0);	gettime(tn,&t);	if(getdays(t.year*10000+t.month*100+t.mday,date)==0)		tm=t.hour*100+t.minute;	else		tm=0;	ptl=(int *)malloc(ntl*sizeof(int));	if(ptl==NULL)	{		showmsg("为票库数据分配内存出错!");		return	0;	}	for(i=0,nptl=0;i<ntl;i++)		if((tl[order[i]].time>tm				&&tl[order[i]].state==0				&&tl[order[i]].lseat>0)				/* || */		   /* (checkbus(tl[order[i]].bus)==1&&tm<pretime) */)			ptl[nptl++]=order[i];				psb=(int *)malloc(nsb*sizeof(int));	if(psb==NULL)	{		showmsg("为站点-班车指针数据分配内存出错!");		free(ptl);		return	0;	}	for(i=0,npsb=0;i<nsb;i++)		if(sb[i].sta==psta)			psb[npsb++]=i;	if(bus!=NULL)		free(bus);	bus=(struct buses *)malloc(nptl*sizeof(struct buses));	if(bus==NULL)	{		showmsg("为班车指针数据分配内存出错!");		free(psb);		free(ptl);		return	0;	}	for(i=0,nbus=0;i<nptl;i++)	{		for(j=0;j<npsb&&sb[psb[j]].bus!=tl[ptl[i]].bus;j++)			;		if(j<npsb)		{			bus[nbus].ptl=ptl[i];			bus[nbus].psb=psb[j];			nbus++;		}	}	free(psb);	free(ptl);	return	nbus;}sort_time(int nbus){	int	i,j,k,n;	k=nbus/2;	while(k>0)	{		for(j=k;j<nbus;j++)		{			n=order[j];			i=j-k;			while(i>=0&&tl[bus[order[i]].ptl].time>tl[bus[n].ptl].time)			{				order[i+k]=order[i];				i-=k;			}			order[i+k]=n;		}		k/=2;	}}int	insta(){	int	i;	static	char	code[5]="cdc";	while(1)	{		if(get_s(SHOWROW,showcol[2],"",code,5)==-1)			return	-1;		for(i=0;i<nsta&&strcmp(code,sta[i].code)!=0;i++)			;		if(i<nsta)		{			psta=sta[i].no;			strcpy(csta,sta[i].name);			clrin();			return	0;		}		else			showmsg("输入的站点不存在!");	}}int	inticnum(){	int	n;	n=number;	if(get_n(SHOWROW,showcol[3],"",&n,10)==-1)		return	-1;	else		return	n;}showitem(){	int	i;	char	ns[]="售票员:",ds[]="日期:",ss[]="到站:",		nums[]="票号:";	move(SHOWROW,0),	clrtoeol();	mvaddstr(SHOWROW-1,0,tab[1]);	mvprintw(SHOWROW,showcol[0]-strlen(ns),"%s%s",ns,uname);	mvprintw(SHOWROW,showcol[1]-strlen(ds),"%s%d.%d.%d  ",ds,		date/10000,date%10000/100,date%100);	mvprintw(SHOWROW,showcol[2]-strlen(ss),"%s%s  ",ss,csta);	mvprintw(SHOWROW,showcol[3]-strlen(nums),"%s%d",nums,number);	refresh();}show(int flag,int sbus,int pbus){	static	int	s=-1,p=-1;	int	i;	void	showtime();	move(2,70);	clrtoeol();	if(nbus<=0)	{		mvaddstr(2,70,"0/0");		clrscr();		refresh();		return;	}	else		mvprintw(2,70,"%d/%d",pbus+1,nbus);	if(nbus<=0)	{		clrscr();		return;	}	if(flag==0)		mvaddch(p-s+ROW,col[0]-1,' ');	else	{		for(i=0;i<ROWS&&(sbus+i)<nbus;i++)		{			sigignore(SIGALRM);			showone(ROW+i,sbus+i);			sigset(SIGALRM,showtime);		}		for(;i<ROWS;i++)			move(ROW+i,0),	clrtoeol();	}	mvaddch(pbus-sbus+ROW,col[0]-1,'>');	p=pbus;

⌨️ 快捷键说明

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