《叫号机操作系统》-源代码

/***********************************************************  
* 版权所有 (C)2016,wangxiuwen  
* 文件名称: main.c  
* 文件标识:无  
* 内容摘要:叫号器操作系统 
* 其它说明:无  
* 当前版本: V1.0 
* 作 者:王修文  
* 完成日期: 2016.12.27 
 
* 修改记录: 1 
* 修改日期: 2016.12.27 
* 版本号: V1.0  
* 修改人: 王修文 
* 修改内容:创建  
**********************************************************/

主函数main.c

#include "LinkList.h"  
#include "Mine.h"  

/*
提示:
普通用户交款回执码统一默认为:1
加急用户交款回执码统一默认为:2
管理员密码默认为:1
*/

int main()					
{
	LinkList *L;			
    InitList(L);				//初始化单链表
	int n;
	for (;;)
	{
		index();				//调用索引函数
		scanf("%d",&n);	
		if (n==1)				//普通挂号
		{
			ordinary(L);		//调用相应函数
		}
		else if (n==2)			//加急挂号
		{
			urgent(L);			//调用相应函数
		}
		else if (n==3)			//退号
		{
			back(L);			//调用相应函数
		}
		else if (n==4)			//管理员
		{
			administrator(L);	//调用相应函数
		}
		else
		{
			break;
		}
	}
	return 0;
}


/***********************************************************  
* 版权所有 (C)2016,wangxiuwen  
* 文件名称: mine.h  
* 文件标识:无  
* 内容摘要:叫号器操作系统 
* 其它说明:无  
* 当前版本: V1.0 
* 作 者:王修文  
* 完成日期: 2016.12.27 
 
* 修改记录: 1 
* 修改日期: 2016.12.27 
* 版本号: V1.0  
* 修改人: 王修文 
* 修改内容:创建  
**********************************************************/
头函数mine.h
#include <stdio.h>
#include <windows.h>

void index();							//索引

void index_();							//管理员索引

void ordinary(LinkList *L);				//普通号
		
void urgent(LinkList *L);				//加急号

void back(LinkList *L);					//退号

void administrator(LinkList *L);		//管理员

bool add1(LinkList *&L,int shenfen);	//普通号入链

bool add2(LinkList *&L,int shenfen);	//加急号入链

bool shenfen1(int a);					//验证身份证号是否为4位数
	
bool shenfen2(LinkList *&L,int a);		//验证身份证号是否重复

bool pay1();							//普通号交款

bool pay2();							//加急号交款

void sleep05();							//延时0.5s清屏

void sleep3();							//延时3s清屏

bool Aback(LinkList *&L);				//普通号退号

bool Tback(LinkList *&L);				//加急号退号

bool mima();							//判断管理员密码


/***********************************************************  
* 版权所有 (C)2016,wangxiuwen  
* 文件名称: mine.c 
* 文件标识:无  
* 内容摘要:叫号器操作系统 
* 其它说明:无  
* 当前版本: V1.0 
* 作 者:王修文  
* 完成日期: 2016.12.27 
 
* 修改记录: 1 
* 修改日期: 2016.12.27 
* 版本号: V1.0  
* 修改人: 王修文 
* 修改内容:创建  
**********************************************************/
源函数mine.c
#include "LinkList.h"  
#include "mine.h"  

int num1=1;								//普通用户程序内部代号
int num2=1;								//加急用户程序内部代号

//索引实现*********************************************************************************************************************************
void index()
{
	printf("欢迎光临烟台大学移动公司\n");
	printf("\n");
	printf("1、普通挂号\n");
	printf("2、加急挂号\n");
	printf("3、退号    \n");
	printf("4、管理员  \n");
	printf("任意键退出 \n");
	printf("请输入:");
	printf("\n");
}

//普通号实现*******************************************************************************************************************************
void ordinary(LinkList *L)
{	
	sleep05();
	printf ("请输入您的身份证号后四位:\n");
	int shenfen;
	scanf("%d",&shenfen);
	sleep05();

	if ( !shenfen1(shenfen) )			//判断输入身份证号是否为4位					
	{
		printf ("输入错误!请重新操作\n\n");
		sleep3();
		return;
	}

	if ( !shenfen2(L,shenfen) )			//判断输入身份证号是否是否重复
	{
		printf ("该用户已在队伍中!请重新操作\n\n");
		sleep3();
		return;
	}

	if (!pay1())						//判断是否交款成功
	{
		printf ("回执码错误!请重新操作\n\n");
		sleep3();
		return; 
	}

	add1(L,shenfen) ;					//加入链表队伍中
	printf ("********************");	//输出用户信息
	printf("\n您的号码为:A%d 号\n",num1);
	int j=ListLength(L)-1;
	printf("您的前面有:%d 位用户\n",j); 
	printf ("********************\n\n");
	sleep3();

	num1++;								//下一个用户代号
}

//加急号实现*******************************************************************************************************************************
void urgent(LinkList *L)
{
	sleep05();
	if(ListEmpty(L))					//判断队伍是否需要开放加急号
	{
		printf ("您目前是第一位,请申请普通号!请重新操作\n\n");
		sleep3();
		return;
	}

	printf ("请输入您的身份证号后四位:\n");
	int shenfen;
	scanf("%d",&shenfen);
	sleep05();

	if ( !shenfen1(shenfen) )			//判断输入身份证号是否为4位					
	{
		printf ("输入错误!请重新操作\n\n");
		sleep3();
		return;
	}

	if ( !shenfen2(L,shenfen) )			//判断输入身份证号是否是否重复
	{
		printf ("该用户已在队伍中!请重新操作\n\n");
		sleep3();
		return;
	}

	if (!pay2())						//判断是否交款成功
	{
		printf ("回执码错误!请重新操作\n\n");
		sleep3();
		return; 
	}

	add2(L,shenfen) ;					//加入链表队伍中
	printf ("********************");	//输出用户信息
	printf("\n您的号码为:T%d 号\n",num2);
	int j=num2-1;
	printf("您的前面有:%d 位用户\n",j); 
	printf ("********************\n\n");
	sleep3();

	num2++;								//下一个用户代号
}

//退号实现*********************************************************************************************************************************
void back(LinkList *L)
{
	sleep05();
	char type;
	printf ("清输入您的号码类型(A/T):\n");
	scanf ("%s",&type);
	sleep05();

	if (type=='A')						//调用普通号退号函数
	{
		if (Aback(L))					
		{
			printf ("退号成功!请凭回执码 1 至取款处取款\n\n");
			sleep3();
			return;
		}
		else 
		{
			return;
		}
	}
	else if (type=='T')					//调用加急号退号函数
	{
		if (Tback(L))
		{
			printf ("退号成功!请凭回执码 2 至取款处取款\n\n");
			sleep3();
			return;
		}
		else 
		{
			return;
		}
	}
	else 
	{
		printf ("不存在该类型!请重新操作\n\n");
		sleep3();
		return; 
	}

}

//管理员实现*******************************************************************************************************************************
void administrator(LinkList *L)
{
	sleep05();
	while (!mima())						//判断密码是否正确
	{
		return;
	}

	index_();
	int i;
	scanf ("%d",&i);
	sleep05();

	if (i==1)							//请第一位客户
	{
		if (ListEmpty(L))				//判断队伍中是否有人
		{
			printf("无人在等待!\n\n");    
			sleep3();
		}
		else							//删除第一个用户信息
		{
			LinkList *p=L,*q;
			q=p->next;
			p->next=q->next;
			free (q);
			printf("屏幕显示:请第一位客户到人工窗口进行业务办理!\n\n");
			sleep3();
		}	
	}
	else if (i==2)						//查看队伍信息
	{
		if(ListEmpty(L))
		{
			printf ("当前队伍中的成员有:\n");
			printf ("\n0 人\n\n");
			sleep3();
			
		}
		else							//显示队伍信息
		{
		
			printf ("当前队伍中的成员有:\n");
			printf ("\n");
			DispList(L);
			for (;;)
			{
				int k;						//固定队伍信息页面
				printf ("输入 1 跳转至首页面:\n");
				scanf ("%d",&k);
				while (k==1)
				{
					sleep05();
					return ;
				}
			}
		}
	}
	else if (i==3)						//清空队伍
	{
		DestroyList(L);
		printf ("操作成功!当前队伍已经为空\n\n");
		sleep3();
	}
	else								//退出管理员系统
	{
		return;

	}
}

//普通号入链实现***************************************************************************************************************************
bool add1(LinkList *&L,int shenfen)  
{ 
    LinkList *p=L,*s;  
	while (p->next!=NULL)			//找到当前队伍中的最后一名
	{ 
		p=p->next;  
	}  
    s=(LinkList *)malloc(sizeof(LinkList)); 
    s->data=shenfen;  
	s->num=num1;
	s->type='A';
    s->next=p->next;                        
    p->next=s; 	
    return true;

}

//加急号入链实现***************************************************************************************************************************
bool add2(LinkList *&L,int shenfen)
{
	LinkList *p=L,*s;  
	while (p->next->type=='T')			//找到当前队伍中的最后一名
	{ 
		p=p->next;  
	} 
	
	s=(LinkList *)malloc(sizeof(LinkList)); 
    s->data=shenfen;  
	s->num=num2;
	s->type='T';
    s->next=p->next;                        
    p->next=s; 
    return true;
}

//检查身份证号是否正确且唯一***************************************************************************************************************
bool shenfen1(int a)
{
	if (999<a&&a<10000)				//检测输入的数是否为4位数
	{
		return true;
	}
	else 
	{
		return false;
	}
}

//检查身份证号是否重复*********************************************************************************************************************
bool shenfen2(LinkList *&L,int a)
{
	LinkList *p=L->next;

	while (p!=NULL)  
    {  
		if (p->data==a)
		{
			return false;
		}
		else
		{
			p=p->next;  
		}
    }
	return true;
}

//普通号交款*******************************************************************************************************************************
bool pay1()
{
	printf ("请至交款处交款5元,并输入交款回执号:\n");
	int k;
	scanf ("%d",&k);
	sleep05();

	if (k!=1)
	{
		return false;
	}
	return true;
}

//加急号交款*******************************************************************************************************************************
bool pay2()
{
	printf ("请至交款处交款100元,并输入交款回执号:\n");
	int k;
	scanf ("%d",&k);
	sleep05();

	if (k!=2)
	{
		return false;
	}
	return true;
}

//延时3s清屏*******************************************************************************************************************************
void sleep3()
{
	printf ("3秒后自动跳转至首页\n");
	Sleep (1000);
	printf ("2秒后自动跳转至首页\n");
	Sleep (1000);
	printf ("1秒后自动跳转至首页\n");
	Sleep (1000);

	/*Sleep (500);*/

	system("cls");
}

//延时0.5s清屏*****************************************************************************************************************************
void sleep05()
{
	printf ("处理中,请稍候\n");
	printf ("[");
	for (int j=0;j<35;j++)
	{
		printf (">");
		Sleep (15);
	}
	printf ("]");
	Sleep (300);
	system("cls");
}

//普通号退号*******************************************************************************************************************************
bool Aback(LinkList *&L)
{
	int i;
	printf ("请输入您的身份证号码后四位:\n");
	scanf ("%d",&i);
	sleep05();

	LinkList *q,*p=L;
	while ( p!=NULL && p->type!='A')			//找到普通号第一位
    {  
		q=p;
        p=p->next;   
    } 

	while (p!=NULL && p->data!=i)				//找到该用户 
    {  
		q=p;
        p=p->next;  
    } 

	if (p==NULL)  
	{
		printf ("您输入的号码不存在!请重新操作\n\n");
		sleep3();
		return false;			
	}
	else										//实现退号
	{
		int j;
		printf ("请输入您的排队号码:\n");
		scanf ("%d",&j);

		if (p->num==j)							//判断排队号与身份证号是否对应
		{
			sleep05();
			q->next=p->next;
			free(p);
			return true;  
		}
		else 
		{
			sleep05();
			printf ("排队号码与身份证号不符!请重新操作\n\n");
			sleep3();
			return false;
		}	
	}
}

//加急号退号*******************************************************************************************************************************
bool Tback(LinkList *&L)
{
	int i;
	printf ("请输入您的身份证号码后四位:\n");
	scanf ("%d",&i);
	sleep05();
	LinkList *q,*p=L;

	while (p!=NULL && p->type!='T')			//找到加急号第一位
    {  
		q=p;
        p=p->next;   
    } 

	while (p!=NULL && p->data!=i)			//找到该用户
    {  
		q=p;
        p=p->next;  
    } 

	if (p==NULL)  
	{
		printf ("您输入的号码不存在!请重新操作\n\n");
		sleep3();
		return false;			
	}
	else								
	{
		int j;
		printf ("请输入您的排队号码:\n");
		scanf ("%d",&j);
		if (p->num==j)						//判断排队号与身份证号是否对应
		{
			sleep05();
			q->next=p->next;
			free(p);
			return true;  
		}
		else 
		{
			sleep05();
			printf ("排队号码与身份证号不符!请重新操作\n\n");
			sleep3();
			return false;
		}
	}
}

//管理员索引实现***************************************************************************************************************************
void index_()
{
	printf("1、有请当前队伍的第一位\n");
	printf("2、查看目前队伍信息\n");
	printf("3、清空队伍\n");
	printf("任意键退出\n");
	printf("请输入:");
	printf("\n");
}

//判断管理员密码是否正确*******************************************************************************************************************
bool mima()
{
	int i;
	printf ("请输入管理员密码:\n");
	scanf ("%d",&i);
	sleep05();
	if (i==1)
	{
		return true;
	}
	else 
	{
		printf ("密码输入错误!请重新操作\n\n");
		sleep3();
		return false;
	}
}


/***********************************************************  
* 版权所有 (C)2016,wangxiuwen  
* 文件名称: LinkList.h  
* 文件标识:无  
* 内容摘要:叫号器操作系统 
* 其它说明:无  
* 当前版本: V1.0 
* 作 者:王修文  
* 完成日期: 2016.12.27 
 
* 修改记录: 1 
* 修改日期: 2016.12.27 
* 版本号: V1.0  
* 修改人: 王修文 
* 修改内容:创建  
**********************************************************/
头函数LinkList.h
#include <stdio.h>  
#include <malloc.h>  

typedef int ElemType;  
typedef struct LNode        //定义单链表结点类型  
{  
    ElemType data;  
	ElemType num;
	char type;
    struct LNode *next;     //指向后继结点  
}LinkList; 

void InitList(LinkList *&L);							//初始化线性表  

void DestroyList(LinkList *&L);							//销毁线性表  

bool ListEmpty(LinkList *L);							//判断线性表是否为空  

int ListLength(LinkList *L);							//求线性表长度  

void DispList(LinkList *L);								//输出线性表  

bool GetElem(LinkList *L,int i,ElemType &e);			//求线性表某个数据元素值  

int LocateElem(LinkList *L,ElemType e);					//按元素值查找  

bool ListInsert(LinkList *&L,int i,ElemType e);			//插入数据元素  

bool ListDelete(LinkList *&L,int i,ElemType &e);		//删除数据元素  

/***********************************************************  
* 版权所有 (C)2016,wangxiuwen  
* 文件名称: LinkList.c  
* 文件标识:无  
* 内容摘要:叫号器操作系统 
* 其它说明:无  
* 当前版本: V1.0 
* 作 者:王修文  
* 完成日期: 2016.12.27 
 
* 修改记录: 1 
* 修改日期: 2016.12.27 
* 版本号: V1.0  
* 修改人: 王修文 
* 修改内容:创建  
**********************************************************/

源函数LinkList.c

#include "LinkList.h"  
 
//初始化链表*******************************************************************************************************************************
void InitList(LinkList *&L)  
{  
    L=(LinkList *)malloc(sizeof(LinkList));     //创建头结点 
	L->type ='T';
    L->next=NULL;  
}  

//销毁单链表*******************************************************************************************************************************
void DestroyList(LinkList *&L)     
{
    while (L->next==NULL)
	{
		return ;
	}
    LinkList *p=L->next ,*q=p->next;			//p指向*q的前驱节点    
    while (q!=NULL)								//循环判断 逐个销毁    
    {    
        free(p);								//释放*p节点    
        p=q;									//p、q同步后移一个节点    
        q=p->next;								//再赋值    
    }    
    free(p);									//此时q为NULL,p指向尾结点,释放它   
	
	L->next=NULL;
} 

//判断链表是否为空*************************************************************************************************************************
bool ListEmpty(LinkList *L)  
{  
    return(L->next==NULL);  
}  

//求链表长度*******************************************************************************************************************************
int ListLength(LinkList *L)  
{  
    LinkList *p=L;  
    int i=0;  
    while (p->next!=NULL)  
    {  
        i++;  
        p=p->next;  
    }  
    return(i);  
}  

//输出链表*********************************************************************************************************************************
void DispList(LinkList *L)  
{  
	int i=1;
    LinkList *p=L->next;  
    while (p!=NULL)  
    {  
        printf("第%d位:%d 号码:%c%d\n",i,p->data,p->type,p->num);  
        p=p->next;  
		i++;
    }  
    printf("\n");  
} 

//求链表中某个元素的值*********************************************************************************************************************
bool GetElem(LinkList *L,int i,ElemType &e)  
{  
    int j=0;  
    LinkList *p=L;  
    while (j<i && p!=NULL)  
    {  
        j++;  
        p=p->next;  
    }  
    if (p==NULL)            //不存在第i个数据结点  
        return false;  
    else                    //存在第i个数据结点  
    {  
        e=p->data;  
        return true;  
    }  
}  

//按元素查找*******************************************************************************************************************************
int LocateElem(LinkList *L,ElemType e)  
{  
    LinkList *p=L->next;  
    int n=1;  
    while (p!=NULL && p->data!=e)  
    {  
        p=p->next;  
        n++;  
    }  
    if (p==NULL)  
        return(0);  
    else  
        return(n);  
}  

//插入数据元素*****************************************************************************************************************************
bool ListInsert(LinkList *&L,int i,ElemType e)  
{  
    int j=0;  
    LinkList *p=L,*s;  
    while (j<i-1 && p!=NULL)					//查找第i-1个结点  
    {  
        j++;  
        p=p->next;  
    }  
    if (p==NULL)								//未找到位序为i-1的结点  
        return false;  
    else										//找到位序为i-1的结点*p  
    {  
        s=(LinkList *)malloc(sizeof(LinkList)); //创建新结点*s  
        s->data=e;  
        s->next=p->next;                        //将*s插入到*p之后  
        p->next=s;  
        return true;  
    }  
}  

//删除数据元素*****************************************************************************************************************************
bool ListDelete(LinkList *&L,int i,ElemType &e)  
{  
    int j=0;  
    LinkList *p=L,*q;  
    while (j<i-1 && p!=NULL)    //查找第i-1个结点  
    {  
        j++;  
        p=p->next;  
    }  
    if (p==NULL)                //未找到位序为i-1的结点  
        return false;  
    else                        //找到位序为i-1的结点*p  
    {  
        q=p->next;              //q指向要删除的结点  
        if (q==NULL)  
            return false;       //若不存在第i个结点,返回false  
        e=q->data;  
        p->next=q->next;        //从单链表中删除*q结点  
        free(q);                //释放*q结点  
        return true;  
    }  
}


运行过程截图:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值