Bootstrap

基于C语言的车辆管理系统

基于C语言的车辆管理系统

Thought Coding实验室


前言

本蒟蒻学C以来第一次写管理系统,代码有待改进,还望大佬们轻点喷(T~T)

    本管理系统是以C语言基础知识包括 链表、文件、结构体数组 为主,构建的一个包含登录注册以及对车辆信息有增删查改功能的系统。

编译器为Visual Studio 2022


一、系统功能

1.录入车辆信息;
2.浏览车辆信息;
3.查询车辆信息;
4.修改车辆信息;
5.删除车辆信息;
6.排序车辆信息;
7.同价位车辆比拼.

二、代码区

1.主菜单

头文件
包含基本需要的头文件,登录注册区的结构体数组,以及记录车辆信息的链表定义和结构体数组。

代码如下:

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#include<math.h>
#include<time.h>
#include<ctype.h>
#define M 30
#define N 30

typedef struct users//创建用户数据存储单元
{
	char  name[20];//用户名
	char  zh[20];//账号
	char  mm[20];//密码
	char  question[20];//问题(找回密码时使用)
	char  answer[20];//回答(找回密码时使用)
}A;

typedef struct Car //车辆链表
{
	int num;//编号
	char type[M];//车辆型号
	char merchant[M];//厂商
	char level[M];//车辆级别
	int seet;//座位数
	float output;//排量
	char gearbox[M];//变速箱
	char color[N];//车身颜色
	float price;//车辆价格
	struct Car* next;
}Car;

typedef struct  //车辆结构体
{
	int num;//编号
	char type[M];//车辆型号
	char merchant[M];//厂商
	char level[M];//车辆级别
	int seet; //座位数
	float output;//排量
	char gearbox[M];//变速箱
	char color[N];//车身颜色
	float price;//车辆价格
}car;

int main();//主函数
int print_denglu_cover();//登录注册找回
Car* lian(Car* head);//链表操作
void input();//录入
void fanhui();//返回
void browse();//浏览
void bipin();//同价位车辆比拼
int read(car vei[]);//将文件数据读入结构体数组
int chachong(int numq);//查询是否有重复编号

.c文件
主封面、以及通往各功能区的中转站。
用switch函数记录用户输入,并转到相应函数区。

主封面

代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include "main.h"
#include"modify.h"
#include"chaxun.h"
#include"delete.h"
#include"sort.h"

int main()
{
	int i = 0;
	system("color 9");
	int n = print_denglu_cover();
	if (n == 0)
	{
		return 0;
	}
	system("cls");
	int choice = -1;//用choice来选择功能
	system("color E");

	while (choice != 0)//0退出
	{
		printf("\n\n\n");
		printf("\t\t               (^u^)     欢迎使用车辆信息管理系统   (*’-’*)  \n");
		printf("\t\t                                 菜单目录                    \n");
		printf("\t\t               *********************************************\n");
		printf("\t\t               *             ① 录入车辆信息                *\n");
		printf("\t\t               +             ② 浏览车辆信息                +\n");
		printf("\t\t               *             ③ 查询车辆信息                *\n");
		printf("\t\t               +             ④ 修改车辆信息                +\n");
		printf("\t\t               *             ⑤ 删除车辆信息                *\n");
		printf("\t\t               +             ⑥ 排序车辆信息                +\n");
		printf("\t\t               *            ⑦ 同价位车辆比拼               *\n");
		printf("\t\t               +            0.  退出系统                   +\n");
		printf("\t\t               *********************************************\n");
	there:;
		printf("\t\t\t                    请输入功能选项:>");
		scanf("%d", &choice);
		switch (choice)
		{
		case 1:
			input();//功能1,录入
			i++;
			fanhui();
			break;
		case 2:
			browse();//功能2,浏览
			fanhui();
			break;
		case 3:
			chaxun();//功能3,查询
			break;
		case 4:
			modify();//功能4,修改
			break;
		case 5:
			delete_0();//功能5,删除
			break;
		case 6:
			sort();//功能6,排序
			break;
		case 7:
			bipin();//功能7,同价位车辆比拼
			break;
		case 0:
			printf("\t\t         ( *v*)              欢迎下次使用!            (*v* )\n");//功能0,退出
			Sleep(1500);
			break;
		default:
			printf("( 0o0)~您输入的数据有误!\n       请重新输入!\n");
			goto there;
		}
		system("cls");
	}
	return 0;
}

2.登录注册找回

这里先借助结构体数组存放用户输入的数据,再将结构体数组中的数据存入文件中,做到用户信息的保存。

头文件
这里的头文件已在主菜单头文件(main.h)中包含,故引用main.h即可。

.c文件
1.注册:将用户输入的数据存入结构体数组,再将数组中的内容存入文件中,以达到记录注册人的信息的功能。
2.登录:打开文件,利用strcmp函数和用户输入的用户名和密码相比较,若返回值为0则说明登陆成功,否则将重新输入。
3.找回:根据用户输入的账号信息进行查找相应的密码,也可根据用户的要求进行密码的更改,更改密码将使用strcpy函数将原密码信息覆盖。这里使用了fseek函数将文件流调回到要修改的位置。
4.输入次数限制,这里使用了整型变量time来记录可输入的总次数,每输入一次 time - 1,当time==0时将强制退出系统。

登录注册界面

代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include "main.h"

int print_denglu_cover()
{
	int choice_denglu = -1, n = 0;
	printf("\n\n");
	printf("\t\t       (*v*)+-------------------------------------------------+(*w*)\n");
	printf("\t\t            |            欢迎使用车辆信息管理系统             |\n");
	printf("\t\t            |                请先登录或注册                   |\n");
	printf("\t\t            |                                                 |\n");
	printf("\t\t            |                (1)   登录                       |\n");
	printf("\t\t            |                (2)   注册                       |\n");
	printf("\t\t            |                (3) 找回密码                     |\n");
	printf("\t\t            |                (0) 退出系统                     |\n");
	printf("\t\t            +-------------------------------------------------+\n");
	printf("\n");
there:;
	printf("\t\t                                请选择:>");
	scanf("%d", &choice_denglu);
	if (choice_denglu >= 0 && choice_denglu <= 3)
	{
		switch (choice_denglu)
		{
		case 0:
			printf("\t\t                              即将退出系统\n");
			Sleep(2000);
			break;
		case 1:
			n = denglu();
			break;
		case 2:
			n = zhuce();
			break;
		case 3:
			n = zhaohui();
			break;
		default:
			printf("\t\t                   输入错误,请重新输入\n");
			goto there;
		}
	}
	else
	{
		printf("\t\t                           输入错误,请重新输入\n");
		goto there;
	}
	if (n == 0)
	{
		system("cls");
		return 0;
	}
	else
	{
		return 1;
	}
}

int denglu()//登录模块
{
	int i = 0, time = 3;
	system("cls");
	A a, b;
	printf("\n\t\t                            (*v*)欢迎来到登录界面!(*v*)\n");
c:;
	printf("\t\t                      账号:");
	scanf("%s", &b.zh);
a:;
	printf("\n\t\t                      密码:");
	i = 0;
	for (i = 0; i < 20; i++)//获取密码
	{
		b.mm[i] = _getch();
		if (b.mm[i] == '\r')
		{
			break;
		}
		else
		{
			printf("*");
		}
	}
	b.mm[i] = '\0';
	printf("\n");
	FILE* fp = fopen("Users.dat", "rb+");//获取用户信息
	fread(&a, sizeof(A), 1, fp);
	while (1)
	{
		if (strcmp(b.zh, a.zh) == 0)
		{
			break;
		}
		else
		{
			if (!feof(fp))
			{
				fread(&a, sizeof(A), 1, fp);
			}
			else
			{
				time--;
				if (time != 0)
				{
					printf("\t\t           (0口0)!账号错误!!!请重新输入,你还有%d次机会\n", time);
					Sleep(1500);
					system("cls");
					goto c;
				}
				else
				{
					printf("\t\t                     (>m<)账号重复错误,即将退出\n");
					Sleep(1500);
					fclose(fp);
					return 0;
				}
			}
		}
	}
	fclose(fp);
	if (strcmp(b.mm, a.mm) == 0)
	{
		printf("\n\t\t                            %s,欢迎回来!!!\n", a.name);
		Sleep(1000);
		system("cls");
		return 1;
	}
	else
	{
		time--;
		printf("\t\t              (0口0)!密码错误!!!请重新输入,你还有%d次机会\n", time);
		Sleep(1500);
		system("cls");
		if (time != 0)
		{
			goto a;
		}
		else
		{
			printf("\t\t                     (>m<)密码重复错误,即将退出\n");
			Sleep(1000);
			system("cls");
			return 0;
		}
	}
}

int zhuce()//注册模块
{
	int i = 0, time = 3;
	system("cls");
	char c[20];
	A a, b;
	FILE* fp;
	printf("\n\t\t                         欢迎来到注册界面!\n");
	Sleep(500);
	fp = fopen("Users.txt", "rb+");
	fread(&b, sizeof(A), 1, fp);
b:;
	printf("\n\t\t请设置账号:[ \t\t ]\b\b\b\b\b\b\b\b\b\b\b\b\b");
	scanf("%s", &a.zh);
	while (1)//检查是否已存在相同账号
	{
		if (strcmp(a.zh, b.zh))
		{
			if (!feof(fp))
			{
				fread(&b, sizeof(A), 1, fp);
			}
			else
			{
				break;
			}
		}
		else
		{
			if (time != 0)
			{
				time--;
				printf("\t\t               (0口0)!该账号已存在!!!请重新输入\n");
				printf("\t\t                          你还有%d次机会", time);
				goto b;
			}
			Sleep(1000);
			fclose(fp);
			return 0;
		}
	}
	do
	{
		printf("\t\t请设置密码:[ \t\t\t ]\b\b\b\b\b\b\b\b\b\b\b\b\b");
		i = 0;
		for (i = 0; i < 20; i++)//获取密码
		{
			a.mm[i] = _getch();
			if (a.mm[i] == '\r')
			{
				break;
			}
			else
			{
				printf("*");
			}
		}
		a.mm[i] = '\0';
		printf("\n");
		printf("\t\t请确认密码:[ \t\t\t ]\b\b\b\b\b\b\b\b\b\b\b\b\b");
		i = 0;
		for (i = 0; i < 20; i++)//获取密码
		{
			c[i] = _getch();
			if (c[i] == '\r')
			{
				break;
			}
			else
			{
				printf("*");
			}
		}
		c[i] = '\0';
		printf("\n");
		fclose(fp);
		if (!strcmp(a.mm, c))//如果密码正确
		{

			printf("\t\t请输入用户名:");
			scanf("%s", &a.name);
			printf("\n\t\t请输入问题(用于找回密码):");
			scanf("%s", &a.question);
			printf("\n\t\t请输入答案:");
			scanf("%s", &a.answer);
			FILE* fw = fopen("Users.dat", "ab+");
			fwrite(&a, sizeof(A), 1, fw);
			printf("\n\t\t         %s,注册成功!!(*v*)!\n", a.name);
			fclose(fw);
			Sleep(1500);
			return 1;
		}
		else//如果三次都密码不相同
		{
			if (time != 0)
			{
				printf("\t\t    (0口0)!密码错误!\n\n请重新输入密码!!\n\n您还有%d次机会!!!\n", time);
				time--;
				continue;
			}
			else
			{
				printf("\n\t\t               (>m<)多次输入错误,即将退出!\n");
				fclose(fp);
				Sleep(1500);
				return 0;
			}
		}
	} while (time >= 0);
}

int zhaohui()//找回密码模块
{
	int i = 0;
	system("cls");
	A a, b;
	printf("欢迎来到找回界面!\n");
	printf("账号:");
	scanf("%s", b.zh);
	printf("\n");
	FILE* fp = fopen("Users.dat", "rb+");
	fread(&a, sizeof(A), 1, fp);
	while (1)
	{
		if (strcmp(b.zh, a.zh) == 0)
		{
			break;
		}
		else
		{
			if (!feof(fp))
			{
				fread(&a, sizeof(A), 1, fp);
			}
			else
			{
				printf("(0口0)!该用户不存在!!!\n");
				Sleep(1500);
				fclose(fp);
				return 0;
			}
		}
	}
	printf("问题:%s\n", a.question);
	printf("回答:");
	scanf("%s", b.answer);
	if (strcmp(b.answer, a.answer) == 0)
	{
		printf("您的密码:%s\n", a.mm);
		printf("\n\n\n\n如要改密请按(1)\n返回请按任意键!!!\n");
		char fanhui;
		fanhui = _getch();
		if (fanhui == '1')
		{
			char c[20], d[20];
			int time = 2;
			do
			{
				printf("\n\t\t请设置新密码:[ \t\t ]\b\b\b\b\b\b\b\b\b\b\b\b\b");
				i = 0;
				for (i = 0; i < 20; i++)
				{
					c[i] = _getch();
					if (c[i] == '\r')
					{
						break;
					}
					else
					{
						printf("*");
					}
				}
				c[i] = '\0';
				printf("\n");
				printf("\n\t\t请确认密码:[ \t\t ]\b\b\b\b\b\b\b\b\b\b\b\b\b");
				i = 0;
				for (i = 0; i < 20; i++)
				{
					d[i] = _getch();
					if (d[i] == '\r')
					{
						break;
					}
					else
					{
						printf("*");
					}
				}
				d[i] = '\0';
				printf("\n");

				if (!strcmp(d, c))
				{
					strcpy(a.mm, c);
					fseek(fp, -((int)(sizeof(A) - 40)), SEEK_CUR);//将文件流调回到要修改的密码的位置
					fprintf(fp, "%s", a.mm);//覆盖原来的密码
					printf("(*v*)密码修改成功,请登录!\n");
					Sleep(500);
					fclose(fp);
					Sleep(1500);
					return 1;
				}
				else
				{
					if (time != 0)
					{
						printf("\n(0口0)!密码错误!\n\n请重新输入密码!!\n\n您还有%d次机会!!!", time);
						time--;
						continue;
					}
					else
					{
						printf("\n\t\t(>m<)多次输入错误,即将退出!");
						fclose(fp);
						Sleep(1500);
						return 0;
					}
				}
			} while (time >= 0);
		}
		else
		{
			Sleep(300);
			return 1;
		}

	}
}

3.录入界面

头文件
录入界面的头文件在主菜单的头文件(main.h)中.

.c 文件
o 使用文件的追加操作;
每次提示一个信息,用户根据提示信息,输入车辆的相应信息,并借助fprintf()函数将信息追加进文件的末尾。

o 对于编号:
1.因为是编号不是序号,所以当然可以不按次序输入,但不能输入相同的编号,否则多辆车将对应同一个编号(相当于车牌号吧),所以在录入编号时额外写了一个查重函数,查重函数将文件数据记录进链表,并通过遍历链表来查找是否有已有编号和输入编号相同,若相同则返回1,提示用户编号存在,重新输入;若没有相同的编号,则返回0,将数据追加进文件末尾。
2.当用户想要按次序输入时,会出现不知道上一辆车的编号是多少的情况,此时我额外编写了一个查找当前文件中记录的最后一辆车编号的函数,方法依然是遍历链表,并将最后一个结点的num值返回,即是记录的最后一辆车的编号。

代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include "main.h"

void input()//录入
{
	system("cls");
	char words[100] = { "0" };
	int numq = 0, seet = 0, m = 0;
	float pprice = 0, output = 0;
	FILE* pf = fopen("file.txt", "a");
	if (pf == NULL)
	{
		perror("input");
		return 1;
	}

	//录入车辆信息
	int n = chamo();
	printf("(· ·)*请输入编号(上一个编号为%d):\n", n);
c:;
	if (scanf("%d", &numq))
	{
		if (chachong(numq))
		{
			printf("(·-·)编号已存在,请重新输入:>");
			goto c;
		}
		fprintf(pf, "%d ", numq);
	}
	printf("(· ·)*请输入车辆型号:\n");
	if ((fscanf(stdin, "%s", words) == 1) && (words[0] != '#'))
		fprintf(pf, "%s ", words);
	printf("(· ·)*请输入厂商:\n");
	if ((fscanf(stdin, "%s", words) == 1) && (words[0] != '#'))
		fprintf(pf, "%s ", words);
	printf("(· ·)*请输入车型级别:\n");
	if ((fscanf(stdin, "%s", words) == 1) && (words[0] != '#'))
		fprintf(pf, "%s ", words);
	printf("(· ·)*请输入座位数:\n");
	if (scanf("%d", &seet))
		fprintf(pf, "%d ", seet);
	printf("(· ·)*请输入排量:\n");
	if (scanf("%f", &output))
		fprintf(pf, "%f ", output);
	printf("(· ·)*请输入变速箱:\n");
	if ((fscanf(stdin, "%s", words) == 1) && (words[0] != '#'))
		fprintf(pf, "%s ", words);
	printf("(· ·)*请输入车身颜色:\n");
	if ((fscanf(stdin, "%s", words) == 1) && (words[0] != '#'))
		fprintf(pf, "%s ", words);
	printf("(· ·)*请输入车辆价格:\n");
	if (scanf("%f", &pprice))
		fprintf(pf, "%f\n", pprice);
	fclose(pf);
	pf == NULL;
	printf("*(·V·)*录入车辆成功!");
}

int chamo()//查找末尾编号
{
	int cnt = 0;
	//头结点分配内存空间
	Car* head = (Car*)malloc(sizeof(Car));
	if (head != NULL)
	{
		head->next = NULL;
	}
	//打开文件
	FILE* fp = fopen("file.txt", "r");
	if (!fp)
	{
		perror("chamo");
		Sleep(1000);
		exit(0);
	}
	//文件到链表
	Car* tmp = head;
	int num = 0;//编号
	char type[M];//车辆型号
	char merchant[M];//厂商
	char level[M];//车辆级别
	int seet = 0;//座位数
	float output = 0;//排量
	char gearbox[M];//变速箱
	char color[N];//车身颜色
	float price = 0;//车辆价格
	while (fscanf(fp, "%d %s %s %s %d %f %s %s %f", &num, type, merchant, level, &seet, &output, gearbox, color, &price) != EOF)
	{
		Car* tmp = (Car*)malloc(sizeof(Car));
		if (head == NULL)
		{
			head = tmp;
		}
		else
		{
			Car* tail = head;
			while (tail->next != NULL)
			{
				tail = tail->next;
			}
			tail->next = tmp;
			tmp->next = NULL;
		}
		tmp->num = num;
		strcpy(tmp->type, type);
		strcpy(tmp->merchant, merchant);
		strcpy(tmp->level, level);
		tmp->seet = seet;
		tmp->output = output;
		strcpy(tmp->gearbox, gearbox);
		strcpy(tmp->color, color);
		tmp->price = price;
		cnt++;
	}
	if (cnt == 0)
	{
		return 0;
	}
	fclose(fp);
	fp = NULL;
	return num;
}

int chachong(int numq)
{
	int cnt = 0;
	//头结点分配内存空间
	Car* head = (Car*)malloc(sizeof(Car));
	if (head != NULL)
	{
		head->next = NULL;
	}
	//打开文件
	FILE* fp = fopen("file.txt", "r");
	if (!fp)
	{
		perror("chamo");
		Sleep(1000);
		exit(0);
	}
	//文件到链表
	Car* tmp = head;
	int num = 0;//编号
	char type[M];//车辆型号
	char merchant[M];//厂商
	char level[M];//车辆级别
	int seet = 0;//座位数
	float output = 0;//排量
	char gearbox[M];//变速箱
	char color[N];//车身颜色
	float price = 0;//车辆价格
	while (fscanf(fp, "%d %s %s %s %d %f %s %s %f", &num, type, merchant, level, &seet, &output, gearbox, color, &price) != EOF)
	{
		Car* tmp = (Car*)malloc(sizeof(Car));
		if (head == NULL)
		{
			head = tmp;
		}
		else
		{
			Car* tail = head;
			while (tail->next != NULL)
			{
				tail = tail->next;
			}
			tail->next = tmp;
			tmp->next = NULL;
		}
		tmp->num = num;
		strcpy(tmp->type, type);
		strcpy(tmp->merchant, merchant);
		strcpy(tmp->level, level);
		tmp->seet = seet;
		tmp->output = output;
		strcpy(tmp->gearbox, gearbox);
		strcpy(tmp->color, color);
		tmp->price = price;
		cnt++;
	}
	if (cnt == 0)
	{
		return 0;
	}
	fclose(fp);
	fp = NULL;
	Car* cha = head->next;
	while (cha->next != NULL)
	{
		if (cha->num == numq)
		{
			return 1;
		}
		cha = cha->next;
	}
	return 0;
}

4. 浏览界面

头文件
浏览界面的头文件在主菜单头文件(main.h)中

.c文件
o 将文件中的数据存储到链表中,再通过链表打印到屏幕上.
一开始写好后打印到屏幕上的数据总是逆序,调试了一遍发现是在链表操作函数lian()中我用的头插法,将数据头插进了链表,后来改为尾插法就好了。

o 打印乱码问题:
一开始打印的数据总是乱码,我怀疑了很多次是编译器的语言格式错误都没怀疑到文件上,后来借助高人指点,才知道原来是文件中的数据要以ANSI的格式保存,这样打印到屏幕上的数据就成功变成大脑看得懂的人话了。

浏览界面
代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include "main.h"

void browse()
{
	system("cls");
	Car* head = (Car*)malloc(sizeof(Car));
	head = lian(head);
	//链表打印
	Car* tmp1 = head->next;
	printf("( 0o0) \t\t\t                       全部车辆信息                                                  (0o0 )\n");
	printf("编号    车辆型号         厂商           车辆级别         座位数/座   排量/L       变速箱        车身颜色   车辆价格\n");
	while (tmp1 != NULL)
	{
		fprintf(stdout, " %-5d  %-13s  %-14s   %-14s       %-5d    %-8.1f %-14s     %-6s   %-10.2f\n", tmp1->num, tmp1->type, tmp1->merchant, tmp1->level, tmp1->seet, tmp1->output, tmp1->gearbox, tmp1->color, tmp1->price);
		tmp1 = tmp1->next;
	}
	printf("\n");
}

链表操作函数
因为后续还会使用到链表,这里为了简化代码,额外写了一个链表操作的函数。

代码如下
头文件

#pragma once
#include<errno.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<malloc.h>

.c文件

#define _CRT_SECURE_NO_WARNINGS
#include "main.h"
#include "lianbiao_caozuo.h"

Car* lian(Car *head)
{
	//头结点分配内存空间
	if (head != NULL)
	{
		head->next = NULL;
	}
	//打开文件
	FILE* fp = fopen("file.txt", "r");
	if (!fp)
	{
		perror("browse");
		exit(0);
	}
	//文件到链表
	Car* tmp = head;
	int num = 0;//编号
	char type[M];//车辆型号
	char merchant[M];//厂商
	char level[M];//车辆级别
	int seet = 0;//座位数
	float output = 0;//排量
	char gearbox[M];//变速箱
	char color[N];//车身颜色
	float price = 0;//车辆价格
	while (fscanf(fp, "%d %s %s %s %d %f %s %s %f", &num, type, merchant, level, &seet, &output, gearbox, color, &price) != EOF)
	{
		Car* tmp = (Car*)malloc(sizeof(Car));
		if (head == NULL)
		{
			head = tmp;
		}
		else
		{
			Car* tail = head;
			while (tail->next != NULL)
			{
				tail = tail->next;
			}
			tail->next = tmp;
			tmp->next = NULL;
		}
		tmp->num = num;
		strcpy(tmp->type, type);
		strcpy(tmp->merchant, merchant);
		strcpy(tmp->level, level);
		tmp->seet = seet;
		tmp->output = output;
		strcpy(tmp->gearbox, gearbox);
		strcpy(tmp->color, color);
		tmp->price = price;
	}
	fclose(fp);
	fp = NULL;
	return head;
}

5.查询车辆信息界面

o 使用链表并借用strcmp()函数进行查找
将文件数据存入链表,并根据用户选择的查找方式,遍历链表,查找和用户输入的信息相符的所有车辆,并将其输出到屏幕上。

第一次输出数据时将会表头。(这里用的整型变量cnt判断是否是第一次输出数据)

若不会有数据输出(即没查询到用户输入的信息)则会跳过打印表头的部分,并提示用户未查询到车辆信息 ,请重新输入。
头文件

#pragma once
#include"main.h"

void chaxun();//查找
void bcha();//编号查询
void ccha();//车型查询
void scha();//厂商查找
void jcha();//级别查找

中心部分

#define _CRT_SECURE_NO_WARNINGS
#include"main.h"
#include"chaxun.h"

void chaxun()//查找
{
	system("cls");
	int n;
	printf("请选择如何查找(# - #):>\n");
	printf("1.编号;      2.车型;       3.厂商;      4.车辆级别.\n");
	scanf("%d", &n);
	switch (n)
	{
	case 1:
		bcha();//编号查找
		fanhui();
		break;
	case 2:
		ccha();//车型查找
		fanhui();
		break;
	case 3:
		scha();//厂商查找
		fanhui();
		break;
	case 4:
		jcha();//级别查找
		fanhui();
		break;
	default:
		break;
	}
}

查询函数区

  1. 编号查找
void bcha()//编号查询
{
   system("cls");
   int n, cnt = 0;
   printf("请输入要查找的编号:>");
   scanf("%d", &n);
   Car* head = (Car*)malloc(sizeof(Car));
   head = lian(head);
   Car* current = head->next;
   while (current != NULL)
   {
   	if (current->num == n)
   	{
   		if (cnt == 0)
   		{
   			printf("编号    车辆型号         厂商           车辆级别         座位数/座   排量/L       变速箱        车身颜色   车辆价格\n");
   		}
   		cnt++;
   		fprintf(stdout, " %-5d  %-13s  %-14s   %-14s       %-5d    %-8.1f %-14s     %-6s   %-10.2f\n", current->num, current->type, current->merchant, current->level, current->seet, current->output, current->gearbox, current->color, current->price);
   	}
   	current = current->next;
   }
   if (cnt == 0)
   {
   	printf("(0口0)!数据不存在");
   }
}

2.车型查找

void ccha()//车型查找
{
	system("cls");
	char cx[50];
	int cnt = 0;
	printf("请输入要查找的车型:>\n");
	scanf("%s", cx);
	Car* head = (Car*)malloc(sizeof(Car));
	head = lian(head);
	Car* current = head->next;
	while (current != NULL)
	{
		if (strcmp(current->type, cx) == 0)
		{
			if (cnt == 0)
			{
				printf("编号    车辆型号         厂商           车辆级别         座位数/座   排量/L       变速箱        车身颜色   车辆价格\n");
			}
			fprintf(stdout, " %-5d  %-13s  %-14s   %-14s       %-5d    %-8.1f %-14s     %-6s   %-10.2f\n", current->num, current->type, current->merchant, current->level, current->seet, current->output, current->gearbox, current->color, current->price);
			cnt++;
		}
		current = current->next;
	}
	if (cnt == 0)
	{
		printf("(0口0)!数据不存在");
	}
}

3.厂商查找

void scha()//厂商查找
{
	system("cls");
	char cs[50];
	int cnt = 0;
	printf("请输入要查找的厂商:>\n");
	scanf("%s", cs);
	Car* head = (Car*)malloc(sizeof(Car));
	head = lian(head);
	Car* current = head->next;
	while (current != NULL)
	{
		if (strcmp(current->merchant, cs) == 0)
		{
			if (cnt == 0)
			{
				printf("编号    车辆型号         厂商           车辆级别         座位数/座   排量/L       变速箱        车身颜色   车辆价格\n");
			}
			fprintf(stdout, " %-5d  %-13s  %-14s   %-14s       %-5d    %-8.1f %-14s     %-6s   %-10.2f\n", current->num, current->type, current->merchant, current->level, current->seet, current->output, current->gearbox, current->color, current->price);
			cnt++;
		}
		current = current->next;
	}
	if (cnt == 0)
	{
		printf("(0口0)!数据不存在");
	}
}

4.级别查找

void jcha()//级别查找
{
	system("cls");
	char cj[50];
	int cnt = 0;
	printf("请输入要查找的车辆级别:>\n");
	scanf("%s", cj);
	Car* head = (Car*)malloc(sizeof(Car));
	head = lian(head);
	Car* current = head->next;
	while (current != NULL)
	{
		if (strcmp(current->level, cj) == 0)
		{
			if (cnt == 0)
			{
				printf("编号    车辆型号         厂商           车辆级别         座位数/座   排量/L       变速箱        车身颜色   车辆价格\n");
			}
			fprintf(stdout, " %-5d  %-13s  %-14s   %-14s       %-5d    %-8.1f %-14s     %-6s   %-10.2f\n", current->num, current->type, current->merchant, current->level, current->seet, current->output, current->gearbox, current->color, current->price);
			cnt++;
		}
		current = current->next;
	}
	if (cnt == 0)
	{
		printf("(0口0)!数据不存在");
	}
}

6.修改车辆信息界面

o 将文件数据录入结构体数组,并使用结构体数组对数据进行修改
结构体数组在主菜单头文件中定义

将所有车辆信息先在屏幕上打印出,以便用户确认需要修改的信息。再根据用户输入的编号查询相应的车辆,然后根据用户输入的要修改的数据类型对应到相应数据,最后将用户输入的新数据存入结构体数组中。

o 更新文件信息函数
因为以w形式打开文件,文件内容会全部丢失,所以在modify()函数(修改主函数)中事先将所有数据先存进结构体数组,再更改相应数据后,再把结构体数组中的数据写入文件,做到更改信息的功能。

代码如下:
头文件

#pragma once
#include"main.h"

void modify();//修改
void updata1(car vei[], int n);//修改更新

.c文件

#define _CRT_SECURE_NO_WARNINGS
#include "main.h"
#include"modify.h"

car vei[1000];
void modify()//功能4,修改
{
	system("cls");
	int n = read(vei), m = 0;
	int bh = 0, i = 0, cnt = 0;
	char cx[20];
	browse();
	printf("请输入要修改的车辆编号:>\n");
l:;
	scanf("%d", &bh);
	cnt = 0;
	for (i = 0; i < n; i++)
	{
		if (bh == vei[i].num)
		{
			cnt++;
			break;
		}
	}
	if (cnt == 0)
	{
		printf("(0口0)!未找到该车辆编号,请重新输入:>");
		goto l;
	}
	cnt = 0;
	for (i = 0; i < n; i++)
	{
		if (bh != vei[i].num)
		{
			continue;
		}
		system("cls");
		printf("修改前:\n\n");
		printf("编号    车辆型号         厂商           车辆级别         座位数/座   排量/L       变速箱        车身颜色   车辆价格\n");
		printf(" %-5d  %-13s  %-14s   %-14s       %-5d    %-8.1f %-14s     %-6s   %-10.2f\n\n", vei[i].num, vei[i].type, vei[i].merchant, vei[i].level, vei[i].seet, vei[i].output, vei[i].gearbox, vei[i].color, vei[i].price);
		printf("请输入要更改的状态\n(1.编号;  2.车辆型号;  3.厂商;  4.车辆级别;  5.座位数;  6.排量;  7.变速箱;  8.车身颜色;  9.车辆价格)\n:>");
		scanf("%d", &m);
		switch (m)
		{
		case 1:
			printf("请输入新编号:>");
			scanf("%d", &vei[i].num);
			break;
		case 2:
			printf("请输入新型号:>");
			scanf("%s", vei[i].type);
			break;
		case 3:
			printf("请输入新厂商:>");
			scanf("%s", vei[i].merchant);
			break;
		case 4:
			printf("请输入新车辆级别:>");
			scanf("%s", vei[i].level);
			break;
		case 5:
			printf("请输入新座位数:>");
			scanf("%d", &vei[i].seet);
			break;
		case 6:
			printf("请输入新排量:>");
			scanf("%f", &vei[i].output);
			break;
		case 7:
			printf("请输入新变速箱型号:>");
			scanf("%s", vei[i].gearbox);
			break;
		case 8:
			printf("请输入新车身颜色:>");
			scanf("%s", vei[i].color);
			break;
		case 9:
			printf("请输入新价格:>");
			scanf("%f", &vei[i].price);
			break;
		default:
			break;
		}
		printf("\n修改后:\n\n");
		printf("  编号    车辆型号         厂商           车辆级别         座位数/座   排量/L       变速箱        车身颜色   车辆价格\n\n");
		printf("    %-5d  %-13s  %-14s   %-14s       %-5d    %-8.1f %-14s     %-6s   %-10.2f\n\n", vei[i].num, vei[i].type, vei[i].merchant, vei[i].level, vei[i].seet, vei[i].output, vei[i].gearbox, vei[i].color, vei[i].price);
		int g;
		printf("是否确认?(0/1)\n");
		scanf("%d", &g);
		if (g == 1)
		{
			updata1(vei, n);
			break;
		}
		else
		{
			printf("已取消操作");
			Sleep(1000);
			return;
		}
	}
	if (i == n)
	{
		printf("(0口0)!没有该编号车辆!请重新输入:>");
		Sleep(1000);
		goto l;
	}
	fanhui();
}

函数区
1.修改更新函数
将修改后的数据重新录入文件

void updata1(car vei[], int n)//修改更新
{
	int i;
	FILE* fp;
	fp = fopen("file.txt", "w");
	/*if (fp == NULL);
	{
		perror;
		return 1;
	}*/
	for (i = 0; i < n - 1; i++)
	{
		fprintf(fp, "%d %s %s %s %d %f %s %s %f\n", vei[i].num, vei[i].type, vei[i].merchant, vei[i].level, vei[i].seet, vei[i].output, vei[i].gearbox, vei[i].color, vei[i].price);
	}
	fclose(fp);
	fp = NULL;
}

2.读取文件数据函数
将文件中的数据读取到结构体数组中

int read(car vei[])
{
	int i = 0;
	FILE* fp = fopen("file.txt", "r");
	if (fp == NULL)
	{
		perror("read");
		return 1;
	}
	while (!feof(fp))
	{
		fscanf(fp, "%d %s %s %s %d %f %s %s %f", &vei[i].num, vei[i].type, vei[i].merchant, vei[i].level, &vei[i].seet, &vei[i].output, vei[i].gearbox, vei[i].color, &vei[i].price);
		i++;
	}
	fclose(fp);
	fp = NULL;
	return i;
}

7.删除车辆信息界面

o 使用链表,将要删除的数据结点跳过,直接指向下一个结点,或者指向空,实现删除操作.
若要删除的数据在中间或第一个,则next指向下下一个结点,若要删除的数据在最后一个,则将next指向NULL.

若未找到用户输入的车辆编号,则提示用户重新输入。

代码如下:
头文件

#pragma once
#include"main.h"

void delete_0();//删除

.c文件

#define _CRT_SECURE_NO_WARNINGS
#include "main.h"
#include "lianbiao_caozuo.h"
#include"delete.h"

void delete_0()//删除
{
	int n, m, cnt = 0;
	int i = 0;
	Car* head = (Car*)malloc(sizeof(Car));
	head = lian(head);
	browse();
	printf("请输入想要删掉的车辆编号:>");
z:;
	scanf("%d", &n);
	printf("\t确定吗?(0/1)");
	scanf("%d", &m);
	if (m == 0)
	{
		printf("已取消操作.");
		fanhui();
		return;
	}
	else
	{
		Car* urrent = head;
		Car* current = head->next;
		while (current != NULL)
		{
			if (current->num == n)
			{
				cnt++;
				current = current->next;
				urrent->next = current;
				break;
			}
			current = current->next;
			urrent = urrent->next;
		}
	}
	if (cnt == 0)
	{
		printf("(0口0)!未找到该编号,请重新输入:>");
		goto z;
	}
	else
	{
		FILE* fp = fopen("file.txt", "w");
		/*if (fp == NULL)
		{
			ferror("delete");
			return 1;
		}*/
		Car *current = head->next;
		while (current != NULL)
		{
			fprintf(fp, "%d %s %s %s %d %f %s %s %f\n", current->num, current->type, current->merchant, current->level, current->seet, current->output, current->gearbox, current->color, current->price);
			current = current->next;
		}
		printf("*(·V·)*删除成功\n");
		fclose(fp);
		fp = NULL;
		fanhui();
	}
}

8.排序车辆信息界面

o 使用结构体数组对车辆信息进行排序.

将文件中的所有数据存入结构体数组中,并根据用户的选择进行相应的排序(本人蒟蒻,用的最朴实无华的冒泡排序)。

排序完成后将结构体数组中的数据存入文件中,以达到保存数据顺序的功能。

排序前:
排序前

根据编码逆序排序后:
排序后

代码如下:
头文件

#pragma once
#include"main.h"

void sort();//排序
void bianpai();//编号排序
void zhengxv1();//编号正序
void nixv1();//编号逆序
void zuopai();//座位排序
void zhengxv2();//座排正序
void nixv2();//座排逆序
void liangpai();//排量排序
void zhengxv3();//排量正序
void nixv3();//排量逆序
void jiapai();//价格排序
void zhengxv4();//价排正序
void nixv4();//价排逆序
void updata(car vek[], int n);//更新文件数据

排序主界面

#define _CRT_SECURE_NO_WARNINGS
#include "main.h"
#include "sort.h"

car vek[1000];
void sort()//排序
{
	int n;
	system("cls");
	printf("\t\t                       1.根据编码排序;  2.根据座位数排序;\n");
	printf("\t\t                       3.根据排量排序;  4.根据价格排序;\n");
	printf("请选择你的排序方法:>");
	scanf("%d", &n);
	switch (n)
	{
	case 1:
		bianpai();//编码排序
		fanhui();
		break;
	case 2:
		zuopai();//座位数排序
		fanhui();
		break;
	case 3:
		liangpai();//排量排序
		fanhui();
		break;
	case 4:
		jiapai();//价格排序
		fanhui();
		break;
	}
}

函数区
1.编号排序函数

void bianpai()//编号排序
{
	int m;
	system("cls");
	printf("\t\t                                        1.正序;  2.逆序\n");
	printf("请选择排序方法:>");
	scanf("%d", &m);
	switch (m)
	{
	case 1:
		zhengxv1();
		browse();
		break;
	case 2:
		nixv1();
		browse();
		break;
	}
}

a.编号正序函数

void zhengxv1()
{
   system("cls");
   int n = read(vek);
   int i = 0, j = 0;
   for (i = 0; i < n - 1; i++)
   {
   	for (j = 0; j < n - 2 - i; j++)
   	{
   		if (vek[j].num > vek[j + 1].num)
   		{
   			car tmp = vek[j];
   			vek[j] = vek[j + 1];
   			vek[j + 1] = tmp;
   		}
   	}
   }
   updata(vek, n);
}

b.编号逆序函数

void nixv1()
{
	system("cls");
	int n = read(vek);
	int i = 0, j = 0;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n - 1 - i; j++)
		{
			if (vek[j].num < vek[j + 1].num)
			{
				car tmp = vek[j];
				vek[j] = vek[j + 1];
				vek[j + 1] = tmp;
			}
		}
	}
	updata(vek, n);
}

2.座位排序

void zuopai()//座位排序
{
   int m;
   system("cls");
   printf("\t\t                                        1.正序;  2.逆序\n");
   printf("请选择排序方法:>");
   scanf("%d", &m);
   switch (m)
   {
   case 1:
   	zhengxv2();
   	browse();
   	break;
   case 2:
   	nixv2();
   	browse();
   	break;
   }
}

a.座位正序

void zhengxv2()
{
   system("cls");
   int n = read(vek);
   int i = 0, j = 0;
   for (i = 0; i < n - 1; i++)
   {
   	for (j = 0; j < n - 2 - i; j++)
   	{
   		if (vek[j].seet > vek[j + 1].seet)
   		{
   			car tmp = vek[j];
   			vek[j] = vek[j + 1];
   			vek[j + 1] = tmp;
   		}
   	}
   }
   updata(vek, n);
}

b.座位逆序

void nixv2()
{
	system("cls");
	int n = read(vek);
	int i = 0, j = 0;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n - 1 - i; j++)
		{
			if (vek[j].seet < vek[j + 1].seet)
			{
				car tmp = vek[j];
				vek[j] = vek[j + 1];
				vek[j + 1] = tmp;
			}
		}
	}
	updata(vek, n);
}

3.排量排序

void liangpai()//排量排序
{
	int m;
	system("cls");
	printf("\t\t                                        1.正序;  2.逆序\n");
	printf("请选择排序方法:>");
	scanf("%d", &m);
	switch (m)
	{
	case 1:
		zhengxv3();
		browse();
		break;
	case 2:
		nixv3();
		browse();
		break;
	}
}

a.排量正序

void zhengxv3()
{
	system("cls");
	int n = read(vek);
	int i = 0, j = 0;
	for (i = 0; i < n - 1; i++)
	{
		for (j = 0; j < n - 2 - i; j++)
		{
			if (vek[j].output > vek[j + 1].output)
			{
				car tmp = vek[j];
				vek[j] = vek[j + 1];
				vek[j + 1] = tmp;
			}
		}
	}
	updata(vek, n);
}

排量逆序

void nixv3()
{
	system("cls");
	int n = read(vek);
	int i = 0, j = 0;
	for (i = 0; i < n - 1; i++)
	{
		for (j = 0; j < n - 2 - i; j++)
		{
			if (vek[j].output < vek[j + 1].output)
			{
				car tmp = vek[j];
				vek[j] = vek[j + 1];
				vek[j + 1] = tmp;
			}
		}
	}
	updata(vek, n);
}

4.价格排序

void jiapai()
{
	int m;
	system("cls");
	printf("\t\t                                        1.正序;  2.逆序\n");
	printf("请选择排序方法:>");
	scanf("%d", &m);
	switch (m)
	{
	case 1:
		zhengxv3();
		browse();
		break;
	case 2:
		nixv3();
		browse();
		break;
	}
}

a.价格正序

void zhengxv4()
{
   system("cls");
   int n = read(vek);
   int i = 0, j = 0;
   for (i = 0; i < n - 1; i++)
   {
   	for (j = 0; j < n - 2 - i; j++)
   	{
   		if (vek[j].price > vek[j + 1].price)
   		{
   			car tmp = vek[j];
   			vek[j] = vek[j + 1];
   			vek[j + 1] = tmp;
   		}
   	}
   }
   updata(vek, n);
}

b. 价格逆序

void nixv4()
{
   system("cls");
   int n = read(vek);
   int i = 0, j = 0;
   for (i = 0; i < n - 1; i++)
   {
   	for (j = 0; j < n - 2 - i; j++)
   	{
   		if (vek[j].price < vek[j + 1].price)
   		{
   			car tmp = vek[j];
   			vek[j] = vek[j + 1];
   			vek[j + 1] = tmp;
   		}
   	}
   }
   updata(vek, n);
}

文件更新函数

void updata(car vek[], int n)
{
   FILE* fp = fopen("file.txt", "w");
   /*if (fp == NULL)
   {
   	perror("updata3");
   	return 1;
   }*/
   int i = 0;
   for (i = 0; i < n - 1; i++)
   {
   	fprintf(fp, "%d %s %s %s %d %f %s %s %f\n", vek[i].num, vek[i].type, vek[i].merchant, vek[i].level, vek[i].seet, vek[i].output, vek[i].gearbox, vek[i].color, vek[i].price);
   }
   fclose(fp);
   fp = NULL;
}

9.同价位车辆比拼界面

o 使用结构体数组对相应车辆进行比较(同价位下比较排量)
价位区不包含上限

(小声:其实还是一个排序罢了)

这是在管理系统中,自己写的一个小程序。根据车辆价格将所有车辆分成若干份,用户根据自己的需要,选择相应的价格区,再在改价格区内选择需要比较的车辆数,最后输入车辆编号,程序根据排量大小输出最厉害的那辆车。

先打印出表头,再如查询界面一般,将符合条件的车辆打印出,根据用户输入的比较数,分配数组大小,最后将各编号车辆根据排量大小排序,输出排量最大的那辆车,就OK啦。

o 当然要考虑很多点:
1.若该价位还没有录入车辆,用户可选择进入录入界面或回到比较界面,或回到主界面;
2.若用户输入的比较数大于该价位下车辆的总数;
3.对比较数为0和1的处理;
4.若用户输入的编号不存在;
5.返回到主界面和继续留在比较界面的处理;
6.若比较车辆的排量都相同…

其实该小程序最好的结果是能根据综合信息,判断用户输入的几辆车中最好的一辆(或几辆),包括车座、变速箱、厂商口碑、同价位里价位的细分、甚至用户可输入用途,再根据车辆级别等信息判断最符合用户输入的那辆车\(●´ϖ`●)/。

同价位车辆比较

代码如下:
头文件

#pragma once
#include "main.h"

void dfive();//五万以下
void dten();//五至十万
void dfift();//十至十五万
void dtwen();//十五至二十万
void dtht();//二十至三十万
void dfort();//三十至四十万
void dsixty();//四十至六十万
void deighty();//六十至八十万 
void dhundred();//八十至一百万
void uhundred();//一百万以上
int panduan(int k[], car vem[], int t, int h);//判断输入值是否存在
void bipin_caozuo(int h, int m, int t, int k[], car vem[], car vezx[]);//比拼操作函数

比拼函数主界面

#define _CRT_SECURE_NO_WARNINGS
#include"main.h"
#include "bipin.h"

car ven[1000];
car vem[1000];
car vezx[1000];
void bipin()//同价位车辆比拼
{
	system("cls");
	int n;
	printf("\t\t\t   /(*o*)/欢迎来到同价位车辆比拼页面\\(*o*)\\\n");
	printf("\t\t\t    (本比拼主要以固定价位下车辆的排量决定)\n\n");
	printf("\t\t\t                价  位  栏\n");
	printf("\t\t\t        ①.5w以下;       ②.5---10w;\n");
	printf("\t\t\t        ③.10---15w;     ④.15---20w;\n");
	printf("\t\t\t        ⑤.20---30w;     ⑥.30---40w;\n");
	printf("\t\t\t        ⑦.40---60w;     ⑧.60---80w;\n");
	printf("\t\t\t        ⑨.80---100w;    ⑩.100万以上;\n");
	printf("\t\t\t                  0.返回.\n\n");
	printf("\t\t\t    注:价位不包含上限(如:5---10w 不包含10万)\n\n");
	printf("\t\t\t        请选择价位:>");
k:;
	scanf("%d", &n);
	switch (n)
	{
	case 0:
		return 1;
	case 1:
		dfive();
		return 1;
	case 2:
		dten();
		return 1;
	case 3:
		dfift();
		return 1;
	case 4:
		dtwen();
		return 1;
	case 5:
		dtht();
		return 1;
	case 6:
		dfort();
		return 1;
	case 7:
		dsixty();
		return 1;
	case 8:
		deighty();
		return 1;
	case 9:
		dhundred();
		return 1;
	case 10:
		uhundred();
		return 1;
	default:
		printf("\t\t\t    输入错误,请重新选择:>");
		goto k;
	}
}

函数区
5w以下

 void dfive()
{
	system("cls");
	//查找5万以下的车辆(不包括5万)
	int n = read(ven), cnt = 0, m = 0, h = 0, znt = 0;
	int i = 0, j = 0, t = 0, k[1000] = { 0 }, o = 0;
	for (i = 0; i < n - 1; i++)
	{
		if (ven[i].price < 5)
		{
			vem[h++] = ven[i];
		}
	}
	bipin_caozuo(h, m, t, k, vem, vezx);
}

5-10w

void dten()
{
	system("cls");
	//查找5万以上,10万以下的车辆(不包括10万)
	int n = read(ven), cnt = 0, m = 0, h = 0, znt = 0;
	int i = 0, j = 0, t = 0, k[1000] = { 0 }, o = 0;
	for (i = 0; i < n - 1; i++)
	{
		if (ven[i].price >= 5 && ven[i].price < 10)
		{
			vem[h++] = ven[i];
		}
	}
	bipin_caozuo(h, m, t, k, vem, vezx);
}

10-15w

void dfift()
{
	system("cls");
	//查找10万以上,15万以下的车辆(不包括15万)
	int n = read(ven), cnt = 0, m = 0, h = 0, znt = 0;
	int i = 0, j = 0, t = 0, k[1000] = { 0 }, o = 0;
	for (i = 0; i < n - 1; i++)
	{
		if (ven[i].price >= 10 && ven[i].price < 15)
		{
			vem[h++] = ven[i];
		}
	}
	bipin_caozuo(h, m, t, k, vem, vezx);
}

15-20w

void dtwen()
{
	system("cls");
	//查找15万以上,20万以下的车辆(不包括20万)
	int n = read(ven), cnt = 0, m = 0, h = 0,znt = 0;
	int i = 0, j = 0, t = 0, k[1000] = { 0 }, o = 0;
	for (i = 0; i < n - 1; i++)
	{
		if (ven[i].price >= 15 && ven[i].price < 20)
		{
			vem[h++] = ven[i];
		}
	}
	bipin_caozuo(h, m, t, k, vem, vezx);
}

20-30w

void dtht()
{
	system("cls");
	//查找20万以上,30万以下的车辆(不包括30万)
	int n = read(ven), cnt = 0, m = 0, h = 0, znt = 0;
	int i = 0, j = 0, t = 0, k[1000] = { 0 }, o = 0;
	for (i = 0; i < n - 1; i++)
	{
		if (ven[i].price >= 20 && ven[i].price < 30)
		{
			vem[h++] = ven[i];
		}
	}
	bipin_caozuo(h, m, t, k, vem, vezx);
}

30-40w

void dfort()
{
	system("cls");
	//查找30万以上,40万以下的车辆(不包括40万)
	int n = read(ven), cnt = 0, m = 0, h = 0, znt = 0;
	int i = 0, j = 0, t = 0, k[1000] = { 0 }, o = 0;
	for (i = 0; i < n - 1; i++)
	{
		if (ven[i].price >= 30 && ven[i].price < 40)
		{
			vem[h++] = ven[i];
		}
	}
	bipin_caozuo(h, m, t, k, vem, vezx);
}

40-60w

void dsixty()
{
	system("cls");
	//查找40万以上,60万以下的车辆(不包括60万)
	int n = read(ven), cnt = 0, m = 0, h = 0, znt = 0;
	int i = 0, j = 0, t = 0, k[1000] = { 0 }, o = 0;
	for (i = 0; i < n - 1; i++)
	{
		if (ven[i].price >= 40 && ven[i].price < 60)
		{
			vem[h++] = ven[i];
		}
	}
	bipin_caozuo(h, m, t, k, vem, vezx);
}

60-80w

void deighty()
{
	system("cls");
	//查找60万以上,80万以下的车辆(不包括80万)
	int n = read(ven), cnt = 0, m = 0, h = 0, znt = 0;
	int i = 0, j = 0, t = 0, k[1000] = { 0 }, o = 0;
	for (i = 0; i < n - 1; i++)
	{
		if (ven[i].price >= 60 && ven[i].price < 80)
		{
			vem[h++] = ven[i];
		}
	}
	bipin_caozuo(h, m, t, k, vem, vezx);
}

80-100w

void dhundred()
{
	system("cls");
	//查找80万以上,100万以下的车辆(不包括100万)
	int n = read(ven), cnt = 0, m = 0, h = 0, znt = 0;
	int i = 0, j = 0, t = 0, k[1000] = { 0 }, o = 0;
	for (i = 0; i < n - 1; i++)
	{
		if (ven[i].price >= 80 && ven[i].price < 100)
		{
			vem[h++] = ven[i];
		}
	}
	bipin_caozuo(h, m, t, k, vem, vezx);
}

100w及以上

void uhundred()
{
	system("cls");
	//查找100万以上的车辆
	int n = read(ven), cnt = 0, m = 0, h = 0, znt = 0;
	int i = 0, j = 0, t = 0, k[1000] = { 0 }, o = 0;
	for (i = 0; i < n - 1; i++)
	{
		if (ven[i].price >= 100)
		{
			vem[h++] = ven[i];
		}
	}
	bipin_caozuo(h, m, t, k, vem, vezx);
}

比较功能函数

void bipin_caozuo(int h, int m,int t,int k[],car vem[],car vezx[])
{
	int i = 0, j = 0, o = 0, cnt = 0;
	if (h == 0)
	{
		printf("(0口0)!该价位下系统未录入车辆,请录入车辆或者重新输入.\n");
		printf("输入'1'进入录入界面,'2'重新输入,'0'退出\n");
	h:;
		scanf("%d", &m);
		switch (m)
		{
		case 0:
			return;
		case 1:
			input();
			fanhui();
			break;
		case 2:
			bipin();
			break;
		default:
			printf("(0口0)!输入错误,请重新输入\n");
			goto h;
		}
	}
	else
	{
		printf("\t\t                           该价位下所有车辆            \n");
		printf("编号    车辆型号         厂商           车辆级别         座位数/座   排量/L       变速箱        车身颜色   车辆价格\n");
		for (i = 0; i < h; i++)
		{
			printf(" %-5d  %-13s  %-14s   %-14s       %-5d    %-8.1f %-14s     %-6s   %-10.2f\n", vem[i].num, vem[i].type, vem[i].merchant, vem[i].level, vem[i].seet, vem[i].output, vem[i].gearbox, vem[i].color, vem[i].price);
		}
		printf("\n请输入你要比较的车辆数:>");
	u:;
		scanf("%d", &t);
		if (t > h)
		{
			printf("(0口0)!输入值大于总车辆数,请重新输入:>");
			goto u;
		}
		else if (t == 0)
		{
			printf("请输入一个大于0的数:>");
			goto u;
		}
		else if (t == 1)
		{
			printf("请输入你要比较的车辆编号(自己和自己比……?):>");
		v:;
			scanf("%d", &m);
			for (i = 0; i < h; i++)
			{
				if (m == vem[j].num)
				{
					break;
				}
				else
				{
					printf("(0口0)!该价位中没有此编号车辆,请重新输入:>");
					goto v;
				}
			}
			printf("\n%d号车胜!*(^V^)*\n\n", m);
		}
		else
		{
			printf("请输入你要比较的车辆编号(各编号以空格隔开):>");
		y:;
			for (i = 0; i < t; i++)
			{
				scanf("%d", &k[i]);
			}
			if (panduan(k, vem, t, h))
			{
				printf("(0口0)!未查询到编号,请重新输入:>");
				goto y;
			}
			for (i = 0; i < t; i++)
			{
				for (j = 0; j < h; j++)
				{
					if (vem[j].num == k[i])
					{
						vezx[o++] = vem[j];
					}
				}
			}

			for (i = 0; i < t; i++)
			{
				for (j = 0; j < t - 1 - i; j++)
				{
					if (vezx[j].output < vezx[j + 1].output)
					{
						car tmp = vezx[j];
						vezx[j] = vezx[j + 1];
						vezx[j + 1] = tmp;
						cnt++;
					}
				}
			}
			if (cnt == 0)
			{
				printf("这%d辆车相差不大,可根据其他信息自行判断.\n", t);
			}
			else
			{
				printf("\n%d号车胜!*(^V^)*\n\n", vezx[0].num);
			}
		}
		printf("输入0返回主页面,输入1返回比拼页面\n");
	x:;
		scanf("%d", &m);
		switch (m)
		{
		case 0:
			return;
		case 1:
			bipin();
			break;
		default:
			printf("(0口0)!输入错误,请重新输入:>");
			goto x;
		}
	}
}

判断编号是否存在

int panduan(int k[], car vem[], int t, int h)
{
	int cnt = 0;
	for (int i = 0; i < t; i++)
	{
		for (int j = 0; j < h; j++)
		{
			if (k[i] == vem[j].num)
			{
				cnt++;
			}
		}
	}
	if (cnt == t)
	{
		return 0;
	}
	else
	{
		return 1;
	}
}

总结

基于C语言编写的车辆管理系统,包含了对车辆信息的增删改查以及排序,实现了对车辆信息的统一管理。

第一次编写的管理系统,代码仍有改进之处,比如代码在很多地方存在重复之处,可将重复点写入函数,将重复部分用函数代替以简化代码。但也通过这一次编写,成功巩固了C语言基础。

若干年后回首这篇文章也会有青涩的感觉吧。

;