绪论:
昨晚看了女友老师的数据结构题目要求,觉得你们的题还是很有意思的,晚上花了两小时纯写了一下代码,救济一下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");
}
第六执行结果
记得关注我的博客!!!挽救你们的“幸运之神”。