设备管理系统应包含各种设备的全部信息,每台设备为一条记录,包含设备号,设备名称,领用人,所属部门,数量,购买时间,价格等。能够显示和统计各种设备的信息。
1. 建立一个文件,包含一个部门10台设备的信息。
2. 能显示设备列表。
3. 能查找指定种类的设备数量。
4.能查找指定部门的设别数量。
5.能计算设备总价值。
6.能删除设备。
7.能对设备列表进行修订。
8.能添加设备。
('y' 是指 ‘yes’ , 'n' 是指 'no'); 需要图片的宝子可以私信我哦!!!^...^
#include
#include
#include
#define MAX_DEVICES 100
#define FILE_NAME "devices.dat"
typedef struct
{
int id;
char name[50];
char user[50];
char department[50];
int quantity;
char purchase_date[20];
double price;
} Device;
Device devices[MAX_DEVICES];
int device_count = 0;
void read_file()
{
FILE *fp = fopen(FILE_NAME, "rb"); // 以二进制读模式打开文件
if (fp == NULL)
{
return;
}
fread(&device_count, sizeof(int), 1, fp); // 从文件中读取设备数量
fread(devices, sizeof(Device), device_count, fp);
fclose(fp); // 关闭文件
}
void write_file()
{
FILE *fp = fopen(FILE_NAME, "wb"); // 以二进制写模式打开文件
if (fp == NULL)
{
return;
}
fwrite(&device_count, sizeof(int), 1, fp); // 将设备数量写入到文件中
fwrite(devices, sizeof(Device), device_count, fp); // 将所有设备信息写入到文件中
fclose(fp);
}
void add_device()
{
if (device_count >= MAX_DEVICES) // 如果设备数量已经达到最大值,则无法继续添加设备
{
printf("<错误: 设备数量已经达到最大值!>\n");
return;
}
Device device; // 定义一个新的设备变量
printf("<输入设备号>: ");
scanf("%d", &device.id);
for(int i = 0;i < device_count;i++)
{
if(devices[i].id == device.id)
{
printf("\n<该设备号已存在!\n>");
printf("<输入设备号>: ");
scanf("%d", &device.id);
}
}
printf("<输入设备名称>: ");
scanf("%s", device.name);
printf("<输入领用人>: ");
scanf("%s", device.user);
printf("<输入所属部门>: ");
scanf("%s", device.department);
printf("<输入数量>: ");
scanf("%d", &device.quantity);
printf("<输入购买时间 (YYYY-MM-DD)>: ");
scanf("%s", device.purchase_date);
printf("<输入价格>: ");
scanf("%lf", &device.price); // 从文本中读取价格并存储到device.price中
devices[device_count++] = device; // 将新的设备信息添加到设备列表中,并将设备数量加1
}
void display_devices()
{
printf("\n<设备列表>:\n");
printf("设备号\t\t设备名称\t领用人\t\t所属部门\t数量\t\t购买时间\t价格\n");
for (int i = 0; i < device_count; i++)
{
Device device = devices[i]; // 获取当前遍历到的设备信息
printf("%d\t\t%s\t\t%s\t\t%s\t\t%d\t\t%s\t%.2f元\n", device.id, device.name, device.user, device.department, device.quantity, device.purchase_date, device.price);
}
}
void calculate_total_value()
{
double total_value = 0; // 定义总价值变量,并初始化为0
for (int i = 0; i < device_count; i++)
{
Device device = devices[i]; // 获取当前遍历到的设备信息
total_value += device.price * device.quantity; // 计算当前设备的总价值,并累加到总价值变量中
}
printf("\n<所有设备的总价值>: %.2f元\n", total_value);
}
// 定义删除设备函数,用于从设备列表中删除指定设备号的设备信息
void delete_device()
{
int id;
printf("<输入要删除的设备号>: ");
scanf("%d", &id);
int found = 0; // 定义一个标记变量,用于标记是否找到了指定设备号的设备信息
for (int i = 0; i < device_count; i++)
{
if (devices[i].id == id)
{
found = 1; // 将标记变量设置为1,表示找到了指定设备号的设备信息
for (int j = i; j < device_count - 1; j++) // 从当前遍历到的位置开始,将后面的所有设备信息向前移动一位
{
devices[j] = devices[j + 1];
}
device_count--;
printf("设备删除成功!\n");
break;
}
}
if (!found) // 如果标记变量仍然为0,表示没有找到指定设备号的设备信息
{
printf("错误: 设备未找到!\n");
}
}
void calculate_quantity_name()
{
int number=0;
char str1[10],str2[10]; // 定义两个用于比较的字符数组
printf("<输入要查找的设备名称>: ");
scanf("%s",str1); // 将用户输入的设备名称储存到str1数组变量中
int found = 0; // 定义一个标记变量,用于标记是否找到了指定设备号的设备信息
for (int i = 0; i < device_count; i++)
{
strcpy(str2,devices[i].name);
if (strcmp(str1,str2)==0)
{
found = 1; // 将标记变量设置为1,表示找到了指定设备号的设备信息
number += devices[i].quantity; // 统计要查找的设备数量
}
}
printf("<设备数量为>: %d\n",number);
if (!found)
{
printf("<错误: 设备未找到!>\n");
}
}
void calculate_quantity_department()
{
int number=0;
char str1[10],str2[10];
printf("<请输入要查找的部门>: ");
scanf("%s",str1);
int found = 0;
for (int i = 0; i < device_count; i++)
{
strcpy(str2,devices[i].department);
if (strcmp(str1,str2)==0)
{
found = 1;
number += devices[i].quantity;
}
}
printf("<该部门的设备数量为>: %d\n",number);
if (!found)
{
printf("<错误: 所属部门未找到!>\n");
}
}
void change()
{
char ch[20];
int id,found = 0;
printf("\n<确定改变设备信息请输入(y/n)>: ");
scanf("%s", ch);
if (strcmp(ch, "y") == 0)
{
printf("\n<输入想要改变的设备号>:");
scanf("%d", &id);
for (int i = 0; i < device_count; i++)
{
if (id == devices[i].id)
{
found =1;
printf("\n<确定改变设备名称请输入(y/n)>: ");
scanf("%s", ch);
if (strcmp(ch, "y") == 0)
{
printf("\n<新名称>:");
scanf("%s", devices[i].name);
}
printf("\n<确定改变设备领用人请输入(y/n)>: ");
scanf("%s", ch);
if (strcmp(ch, "y") == 0)
{
printf("\n<新领用人>:");
scanf("%s", devices[i].user);
}
printf("\n<确定改变设备所属部门请输入(y/n)>: ");
scanf("%s", ch);
if (strcmp(ch, "y") == 0)
{
printf("\n<新所属部门>:");
scanf("%d", devices[i].department);
}
printf("\n<确定改变设备购买日期请输入(y/n)>: ");
scanf("%s", ch);
if (strcmp(ch, "y") == 0)
{
printf("\n<新购买日期>: ");
scanf("%s", devices[i].purchase_date);
}
printf("\n<确定改变设备数量请输入(y/n)>: ");
scanf("%s", ch);
if (strcmp(ch, "y") == 0)
{
printf("\n<新数量>:");
scanf("%d", &devices[i].quantity);
}
printf("\n<确定改变设备价格请输入(y/n)>: ");
scanf("%s", ch);
if (strcmp(ch, "y") == 0)
{
printf("\n<新价格>:");
scanf("%lf", &devices[i].price);
}
}
}
if (!found)
{
printf("<错误: 要修订的设备号未找到!>\n");
}
}
}
int main()
{
read_file();
int choice;
while (1)
{
printf("\n<(-{[设备管理系统]}-)>\n");
printf("1) <添加设备>\n");
printf("2) <显示设备列表>\n");
printf("3) <查找指定种类的设备数量>\n");
printf("4) <查找指定部门的设备数量>\n");
printf("5) <计算总价值>\n");
printf("6) <删除设备>\n");
printf("7) <对设备列表进行修订>\n");
printf("8) <退出程序>\n");
printf("<输入你的选择(1~8)>: ");
scanf("%d", &choice);
switch (choice)
{
case 1:
add_device();
break;
case 2:
display_devices();
break;
case 3:
calculate_quantity_name();
break;
case 4:
calculate_quantity_department();
break;
case 5:
calculate_total_value();
break;
case 6:
delete_device();
break;
case 7:
change();
break;
case 8:
write_file();
exit(0);
default:
printf("<输入了其他无效的选择!!!>\n");
}
}
return 0; }
这里使用的工具是DEV-C++。
定义Device类
Device类中包含的成员函数有 id(设备号)、name(设备名称)、user(领用人)、department(所属部门)、quantity(数量)、purchase_data(购买时间)、price(价格)。定义Device类的成员后,其成员可以调用Device类中的成员。
功能是从文件指针指示的位置开始从文件读取数据,FILE*fp=fopen(FILE_NAME,"rb")意思是打开名为FILE_NAME的文件,以二进制只读模式打开,并将文件指针存储在fp变量中。if文件指针为NULL(即文件打开失败)则代码直接返回,不执行后续代码。
fread(&device_count, sizeof(int), 1, fp);
- 这行代码从文件fp
中读取device_count
的值。它从文件中读取sizeof(int)
个字节的数据,并将结果存储在device_count
中。1
表示应该读取1个项目。
fread(devices, sizeof(Device), device_count, fp);
- 这行代码从文件fp
中读取一个Device
对象的数组。它读取sizeof(Device)
个字节,共device_count
个项目,并将结果存储在devices
数组中。
fclose(fp);
- 这行代码关闭文件fp
,释放与其关联的任何资源。
功能是从文件指针指示的位置开始从文件写入数据,语句与read_file函数相似,只需把读取理解改为写入。
输入一个新的设备号名称,通过一个for循环判断设备中是否存在相同名称的设备,若已存在则显示名称存在,若不存在
该函数是显示已有的设备列表,通过一个for循环将已有的全部设备全部显示出来,print输出中‘\t’的作用起间隔作用。
使用了一个for循环遍历设备列表,将单个设备的数量与该设备的价格相乘,再累计相加,即可得到设备的总价值。
输入想要删除的设备id,通过for循环将输入的id与列表设备中已有的设备id进行比对 devices[i].id == id,比对成功后通过for循环将该设备信息之后的设备信息依次向前移即可,若是最后一个比对成功,则直接将设备数量减一即可。
与【5】函数相似,不过循环在遍历时多了比对设备名称这一项。
与【7】相似
输入想要改变的设备号名称,通过for循环遍历设备列表,查找到指定设备后,就可以依次更改该设备信息。
OKK 到这就结束了哦!如果有什么不足之处欢迎大家在评论区指正,大家一起学习嘛 ^@^
想要借鉴的话!请关注一下博主,给个赞吧 ------感谢感谢!!!