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

📄 pbusapp.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<unistd.h>#include<time.h>#include<pwd.h>#define	MAXBUS	10#define	MAXSEAT	60#define	RATE	6#define	ROWS	15#define	ROW	5#define	INROW	22#define	MSGROW	23#define	NITEM	8#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[MAXBUS];int	nbus=0;char	ssta[MAXBUS][10];int	order[MAXBUS];int	delf[MAXBUS];	int	col[NITEM]={6,14,22,30,50,56,62,74};struct	ticketlib{	int	bus;	int	state;	int	time;	int	nseat;	int	lseat;	int	gate;	int	model;	int	laststa;	char	tab[MAXSEAT];};struct	owner{	int	no;	char	name[50];}*own;int	nown;struct	gate{	int	no;	char	tty[10];}*gat;int	ngat;struct	model{	int	no;	char	name[50];}*mod;int	nmod;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	*tab[]={	"加 班 班 次 信 息 管 理",	"----------------------------------------"	"---------------------------------------",	"Q-退出  N-指定  A-添加  M-修改  D-删除  U-恢复  S-保存"};char	*title[]={"班次","终点","时间","车主","提成","检口","车型","座数"};int	uno;struct	passwd	*upwd;char	ucode[10],homedir[80];char	*RP;main(int argc,char *argv[]){	char	c;	int	flag=0;	int	quit=0;	int	sbus=0,pbus=0;	int	n;	RP=getenv("ROOTPATH");	if(RP==NULL)	{		printf("\n\r环境变量'ROOTPATH'未初始化!\0x7\0x7\n\r");		return	-1;	}	uno=getuid();	upwd=getpwuid(uno);	if(upwd==NULL)	{		printf("\nTHE USER %d DOES NOT EXIST!\n",uno);		return	-1;	}	else	{		strcpy(ucode,upwd->pw_name);		strcpy(homedir,upwd->pw_dir);	}	init();	nown=readown();	if(nown==-1)		nown=0;	ngat=readgat();	if(ngat==-1)		ngat=0;	nmod=readmod();	if(nmod==-1)		nmod=0;/*	nbbus=readbbus();	if(nbbus==-1)		nbbus=0;*/	nbus=readbus();	if(nbus==-1)		nbus=0;	else	{		for(n=0;n<nbus;n++)			delf[n]=0;		readlsta();	}	while(quit==0)	{		show(sbus,pbus);		move(ROW+ROWS+1,41+strlen(tab[2])/2);		refresh();		c=getkey();		clrin();		clrmsg();		if(c>='A'&&c<='Z')			c=c-'A'+'a';		switch(c)		{			case	-1:				break;			case	Down:				if(pbus<nbus-1)					pbus++;				if(pbus-sbus>=ROWS)					sbus++;				break;			case	Up:				if(pbus>0)					pbus--;				if(pbus<sbus&&sbus>0)					sbus--;				break;			case	PgUp:				if(sbus>=ROWS)					sbus-=ROWS;				else					sbus=0;				if(pbus>=ROWS)					pbus-=ROWS;				else					pbus=0;				break;			case	PgDn:				if(sbus<nbus-ROWS)					sbus+=ROWS;				if(pbus<nbus-ROWS)					pbus+=ROWS;				else					pbus=nbus-1;				break;			case	Home:				sbus=0;				pbus=0;				break;			case	End:				if(nbus%ROWS==0)					sbus=nbus-ROWS;				else					sbus=nbus-nbus%ROWS;				pbus=nbus-1;				break;			case	'n':				n=appoint(pbus);				if(n!=-1)				{					sbus=n;					pbus=n;				}				break;			case	'a':				if(append()==0)					flag=1;				if(nbus%ROWS==0)					sbus=nbus-ROWS;				else					sbus=nbus-nbus%ROWS;				pbus=nbus-1;				break;			case	'm':				if(modify(sbus,pbus)==0)					flag=1;				break;			case	'd':				if(delete(sbus,pbus)==0)					flag=1;				break;			case	'u':				undelete(sbus,pbus);				break;			case	's':				if(save()==0)					flag=0;				break;			case	'q':				if(flag==0)					quit=1;				else					if(save()==0)						quit=1;					else						if(yn("fail to save, quit(y/n)? ")==0)							quit=1;				break;			default:				printf("\07");				break;		}	}	sigignore(SIGALRM);	erase();	refresh();	endwin();}init(){	int	i;	signal(SIGINT,SIG_IGN);	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]);	refresh();}int	readown(){	char	fn[80];	char	msg[128];	int	fd;	long	size;	sprintf(fn,"%s/bas/owner.dat",RP);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		sprintf(msg,"文件%s打开失败!",fn);		showmsg(msg);		return	fd;	}	size=lseek(fd,0L,2);	own=(struct owner *)malloc(size);	if(own==NULL)	{		showmsg("Failed to alloc memory!");		return	-1;	}	lseek(fd,0L,0);	read(fd,(char *)own,size);	close(fd);	return	size/sizeof(struct owner);}int	readgat(){	char	fn[80];	char	msg[128];	int	fd;	long	size;	sprintf(fn,"%s/bas/gate.dat",RP);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		sprintf(msg,"文件%s打开失败!",fn);		showmsg(msg);		return	fd;	}	size=lseek(fd,0L,2);	gat=(struct gate *)malloc(size);	if(gat==NULL)	{		showmsg("Failed to alloc memory!");		return	-1;	}	lseek(fd,0L,0);	read(fd,(char *)gat,size);	close(fd);	return	size/sizeof(struct gate);}int	readmod(){	char	fn[80];	char	msg[128];	int	fd;	long	size;	sprintf(fn,"%s/bas/model.dat",RP);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		sprintf(msg,"文件%s打开失败!",fn);		showmsg(msg);		return	fd;	}	size=lseek(fd,0L,2);	mod=(struct model *)malloc(size);	if(mod==NULL)	{		showmsg("Failed to alloc memory!");		return	-1;	}	lseek(fd,0L,0);	read(fd,(char *)mod,size);	close(fd);	return	size/sizeof(struct model);}readlsta(){	struct	rstation{		int	bus;		int	sta;		unsigned	price;		unsigned	bprice;	}*rsta;	struct	station{		int	no;		char	code[5];		char	name[10];		unsigned int	howfar;	}*sta,tsta;	int	nsta,nrsta;	int	lsta[MAXBUS];	char	fn[80];	char	msg[128];	int	fd;	long	size;	int	i,j,k,n;	sprintf(fn,"%s/tmp/route.dat",RP);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		sprintf(msg,"文件%s打开失败!",fn);		/*showmsg(msg);*/		for(i=0;i<nbus;i++)			strcpy(ssta[i],"(无)");		return	fd;	}	size=lseek(fd,0L,2);	rsta=(struct rstation *)malloc(size);	if(rsta==NULL)	{		showmsg("Failed to alloc memory!");		return	-1;	}	lseek(fd,0L,0);	read(fd,(char *)rsta,size);	close(fd);	nrsta=size/sizeof(struct rstation);	for(i=0;i<nbus;i++)		lsta[i]=-1;	for(i=0;i<nrsta;i++)	{		j=0;		k=nbus-1;		while(j<=k)		{			n=(j+k)/2;			if(rsta[i].bus<bus[n].no)				k=n-1;			else				if(rsta[i].bus>bus[n].no)					j=n+1;				else				{					lsta[n]=rsta[i].sta;					break;				}		}	}	free(rsta);	sprintf(fn,"%s/bas/stas.dat",RP);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		sprintf(msg,"文件%s打开失败!",fn);		showmsg(msg);		return	fd;	}	size=lseek(fd,0L,2);	sta=(struct station *)malloc(size);	if(sta==NULL)	{		showmsg("Failed to alloc memory!");		return	-1;	}	lseek(fd,0L,0);	read(fd,(char *)sta,size);	close(fd);	nsta=size/sizeof(struct station);	size=sizeof(struct station);	/* now to sort station */	k=nsta/2;	while(k>0)	{		for(j=k;j<nsta;j++)		{			memcpy(&tsta,sta+j,size);			i=j-k;			while(i>=0&&sta[i].no>sta[j].no)			{				memcpy(sta+i+k,sta+i,size);				i-=k;			}			memcpy(sta+i+k,&tsta,size);		}		k/=2;	}	for(i=0;i<nbus;i++)	{		j=0;		k=nsta-1;		while(j<=k)		{			n=(j+k)/2;			if(lsta[i]<sta[n].no)				k=n-1;			else				if(lsta[i]>sta[n].no)					j=n+1;				else				{					strcpy(ssta[i],sta[n].name);					break;				}		}		if(j>k)			strcpy(ssta[i],"(无)");	}	free(sta);}int	readbus(){	char	fn[80];	char	msg[128];	int	fd;	long	size;	sprintf(fn,"%s/bus.dat",homedir);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		sprintf(msg,"文件%s打开失败!",fn);		showmsg(msg);		return	fd;	}	else	{		size=lseek(fd,0L,2);		if(size>MAXBUS*sizeof(struct buses))			size=MAXBUS*sizeof(struct buses);		lseek(fd,0L,0);		read(fd,(char *)bus,size);		close(fd);		return	size/sizeof(struct buses);	}}/*int	readbbus(){	char	fn[80];	char	msg[128];	int	fd;	long	size;	sprintf(fn,"%s/bas/bus.dat",RP);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		sprintf(msg,"文件%s打开失败!",fn);		showmsg(msg);		return	fd;	}	else	{		size=lseek(fd,0L,2);		bbus=(struct buses *)malloc(size);		if(bbus==NULL)		{			showmsg("为正常班次数据分配内存出错!");			close(fd);			return	-1;		}		lseek(fd,0L,0);		read(fd,(char *)bbus,size);		close(fd);		return	size/sizeof(struct buses);	}}*/int	append(){	char	ret=0;	int	i,j;	int	no,time,owner,rate,gate,model,nseat;	int	nb,sb,pb;	nb=nbus;	sb=nbus-nbus%ROWS;	while(ret==0)	{		nbus++;		if(nbus>=MAXBUS)		{			showmsg("空间已满, 不能再增加!");			break;		}		pb=nbus-1;		delf[pb]=0;		order[pb]=pb;		if(nbus>1)			no=bus[order[pb-1]].no+1;		else			no=0;		time=0;		owner=(nown>0) ? own[0].no : 0;		rate=RATE;		gate=(ngat>0) ? gat[0].no : 0;		model=(nmod>0) ? mod[0].no : 0;		nseat=0;		bus[pb].no=no;		strcpy(ssta[pb],"(无)");		bus[pb].time=time;		bus[pb].owner=owner;		bus[pb].rate=rate;		bus[pb].gate=gate;		bus[pb].model=model;		bus[pb].nseat=nseat;		if(pb-sb>=ROWS)			sb++;		show(sb,pb);		while(ret==0)			if(get_n(pb-sb+ROW,col[0],"",&no,col[1]-col[0])==-1)				ret=1;			else                         if(checkbus(no)==-1)                               showmsg("该班次在计划中已经存在!");                         else			{				for(i=0;i<nbus;i++)					if(no==bus[i].no&&i!=pb)						break;/*				for(j=0;j<nbbus&&no!=bbus[j].no;j++)					;*/				if(i<nbus/*||j<nbbus*/)					showmsg("此车次有重复!");				else					break;			}		while(ret==0)			if(get_n(pb-sb+ROW,col[2],"",&time,col[3]-col[2])==-1)				ret=1;			else				if(time<0||time>=2400)					showmsg("错误的时间!");				else				{					mvprintw(pb-sb+ROW,col[2],"%2d:%02d",						time/100,time%100);					refresh();					break;				}

⌨️ 快捷键说明

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