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

📄 recheck.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>#include<errno.h>#include<unistd.h>#include<pwd.h>#define	MAXSEAT	60#define	MSGROW	23#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	busstate{	int	bus;	int	time;	char	regi;	int	regiuser;	int	regitime;	char	check;	int	gate;	int	checkuser;	int	checkbegintime;	int	checkendtime;	char	print;	int	printuser;	int	printtime;	char	settle;	int	owner;	int	rate;	int	setleuser;	int	setletime;}*bs;int	nbs;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	uno;main(){	long	tn;	struct	time	t;	int	busno=0;	int	i;	char	msg[80];	RP=getenv("ROOTPATH");	if(RP==NULL)		return	-1;	uno=getuid();	nbs=readbs();	if(nbs==-1)		return	-1;	signal(SIGINT,SIG_IGN);	initscr();	raw();	nonl();	noecho();	while(1)	{		clear();		mvaddstr(10,30,"*** 设置车次重检 ***");		mvaddstr(MSGROW,30,"敲<ESC>键退出...");		refresh();		if(get_n(15,30,"请输入班次号: ",&busno,10)==-1)			break;		for(i=0;i<nbs&&busno!=bs[i].bus;i++)			;		if(i<nbs)		{			if(check(busno)!=0)				continue;			if(bs[i].print==1)			{				tn=time(0);				gettime(tn,&t);				bs[i].print=0;				writebs(i,bs[i]);				showmsg("设置重检成功!");			}			else			{				sprintf(msg,"班次%d并未打印结算单,可以继续检票!",busno);				showmsg(msg);			}		}		else		{			sprintf(msg,"班次%d不存在, 无法设置重检!",busno);			showmsg(msg);		}	}	if(bs!=NULL)		free(bs);	erase();	clear();	refresh();	endwin();}int	readbs(){	int	fd;	char	fn[80];	long	size;	char	msg[80];	long	tn;	struct	time	t;	tn=time(0);	gettime(tn,&t);	sprintf(fn,"%s/data/state/%d",RP,t.year*10000+t.month*100+t.mday);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		sprintf(msg,"文件 %s 打开失败!",fn);		showmsg(msg);		return	fd;	}	size=lseek(fd,0L,2);	bs=(struct busstate *)malloc(size);	if(bs==NULL)	{		showmsg("为班次数据分配内存出错!");		close(fd);		return	-1;	}	else	{		lseek(fd,0L,0);		read(fd,(char *)bs,size);		close(fd);		return	size/sizeof(struct busstate);	}}int	check(int bus){	long	tn;	struct	time	t;	struct	ticketlib{		int	bus;		int	state;		int	time;		int	nseat;		int	lseat;		int	gate;		int	model;		int	laststa;		char	tab[MAXSEAT];	}tl;	char	fn[80],msg[80];	int	fd;	long	size,ss;	tn=time(0);	gettime(tn,&t);	sprintf(fn,"%s/data/ticlib/%d",RP,t.year*10000+t.month*100+t.mday);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		showmsg("票库文件无法打开, 请排除故障后重试!");		return	-1;	}	size=sizeof(tl);	while(1)	{		ss=read(fd,(char *)&tl,size);		if(ss!=size)		{			showmsg("票库中无此班次, 请核实后重试!");			close(fd);			return	-1;		}		if(tl.bus==bus)		{			close(fd);			if(tl.state==0)				return	0;			else			{				sprintf(msg,"班次%d已经停开, 不能重检!",bus);				showmsg(msg);				return	-1;			}		}	}}int	writebs(int seat,struct busstate bs){	int	fd;	char	fn[80];	long	tn;	struct	time	t;	char	msg[80];	tn=time(0);	gettime(tn,&t);	sprintf(fn,"%s/data/state/%d",RP,t.year*10000+t.month*100+t.mday);	fd=open(fn,O_WRONLY);	if(fd==-1)	{		sprintf(msg,"文件%s无法打开!",fn);		showmsg(msg);		return	-1;	}	lseek(fd,seat*sizeof(struct busstate),0);	lockf(fd,F_LOCK,sizeof(struct busstate));	write(fd,(char *)&bs,sizeof(struct busstate));	close(fd);	return	0;}int	gettime(long tn,struct time *t){	int	days,ydays;	short	TZ;	char	*tzs;	short	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};	short	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++,days-=ydays)		if(t->year%400==0||(t->year%4==0&&t->year%100!=0))			ydays=366;		else			ydays=365;	t->yday=days;	t->month=1;	if(t->year%400==0||(t->year%4==0&&t->year%100!=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	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();}

⌨️ 快捷键说明

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