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

📄 sale.c

📁 这是一个使用了 cursor 编程技术实现的车站自动售票系统的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	s=sbus;	refresh();}showone(int row,int n){	int	i,j,k,l;	int	ptl,psb;	move(row,0),	clrtoeol();	ptl=bus[n].ptl;	psb=bus[n].psb;	mvprintw(row,col[0],"%d",tl[ptl].bus);	mvprintw(row,col[1],"%2d:%02d",tl[ptl].time/100,tl[ptl].time%100);	mvprintw(row,col[2],"%3d.%02d",sb[psb].price/100,sb[psb].price%100);	j=0;	k=nsta-1;	while(j<=k)	{		l=(j+k)/2;		if(tl[ptl].laststa<sta[l].no)			k=l-1;		else			if(tl[ptl].laststa>sta[l].no)				j=l+1;			else				break;	}	if(j>k)		mvaddstr(row,col[3],"");	else		mvaddstr(row,col[3],sta[l].name);	mvprintw(row,col[4],"%d",tl[ptl].nseat);	mvprintw(row,col[5],"%d",tl[ptl].lseat);	mvprintw(row,col[6],"%d",tl[ptl].gate);	for(i=0;i<nmod&&tl[ptl].model!=mod[i].no;i++)		;	if(i>=nmod)		i=nmod-1;	mvaddstr(row,col[7],mod[i].name);	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;}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%400==0||(i%4==0&&i%100!=0))			days+=366;		else			days+=365;	if(y1==y2)		for(i=m1;i<m2;i++)			if(y1%400==0||(y1%4==0&&y1%100!=0))				days+=mdays[1][i-1];			else				days+=mdays[0][i-1];	else	{		for(i=m1+1;i<=12;i++)			if(y1%400==0||(y1%4==0&&y1%100!=0))				days+=mdays[1][i-1];			else				days+=mdays[0][i-1];		for(i=1;i<m2;i++)			if(y2%400==0||(y2%4==0&&y2%100!=0))				days+=mdays[1][i-1];			else				days+=mdays[0][i-1];	}	days-=d1;	days+=d2;	if(date1>date2)		return	-days;	else		return	days;}showmsg(char s[]){	move(MSGROW,0);	clrtoeol();	mvaddstr(MSGROW,40-strlen(s)/2,s);	refresh();	printf("\7\7");}clrmsg(){	move(MSGROW,0);	clrtoeol();	refresh();}clrin(){	move(INROW,0);	clrtoeol();	refresh();}clrscr(){	int	i;	for(i=0;i<ROWS;i++)	{		move(ROW+i,0);		clrtoeol();		}	refresh();}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();	}}int	get_s(int y,int x,char prompt[],char s[],int n)	/* x,y  location of cursor; s  the string  */	/* n  length of s; */{	char	c,ss[128];	int	i;	for(i=0;i<n-1;i++)		ss[i]=' ';	ss[n-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>=n-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';					strcpy(s,ss);				}				return	0;			case	0x08:		/* <BS> pressed */				if(i<=0)					continue;				else					ss[--i]=' ';				break;			default:				ss[i++]=c;				break;		}		mvaddstr(y,x,ss);		refresh();	}}getkey(){	char	c,key;	char	keys[]={Up,Down,Right,Left,NONE,End,PgDn,Home,		PgUp,NONE,NONE,Ins};	key=getch();	refresh();	if(key==0x1b)	{		alarm(1);		if(getch()!=-1)		{			c=getch();			refresh();			key=keys[c-'A'];		}	}	return	key;}sale(int pbus){	int	ntic1,ntic2,ntic;	int	i,j,ptl,busno,num;	char	yn[10],s[80];	unsigned	price,bprice,money=0;	struct	ticket	*tic;	struct	ticketlib ticlib;	long	tn,tlsize=sizeof(struct ticketlib);	struct	time	t;	char	fn[80];	int	fd;	if(nbus<=0)		return	-1;	if(number<0)	{		showmsg("注意: 请在售票前先输入你所持车票的票号!");		return	-1;	}	ntic1=1;	do{		if(get_n(INROW,25,"全票张数: ",&ntic1,5)==-1)			return	-1;	}while(ntic1<0);	ntic2=0;	do{		if(get_n(INROW,40,"半票张数: ",&ntic2,5)==-1)			return	-1;	}while(ntic2<0);	ntic=ntic1+ntic2;	tic=(struct ticket *)malloc(ntic*sizeof(struct ticket));	if(tic==NULL)	{		showmsg("为售票数据分配内存出错!");		return	-1;	}	ptl=bus[pbus].ptl;	busno=tl[ptl].bus;	price=sb[bus[pbus].psb].price;	bprice=sb[bus[pbus].psb].bprice;	sprintf(s,"敲'Y'键将打印车票, 其他键将取消售票!");	yn[0]='\0';	if(get_s(MSGROW,41-strlen(s)/2,s,yn,10)==-1)	{		free(tic);		showmsg("请注意: 你取消了此次售票!");		return	-1;	}	if(yn[0]!='y'&&yn[0]!='Y')	{		free(tic);		return	-1;	}/*	ntl=readtl(date);	for(ptl=0;ptl<ntl&&tl[ptl].bus!=busno;ptl++)		;	if(ptl>=ntl)	{		free(tic);		return	-1;	}*//* 记录加锁 */	sprintf(fn,"%s/data/ticlib/%d",RP,date);	fd=open(fn,O_RDWR);	if(fd==-1)	{		free(tic);		sprintf(s,"文件%s打开失败, 无法写入票库数据!",fn);		showmsg(s);		return	-1;	}	do{		lseek(fd,(long)ptl*tlsize,0);		if(lockf(fd,F_TLOCK,(long)tlsize)==0)			break;	}while(1);	lseek(fd,(long)ptl*tlsize,0);	read(fd,&ticlib,tlsize);	if(tl[ptl].lseat<=0)	{		free(tic);		close(fd);		showmsg("注意: 该班车的票已售完!");		return	-1;	}	if(ntic>ticlib.lseat)	{		free(tic);		close(fd);		sprintf(s,"对不起, 该车只有%d张票!",ticlib.lseat);		return	-1;/*		sprintf(s,"注意: 该车只有%d张票, 你要这些票吗?(y/n): ",			tl[ptl].lseat);		showmsg(s);		yn[0]='n',	yn[1]='\0';		if(get_s(MSGROW,41+strlen(s)/2,"",yn,10)==-1)		{			free(tic);			return	-1;		}		else			if(yn[0]!='y'&&yn[0]!='Y')			{				free(tic);				return	-1;			}			else				ntic=tl[ptl].lseat;*/	}	num=number;	for(i=0;i<ntic;i++)	{		tic[i].bus=ticlib.bus;		tic[i].sta=psta;		tic[i].user=uno;		if(i<ntic1)			tic[i].flag=0;		else			tic[i].flag=1;		tic[i].checkflag=0;		tic[i].number=num;		for(j=0;j<MAXSEAT&&j<ticlib.nseat;j++)			if(ticlib.tab[j]==0)			{				tic[i].seat=j+1;				/* if(checkbus(tl[ptl].bus)==0) */				/* { */					ticlib.lseat--;					ticlib.tab[j]=1;				/*  }  */				break;			}		if(tic[i].flag==0)			tic[i].price=price;		else			tic[i].price=bprice;		tic[i].ruser=-1;		tic[i].rdate=0;		tic[i].rtime=0;		tic[i].rprice=0;		tn=time(0);		gettime(tn,&t);		tic[i].date=t.year*10000+t.month*100+t.mday;		tic[i].time=t.hour*100+t.minute;		if(/* (checkbus(tl[ptl].bus)==0 */			/* && */			tic[i].date==date			&&tic[i].time>=ticlib.time /*)			||(checkbus(tl[ptl].bus)==1			&&tic[i].time>=pretime)*/)		{			showmsg("该车发车时间已过, 不能再售票!");			free(tic);			return	-1;		}		num++;		money+=tic[i].price;	}/*	if(writetl(tl,ptl)==-1)		return	-1;*/	lseek(fd,(long)ptl*tlsize,0);	i=write(fd,(char *)&ticlib,tlsize);	lseek(fd,(long)ptl*tlsize,0);	lockf(fd,F_ULOCK,tlsize);	close(fd);	if(i!=tlsize)	{		showmsg("票库记录未正常写入, 售票失败!");		return -1;	}	if(writetic(tic,ntic)==-1)	{		showmsg("票库记录可能与售票记录不一致, 请核实!");		return	-1;	}	if(writeud(tic,ntic)==-1)	{		showmsg("记录写入出现错误!");		return	-1;	}	free(tic);	if(i==-1)		return	-1;	number=num;	sprintf(s,"应收票款: %d.%02d(元)!",money/100,money%100);	showmsg(s);	getch();	refresh();	printtic(tic,ntic,ticlib);	return	money;}/*int	writetl(struct ticketlib *tl,int ptl){	char	fn[80];	int	fd;	char	s[80];	sprintf(fn,"%s/data/ticlib/%d",RP,date);	fd=open(fn,O_RDWR);	if(fd==-1)	{		sprintf(s,"文件%s打开失败, 无法写入票库数据!",fn);		showmsg(s);		return	-1;	}	do{		lseek(fd,(long)ptl*sizeof(struct ticketlib),0);		if(lockf(fd,F_TLOCK,(long)sizeof(struct ticketlib))==0)			break;	}while(1);	lseek(fd,(long)ptl*sizeof(struct ticketlib),0);	write(fd,(char *)(tl+ptl),sizeof(struct ticketlib));	lseek(fd,(long)ptl*sizeof(struct ticketlib),0);	lockf(fd,F_ULOCK,(long)sizeof(struct ticketlib));	close(fd);	return	0;}*/int	writetic(struct ticket *tic,int ntic){	char	fn[80];	int	fd;	char	s[80];	sprintf(fn,"%s/data/ticket/%d",RP,date);	fd=open(fn,O_RDWR);	if(fd==-1)	{		fd=open(fn,O_CREAT|O_RDWR);		if(fd==-1)		{			sprintf(s,"文件%s打开失败, 无法写入售票数据!",fn);			showmsg(s);			return	-1;		}		else			chmod(fn,0666);	}	do{		lseek(fd,0L,2);		if(lockf(fd,F_TLOCK,0L)==0)			break;	}while(1);	lseek(fd,0L,2);	write(fd,(char *)tic,ntic*sizeof(struct ticket));	lseek(fd,-(long)ntic*sizeof(struct ticket),2);	lockf(fd,F_ULOCK,0L);	close(fd);	return	0;}int	writeud(struct ticket *tic,int ntic){	struct	userdata{		int	user;		int	date;		int	bus;		char	flag;		int	time;		int	seat;		int	sta;		int	price;		int	fee;		int	rprice;		unsigned	number;	}*ud;	char	fn[80];	int	fd;	char	s[80];	int	i,dd;	long	tn;	struct	time	t;	ud=(struct userdata *)malloc(ntic*sizeof(struct userdata));	if(ud==NULL)	{		showmsg("分配内存出错, 无法保存售票员数据!");		return;	}	for(i=0;i<ntic;i++)	{		ud[i].user=tic[i].user;		ud[i].date=date;		ud[i].bus=tic[i].bus;		ud[i].flag=tic[i].flag;		ud[i].time=tic[i].time;		ud[i].seat=tic[i].seat;		ud[i].sta=tic[i].sta;		ud[i].price=tic[i].price;		ud[i].fee=0;		ud[i].rprice=0;		ud[i].number=tic[i].number;	}	tn=time(0);	gettime(tn,&t);	dd=t.year*10000+t.month*100+t.mday;	sprintf(fn,"%s/data/user/%d",RP,dd);	fd=open(fn,O_RDWR|O_APPEND);	if(fd==-1)	{		fd=open(fn,O_CREAT|O_RDWR);		if(fd==-1)		{			sprintf(s,"文件%s打开失败, 无法写入售票员数据!",fn);			showmsg(s);			return	-1;		}		else			chmod(fn,0666);	}	while(lockf(fd,F_TLOCK,0L)!=0)		;	write(fd,(char *)ud,ntic*sizeof(struct userdata));	lseek(fd,-(long)ntic*sizeof(struct userdata),2);	lockf(fd,F_ULOCK,0L);	close(fd);	return	0;}int	printtic(struct ticket tic[],int ntic,struct ticketlib tl){	int	i,j;	char	s[20];	showmsg("正在打印车票, 请稍候...");	printf("%c{",0x1b);	/* print "ESC {" */	for(i=0;i<ntic;i++)	{		for(j=0;j<nsta&&sta[j].no!=tic[i].sta;j++)			;		if(j<nsta)			strcpy(s,sta[j].name);		else			strcpy(s,"(None)");		printf("%17s%8d.%02d\n",s,tic[i].price/100,tic[i].price%100);		printf("\n\n");		/* if(checkbus(tic[i].bus)==0) */			printf("%d.%02d.%02d%5d:%02d%8d%6d%5d\n",date/10000,				date%10000/100,date%100,				tl.time/100,tl.time%100,tic[i].bus,				tic[i].seat,tl.gate);		/* else			printf("%d.%02d.%02d   本票%2d时%02d分前有效!%5d\n",				date/10000,date%10000/100,				date%100,pretime/100,pretime%100,tl.gate);		*/		printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");	}	printf("%c}",0x1b);	return	0;}/*int	checkbus(int busno){	int	i;	for(i=0;i<MAXBUS;i++)		if(busno==prebus[i])			return	1;	return	0;}*/

⌨️ 快捷键说明

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