C++重制C语言大作业:车辆管理系统

前情提要

​#include<stdio.h>
#include
#include
#include
#include
#include
#include
using namespace std;
typedef struct car;
list<car>Car;

void read_list_car();			//	[结构体] 从 [文本] 获得信息
void write_list_car();			//	[文本] 从 [结构体] 获得信息
void list_car_write();			//	录入车辆信息进 [结构体内]
void list_car_alter();			//	修改 [结构体内] 车辆具体信息
void list_car_delete();			//	删除 [结构体内] 车辆信息
void search();				//	查询 [结构体内] 车辆具体信息
void search_prize();			//	价格查询
void search_other();			//	查厂商或车型级别 
void export_list();			//	浏览 [结构体内] 所有车辆信息

//车辆信息的结构体
struct car {
	char type_of_name[10];//车型
	char manufacturer[10];//厂商
	char model_class[10];//车型级别
	char transmission_case[10];//变速箱
	char color[10];//颜色
	char math[3][10];// 0是价格 1是排量 2是座位数
};
void read_list_car() {
	FILE* fp;
	int num = 0;
	//打开文本
	if ((fp = fopen("car.txt", "r")) == NULL) { puts("打开文件失败"); exit(0); }
	car p;
	//读取信息至链表内
	while ((fread(&p, sizeof(car), 1, fp)) != 0) Car.push_back(p);
	fclose(fp);
	puts("录入成功");
}
void write_list_car() {//-->改动后
	FILE* fp;
	//打开文本
	if ((fp = fopen("car.txt", "w")) == NULL) { printf("打开文件失败"); exit(0); }

	list<car>::iterator p = Car.begin(), q = --Car.end();
	//写入信息
	do { fwrite(&(*p), sizeof(car), 1, fp); } while (p++ != q);
	puts("写入文件成功!");
	fclose(fp);
}
void list_car_write() {
	car p;
	puts("请输入\n");
	scanf("%s %s %s %s %s %s %s %s", p.type_of_name, p.manufacturer, p.model_class, p.math[2], p.math[1], p.transmission_case, p.color, p.math[0]),getchar();
	printf("%-10s""%-10s""%-10s""%10s座""%10sT\t""%-10s""%-10s""%10s万\n", p.type_of_name, p.manufacturer, p.model_class, p.math[2], p.math[1], p.transmission_case, p.color, p.math[0]);
	//getch();
	Car.push_back(p);
}
void list_car_alter() {
	//判断链表是否为空
	if ( Car.empty() ) { puts("链表为空!"); return; }

	char name[20];
	puts("请输入型号:");
	scanf_s("%s", name, sizeof(name)),getchar();

	list<car>::iterator p = Car.begin(), q = --Car.end();
	//找到对应信息
	do { if (strcmp(name, (char*)(&(*p).type_of_name)) == 0) break; } while (p != q && p++ != q);//判断形式采用熔断形式,前面为0后面不执行

	if (p == q) { puts("没有找到该类型!"); return; }

	puts("请输入修改类型的序号:");
	puts("1车型\t2厂商\t3车型级别\t4座位数\t5排量\t6变速箱\t7颜色\t8价格");
	char imformation;
	imformation = getchar();getchar();

	puts("请输入修改后内容:");
	switch (imformation)
	{
	case '1':scanf("%s", (*p).type_of_name);break;
	case '2':scanf("%s", (*p).manufacturer);break;
	case '3':scanf("%s", (*p).model_class);break;
	case '4':scanf("%s", (*p).math[2]);break;
	case '5':scanf("%s", (*p).math[1]);break;
	case '6':scanf("%s", (*p).transmission_case);break;
	case '7':scanf("%s", (*p).color);break;
	case '8':scanf("%s", (*p).math[0]);break;
	}
	getchar();
	puts("修改成功!");
	getch();
}
void list_car_delete() {

	if ( Car.empty() ) { puts("链表为空!"); return; }
	puts("进入修改");
	char name[20];
	puts("请输入");
	scanf_s("%s", name, sizeof(name)),getchar();
	list<car>::iterator p = Car.begin(), q = --Car.end();
	//查找对应信息
	do { if (strcmp(name, (char*)(&(*p).type_of_name)) == 0) break; } while (p != q && p++ != q);

	if (p == q) { puts("没有找到该类型!"); return; }

	puts("请输入删掉的内容");
	char information;
	puts("0删除车辆全部信息\t1车型\t2厂商\t3车型级别\t4座位数\t5排量\t6变速箱\t7颜色\t8价格");
loop:scanf_s("%c", &information, sizeof(information)),getchar();
	switch (information) {//结构体里的字符型数组是不能被赋值的,我也不知道为什么.好像是被当成了常量
	case '0':Car.erase(p);break;
	case '1':strcpy((*p).manufacturer, "无信息");break;
	case '2':strcpy((*p).model_class, "无信息");break;
	case '3':strcpy((*p).math[2], "无信息");break;
	case '4':strcpy((*p).math[1], "无信息");break;
	case '5':strcpy((*p).transmission_case, "无信息");break;
	case '6':strcpy((*p).color, "无信息");break;
	case '7':strcpy((*p).math[0], "无信息");break;
	default:puts("无法识别该序号,请重新输入序号");goto loop;
	}
	puts("删除成功!");
	getch();
}
bool prize_greater(const car& frist, const car& second) { return atof(frist.math[0]) < atof(second.math[0]); }
bool puts_greater(const car& frist, const car& second) { return atof(frist.math[1]) < atof(second.math[1]); }
bool seat_greater(const car& frist, const car& second) { return atof(frist.math[2]) < atof(second.math[2]); }
void search() {
	if ( Car.empty() ) { printf("链表为空!\n"); return; }
	void search_prize();
	void search_other();
	char find[10] = { 0 };//字符初始化

	puts("请输入你想查找的范围:例如 价格 、 厂商 、 车型级别 ,退出则输入 退出");
	scanf_s("%s", find, sizeof(find));
	while ((strcmp(find, "退出") != 0)) {
		getchar();
		if (strcmp(find, "价格") == 0) search_prize();

		else if (strcmp(find, "厂商") == 0 || strcmp(find, "车型级别") == 0) search_other();

		else printf("搜索没有此项,请重新输入\n");

		printf("请输入你想查找的范围:例如 价格 、 厂商 、 车型级别 ,退出则输入 退出\n");
		scanf_s("%s", find, sizeof(find));
	}

}
void search_prize() {
	float prize_down, prize_high;
	puts("请依次输入最低价格和最高价格");
	scanf_s("%f%f", &prize_down, &prize_high), getchar();
	list<car>::iterator p = Car.begin(), q = --Car.end();
	list<car> greater;

	do { if (atof((*p).math[0]) >= prize_down && atof((*p).math[0]) <= prize_high) greater.push_back(*p);} while (p++ != q);

	if (greater.size() == 0) { puts("该价格范围内无车辆型号:"); return; }

	greater.sort(prize_greater);

	p = greater.begin(), q = --greater.end();

	do { printf("%-10s\t%10s\n", (*p).type_of_name, (*p).math[0]); } while (p++ != q);		
}
void search_other() {
	puts("请输入你想找的内容:");
	char name[20] = { 0 };
	scanf_s("%s", name, sizeof(name)),getchar();
	list<car>::iterator p = Car.begin(), q = --Car.end();
	list<car> greater;
	do{ if (strcmp(name, (*p).manufacturer) == 0 || strcmp(name, (*p).model_class) == 0) greater.push_back(*p); } while (p++ != q);

	if (greater.size() == 0) { puts("没有找到相关内容!"); return;}

	p = greater.begin(), q = --greater.end();

	do { printf("%s\n", (*p).type_of_name); } while (p++ != q);
}
void export_list() {
	if ( Car.empty() ) { printf("链表为空!\n"); return; }

	puts("车型\t\t厂商\t\t车型级别\t座位数\t     排量\t变速箱\t\t车身颜色\t价格");
	puts("_______________________________________________________________________________________________________________");
	list<car>::iterator p = Car.begin(), q = --Car.end();
	list<car>taxi[3];
	do {
		printf("%-10s\t%-10s\t%-10s%10s座%10sT\t%-10s\t%-10s%10s万\n", (*p).type_of_name, (*p).manufacturer, (*p).model_class, (*p).math[2], (*p).math[1], (*p).transmission_case, (*p).color, (*p).math[0]);
		taxi[0].push_back(*p), taxi[1].push_back(*p), taxi[2].push_back(*p);
	} while (p++ != q );

	printf("一共有%02d辆车\n", Car.size());
	if (Car.size() == 0) return;

	taxi[0].sort(prize_greater), taxi[1].sort(puts_greater), taxi[2].sort(seat_greater);
	puts("从小到大类型:");
	char c;
	puts("0价格 2座位数 1排量 CTRL+Z退出 ");//0是价格	1是排量	2是座位数
	while (~(c = getchar())) {
		getchar();
		
		if (c < '0' || c >= '3') { puts("请重新输入正确值!"); continue; }

		puts("_____________");
		p = taxi[c].begin(), q = --taxi[c].end();
		do { printf("%-10s\t\t%10s\n", (*p).type_of_name, (*p).math[c]); } while (p++ != q);
			
		puts("0价格 2座位数 1排量 CTRL+Z退出 ");
	}
}
int main() {
	read_list_car();
	int x;
	printf("1为浏览所有信息 2为查询车辆具体信息 3录入新的车辆 4修改车辆信息 5为删除车辆信息 0为退出\n"
		"请选择你想进行的功能:");

	while ((x = (int)(getch()-'0')) != 0) {
		system("cls");
		switch (x) {
		case 1:export_list();break;
		case 2:search();break;
		case 3:list_car_write();break;
		case 4:list_car_alter();break;
		case 5:list_car_delete();break;
		default:puts("输入有误,请重新输入:");getch();break;
		}
		system("cls");
		printf("1为浏览所有信息 2为查询车辆具体信息 3录入新的车辆 4修改车辆信息 5为删除车辆信息 0为退出\n"
			"请选择你想进行的功能:");
	}
	write_list_car();
	return 0;
}

你可能感兴趣的:(自主练习,c++)