图书管理系统【C语言】

news2024/11/25 5:04:01

咱就是说这太令人绝望了! !!

图书管理系统

这是一个平平无奇的系统。

一、系统要求

1、实现以下基本功能 

    1.添加图书          2.删除图书 
    3.保存图书          4.图书列表 
    5.修改图书          6.查找图书  
    7.图书排序          8.图书统计              

2、编写要求

     用链表实现组织数据。

     用文件的形式将录入的数据存储。

二、功能概述

     1、主菜单的实现

void welcome()
{
	int a=0;
    init_data(head);
    printf("当前有%d条数据!\n",count); 
	printf("***************************************\n");
	printf("***************************************\n");
	printf("*         欢迎使用图书管理系统        *\n");
	printf("***************************************\n");
	printf("***************************************\n");
	printf("*         请输入您要进行的操作        *\n");
	printf("***************************************\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("*              0.退出系统             *\n");	
	printf("***************************************\n");
	printf("***************************************\n");
	printf("请输入您需要进行的操作,并且按Enter进入!\n");
	while(1)
	{
		scanf("%d",&a);
		switch(a)
		{
			case 1://1.添加图书
				add_book(head);
				break;
			case 2://2.删除图书
				delete_book(head);
				break;
			case 3://3.保存图书
				keep_book(head);
				break;
			case 4://4.图书列表  
				show_book(head);
				break;
			case 5://5.修改图书
				change_book(head);
				break;
			case 6://6.查找图书
				search_book(head);
				break;
			case 7://7.图书排序 
				sort_book(head);
				break;
			case 8://8.图书排序 
			    statistics_book(head);
				break;
			case 0://0.退出系统
			    exit(0);																							
		} 
		printf("请输入您需要进行的操作!\n");
	} 
					
}

 执行效果(虽然咱有点丑,但是emmm不重要!!!) 

这个功能较为简单但是写的时候不免还是会有问题。在写完后运行时出现一个特别傻的问题,就是把菜单整个放入了循环语句中导致它在一个操作结束后重复输出。所以我们就要仔细的检查!!!

 2、添加图书

首先图书信息(结构体链表)

然后就是添加函数的代码 

void add_book(struct node *head)
{
	struct node *new=NULL;
	struct node *find=head;
	while(find->next!=NULL)
	{
		find=find->next;
	}
	new=(struct node *)malloc(sizeof(struct node));
	printf("请输入图书编号:\n");
	scanf("%d",&new->data.number);
	printf("请输入图书名称:\n");
	scanf("%s",new->data.name);
	printf("请输入图书作者:\n");
	scanf("%s",new->data.writer);
	printf("请输入图书类别:\n");
	scanf("%s",new->data.type);
	printf("请输入图书价格:\n");
	scanf("%d",&new->data.price);
	new->next=NULL;
	find->next=new;
	printf("%s图书信息添加成功!\n",new->data.name);
	printf("\n");
}

添加图书效果展示

 3、删除图书

void delete_book(struct node *head)
{
	int m=0;
	struct node *target=NULL;
	struct node *find=head;
	struct node *temp=NULL;
	printf("请输入您需要删除图书的编号: \n");
	scanf("%d",&m);
	target=find_book(head,m);
	if(target==NULL)
	{
		printf("该图书不存在!\n");
		return;
	}
	else
	{
		temp=target->next;
		while(find->next!=target)
		{
			find=find->next;
		}
		free(target);
		target=NULL;
		find->next=temp;
		printf("删除成功!\n");
	}
}

代码运行 

3、保存图书

保存图书信息需要使用文件。就是说文件的使用真的快逼疯我了。找不到本应生成的文件,最后寻求大佬帮助,就是说手动创建可还行。这是一个未修改错误。

/*文件的读功能(初始化)*/
void init_data(struct node *head)
{
	FILE *fp=NULL;
	struct node *new=NULL;
	struct node *find=head;
	fp=fopen("book.txt","r");
	if(!fp)
	{
		printf("文件打开失败!\n");
		exit(0);
	}
	while(1)
	{
		new=(struct node *)malloc(sizeof(struct node));
		fscanf(fp,"%d%s%s%s%d",&new->data.number,new->data.name,new->data.writer,new->data.type,&new->data.price);
		new->next=NULL;
		if(feof(fp))
		{
			break;
		}
		count++;
		find->next=new;
		find=find->next;
	}
}
/*文件的写功能*/
void keep_book(struct node *head)
{
	FILE *fp=NULL;
	struct node *find=head->next;
	fp=fopen("book.txt","w");
	while(find!=NULL)
	{
		fprintf(fp,"%d\t%s\t%s\t%s\t%d\n",find->data.number,find->data.name,find->data.writer,find->data.type,find->data.price);
		find=find->next;
	}
	printf("数据保存成功!\n");
}

运行效果

 

 4、图书列表

void show_book(struct node *head)
{
	struct node *find=head->next;
	while(find!=NULL)
	{
		info_output(find);
		find=find->next;
	}
}

void info_output(struct node *find)
{

	printf("----------------------------------------------------------------------------\n");
	printf(" 编号:%d\t 名称:%s\t 作者:%s\t 类别:%s\t 价格:%d\t \n",find->data.number,find->data.name,find->data.writer,find->data.type,find->data.price);
	printf("----------------------------------------------------------------------------\n");
}

5、修改图书

void change_book(struct node *head)
{
	int n=0;
	struct node *target=NULL;
	printf("请输入您需要修改的图书编号:\n");
	scanf("%d",&n);
	target=find_book(head,n);
	if(target==NULL)
	{
		printf("该图书不存在!\n");
	}
	else
	{
		printf("请输入图书编号:\n");\
        scanf("%d",&target->data.number);
	    printf("请输入图书名称:\n");
	    scanf("%s",target->data.name);
	    printf("请输入图书作者:\n");
	    scanf("%s",target->data.writer);
	    printf("请输入图书类别:\n");
    	scanf("%s",target->data.type);
    	printf("请输入图书价格:\n");
    	scanf("%d",&target->data.price);
    	printf("图书信息修改成功!\n");
    	info_output(target);
	}
}

6、查找图书

两种查找方式 (详细代码见下面完整代码)

void search_book(struct node *head)
{
	int n;
	printf("************************************\n");
	printf("************************************\n");
	printf("     请输入您需要操作的查找方式:   \n");
	printf("************************************\n");
	printf("************************************\n");
	printf("*         1.按图书编号查找         *\n");
	printf("*         2.按图书名称查找         *\n");
	printf("************************************\n");
	printf("************************************\n");
	scanf("%d",&n);
	switch(n)
	{
		case 1:
			search1_book(head);
			break;
		case 2:
			search2_book(head);
			break;
	} 
}

7.图书排序

void sort_book(struct node *head)
{
	int n;
	printf("************************************\n");
	printf("************************************\n");
	printf("     请输入您需要操作的排序方式:   \n");
	printf("************************************\n");
	printf("************************************\n");
	printf("*         1.按图书编号排序         *\n");
	printf("*         2.按图书价格排序         *\n");
	printf("************************************\n");
	printf("************************************\n");
	scanf("%d",&n);
	switch(n)
	{
		case 1:
			sort1_book(head);
			break;
		case 2:
			Sort_book(head);
			break;
	} 
}

排序效果: 

完整代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h> 


struct book
{
	int number;      //图书编号 
	char name[85];   //图书名称 
	char writer[85]; //图书作者 
	char type[85];   //图书类别 
	int price;       //图书价格  
	struct book *next;
};
struct node
{
	struct book data;
	struct node *next;
};
struct node *head=NULL;


void welcome();
void createHeadNode();
void add_book(struct node *head);
void delete_book(struct node *find);
void sum_book(struct node *head);
void init_data(struct node *head);
void statistics_book(struct node *head);
struct node *find_book(struct node *head,int number);
struct node *find1_book(struct node *head,char name[85]);
void search_book(struct node *head); 
void search1_book(struct node *head); 
void search2_book(struct node *head); 
void change_book(struct node *head); 
void sort_book(struct node *head);
void sort1_book(struct node *head); 
void sort2_book(struct node *head);
void show_book(struct node *head);
void info_output(struct node *find);
void keep_book(struct node *head);



int count; 
int main()
{
	createHeadNode();
    welcome();
    system("pause");
	return 0;
} 


void welcome()
{
	int a=0;
    init_data(head);
    printf("当前有%d条数据!\n",count); 
	printf("***************************************\n");
	printf("***************************************\n");
	printf("*         欢迎使用图书管理系统        *\n");
	printf("***************************************\n");
	printf("***************************************\n");
	printf("*         请输入您要进行的操作        *\n");
	printf("***************************************\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("*              0.退出系统             *\n");	
	printf("***************************************\n");
	printf("***************************************\n");
	printf("请输入您需要进行的操作,并且按Enter进入!\n");
	while(1)
	{
		scanf("%d",&a);
		switch(a)
		{
			case 1://1.添加图书
				add_book(head);
				break;
			case 2://2.删除图书
				delete_book(head);
				break;
			case 3://3.保存图书
				keep_book(head);
				break;
			case 4://4.图书列表  
				show_book(head);
				break;
			case 5://5.修改图书
				change_book(head);
				break;
			case 6://6.查找图书
				search_book(head);
				break;
			case 7://7.图书排序 
				sort_book(head);
				break;
			case 8://8.图书排序 
			    statistics_book(head);
				break;
			case 0://0.退出系统
			    exit(0);																							
		} 
		printf("请输入您需要进行的操作!\n");
	} 
					
}

void createHeadNode()
{
	head=(struct node *)malloc(sizeof(struct node));
	if(!head)
	{
		printf("头结点分配失败!\n");
		return;
	}
	head->next=NULL;
}

void add_book(struct node *head)
{
	struct node *new=NULL;
	struct node *find=head;
	while(find->next!=NULL)
	{
		find=find->next;
	}
	new=(struct node *)malloc(sizeof(struct node));
	printf("请输入图书编号:\n");
	scanf("%d",&new->data.number);
	printf("请输入图书名称:\n");
	scanf("%s",new->data.name);
	printf("请输入图书作者:\n");
	scanf("%s",new->data.writer);
	printf("请输入图书类别:\n");
	scanf("%s",new->data.type);
	printf("请输入图书价格:\n");
	scanf("%d",&new->data.price);
	new->next=NULL;
	find->next=new;
	printf("%s图书信息添加成功!\n",new->data.name);
	printf("\n");
}

void show_book(struct node *head)
{
	struct node *find=head->next;
	while(find!=NULL)
	{
		info_output(find);
		find=find->next;
	}
}

void info_output(struct node *find)
{

	printf("----------------------------------------------------------------------------\n");
	printf(" 编号:%d\t 名称:%s\t 作者:%s\t 类别:%s\t 价格:%d\t \n",find->data.number,find->data.name,find->data.writer,find->data.type,find->data.price);
	printf("----------------------------------------------------------------------------\n");
}

void delete_book(struct node *head)
{
	int m=0;
	struct node *target=NULL;
	struct node *find=head;
	struct node *temp=NULL;
	printf("请输入您需要删除图书的编号: \n");
	scanf("%d",&m);
	target=find_book(head,m);
	if(target==NULL)
	{
		printf("该图书不存在!\n");
		return;
	}
	else
	{
		temp=target->next;
		while(find->next!=target)
		{
			find=find->next;
		}
		free(target);
		target=NULL;
		find->next=temp;
		printf("删除成功!\n");
	}
}


struct node *find_book(struct node *head,int number)
{
	struct node *find=head;
	while(find!=NULL)
	{
		if(find->data.number==number)
		{
			return find;
		}
		find=find->next;
	}
	return find;
}

void search1_book(struct node *head)
{
	int n=0;
	struct node *target=NULL;
	printf("请输入您需要查找的图书编号:\n");
	scanf("%d",&n);
	target=find_book(head,n);
	if(target==NULL)
	{
		printf("该图书不存在!\n");
	}
	else
	{
		info_output(target);
	}
}


struct node *find1_book(struct node *head,char *bname)
{
	struct node *find=head;
	while(find!=NULL)
	{
        if(strcmp(find->data.name,bname)==0)
		{
			return find;
		}
		find=find->next;
	}
	return find;

}

void search2_book(struct node *head)
{
	char bname[85];
	struct node *target=NULL;
	printf("请输入您需要查找的图书名称:\n");
	scanf("%s",bname);
	target=find1_book(head,bname);
	if(target==NULL)
	{
		printf("该图书不存在!\n");
	}
	else
	{
		info_output(target);
	}
}


void search_book(struct node *head)
{
	int n;
	printf("************************************\n");
	printf("************************************\n");
	printf("     请输入您需要操作的查找方式:   \n");
	printf("************************************\n");
	printf("************************************\n");
	printf("*         1.按图书编号查找         *\n");
	printf("*         2.按图书名称查找         *\n");
	printf("************************************\n");
	printf("************************************\n");
	scanf("%d",&n);
	switch(n)
	{
		case 1:
			search1_book(head);
			break;
		case 2:
			search2_book(head);
			break;
	} 
}


void change_book(struct node *head)
{
	int n=0;
	struct node *target=NULL;
	printf("请输入您需要修改的图书编号:\n");
	scanf("%d",&n);
	target=find_book(head,n);
	if(target==NULL)
	{
		printf("该图书不存在!\n");
	}
	else
	{
		printf("请输入图书编号:\n");\
        scanf("%d",&target->data.number);
	    printf("请输入图书名称:\n");
	    scanf("%s",target->data.name);
	    printf("请输入图书作者:\n");
	    scanf("%s",target->data.writer);
	    printf("请输入图书类别:\n");
    	scanf("%s",target->data.type);
    	printf("请输入图书价格:\n");
    	scanf("%d",&target->data.price);
    	printf("图书信息修改成功!\n");
    	info_output(target);
	}
}


void sort1_book(struct node *head)
{
	struct node *find1=head;
	struct node *find2=head;
    struct book t;
	for(find1=head->next;find1!=NULL;)
	{
		for(find2=find1->next;find2!=NULL;)
		{
			if(find1->data.number>find2->data.number)
			{
				t=find1->data;
				find1->data=find2->data;
				find2->data=t;
			}
			else
		    	break;
		    	find2=find2->next;
		}
		find1=find1->next;
	 } 
	 printf("排序完成!\n");
	 show_book(head);
}


void sort2_book(struct node *head)
{
	struct node *find1=head;
	struct node *find2=head;
    struct book t;
	for(find1=head->next;find1!=NULL;)
	{
		for(find2=find1->next;find2!=NULL;)
		{
			if(find1->data.price<find2->data.price)
			{
				t=find1->data;
				find1->data=find2->data;
				find2->data=t;
			}
			else
		    	break;
		    	find2=find2->next;
		}
		find1=find1->next;
	 } 
	 printf("排序完成!\n");
	 show_book(head);
}



void sort3_book(struct node *head)
{
	struct node *find1=head;
	struct node *find2=head;
    struct book t;
	for(find1=head->next;find1!=NULL;)
	{
		for(find2=find1->next;find2!=NULL;)
		{
			if(find1->data.price>find2->data.price)
			{
				t=find1->data;
				find1->data=find2->data;
				find2->data=t;
			}
			else
		    	break;
		    	find2=find2->next;
		}
		find1=find1->next;
	 } 
	 printf("排序完成!\n");
	 show_book(head);
}

void Sort_book(struct node *head)
{
	int n;
	printf("************************************\n");
	printf("************************************\n");
	printf("     请输入您需要价格排序方式:   \n");
	printf("************************************\n");
	printf("************************************\n");
	printf("*            1.价格降序            *\n");
	printf("*            2.价格升序            *\n");
	printf("************************************\n");
	printf("************************************\n");
	scanf("%d",&n);
	switch(n)
	{
		case 1:
			sort2_book(head);
			break;
		case 2:
			sort3_book(head);
			break;
	} 
}

void sort_book(struct node *head)
{
	int n;
	printf("************************************\n");
	printf("************************************\n");
	printf("     请输入您需要操作的排序方式:   \n");
	printf("************************************\n");
	printf("************************************\n");
	printf("*         1.按图书编号排序         *\n");
	printf("*         2.按图书价格排序         *\n");
	printf("************************************\n");
	printf("************************************\n");
	scanf("%d",&n);
	switch(n)
	{
		case 1:
			sort1_book(head);
			break;
		case 2:
			Sort_book(head);
			break;
	} 
}


void init_data(struct node *head)
{
	FILE *fp=NULL;
	struct node *new=NULL;
	struct node *find=head;
	fp=fopen("book.txt","r");
	if(!fp)
	{
		printf("文件打开失败!\n");
		exit(0);
	}
	while(1)
	{
		new=(struct node *)malloc(sizeof(struct node));
		fscanf(fp,"%d%s%s%s%d",&new->data.number,new->data.name,new->data.writer,new->data.type,&new->data.price);
		new->next=NULL;
		if(feof(fp))
		{
			break;
		}
		count++;
		find->next=new;
		find=find->next;
	}
}


void keep_book(struct node *head)
{
	FILE *fp=NULL;
	struct node *find=head->next;
	fp=fopen("book.txt","w");
	while(find!=NULL)
	{
		fprintf(fp,"图书编号:%d\t图书名称:%s\t图书作者:%s\t图书类别:%s\t图书价格:%d\n",find->data.number,find->data.name,find->data.writer,find->data.type,find->data.price);
		find=find->next;
	}
	printf("数据保存成功!\n");
}

void sum_book(struct node *head)
{
	int cnt;
	cnt=0;
	struct node *move=head; 
	while(NULL!=move->next)
	{
		move=move->next;
		cnt++;
	}
	printf("当前管理系统有%d本图书!\n",cnt);
    printf("\n"); 
 } 
 
 
 void statistics_book(struct node *head)
 {
	printf("************************************\n");
	printf("       请输入您需要的统计方式:     \n");
	printf("************************************\n");
	printf("*         1.整体统计               *\n");
	printf("*         2.按图书作者统计         *\n");
	printf("*         3.按图书类别统计         *\n");
	printf("************************************\n");
	int n;
	scanf("%d",&n);
	int c=0;
	char writer[85];
	char type[85];
	struct node *find1=head;
	struct node *find2=head;
	switch(n)
	{
		case 1:
		    sum_book(head);
		    break;
		case 2:
			printf("请输入您要统计图书的作者:\n");
			scanf("%s",writer);
			while(find1)
			{
				if(strcmp(find1->data.writer,writer)==0)
				{
					printf("图书编号:%d\t图书名称:%s\t图书作者:%s\t图书类别:%s\t图书价格:%d\t\n",find1->data.number,find1->data.name,find1->data.writer,find1->data.type,find1->data.price);
					c++;
				}
				find1=find1->next;
			}
			if(c==0)
			printf("未找到%s所著图书!\n",writer);
			else
			printf("共有%d本%s所著图书!\n",c,writer);
			printf("\n");
			break;
		case 3:
			printf("请输入您要统计图书的类别:\n");
			scanf("%s",type);
			while(find1)
			{
				if(strcmp(find1->data.type,type)==0)
				{
					printf("图书编号:%d\t图书名称:%s\t图书作者:%s\t图书类别:%s\t图书价格:%d\t\n",find1->data.number,find1->data.name,find1->data.writer,find1->data.type,find1->data.price);
					c++;
				}
				find1=find1->next;
			}
			if(c==0){
			printf("未找到%s类别的图书!\n",type);
			printf("\n");}
			else{
			printf("共有%d本%s类别的图书!\n",c,type);
			printf("\n");}
						break;
	 } 

 }

总结 

就是说刚知道要写管理系统时毫无思路,后经大佬指点去B站看管理系统相关视频。在看完之后便自己进行编写,过程只能说非常坎坷。

第一个问题:菜单的编写把循环语句放错位置,导致菜单一直循环输出。

第二个问题:这个问题是我的问题。就是它显示图书信息的时候不好看就是chou,但是改了好久除了难看还是难看最后就放弃了。

第三个问题:在编写完排序这个功能后,因为排序用了两种方式,看着查找就是想再补充一下,然后通过图书名称查找,咱嗯就不会了。然后字符串比较的函数(strcmp函数)也不怎么会用。虽然最后还是写出来了但是感谢CSDN吧。

第四个问题:当然是文件!!!!!!!可以把人逼疯的东西!!!!!

代码编译是完全OK的,但是无法生成目标文件!!!也就是看了无数视频后,表示并没有什么卵用。最后寻求帮助!创建目标文件!运行成功了!但是这还是存在一个错误!

#include<stdio.h>
#include<string.h>
#include<stdlib.h> 
#include<conio.h>

//定义用户结构体 
struct asccount{  
    char ID[8];  
    char password[8]; 
}user[1000];


//定义菜品结构体 
struct food 
{
	int number;      //菜品编号 
	char name[85];   //菜品名称 
	char material[85]; //菜品原料 
	char type[85];   //菜品类别 
	int price;       //菜品价格 
}food;

//链表 
struct node
{
	struct food data;
	struct node *next;
};
struct node *head=NULL;


//函数声明 
void get_password(char *pswd, unsigned maxlen); 
void refresh( struct node *head);
void insert();
void user_menu(void);
void add_user(void);
void load_user(void);
void save_user(void);
void login_user(void);
void reset_password(void);
void welcome();
void createHeadNode();
void add_food(struct node *head);
void delete_food(struct node *find);
void sum_food(struct node *head);
void statistics_food(struct node *head);
struct node *find_food(struct node *head,int number);
struct node *find1_food(struct node *head,char name[85]);
void search_food(struct node *head); 
void search1_food(struct node *head); 
void search2_food(struct node *head); 
void search3_food(struct node *head); 
void change_food(struct node *head); 
void sort_food(struct node *head);
void sort1_food(struct node *head); 
void sort2_food(struct node *head);
void show_food(struct node *head);
void info_output(struct node *find);
void keep_food(struct node *head);



int user_count=0;
int count; 


//主函数 
int main()
{
	user_menu();//用户登录菜单 
	createHeadNode();//创建节点 
  	welcome();//功能选择菜单 
  	system("pause");
	return 0; 
	
	
} 

//功能选择菜单 
void welcome()
{
	int a=0;
	refresh(head);//读出文件内容 
	printf("***************************************\n");
	printf("***************************************\n");
	printf("*         欢迎使用餐厅管理系统        *\n");
	printf("***************************************\n");
	printf("***************************************\n");
	printf("*         请输入您要进行的操作        *\n");
	printf("***************************************\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("*              9.插入菜品             *\n");
    printf("*              0.退出系统             *\n");	
	printf("***************************************\n");
	printf("***************************************\n");
	printf("请输入您需要进行的操作,并且按Enter进入!\n");
	while(1)
	{
		scanf("%d",&a);
		switch(a)
		{
			case 1://1.添加菜品 
				add_food(head);
				break;
			case 2://2.删除菜品 
				delete_food(head);
				
				break;
			case 3://3.保存菜品 
				keep_food(head);
				
				break;
			case 4://4.菜单列表 
			    
				show_food(head);
				
				
				break;
			case 5://5.修改菜品 
				change_food(head);
			
				break;
			case 6://6.查找菜品 
				search_food(head);
				
				break;
			case 7://7.菜单排序 
				sort_food(head);
				
				break;
			case 8://8.菜品统计 
			    statistics_food(head);
			   
				break;
			case 9://9.插入菜品
			   insert(); 
				break;
			case 10://9.插入菜品
				refresh(head);
				break;
			case 0://0.退出系统
			    exit(0);																							
		} 
		printf("请输入您需要进行的操作!\n");
	} 
					
}


//创建节点 
void createHeadNode()
{
	head=(struct node *)malloc(sizeof(struct node));
	if(!head)
	{
		printf("头结点分配失败!\n");
		return;
	}
	head->next=NULL;
}


//添加菜品  
void add_food(struct node *head)
{
	struct node *new=NULL;
	struct node *p=head; 
	struct node *find=head;
	while(find->next!=NULL)
	{
		find=find->next;
	}
	new=(struct node *)malloc(sizeof(struct node));
	printf("请输入菜品编号:\n");
	scanf("%d",&new->data.number);

	
	printf("请输入菜品名称:\n");
	scanf("%s",new->data.name);
	printf("请输入菜品原料:\n");
	scanf("%s",new->data.material);
	printf("请输入菜品类别:\n");
	scanf("%s",new->data.type);
	printf("请输入菜品价格:\n");
	scanf("%d",&new->data.price);
	new->next=NULL;
	find->next=new;
	printf("%s菜品信息添加成功!\n",new->data.name);
	printf("\n");

}


//菜单列表 
void show_food(struct node *head)
{
	struct node *find=head->next;
	while(find!=NULL)
	{
		info_output(find);
		find=find->next;
	}

}

//打印菜品信息 
void info_output(struct node *find)
{

	printf("----------------------------------------------------------------------------\n");
	printf(" 编号:%d\t 名称:%s\t 原料:%s\t 类别:%s\t 价格:%d\t \n",find->data.number,find->data.name,find->data.material,find->data.type,find->data.price);
	printf("----------------------------------------------------------------------------\n");
}


//删除菜品 
void delete_food(struct node *head)
{
	
	int m=0;
	struct node *target=NULL;
	struct node *find=head;
	struct node *temp=NULL;
	printf("请输入您需要删除菜品的编号: \n");
	scanf("%d",&m);
	target=find_food(head,m);
	if(target==NULL)
	{
		printf("该菜品不存在!\n");
		return;
	}
	else
	{
		temp=target->next;
		while(find->next!=target)
		{
			find=find->next;
		}
		free(target);
		target=NULL;
		find->next=temp;
		printf("删除成功!\n");
	}
}

//插入菜品 
void insert()
{
    
    printf("请输入您需要插入哪个菜品位置后:\n");
    int nTeaNum;
    scanf("%d", &nTeaNum);
    struct node* p = head;
    struct node* t = (struct node*)malloc(sizeof(struct node));
    while (p && (p->data.number != nTeaNum))
    {
        p = p->next;
    }
    if (p)
    {
        printf("请输入要插入的菜品编号:\n");
        scanf("%d", &t->data.number);
        printf("请输入要插入的菜品名称:\n");
        scanf("%s", t->data.name);
        printf("请输入要插入的菜品原料:\n");
        scanf("%s", t->data.material);
        printf("请输入要插入的菜品类别:\n");
        scanf("%s", &t->data.type);
        printf("请输入要插入的菜品价格:\n");
        scanf("%d", &t->data.price);
        t->next = p->next;
        p->next = t;
        printf("菜品信息插入成功!\n");
        system("pause");
        return;
    }
    else
    {
        printf(" 找不到该菜品\n");
        system("pause");
        return;
    }
}


//按编号查找 
struct node *find_food(struct node *head,int number)
{
	struct node *find=head;
	while(find!=NULL)
	{
		if(find->data.number==number)
		{
			return find;
		}
		find=find->next;
	}
	return find;
}
void search1_food(struct node *head)
{
	int n=0;
	struct node *target=NULL;
	printf("请输入您需要查找的菜品编号:\n");
	scanf("%d",&n);
	target=find_food(head,n);
	if(target==NULL)
	{
		printf("该菜品不存在!\n");
	}
	else
	{
		info_output(target);
	}
}

//按名称查找 
struct node *find1_food(struct node *head,char *bname)
{
	struct node *find=head;
	while(find!=NULL)
	{
        if(strcmp(find->data.name,bname)==0)
		{
			return find;
		}
		find=find->next;
	}
	return find;

}
void search2_food(struct node *head)
{
	char bname[85];
	struct node *target=NULL;
	printf("请输入您需要查找的菜品名称:\n");
	scanf("%s",bname);
	target=find1_food(head,bname);
	if(target==NULL)
	{
		printf("该菜品不存在!\n");
	}
	else
	{
		info_output(target);
	}
}


//按类型及价格查找 
struct node *find2_food(struct node *head,int price)  //价格 
{
	struct node *find=head;
	while(find!=NULL)
	{
		if(find->data.price==price)
		{
			return find;
		}
		find=find->next;
	}
	return find;
}
struct node *find3_food(struct node *head,char *type) //类型 
{
	struct node *find=head;
	while(find!=NULL)
	{
        if(strcmp(find->data.type,type)==0)
		{
			return find;
		}
		find=find->next;
	}
	return find;

}
void search3_food(struct node *head)
{
	int price=0; 
	char type[85];
	struct node *target=NULL;
	printf("请输入您需要查询的菜品类型及菜品价格:\n");
	scanf("%s %d",type,&price);
	target=find3_food(head,type);
	if(target==NULL)
	{
		printf("不存在!"); 
	}
	else{
		target=find2_food(head,price);
	    if(target==NULL)
	    {
		printf("该菜品不存在!\n");
	    }
	    else
	    {
		info_output(target);
	    }
	}
	
	
 } 


//查找选择菜单 
void search_food(struct node *head)
{
	int n;
	printf("************************************\n");
	printf("************************************\n");
	printf("     请输入您需要操作的查找方式:   \n");
	printf("************************************\n");
	printf("************************************\n");
	printf("*         1.按菜品编号查找         *\n");
	printf("*         2.按菜品名称查找         *\n");
	printf("*      3.按菜品类别以及价格查找    *\n");
	printf("************************************\n");
	printf("************************************\n");
	scanf("%d",&n);
	switch(n)
	{
		case 1:
			search1_food(head);
			break;
		case 2:
			search2_food(head);
			break;
		case 3:
			search3_food(head);
			break;
	} 
}

//修改菜品信息 
void change_food(struct node *head)
{
	int n=0;
	struct node *target=NULL;
	printf("请输入您需要修改的菜品编号:\n");
	scanf("%d",&n);
	target=find_food(head,n);
	if(target==NULL)
	{
		printf("该菜品不存在!\n");
	}
	else
	{
		printf("请输入菜品编号:\n");\
        scanf("%d",&target->data.number);
	    printf("请输入菜品名称:\n");
	    scanf("%s",target->data.name);
	    printf("请输入菜品原料:\n");
	    scanf("%s",target->data.material);
	    printf("请输入菜品类别:\n");
    	scanf("%s",target->data.type);
    	printf("请输入菜品价格:\n");
    	scanf("%d",&target->data.price);
    	printf("菜品信息修改成功!\n");
    	info_output(target);
	}
}


//按编号排序 升序 
void sort1_food(struct node *head)
{
	struct node *find1=head;
	struct node *find2=head;
    struct food t;
	for(find1=head->next;find1!=NULL;)
	{
		for(find2=find1->next;find2!=NULL;)
		{
			if(find1->data.number>find2->data.number)
			{
				t=find1->data;
				find1->data=find2->data;
				find2->data=t;
			}
			else
		    	break;
		    	find2=find2->next;
		}
		find1=find1->next;
	 } 
	 printf("排序完成!\n");
	 show_food(head);
}


//价格降序 
void sort2_food(struct node *head)
{
	struct node *find1=head;
	struct node *find2=head;
    struct food t;
	for(find1=head->next;find1!=NULL;)
	{
		for(find2=find1->next;find2!=NULL;)
		{
			if(find1->data.price<find2->data.price)
			{
				t=find1->data;
				find1->data=find2->data;
				find2->data=t;
			}
			else
		    	break;
		    	find2=find2->next;
		}
		find1=find1->next;
	 } 
	 printf("排序完成!\n");
	 show_food(head);
}



//价格升序 
void sort3_food(struct node *head)
{
	struct node *find1=head;
	struct node *find2=head;
    struct food t;
	for(find1=head->next;find1!=NULL;)
	{
		for(find2=find1->next;find2!=NULL;)
		{
			if(find1->data.price>find2->data.price)
			{
				t=find1->data;
				find1->data=find2->data;
				find2->data=t;
			}
			else
		    	break;
		    	find2=find2->next;
		}
		find1=find1->next;
	 } 
	 printf("排序完成!\n");
	 show_food(head);
}


//排序菜单 
void Sort_food(struct node *head)
{
	int n;
	printf("************************************\n");
	printf("************************************\n");
	printf("     请输入您需要价格排序方式:   \n");
	printf("************************************\n");
	printf("************************************\n");
	printf("*            1.价格降序            *\n");
	printf("*            2.价格升序            *\n");
	printf("************************************\n");
	printf("************************************\n");
	scanf("%d",&n);
	switch(n)
	{
		case 1:
			sort2_food(head);
			break;
		case 2:
			sort3_food(head);
			break;
	} 
}


//价格排序菜单 
void sort_food(struct node *head)
{
	int n;
	printf("************************************\n");
	printf("************************************\n");
	printf("     请输入您需要操作的排序方式:   \n");
	printf("************************************\n");
	printf("************************************\n");
	printf("*         1.按菜品编号排序         *\n");
	printf("*         2.按菜品价格排序         *\n");
	printf("************************************\n");
	printf("************************************\n");
	scanf("%d",&n);
	switch(n)
	{
		case 1:
			sort1_food(head);
			break;
		case 2:
			Sort_food(head);
			break;
	} 
}


//读取文件内容 
void refresh( struct node *head)
{
 
 FILE *fp;
 struct node *p =NULL;                                                          
 struct node * temp=head->next;
 p=(struct node *)malloc(sizeof(struct node));
 if(p==NULL)
 {
  printf("分配普通节点内存出错!\n");
     exit(1);
 }
 memset(p,0,sizeof(struct node));  
 fp=fopen("food.txt","r");
 if(fp==NULL)
 {
  printf("\n     无法打开文件!\n");
     exit(1);
 }
 while(!feof(fp))
 {
fscanf(fp,"菜品编号:%d\t菜品名称:%s\t菜品原料:%s\t菜品类别:%s\t菜品价格:%d\n",&p->data.number,p->data.name,p->data.material,p->data.type,&p->data.price);
     head->next=p;
     p->next=temp;
     temp=p;
     p=(struct node *)malloc(sizeof(struct node));
     if(p==NULL)
     {
       printf("分配普通节点内存出错!\n");
       exit(1);
     }
     memset(p,0,sizeof(struct node));
}  
}    


//数据保存 文件写入 
void keep_food(struct node *head)
{
	FILE*fp;
	fp=fopen("food.txt","w");
	fp=fopen("food.txt","a");
	if(fp==NULL)
	{
		printf("文件打开失败!\n");
		return;
	}
	struct node *find=head->next;
	while(find!=NULL)
	{
		fprintf(fp,"菜品编号:%d\t菜品名称:%s\t菜品原料:%s\t菜品类别:%s\t菜品价格:%d\n",find->data.number,find->data.name,find->data.material,find->data.type,find->data.price);
		find=find->next;
	}
	printf("数据保存成功!\n");
	fclose(fp);
	
 } 
 


//统计整体 
void sum_food(struct node *head)
{
	int cnt;
	cnt=0;
	struct node *move=head; 
	while(NULL!=move->next)
	{
			move=move->next;
		cnt++;
	}
	printf("当前餐厅有%d个菜品!\n",cnt);
    printf("\n"); 
 } 
 
 
 //统计菜单 
 void statistics_food(struct node *head)
 {
	printf("************************************\n");
	printf("       请输入您需要的统计方式:     \n");
	printf("************************************\n");
	printf("*         1.整体统计               *\n");
	printf("*         2.按菜品原料统计         *\n");
	printf("*         3.按菜品类别统计         *\n");
	printf("*         4.按菜品类别及价格统计   *\n");
	printf("************************************\n");
	int n;
	scanf("%d",&n);
	int c=0;
	int price; 
	char material[85];
	char type[85];
	struct node *find1=head;
	struct node *find2=head;
	switch(n)
	{
		case 1:
		    sum_food(head);
		    break;
		case 2:
			printf("请输入您要统计菜品的原料:\n");
			scanf("%s",material);
			while(find1)
			{
				if(strcmp(find1->data.material,material)==0)
				{
					printf("菜品编号:%d\t菜品名称:%s\t菜品原料:%s\t菜品类别:%s\t菜品价格:%d\t\n",find1->data.number,find1->data.name,find1->data.material,find1->data.type,find1->data.price);
					c++;
				}
				find1=find1->next;
			}
			if(c==0)
			printf("未找到%s所做菜品!\n",material);
			else
			printf("共有%d个%s所做菜品!\n",c,material);
			printf("\n");
			break;
		case 3:
			printf("请输入您要统计菜品的类别:\n");
			scanf("%s",type);
			while(find1)
			{
				if(strcmp(find1->data.type,type)==0)
				{
					printf("菜品编号:%d\t菜品名称:%s\t菜品原料:%s\t菜品类别:%s\t菜品价格:%d\t\n",find1->data.number,find1->data.name,find1->data.material,find1->data.type,find1->data.price);
					c++;
				}
				find1=find1->next;
			}
			if(c==0){
			printf("未找到%s类别的菜品!\n",type);
			printf("\n");}
			else{
			printf("共有%d个%s类别的菜品!\n",c,type);
			printf("\n");}
						break;
		case 4:
			   
				printf("请输入您要统计菜品的类别及价格:\n");
				scanf("%s %d",type,&price);
					while(find1)
			{
				if(strcmp(find1->data.type,type)==0)
				{
				    if(find1->data.price==price)
				    {
				    	printf("菜品编号:%d\t菜品名称:%s\t菜品原料:%s\t菜品类别:%s\t菜品价格:%d\t\n",find1->data.number,find1->data.name,find1->data.material,find1->data.type,find1->data.price);
					    c++;
					}
				}
				find1=find1->next;
			}
			if(c==0){
			printf("未找到%s类别%d价格的菜品!\n",type,price);
			printf("\n");}
			else{
			printf("共有%d个%s类别%d价格的菜品!\n",c,type,price);
			printf("\n");}
						break;   
	 } 
 }
 

//登录菜单 
void user_menu(void) 
{
	int choose;
	system("cls");//清屏 
	printf("\n|\t\t\t\t\t|");
	printf("\n|\t\t\t\t\t|");
	printf("\n|\t   欢迎来到餐厅管理系统\t\t|");
	printf("\n|\t\t\t\t\t");
	printf("\n|\t      登录账号请按1\t\t|");
	printf("\n|\t      注册账号请按2\t\t|");
	printf("\n|\t      修改密码请按3\t\t|");
	printf("\n|\t      退出系统请按0\t\t|");
	printf("\n|\t\t\t\t\t|");
	printf("\n\t\t\t\t");
	printf("\n\t       请输入选项:");
	scanf("%d",&choose);
	switch(choose)
	{
		case 1:
			login_user(); break;
		case 2:
			add_user(); break;
		case 3:
			reset_password(); break;
		case 0:
			return; 
		default :
			printf("\n输入错误,请重新输入\n\n  "); 
			system("PAUSE");  //暂停等待用户信号 
        	system("cls"); 
		 	user_menu(); 
	}
}


//注册账号
void add_user(void)
{  
    FILE *fp;  
    int i;  
    char str[101];  
    system("cls");  
    printf("\n");
    printf("请输入账号:\n\n ");  
    scanf("%s",&str);
	if(strlen(str)>16)
	{
		printf("账号长度大于16位,请重新输入\n");
		system("PAUSE");  
        system("cls");  
        printf("\n");  
        add_user();
		return;
	}	
    for(i=0;i<user_count;i++)
        if(strcmp(user[i].ID,str)==0)
		{  
            printf("该账号已被注册,请重新注册\n\n   ");  
            system("PAUSE");//按任意键继续  
            add_user();  
        }
    strcpy(user[i].ID,str);  
    printf("请输入密码:\n\n ");
	get_password(str, 18);
	while(strlen(str)>16)
	{
		system("cls");
		printf("\n");
		printf("密码长度大于16位,请重新输入\n\n");
		printf("请输入密码:\n\n ");
	    get_password(str, 18);
		scanf("%s",&str);	
	} 
    strcpy(user[i].password,str);  
    printf("请再次输入密码:\n\n  ");   
	get_password(str, 18);
    if(strcmp(user[i].password,str)!=0)
	{  
        printf("两次密码不一致,请重新申请\n\n");  
        system("PAUSE");  
        system("cls");  
        printf("\n");  
        add_user();
        return;
    }
    save_user();//将账号写入磁盘 
    printf("账号申请成功\n\n");  
    user_count++;
    system("PAUSE");
	user_menu();   
} 
 
 
 //密码隐藏化 
 void get_password(char *pswd, unsigned maxlen) {
    int index = 0;
    char buff = '\0';

    while ((buff = getch()) != '\r') {
        if (buff == '\b' && index != 0) {
            index--;
            printf("\b \b");
        } else if (index < maxlen - 1 && buff != '\b') {
            pswd[index++] = buff;
            putchar('*');
        }
    }
    pswd[index] = '\0';
    printf("\n");
}
 
 
 
//将账号读入内存
void load_user(void)
{  
	FILE *fp;
    fp=fopen("账号.txt","r"); 
    while(fscanf(fp,"%s",&user[user_count].ID)!=EOF)
	{  
        fscanf(fp,"%s",&user[user_count].password); 
        user_count++;
    }
    fclose(fp);
}


//将账号写入磁盘
void save_user(void)
{
    int i;
    FILE *fp;  
    fp=fopen("账号.txt","w+");
	
    for(i=0;i<=user_count;i++)
	{
        fprintf(fp,"%s\n",user[i].ID);  
        fprintf(fp,"%s\n",user[i].password); 
    }  
    fclose(fp);  
} 


//登录账号
void login_user(void)
{
	int i,flag=0;
	char str[20];
	system("cls");  
	printf("\n");
	printf("请输入账号:\n\n ");
	scanf("%s",&str);
	load_user(); 
	for(i=0;i<user_count;i++)
		if(strcmp(user[i].ID,str)==0)
		{
			flag=1;
			break;
		}
	if(flag==0)
	{
		printf("该账号不存在,请重新登录\n\n");
		system("PAUSE");  
        system("cls");  
        printf("\n");
        login_user(); 
        return;
	}
	printf("请输入密码:\n\n ");
	get_password(str, 18);
	while(strcmp(user[i].password,str)!=0)
	{
		system("cls");  
        printf("\n");
		printf("密码错误,请重新输入\n\n");
	get_password(str, 18);	
	}
	system("cls"); 
	printf("登录成功!\n\n");
	createHeadNode();
	welcome();
}


//修改密码
void reset_password(void)
{
	int i,flag=0;
	char str[20];
	system("cls");  
	printf("\n");
	printf("请输入账号:\n\n   ");
	scanf("%s",&str);
	FILE *fp=fopen("账号.txt","r");

	for(i=0;i<user_count;i++)
		if(strcmp(user[i].ID,str)==0)
		{
			flag=1;
			break;
		}
	if(flag==0)
	{
		printf("该账号不存在,请重新登录\n\n");
		system("PAUSE");  
        system("cls");  
        printf("\n");
        reset_password(); 
        return;
	}
	printf("请输入密码:\n\n ");
		get_password(str, 18);
	while(strcmp(user[i].password,str)!=0)
	{
		system("cls");  
        printf("\n");
		printf("密码错误,请重新输入\n\n");
		get_password(str, 18);
	}
	printf("请输入新密码\n\n "); 
		get_password(str, 18);
	while(strlen(str)>16)
	{
		printf("密码长度大于16位,请重新输入\n");
		system("PAUSE");  
        system("cls");  
       	get_password(str, 18);
	} 
    strcpy(user[i].password,str);  
    printf("请再次输入密码:\n\n ");  
    	get_password(str, 8);
    while(strcmp(user[i].password,str)!=0)
	{  
        printf("两次密码不一致,请重新申请\n\n");  
        system("PAUSE");  
        system("cls");  
        printf("\n");  
        	get_password(str, 18);
    } 
    save_user();
	printf("修改成功\n\n"); 
	system("PAUSE");
	user_menu();
} 

这是由上述管理系统进行改善完成的餐厅管理系统的代码:该管理系统不存在以上所述的文件的问题!!!!并且增加了几种查找和排序方式!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/775359.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络安全运维工程师的主要职责

什么是安全运维工程师呢&#xff1f;安全运维工程师就是网络安全大方向下的网络安全运行与维护的一个细分岗。 IT运维工作方向比较多&#xff0c;列如安全运维、数据运维、应用运维、系统运维等&#xff0c;今天我们就来了解一下网络完全运维工程师是什么&#xff1f;同时也了…

【Java】顺序表

文章目录 顺序表LinkedListArrayList构造方法带参&#xff08;int&#xff09;构造不带参构造满&#xff0c;需要扩容 remove()remove(int)remove(Object) subList() 几点注意顺序表的优缺点优点&#xff1a;缺点&#xff1a; 顺序表 底层是数组&#xff0c;进行动态分配后可以…

NAT种类和NAT穿越

NAT种类 说明 NAT有三种类型&#xff1a;静态NAT(tatic NAT)、动态地址NAT(Pooled NAT)和网络地址端口转换(NetworkAddress PortTranslation&#xff0c;NAPT)。 其中静态NAT设置起来最简单&#xff1b; 内部网络中的每个主机都被永久映射成外部网络中的某个合法的地址&#x…

求出0~100000之间的所有“水仙花数”并输出

求出0~100000之间的所有“水仙花数”并输出。 “水仙花数”是指一个N位数&#xff0c;其各位数字的n次方之和正好等于该数本身。 如&#xff1a;1531^3 5^3 3^3 , 则153是一个“水仙花数” 先来了解一下水仙花数的概念&#xff1a; 水仙花数只是自幂数的一种&#xff0c;严…

Flutter侧边栏组件Drawer

主要代码&#xff1a; drawer: const Drawer(child: Column(children: [Row(children: [Expanded(flex: 1,child: UserAccountsDrawerHeader(accountName: Text("张三"),accountEmail: Text("xxxqq.com"),currentAccountPicture: CircleAvatar(backgroundI…

解决git克隆到本地的仓库文件夹不显示红色感叹号、绿色对号等图标的问题

电脑有时候重启或者别的什么原因导致本地仓库不显示绿勾或者红色感叹号的符号 第一步: win加R然后输入regedit打开注册表 第二步: 按下面路径打开 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers 找到如下图在Tort…

浅谈JVM内存结构

一、JVM内存结构的大概划分&#xff1a; 1.1 堆(Heap) 线程共享。所有的对象实例以及数组都要在堆上分配。回收器主要管理的对象。 1.1.1 堆结构 堆可以处于物理上不连续的内存空间中&#xff0c;只要逻辑上是连续的即可。堆的内部结构按照传统的做法分成新生代和老年代&…

喝汽水问题:1瓶汽水1元。2个空瓶可以换1瓶汽水,给20元,可以买多少汽水 (7.19)

泪目&#xff01;&#xff01;&#xff01;终于是自己完完整整写出的代码了&#xff0c;不翻资料也没看参考代码 &#xff08;之前的要么和老师练习&#xff0c;要么找教材东拼西凑&#xff09; 方法2&#xff1a;数学角度看bottle价值0.5 元&#xff0c;20元最多可换40bottl…

Python venv 和 virtualenv 虚拟环境的基本使用

1.前言 venv 和 virtualenv 都是搭建虚拟环境的工具&#xff0c;virtualenv 是第三方开源的&#xff0c;而 venv 作为 virtualenv 的一个子集自 Python3.3 开始集成到标准库中&#xff0c;在 virtualenv 的文档中可以看到他们的区别&#xff1a; 没有 app-data 种子方法&#…

LLM 盛行,如何优雅地训练大模型?

作者 | 王嘉宁 整理 | NewBeeNLP https://wjn1996.blog.csdn.net/article/details/130764843 大家好&#xff0c;这里是 NewBeeNLP。 ChatGPT于2022年12月初发布&#xff0c;震惊轰动了全世界&#xff0c;发布后的这段时间里&#xff0c;一系列国内外的大模型训练开源项目接踵而…

手把手教你搭建SpringCloud项目(十)集成Hystrix之服务降级

什么是微服务&#xff1f;一看就会系列&#xff01; 一、手把手教你搭建SpringCloud项目&#xff08;一&#xff09;图文详解&#xff0c;傻瓜式操作 二、手把手教你搭建SpringCloud项目&#xff08;二&#xff09;生产者与消费者 三、手把手教你搭建SpringCloud项目&#x…

公司老项目改造适配不同分辨率2k、3k、4k

项目改造适配不同分辨率 最近公司要做项目适配2k、3k、4k屏的分辨率&#xff0c;在网上找了很多中方案&#xff0c;常用且方便的是使用zoom全局缩放&#xff0c;因为是老项目所以对样式进行了重写整体使用了flex百分比布局 使用 1、在utils文件夹中新建一个zoom.js文件 这个是…

ACL 2023 | 持续进化中的语言基础模型

尽管如今的 AI 模型已经具备了理解自然语言的能力&#xff0c;但科研人员并没有停止对模型的不断改善和理论探索。自然语言处理&#xff08;NLP&#xff09;领域的技术始终在快速变化和发展当中&#xff0c;酝酿着新的潮流和突破。 NLP 领域的顶级学术会议国际计算语言学年会 …

java中的三大集合类各自的特点以及适用场景

目录 ​编辑 三大容器的介绍 使用场景介绍 List 实现类 Map 实现类 Set 实现类&#xff1a; 三大容器的介绍 List&#xff08;列表&#xff09; 结构&#xff1a;由有序的元素序列组成&#xff0c;可以包含重复元素特点&#xff1a;可以通过索引访问元素&#xff0c;插入的顺…

SQL注入实操(更新中)

文章目录 一、sqli-lab靶场搭建二、通关笔记1.Less-1a.单引号‘b.updatexmlc.concatd.unione.information_schemaf.GROUP_CONCATg.select 1,2 2.Less-23.Less-3a.怎么找到注入点b.判断SQL注入漏洞的类型c.闭合语句d.如何判断显示位e.答案 4.Less-45.Less-5a.判断注入漏洞的依据…

PhpStudy2016-2018-RCE 漏洞复现

漏洞描述 PHPStudyRCE&#xff08;Remote Code Execution&#xff09;&#xff0c;也称为phpstudy_backdoor漏洞&#xff0c;是指PHPStudy软件中存在的一个远程代码执行漏洞。 漏洞影响范围 Phpstudy软件是国内的一款免费的PHP调试环境的程序集成包&#xff0c;通过集成Apac…

WEB:shrine

背景知识 了解Flask SSIT模板注入 题目 进行代码审计 import flask import osapp flask.Flask(__name__) /*创建了flask包下的Flask类的对象&#xff0c;name是一个适用于多数情况的快捷方式。有了这个参数&#xff0c;Flask才知道在哪里可以找到模板和静态文件*/app.confi…

HYPE分布式水文模型教程

详情点击链接&#xff1a;HYPE分布式水文模型建模方法与案例分析 前言 HYPE(Hydrological Predictions for the Environment, HYPE)是由瑞典皇家水文气象局&#xff08;SMHI&#xff09;在HBV和HBV-NP模型基础上开发的新一代分布式水文模型&#xff0c;已经在全球众多地区得…

同样是办公管理系统,钉钉和OA哪个更出色?

企业在选择办公协同系统的时候&#xff0c;通常搜索到“钉钉”和“OA系统”&#xff0c;两者都属于办公管理类型&#xff0c;但哪个更适合企业使用&#xff1f;两者又有哪些区别呢&#xff1f;小编整理了一下两者的对比和侧重的点&#xff0c;今天我们就来聊聊两者的区别吧~ 天…

【Linux】inode软硬连接

文章目录 &#x1f4d6; 前言1. 文件系统1.1 磁盘的物理结构&#xff1a;1.2 CSH和LBA&#xff1a;1.3 IO的基本单位&#xff1a;1.4 文件系统结构&#xff1a;1.5 认识inode&#xff1a; 2. 软硬连接2.1 目录和文件的硬连接数&#xff1a;2.2 软连接&#xff1a;2.3 硬连接&am…