首页 > 其他分享 >第一周实验

第一周实验

时间:2024-03-06 17:00:11浏览次数:27  
标签:head struct LIB 第一周 next pa 实验 printf

<1>来源:简易的C语言图书管理系统

<2>运行环境:

点击查看代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct LIB{
	char bId[10];//书号 
	char bName[20];//书名 
	char aName[20];//作者 
	char pName[20];//出版社 
	char sort[20];//分类 
	float bPrice;//价格
	int bNum;//书籍数量
	struct LIB *next;
};
 
struct LIB * fileBuild(void);//文件创建
void writeInFile(struct LIB *head);//文件写入
void addBookInfo(struct LIB *head);//增
void delBookInfo(struct LIB *head);//删
void changeBookInfo(struct LIB *head);//改
void findBookInfo(struct LIB *head);//查 
void showBooks(struct LIB *head);//显示所有书籍 
void bookMenu(void);//显示菜单 
 
int count;
int main()
{
	int action;
	struct LIB *const head =fileBuild(); 	
	bookMenu();
	while(1)
	{
		printf("请输入要进行的操作序号:");
		scanf("%d",&action);
		switch(action)
		{
			case 1:system("CLS");bookMenu();addBookInfo(head);break;
			case 2:system("CLS");bookMenu();delBookInfo(head);break;
			case 3:system("CLS");bookMenu();changeBookInfo(head);break;
			case 4:system("CLS");bookMenu();findBookInfo(head);break;
			case 5:system("CLS");bookMenu();showBooks(head);break;
			case 6:writeInFile(head);printf("已退出...\n");exit(0);break;
			default:printf("没有这个序号!");break;
		}
	}	
	return 0;
}
 
struct LIB * fileBuild(void)
{
	FILE *file,*f2;	
	int i;
	struct LIB * const head = (struct LIB *)malloc(sizeof(struct LIB));
	struct LIB *pb,*pa;
	pa = pb = head;
	pb->next = NULL;
	if(!(fopen("LibBook.txt","r")))
	{
		printf("文件创建中...");
		file = fopen("LibBook.txt","w");
		f2 = fopen("Numcount.txt","w");
		fprintf(f2,"%d\n",count);
		fclose(f2);
		fclose(file);
	}
	else
	{ 
		file = fopen("LibBook.txt","r");
		f2 = fopen("Numcount.txt","r");
		fscanf(f2,"%d",&count);
		for(i=0;i<count;i++)
		{
			pa = (struct LIB *)malloc(sizeof(struct LIB));
			fscanf(file,"%s%s%s%s%s%f%d",pa->bId,pa->bName,pa->aName,
                            pa->pName,pa->sort,&pa->bPrice,&pa->bNum);
			pb->next = pa;
			pb = pa;
			pb->next = NULL;
		}
		fclose(f2);
		fclose(file);	
	}
	return head;
}
 
void writeInFile(struct LIB *head) 
{
	struct LIB *pa = head;	
	FILE *file,*f2;
	file = fopen("LibBook.txt","w");
	f2 = fopen("Numcount.txt","w");
	fscanf(file,"%d",&count);
	count = 0;	
	while(pa->next!=NULL)
	{
		count++;
		pa=pa->next; 
		fprintf(file,"%s %s %s %s %s %0.2f %d\n",pa->bId,pa->bName,pa->aName,
									pa->pName,pa->sort,pa->bPrice,pa->bNum);
	}
	fprintf(f2,"%d\n",count);
	fclose(f2);
	fclose(file);
	printf("写入成功!"); 
}
 
void addBookInfo(struct LIB *head) 
{	
	struct LIB *pa,*pb,*pc;	
	pa = pb =head;
	pc=(struct LIB *)malloc(sizeof(struct LIB)); 
	printf("请输入要增加的信息(书号、书名、作者、出版社、分类、价格、数量):");
	scanf("%s%s%s%s%s%f%d",pc->bId,pc->bName,pc->aName,pc->pName,pc->sort,
													&pc->bPrice,&pc->bNum);
	while(pa->next!=NULL) 
	{
		pa = pa->next;
		if(atoi(pa->bId)>atoi(pc->bId))
		{
			pc->next = pa;
			pb->next = pc;
			printf("添加成功!\n");			
			return;
		} 
		pb = pa;	
	} 
	if(pa->next==NULL)
	{
		pa->next = pc;
		pc->next = NULL;
	}
}
 
void delBookInfo(struct LIB *head)
{
	struct LIB *pa,*pb;
	pa = pb =head;
	char name[10];
	printf("请输入要删除信息的书名:");
	scanf("%s",name);
	while(pa->next!=NULL)
	{
		pa = pa->next; 
		if(strcmp(pa->bName,name)==0)
		{
			pb->next = pa->next;
			free(pa);	
			printf("删除成功!");
			break;
		}
		pb = pa;	
	} 	
} 
 
void changeBookInfo(struct LIB *head)
{
	struct LIB *pa = head,*pb;
	pb = (struct LIB *)malloc(sizeof(struct LIB)); 
	char name[10],action[10];
	int c,borrow,addnum;
	printf("请输入要修改信息的书名:");
	scanf("%s",name);
	while(pa->next!=NULL)
	{
		pa = pa->next; 
		if(strcmp(pa->bName,name)==0)
		{
			printf("找到书籍:%s %s %s %s %s %0.2f %d\n",pa->bId,pa->bName,
						pa->aName,pa->pName,pa->sort,pa->bPrice,pa->bNum);
			printf("请问想要借书还是还书?");
			scanf("%s",action);
			if(strcmp(action,"借书")==0)
			{
				printf("请输入借书的数量:");
				scanf("%d",&borrow) ;
				pa->bNum = pa->bNum-borrow;
				printf("借书成功!\n");
			} 
			else if(strcmp(action,"还书")==0)
			{
				printf("请输入还书的数量:");
				scanf("%d",&addnum) ;
				pa->bNum = pa->bNum+addnum;
				printf("还书成功!\n");
			}
			else
			{
				printf("没有这个选项!\n");
			}						
			return;
		}	
	} 
}
 
void findBookInfo(struct LIB *head)
{
	struct LIB *pa = head;
	char name[20];
	printf("请输入要查询的书名:");
	scanf("%s",name);
	while(pa->next!=NULL)
	{
		pa = pa->next; 
		if(strcmp(pa->bName,name)==0)
		{
			printf("找到书籍:%s %s %s %s %s %0.2f %d\n",pa->bId,pa->bName,
                            pa->aName,pa->pName,pa->sort,pa->bPrice,pa->bNum);
			return;
		}
	}	
	if(pa->next==NULL)
	{
		printf("未找到!\n");
	}
}
 
void bookMenu(void)
{
	printf(" =========图书管理系统==========\n");	
	printf("|	 1、添加书籍数据	|\n");	
	printf("|	 2、删除书籍数据	|\n");	
	printf("|	 3、借书以及还书	|\n");
	printf("|	 4、查找指定书籍	|\n");
	printf("|	 5、显示全部书籍	|\n");
	printf("|	 6、退出管理系统	|\n");
	printf(" ===============================\n");	
}
 
void showBooks(struct LIB *head)
{
	struct LIB *pa = head;
	printf("书号\t\t书名\t\t作者\t\t出版社\t\t分类\t\t价格\t\t数量\t\t\n");
	while(pa->next!=NULL)
	{
		pa = pa->next;
		printf("%-16s%-16s%-16s%-16s%-16s%-17.2f%-18d\n",pa->bId,pa->bName,
                            pa->aName,pa->pName,pa->sort,pa->bPrice,pa->bNum);
	}
} 

<3>运行结果








<4>问题列表

  1. 系统表达存在不通顺的问题。借书和还书功能的“请输入想要修改的书名”表达不妥。找到指定书籍后,根据情景应只显示该图书现存数目。图书库没有图书,却仍有属性行,十分违和。查找书籍后,反馈不规范,没头没尾,应考虑更通俗更人性化的表达方式。
  2. 演示中发现,当想要借的书库存为零的时候,仍可以进行借书行为(借书数目应小于等于图书书目)。而且并未考虑借还书籍在原书库内不存在的情况。功能存在漏洞。
  3. 查找功能单一,仅能通过书名查找,应再加考虑通过作者查找(增设作者专栏)、书号查找和类别查找(否则类别属性有些赘余)。
  4. 由可以查询到每本书的书号,且书号是唯一的,故在借还书和修改书籍信息是采用图书号,防止出现重书名、重作者等情况。
  5. 添加书籍数据时,只能创建一条新的数据。若数据已存在,不能选择修改部分信息。
  6. 书号应该由系统自动确认,不可修改,方便查找等活动。

<5>改进代码

  1. 修改图书数据功能
点击查看代码
void modifyBookInfo(struct LIB *head)
{
	struct LIB *pa = head;
	int id;
	printf("请输入要修改的书号:");
	scanf("%d",&id);
	int flag=0;
	while(pa->next!=NULL)
	{
		pa = pa->next; 
		if(pa->bId == id)
		{
			flag==1;
			printf("书号:%d 书名:%s 作者:%s 出版社:%s 分类:%s 价格:%0.2f 数量:%d\n",pa->bId,pa->bName,
                            pa->aName,pa->pName,pa->sort,pa->bPrice,pa->bNum);
            printf("请输入要修改的信息(书名、作者、出版社、分类、价格、数量):\n");
			scanf("%s%s%s%s%f%d",pa->bName,pa->aName,pa->pName,pa->sort,&pa->bPrice,&pa->bNum);
			printf("修改成功!");
            return;
		}
	}	
	if(flag==0)
	{
		printf("该图书不存在!\n");
	}
}
  1. 借书以及还书功能
点击查看代码
void changeBookInfo(struct LIB *head)
{
	struct LIB *pa = head; 
	char name[10],action[10];
	int c,borrow,addnum,id;
	printf("请输入要寻找的图书号:");
	scanf("%d",&id);
	int flag=1;
	while(pa->next!=NULL)
	{
		pa = pa->next; 
		if(pa->bId==id)
		{
			printf("找到书籍:%s,现存有%d本\n",pa->bName,pa->bNum);
			printf("请问想要借书还是还书?");
			scanf("%s",action);
			if(strcmp(action,"借书")==0)
			{
				printf("请输入借书的数量:");
				scanf("%d",&borrow) ;
				if(pa->bNum >= borrow){
					pa->bNum = pa->bNum-borrow;
					printf("借书成功!\n");
				}
				else{
					printf("抱歉,图书存量不足,借书失败!\n");
				}
			} 
			else if(strcmp(action,"还书")==0)
			{
				printf("请输入还书的数量:");
				scanf("%d",&addnum) ;
				pa->bNum = pa->bNum+addnum;
				printf("还书成功!\n");
			}
			else
			{
				printf("没有这个选项!\n");
			}						
			flag=0;break;
		}	
	} 
	if(flag==1) printf("抱歉,该图书不存在\n");
	return;
}
  1. 图书查找功能
点击查看代码
void findMenu(void){
	printf(" =========图书查找方式==========\n");	
	printf("|	 1、按书名查找    	|\n");	
	printf("|	 2、按作者查找    	|\n");	
	printf("|	 3、按书号查找    	|\n");
	printf("|	 4、按类别查找    	|\n");
	printf(" ===============================\n");	
}

void findBookInfo(struct LIB *head)
{
	findMenu(); 
	struct LIB *pa=head;
	int action;
	printf("请输入要进行的查找方式序号:");
	scanf("%d",&action);
	switch(action)
	{
		case 1:system("CLS");bookMenu();findBookInfo_bName(pa);break;
		case 2:system("CLS");bookMenu();findBookInfo_aName(pa);break;
		case 3:system("CLS");bookMenu();findBookInfo_bId(pa);break;
		case 4:system("CLS");bookMenu();findBookInfo_sort(pa);break;
		default:printf("查找方式不存在!");break;
	}
	return;
}
 
void findBookInfo_bName(struct LIB *pa)
{
	int flag;
	char name[20];
	printf("请输入要查询的书名:");
	scanf("%s",name);
	while(pa->next!=NULL)
	{
		pa = pa->next; 
		if(strcmp(pa->bName,name)==0)
		{
			if(flag==0){
				printf("找到书籍:\n");
				flag=1;
			}
			printf("书号:%-6d 书名:%-15s 作者:%-7s 出版社:%-7s 分类:%-8s 价格:%-5.2f 数量:%-5d\n",pa->bId,pa->bName,
                            pa->aName,pa->pName,pa->sort,pa->bPrice,pa->bNum);
		}
	}	
	if(flag==0)
	{
		printf("未找到!\n");
	}
	return;
}

void findBookInfo_aName(struct LIB *pa)
{
	char name[20];
	printf("请输入要查询的作者:");
	scanf("%s",name);
	int flag=0;
	while(pa->next!=NULL)
	{
		pa = pa->next; 
		if(strcmp(pa->aName,name)==0)
		{
			if(flag==0){
				printf("找到书籍:\n");
				flag=1;
			}
			printf("书号:%-6d 书名:%-15s 作者:%-7s 出版社:%-7s 分类:%-8s 价格:%-5.2f 数量:%-5d\n",pa->bId,pa->bName,
                            pa->aName,pa->pName,pa->sort,pa->bPrice,pa->bNum);
		}
	}	
	if(flag==0)
	{
		printf("未找到!\n");
	}
	return;
}

void findBookInfo_bId(struct LIB *pa)
{
	int id;
	printf("请输入要查询的书号:");
	scanf("%d",&id);
	while(pa->next!=NULL)
	{
		pa = pa->next; 
		if(pa->bId == id)
		{
			printf("书号:%-6d 书名:%-15s 作者:%-7s 出版社:%-7s 分类:%-8s 价格:%-5.2f 数量:%-5d\n",pa->bId,pa->bName,
                            pa->aName,pa->pName,pa->sort,pa->bPrice,pa->bNum);
            return ;
		}
	}	
	printf("未找到!\n");
	
}

void findBookInfo_sort(struct LIB *pa)
{
	char sort[20];
	printf("请输入要查询的类别:");
	scanf("%s",sort);
	int flag=0;
	while(pa->next!=NULL)
	{
		pa = pa->next; 
		if(strcmp(pa->sort,sort)==0)
		{
			if(flag==0){
				printf("找到书籍:\n");
				flag=1;
			}
			printf("书号:%-6d 书名:%-15s 作者:%-7s 出版社:%-7s 分类:%-8s 价格:%-5.2f 数量:%-5d\n",pa->bId,pa->bName,
                            pa->aName,pa->pName,pa->sort,pa->bPrice,pa->bNum);
		}
	}	
	if(flag==0)
	{
		printf("未找到!\n");
	}
	return;
}
  1. 许多在表达细节与的修改在此不予赘述

<6>改进后运行测试










<7>总结:软件的设计功能规划是需要从用户体验出发的,一切设计都是为了客户的便利而设计。将大致的功能规划落实到实际代码设计的时候,要注意一些细节上的处理,如借书数目应小于实际库存数,按书名或者作者名查找时是否存在同名的情况等等。除此之外,还要注意给用户提供一个看起来简单整齐、表达准确的可视化页面,力求确保程序使用的高效率。

标签:head,struct,LIB,第一周,next,pa,实验,printf
From: https://www.cnblogs.com/lijin-001/p/18047293

相关文章

  • 第一次实验
    l来源同学的大作业内容2运行环境与运行结果VS20233改善点没有修改联系人的选项无法清空联系人,只能一个一个删除无法对联系人排序4新代码voidallClean(Addressbooks*abs){cout<<"您确定是要执行本操作吗?"<<endl;cout<<"1---是"<<endl;cout<<"2---......
  • 第一次实验
    1.来源https://blog.csdn.net/m0_51269961/article/details/1181003422.运行环境VisualStudio2022C++运行截图代码3.主要问题管理系统没有设置使用人员的区别改进:设置了学生与管理员分别的登录密码,并对学生进入的界面进行改变4.改进的代码5.软件测试截图......
  • 第一周实验
    这个项目来自于网络下载。运行环境是devc++,之前的代码是:#includeusingnamespacestd;intmain(){charop;floatnum1,num2;cout<<"Enteroperator(+,-,*,/):";cin>>op;cout<<"Entertwonumbers:";cin>>num1>>nu......
  • 制取氧气实验
    实验目的:制取氧气。实验原理:双氧水会在二氧化锰的催化下快速反应成氧气。准备工作:准备好自制纸槽、胶头滴管、\(3\%\)浓度双氧水、二氧化锰、火柴。实验步骤:1.利用自制纸槽在试管中加入\(0.5\)g二氧化锰。2.利用胶头滴管加入\(1\sim2\)mL双氧水。3.观察到试管中有大......
  • ssh 端口转发实验
    为什么会使用端口转发端口转发的优点:安全性:通过隐藏实际服务(在这种情况下是监听在22端口的SSH服务)的真实端口号,增加了一层安全性。攻击者可能不知道真正的服务端口号,因此更难进行有针对性的攻击。灵活性:允许用户在不更改实际服务配置的情况下,通过不同的端口访问服务。例如,如果......
  • 软件开发与创新第一周实验——关于“打怪小游戏”的试玩体验与修改
    一.“打怪小游戏”代码来源http://blog.csdn.net/zjx120307/article/details/126221342?spm=1001.2014.3001.5506二.运行环境及运行结果1.运行环境:Windows11操作系统,C++运行环境2.运行截图:(1)功能6演示(2)功能1演示(3)功能2演示(4)功能3演示(5)功能4演示原代码:点击查看代......
  • 全网通实验
    实验一:两个网段连通配置目标:通过在路由器上配置静态路由,实现PC1能ping通PC2(即10.1.0.0/24和10.5.0.0/24网段能通)实验分析:要想实现10.1.0.0/24和10.5.0.0/24网段能通,就是中间涉及到的三层设备R1R2R3R4都有到这两个网段(10.1.0.0/24、10.5.0.0/24)的正确路由。配置步骤:连线配置PC的......
  • DHCP实验
    实验:PC通过DHCP动态获得IP地址配置目标:R1做DHCPserver,PC做DHCPclient,PC的IP地址、子网掩码、默认网关、dns服务器地址都通过DHCP动态分配。配置步骤:连线,配置R1的IP地址配置DHCP服务器R1:dhcpserverip-pool1//创建地址池gateway-list192.168.1.254//网关network192.168.1......
  • 第一周周测
    1、尝试绕过xiusafe.com的cdn,要求尝试所有可能的手段并截图2、针对testfire.net端口进行扫描,子域名爆破,弱口令尝试3、搭建pikachu靶场改一下数据库连接密码访问install.php忘截图了4、尝试通关pikachu、SQL注入的任意一关,要求分别使用手工和sqlmap1'union......
  • java程序设计 - 第二次实验
    【实验目的】继续熟悉Eclipse的使用并尝试编写一个简单的Applet程序【实验过程】编写一个JavaApplet程序,并正在JavaApplet中写两行文字:“这是一个JavaApplet程序”和“我改变了字体”。importjava.applet.*;importjava.awt.*;publicclassJavaAppletextendsApplet......