用模块化设计方法搭建图书入库管理信息系统

        嗨喽大家好,成仙花了一天完成了用模块化设计方法搭建图书入库管理信息系统,这是我们大二第一学期的C++阶段性测验。前段时间在家摸鱼耽搁了不少重要的课程,直到10月25日回到天津才开始了我的补习之旅。这段时间我一直在翻阅C++资料,上机演练运行代码,还好没把大一学的C语言知识给忘了,因此补习C++就要轻松多了。之前就听说C语言是面向过程的,而C++是面向对象的(面向过程设计也可以的)。目前我们还没学到类与对象这个章节。这里我就不赘述了。

        好回到正题,本次阶段性测验考察的是包括结构体之前的所有知识。无论是选择结构设计,循环结构设计,自定义函数的调用和实参形参传递,又或是指针取地址,定义结构体数组变量也好。在我看来学编程语言主要目的是,如何用代码来表示问题的对象和解决实际问题的步骤。

废话不多说了,请看下图:

           这是要输入的图书信息,书号、书名、价格等。 

这是设计要求 

        以上是实现书库管理的模块化设计的运行结果,我们可以看到,菜单项有4个功能,第一个是创建书库功能、第二个查找价格最高的功能、第三个图书逆序存放的功能、第四个退出程序运行的功能。此时,我们知道要操作的对象是图书的信息,图书的信息又包括书号、书名和价格三项。而且要操作的对象不止只有一本图书。因此我们可以先定义结构体数组变量,如下图:

#define N 50						//用于定义结构体数组,表示至多录入50本的图书信息
struct 
{
	long long Book_number;			//定义Book_number为长整型变量,用于录入书号
	char Book_name[50];				//定义Book_name为字符数组变量,用于录入书名
	double Book_price;				//定义Book_number为双精度浮点数变量,用于录入价格
}book[N];							//用于定义结构体数组,表示至多录入50本的图书信息

        解决了图书对象问题后,我们还要打印书库管理的菜单(太过于简单了),因此先不展示输出书库管理菜单的代码了。然后我们要考虑的是如何在书库管理系统里面输入图书的信息。这很简单,那就是引用结构体变量的成员输入。这里要用for语句来遍历输入到book[N]结构体数组里成员变量。

void create_book()				//创建书库
{
	cout<<"请输入书号、书名、价格:"<<endl;
	for(int i=0;i<N;i++)
	{
		char *s2="0",*s1="0";
		cin>>book[i].Book_number>>book[i].Book_name>>book[i].Book_price;
		s1=book[i].Book_name;
		if(book[i].Book_number==0&&strcmp(s1,s2)==0&&book[i].Book_price==0)
		break;																			//如果满足三个变量均等于0的条件,就执行break终止循环,退出录入  
		total_numbook++;																//统计录入图书信息次数,在break后面是为了排除输入三个0的输入次数(1次)
	}
	cout<<endl<<"一共输入了"<<total_numbook<<"本书"<<endl<<endl;      
	output(total_numbook);																//调用output函数,实现显示图库信息的功能
}

         看到这里相信大家会注意到*s1和*s2字符指针变量都被赋值到字符"0",这样做是为了方便s1指向book[i].Book_name的值。然后带入strcmp作为函数参数和s2字符串比较,如果输入的book[i].Book_name字符串为"0",和s2一样的话就返回0,用于if判断,当输入的三个图书信息均为0时候,就会退出for循环终止录入图书信息。至于打印输出图书信息这个output函数我就不展示了,同样简单。

double price_max()//查找价格最高的图书
{
	double max1=0,*max2;						//定义max1为双精度浮点数,用于存放更高价格的图书book[i].Book_price的值。定义max2为指针变量,用于最后指向已经遍历替换后的max1(价格最高)
	for(int i=1;i<=total_numbook;i++)
	{
		if(book[i].Book_price>max1)
		max1=book[i].Book_price;				//如果查找的图书价格大于max1,就赋值给max1,遍历查找下去直到最后一本书比较完为止
		max2=&max1;								//用于最后指向已经遍历替换后的max1(价格最高),然后作为函数实参传递给show_max的形参max1_price
	}
	show_max(max2);
}

void show_max(double *max1_price)//显示价格最高的所有图书信息(价格一样的且最高)
{
	cout<<"价格最高的图书信息:"<<endl;
	for(int i=1;i<=total_numbook;i++)				//循环控制直到最后一本书就退出
	{
		if(*max1_price<=book[i].Book_price)
		cout<<book[i].Book_number<<" "<<book[i].Book_name<<" "<<book[i].Book_price<<endl;
	}
	cout<<endl;
}

         price_max()函数主要功能是,遍历比较book[i].Book_price结构体数组成员变量和max1,若book[i].Book_price大于max1就赋值给max1,然后把已经赋值好的ma1x和下一个结构体数组成员变量再比较,直到最后一本图书为止。然后定义双精度浮点数max2指针指向已经赋值好的最大值max1。然后作为show_max的函数实参传递到max1_price形参,然后再一次遍历寻找与已经传递好的形参比较,如果有相等的价格就输出。(因为最大值已经找到了,这里的函数功能主要是查找价格一样高的图书,然后遍历打印输出图书信息)

void reverse()//图书逆序存放
{
	int a;		
	a=total_numbook;
	cout<<"逆序前的图书信息:"<<endl;
	output(total_numbook);
	cout<<endl;
	cout<<"逆序后的图书信息:"<<endl;
	cout<<setw(20)<<"书号"<<setw(20)<<"书名"<<setw(16)<<"价格"<<endl;
	for(int i=a-1;i>=0;i--)
	{
		cout<<setiosflags(ios::fixed)<<setiosflags(ios::left)<<setprecision(2);				
		/*setiosflags(ios::fixed)要求以固定位默认输出
		  setiosflags(ios::left)输出数据左对齐
		  <<setprecision(2)设置浮点数的精度为2位
		  setw(n)设置字段宽度占n位*/
		cout<<setw(20)<<book[i].Book_number<<setw(20)<<book[i].Book_name<<setw(14)<<book[i].Book_price<<endl;	
	}
	cout<<endl;
}

        reverse()实现图书逆序的功能,我觉得这段也没必要详细讲,无非就是从录入的最后一本书信息作为第一行打印输出的信息,循环控制i=a-1,每次执行cout语句后i就自减,直到0为止。就能实现逆序输出图书信息的功能了。

int main()
{
	int a;						//定义变量a为整型,存放menu函数返回的Serial_num的值
	int flag=0;					//定义变量flag为整型0,用作于统计输入a等于1的次数 
	while(1)
	{		
		a=menu();				//存放menu函数返回的Serial_num的值,用作于switch表达式表示选择相应的序号。
		if(a==1)
		flag++;
		if(flag==0)				
		cout<<"书库尚未建立,请选择1,完成创建书库!"<<endl;
		else
		{
			switch(a)
			{
				case 1:		create_book();			break; 										//创建书库并且打印图书信息
				case 2:		price_max();			break;										//查找价格最高的图书,且显示价格最高的所有图书信息(价格一样的且最高)
				case 3:		reverse();				break;										//图书逆序存放
				case 4:		cout<<"程序运行结束!"<<endl;					return 0;		 //当输入的菜单项为4时候,就执行该行代码以此结束程序的运行
			}
		}
		system("pause");system("cls");								//system("pause")作用是暂停,不让控制台程序一闪而过,而是先正常输出再按任意按钮继续执行下一步的清屏功能system("cls")
	} 
}

这里main函数主要以循环while和switch两结构为主,其中switch分支语句是嵌套在while循环语句里面的,这里主要是想实现菜单选项的功能以及清屏内容的功能。相信大家注意到flag变量了,这里我拿来统计输入的a=1的次数,只要用户一次都没输入过a为1,就会一直输出“书库尚未建立,请选择1,完成创建书库!”这里强调的是a必须输入1次,才能执行switch分支语句。然后system("pause")的作用是暂停,不让控制台程序一闪而过,放在system("cls")前面,以此先正常输入之前的内容再按任意按键清屏。

        好了,以上就是关于搭建图书入库管理系统的代码讲解,如果有几处不懂的地方,评论区见!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是小橙子也是成仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值