航班管理系统

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct _Plane
{
	char start_place[20];//起点
	char end_place[20];//终点
	char start_time[20];//起时间
	char end_time[20];//降时间
	char no[20];//航班号
	float price;//票价
	int num;//票数
}Plane;

typedef struct _Ticket
{
	char name[20];//姓名
	char card[20];//证件号
	char no[20];//航班号
	char num[20];//订单编号
	int count;//订票数量
}Ticket;

int Input_Plane_Info(Plane plane[],int n)
{
	system("cls");
	printf("请输入航班起点:");
	scanf("%s",&plane[n].start_place);
	printf("请输入航班终点:");
	scanf("%s",&plane[n].end_place);
	printf("请输入航班起飞时间:");
	scanf("%s",&plane[n].start_time);
	printf("请输入航班降落时间:");
	scanf("%s",&plane[n].end_time);
	printf("请输入航班号:");
	scanf("%s",&plane[n].no);
	printf("请输入航班票价:");
	scanf("%f",&plane[n].price);
	printf("请输入航班票数:");
	scanf("%d",&plane[n].num);
	printf("录入成功!\n");
	n++;
	system("pause");
	return n;
}

void Dis_Plane_Info(Plane plane[],int n)
{
	int i;
	system("cls");
	printf("%-10s%-20s%-20s%-20s%-20s%-10s%-10s\n","航班号","起点","终点","起飞时间","抵达时间","票价","票数");
	for(i=0;i<n;i++)
	{
		printf("%-10s",plane[i].no);
		printf("%-20s",plane[i].start_place);
		printf("%-20s",plane[i].end_place);
		printf("%-20s",plane[i].start_time);
		printf("%-20s",plane[i].end_time);
		printf("%-10g",plane[i].price);
		printf("%-10d\n",plane[i].num);
	}
	system("pause");
}

void Serach_Plane_Info(Plane plane[],int n)
{
	int i;
	char temp[20];
	system("cls");
	printf("请输入要查询的航班号:");
	scanf("%s",temp);
	for(i=0;i<n;i++)
	{
		if(!strcmp(temp,plane[i].no))
		{
			break;
		}
	}
	if(i==n)
	{
		printf("无该航班信息!\n");
	}
	else
	{
		printf("%-10s%-20s%-20s%-20s%-20s%-10s%-10s\n","航班号","起点","终点","起飞时间","抵达时间","票价","票数");
		printf("%-10s",plane[i].no);
		printf("%-20s",plane[i].start_place);
		printf("%-20s",plane[i].end_place);
		printf("%-20s",plane[i].start_time);
		printf("%-20s",plane[i].end_time);
		printf("%-10g",plane[i].price);
		printf("%-10d\n",plane[i].num);
	}
	system("pause");
}

int menu()
{
	int chioce;
	system("cls");
	printf("1:录入航班信息\n");
	printf("2:查询航班信息\n");
	printf("3:全部航班信息\n");
	printf("4:订票\n");
	printf("5:退票\n");
	printf("0:退出\n");
	printf("请输入选择:");
	scanf("%d",&chioce);
	while(chioce<0||chioce>5)
	{
		printf("请重新输入:");
		scanf("%d",&chioce);
	}
	return chioce;
}

void Save_Plane_Info(Plane plane[],int n)
{
	int i;
	FILE* fp;
	fp=fopen("Plane_Info.dat","w");
	for(i=0;i<n;i++)
	{
		fwrite(&plane[i],1,sizeof(Plane),fp);
	}
	fclose(fp);
}

void Load_Plane_Info(Plane plane[],int* n)
{
	FILE* fp;
	fp=fopen("Plane_Info.dat","r");
	if(fp==NULL)
	{
		return ;
	}
	while(fread(&plane[*n],1,sizeof(Plane),fp))
	{
		(*n)++;
	}
	fclose(fp);
}

void Save_Ticket_Info(Ticket rec[],int n)
{
	int i;
	FILE* fp;
	fp=fopen("Ticket_Info.dat","w");
	for(i=0;i<n;i++)
	{
		fwrite(&rec[i],1,sizeof(Ticket),fp);
	}
	fclose(fp);
}

void Load_Ticket_Info(Ticket rec[],int* n)
{
	FILE* fp;
	fp=fopen("Ticket_Info.dat","r");
	if(fp==NULL)
	{
		return ;
	}
	while(fread(&rec[*n],1,sizeof(Ticket),fp))
	{
		(*n)++;
	}
	fclose(fp);
}

int Book_Plane_Ticket(Plane plane[],int n,Ticket rec[],int m)
{
	int i;
	char temp[20];
	system("cls");
	printf("请输入要购买的航班号:");
	scanf("%s",temp);
	for(i=0;i<n;i++)
	{
		if(!strcmp(temp,plane[i].no))
		{
			break;
		}
	}
	if(i==n)
	{
		printf("无该航班信息!\n");
		system("pause");
		return m;
	}

	printf("%-10s%-20s%-20s%-20s%-20s%-10s%-10s\n","航班号","起点","终点","起飞时间","抵达时间","票价","票数");
	printf("%-10s",plane[i].no);
	printf("%-20s",plane[i].start_place);
	printf("%-20s",plane[i].end_place);
	printf("%-20s",plane[i].start_time);
	printf("%-20s",plane[i].end_time);
	printf("%-10g",plane[i].price);
	printf("%-10d\n",plane[i].num);

	printf("请输入要购买的票数:");
	scanf("%d",&rec[m].count);
	if(rec[m].count>plane[i].num)
	{
		printf("余票不足,购买失败!");
		system("pause");
		return m;
	}
	strcpy(rec[m].no,temp);
	plane[i].num=plane[i].num-rec[m].count;
	printf("请输入订购人姓名:");
	scanf("%s",&rec[m].name);
	
	printf("请输入订购人证件号:");
	scanf("%s",&rec[m].card);
	printf("请输入订单号");
	scanf("%s",&rec[m].num);
	m++;
	printf("购票成功!\n");
	system("pause");
	return m;
}

int Del_Plane_Ticket(Plane plane[],int n,Ticket rec[],int m)
{
	int i,j;
	char temp[20];
	system("cls");
	printf("请输入要退票的订单号:");
	scanf("%s",temp);
	for(i=0;i<m;i++)
	{
		if(!strcmp(temp,rec[i].num))
		{
			break;
		}
	}
	if(i==m)
	{
		printf("无该订单信息!\n");
		system("pause");
		return m;
	}

	for(j=0;j<n;j++)
	{
		if(!strcmp(plane[j].no,rec[i].no))
		{
			plane[j].num+=rec[i].count;
			break;
		}
	}

	for(j=i;j<m;j++)
	{
		rec[j]=rec[j+1];
	}
	m--;
	printf("退票成功!\n");
	system("pause");
	return m;
}

int main3()
{
	int chioce;
	Plane plane[100];
	int plane_num=0;
	Ticket rec[100];
	int rec_num=0;
	system("mode con: cols=120 lines=40");

	Load_Plane_Info(plane,&plane_num);
	Load_Ticket_Info(rec,&rec_num);
	do
	{
		chioce=menu();
		switch(chioce)
		{
		case 1:
			plane_num=Input_Plane_Info(plane,plane_num);
			Save_Plane_Info(plane,plane_num);
			break;
		case 2:
			Serach_Plane_Info(plane,plane_num);
			break;
		case 3:
			Dis_Plane_Info(plane,plane_num);
			break;
		case 4:
			rec_num=Book_Plane_Ticket(plane,plane_num,rec,rec_num);
			Save_Ticket_Info(rec,rec_num);
			Save_Plane_Info(plane,plane_num);
			break;
		case 5:
			rec_num=Del_Plane_Ticket(plane,plane_num,rec,rec_num);
			Save_Ticket_Info(rec,rec_num);
			Save_Plane_Info(plane,plane_num);
			break;
		}
	}while(chioce!=0);
	return 0;
}


#define ELE int
typedef struct list
{
	ELE data;
	struct list* next;
}Node,*pnode;

void free_list(pnode head)
{//销毁链表
	pnode p=head;
	pnode q=head;
	if(p==NULL)
		return ;
	if(p->next==head)
	{
		free(p);
		head=NULL;
		return ;
	}
	while(p->next!=head)
	{
		q=p;
		p=p->next;
		free(q);
	}
	free(p);
	free(head);
	head=NULL;
}

pnode creat_list(pnode head)
{
	int n,i;
	pnode p=NULL;
	free_list(head);//创建之前先销毁上一次的数据
	printf("请输入猴子数量:");
	scanf("%d",&n);
	while(n<=0)
	{
		printf("猴子至少为1,请重新输入\n");
		scanf("%d",&n);
	}
	head=(pnode)malloc(sizeof(Node));
	p=head;
	for(i=1;i<n;i++)
	{
		p->data=i;
		p->next=(pnode)malloc(sizeof(Node));
		p=p->next;
	}
	p->data=n;
	p->next=head;
	return head;
}

pnode kill_list(pnode head)
{
	int n,i;
	pnode p=head;
	pnode q=head;
	printf("报数到几猴子离开:");
	scanf("%d",&n);
	while(n<=1)
	{
		printf("至少为2\n");
		scanf("%d",&n);
	}

	if(head->next==head)
	{
		printf("猴子大王是%d",head->data);
		return head;
	}
	do
	{
		for(i=1;i<n;i++)
		{
			q=p;
			p=p->next;
		}
		q->next=p->next;
		printf("%d号猴子离开\n",p->data);
		free(p);
		p=q->next;
	}while(p->next!=p);
	printf("猴子大王是%d\n",p->data);
	return p;
}

int main7()
{
	system("cls");
	pnode head=NULL;
	head=creat_list(head);
	head=kill_list(head);
	free_list(head);
	system("pause");
	return 0;
}


#define Max 100         //结点的最大个数

typedef struct node{
    char data;
    struct node *lchild,*rchild;
}BinTNode;//二叉树的结点类型
typedef BinTNode *BinTree;    //定义二叉树的指针


int NodeNum,leaf;   //NodeNum为结点数,leaf为叶子数


//==========基于先序遍历算法创建二叉树==============
//=====要求输入先序序列,其中加入虚结点"#"以示空指针的位置==========
BinTree CreatBinTree()
{
    BinTree T;
    char ch;
    if((ch=getchar())=='#')
	{
		return (NULL);       //读入#,返回空指针
	}      
	T=(BinTNode *)malloc(sizeof(BinTNode));   //生成结点
	T->data=ch;
	T->lchild=CreatBinTree();        //构造左子树
	T->rchild=CreatBinTree();        //构造右子树
	return (T);
}


//======== 先序遍历=============
void Preorder(BinTree T)
{
    if(T) 
	{
		printf("%c",T->data);    //访问结点
		Preorder(T->lchild);    //先序遍历左子树
		Preorder(T->rchild);    //先序遍历右子树
    }
}

//======== 中序遍历===============
void Inorder(BinTree T)
{
    if(T) 
	{
		Inorder(T->lchild);      //中序遍历左子树
		printf("%c",T->data);    //访问结点
		Inorder(T->rchild);      //中序遍历右子树
    }
}

//========== 后序遍历============
void Postorder(BinTree T)
{
    if(T) 
	{
		Postorder(T->lchild);    //后序遍历左子树
		Postorder(T->rchild);    //后序遍历右子树
		printf("%c",T->data);    //访问结点
    }
}

//=====采用后序遍历求二叉树的深度、结点数及叶子数的递归算法========
int TreeDepth(BinTree T)
{
    int hl,hr,max;
    if(T)
	{
		hl=TreeDepth(T->lchild);    //求左深度
		hr=TreeDepth(T->rchild);    //求右深度
		max=hl>hr? hl:hr;           //取左右深度的最大值
		NodeNum=NodeNum+1;         //求结点数
		if(hl==0&&hr==0) 
		{
			leaf=leaf+1;  //若左右深度为0,即为叶子。
		}
		return(max+1);
    }
    return 0;
}

//====利用"先进先出"(FIFO)队列,按层次遍历二叉树==========
void Levelorder(BinTree T)
{
    int front=0,rear=1;
    BinTNode *cq[Max],*p;   //定义结点的指针数组cq
    cq[1]=T;                //根入队
    while(front!=rear)      
    {
		front=(front+1)%NodeNum;
		p=cq[front];            //出队
		printf("%c",p->data);     //出队,输出结点的值 
		if(p->lchild!=NULL)
		{
			rear=(rear+1)%NodeNum;
			cq[rear]=p->lchild;     //左子树入队
		}
		if(p->rchild!=NULL)
		{
			rear=(rear+1)%NodeNum;
			cq[rear]=p->rchild;     //右子树入队
		}
    }
}

//==========主函数=================
int main8()
{
    BinTree root;
    int chioce;
	system("cls");
    printf("\n");
	printf("输入先序序列创建二叉树(例如:ABD###CE##F##):"); //输入二叉树的先序序列,
	fflush(stdin);
    root=CreatBinTree();       //创建二叉树,返回根结点

	printf("\t********** 菜单 ************\n");
	printf("\t1: 先序遍历\n");    
	printf("\t2: 中序遍历\n");
	printf("\t3: 后序遍历\n");
	printf("\t4: 层序遍历\n"); //按层次遍历之前,先求出该树的结点数。
	printf("\t0: 退出\n");
	printf("\t*******************************\n");

	do 
	{
		scanf("%d",&chioce);
		switch (chioce)
		{
			case 0:
				break;

			case 1: 
				printf("先序遍历: ");
				Preorder(root);
				break;

			case 2: 
				printf("中序遍历: ");
				Inorder(root);
				break;

			case 3: 
				printf("后序遍历: ");
				Postorder(root);
				break;

			case 4: 
				printf("层次遍历: ");
				TreeDepth(root);
				Levelorder(root);
				break;

			default:
				printf("选择错误,重新选择!");
				break;
		}
		printf("\n");
	}while(chioce!=0);
	return 0;
}
void InsertSort(int a[],int n)//直接插入排序
{
	int i,j,k;
	int temp;
	for(i=1;i<n;i++)
	{
		temp=a[i];
		j=i-1;
		while(j>=0&&temp<a[j])
		{
			a[j+1]=a[j];
			j--;
		}
		a[j+1]=temp;
		printf("i=%-3d",i);
		for(k=0;k<n;k++)
			printf("%3d",a[k]);
		printf("\n");
	}
}


void BubbleSort(int R[],int n)//冒泡排序
{
	int i,j,k,flag;
	int temp;
	for(i=0;i<n-1;i++)
	{
		flag=0;
		for(j=n-1;j>i;j--)//比较,找出最小关键字的记录
			if(R[j]<R[j-1])
			{
				temp=R[j];//与进行交换,将最小关键字记录前移
				R[j]=R[j-1];
				R[j-1]=temp;
				flag=1;
			}
			if(flag==0)//中途结束算法
				return;
			printf("i=%-3d",i);
			for(k=0;k<n;k++)
				printf("%3d",R[k]);
			printf("\n");
	}
}

int menu13()
{
	int chioce;
	printf("1、直接插入排序\n");
	printf("2、改进冒泡排序\n");
	printf("3、选择排序\n");
	printf("0、退出\n");
	printf("请选择:");
	scanf("%d",&chioce);
	while(chioce<0||chioce>3)
	{
		printf("请重新选择:");
		scanf("%d",&chioce);	
	}
	return chioce;
}
		
int* In_Put(int* n)
{
	int i;
	int* a;
	printf("要排序的数量:");
	scanf("%d",n);
	a=(int*)malloc(sizeof(int)*(*n));
	printf("输入要排序数:");
	for(i=0;i<*n;i++)
	{
		scanf("%d",&a[i]);
	}

	printf("\n");
	printf("初始关键字");
	for(i=0;i<*n;i++)
		printf("%3d",a[i]);
	printf("\n");
	return a;
}

void swap(int*a,int*b)
{
    int temp;
    temp=*a;
    *a=*b;
    *b=temp;
}
void select_sort(int A[],int n)
{
	int sum=1;
    register int i,j,min,m;
    for(i=0;i<n-1;i++)
    {
        min=i;//查找最小值
        for(j=i+1;j<n;j++)
        {
            if(A[min]>A[j])
            {
                min=j;
            }
        }
        if(min!=i)
        {
            swap(&A[min],&A[i]);
            printf("第%d趟排序结果为:\n",sum++);
            for(m=0;m<n;m++)
            {
                if(m>0)
                {
                    printf("");
                }
                printf("%3d",A[m]);
            }
            printf("\n");
        }
    }
}
		
int main13()
{
	int i,n,chioce;
	int* a=NULL;
	int* p;
	system("cls");
	a=In_Put(&n);
	p=(int*)malloc(sizeof(int)*n);
	do
	{
		memcpy(p,a,sizeof(int)*n);
		chioce=menu13();

		switch(chioce)
		{
		case 0:
			free(a);
			return 0;
			break;
		case 1:
			InsertSort(p,n);
			break;
		case 2:
			BubbleSort(p,n);
			break;
		case 3:
			select_sort(p,n);
			break;
		}

		printf("最后结果");
		for(i=0;i<n;i++)
			printf("%3d",p[i]);
		printf("\n\n");
		system("pause");
		system("cls");
	}while(chioce!=0);
	free(a);
	return 0;	
}

int menu_main()
{
	int chioce;
	system("cls");
	printf("1:航班\n");
	printf("2:猴子\n");
	printf("3:二叉树\n");
	printf("4:排序\n");
	printf("0:退出\n");
	printf("请输入选择:");
	scanf("%d",&chioce);
	while(chioce<0||chioce>4)
	{
		printf("请重新选择:");
		scanf("%d",&chioce);
	}
	return chioce;
}
int main()
{
	int chioce;
	do
	{
		chioce=menu_main();
		switch(chioce)
		{
		case 1:
			main3();
			break;
		case 2:
			main7();
			break;
		case 3:
			main8();
			break;
		case 4:
			main13();
			break;
		}
	}while(chioce!=0);
	return 0;
}
# OOP(机试) 本程序总结文章:http://blog.qiji.tech/?p=10344 - - - ## 程序基本要求 一、项目名称: Air Infomation Programming 基于控制台的航班信息程序,简称AIP 二、具体要求如下: (1)显示航班信息程序主菜单,如图-1所示,包括: * 1)列出所有航班 * 2)按起飞时间查询 * 3)按目的地查询 * 4)删除航班 * 5)更新航班 * 6)退出系统 (2)列出所有航班:查出所有航班的信息,以列表形式显示,包括:编号,航班号,目的地,起飞日期。 (3)按起飞时间查询:输入起飞时间(格式如2011-2-25),查出所有这一天的航班。 (4)按目的地查询:输入目的地,查出所有飞往此地的航班。 (5)删除航班:删除指定编号的航班。 (6)更新航班:更新指定编号的航班。 (7)退出系统。 三、类的设计 需要定义如下类 * 航班信息实体类(AirInfo) * 航班编号(id) * 航班号(flight_number) * 目的地(destination) * 起飞日期(flight_date) * 航班信息管理类AirInfoManager类 * 程序入口类TestAirInfo类 四、具体要求及推荐实现步骤 1. 创建实体类AirInfo,属性私有化,根据业务提供需要的构造方法和setter/getter方法。 1. 创建航班管理AirInfoManager类,在类中提供列出所有航班的方法,按起飞时间查询的方法、按目的地查询的方法、删除航班的方法、更新航班的方法、退出程序的方法。 2. 创建TestAirInfo类,启动和运行程序。 3. 航班的信息用ArrayList(或数组)保存。 4. 要求代码规范,命名正确。 - - -
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值