图书馆管理系统实验
1.新建project
点击OK后工程如下:
项目的组织方式:需要被多个文件用到的变量声明,类的声明和函数声明放在头文件里,声明可以存放在多个不同的文件里,这些文件使用#include"*.h"来包含这些头文件。而这些变量的定义和函数定义和类的实现(可以理解为定义)在某个.cpp里实现,定义只需要定义一次。
2.项目文件的创建:
按链存储结构存储的线性表称为链表。链表的基本操作包括链表的初始化、取值、查找、插入元素、删除元素等。下面以图书管理系统的链表结构为对象,进行对应算法的实验。
一般编程使用3步骤:
第1步:数据类型及线性表的链式存储结构定义;
第2步:实现基本操作;
第3步:在main()中调用基本操作。
2.1链表的初始化
1、在struch.h文件中进行数据类型及线性表的链式存储结构定义
#ifndef __STRUCH_H__
#define __STRUCH_H__
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型
struct Book {
char id[15];//ISBN
char name[15];//书名
double price;//定价
};
typedef struct LNode {
Book data; //结点的数据域
struct LNode *next; //结点的指针域
} LNode, *LinkList; //LinkList为指向结构体LNode的指针类型
#endif
说明:需要在main.cpp中 #include "struch.h"
2.2实现基本操作
新建一个books_operation.cpp文件用来存放对表的所有操作
2.2.1第一个操作,链表的初始化
链表的初始化操作就是构造一个空的链表。
算法2.1 链表的初始化
【算法步骤】
【算法描述】
#include<iostream>
#include<cstring>
#include "struch.h"
using namespace std;
//初始化
Status InitList_L(LinkList &L) { //算法2.6 单链表的初始化
//构造一个空的单链表L
L = new LNode; //生成新结点作为头结点,用头指针L指向头结点
L->next = NULL; //头结点的指针域置空
return OK;
}
void ShowBooks(LinkList L){
LNode *p = L->next;
cout << "ISBN" << "\t" << "书名" << "\t" << "价格";
cout << "\n";
while(p != NULL){
cout << p->data.id << "\t" << p->data.name << "\t" << p->data.price << "\n";
p = p->next;
}
}
说明:要在头文件function_declare.h里声明函数
2.3 函数的声明写在头文件function_declare.h中
#ifndef __FUNCTION_H__
#define __FUNCTION_H__
Status InitList_L(LinkList &L);
#endif
说明:
#ifndef __FUNCTION_H__
#define __FUNCTION_H__//一般是文件名的大写
头文件结尾写上一行:
#endif
这样一个工程文件里同时包含两个function.h时,就不会出现重定义的错误了。
2.4.book信息的读取写到file_operation.cpp文件中
#include<stdio.h>
#include<string>
#include "struch.h"
Status read_books(LinkList &L){
LNode *r;
r = L;
FILE *fp;
if((fp = fopen("book.txt","r")) == NULL){
puts("Fail to open file");
return ERROR;
}
while(!feof(fp)){
LNode *p = new LNode;
fscanf(fp,"%s%s%lf\n", p->data.id,p->data.name,&p->data.price);
p->next = NULL;
r->next = p;
r = p;
}
r->next = NULL;
fclose(fp);
return OK;
}
说明:要在头文件function_declare.h里声明函数
2.5设计主函数main()
#include <iostream>
#include <iostream>
#include <stdlib.h>
#include <stdbool.h>
#include <conio.h>
#include "struch.h"
#include "function_declare.h"
using namespace std;
int main(int argc, char** argv) {
LinkList L, L_p;
char id[15], name[15];
LNode *p;
double min_p, max_p, price;
int init, result_DE, result_UP, ch;
cout << "--按任意键进入主菜单--";
getch();
while(1){
system("cls");
cout << "============主菜单=========" << "\n";
cout << "1、建立链表" << "\n";
cout << "2、图书信息显示" << "\n";
cout << "3、添加图书" << "\n";
cout << "4、删除图书" << "\n";
cout << "5、查找图书(By id)" << "\n";
cout << "0、退出" << "\n";
cout << "请输入需要的功能序号:" << "\n";
ch = getch()-48;
switch(ch){
case 1:
init = InitList_L(L);
read_books(L);
if(init){
cout << "初始化成功!" << "\n";
}else{
cout << "初始化失败!" << "\n";
}
system("pause");
break;
case 2:
ShowBooks(L);
system("pause");
break;
/*
case 3:
cout << "请输入书籍编号" << "\n";
cin >> id;
cout << "请输入书籍名称" << "\n";
cin >> name;
cout << "请输入书籍价格" << "\n";
cin >> price;
if(AddBook(L,id,name,price))
cout << "添加完成!" << "\n";
else
cout << "此书已被添加!" << "\n";
system("pause");
break;
case 4:
cout << "请输入要删除的书籍编号" << "\n";
cin >> id;
result_DE = DeleteBook(L,id);
if(result_DE){
cout << "删除成功!" << "\n";
}else{
cout << "删除失败!" << "\n";
}
system("pause");
break;
case 5:
cout << "请输入ID号!" << "\n";
cin >> id;
p = FindBookById(L,id);
if (p){
cout << "ISBN" << "\t" << "书名" << "\t" << "价格";
cout << "\n";
cout << p->next->data.id << "\t" << p->next->data.name << "\t" << p->next->data.price << "\n";
}else{
cout << "未找到该书籍" << "\n";
}
system("pause");
break;
*/
case 0:
system("cls");
cout << "===已退出!===" << "\n";
system("pause");
return 0;
default :
printf("输入错误,请重新输入!\n");
system("pause");
break;
}
}
return 0;
}
3.编译运行