请设计一个简单的图书目录管理系统(初级版)。
图书目录信息包括:
统一书号(不超过13字符)
书名(不超过30字符)
作者(不超过20字符)
出版社(不超过30字符)
出版日期(包括:年、月、日)
价格(精确到分)
注意:为了保证运行窗口能正确地显示,请右击运行窗口,修改“属性”:
在“选项”选项卡中,选中“使用旧版本控制台”
在“字体”选项卡中,选择“8×16”“点阵字体”
在“布局”选项卡中,将屏幕窗口宽度均设为“120”。
具体需求如下:
显示如下的主菜单:
Append Find Remove Modify Show Quit > _
如果用户输入 A 或 a、F 或 f、R 或 r、M 或 m、S 或 s,则可完成相应的操作。如果用户输入其它字符,则显示错误信息。
程序将反复显示主菜单,让用户持续工作。如果用户输入 Q 或 q,则程序结束。
Append Find Remove Modify Show Quit > Q
Thank you! Goodbye!
若用户输入其它字符,则显示错误信息。
Append Find Remove Modify Show Quit > B
Incorrect choice!
Append Find Remove Modify Show Quit > 9
Incorrect choice!
Append Find Remove Modify Show Quit > +
Incorrect choice!
若用户输入 A 或 a,则可以输入新书的信息,将其添加到图书目录中。
Append Find Remove Modify Show Quit > aISBN: 9780439227148Title: The Call of the WildAuthor: Jack London
Publisher: Scholastic PressPub date: 2001/1/1Price: 39.4
Append Find Remove Modify Show Quit > AISBN: 9781772262902Title: Oliver TwistAuthor: Charles Dickens
Publisher: Engage BooksPub date: 2016/9/15Price: 648
Append Find Remove Modify Show Quit > aISBN: 9787515911076Title: The Call of the WildAuthor: Jack London
Publisher: Aerospace Publishing HousePub date: 2016/5/1Price: 29.8
若用户输入的日期信息不正确,则显示错误信息,并要求用户重新输入。
Append Find Remove Modify Show Quit > AISBN: 9787501592401Title: The Old Man and the SeaAuthor: Ernest Hemingway
Publisher: Knowledge PressPub date: 2016/2/30
Incorrect date! Please reenter: 2016/6/31
Incorrect date! Please reenter: 2016/8/1Price: 25.8
若用户输入 S 或 s,则按书号升序排序,然后列表显示全部图书。
Append Find Remove Modify Show Quit > S
ISBN--------- Title------------------------- Author-------------- Publisher--------------------- Pub-date-- Price---
9780439227148 The Call of the Wild Jack London Scholastic Press 2001/01/01 39.40
9781772262902 Oliver Twist Charles Dickens Engage Books 2016/09/15 648.00
9787501592401 The Old Man and the Sea Ernest Hemingway Knowledge Press 2016/08/01 25.80
9787515911076 The Call of the Wild Jack London Aerospace Publishing House 2016/05/01 29.80
若用户输入 F 或 f,则输入书名,然后显示该书名的图书。如果没有对应的图书,则显示错误信息。
Append Find Remove Modify Show Quit > F
Title: The Call of the Wild
ISBN--------- Title------------------------- Author-------------- Publisher--------------------- Pub-date-- Price---
9780439227148 The Call of the Wild Jack London Scholastic Press 2001/01/01 39.40
9787515911076 The Call of the Wild Jack London Aerospace Publishing House 2016/05/01 29.80
Append Find Remove Modify Show Quit > f
Title: Gulliver's Travels
Not found!
说明:输出查找结果时,不作排序操作。
若用户输入 R 或 r,则输入书号,然后将删除该书号的图书。如果没有对应的图书,则显示错误信息。
Append Find Remove Modify Show Quit > r
ISBN: 9781772262902
Remove(y/n)? n
Append Find Remove Modify Show Quit > S
ISBN--------- Title------------------------- Author-------------- Publisher--------------------- Pub-date-- Price---
9780439227148 The Call of the Wild Jack London Scholastic Press 2001/01/01 39.40
9781772262902 Oliver Twist Charles Dickens Engage Books 2016/09/15 648.00
9787501592401 The Old Man and the Sea Ernest Hemingway Knowledge Press 2016/08/01 25.80
9787515911076 The Call of the Wild Jack London Aerospace Publishing House 2016/05/01 29.80
Append Find Remove Modify Show Quit > R
ISBN: 9780439227148
Remove(y/n)? Y
Append Find Remove Modify Show Quit > s
ISBN--------- Title------------------------- Author-------------- Publisher--------------------- Pub-date-- Price---
9781772262902 Oliver Twist Charles Dickens Engage Books 2016/09/15 648.00
9787501592401 The Old Man and the Sea Ernest Hemingway Knowledge Press 2016/08/01 25.80
9787515911076 The Call of the Wild Jack London Aerospace Publishing House 2016/05/01 29.80
Append Find Remove Modify Show Quit > r
ISBN: 9787515914145
Not found!
Append Find Remove Modify Show Quit > s
ISBN--------- Title------------------------- Author-------------- Publisher--------------------- Pub-date-- Price---
9781772262902 Oliver Twist Charles Dickens Engage Books 2016/09/15 648.00
9787501592401 The Old Man and the Sea Ernest Hemingway Knowledge Press 2016/08/01 25.80
9787515911076 The Call of the Wild Jack London Aerospace Publishing House 2016/05/01 29.80
要求:用户回答是否删除时,必须回答 Y 或 N (大小写均可)。如果是其它字符,则显示错误信息,要求用户重新回答。
Append Find Remove Modify Show Quit > R
ISBN: 9781772262902
Remove(y/n)? k
Incorrect answer!
Remove(y/n)? $
Incorrect answer!
Remove(y/n)? N
若用户输入 M 或 m,则可以修改图书信息。首先按书号查找,然后重新输入该图书的信息。
Append Find Remove Modify Show Quit > m
ISBN: 9787515911076
Modify(y/n)? yISBN: 9787544724968Title: The House on Mango StreetAuthor: Sandra Heathneros
Publisher: Yilin PressPub date: 2012/1/1Price: 30
Append Find Remove Modify Show Quit > M
ISBN: 9787501592401
Modify(y/n)? n
Append Find Remove Modify Show Quit > m
ISBN: 9787515914145
Not found!
Append Find Remove Modify Show Quit > S
ISBN--------- Title------------------------- Author-------------- Publisher--------------------- Pub-date-- Price---
9781772262902 Oliver Twist Charles Dickens Engage Books 2016/09/15 648.00
9787501592401 The Old Man and the Sea Ernest Hemingway Knowledge Press 2016/08/01 25.80
9787544724968 The House on Mango Street Sandra Heathneros Yilin Press 2012/01/01 30.00
要求:用户回答是否修改时,必须回答 Y 或 N (大小写均可)。如果是其它字符,则显示错误信息,要求用户重新回答。
Append Find Remove Modify Show Quit > M
ISBN: 9787544724968
Modify(y/n)? K
Incorrect answer!
Modify(y/n)? *
Incorrect answer!
Modify(y/n)? n
相关习题:图书目录管理系统(高级版)。
Append Find Remove Modify Show Quit > Thank you! Goodbye!
q
提交代码
/*
请设计一个简单的图书目录管理系统。图书目录信息包括:统一书号(不超过13字符)
书名(不超过30字符)
作者(不超过20字符)
出版社(不超过30字符)
出版日期(包括:年、月、日)
价格(精确到分)*/
#define _CRT_SECURE_NO_WARNINGS
#include
#includeusing namespace std;
#include
#include
#include
#include// String 类
class STRING
{
public:friend istream& operator >> (istream& cin, STRING& str); // 输入,输出运算符的重载friend ostream& operator << (ostream& cout, STRING& str);STRING() : len(0), str(new char[1]) { str[0] = '\0'; } // STRING 类的构造函数,通过成员初始化表给成员赋值 可以减少一些不不要的操作 提高效率 最开始// 就开辟一个单位的空间然后用来存放 '\0'表示什么都没有就可以了STRING(const char* str); //拷贝构造函数STRING(int len, char sym); // 拷贝构造函数的重载STRING& operator = (const STRING& str); // 赋值~STRING() { delete[] str; }friend bool operator > (const STRING& str1, const STRING& str2); // 比较函数friend bool operator < (const STRING& str1, const STRING& str2);friend bool operator >= (const STRING& str1, const STRING& str2);friend bool operator <= (const STRING& str1, const STRING& str2);friend bool operator == (const STRING& str1, const STRING& str2);friend bool operator != (const STRING& str1, const STRING& str2);void Input();void Output() { printf("%s", str); }int Length() { return len; }void Set(const char* str);const char* Get();protected:int len;char* str;
};istream& operator >> (istream& cin, STRING& str) // 输入
{cin.getline(str.str, 10000);return cin;
}
ostream& operator << (ostream& cout, STRING& str) // 输出
{cout << str.str;return cout;
}STRING::STRING(const char* str) : // 拷贝构造len(strlen(str)), str(new char[len + 1]) // 利用成员初始化表来把新的str的信息复制过来
{strcpy(this->str, str); // 字符串复制函数
}STRING::STRING(int len, char sym) : // 拷贝构造重载 作用是将STRING初始化为 len 个 sym字符len(len), str(new char[len + 1])
{int k;for (k = 0; k < len; k++){str[k] = sym;}str[k] = '\0'; // 这一步末尾加'\0'
}STRING& STRING::operator = (const STRING& str) // 赋值
{this->len = strlen(str.str);delete[] this->str;this->str = new char[str.len + 1];strcpy(this->str, str.str);return *this;
}// 一堆比较函数
bool operator > (const STRING& str1, const STRING& str2)
{return strcmp(str1.str, str2.str) > 0;
}
bool operator < (const STRING& str1, const STRING& str2)
{return strcmp(str1.str, str2.str) < 0;
}
bool operator >= (const STRING& str1, const STRING& str2)
{return strcmp(str1.str, str2.str) >= 0;
}
bool operator <= (const STRING& str1, const STRING& str2)
{return strcmp(str1.str, str2.str) <= 0;
}bool operator == (const STRING& str1, const STRING& str2)
{return strcmp(str1.str, str2.str) == 0;
}
bool operator != (const STRING& str1, const STRING& str2)
{return strcmp(str1.str, str2.str) != 0;
}void STRING::Set(const char* str) // 通过set函数对STRING类的私有成员进行操作
{len = strlen(str); // 这里要先确定输入的字符串的长度delete[] this->str; // 然后销毁原来的字符串this->str = new char[len + 1]; // 重新开辟一段空间 这个空间的大小是len + 1 因为字符串末尾还有个'\0'strcpy(this->str, str); // 动用strcpy 函数将输入的str拷贝过来
}const char* STRING::Get() // 获取成员str的函数
{return str;
}void STRING::Input() // 字符串的输入函数
{char* str = new char[10000];cin.getline(str, 10000); // 注意这个函数的书写方式 c++的编译器里面有一些是不支持gets的所以一般用cin.getline()len = strlen(str); // 这些都是小细节 将原来的内存释放 不仅节约内存 还防止内存泄漏delete[] this->str;this->str = new char[len + 1];strcpy(this->str, str);
}// 不同类的分割线 上面是STREING类
/// //
// 下面是日期类class MYDATE // 日期类
{
public:// 加号与减号的重载friend MYDATE operator + (const MYDATE& date, const int day2); // 日期对象 + 天数friend MYDATE operator - (const MYDATE& date, const int day2); // 日期对象 - 天数friend int operator-(const MYDATE& date, const MYDATE& other); // 日期对象 - 日期对象// -= += 运算符重载MYDATE& operator+=(const int day2);MYDATE& operator-=(const int day2);// 前置 ++ -- 运算符的重载MYDATE& operator++();MYDATE& operator--();// 后置 ++ -- 运算符的重载MYDATE operator++(int);MYDATE operator--(int);// 关系运算符的重载friend bool operator >(const MYDATE& data1, const MYDATE& data2);friend bool operator >=(const MYDATE& data1, const MYDATE& data2);friend bool operator <(const MYDATE& data1, const MYDATE& data2);friend bool operator <=(const MYDATE& data1, const MYDATE& data2);friend bool operator ==(const MYDATE& data1, const MYDATE& data2);friend bool operator !=(const MYDATE& data1, const MYDATE& data2);// 类型转换运算符重载operator int() const;// 时间的输入输出friend istream& operator>>(istream& cin, MYDATE& time); // 输入friend ostream& operator<<(ostream& cout, const MYDATE& time); // 输出// 日期类定义以下符号常量static int const daysPer400Years = 146097;static int const daysPer100Years = 36524;static int const daysPer4Years = 1461;static int const daysPerYear = 365;static int const monthsPerYear = 12;static int const daysPerWeek = 7;static int const daysPerMonth[12];static char const weekName[7][10];// 逻辑控制变量static bool flag;// 构造函数和析构函数MYDATE(int year = 1, int month = 1, int day = 1) // 构造{// cout << "Create ";if (IsValid(year, month, day)){this->year = year;this->month = month;this->day = day;}else{this->year = 1;this->month = 1;this->day = 1;}// cout << *this << '\n';}~MYDATE() // 析构{// cout << "Destroy ";// cout << *this << '\n';}// 时间的拷贝和赋值MYDATE(const MYDATE& time); // 拷贝MYDATE& operator = (const MYDATE& time); // 赋值// Judge leap yearstatic bool IsLeapYear(int year);// 计算闰年的天数static int NumLeapYear(int year);// 判断月份是否有效static bool IsValidMonth(int month);static bool IsValid(int year, int month, int day);// 求月份最大数static int MaxDayMonth(int year, int month);// 求一年的天数int NumDayYear() const;// 求全部年数的总天数int TotalDay() const;// 时间转换成日期void TotalDay(int day);// 求当前星期int DayWeek() const;// 逻辑开关static void FlagOn();static void FlagOff();// 设置函数void Set(int year, int month = 1, int day = 1);// 获取函数int Year() const; // 年份的获取int Month() const; // 月份的获取int Day() const; // 当前天数的获取void Get(int& year, int& month, int& day) const; // 全部的获取
private:int year, month, day;
};// 逻辑变量
bool MYDATE::flag = false;// 数组必须在类外初始化
int const MYDATE::daysPerMonth[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
char const MYDATE::weekName[7][10] = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" };// 时间的拷贝和赋值
MYDATE::MYDATE(const MYDATE& time) // 拷贝
{// cout << "Clone ";this->year = time.year;this->month = time.month;this->day = time.day;// cout << *this << endl;
}
MYDATE& MYDATE::operator = (const MYDATE& time) // 赋值
{// cout << "Assign ";this->year = time.year;this->month = time.month;this->day = time.day;// cout << *this << endl;return *this;
}// Judge leap year
bool MYDATE::IsLeapYear(int year)
{if ((year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))){return true;}else{return false;}
}// 计算闰年的天数
int MYDATE::NumLeapYear(int year)
{return year / 4 + year / 400 - year / 100;
}// 判断月份是否有效
bool MYDATE::IsValidMonth(int month)
{return 0 < month && month < 13 ? true : false;
}// 求月份最大数
int MYDATE::MaxDayMonth(int year, int month)
{int temp;if (year >= 0 && MYDATE::IsValidMonth(month)){if (MYDATE::IsLeapYear(year)){if (month == 2){temp = MYDATE::daysPerMonth[1] + 1;}else{temp = MYDATE::daysPerMonth[month - 1];}}else{temp = MYDATE::daysPerMonth[month - 1];}}else{temp = 0;}return temp;
}bool MYDATE::IsValid(int year, int month, int day)
{int flag = 0;if (year > 0 && MYDATE::IsValidMonth(month)){if (IsLeapYear(year)){if (month == 2){flag = 1 <= day && day <= 29;}else{flag = 1 <= day && day <= MYDATE::daysPerMonth[month - 1];}}else{flag = 1 <= day && day <= MYDATE::daysPerMonth[month - 1];}}else{flag = 0;}return flag;
}// 时间的输入,输出istream& operator >> (istream& cin, MYDATE& date) // 输入
{char sym;int year, month, day;cin >> year >> sym >> month >> sym >> day;while ((!MYDATE::IsValid(year, month, day))){cout << "Incorrect date! Please reenter: ";cin >> year >> sym >> month >> sym >> day;}date.year = year;date.month = month;date.day = day;return cin;
}
ostream& operator<<(ostream& cout, const MYDATE& date) // 输出
{return cout << right << setfill('0') << setw(4) << date.year << '/' << setw(2) << date.month << '/' << setw(2) << date.day << setfill(' ');
}// 求天数
int MYDATE::NumDayYear() const
{int temp = this->month - 1;int sum = 0;for (int i = 0; i < temp; ++i){if (i == 1){if (IsLeapYear(this->year)){sum += MYDATE::daysPerMonth[i] + 1;}else{sum += MYDATE::daysPerMonth[i];}}else{sum += MYDATE::daysPerMonth[i];}}return sum + this->day;
}void MYDATE::TotalDay(int days)
{if (days > 0){int daysLeft;int years, months;years = 1 + (days / daysPer400Years) * 400 + (days % daysPer400Years / daysPer100Years) * 100 + (days % daysPer400Years % daysPer100Years / daysPer4Years) * 4 + (days % daysPer400Years % daysPer100Years % daysPer4Years / daysPerYear);daysLeft = days % daysPer400Years % daysPer100Years % daysPer4Years % daysPerYear;if (daysLeft == 0){year = years - 1;month = 12;day = 31;if (TotalDay() > days){day--;}}else{year = years;int i = 0;for (months = 1; months <= 12; months++){i += MaxDayMonth(years, months);if (daysLeft <= i){month = months;day = daysLeft - (i - MaxDayMonth(years, months));break;}}}}
}// 求最开始到现在的总天数
int MYDATE::TotalDay() const
{int temp = this->year - 1;int leap = NumLeapYear(temp);int sum = leap * 366 + (temp - leap) * 365;sum += this->NumDayYear();return sum;
}// 求当前星期
int MYDATE::DayWeek() const
{int d = this->TotalDay() % 7;return d;
}// 逻辑开关
void MYDATE::FlagOn()
{MYDATE::flag = true;
}
void MYDATE::FlagOff()
{MYDATE::flag = false;
}// 设置函数
void MYDATE::Set(int year, int month, int day)
{if (IsValid(year, month, day)){this->year = year;this->month = month;this->day = day;}
}// 获取函数
int MYDATE::Year() const // 年份的获取
{return year;
}
int MYDATE::Month() const// 月份的获取
{return month;
}
int MYDATE::Day() const // 当前天数的获取
{return day;
}
void MYDATE::Get(int& year, int& month, int& day) const
{year = this->year;month = this->month;day = this->day;
}// 加号与减号的重载 // 全局函数作友元不需要作用域运算符
MYDATE operator+(const MYDATE& date, const int day2) // 日期对象 + 天数
{int total = date.TotalDay() + day2;MYDATE x;x.TotalDay(total);return x;
}MYDATE operator-(const MYDATE& date, const int day2) // 日期对象 - 天数
{int total = date.TotalDay() - day2;MYDATE x;x.TotalDay(total);return x;
}int operator-(const MYDATE& date, const MYDATE& other) // 日期对象 - 日期对象
{return date.TotalDay() - other.TotalDay();
}// += -= 运算符重载
MYDATE& MYDATE::operator+=(const int day2)
{this->TotalDay(this->TotalDay() + day2);return *this;
}
MYDATE& MYDATE::operator-=(const int day2)
{this->TotalDay(this->TotalDay() - day2);return *this;
}// 前置++ -- 运算符重载
MYDATE& MYDATE::operator++()
{int temp = this->TotalDay() + 1;this->TotalDay(temp);return *this;
}
MYDATE& MYDATE::operator--()
{int temp = this->TotalDay() - 1;this->TotalDay(temp);return *this;
}// 后置 ++ -- 运算符的重载
MYDATE MYDATE::operator++(int)
{int total = this->TotalDay() + 1;MYDATE t(*this);this->TotalDay(total);return t;
}
MYDATE MYDATE::operator--(int)
{int total = this->TotalDay() - 1;MYDATE t(*this);this->TotalDay(total);return t;
}// 关系运算符的重载
bool operator >(const MYDATE& data1, const MYDATE& data2)
{if (data1.TotalDay() > data2.TotalDay()){return true;}return false;
}
bool operator >=(const MYDATE& data1, const MYDATE& data2)
{if (data1.TotalDay() >= data2.TotalDay()){return true;}return false;
}
bool operator <(const MYDATE& data1, const MYDATE& data2)
{if (data1.TotalDay() < data2.TotalDay()){return true;}return false;
}
bool operator <=(const MYDATE& data1, const MYDATE& data2)
{if (data1.TotalDay() <= data2.TotalDay()){return true;}return false;
}
bool operator ==(const MYDATE& data1, const MYDATE& data2)
{if (data1.TotalDay() == data2.TotalDay()){return true;}return false;
}
bool operator !=(const MYDATE& data1, const MYDATE& data2)
{if (data1.TotalDay() != data2.TotalDay()){return true;}return false;
}// 类型转换运算符重载
MYDATE::operator int() const
{return this->year;
}// 不同类的分割线 上面是日期类
/// //
// 下面是书本类typedef struct _NODE_
{STRING num;STRING title;STRING auth;STRING pub;MYDATE B_date;double price;struct _NODE_* next;
}B_NODE;class Book_Lib
{
public:Book_Lib();~Book_Lib();void Book_Catalogue(); // 书本的目录void Book_Append(); // 选项 A 插入一本书void Book_Traverse(); // 选项 S 对图书的遍历void Book_Find(STRING& title); // 选项 F 图书的查找void Book_Remove(STRING& num); // 选项 R 图书的删除void Book_Modify(STRING& num); // 选项 M 图书的修改void BooK_Title_Insertion_Sort(); // 按照书名的递增的插入排序法
private:int length;B_NODE* B_head;
};void Book_Lib::Book_Catalogue() // 书本的目录
{cout << "ISBN--------- Title------------------------- Author-------------- Publisher--------------------- Pub-date-- Price---\n";
}
Book_Lib::Book_Lib() :length(0), B_head(new B_NODE) // 先初始化
{B_head->next = NULL; // 带头结点的链表
}
Book_Lib::~Book_Lib() // 析构函数释放结点内存
{B_NODE* s;while (this->B_head->next){s = this->B_head->next;this->B_head->next = s->next;free(s);}this->length = 0;this->B_head->next = NULL;
}void Book_Lib::Book_Append() // 选项 A 插入一本书
{B_NODE* book, * p = B_head;book = new B_NODE;cout << right;cout << setw(11) << "ISBN: ";book->num.Input();cout << setw(11) << "Title: ";book->title.Input();cout << setw(11) << "Author: ";book->auth.Input();cout << setw(11) << "Publisher: ";book->pub.Input();cout << setw(11) << "Pub date: ";cin >> book->B_date;cout << setw(11) << "Price: ";cin >> book->price;this->length++;while (p->next) // 尾插法插入一个结点{p = p->next;}p->next = book;book->next = NULL;
}void Book_Lib::BooK_Title_Insertion_Sort()
{B_NODE* h, * p, * q, * s;h = this->B_head->next;this->B_head->next = NULL;while (h){s = h;h = s->next;p = this->B_head;q = p->next;while (q && (s->title > q->title)){p = q;q = p->next;}p->next = s;s->next = q;}
}void Book_Lib::Book_Traverse() // 选项 S 对图书的遍历
{for (B_NODE* it = this->B_head->next; it != NULL; it = it->next){cout << left<< setw(13) << it->num << ' '<< setw(30) << it->title << ' '<< setw(20) << it->auth << ' '<< setw(30) << it->pub << ' ';cout << it->B_date;printf("%9.2f\n", it->price);}
}void Book_Lib::Book_Find(STRING& title) // 选项 F 图书的查找
{int flag = 0;for (B_NODE* it = this->B_head->next; it != NULL; it = it->next){if (title == it->title){if (flag == 0){this->Book_Catalogue();}cout << left<< setw(13) << it->num << ' '<< setw(30) << it->title << ' '<< setw(20) << it->auth << ' '<< setw(30) << it->pub << ' ';cout << it->B_date;printf("%9.2f\n", it->price);flag = 1;}}if (flag == 0){cout << "Not found!\n";}
}void Book_Lib::Book_Remove(STRING& num) // 选项 R 图书的删除
{int flag = 0;char choice;B_NODE* s = this->B_head; // s 相当于 it的前驱B_NODE* it = s->next;for (; it != NULL; it = it->next){if (it->num == num) // 先找到书号的迭代器{flag = 1;cout << "Delete(y/n)? ";cin >> choice;choice = toupper(choice);while (!(choice == 'Y' || choice == 'N')){cout << "Incorrect answer!\n";cout << "Delete(y/n)? ";cin >> choice;choice = toupper(choice);}if (choice == 'Y') // 如果是Y的话就删除这个迭代器对应的元素{s->next = it->next;free(it);}break; // 然后退出循环}else{s = it;}}if (flag == 0) // 没有书号的情况{cout << "Not found!\n";}
}void Book_Lib::Book_Modify(STRING& num) // 选项 M 图书的修改
{int flag = 0;char choice;for (B_NODE* it = this->B_head->next; it != NULL; it = it->next) // 通过迭代器对图书管理系统进行修改{if (it->num == num){flag = 1;cout << "Modify(y/n)? ";cin >> choice;choice = toupper(choice);while (!(choice == 'Y' || choice == 'N')){cout << "Incorrect answer!\n";cout << "Modify(y/n)? ";cin >> choice;choice = toupper(choice);}if (choice == 'Y'){cin.get();cout << right;cout << setw(11) << "ISBN: ";it->num.Input();cout << setw(11) << "Title: ";it->title.Input();cout << setw(11) << "Author: ";it->auth.Input();cout << setw(11) << "Publisher: ";it->pub.Input();cout << setw(11) << "Pub date: ";cin >> it->B_date;cout << setw(11) << "Price: ";cin >> it->price;}break;}}if (flag == 0){cout << "Not found!\n";}
}int main()
{char choice;Book_Lib bkl;STRING num;STRING title;do{cout << "Append Find Remove Modify Show Quit > ";cin >> choice;cin.get();choice = toupper(choice);switch (choice){case 'A':bkl.Book_Append();break;case 'S':bkl.BooK_Title_Insertion_Sort();bkl.Book_Catalogue();bkl.Book_Traverse();break;case 'F':cout << "Title: ";title.Input();bkl.Book_Find(title);break;case 'R':cout << "ISBN: ";num.Input();bkl.Book_Remove(num);break;case 'M':cout << "ISBN: ";num.Input();bkl.Book_Modify(num);break;case 'Q':break;default:cout << "Incorrect choice!\n";break;}} while (choice != 'Q');return 0;
}