设备管理系统——c语言实现

Hello,大家好我是慢慢努力的小刘。今天终于更新了,这次更新的内容是我大一的时候写的C语言高级程序课设,那时候刚学完C语言可能语法或者是功能的实现有些复杂,如果大家有更好的想法和建议,欢迎大家在评论区交流。

 一、实训题目与要求:

  1.1  问题描述:

  

请设计一个设备管理程序,以方便资产科对本单位的设备进行管理,设计一程序完成以下功能:

(1)能从键盘输入设备信息 。

(2)指定设备号,显示设备信息。

(3)指定部门名称,显示该部门所使用的设备。

(4)给定设备号,修改设备的信息。

(5)给定设备号,删除设备信息。

1.2  题目要求:

(1)按照分析、设计、编码、调试、测试的软件过程完成这个应用程序。

(2)设备信息包括:设备号、设备名称、购买日期、价格、生产厂家、使用部门。

(3)为各项操作功能设计一个菜单,应用程序运行后,先显示这个菜单,然后用户通过菜单项选择希望进行的操作项目。

1.3 输入要求: 

(1)应用程序运行后在屏幕上显示一个菜单。用户可以根据需求,选定相应的操作项目。进入每个操作后,根据应用程序的提示信息,从键盘输入相应的信息。程序根据用户输入的信息完成相应的处理,实现要求的功能。

(2)能对输入的数据进行简单的校验,例如,购买日期必须是一个合法的日期格式,设备号是唯一的(一个设备号对应一个设备的设备信息)。

1.4  输出要求:

(1)应用程序运行后,要在屏幕上显示一个菜单

(2)要求用户输入数据时,给出清晰、明确的提示信息,包括输入的数据内容、格式以及结束方式等。

(3)在程序完成处理后,要清楚地给出程序的处理结果。例如,在给定设备号删除设备信息时,如果该设备不存在,要提示没能删除,如果删除成功要提示删除成功。

 1.5 实现要求:

(1)在程序中使用链表存储设备信息。

(2)采用模块化程序设计的方法,将程序中的各项功能用函数实现。

1.6 提示: 

(1)使用结构体表示设备信息,一个结点保存一条设备信息

扩展功能:

(1)提供一些统计功能。例如统计每种设备的总数(按照设备名称),统计每个部门使用的设备总数。

(2)设备信息从文件读入。

(3)将设备信息保存到文件中。

 二 、系统设计

2.1 系统功能模块划分

1. 系统功能模块划分设计说明

(1)、添加设备信息

所使用的函数:void createlist();

(2)、指定设备号,通过设备号来查询设备信息

所使用的函数:void showdata();

(3)、指定部门名称,显示该部门所使用的设备

所使用的函数:void Bshowdata();

(4)、给定设备号,修改设备的信息

所使用的函数:void modify ();

(5)、给定设备号,删除设备信息

所使用的函数:void deletenode ();

(6)、显示所有设备信息

所使用的函数:void Pshowdata()

(7)、释放设备信息链表

所使用的函数:void freeList ();

(8)、增加设备的个数;

所使用的函数:void add_data()

(9)、统计每个部门使用的设备总数

所使用的函数:find_bmshebeishu();

(10)、计每种设备的总数(按照设备名称)

所使用的函数:void find_sbzongshu()

2.2  系统功能模块图

(1)能从键盘 和从文件中输入设备信息 。

(2)指定设备号,显示设备信息。

(3)指定部门名称,显示该部门所使用的设备。

(4)给定设备号,修改设备的信息。

(5)给定设备号,删除设备信息。

(6)显示所有设备信息。

(7)添加设备的信息

(8)统计设备的种类(按名称)和每个部门使用设备的个数

2.3 数据结构设计

结构体、链表的设计说明

     typedef struct facility

{

     char no[20];设备号

     char name[10];设备名称

     char cj[20];生产厂家

     char bm[20];使用部门 

     int jg;购买价格

     int year;

     int month;

     int day;

struct facility *next;

}STU;

设备号p->no

设备名称p->name

购买价格&p->jg

生产厂家p->cj

使用部门p->bm

&p->year ,&p->month, &p->day 购买日期

 三 、上代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
#include<stdlib.h>
typedef struct facility
{
	char no[20];
	char name[10];
	char cj[10];
	char bm[10];
	char jg[10];
	int year;
	int month; 
	int day;
	struct facility *next; 
}STU;
STU head;
STU *p,*tail=&head;
STU* findnode(char *no);//查找设备信息的结点
STU* find(char *bm);//查找设备信息部门的节点;
int getindex(char *no); //获取存放设备信息的节点序号;
void showmenu();//1显示菜单 
void showdata();//3通过设备号来查询设备信息;
void createlist();//3数据的输入 
void modify();//4修改设备信息 
void deletenode();//删除设备信息 
void freelist();//6释放节点 
void Pshowdata();//7设备信息的输出 
void Bshowdata();//8查找使用部门 
void sbshowmenu();//9修改菜单
void segister();//10登陆函数;
void createfile();//11通过文件来输入数据 
void createkeyboard();//12通过键盘来输入设备信息 
void printfscreen();//13数据输到屏幕 
void printffile();//14数据输到文件中;
void tongji();//15统计设备的个数
void find_sbzongshu();//16统计每种设备的总数(按照设备名称)
void find_bmshebeishu();//17统计每个部门使用的设备总数
void add_data();//18增加设备的个数; 
//主函数; 
int main()
{
	int select;
	head.next=NULL;
	//segister();
	while(1)
	{
		showmenu();
		printf("请选择需要的操作:");
		scanf("%d",&select);
		fflush(stdin);
		switch(select)
		{
 			case 1:createlist();break;//设备信息的输入;
			case 2:showdata();break;// 
			case 3:Bshowdata();break;
			case 4:modify();break;
			case 5:deletenode();break;
			case 6:Pshowdata();break;
			case 7:tongji();break;
			case 8:add_data();break;
			case 0:freelist();exit(0);
			default:printf("输入错误!\n"); 
		}
		system("pause"); 
	}
    return 0;
}
void segister() 
{
	char user[10],passward[10];//分别储存用户名和密码;
	int count=1;
	while(count<=3)
	{
		printf("你的用户名\n");
		gets(user);
		printf("请输入你的密码\n");
		gets(passward);
		if(strcmp(user,"202002386")==0&&strcmp(passward,"123456")==0)
		{
			printf("登陆成功\n");
			sleep(1);
			break;
		}
		if(count==3)
		{
			exit(0);
		}
		else
		{
			printf("\t 账号或密码错误\n");
			printf("\t 你还有%d次机会,请再次输入账号密码!\n",3-count);
			count++;
		}
	}
	return; 
}

STU* findnode(char *no)//查找设备信息的结点
{
	STU *p;
	p=head.next;
	while(p!=NULL)
	{
		if(strcmp(p->no,no)==0)break;
		p=p->next; 
	}
	return p;
}
STU* find(char *bm)//查找设备信息部门的节点; 
{
	STU *p;
	p=head.next;
	while(p!=NULL)
	{
		if(strcmp(p->bm,bm)==0)break;
		p=p->next; 
	}
	return p;
}
int getindex(char *no)//获取存放设备信息的节点序号; 
{
	int index=1;
	STU *p;
	p=head.next;
	while(p!=NULL)
	{
		if(strcmp(p->no,no)==0)break;
		p=p->next;
		index++;
	}
	if(p==NULL)
		return 0;
	else
		return index;	
}	
void showmenu()
{
	system("cls");
	printf("------------------------------\n");
	printf("*******设备信息管理系统*******\n");
	printf("------------------------------\n");
	printf("\t  1.输入设备信息\n");
	printf("\t  2.指定设备号,显示设备信息\n");
	printf("\t  3.给定使用部门名称,显示该设备信息\n");
	printf("\t  4.给定设备号,修改该设备信息\n");
	printf("\t  5.给定设备号,删除该设备的信息\n");
	printf("\t  6.显示所有的设备信息\n");
	printf("\t  7.统计设备的种类\n");
	printf("\t  8.通过键盘来增加设备个数\n"); 
	printf("\t  0.退出\n");
	printf("------------------------------\n");
	printf("  作者:刘春林\n");
	printf("  All rights reserved\n");
	printf("------------------------------\n");
	printf("  你的选择:");
	return;
}
void sbshowmenu()//修改菜单, 
{
	//system("cls");
	printf("*****选择修改的设备信息*****\n");
	printf("1.修改设备号\n");
	printf("2.修改设备名称\n");
	printf("3.修改购买价格\n");
	printf("4.修改使用部门\n");
	printf("5.修改生产厂家\n");
	printf("6.修改购买日期\n");
	printf("0.放弃修改\n");
	return;
}
void createlist()//1:数据的输入
{
	int select;
	printf("请选择数据输入的方式\n");
	printf("1:以文件方式导入\n");
	printf("2:从键盘上输入\n");
	printf("3:返回上一步\n");
	scanf("%d",&select);
	switch(select)
	{
		case 1:createfile();break;
		case 2:createkeyboard();break;
		case 3:return;
		defaul:printf("选择错误!\n");
	}
	return;
}
void createfile()//从文件中输入 
{
	int i;//i是循环变量;
	int n;//是输入设备的个数; 
	STU *p,*tail;//定义两个链表指针变量
	FILE *fp;//定义一个文件指针;
	fp=fopen("e:\\data.txt","r"); //打开文件;
	if(head.next!=NULL)
	{
		printf("设备的数据的链表已经建立\n");
		return;
	}
	printf("您以选择以文件的方式输入数据\n");
	printf("请输入设备的个数\n");
	tail=&head;//指向头文件;
	scanf("%d",&n); 
	for(i=1;i<=n;i++)
		{
			p=(STU*)malloc(sizeof(STU));//新建立一个结点;
			if(p==NULL)
			{
				printf("内存分配失败!\n");
				return;
			} 
			fscanf(fp,"%s%s%s%s%s",p->no,p->name,p->cj,p->bm,p->jg);
			fscanf(fp,"%d-%d-%d",&p->year,&p->month,&p->day);
			tail->next=p;
			p->next=NULL;
			tail=p; 
		} 
		fclose(fp);//关闭文件;
		printf("设备数据输入成功\n"); 
		return;	
}
void createkeyboard()//从键盘中输入 
{
	int i,n,j,n1;
	char no[20],select;
	STU *p2,*p,*tail;
	printf("您以选择以文件的方式输入数据\n");
	tail=&head;//指向头文件;
	while(1)
	{
		printf("请输入设备信息:\n");
		p=(STU*)malloc(sizeof(STU));
		if(p==NULL)
		{
			printf("建立链表时内存分配失败!\n");
			return;
		}
		do
		{
			j=1;
			p2=head.next;
			printf("输入7位设备号:");
			scanf("%s",no);
			fflush(stdin);
			if(strlen(no)!=7)
			{
				printf("设备号错误,请重新输入!\n");
				j=0;
				continue;
			}
			while(p2!=NULL)
			{
				if(strcmp(p2->no,no)==0)
				{
					printf("设备号重复,请重新输入!\n");
					j=0;
					break;
				}
				p2=p2->next;
			}
		}while(j!=1);
		strcpy(p->no,no);
		printf("设备号正确,请输入其他信息!\n");
		printf("请输入设备名称:\n");
		scanf("%s",p->name);
		fflush(stdin);
		printf("请输入生产厂家:\n");
		scanf("%s",p->cj);
		printf("请输入使用部门:\n");
		scanf("%s",p->bm);
		printf("请输入购买价格:\n");
		scanf("%s",p->jg);
		n1=atoi(p->jg);
		while(1)
		{
			if(n1<=0)
			{
				printf("价格输入不合理,请重新输入:\n");
			    scanf("%s",p->jg);
			    n1=atoi(p->jg);
			}
			else
			{
				break;
			}
		}
		printf("请输入购买年份:\n");
		scanf("%d",&p->year);
		while(1)
		{
			if(p->year<1970||p->year>2021)
			{
				printf("年份不合理,请重新输入:\n"); 
				scanf("%d",&p->year); 
			} 
			if(p->year>1969&&p->year<2022)
			{	
				break;
			}
		} 
		printf("请输入购买月份:\n");
		scanf("%d",&p->month);
		while(1)
		{
			if(p->month<1||p->month>12)
			{
				printf("月份不合理,请重新输入:\n"); 
				scanf("%d ",&p->month); 
			}
			if(p->month>0&&p->month<13)
			{		
				break;
			}
	    }
	    printf("请输购买日期:\n");
		scanf("%d",&p->day);
		if(p->month==1||p->month==3||p->month==5||p->month==7||p->month==8||p->month==10||p->month==12)
		{	
			while(1)
			{
				if(p->day<1||p->day>31) 
				{	
					printf("日期不合理,请重新输入: \n"); 
					scanf("%d",&p->day); 
				}
				if(p->day>0&&p->day<32)
				{		
					break;
				}  
			}
     	}
		if(p->month==4||p->month==6||p->month==9||p->month==11)
		{
			while(1)
			{
				if(p->day<1||p->day>30) 
				{	
					printf("日期不合理,请重新输入 \n"); 
					scanf("%d",&p->day); 
				}
				if(p->day>0&&p->day<31)
				{		
				break;
				} 
	   		}
		}
		if(p->month==2)
		{
			if((p->year%4==0&&p->year%100!=0)||(p->year%400==0))
			{
				while(1)
				{
					if(p->day<1||p->day>29) 
					{	
						printf("日期不合理,请重新输入\n"); 
						scanf("%d",&p->day); 
					} 
					if(p->day>0&&p->day<30) 
					{
						break; 
					}
				}
			}
			else
			{
	   			while(1)
	 			{
					if(p->day<1||p->day>28) 
					{	
						printf("日期不合理,请重新输入\n"); 
					    scanf("%d",&p->day); 
					}
					if(p->day>0&&p->day<29) 
					{
						break; 
					}
				}
	 	   }
	    } 
		tail->next=p;
		p->next=NULL;
		tail=p;
		fflush(stdin); 
		printf("是否继续添加设备信息(y/n或者Y/N)?\n");
		select=getchar(); 
		if(select=='N'||select=='n')
		{
			break; 
		} 
	}
	return;
}	
	
void showdata()// 通过设备号来查询设备信息; 
{
	char no[20];
	STU *p;
	printf("请输入需要查询的设备号:\n");
	gets(no);
	p=findnode(no);
	if(p==NULL)
	{
		printf("设备信息不存在!\n");
		return;
	}
	else
	{
		printf("设备信息如下:\n");
		printf("-------------------------------------------------------------------------------------------------------------\n");
		printf("设备号-----设备名称--------设备厂家---------设备部门-------------设备价格------------购入时间 \n");
		printf("--------------------------------------------------------------------------------------------------------------\n");
		printf("%5s    %-5s         %-10s             %-8s             %-8s            %-5d-%d-%d\n",p->no,p->name,p->cj,p->bm,p->jg,p->year,p->month,p->day);
		printf("------------------------------------------------------------------------------------------------------------\n");
	} 
	return;	
}
void Pshowdata()//显示所有设备信息
{
	int select; 
	STU *p;	
	p=head.next;
	if(head.next==NULL)
	{
		printf("未创建设备信息链表!\n");
		return;
	}
	printf("请选择数据输出的方式:\n");
	printf("1:把数据直接输出到屏幕上\n");
	printf("2:把数据存到文件中\n");
	scanf("%d",&select);
	switch(select)
	{
		case 1:printfscreen();break;
		case 2:printffile();break;
		defaul:printf("选择错误!\n");
	}
	return;
}
void printfscreen()
{
	STU *p;
	p=head.next;
	if(head.next==NULL)
	{
		printf("未创建链表!\n");
		return;
	}
	printf("该设备信息如下\n");
	printf("--------------------------------------------------------------------\n");
	printf("设备号    设备名称      购买厂家       部门      价格       时间   \n"); 
	printf("--------------------------------------------------------------------\n");
	while(p!=NULL)
	{
		printf("%s        %-10s%-10s%-10s%-10s    %-5d-%d-%d\n",p->no,p->name,p->cj,p->bm,p->jg,p->year,p->month,p->day);
		printf("--------------------------------------------------------------------\n");
		p=p->next;
	} 
	return;
}
void printffile()
{
	STU *p;
	FILE *fp;
	fp=fopen("e:\\answer.txt","w");//打开文件;
	p=head.next;
	if(head.next==NULL)
	{
		printf("未创建链表!\n");
		return;
	}
	while(p!=NULL)
		{
			fprintf(fp,"%-10S        %-10s%-10S%-10S%-10s    %-5d-%d-%d\n",p->no,p->name,p->cj,p->bm,p->jg,p->year,p->month,p->day);
			p=p->next;
		}
		fclose(fp);//关闭文件;
		printf("导入文件data.txt成功!\n");
		return;
}
void Bshowdata()//通过部门名称来查询设备信息; 
{
	char bm[10];
	int i=0,select; 
	STU *p;
	if(head.next==NULL)
	{
		printf("未创建设备信息链表!\n");
		return;
	}
	while(1)
	{
		printf("请输入需要查询的部门:\n");
		gets(bm);
		p=head.next;
		while(p!=NULL)
		{
			if(strcmp(p->bm,bm)==0)
			{
				printf("设备号;%s\n",p->no);
				printf("设备名称;%s\n",p->name);
				printf("购买价格;%s\n",p->jg);
				printf("使用部门;%s\n",p->bm);
				printf("生产厂家;%s\n",p->cj);
				printf("购买时间;%d-%d-%d\n",p->year,p->month,p->day);			
				i++;
			}
			p=p->next;
		}
		if(i==0)
		{
			printf("部门不存在!\n");
			fflush(stdin);
			return;
		}
		else
		{
			printf("\n使用的设备总数为%d 个\n\n",i);
		}
		fflush(stdin); 
		printf("是否继续查询设备信息(y/n或者Y/N)?\n");
		select=getchar(); 
		if(select=='N'||select=='n') 
		{
			break; 
		} 		
	}
	return;
}
void modify()
{
	STU *p,*p2;
	int j,sele,n1;
	char no[20];
	if(head.next==NULL)
	{
		printf("未创建设备信息链表!\n");
		return;
	}
	printf("请输入需要修改的设备号:");
	gets(no);
	p=findnode(no);
	if(p==NULL)
	{
		printf("设备信息不存在\n");
		return;
	} 
	printf("该设备的信息为:\n");
	printf("设备号;%s\n",p->no);
	printf("设备名称;%s\n",p->name);
	printf("购买价格;%s\n",p->jg);
	printf("使用部门;%s\n",p->bm);
	printf("生产厂家;%s\n",p->cj);
	printf("购买时间;%d-%d-%d\n",p->year,p->month,p->day);	
	sbshowmenu();
	while(1)
	{
		printf("请选择需要的操作:");
		scanf("%d",&sele);
		if(sele==0)
		{
			return;
		}
		if(sele==1)
		{
			printf("请输入修改过后的信息:");
			do{
				j=1;
				p2=head.next;
		 		printf("输入7位设备号:");
				scanf("%s",no);
				fflush(stdin);
				if(strlen(no)!=7)
				{
					printf("设备号错误,请重新输入!\n");
					j=0;
					continue;
				}
				while(p2!=NULL)
				{
					if(strcmp(p2->no,no)==0)
					{
						printf("设备号重复,请重新输入!\n");
						j=0;
						break;
					}
					p2=p2->next;
				}
			 }while(j!=1);
			strcpy(p->no,no);
			printf("设备号正确!\n");
		}
		if(sele==2)
		{
			printf("请输入设备名:");
			scanf("%s",p->name);
		}
		if(sele==3)
		{
			printf("请输入购买价格:");
			scanf("%s",p->jg);
			n1=atoi(p->jg);
		    while(1)
		    {
			    if(n1<=0)
			    {
				    printf("价格输入不合理,请重新输入:\n");
			        scanf("%s",p->jg);
			        n1=atoi(p->jg);
			    }
			    else
			    {
				    break;
			    }
		}
		}
		if(sele==4)
		{
			printf("请输入使用部门:");
			scanf("%s",p->bm);
		}
		if(sele==5)
		{
			printf("请输入生产厂家:");
			scanf("%s",p->cj);
		}
		if(sele==6)
		{
			printf("请重新输入:\n");
			printf("请输入购买年份:");
			scanf("%d",&p->year);
			while(1)
			{
				if(p->year<1970||p->year>2021)
				{
					printf("年份不合理,请重新输入:"); 
					scanf("%d",&p->year); 
				} 
				if(p->year>1969&&p->year<2022)
				{	
					break;
				}
			} 
			printf("请输入购买月份:");
			scanf("%d",&p->month);
			while(1)
			{
				if(p->month<1||p->month>12)
				{
					printf("月份不合理,请重新输入:"); 
					scanf("%d",&p->month); 
				}
				if(p->month>0&&p->month<13)
				{		
					break;
				}
	  		}
			printf("请输购买日期:");
			scanf("%d",&p->day);
	
			if(p->month==1||p->month==3||p->month==5||p->month==7||p->month==8||p->month==10||p->month==12)
			{	
				while(1)
				{
					if(p->day<1||p->day>31) 
					{	
						printf("日期不合理,请重新输入:"); 
						scanf("%d",&p->day); 
					}
					if(p->day>0&&p->day<32)
					{		
						break;
					}  
				}
     		}
			if(p->month==4||p->month==6||p->month==9||p->month==11)
			{
				while(1)
				{
					if(p->day<1||p->day>30) 
					{	
					printf("日期不合理,请重新输入"); 
					scanf("%d",&p->day); 
					}
					if(p->day>0&&p->day<31)
					{		
						break;
					} 
	 			}
			}
			if(p->month==2)
			{
				if((p->year%4==0&&p->year%100!=0)||(p->year%400==0))
				{
					while(1)
					{
						if(p->day<1||p->day>29) 
						{	
							printf("日期不合理,请重新输入"); 
							scanf("%d",&p->day); 
						} 
						if(p->day>0&&p->day<30) 
						{
							break; 
						}
					}
		  		}
			    while(1)
	  			{
					if(p->day<1||p->day>28) 
					{	
						printf("日期不合理,请重新输入"); 
					    scanf("%d",&p->day); 
					}
					if(p->day>0&&p->day<29) 
					{
						break; 
					}
				}
	  		}
		}
		printf("修改成功!\n"); 
		fflush(stdin);
		printf("是否继续修改设备信息(y/n或者Y/N)?\n");
		sele=getchar(); 
		if(sele=='N'||sele=='n')
		{
			return; 
		} 
	}	
}
void deletenode()//给定设备号,删除设备信息
{
	int n,i;
	char no[20],select;
	STU *p,*pre;
	if(head.next==NULL)
	{
		printf("未创建设备信息链表!\n");
		return;
	}
	printf("请输入需要删除的设备的设备号:\n");
	gets(no);
	n=getindex(no);
	if(n==0)
	{
		printf("设备信息不存在!\n");
		return; 
	} 
	pre=&head;
	for(i=1;i<=n-1;i++)
	{
		pre=pre->next;
	} 
	p=pre->next;
	printf("该设备的信息为:\n");
	printf("设备号: %s\n",p->no);
	printf("设备名称: %s\n",p->name);
	printf("购买价格: %s\n",p->jg);
	printf("使用部门: %s\n",p->bm);
	printf("生产厂家: %s\n",p->cj);
	printf("购买时间: %d-%d-%d\n",p->year,p->month,p->day);
	fflush(stdin); 
	printf("是否确认删除(Y/N)?\n");
	select=getchar();
	if(select=='Y'||select=='y')
		{
			if(p->next!=NULL)
			{
				pre->next=p->next;
				free(p);
				printf("删除成功!\n"); 
			}
			else
			{
				pre->next=NULL;
				free(p);
				printf("删除成功!\n"); 
			}
			
		} 
		if(select=='N'||select=='n')
		{	
			printf("删除取消!\n");
		}
		return;
}
void freelist()//释放节点; 
{
	STU *p;
	p=head.next;
	while(p!=NULL)
	{
		head.next=p->next;
		free(p);
		p=head.next;
	} 
	printf("\n设备信息已全部删除!\n");
	return; 
}
void add_data()
{
	int add,i,j,count=0,n1,f=0; 
	STU *p,*p2,*a;
	if(head.next==NULL)
	{
		printf("未创建链表!\n");
		return;
	}
	a=head.next;
	system("cls");
	printf("******您已选择通过键盘添加数据******\n");
	printf("请输入需要添加的个数:");
	scanf("%d",&add);
	while(a!=NULL)
	{
		count++;
		a=a->next;
	}
	a=head.next;//再次指向头节点;
	for(i=1;i<=count-1;i++)//这不是为了指向最后一个节点前的那个next; 
	{
		a=a->next;
	}
	for(i=1;i<=add;i++)
	{
		while(1)
	    {
		    f=0;
		    printf("请输入设备信息:\n");
		    p=(STU*)malloc(sizeof(STU));
		    if(p==NULL)
		    {
			    printf("建立链表时内存分配失败!\n");
			    return;
		    }
		    do
		    {
			    j=1;
			    p2=head.next;
			    printf("输入7位设备号:");
			    scanf("%s",p->no);
			    fflush(stdin);
			    if(strlen(p->no)!=7)
			    {
				   printf("设备号错误,请重新输入!\n");
				   j=0;
				    continue;
			    }
			    while(p2!=NULL)
			    {
				    if(strcmp(p2->no,p->no)==0)
			     	{
				        printf("设备号重复,请重新输入!\n");
					    j=0;
					    break;
			        }
				    p2=p2->next;
			    }
		    }while(j!=1);
		    strcpy(p->no,p->no);
		    printf("设备号正确,请输入其他信息!\n");
	      	printf("请输入设备名称:");
		    scanf("%s",p->name);
		    fflush(stdin);
		    printf("请输入生产厂家:");
		    scanf("%s",p->cj);
		    printf("请输入使用部门:");
		    scanf("%s",p->bm);
		    printf("请输入购买价格:");
		    scanf("%s",p->jg);
		    n1=atoi(p->jg);
		    while(1)
		    {
		    	f=0;
			    if(n1<=0)
			    {
			        printf("价格输入不合理,请重新输入:\n");
			        f=1;
			        scanf("%s",p->jg);
			        n1=atoi(p->jg);
			    }
			   else
			    {
				    break;
			    }
	  	    }    
		    printf("请输入购买年份:");
		    scanf("%d",&p->year);
		    while(1)
		    {
		    	f=0;
		 	    if(p->year<1970||p->year>2021)
			    {
				    printf("年份不合理,请重新输入:");
				    f=1;
				    scanf("%d",&p->year);
			    } 
			    if(p->year>1969&&p->year<2022)
			    {	
				    break;
			    }
		    } 
		    printf("请输入购买月份:");
		    scanf("%d",&p->month);
		    while(1)
		    {
		    	f=0;
			    if(p->month<1||p->month>12)
			    {
				   printf("月份不合理,请重新输入:"); 
				   f=1;
				   scanf("%d ",&p->month); 
			    }
			    if(p->month>0&&p->month<13)
			    {		
				   break;
			    }
	        }  
	        printf("请输购买日期:");
		    scanf("%d",&p->day);
		    if(p->month==1||p->month==3||p->month==5||p->month==7||p->month==8||p->month==10||p->month==12)
		    {	
			    while(1)
		        {
		        	f=0;
				    if(p->day<1||p->day>31) 
				    {	
					    printf("日期不合理,请重新输入:");
					    f=1;
					    scanf("%d",&p->day); 
			     	}
				    if(p->day>0&&p->day<32)
				    {		
					    break;
				    }  
			    }
     	    } 
		    if(p->month==4||p->month==6||p->month==9||p->month==11)
		    {
			    while(1)
			    {
			    	f=0;
				    if(p->day<1||p->day>30) 
				    {	
					    printf("日期不合理,请重新输入");
						f=-1; 
					    scanf("%d",&p->day); 
				    }
				    if(p->day>0&&p->day<31)
				    {		
				        break;
				    } 
	   		    }
	        }
		    if(p->month==2)
		    {
			    if((p->year%4==0&&p->year%100!=0)||(p->year%400==0))
			    {
				    while(1)
				    {
				    	f=0;
					    if(p->day<1||p->day>29) 
					    {	
						    printf("日期不合理,请重新输入"); 
						    f=1;
						    scanf("%d",&p->day); 
					    } 
					    if(p->day>0&&p->day<30) 
					    {
					     	break; 
					    }
				    }
			    }    
			    else
			    {
	   			    while(1)
	 			    {
	 			    	f=0;
					    if(p->day<1||p->day>28) 
					    {	
						    printf("日期不合理,请重新输入");
							f=1; 
					        scanf("%d",&p->day); 
					    }
					    if(p->day>0&&p->day<29) 
				     	{  
					     	break; 
					    }
				    }
	 	        } 
	        }
	       if(f==0)
		   {
		   	    a->next=p;
		        p->next=NULL;
		        a=p;
				break;
		   } 
		}
    }
    printf("输入成功!\n");
	return;
}    
	

void tongji()//增加设备的个数;
{
	int select;
	printf("请输入你选择统计的内容\n");
	printf("1:每种设备的总数(按照设备名称)\n");
	printf("2:每个部门使用的设备总数\n");
	printf("3:返回上一步\n");
	scanf("%d",&select);
	switch(select)
	{
		case 1:find_sbzongshu();break;
		case 2:find_bmshebeishu();break;
		case 3:return;
		defaul:printf("选择错误!\n");
	}
	return;
}
void find_sbzongshu()//统计每种设备的总数(按照设备名称)
{
	int i,j,len=0,n=0;
	int a[10000]={0},count[10000]={0};
	char str[10][10000];
	STU *p,*pi,*pj,*pre;
	p=head.next;
	pi=head.next;
	pj=head.next;
	pre=head.next;
	while(p!=NULL)
	{
		n++;
		p=p->next;
	}
	for(i=0;i<n;i++)
	{
		pj=head.next;
		for(j=0;j<n;j++)
		{
			if(strcmp(pi->name,pj->name)==0&&a[i]!=1&&i!=j) 
			{
				a[j]=1;
			}
			pj=pj->next;
		}
		pi=pi->next;
	}
	for(i=0;i<n;i++)
	{
		if(a[i]==0)
		{
			strcpy(str[len],pre->name);
			len++;
		}
		pre=pre->next;
	}
	pre=head.next;
	for(i=0;i<len;i++)
	{
		pre=head.next;
		for(j=0;j<n;j++)
		{
			if(strcmp(str[i],pre->name)==0)
			{
				count[i]++;
			}
			pre=pre->next;
		}
		printf("%s有%d个\n",str[i],count[i]);
	}
}
void find_bmshebeishu()
{
	int i,j,len=0,n=0;
	int a[10000]={0},count[10000]={0};
	char str[10][10000];
	STU *p,*pi,*pj,*pre;
	p=head.next;
	pi=head.next;
	pj=head.next;
	pre=head.next;
	while(p!=NULL)
	{
		n++;
		p=p->next;
	}
	for(i=0;i<n;i++)
	{
		pj=head.next;
		for(j=0;j<n;j++)
		{
			if(strcmp(pi->bm,pj->bm)==0&&a[i]!=1&&i!=j) 
			{
				a[j]=1;
			}
			pj=pj->next;
		}
		pi=pi->next;
	}
	for(i=0;i<n;i++)
	{
		if(a[i]==0)
		{
			strcpy(str[len],pre->bm);
			len++;
		}
		pre=pre->next;
	}
	pre=head.next; 
	for(i=0;i<len;i++)
	{
		pre=head.next;
		for(j=0;j<n;j++)
		{
			if(strcmp(str[i],pre->bm)==0)
			{
				count[i]++;
			}
			pre=pre->next;
		}
		printf("%s有%d个\n",str[i],count[i]);
	} 
}

 四、实训报告

       在我主页下载或者私信我。

五、总结

今天又是周一了,新的一周开始了,大家一起努力、一起加油!最后如果对家有帮助,那就请大家动动小手点点赞和关注吧!

  • 41
    点赞
  • 157
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
学生成绩管理系统是一个用于记录和管理学生的成绩信息的软件系统。它可以帮助教师或管理员轻松地录入、查询和统计学生的成绩数据。 在C语言中,实现学生成绩管理系统需要使用一些基本的数据结构和算法。以下是一个简单的示例程序来演示如何实现学生成绩管理系统: ```c #include <stdio.h> #include <stdlib.h> #define MAX_STUDENTS 100 struct Student { char name[50]; int rollNumber; float marks; }; void addStudent(struct Student students[], int *count) { if (*count >= MAX_STUDENTS) { printf("无法添加更多的学生。\n"); return; } struct Student newStudent; printf("请输入学生姓名:"); scanf("%s", newStudent.name); printf("请输入学生学号:"); scanf("%d", &newStudent.rollNumber); printf("请输入学生分数:"); scanf("%f", &newStudent.marks); students[*count] = newStudent; (*count)++; printf("成功添加学生。\n"); } void displayStudents(struct Student students[], int count) { if (count == 0) { printf("没有学生可显示。\n"); return; } printf("所有学生的成绩如下:\n"); for (int i = 0; i < count; i++) { printf("姓名:%s\n", students[i].name); printf("学号:%d\n", students[i].rollNumber); printf("分数:%.2f\n", students[i].marks); printf("--\n"); } } int main() { struct Student students[MAX_STUDENTS]; int count = 0; int choice; do { printf("学生成绩管理系统\n"); printf("1. 添加学生\n"); printf("2. 显示所有学生\n"); printf("3. 退出\n"); printf("请选择操作:"); scanf("%d", &choice); switch (choice) { case 1: addStudent(students, &count); break; case 2: displayStudents(students, count); break; case 3: printf("感谢使用学生成绩管理系统。\n"); exit(0); default: printf("无效的选择,请重新输入。\n"); } printf("\n"); } while (1); return 0; } ``` 这个示例程序实现了一个简单的学生成绩管理系统,可以通过菜单选项来添加学生和显示所有学生的成绩信息。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值