C语言课程设计-票务管理系统

前言

课程设计终于验收完毕喽!可喜可贺,可喜可贺!

第一次做这样的东西所以不是很熟练,也参考了许多代码,尽管如此代码依然有些粗糙,功能也不全面,甚至还和实际不太相符。请大家多多包涵!

基本功能

  • 用户注册
  • 用户登录
  • 显示全部车票信息
  • 查询车票信息
  • 订票
  • 退票
  • 切换账号
  • 退出登录

其实还想做一个改签的功能,但是一想到这样的话明天就多了一节早八(那种事情不要啊! ),便放弃了。

源代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h> //遮掩密码时使用
#include <windows.h>

int ans;

struct passenger
{
    char name[20];              //姓名
    char ID[20];                //身份证号
    char user_start[50];        //起始站
    char user_end[50];          //终点站
    char user_begin_time[50];   //出发时间
    char user_end_time[50];     //到达时间
    char user_data[50];         //出发日期
    char user_train_id[50];     //车次信息
    char user_time[50];         //运行时间
    int ticket_num;             //所需票数
}use[10];

typedef struct train
{
    char start[20];     //起始站
    char end[20];       //终点站
    char begin_time[20];//出发时间
    char end_time[20];  //到达时间
    char data[20];      //出发日期
    char train_id[20];  //车次信息
    char time[20];      //运行时间
    int ticket_lea;     //余票数量
    int ticket_price;   //票价
}TRAIN;

struct node
{
    TRAIN item;
    struct node *next;
};

#define NODE struct node



void meau();                            //菜单页面
void registered();                      //注册账号
void login();                           // 登录
NODE *read_inf();               //读取车票文件信息
void output(NODE *head);         //显示信息
int Listlength(NODE *head);      //记录链表长度
void query(NODE *head);           //查询车票
int book(NODE *head);              //购票
int back(NODE *head);              //退票
int Display();                            //显示订票信息
void traverse(NODE *head);         //遍历链表数据,覆盖文件


int main()              //主函数
{

    printf("\t\t\t");
    system("color 6");      //橙色
    printf("欢迎使用车票管理系统!\n\n");
    Sleep(1000);

    printf("\t\t\t即将进入登陆注册页面请稍候.....");
	Sleep(2000);
	system("cls"); //清屏

    system("color 3");      //浅蓝色

    int x;
    printf("\t\t1.登录\t\t2.注册并登录\n");
    printf("请选择序号:");
    reset1:scanf("%d",&x);
    if(x==1)
        login();
    else if(x==2)
    {
        registered();
        login();
    }
    else
    {
        printf("请输入正确的命令!\n");
        goto reset1;
    }

    NODE *head;
    head=(NODE *)malloc(sizeof(NODE));
    head->next=NULL;

    int choice;
    while(1)
    {
        meau();

        scanf("%d",&choice);
        head=read_inf();
        switch(choice)
        {
            case 1:system("cls");output(head);break;
            case 2:system("cls");query(head);break;
            case 3:system("cls");book(head);break;
            case 4:system("cls");back(head);break;
            case 5:system("cls");Display(head);break;
            case 6:system("cls");login();break;
            case 7:system("cls");exit(1);
            default:printf("请输入正确的编号!\n");
            break;
        }
    }




    return 0;
}


void registered()
{
    char user_id[50];         //注册用户名
    char user_password[50];     //注册密码
    char user_again[50];        //确认密码

    printf("请输入您的用户名:");
    scanf("%s",user_id);

    reset:printf("请设置您的密码:");

    scanf("%s",user_password);

    printf("请再次输入您的密码:");
    scanf("%s",user_again);

    if(strcmp(user_password,user_again)==0)
    {
        FILE *fp;
        fp=fopen("register.txt","at");      //追加方式储存多个信息,t表示打开txt

        if(fp==NULL)
        {
            printf("文件不存在!");
            exit(1);
        }

        fprintf(fp,"%s %s\n",user_id,user_password);
        printf("\n\t------注册成功------\n");
        Sleep(1500);
        system("cls");
        fclose(fp);
    }
    else if(strcmp(user_password,user_again)!=0)
    {
        printf("您两次输入的密码不一致,请重新设置密码!\n");
        goto reset;
    }
}

void login()
{
    int i=0;
    char user_id[50];           //注册用户名
    char user_password[50];     //注册密码
    char user_name[50];         //登陆用户名
    char user_passwords[50];    //登陆密码
    char ch;

    printf("请输入您的用户名:");
    scanf("%s",user_name);

    printf("请输入您的密码:");

    while((ch=getch())!='\r')
    {
        if(ch=='\b')       //backspace的ASCII码为8
        {
            if(i>0)
            {
                i--;
                printf("\b \b");
            }
            else
                putchar(7);  //ASCII码7表示响铃
        }
        else
        {
            user_passwords[i++]=ch;
            printf("*");
        }
    }
    user_passwords[i]='\0';

    FILE *fp;
    fp=fopen("register.txt","rt");

    if(fp==NULL)
    {
        printf("文件不存在!");
        exit(1);
    }
    int f=0;
    while(fscanf(fp,"%s %s",user_id,user_password)!=EOF)
    {

        if(strcmp(user_id,user_name)==0&&strcmp(user_password,user_passwords)==0)
         {
             system("cls");
             f=1;
             printf("\n\t\t     --------登陆成功--------\n");
             printf("\t\t     ------欢迎进入系统------\n");
             return ;
		 }
    }
    if(f==0)
	{
		printf("\n信息输入错误!\n");
	     login();
	}
	fclose(fp);
}

void meau()
{
    printf("\n");
    printf("\t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
    printf("\t☆==============欢迎使用车票管理系统==============☆\n");
    printf("\t☆~~~~~~~~~~~~~~~1.显示车票信息~~~~~~~~~~~~~~~~~~~☆\n");
    printf("\t☆~~~~~~~~~~~~~~~2.查询车票信息~~~~~~~~~~~~~~~~~~~☆\n");
    printf("\t☆~~~~~~~~~~~~~~~3. 订     票~~~~~~~~~~~~~~~~~~~~~☆\n");
    printf("\t☆~~~~~~~~~~~~~~~4. 退     票~~~~~~~~~~~~~~~~~~~~~☆\n");
    printf("\t☆~~~~~~~~~~~~~~~5.显示已预定车票~~~~~~~~~~~~~~~~~☆\n");
    printf("\t☆~~~~~~~~~~~~~~~6.切换账号登录~~~~~~~~~~~~~~~~~~~☆\n");
    printf("\t☆~~~~~~~~~~~~~~~7.退出管理系统~~~~~~~~~~~~~~~~~~~☆\n");
    printf("\t☆================================================☆\n");
    printf("\t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
    printf("请选择编号(1-8)选择功能进行相应的操作:");
}

NODE *read_inf()
{
    NODE *head,*p,*r;

    FILE *fp;

    if((fp=fopen("information.txt","rt"))==NULL)
    {
        printf("读取文件出错,按任意键退出!");
        getch();
        exit(1);
    }

    head=(NODE*)malloc(sizeof(NODE));
    head->next=NULL;

    fscanf(fp,"%s %s %s %s %s %s %s %d %d",head->item.start,head->item.end,head->item.begin_time,head->item.end_time,head->item.data,head->item.train_id,head->item.time,&head->item.ticket_lea,&head->item.ticket_price);

    r=head;

    while(!feof(fp))  //使用feof之前先读一次文件
    {
        p=(NODE*)malloc(sizeof(NODE));
        fscanf(fp,"%s %s %s %s %s %s %s %d %d",p->item.start,p->item.end,p->item.begin_time,p->item.end_time,p->item.data,p->item.train_id,p->item.time,&p->item.ticket_lea,&p->item.ticket_price);
        r->next=p;
        r=p;
    }
    r->next=NULL;

    fclose(fp);
    //printf("\n\t刷新成功,按任意键退出!\n");
    //getch();
    system("cls");
    return head;
}

void output(NODE *head)
{
    int len1,len2=0;
    len1=Listlength(head);
    NODE *p;
    p=head;
    printf("\t\t\t******车票信息如下******\n");
    printf("起始站    终点站    出发时间    到达时间      出发日期     车次信息     运行时间    余票量      票价\n");
    while(p!=NULL)
    {
        if(len1==len2)
            break;
        printf("%-10s",p->item.start);
        printf("%-10s",p->item.end);
        printf("%-10s",p->item.begin_time);
        printf("  %-10s",p->item.end_time);
        printf("    %-10s",p->item.data);
        printf("    %-10s",p->item.train_id);
        printf("  %-10s",p->item.time);
        printf("   %-d",p->item.ticket_lea);
        printf("\t\t%-d",p->item.ticket_price);
        printf("\n");
        p=p->next;
        len2++;
    }
    printf("\n\t\t\t按任意键返回主菜单!\n");
    char ch;
    getch();
    system("cls");
    return 0;

}

int Listlength(NODE *head)
{
    NODE *p;
    int len=0;

    p=head;

    while(p!=NULL)
    {
        len++;
        p=p->next;
    }

    return len-1;
}

void query(NODE *head)
{
    char train_go[50];
    char train_end[50];

    reset8:printf("请输入您查询车票的起始站:");
    scanf("%s",train_go);

    printf("请输入您查询车票的终点站:");
    scanf("%s",train_end);



    NODE *p;
    p=head;

    int f=0,cnt=0;
    while(p!=NULL)
    {
        if(strcmp(p->item.start,train_go)==0&&strcmp(p->item.end,train_end)==0)
        {
            cnt++;
            if(cnt==1)
            {
                 printf("\n\t\t\t******车票信息如下******\n");
                printf("起始站    终点站    出发时间    到达时间      出发日期     车次信息     运行时间    余票量      票价\n");
            }

            f=1;
            printf("%-10s",p->item.start);
            printf("%-10s",p->item.end);
            printf("%-10s",p->item.begin_time);
            printf("  %-10s",p->item.end_time);
            printf("    %-10s",p->item.data);
            printf("    %-10s",p->item.train_id);
            printf("  %-10s",p->item.time);
            printf("   %-d",p->item.ticket_lea);
            printf("\t\t%-d",p->item.ticket_price);
            printf("\n");
        }
        p=p->next;
    }
    if(f==0)
    {
        printf("\n\t\t请输入正确的车次信息!\n\n");
        Sleep(1000);
        system("cls");
        goto reset8;
    }

        printf("\n\t\t\t按任意键返回主菜单!\n");
        char ch;
        getch();
        system("cls");
        return 0;

}

int book(NODE *head)
{
    char yh_name[50];
    char yh_id[50];
    char yh_start[50];
    char yh_end[50];
    char yh_train_id[50];
    int number=0;
    int sum_cost=0;

    NODE *p;
    p=head;

    printf("请输入您的姓名:");
    scanf("%s",yh_name);

    reset2:printf("请输入您的身份证号:");
    scanf("%s",yh_id);

    int f=0;
    if(strlen(yh_id)!=18)
        f=1;

    if(f)
    {
        printf("请输入正确的身份证号码!\n");
        Sleep(500);
        goto reset2;
    }
    else
    {

        int m=0;
        char sex=yh_id[16];
        sex=sex-'0';
        int sex1=sex;

        if(sex1%2==0)
            m=1;

        reset3:printf("请输入您所购车票的起始站:");
        scanf("%s",yh_start);

        printf("请输入您所购车票的终点站:");
        scanf("%s",yh_end);

        printf("请输入您所购车票的车次:");
        scanf("%s",yh_train_id);

        printf("请输入您所需要的车票数量:");
        scanf("%d",&number);

        int i;
        for(i=0;i<ans;i++)
        {
            if(strcmp(yh_name,use[i].name)==0&&strcmp(yh_id,use[i].ID)==0)
            {
                use[i].ticket_num+=number;
            }
        }

        while(p!=NULL)
        {
            if(strcmp(yh_start,p->item.start)==0&&strcmp(yh_end,p->item.end)==0&&strcmp(yh_train_id,p->item.train_id)==0)
            {
                if(number < p->item.ticket_lea)
                {
                    printf("找到符合信息的车次:\n");
                    printf("\t\t\t\t\t******车票信息如下******\n");
                    printf("起始站    终点站    出发时间    到达时间      出发日期     车次信息     运行时间    余票量      票价\n");
                    printf("%-10s",p->item.start);
                    printf("%-10s",p->item.end);
                    printf("%-10s",p->item.begin_time);
                    printf("  %-10s",p->item.end_time);
                    printf("    %-10s",p->item.data);
                    printf("    %-10s",p->item.train_id);
                    printf("  %-10s",p->item.time);
                    printf("   %-d",p->item.ticket_lea);
                    printf("\t\t%-d",p->item.ticket_price);
                    printf("\n\n");

                    strcpy(use[ans].user_start,p->item.start);
                    strcpy(use[ans].user_end,p->item.end);
                    strcpy(use[ans].user_begin_time,p->item.begin_time);
                    strcpy(use[ans].user_end_time,p->item.end_time);
                    strcpy(use[ans].user_data,p->item.data);
                    strcpy(use[ans].user_train_id,p->item.train_id);
                    strcpy(use[ans].user_time,p->item.time);



                    p->item.ticket_lea-=number;
                    sum_cost=number*p->item.ticket_price;
                    use[ans].ticket_num=number;
                    if(m==1)
                    {
                        printf("\t\t尊敬的%s女士,请确认您的订单\n",yh_name);
                    }
                    else
                    {
                        printf("\t\t尊敬的%s先生,请确认您的订单\n",yh_name);
                    }
                    printf("\t\t起始站:%s   终点站:%s  车次:%s   金额:%d元\n",yh_start,yh_end,yh_train_id,sum_cost);
                    reset4:printf("\t\t1.确认\t\t2.取消\n");
                    int x;
                    scanf("%d",&x);
                    if(x==1)
                    {
                        Sleep(1000);

                        traverse(head);

                    }
                    if(x==2)
                    {
                        system("cls");
                       goto reset3;
                    }

                    else if(x!=1&&x!=2)
                    {
                        printf("\t\t请输入正确命令!\n");
                        goto reset4;
                    }



                    printf("正在办理订票......\n");
                    Sleep(1000);

                    printf("恭喜您办理成功!\n");
                    Sleep(1000);

                    system("cls");

                    strcpy(use[ans].ID,yh_id);
                    strcpy(use[ans].name,yh_name);
                    ans++;
                    return 0;
                }
                else
                {
                    char ch;
                    printf("您所需要的票数超过余票数,请问是否要继续办理(Y/y || N/n)?\n");
                    getchar();
                    scanf("%c",&ch);
                    if(ch=='Y'||ch=='y')
                        goto reset3;
                    else if(ch=='n'||ch=='N')
                    {
                        printf("感谢您的使用,按任意键退出!\n");
                        getch();
                        return 0;
                    }
                }
            }
            else
                p=p->next;

        }
    }
    printf("\n很遗憾,未找到您需要的车次,请重新订票!\n");
    Sleep(1500);
    system("cls");

	book(head);
	return 0;

}

int back(NODE *head)
{
    NODE *p;

    char ch;
    char back_name[50];             //退票人姓名
    char back_start[50];            //起始站
    char back_end[50];              //终点站
    char back_trian_id[50];         //退票车次
    int back_num;                   //退票数


    p=head;

    reset5:printf("请输入您的姓名:");
    scanf("%s",back_name);
    printf("请输入您所购买车票的起始站:");
    scanf("%s",back_start);
    printf("请输入您所购买车票的终点站:");
    scanf("%s",back_end);
    printf("请输入您所购买车票的车次:");
    scanf("%s",back_trian_id);
    printf("请输入退票数:");
    scanf("%d",&back_num);

    while(p!=NULL)
    {
        if(strcmp(p->item.start,back_start)==0&&strcmp(p->item.end,back_end)==0&&strcmp(p->item.train_id,back_trian_id)==0)
        {
            int i;
            for(i=0;i<ans;i++)
            {
                if(strcmp(back_name,use[i].name)==0)
                {
                    if(back_num<=use[i].ticket_num)
                    {
                        printf("\n\t\t\t退票成功!\n");
                        p->item.ticket_lea+=back_num;
                        use[i].ticket_num-=back_num;
                        traverse(head);
                        printf("\n\t\t\t按任意键返回主菜单!\n");
                        char ch;
                        getch();
                        system("cls");
                        return 0;
                    }
                    else
                    {
                        printf("\n\t\t您输入的退票数有误,是否重新退票(Y/y || N/n):");
                        getchar();
                        scanf("%c",&ch);
                        if(ch=='y'||ch=='Y')
                            {
                                system("cls");
                                goto reset5;
                            }
                        else if(ch=='N'||ch=='n')
                        {
                            printf("\n\t\t感谢您的使用!按任意键退出!\n");
                            getch();
                            return 0;
                        }
                    }

                }
                 else
                {
                     printf("\n\t\t未找到您定的票,请问您是否重输信息继续进行退票(Y/y || N/n):");
                        getchar();
                    scanf("%c",&ch);
                    if(ch=='y'||ch=='Y')
                        {
                            system("cls");
                            goto reset5;
                        }
                    else if(ch=='N'||ch=='n')
                    {
                        printf("\n\t\t感谢您的使用!按任意键退出!\n");
                        getch();
                        system("cls");
                        return 0;
                    }
                }
            }
        }

        else
            p=p->next;
    }
    printf("\n\t\t很遗憾,未找到您要退票的车票信息,请重新退票!\n");
    system("cls");
	back(head);
	return 0;
}

int Display()
{
    char name[50];
    char id[50];

    reset7:printf("请输入您的姓名:");
    scanf("%s",name);

    printf("请输入您的身份证号:");
    reset6:scanf("%s",id);

    int f=0;
    if(strlen(id)!=18)
        f=1;

    if(f)
    {
        printf("请输入正确的身份证号码!\n");
        goto reset6;
    }

    int m=0;
    int i;
    for(i=0;i<ans;i++)
    {
        if(strcmp(name,use[i].name)==0&&strcmp(id,use[i].ID)==0)
        {
            if(use[i].ticket_num!=0)
            {
                m=1;
                printf("\n\t\t\t您预定的车票信息如下\n");
                printf("\t起始站     终点站     出发时间      到达时间      出发日期     车次信息     运行时间     预定票数\n");
                printf("\t%-10s",use[i].user_start);
                printf("  %-10s",use[i].user_end);
                printf("  %-10s",use[i].user_begin_time);
                printf("  %-10s",use[i].user_end_time);
                printf("    %-10s",use[i].user_data);
                printf("     %-10s",use[i].user_train_id);
                printf(" %-10s",use[i].user_time);
                printf("    %-10d",use[i].ticket_num);
                printf("\n");
                char ch;
                printf("\n\n\t\t\t按任意键返回主菜单!\n");
                getch();
                system("cls");
                return 0;
            }
            else
            {
                printf("\n\t\t\t\您已经没有已预定的车票\n\n");
                printf("\t\t\t按任意键返回主菜单!\n");
                char ch;
                getch();
                system("cls");
                return 0;
            }
        }
    }
    if(!m)
    {
        char ch;
        printf("未找到您的车票信息,是否重新查询(Y/y || N/n):");
         getchar();
        scanf("%c",&ch);
        if(ch=='y'||ch=='Y')
            {
                system("cls");
                goto reset7;
            }
        else if(ch=='N'||ch=='n')
        {
            printf("感谢您的使用!按任意键退出!\n");
            getch();
            system("cls");
            return 0;
        }
    }

}

void traverse(NODE *head)
{
    int len1,len2=0;
    len1=Listlength(head);
    NODE *p;
    p=head;

    FILE *fp;
    fp=fopen("information.txt","wt");

    if(fp==NULL)
    {
        printf("文件不存在!\n");
        exit(1);
    }

    while(p!=NULL)
    {   if(len1==len2)
        break;
        fprintf(fp,"%s %s %s %s %s %s %s %d %d\n",p->item.start,p->item.end,p->item.begin_time,p->item.end_time,p->item.data,p->item.train_id,p->item.time,p->item.ticket_lea,p->item.ticket_price);
        p=p->next;
        len2++;
    }
    fclose(fp);

}


实现过程中遇到的问题

读取txt文件汉字乱码

这个问题其实是汉字编码方式的问题,我的电脑txt默认时UTF-8编码,但是使用这个编码方式的话就会出现乱码,我们只需要将UTF-8改为ANSI编码方式即可。
放个链接供大家参考一下:txt文件乱码

虽然这个方法解决了乱码的问题,但是又有了新的问题出现,就是当我显示全部的车票信息的时候在最后一行总会显示出我txt文件的地址,输出链表长度发现也正好多出1,我找了好久没有发现解决办法,只好写了一个记录链表长度的函数,它的返回值时长度减去1,这样的话就能不显示地址了。

如果有大佬知道是怎么回事请务必联系我。

用*号掩盖密码无法退格

这个很容易就找到了解决方案
放几个我参考的博客的链接
退格解决代码

转义字符\b详解

feof的使用

这都要怪我上课没有听课
在使用feof之前一定要先读一次文件!!!

参考链接
feof()原理和使用方法

车票信息文件

给大家留一个我测试时使用的车票信息吧,数据很少,有兴趣的话可以自己去多找一些。提取码:7yzp

  • 15
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值