简单的车票管理系统(c语言)

简单的车票管理系统(c语言)

  • 前言
  • 车票管理系统
    • 管理员登陆
      • 录入信息
      • 查询信息(分为按车次和按终点站)
    • 操作员登陆
      • 查询信息
      • 订票
      • 退票
      • 总结点击这里
      • 最最重要的在这里

前言:(作者瞎比比,没耐心请跳过)
先给大家看一张图片
简单的车票管理系统(c语言)_第1张图片
仔细看图片有没有发现什么不同
你会发现字体的颜色和窗口的标题都和自己写出来的代码运行有不一样
那么为什么么呢?
下面教给大家修改控制台标题和修改控制台前景色和背景色的方法
void SetTitle(char title); /* 设置窗口的标题 **/
void SetTitle(char *title)
{
SetConsoleTitle(title);
}

void SetColor(int foreColor, int backColor); /** 设置控制台的颜色 前景色和背景色 **/
void SetColor(int foreColor, int backColor)
{
HANDLE winHandle; //句柄
winHandle = GetStdHandle(STD_OUTPUT_HANDLE); //标准的输出设备
SetConsoleTextAttribute(winHandle, foreColor + backColor * 0x10); //设置文字颜色 //位运算
}

然后如果你的c语言和我一样菜的话你就会发现自己看不懂上面的代码是什么意思。
所以还有比上面更更加直接的方法
system(“Titile 车票管理系统”); //设置窗口标题
system(“color 02”); //修改控制台的前景色和背景色
这种方法更加简单直接 直接调用里面的函数就可以
你只需要知道他们就可以自己用了
灵活使用里的各种函数函数可以使你的程序界面显得与众不同
一下再给大家介绍几个函数
system(“cls”); //清屏函数
Sleep(); //休眠函数即程序停止在这里多久
你们一定很好奇这些鬼东西我是从哪里知道的,其实如果你和我一样有一个很强大的舍友的话你也可以知道这些,如果没有的话就去百度吧,只要你想的到的东西都可以去网上查
其实还有能播放音乐文件的方法,在这里就不和大家说了(自己去百度)
看了这么多,有什么想法?我给你们一点建议,你们可以去试试将坐标与颜色修改和控制光标这些东西结合在一起,看看能不能实现下面这种效果?

简单的车票管理系统(c语言)_第2张图片

好的 前面的都是废话!下面教大家如何做出一个简单的车票管理系统:

前言

车票管理系统

给大家一个思路图
简单的车票管理系统(c语言)_第3张图片
每一部分先直接给代码后面解释操作
给大家的代码是分块的且没有用到链表(所以写作业的朋友放弃抄袭的想法吧)
只给大家一个思想 最后需要大家自己将每个函数整合成一个程序

管理员登陆

void sysload()   /** 系统管理员登录页面 **/
{
    struct Sysinformation
    {
        char ID[10];
        char Passward[15];
    };
 struct Sysinformation User1;
 FILE *file1;
 file1=fopen("D:\\Systeminformation.txt","r+");//read
    while(feof(file1)!=EOF)
    {
        printf("\n\n\n\n\n");
        printf("                             请输入系统管理员ID:");
        gets(User1.Passward); //输入密码
        struct Sysinformation User2; //定义用于比较的用户信息
        if (file1==NULL)
        {
            printf("File no found\n"); //文件申请失败输出
            return -1;
        }
        fscanf(file1,"%s %s\n",User2.ID,User2.Passward); //写入文件
        if(strcmp(User1.ID,User2.ID)==0)  //ID比较
        {
            if(strcmp(User1.Passward,User2.Passward)==0)  //账号密码都正确输出
            {
                printf("                                     正在登录..");
                Sleep(1000);
                printf(".\n");
                Sleep(1000);
                printf(".\n");
                printf("                                     登陆成功 .");
                system("cls");
                break;
            }
            else  //密码错误输出
               printf("                                     密码错误,请重新输入\n");
        }
        else  //未查找到ID错误输出
            printf("                                     没有找到此ID,请重新输入\n");
    }
    fclose(file1); //关闭文件
}
       
      

录入信息

void addticket() /** 录入班次车次 **/
{
struct ticket
{
int a; //车次
char time1[5]; //发车时间
char name1[5]; //始发站
char name2[5]; //终点站
int time2; //行车时间
int biggest; //额定载客量
//int people; //已订票人数
} ticket[M];
int j,k=0;
printf(“录入几班列车:”);
scanf("%d",&j);
fflush(stdin);
printf(“车次: 发车时间: 始发站: 终点站: 行车时间: 额定载客量:\n”);
while(k {
printf(“班次:”);
scanf("%d",&ticket[k].a);
fflush(stdin);
printf(“发车时间:”);
scanf("%s",ticket[k].time1);
fflush(stdin);
printf(“始发站:”);
scanf("%s",ticket[k].name1);
fflush(stdin);
printf(“终点站:”);
scanf("%s",ticket[k].name2 );
fflush(stdin);
printf(“行车时间:”);
scanf("%d",&ticket[k].time2);
fflush(stdin);
printf(“额定载客量:”);
scanf("%d",&ticket[k].biggest);
fflush(stdin);
k++;
}
FILE *file1=fopen(“D:\addticket.txt”,“a+”);
if(file1==NULL)
{
printf(“file no found!”);
return -1;
}
for(int i=0; i {
fwrite(&ticket[i],sizeof(struct ticket),1,file1);
}
fclose(file1);
printf(“录入成功!”);
}

查询信息(分为按车次和按终点站)

void research()  /** 查询路线 **/
{
    char ch;
    int flag1=0;
    int flag2=0;
    struct ticket
    {
        int a;   //车次
        char time1[5];  //发车时间
        char name1[5];   //始发站
        char name2[5];   //终点站
        int time2;      //行车时间
        int biggest;    //额定载客量
        //int people;     //已订票人数
    } ticket[M];
    struct research
    {
        int b;
        char name[5];
    }resea;
    printf(" 请输入查询方式:\n 1.班次查询\n 2.终点站查询\n ");
    FILE *file1=fopen("D:\\addticket.txt","rb");
    ch=getch();
    if(ch=='1')
    {
        printf("请输入你乘坐的班次:");
        scanf("%d",&resea.b);
        for(int i=0; !feof(file1); i++)
        {
            fread(&ticket[i],sizeof(struct ticket),1,file1);
            if(ticket[i].a==resea.b)
            {
                printf("您的车次信息如下:\n");
                printf("车次:%d  发车时间:%s  始发站:%s  终点站:%s  行车时间:%d  额定载客量:%d \n",ticket[i].a,ticket[i].time1,ticket[i].name1,ticket[i].name2,ticket[i].time2,ticket[i].biggest);
                flag1=1;
            }
        }
        fclose(file1);
        if(flag1==0)
        {
            printf("对不起,未查询到相关的车次信息!");
        }
    }
    if(ch=='2')
    {
        printf("请输入你乘坐车次的终点站:");
        scanf("%s",resea.name);
        for(int i=0; !feof(file1); i++)
        {
            fread(&ticket[i],sizeof(struct ticket),1,file1);
            if(ticket[i].name2==resea.name)
            {
                printf("您的车次信息如下:\n");
                printf("车次:%d  发车时间:%s  始发站:%s  终点站:%s  行车时间:%d  额定载客量:%d \n",ticket[i].a,ticket[i].time1,ticket[i].name1,ticket[i].name2,ticket[i].time2,ticket[i].biggest);
                flag2=1;
            }
             }
        }
        fclose(file1);
        if(flag2==0)
        {
            printf("对不起,未查询到相关的车次信息!");
        }
        }
        }

操作员登陆

登陆和管理员同理
在这里代码就不再给了

查询信息

一模一样的东西直接跳过

订票

void buyticket()  /** 售票系统 **/
{
    char name3[5];
    char name4[5];
    int flag=0;
    int a;
    struct ticket
    {
        int a;   //车次
        char time1[5];  //发车时间
        char name1[5];   //始发站
        char name2[5];   //终点站
        int time2;      //行车时间
        int biggest;    //额定载客量
        int people;     //已订票人数
    } ticket[M];
    printf("请输入您的起始站:");
    scanf("%s",&name3[5]);
    printf("请输入您的终点站:");
    scanf("%s",&name4[5]);
    FILE *file1=fopen("D:\\addticket.txt","rb");
    for(int i=0; !feof(file1); i++)
    {
    fread(&ticket[i],sizeof(struct ticket),1,file1);
        printf("车次信息如下:\n");
        if(ticket[i].name1[5]==name3[5]&&ticket[i].name2[5]==name4[5])
        {
        printf("车次:%d  发车时间:%s  始发站:%s  终点站:%s  行车时间:%d  额定载客量:%d \n",ticket[i].a,ticket[i].time1,ticket[i].name1,ticket[i].name2,ticket[i].time2,ticket[i].biggest);
            flag=1;
        }
        if(flag==0)
        {
            printf("对不起,未查询到相关车次信息!");
        }
    }
    fclose("file1");
    
    if(flag==1)
    {
        FILE *file1=fopen("D:\\addticket.txt","rb");
        printf("请输入您想购买的车次序号:");
        scanf("%d",&a);
        for(int i=0; !feof(file1); i++)
        {
            struct ticket ticket[i];
            fread(&ticket[i],sizeof(struct ticket),1,file1);
            if(a==ticket[i].a)
            {
                printf("订票成功!");
                ticket[i].biggest=ticket[i].biggest-1;
            }
            }
            }
            }
            

退票

想法与订票系统类似
不重复

总结点击这里

文件基本操作:
作者太渣,不解释用法,请读者百度(提升网上找资料的能力很关键)
文件的打开——fopen()函数
文件的关闭——fclose()函数
文件的顺序读/写字符读/写函数fgetc()和fputc()
字符串读/写函数fgets()和fputs()
数据块读/写函数fread()和fwrite()
格式化读/写函数fscanf()和fprintf()
文件头定位函数rewind()
当前读/写位置函数ftell()
随机定位函数fseek()
文件结束检测函数feof()
读/写文件出错检测函数ferror()
文件出错标志清除函数clearerr()
因为有人问过作者fprintf,fscanf与fwrite,fread的区别,这里讲一下:
格式化读/写函数与标准的格式输入/输出函数功能相同,只不过它们的读/写对象不是键盘和显示器,而是文件。fscanf()和fprintf()函数只适用于ASCII码文件的读/写。为fwrite()和fread()函数则适用于二进制文件的读和写。
fscanf()和fprintf()函数对文件进行读/写,使用方便,容易理解。但由于编译器编译文件的形式是以二进制的方式实现的,所以文件在输入时需要将ASCII码转换为二进制格式,在输出时又要将二进制格式转换为字符,花费时间较长,所以在内存与磁盘交换数据频繁的时候,最好不要用这两个函数。
下面是二进制文件与ASCII文件解释:
ASCII文件(文本文件):以字符的方式进行存储,一个字符对应一个ASCII码,而一个ASCII码占用1字节。例如:整数12在内存中占用4个字节;如果按照ASCII码的方式存储,则占用2个字节。ASCII文件可以阅读,可以打印,但是它与内存数据交换时需要转换;
二进制文件:将内存中的数据按照其在内存中的存储形式原样输出并保存在文件中。二进制文件占用空间小,内存数据与磁盘数据交换时无需转换,可以节省外存空间和转换时间。但是二进制文件不可阅读、打印。

1.关于登陆
定义一个结构体,结构体当中定义两个数组分别存放账号密码将其存放在文件中
(注意存放的密码要设置一个对于askii码算法将其改变之后在存放,防止密码泄露)
登陆时定义一个新的结构体接收文件中的账号密码与输入的账号密码对比,正确则登陆成功。
字符串比较函数strcmp(char *,char *); //相同返回0,前者大于后者返回负数,反之返回正数
2.关于修改车票信息
作者上网并没有找到直接修改文件的函数
所有作者使用将文件的n张车票信息都调出来用n个结构体接收,遇到要修改的就修改,最后将全部信息重新写入文件(有点傻,欢迎评论更好的方法)

最最重要的在这里

编写不易
如果觉得对你有用请扫下方二维码给作者一点鼓励
如果没用请也扫下方二维码疯狂diss作者
简单的车票管理系统(c语言)_第4张图片

你可能感兴趣的:(c语言)