C语言课程设计:设备管理系统设计(大作业)内附完整代码 详细解析 流程图

题目概括

     设备管理系统应包含各种设备的全部信息,每台设备为一条记录,包含设备号,设备名称,领用人,所属部门,数量,购买时间,价格等。能够显示和统计各种设备的信息。

实现功能需求

1. 建立一个文件,包含一个部门10台设备的信息。

2. 能显示设备列表。

3. 能查找指定种类的设备数量。 

4.能查找指定部门的设别数量。 

5.能计算设备总价值。

6.能删除设备。 

7.能对设备列表进行修订。 

8.能添加设备。 

流程图

系统功能模块图

C语言课程设计:设备管理系统设计(大作业)内附完整代码 详细解析 流程图_第1张图片

各模块流程图

1.从设备列表中查找指定设备名称的设备数量的模块流程图

C语言课程设计:设备管理系统设计(大作业)内附完整代码 详细解析 流程图_第2张图片

2.从设备列表中查找指定部门的设备数量的模块流程图

C语言课程设计:设备管理系统设计(大作业)内附完整代码 详细解析 流程图_第3张图片

3.从设备列表中查找指定部门的设备数量模块流程图

C语言课程设计:设备管理系统设计(大作业)内附完整代码 详细解析 流程图_第4张图片 

('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类中的成员。

【1】 read_file函数

功能是从文件指针指示的位置开始从文件读取数据,FILE*fp=fopen(FILE_NAME,"rb")意思是打开名为FILE_NAME的文件,以二进制只读模式打开,并将文件指针存储在fp变量中。if文件指针为NULL(即文件打开失败)则代码直接返回,不执行后续代码。

  1. fread(&device_count, sizeof(int), 1, fp); - 这行代码从文件fp中读取device_count的值。它从文件中读取sizeof(int)个字节的数据,并将结果存储在device_count中。1表示应该读取1个项目。

  2. fread(devices, sizeof(Device), device_count, fp); - 这行代码从文件fp中读取一个Device对象的数组。它读取sizeof(Device)个字节,共device_count个项目,并将结果存储在devices数组中。

  3. fclose(fp); - 这行代码关闭文件fp,释放与其关联的任何资源。 

 【2】write_file函数

功能是从文件指针指示的位置开始从文件写入数据,语句与read_file函数相似,只需把读取理解改为写入。

【3】add_device 增加设备函数 

输入一个新的设备号名称,通过一个for循环判断设备中是否存在相同名称的设备,若已存在则显示名称存在,若不存在 

【4】display_devices  显示设备函数

该函数是显示已有的设备列表,通过一个for循环将已有的全部设备全部显示出来,print输出中‘\t’的作用起间隔作用。

【5】 calculate_total_value 计算设备总价值

使用了一个for循环遍历设备列表,将单个设备的数量与该设备的价格相乘,再累计相加,即可得到设备的总价值。

【6】delete_device 删除指定设备信息

 输入想要删除的设备id,通过for循环将输入的id与列表设备中已有的设备id进行比对     devices[i].id == id,比对成功后通过for循环将该设备信息之后的设备信息依次向前移即可,若是最后一个比对成功,则直接将设备数量减一即可。 

【7】calculate_quantity_name 查找指定设备名称的设备数量

 与【5】函数相似,不过循环在遍历时多了比对设备名称这一项。

【8】calculate_quantity_department  查找指定部门的设备数量

与【7】相似

【9】change 改变设备信息

输入想要改变的设备号名称,通过for循环遍历设备列表,查找到指定设备后,就可以依次更改该设备信息。

OKK 到这就结束了哦!如果有什么不足之处欢迎大家在评论区指正,大家一起学习嘛 ^@^

想要借鉴的话!请关注一下博主,给个赞吧 ------感谢感谢!!!

你可能感兴趣的:(c语言,课程设计,算法)