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(); //休眠函数即程序停止在这里多久
你们一定很好奇这些鬼东西我是从哪里知道的,其实如果你和我一样有一个很强大的舍友的话你也可以知道这些,如果没有的话就去百度吧,只要你想的到的东西都可以去网上查
其实还有能播放音乐文件的方法,在这里就不和大家说了(自己去百度)
看了这么多,有什么想法?我给你们一点建议,你们可以去试试将坐标与颜色修改和控制光标这些东西结合在一起,看看能不能实现下面这种效果?
好的 前面的都是废话!下面教大家如何做出一个简单的车票管理系统:
给大家一个思路图
每一部分先直接给代码后面解释操作
给大家的代码是分块的且没有用到链表(所以写作业的朋友放弃抄袭的想法吧)
只给大家一个思想 最后需要大家自己将每个函数整合成一个程序
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个结构体接收,遇到要修改的就修改,最后将全部信息重新写入文件(有点傻,欢迎评论更好的方法)