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

📄 pmaker.c

📁 这是一个使用了 cursor 编程技术实现的车站自动售票系统的源代码
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <fcntl.h>#include <signal.h>#include <curses.h>#include <malloc.h>#include <time.h>#define	MAXSEAT	60#define	PREDAYS	3#define	NORMAL	0#define	CANCEL	1#define	MSGROW	23#define	ROUSTA	10#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	buses{	int	no;	int	time;	int	owner;	int	rate;	int	gate;	int	model;	int	nseat;}*bus;int	nbus;struct	twoseat{	int	bus;	int	date;	int	today;	int	nextday;}*two;int	ntwo;struct	rstation{	int	bus;	int	sta;	unsigned price;	unsigned bprice;}*rsta;int	nrsta;struct	cancels{	int	bus;	int	date;	int	days;}*can;int	ncan;struct	route{	int	bus;	int	nsta;	int	p[ROUSTA];}*rou;struct	ticketlib{	int	bus;	int	state;	int	time;	int	nseat;	int	lseat;	int	gate;	int	model;	int	laststa;	char	tab[MAXSEAT];}*tl;struct	statobus{	int	sta;	int	bus;	unsigned	price;	unsigned	bprice;}*sb;struct	busstate{	int	bus;	int	time;	char	regi;	int	reguser;	int	regtime;	char	check;	int	gate;	int	checkuser;	int	checkbegintime;	int	checkendtime;	char	print;	int	printuser;	int	printtime;	char	settle;	int	owner;	int	rate;	int	settleuser;	int	settletime;}*bs;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[]){	long	tn;	struct	time	t;	int	date;	char	flag;	RP=getenv("ROOTPATH");	if(RP==NULL)		return	-1;	init();	if((nbus=readbus())!=-1&&(nrsta=readrsta())!=-1)	{		if((ntwo=readtwo())==-1)			ntwo=0;		if((ncan=readcan())==-1)			ncan=0;		tn=time(0);		tn+=PREDAYS*86400;		gettime(tn,&t);		date=t.year*10000+t.month*100+t.mday;		mvaddstr(10,25,"***** 正常计划生成 *****");		refresh();		if(getroute()==0&&indate(&date)==0&&checkdate(date)==0)		{			if(maketiclib(date)!=-1)				flag=0;			else				flag=1;			if(makesb(date)!=-1&&flag==0)				flag=0;			else				flag=1;			if(makebs(date)!=-1&&flag==0)				flag=0;			else				flag=1;			if(flag==0)				mvprintw(20,25,"%d年%d月%d日的计划生成成功!",					date/10000,date%10000/100,date%100);			else				mvprintw(20,25,"%d年%d月%d日的计划生成失败!",					date/10000,date%10000/100,date%100);			refresh();			getch();			refresh();		}	}	clear();	erase();	refresh();	endwin();}init(){	int	i;	signal(SIGINT,SIG_IGN);	initscr();	raw();	nonl();	noecho();}int	indate(int *date){	int	d=*date;	int	year,month,day;	mvprintw(13,30,"%4d年%2d月%2d日",d/10000,d%10000/100,d%100);	year=d/10000;	if(get_n(13,30,"",&year,5)==-1)		return	-1;	month=d%10000/100;	if(get_n(13,36,"",&month,3)==-1)		return	-1;	day=d%100;	if(get_n(13,40,"",&day,3)==-1)		return	-1;	*date=year*10000+month*100+day;	clear();	refresh();	return	0;}int	checkdate(int date){	int	year,month,day;	int	mdays[2][12]={31,28,31,30,31,30,31,31,30,31,30,31,			      31,29,31,30,31,30,31,31,30,31,30,31};	long	tn;	struct	time	t;	year=date/10000;	month=date%10000/100;	day=date%100;	tn=time(0);	gettime(tn,&t);	/*if(year<t.year||year>t.year+1)		return	-1;	*/if(month<1||month>12)		return	-1;	if(year%4==0)	{		if(day<1||day>mdays[1][month-1])			return	-1;	}	else		if(day<1||day>mdays[0][month-1])			return	-1;	return	0;}int	readbus(){	int	fd;	char	fn[80];	long	size;	char	msg[80];	sprintf(fn,"%s/bas/bus.dat",RP);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		sprintf(msg,"文件 %s 打开失败!",fn);		showmsg(msg);		return	fd;	}	size=lseek(fd,0L,2);	bus=(struct buses *)malloc(size);	if(bus==NULL)	{		showmsg("为班次数据分配内存出错!");		close(fd);		return	-1;	}	else	{		lseek(fd,0L,0);		read(fd,(char *)bus,size);		close(fd);		return	size/sizeof(struct buses);	}}int	readtwo(){	int	fd;	char	fn[80];	long	size;	char	msg[80];	sprintf(fn,"%s/bas/twoseat.dat",RP);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		sprintf(msg,"文件 %s 打开失败!",fn);		showmsg(msg);		return	fd;	}	size=lseek(fd,0L,2);	two=(struct twoseat *)malloc(size);	if(two==NULL)	{		showmsg("为隔日班数据分配内存出错!");		close(fd);		return	-1;	}	else	{		lseek(fd,0L,0);		read(fd,(char *)two,size);		close(fd);		return	size/sizeof(struct twoseat);	}}int	readcan(){	int	fd;	char	fn[80];	long	size;	char	msg[80];	sprintf(fn,"%s/bas/cancel.dat",RP);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		sprintf(msg,"文件 %s 打开失败!",fn);		showmsg(msg);		return	fd;	}	size=lseek(fd,0L,2);	can=(struct cancels *)malloc(size);	if(can==NULL)	{		showmsg("为撤销班次数据分配内存出错!");		close(fd);		return	-1;	}	else	{		lseek(fd,0L,0);		read(fd,(char *)can,size);		close(fd);		return	size/sizeof(struct cancels);	}}int	readrsta(){	int	fd;	char	fn[80];	long	size;	char	msg[80];	sprintf(fn,"%s/bas/route.dat",RP);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		sprintf(msg,"文件 %s 打开失败!",fn);		showmsg(msg);		return	fd;	}	size=lseek(fd,0L,2);	rsta=(struct rstation *)malloc(size);	if(rsta==NULL)	{		showmsg("为线路数据分配内存出错!");		close(fd);		return	-1;	}	else	{		lseek(fd,0L,0);		read(fd,(char *)rsta,size);		close(fd);		return	size/sizeof(struct rstation);	}}int	getroute(){	int	i,j,k,l;	long	size;	char	msg[80];	size=nbus*sizeof(struct route);	rou=(struct route *)malloc(size);	if(rou==NULL)	{		showmsg("为线路数据分配内存出错!");		return	-1;	}	for(i=0;i<nbus;i++)	{		rou[i].bus=bus[i].no;		rou[i].nsta=0;	}	for(i=0;i<nrsta;i++)	{		j=0;		k=nbus-1;		while(j<=k)		{			l=(j+k)/2;			if(rsta[i].bus<rou[l].bus)				k=l-1;			else				if(rsta[i].bus>rou[l].bus)					j=l+1;				else				{					rou[l].p[rou[l].nsta++]=i;					break;				}		}	}	for(i=0;i<nbus;i++)		if(rou[i].nsta<=0)		{			sprintf(msg,"%d次班车没有线路!",rou[i].bus);			showmsg(msg);			return	-1;		}	return	0;}int	maketiclib(int date){	int	i,j,tcan=0,tnorm;	int	days;	int	fd;	char	fn[80];	long	size;	struct	ticketlib *tl;	char	msg[80];	size=nbus*sizeof(struct ticketlib);	tl=(struct ticketlib *)malloc(size);	if(tl==NULL)	{		showmsg("为票库数据分配内存出错!");		return	-1;	}	for(i=0;i<nbus;i++)	{		tl[i].bus=bus[i].no;		for(j=0;j<ncan&&can[j].bus!=bus[i].no;j++)			;		if(j>=ncan)			tl[i].state=NORMAL;		else			if(getdays(can[j].date,date)>=can[j].days)				tl[i].state=NORMAL;			else				if(getdays(can[j].date,date)<0)					tl[i].state=NORMAL;				else				{					tl[i].state=CANCEL;					tcan++;				}		tl[i].time=bus[i].time;		tl[i].nseat=bus[i].nseat;		for(j=0;j<ntwo&&two[j].bus!=bus[i].no;j++)			;		if(j>=ntwo)			tl[i].lseat=bus[i].nseat;		else		{			days=getdays(two[j].date,date);			if(days<0)				tl[i].lseat=bus[i].nseat;			else				if(days%2==0)					tl[i].lseat=two[j].today;				else					tl[i].lseat=two[j].nextday;		}		tl[i].gate=bus[i].gate;		tl[i].model=bus[i].model;		tl[i].laststa=rsta[rou[i].p[rou[i].nsta-1]].sta;		for(j=0;j<MAXSEAT&&j<tl[i].nseat;j++)			tl[i].tab[j]=0;	}	sprintf(fn,"%s/data/ticlib/%d",RP,date);	fd=open(fn,O_WRONLY|O_CREAT|O_TRUNC);	if(fd==-1)	{		sprintf(msg,"文件 %s 打开失败!",fn);		showmsg(msg);		free(tl);		return	-1;	}	write(fd,(char *)tl,size);	close(fd);	free(tl);	chmod(fn,0666);	mvprintw(12,30,"总班次数:   %d",nbus);	mvprintw(13,30,"撤销班次数: %d",tcan);	mvprintw(14,30,"隔日班次数: %d",ntwo);	mvaddstr(15,25,"--------------------------");	mvprintw(16,30,"正常班次数: %d",nbus-tcan);	refresh();	return	nbus;}int	makesb(int date){	struct	statobus *sb;	int	i;	long	size;	int	fd;	char	fn[80];	char	msg[80];	size=nrsta*sizeof(struct statobus);	sb=(struct statobus *)malloc(size);	if(sb==NULL)	{		showmsg("为站点--班次数据分配内存出错!");		return	-1;	}	for(i=0;i<nrsta;i++)	{		sb[i].sta=rsta[i].sta;		sb[i].bus=rsta[i].bus;		sb[i].price=rsta[i].price;		sb[i].bprice=rsta[i].bprice;	}	sprintf(fn,"%s/data/idex/%d",RP,date);	fd=open(fn,O_WRONLY|O_CREAT|O_TRUNC);	if(fd==-1)	{		sprintf(msg,"文件 %s 打开失败!",fn);		free(sb);		return	-1;	}	write(fd,(char *)sb,size);	close(fd);	free(sb);	chmod(fn,0666);	return	0;}int	makebs(int date){	struct	busstate *bs;	int	i;	long	size;	int	fd;	char	fn[80];	char	msg[80];	size=nbus*sizeof(struct busstate);	bs=(struct busstate *)malloc(size);	if(bs==NULL)	{		showmsg("为班次状态数据分配内存出错!");		return	-1;	}	for(i=0;i<nbus;i++)	{		bs[i].bus=bus[i].no;		bs[i].time=bus[i].time;		if(bs[i].time<=200)		{			bs[i].regi=1;			bs[i].reguser=getuid();		}		else		{			bs[i].regi=0;			bs[i].reguser=-1;		}		bs[i].regtime=0;		bs[i].check=0;		bs[i].gate=bus[i].gate;		bs[i].checkuser=-1;		bs[i].checkbegintime=0;		bs[i].checkendtime=0;		bs[i].print=0;		bs[i].printuser=-1;		bs[i].printtime=0;		bs[i].settle=0;		bs[i].owner=bus[i].owner;		bs[i].rate=bus[i].rate;		bs[i].settleuser=-1;		bs[i].settletime=0;	}	sprintf(fn,"%s/data/state/%d",RP,date);	fd=open(fn,O_WRONLY|O_CREAT|O_TRUNC);	if(fd==-1)	{		sprintf(msg,"文件 %s 打开失败!",fn);		showmsg(msg);		free(bs);		return	-1;	}	write(fd,(char *)bs,size);	close(fd);	free(bs);	chmod(fn,0666);	return	0;}int	gettime(long tn,struct time *t){	int	days,ydays;	int	TZ;	char	*tzs;	int	mdays[2][12]={31,28,31,30,31,30,31,31,30,31,30,31,			      31,29,31,30,31,30,31,31,30,31,30,31};	int	i;	tzs=(char *)getenv("TZ");	if(tzs==NULL)		TZ=0;	else	{		for(;*tzs!='\0'&&*tzs!='+'&&*tzs!='-'&&(*tzs<'0'||*tzs>'9');tzs++)			;		TZ=atoi(tzs);		TZ=-TZ;	}	tn+=TZ*HSEC;	days=tn/DSEC;	t->tseconds=tn;	t->wday=(days+4)%7;	ydays=365;	for(t->year=BEGINYEAR;days>=ydays;t->year++)	{		if(t->year%4==0)			ydays=366;		else			ydays=365;		days-=ydays;	}	t->yday=days;	t->month=1;	if(t->year%4==0)		for(i=0;days>=mdays[1][i];i++)		{			days-=mdays[1][i];			t->month++;		}	else		for(i=0;days>=mdays[0][i];i++)		{			days-=mdays[0][i];			t->month++;		}	t->mday=days+1;	t->hour=tn%DSEC/HSEC;	t->minute=tn%HSEC/MSEC;	t->second=tn%MSEC;	return	0;}int	getdays(int date1,int date2){	int	days;	int	mdays[2][12]={31,28,31,30,31,30,31,31,30,31,30,31,			      31,29,31,30,31,30,31,31,30,31,30,31};	int	i;	int	dd1,dd2;	int	y1,y2,m1,m2,d1,d2;	if(date1>date2)		dd1=date2,	dd2=date1;	else		if(date1<date2)			dd1=date1,	dd2=date2;		else			return	0;	y1=dd1/10000,		y2=dd2/10000;	m1=dd1%10000/100,	m2=dd2%10000/100;	d1=dd1%100,		d2=dd2%100;	days=0;	for(i=y1+1;i<y2;i++)		if(i%4==0)			days+=366;		else			days+=365;	if(y1==y2)		for(i=m1;i<m2;i++)			if(y1%4==0)				days+=mdays[1][i-1];			else				days+=mdays[0][i-1];	else	{		for(i=m1+1;i<=12;i++)			if(y1%4==0)				days+=mdays[1][i-1];			else				days+=mdays[0][i-1];		for(i=1;i<m2;i++)			if(y2%4==0)				days+=mdays[1][i-1];			else				days+=mdays[0][i-1];	}	days-=d1;	days+=d2;	if(date1>date2)		return	-days;	else		return	days;}int	get_n(int y,int x,char *prompt,int *n,int b){	char	c,s[80],ss[80];	int	i;	sprintf(s,"%d",*n);	for(i=0;i<b-1;i++)		ss[i]=' ';	ss[b-1]='\0';	mvaddstr(y,x,prompt);	x+=strlen(prompt);	mvaddstr(y,x,ss);	mvaddstr(y,x,s);	refresh();	i=0;	while(1)	{		move(y,x+i);		refresh();		if(i>=b-1)			c=0x0d;		else			c=getkey();		switch(c)		{			case	-1:				continue;			case 	0x1b:		/* <ESC> pressed */				return	-1;			case	0x0d:		/* <ENTER> pressed */				if(i)				{					ss[i]='\0';					*n=atoi(ss);				}				return	0;			case	0x08:		/* <BS> pressed */				if(i<=0)					continue;				else				{					ss[--i]=' ';					ss[i]='\0';				}				break;			case	'0':			case	'1':			case	'2':			case	'3':			case	'4':			case	'5':			case	'6':			case	'7':			case	'8':			case	'9':				ss[i++]=c;				break;			default:				printf("\7\7");				break;		}		mvaddstr(y,x,ss);		refresh();	}}getkey(){	char	c,key;	char	keys[]={Up,Down,Right,Left,NONE,NONE,PgDn,Home,		PgUp,NONE,End,Ins};	void	timeint();	sigset(SIGALRM,timeint);	key=getch();	refresh();	if(key==0x1b)	{		alarm(1);		if(getch()!=-1)		{			c=getch();			refresh();			key=keys[c-'A'];		}	}	sigignore(SIGALRM);	return	key;}void	timeint(){}showmsg(char s[]){	move(MSGROW,0);	clrtoeol();	mvaddstr(MSGROW,(80-strlen(s))/2,s);	refresh();	printf("\7\7");	getch();	refresh();}clrerr(){	move(MSGROW,0);	clrtoeol();	refresh();}

⌨️ 快捷键说明

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