为杭州市车辆管理所建立车辆信息录入系统。编写具有下列功能的菜单驱动的程序。
- 添加车辆信息
- 显示所有车辆信息
- 删除车辆信息 让操作者输入要删除车辆的车牌,将其删除
- 查询车辆信息 让操作者输入要查询车辆的车牌,显示其信息或提示无
- 清空车辆信息
- 更新车辆信息
- 退出系统
啥也不敢说,啥也不敢问,直接看代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//车辆信息管理系统
typedef struct{
char Card[10];//车牌号
char owner[5];//车组姓名
char brand[5];//汽车品牌
double height;//汽车高度
double weight;//汽车重量
int year;//购买年份
}Car;
int M=0;//M表示文件中Car的个数
void Start();//显示欢迎头信息
void Home();//主界面,输入功能选择
void Over();//结束导语
void Head();//打印可选可能
void Function(int key);//功能函数
void Add();//添加Car信息
void WriteData(Car *C);//写入一个Car信息
void Show();//显示所有车辆信息
void Delete();//输入车牌号,删除其附有的车辆信息
void Search();//根据车牌号搜索车辆信息
void Clear();//清空文件,类似删库跑路
void GetM();//获取存储信息个数
void Upgrade();//更新车辆信息
int Check(char Num[]);//检测是否存在相应的车牌号,车牌号唯一不可重复
void ReNew(Car *A);//更新写入新的信息
int main()
{
system("Color 1e");//系统背景颜色变化
Start();
Home();
return 0;
}
void Start()
{
printf("<<<<<<<<---------------------------------------------------->>>>>>>>>>\n");
printf(" 欢迎使用车辆信息管理系统 \n");
printf("<<<<<<<<---------------------------------------------------->>>>>>>>>>\n");
return;
}
void Home()
{
GetM();//首先获取当前文件中信息个数
Head();
while(1)
{
printf("请输入选择的功能:");
int t;
scanf("%d",&t);
if(t!=0&&t!=1&&t!=2&&t!=3&&t!=4&&t!=5&&t!=6)//判读输入选择是否正确,只能是特定选择
{
printf("输入有误!!\n");
continue;//输入有误需要重新输入
}
if(t==0)//不断循环,知道t=0退出循环
break;
else
Function(t);//不退出的话就进入功能函数
}
Over();//结束导语
return;
}
void Head()
{
printf("\n\n<<<<<<<<<<<<----功能选择---->>>>>>>>>>>>>>>\n\n");
printf("-------------1.添加车辆信息\n");
printf("-------------2.显示所有车辆信息\n");
printf("-------------3.删除车辆信息\n");
printf("-------------4.查询车辆信息\n");
printf("-------------5.更新车辆信息\n");
printf("-------------6.清空车辆信息\n");
printf("-------------0.退出系统\n\n\n");
return;
}
void Over() //退出系统
{
printf("\n\t\t>>>>>>>>Welcome back!!<<<<<<<<<\n");
exit(0);
}
void Function(int key)//功能选择
{
switch(key)//switch语句根据传入的值选择功能函数
{
case 1: Add();break;
case 2: Show();break;
case 3: Delete();break;
case 4: Search();break;
case 5: Upgrade();break;
case 6: Clear();break;
}
return;
}
void GetM()//获取信息数量
{
FILE *fp;
if((fp=fopen("CarInfo.txt","r"))==NULL)
{
printf("Fail to Open it");
exit(0);
}//只读方式打开文件
fseek(fp, 0, SEEK_END);//定位到文件尾部
int nFileLen = ftell(fp);//ftell函数能够计算文件头当当前位置的偏移自字节数
fseek(fp, 0, SEEK_SET);//重新回到文件头位置
M=nFileLen/sizeof(Car);//字节数/单个结构体数=存储的车辆信息个数
return;
}
void Add()//添加车辆信息
{
while(1)
{
Car C;
//输入若干的车辆信息,通过键盘Ctrl+Z按键结束输入,
if(scanf("%s%s%s%lf%lf%d",C.Card,C.owner,C.brand,&C.height,&C.weight,&C.year)!=EOF)
{
if(Check(C.Card)==1)//首先检测是否有相同车牌号
{
//存在的话就无法写入,因为车牌号是关键字,不能有相同的车牌号的车
printf("车牌%s信息已经存在,禁止重复\n",C.Card);
continue;//继续输入
}
else
{
M++;
WriteData(&C);//如果没有冲突,则写入
}
}
else
break;
}
return;
}
void WriteData(Car *C)
{
FILE *fp;
if((fp=fopen("CarInfo.txt","a"))==NULL)//以添加的方式打开,写位置在文件尾部
{
printf("Fail to Open it");
exit(0);
}
fwrite(C,sizeof(Car),1,fp);//写入一个车的信息
fclose(fp);
return;
}
void Show()//打印所有信息
{
if(M==0)
{
printf("数据库内无车辆信息\n");
return;
}//M=0没有车辆信息
FILE *fp;
if((fp=fopen("CarInfo.txt","r"))==NULL)
{
printf("Fail to Open it");
exit(0);
}//以只读方式打开
printf("当前信息库中共有%d台车辆信息\n",M);
printf("车主姓名 车牌号\t汽车品牌 车长 车高 购买年份\n");
for(int i=0;i<M;i++)
{
Car B;
fread(&B,sizeof(Car),1,fp);//共有M个,每次读取一个到B
printf("%-7s\t %-7s\t%-5s\t %-4.2f %-4.2f %-4d\n",B.owner,B.Card,B.brand,B.height,B.weight,B.year);
}//打印输出,注意对齐
printf("\n");
fclose(fp);
return;
}
void Search()//搜素信息
{
char Num[10];
printf("输入要查找的车牌号:\n");
scanf("%s",Num);//输入车牌号
FILE *fp;
if((fp=fopen("CarInfo.txt","r"))==NULL)
{
printf("Fail to Open it");
exit(0);
}//以只读方式打开
int flag=0;
for(int i=0;i<M;i++)
{
Car B;
fread(&B,sizeof(Car),1,fp);//读取一个信息
if(strcmp(B.Card,Num)==0)//找到车牌相同的信息了
{ //打印信息
printf("车辆信息:\n");
printf("车主姓名是%s\n",B.owner);
printf("车牌号为%s\n",B.Card);
printf("汽车品牌为:%s\n",B.brand);
printf("于%d年购买此车\n",B.year);
printf("车长:%.2f米 重量:%.2f吨\n",B.height,B.weight);
flag=1;
break;
}
}
if(flag==0)//如果flag没有变化说明没有找打信息
printf("没有找到车牌号为%s的车辆信息",Num);
printf("\n");
fclose(fp);
return ;
}
void Delete()
{
char Num[10];
printf("输入要删除车辆的车牌号:\n");
scanf("%s",Num);//输入车牌号
FILE *fp,*fq;
if((fp=fopen("CarInfo.txt","r+"))==NULL)
{
printf("Fail to Open it");
exit(0);
}//以读写的方式打开,写的时候不会清空文件
fq=fopen("Temp.txt", "w+");以读写的方式打开,写的时候会清空文件
Car A;
while (fread(&A, sizeof(Car), 1, fp))//从原文件读一个结点
{
if (strcmp(A.Card, Num)!=0)//不是要删除的内容的话
fwrite(&A, sizeof(Car), 1, fq);//写入临时文件
}
fclose(fp);
fclose(fq);
fq = fopen("Temp.txt", "r");//从临时文件读出来
fp = fopen("CarInfo.txt", "w+");//原来文件存在,所以会清空
while (fread(&A, sizeof(Car), 1, fq))
{
fwrite(&A, sizeof(Car), 1, fp);//写入原文件
}
fclose(fp);
fclose(fq);
M--;//个数减1
return;
}
void Upgrade()
{
Car A;
printf("请输入更新的信息!\n");
scanf("%s%s%s%lf%lf%d",A.Card,A.owner,A.brand,&A.height,&A.weight,&A.year);//输入要更新的信息
if(Check(A.Card)==0)//查看是否存在这台车,要更新文件中必存在有相同的车牌号的车
{
printf("不存在车牌为%s的车辆信息无法更新",A.Card);
return ;
}
ReNew(&A);//更新信息函数
return;
}
void ReNew(Car *A)
{
FILE *fp;
if((fp=fopen("CarInfo.txt","r+"))==NULL)
{
printf("Fail to Open it");
exit(0);
}//以读写方式打开,写的时候不清空已有文件
Car B;
while(fread(&B,sizeof(Car),1,fp)==1){
if(strcmp(B.Card,A->Card)==0)//找到修改目标
{
fseek(fp,-sizeof(Car),SEEK_CUR);//指针移至修改目标前
fwrite(A,sizeof(Car),1,fp);//写入新的数据覆盖原来的数据
printf("修改成功\n");
break;
}
}
fclose(fp);
return;
}
void Clear()//清空信息
{
remove("CarInfo.txt");//移除
FILE *fp;
if((fp=fopen("CarInfo.txt","w"))==NULL)//再生成
{
printf("Fail to Open it");
exit(0);
}
fclose(fp);
M=0;
return;
}
int Check(char Num[])//搜素信息
{
FILE *fp;
if((fp=fopen("CarInfo.txt","r"))==NULL)
{
printf("Fail to Open it");
exit(0);
}//只读方式打开
for(int i=0;i<M;i++)
{
Car B;
fread(&B,sizeof(Car),1,fp);
if(strcmp(B.Card,Num)==0)//比较车牌号是否相等
return 1;
}
printf("\n");
fclose(fp);
return 0;
}
运行结果:
测试数据:
京L88999 张三 奔驰 3.4 2.05 2010
沪PH3X00 李四 奥迪 3.5 2.10 2018
浙C6P319 王五 宝马 3.2 2.08 2009
黑AF1949 赵六 大众 3.4 2.07 2014
苏DER238 老九 红旗 3.3 2.04 2015
湘A86888 猪头 福特 3.5 2.10 2011
川C2D318 山鸡 丰田 3.2 2.06 2019
辽GM2513 老炮 吉利 3.0 2.05 2017
辽GM2513 死鬼 吉利 3.0 2.05 2017