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

📄 jsprint.c

📁 这是一个使用了 cursor 编程技术实现的车站自动售票系统的源代码
💻 C
字号:
#include <string.h>#include <signal.h>#include <time.h>#include <ctype.h>#include <errno.h>#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <pwd.h>#include <fcntl.h>#include <curses.h>#include <unistd.h>#define MAXSEAT 60#define ROWS 14#define ROW 5#define	MSGROW	23#define	BEGINYEAR	1970#define	DSEC	86400#define	HSEC	3600#define	MSEC	60struct 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;struct time{       int second;       int minute;       int hour;       int mday;       int month;       int year;       int wday;       int yday;       long tseconds;};struct ticket{       int bus;       int sta;       unsigned user;       char flag;       int date;       int time;       char checkflag;       unsigned number;       int seat;       unsigned price;       int ruser;       int rdate;       int rtime;       unsigned rprice;}tic;  struct stadata{       int sta;       char name[50];       int money;       int count;       int hmoney;            int hcount;       int bagmoney;       int bagcount;       int toacount;       int toamoney;};struct owner{       int no;       char name[50];};struct jsdata{       int user;       int no;       char name[50];       int bus;       int time;       struct stadata stadata[10];};struct buses{       int no;       int time;       int owner;       int rate;       int gate;       int model;       int nseat;};struct statobus{       int sta;       int bus;       unsigned price;       unsigned bprice;};struct station{	int no;	char code[5];	char name[10];	unsigned howfar;};struct	baggage{	int	bus;	int	seat;		int	sta;	int	user;	int	date;	int	time;	char	checkflag;	char	model;	int	npiece;	int	weight;	unsigned 	price;	unsigned 	lift;	int 	ruser;	int 	rdate;	int 	rtime;	unsigned 	rprice;};int	uno,locate;char 	ucode[5],uname[10];struct 	passwd 	*upwd;char 	*RP;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	head[]="*** 打 印 结 算 单 ***";main(int argc,char *argv[]){	struct time t;	long tn;	int bn=0,busno,date;	char c; 	RP=getenv("ROOTPATH");	if(RP==NULL)		return -1;	uno=getuid();	upwd=getpwuid(uno);	if(upwd==NULL)	{		printf("\n用户%s不存在!\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;	while(1)		if(comm(date)==-2)			break;	sigignore(SIGALRM);	erase();	refresh();	endwin();	return;}int	comm(int date){	struct jsdata js;	int busno;	busno=getbus(date,&js);	if(busno==-1)		return	-2;	if(readtic(&js,date,busno)==-1)		return	-1; 	if(writestate(date,busno)==-1)		return	-1;	print(js,date);	return	0;}  int    getbus(int date,struct jsdata *jsd){	char	c;	int	exit=0,busno=0,n;	char	ss[]="该班次已打印结算单, 要重打(y/n)? ";	while(exit==0)	{		if(get_n(13,35,"班次:",&busno,10)==-1)			return -1;		else		{			n=readstate(date,busno,jsd);			switch(n)			{				case	-1:					showmsg("该班次不存在,请重新输入!");					break;				case 1:					showmsg(ss);					while(1)					{						move(MSGROW,41+strlen(ss)/2);						refresh();						c=getkey();						if(c!=-1)							break;					}					if(c=='y')						exit=1;					break;				case	0:					exit=1;					break;				case	2:					showmsg("该班次还未检票!");					break;			}		}	}	return busno;}  int	readstate(int date,int no,struct jsdata *jsd){	char	fn[80]; 	char	errs[128];	int	fd,i;	long	size,s;	sprintf(fn,"%s/data/state/%d",RP,date);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		sprintf(errs,"文件%s不存在!",fn);		showmsg(errs);		return fd;	}	size=sizeof(struct busstate);	for(i=0;;i++)	{		s=read(fd,(char *)&bs,size);		if(s!=size)		{			close(fd);			return -1;		}		if(bs.bus==no)		{			jsd->bus=no;			jsd->no=bs.owner;			jsd->time=bs.time;			break;		}	}	locate=i;	close(fd);	if(bs.check==0)		return	2;	else		if(bs.print!=0)			return 1;		else			return 0;}init(){	int	i;	signal(SIGINT,SIG_IGN);	initscr();	raw();	nonl();	noecho();	erase();	mvaddstr(10,40-strlen(head)/2,head);	refresh();}int	readtic(struct jsdata *jsd,int date,int bus){	char	fn1[80],fn2[80],fn3[80],fn4[80],fn[80];	int	fd1,fd2,fd3,fd4,fd;	long	s1,size1,s2,size2,s3,size3,s4,size4,s,size;	int	i,j,x,y,k;        struct	owner 	own;        struct 	ticket	tic;        struct 	statobus rsta;        struct 	baggage	bag;        struct 	station	sta;        char	msg[80],name[80];	sprintf(fn2,"%s/bas/owner.dat",RP);	fd2=open(fn2,O_RDONLY);	if(fd2==-1)	{		showmsg("车主数据有错!");		return -1;	}	size2=sizeof(struct owner);	while(1)	{		s2=read(fd2,(char *)&own,size2);		if(s2!=size2)			break;		if(own.no==jsd->no)		{			strcpy(jsd->name,own.name);			break;		}	}	close(fd2);	sprintf(fn,"%s/data/idex/%d",RP,date);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		showmsg("索引文件有错!");		return -1;	}	size=sizeof(struct statobus);	for(i=0;i<10;i++)		jsd->stadata[i].sta=-1;	for(j=0;j<10;)	{		s=read(fd,(char *)&rsta,size);		if(s!=size) 			break;		if(rsta.bus==bus)		{			jsd->stadata[j].sta=rsta.sta;			j=j+1;		}  	}	close(fd);	sprintf(fn,"%s/bas/stas.dat",RP);	fd=open(fn,O_RDONLY);	if(fd==-1) 		return	-1;	size=sizeof(struct station);	while(1)	{		s=read(fd,(char *)&sta,size);		if(s!=size) 			break;		for(j=0;j<10&&jsd->stadata[j].sta!=-1;j++)			if(jsd->stadata[j].sta==sta.no)			{				strcpy(jsd->stadata[j].name,sta.name);				break;			}	}	close(fd);	for(i=0;i<10;i++)	{		jsd->stadata[i].money=0;		jsd->stadata[i].count=0;		jsd->stadata[i].hmoney=0;		jsd->stadata[i].hcount=0;		jsd->stadata[i].bagmoney=0;		jsd->stadata[i].bagcount=0;		jsd->stadata[i].toamoney=0;		jsd->stadata[i].toacount=0;	}        sprintf(fn1,"%s/data/ticket/%d",RP,date);	fd1=open(fn1,O_RDONLY);	if(fd1==-1)	{		showmsg("售票文件有错误!");		return	-1;	}	size1=sizeof(struct ticket);	for(k=0;k<MAXSEAT;)	{		s1=read(fd1,(char *)&tic,size1);		if(s1!=size1)			break;		if(tic.bus!=bus||tic.ruser!=-1||tic.checkflag!=1)			continue;		for(j=0;jsd->stadata[j].sta!=-1&&j<10;j++)			if(tic.sta==jsd->stadata[j].sta)			{				if(tic.flag==0)				{					jsd->stadata[j].money+=tic.price-250;					jsd->stadata[j].count++; 				}				else				{					jsd->stadata[j].hmoney+=tic.price-250;					jsd->stadata[j].hcount++; 				}				k=k+1;				break;       			}	}  	close(fd1);	sprintf(fn4,"%s/data/baggage/%d",RP,date);	fd4=open(fn4,O_RDONLY);	if(fd4!=-1)	{		size4=sizeof(struct baggage);		for(k=0;k<MAXSEAT;)		{			s4=read(fd4,(char *)&bag,size4);			if(s4!=size4)				break;			if(bag.bus!=bus||bag.ruser!=-1/*||bag.checkflag==0*/)				continue;			for(j=0;j<10&&jsd->stadata[j].sta!=-1;j++)				if(jsd->stadata[j].sta==bag.sta)				{					jsd->stadata[j].bagmoney+=bag.price;    					jsd->stadata[j].bagcount+=bag.npiece;					k++;					break;				}		}		close(fd4);	}	for(i=0;i<10&&jsd->stadata[i].sta!=-1;i++)	{		jsd->stadata[i].toamoney=jsd->stadata[i].money			+jsd->stadata[i].hmoney			+jsd->stadata[i].bagmoney;		jsd->stadata[i].toacount=jsd->stadata[i].count			+jsd->stadata[i].hcount;	}}int	writestate(int date,int busno){	char	fn[80];	int	fd;	long	size;	long	tn;	struct	time	t;	size=sizeof(struct busstate);	tn=time(0);	gettime(tn,&t);	bs.printtime=t.hour*100+t.minute;        bs.print=1;        bs.printuser=uno;	sprintf(fn,"%s/data/state/%d",RP,date);	fd=open(fn,O_RDWR);	if(fd==-1)	{		showmsg("无法将数据写入状态数据文件, 请排除故障后重新结算!");		return	-1;	}	lseek(fd,(long)(locate*size),0);	lockf(fd,F_LOCK,size);	write(fd,(char *)&bs,size);	close(fd);	return	0;}print(struct jsdata jsd,int date){	int	z;	int	total[9],i;	for(i=0;i<9;i++)		total[i]=0;	for(i=0;i<10&&jsd.stadata[i].sta!=-1;i++)	{  		total[0]+=jsd.stadata[i].toacount;  		total[1]+=jsd.stadata[i].toamoney;  		total[2]+=jsd.stadata[i].count;  		total[3]+=jsd.stadata[i].money;  		total[4]+=jsd.stadata[i].hcount;  		total[5]+=jsd.stadata[i].hmoney;  		total[6]+=jsd.stadata[i].bagcount;  		total[7]+=jsd.stadata[i].bagmoney;	}	total[8]=total[0]*250;	printf("%c{",0x1b);	printf("%13d%32s%14d%17d年%2d月%2d日%4d:%02d",jsd.no,jsd.name,jsd.bus,		date/10000,date/100%100,date%100,jsd.time/100,jsd.time%100);	printf("\n\n\n\n\n");	for(z=0;z<10&&jsd.stadata[z].sta!=-1;z++)	{  		printf("\n\r%9s%5d%7d.%02d",jsd.stadata[z].name,			jsd.stadata[z].toacount,jsd.stadata[z].toamoney/100,			jsd.stadata[z].toamoney%100);  		printf("%6d%7d.%02d",jsd.stadata[z].count,			jsd.stadata[z].money/100,jsd.stadata[z].money%100);  		printf("%6d%7d.%02d",jsd.stadata[z].hcount,			jsd.stadata[z].hmoney/100,jsd.stadata[z].hmoney%100);  		printf("%6d%7d.%02d",jsd.stadata[z].bagcount,			jsd.stadata[z].bagmoney/100,			jsd.stadata[z].bagmoney%100);  		printf("%7d.%02d\n\r",jsd.stadata[z].toacount*250/100,			jsd.stadata[z].toacount*250%100);	}	for(;z<10;z++)		printf("\n\n");	printf("\n%14d%7d.%02d",total[0],total[1]/100,total[1]%100);	printf("%6d%7d.%02d",total[2],total[3]/100,total[3]%100);	printf("%6d%7d.%02d",total[4],total[5]/100,total[5]%100);	printf("%6d%7d.%02d",total[6],total[7]/100,total[7]%100);	printf("%7d.%02d",total[8]/100,total[8]%100);	printf("\n\n\n\n\n\n\n");	printf("%c}",0x1b);}showmsg(char s[]){	move(MSGROW,0);	clrtoeol();	mvaddstr(MSGROW,40-strlen(s)/2,s);	refresh();	printf("\7\7");}clrmsg(){	move(MSGROW,0);	clrtoeol();	refresh();}getkey(){	char	c,key;	char	keys[]={Up,Down,Right,Left,NONE,End,PgDn,Home,		PgUp,NONE,NONE,Ins};	void	showtime();	sigset(SIGALRM,showtime);	alarm(1);	key=getch();	refresh();	if(key==0x1b)	{		alarm(1);		if(getch()!=-1)		{			c=getch();			refresh();			key=keys[c-'A'];		}	}	sigignore(SIGALRM);	return	key;}int	get_n(int y,int x,char *prompt,int *n,int b){	char	c,ss[128];	int	i;	sprintf(ss,"%d",*n);	for(i=strlen(ss);i<b-1;i++)		ss[i]=' ';	ss[b-1]='\0';	mvaddstr(y,x,prompt);	x+=strlen(prompt);	mvaddstr(y,x,ss);	refresh();	i=0;	while(1)	{		move(y,x+i);		refresh();		alarm(1);		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)					*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;				ss[i]='\0';				break;			default:				printf("\7\7");				break;		}		mvaddstr(y,x,ss);		refresh();	}}void	showtime(){	long	tn;	struct	time	t;	tn=time(0);	gettime(tn,&t);	mvprintw(0,0,"%4d.%02d.%02d/%02d:%02d:%02d",t.year,		t.month,t.mday,t.hour,t.minute,t.second);	refresh();}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%400==0||(t->year%4==0&&t->year%100!=0))			ydays=366;		else			ydays=365;		days-=ydays;	}	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;}            

⌨️ 快捷键说明

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