嗨喽大家好,成仙花了一天完成了用模块化设计方法搭建图书入库管理信息系统,这是我们大二第一学期的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")前面,以此先正常输入之前的内容再按任意按键清屏。
好了,以上就是关于搭建图书入库管理系统的代码讲解,如果有几处不懂的地方,评论区见!