本次图书系统使用DEV C++软件来进行操作实现。实现语言是c++。
实现图书系统使用到了顺序表的初始化、顺序表的建立、顺序表的插入、顺序表的删除、顺序表的查找等顺序表的基本操作。还使用到了c++的流进行数据的输入。
#include<iostream>
#include<fstream>
#include <iomanip>//这三个是c++的头文件
#define MAXSIZE 20
using namespace std;
typedef int Status;
//定义图书类型
typedef struct {
string id;//ISBN
string name;//书名
double price;//定价
} Book;
typedef struct {
Book *elem;//存储基地址
int length;//当前长度
}SqList;
//顺序表初始化
Status InitList (SqList &L) {
L.elem = new Book[MAXSIZE];//为顺序表分配一个大小为MAXSIZE的数组空间
if(L.elem == NULL) {
cout<< "初始化分配失败!" <<endl;
return 0;//初始化分配失败返回0。
}
L.length = 0;
return 1;//返回一则初始化成功
}
//顺序表的取值
Status GetElem (SqList L, int i, Book &e) {
if(i < 1 || i > L.length) {
cout << "获取值失败,原因:取值不合理!!!" << endl;
exit(1);//取值不合理直接退出。
}
e = L.elem[i - 1];
return 1;//取值成功返回一。
}
//顺序表的查找
Status LocatElem (SqList L, double e) {
for(int i = 0; i < L.length; i++) {
if(L.elem[i].price == e) {
return i + 1;//查找成功则返回序号 i + 1;
}
}
return 0;//查找失败返回0。
}
//顺序表的插入
Status ListInsert (SqList &L, int i, Book e) {
//首先判断是否可以插入
if(i < 1 || i > L.length + 1)
{
return 0;
}
if(L.length == MAXSIZE)
{
return 0;
}
for (int j = L.length - 1; j >= i - 1; j--) {//插入位置及其之后的元素向后移动一位。
L.elem[j + 1] = L.elem[j];
}
L.elem[i - 1] = e;//将元素e放入到第i个元素。
++L.length;//顺序表加长。
return 1;//插入成功返回 1。
}
//顺序表的删除
Status ListDelete (SqList &L, Status i) {
//在顺序表中删除第i个元素,首先判断i的取值范围。
if(i < 1 || i > L.length) {
cout << "删除失败!!!";
return 0;//i值不合法,返回0.
}
for(int j = i; j <= L.length - 1; j++) {
L.elem[j - 1] = L.elem[j];
}
--L.length;
return 1;//删除成功返回1.
}
//编写主函数调用顺序表的算法
int main() {
SqList L;
int i = 0, temp = 0, location = 0;
int choose;
double price = 0;
Book e;
string head_1, head_2, head_3;
cout << "1,建立\n";
cout << "2,输入\n";
cout << "3,取值\n";
cout << "4,查找\n";
cout << "5,插入\n";
cout << "6,删除\n";
cout << "7,输出\n";
cout << "8,退出\n";
choose = -1;
while (choose != 0) {
cout << "请选择:\n";
cin >> choose;
switch (choose) {
//创建顺序表
case 1:
if(InitList(L) == 1) {
cout << "创建成功";
}
break;
//顺序信息输入
case 2:
{
i = 0;
fstream file;
file.open("F://数据结构//线性表//book.txt");
if(!file) {
cout << "错误! 未找到文件!" << endl;
continue;
}
file >> head_1 >> head_2 >> head_3;
while (!file.eof()) {
file >> L.elem[i].id >> L.elem[i].name >> L.elem[i].price;
i++;
}
cout <<"输入 book.txt信息完毕\n\n";
L.length = i;
file.close();
}
break;
//顺序表的取值
//调用此函数:GetElem (SqList L, int i, Book &e)
case 3:
{
cout << "请输入一个位置用来取值:\n";
cin >>i;
temp = GetElem(L,i,e);
if(temp!=0)
{
cout<< "查找成功\n";
cout<< "第" << i << "本图书的信息是:\n";
cout<< left << setw(15) << e.id << "\t" ///在C++中,setw(int n)用来控制输出间隔。
<< left << setw(50) << e.name << "\t"
<< left << setw(5) << e.price << endl
<< endl;
}
else cout<< "查找失败,位置超出范围!\n\n";
}
break;
//顺序表的查找
//调用此函数:LocatElem (SqList L, double e)
case 4:
{
cout << "请输入要查找的价格:\n";
cin >> price;
i = LocatElem(L,price);
if (i == 0) {
cout << "查找失败!!!";
} else {
cout << "此价格商品的序列号为:" << i <<endl;
}
}
break;
//顺序表的插入 ,
//调用此函数:Status ListInsert (SqList &L, int i, Book e)
case 5:
{
cout << "输入插入的位置,书本信息包括:编号 书名 价格";
cin >> location;
cin >> e.id >> e.name >> e.price;
i = ListInsert(L,location,e);
if (i == 1) {
cout << "插入成功!!!";
}
}
break;
//顺序表的删除
//调用此函数:Status ListDelete (SqList &L, Status i)
case 6:
{
cout << "请输入所要删除的书籍的位置:";
cin >> location;
if(ListDelete(L,location) == 1) {
cout << "删除成功!!!";
}
}
break;
//顺序表的输出
case 7:
{
cout << "当前图书系统的信息(顺序表)读出:\n";
for(i = 0; i < L.length; i++ ) {
cout << left <<setw(15)<< L.elem[i].id << "\t" << left
<< setw(50) << L.elem[i].name << "\t" << left << setw(5)
<< L.elem[i].price << endl;
}
cout << endl;
}
break;
case 8:
choose = 0;
break;
default:
break;
}
}
return 0;
}
注意:要先建立顺序表(否则下面的输入、插入等无法进行)
book.txt文件中的内容形式如下(TXT文件要和.cpp程序文件在同一文件目录下):
ISBN 书名 定价
9787302257646 1程序设计基础 25
9787302219972 1单片机技术及应用 32
9787302203513 1编译原理 46
9787811234923 1汇编语言程序设计教程 21
9787512100831 1计算机操作系统 17
9787302265436 1计算机导论实验指导 18
9787302180630 1实用数据结构 29
9787302225065 1数据结构(C语言版) 38
9787302171676 1#面向对象程序设计 39
9787302250692 1语言程序设计 42
9787302150664 1数据库原理 35
9787302260806 1Java编程与实践 56
9787302252887 1Java程序设计与应用教程 39
9787302198505 1嵌入式操作系统及编程 25
9787302169666 1软件测试 24
9787811231557 1Eclipse基础与应用 35