绪论:
昨晚看了女友老师的数据结构题目要求,觉得你们的题还是很有意思的,晚上花了两小时纯写了一下代码,救济一下18级数媒的小伙伴。因为这道题你们在网上找不到答案!老师题目要求还是比较刁钻的。
令狐助教帮你们分析分析:
答案我会贴出来,但是看你们有没有能力把它组织起来了,放在项目里执行。但答案我肯定都会写在这篇文章里。我会按我写它时的思路来介绍这个答案,希望大家从答案里学到东西。
第一文件结构创建:
我们需要在源文件创建:
bookmis.cpp
bookmis.h
main.cpp
status.h
第二打通文件脉络:
首先从main.cpp
开始:
#include <iomanip> #include "string" #include"bookmis.h" #include"status.h" #include<iostream>
接着从bookmis.cpp
引入:
#include"bookmis.h" #include<iostream> using namespace std; void LocateBook(BookList L) { Book e; int i; char n = 0; while (1) { std::cout << "输入1按书号查找,输入2按书名查找,输入3按作者名查找,输入4按序号查找,输入#返回上一级:" << endl; std::cin >> n; if (n == '#') break; if (n == '1') { std::cout << "请输入要查找的书号:"; std::cin >> e.isbn; for (i = 0; i < L.length; i++) { if (strcmp(L.elem[i].isbn, e.isbn) == 0) { std::cout << L.elem[i].isbn << " " << L.elem[i].name << " " << L.elem[i].author << endl; break; } } if (i >= L.length) std::cout << "查无此书!请查看输入是否正确" << endl; } if (n == '2') { std::cout << "请输入要查找的书名:"; std::cin >> e.name; for (i = 0; i < L.length; i++) { if (strcmp(L.elem[i].name, e.name) == 0) { std::cout << L.elem[i].isbn << " " << L.elem[i].name << " " << L.elem[i].author << endl; break; } } if (i >= L.length) std::cout << "查无此书!请查看输入是否正确" << endl; } if (n == '3') { std::cout << "请输入要查找的作者:"; std::cin >> e.author; for (i = 0; i < L.length; i++) { if (strcmp(L.elem[i].author, e.author) == 0) { std::cout << L.elem[i].isbn << " " << L.elem[i].name << " " << L.elem[i].author << endl; break; } } if (i >= L.length) std::cout << "查无此书!请查看输入是否正确" << endl; } if (n == '4') { std::cout << "请输入要查找的序号:"; std::cin >> i; if (i <= L.length) { std::cout << L.elem[i - 1].isbn << " " << L.elem[i - 1].name << " " << L.elem[i - 1].author << endl; } if (i > L.length) std::cout << "查无此书!请查看输入是否正确" << endl; } } } void Deletebyname(BookList &L) { Book e; int i, j; char n = 0; while (1) { std::cout << "请输入要删除的书名:"; std::cin >> e.name; for (i = 0; i < L.length; i++) { if (strcmp(L.elem[i].name, e.name) == 0) { for (j = i + 1; j <= L.length - 1; j++) L.elem[j - 1] = L.elem[j]; --L.length; Printf(L); } } } }
跟着一步走,补充头文件bookmis.h
引入:
我们将在这个头文件里完成图书管理系统的表结构建设,并分别声明三个函数
void LocateBook(BookList L);
void Deletebyname(BookList &L);
void Printf(BookList &L);
三个函数相当于图书管理系统的三个支柱,后序的功能都是靠这三个支柱完成的。
typedef struct { char isbn[20]; char name[50]; char author[20]; int price[100]; }Book; typedef struct { Book *elem; int length; }BookList; void LocateBook(BookList L); void Deletebyname(BookList &L); void Printf(BookList &L);
再来最后一步头文件status.h
的建立和引入:
建立状态标识符:
#pragma once #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define MAXSIZE 10000
这个时候我们已经建立并打通了
bookmis.cpp
bookmis.h
main.cpp
status.h
四个文件的脉络!
第三开始修建房梁
我们的主干main.cpp
的房梁主要由以下几个结构构成:
int InitList(BookList &L); int GetBook(BookList L, int i, Book &e); int InsertBook(BookList &L, int i); void Update(BookList &L); void Create(BookList &L, int n); void Printf(BookList &L);
如果说你看不懂这几个函数的功能:
那请你购买邓玉洁版的《算法与数据结构》
这是基础之基础,表建立的功能。
对应函数功能补充:
using namespace std; void Printf(BookList &L); int InitList(BookList &L) { L.elem = new Book[MAXSIZE]; if (!L.elem) exit(OVERFLOW); L.length = 0; return OK; } int GetBook(BookList L, int i, Book &e) { if (i<1 || i>L.length) return ERROR; e = L.elem[i - 1]; return OK; } int InsertBook(BookList &L, int i) { int j = 0; if ((i<1) || (i > L.length + 1)) return ERROR; if (L.length == MAXSIZE) return ERROR; for (j = L.length - 1; j >= i - 1; j--) L.elem[j + 1] = L.elem[j]; std::cout << "请输入书号、书名、作者" << endl; std::cin >> L.elem[i].isbn >> L.elem[i].name >> L.elem[i].author; ++L.length; Printf(L); return OK; } void Update(BookList &L) { Book e; int i; char n; while (1) { std::cout << "请输入要修改的书的序号 ,输入0返回上一级:"; std::cin >> i; if (i == 0) break; else if ((i<1) || (i>L.length)) std::cout << "输入的序号不正确" << endl; else { std::cout << L.elem[i - 1].isbn << " " << L.elem[i - 1].name << " " << L.elem[i - 1].author << endl; std::cout << "请选择要修改的对象,1:书号,2:书名,3:作者 ,输入#返回上一级" << endl; std::cin >> n; if (n == '#') break; switch (n) { case '1':std::cout << "把其修改为:"; std::cin >> L.elem[i - 1].isbn; std::cout << L.elem[i - 1].isbn << " " << L.elem[i - 1].name << " " << L.elem[i - 1].author << endl; break; case '2':std::cout << "把其修改为:"; std::cin >> L.elem[i - 1].name; std::cout << L.elem[i - 1].isbn << " " << L.elem[i - 1].name << " " << L.elem[i - 1].author << endl; break; case '3':std::cout << "把其修改为:"; std::cin >> L.elem[i - 1].author; std::cout << L.elem[i - 1].isbn << " " << L.elem[i - 1].name << " " << L.elem[i - 1].author << endl; break; default:break; } } } } void Create(BookList &L, int n) { int i; for (i = 0; i < n; i++) { std::cout << "请分别输入第" << i + 1 << "本书的书号、书名、作者" << endl; std::cin >> L.elem[i].isbn >> L.elem[i].name >> L.elem[i].author; L.length++; } } void Printf(BookList &L) { int i; std::cout << "/--------------------- 存在以下图书 ----------------------------------/" << endl; std::cout << " " << setw(10) << left << "序号" << setw(10) << left << "书号" << setw(30) << left << "书名" << setw(10) << left << "作者" << endl << endl; for (i = 0; i<L.length; i++) { std::cout << " " << setw(10) << left << i + 1 << setw(10) << left << L.elem[i].isbn << setw(30) << left << L.elem[i].name << setw(10) << left << L.elem[i].author << endl; } std::cout << "/-----------------------------------------------------------------------/" << endl; }
第四主房梁main
的创建
我们将在这一步实现函数的调用和菜单设计,把之前的功能进行串联。
void main() { BookList L; Book B; char n[20]; int m = 0; char s = 0; InitList(L); std::cout << "/------------------------欢迎进入图书管理系统---------------------------/" << endl; std::cout << "创建图书信息" << endl; std::cout << "请输入书本数目:"; std::cin >> m; Create(L, m); Printf(L); while (1) { std::cout << "请选择要进行的操作 :1:查找 2: 插入 3: 删除 4:修改 0: 显示: :" << endl; std::cin >> s; switch (s) { case '0': Printf(L); break; case '1': LocateBook(L); break; case '2': InsertBook(L, L.length); break; case '4': Update(L); break; case '3':Deletebyname(L); break; } } system("pause"); }
第五main.cpp代码完整版
#include <iomanip> #include "string" #include"bookmis.h" #include"status.h" #include<iostream> using namespace std; void Printf(BookList &L); int InitList(BookList &L) { L.elem = new Book[MAXSIZE]; if (!L.elem) exit(OVERFLOW); L.length = 0; return OK; } int GetBook(BookList L, int i, Book &e) { if (i<1 || i>L.length) return ERROR; e = L.elem[i - 1]; return OK; } int InsertBook(BookList &L, int i) { int j = 0; if ((i<1) || (i > L.length + 1)) return ERROR; if (L.length == MAXSIZE) return ERROR; for (j = L.length - 1; j >= i - 1; j--) L.elem[j + 1] = L.elem[j]; std::cout << "请输入书号、书名、作者" << endl; std::cin >> L.elem[i].isbn >> L.elem[i].name >> L.elem[i].author; ++L.length; Printf(L); return OK; } void Update(BookList &L) { Book e; int i; char n; while (1) { std::cout << "请输入要修改的书的序号 ,输入0返回上一级:"; std::cin >> i; if (i == 0) break; else if ((i<1) || (i>L.length)) std::cout << "输入的序号不正确" << endl; else { std::cout << L.elem[i - 1].isbn << " " << L.elem[i - 1].name << " " << L.elem[i - 1].author << endl; std::cout << "请选择要修改的对象,1:书号,2:书名,3:作者 ,输入#返回上一级" << endl; std::cin >> n; if (n == '#') break; switch (n) { case '1':std::cout << "把其修改为:"; std::cin >> L.elem[i - 1].isbn; std::cout << L.elem[i - 1].isbn << " " << L.elem[i - 1].name << " " << L.elem[i - 1].author << endl; break; case '2':std::cout << "把其修改为:"; std::cin >> L.elem[i - 1].name; std::cout << L.elem[i - 1].isbn << " " << L.elem[i - 1].name << " " << L.elem[i - 1].author << endl; break; case '3':std::cout << "把其修改为:"; std::cin >> L.elem[i - 1].author; std::cout << L.elem[i - 1].isbn << " " << L.elem[i - 1].name << " " << L.elem[i - 1].author << endl; break; default:break; } } } } void Create(BookList &L, int n) { int i; for (i = 0; i < n; i++) { std::cout << "请分别输入第" << i + 1 << "本书的书号、书名、作者" << endl; std::cin >> L.elem[i].isbn >> L.elem[i].name >> L.elem[i].author; L.length++; } } void Printf(BookList &L) { int i; std::cout << "/--------------------- 存在以下图书 ----------------------------------/" << endl; std::cout << " " << setw(10) << left << "序号" << setw(10) << left << "书号" << setw(30) << left << "书名" << setw(10) << left << "作者" << endl << endl; for (i = 0; i<L.length; i++) { std::cout << " " << setw(10) << left << i + 1 << setw(10) << left << L.elem[i].isbn << setw(30) << left << L.elem[i].name << setw(10) << left << L.elem[i].author << endl; } std::cout << "/-----------------------------------------------------------------------/" << endl; } void main() { BookList L; Book B; char n[20]; int m = 0; char s = 0; InitList(L); std::cout << "/------------------------欢迎进入图书管理系统---------------------------/" << endl; std::cout << "创建图书信息" << endl; std::cout << "请输入书本数目:"; std::cin >> m; Create(L, m); Printf(L); while (1) { std::cout << "请选择要进行的操作 :1:查找 2: 插入 3: 删除 4:修改 0: 显示: :" << endl; std::cin >> s; switch (s) { case '0': Printf(L); break; case '1': LocateBook(L); break; case '2': InsertBook(L, L.length); break; case '4': Update(L); break; case '3':Deletebyname(L); break; } } system("pause"); }
第六执行结果