c语言-图书管理系统--顺序表实现增删改查
采用外部控制台运行,若直接控制台输出,则清屏命令无效
每种图书信息包括ISBN、书名、价格
具有以下几种功能 0.初始化图书表, 1.录入图书信息 ,2.打印图书信息 , 3.查找图书信息 ,
4.插入图书信息 ,5.删除图书信息 , 6.修改图书信息 , 7.排序图书价格 , 8.统计图书数量
(1)查找:根据指定的ISBN或书名查找相应图书的有关信息,并返回该图书在表中的位置序号。
(2)插入:插入一条新的图书信息。
(3)删除:删除一条图书信息。
(4)修改:根据指定的ISBN,修改该图书的价格。
(5)排序:将图书按照价格由低到高进行排序。
(6)计数:统计文件中的图书数量。
#include
#include
#include
#include
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100 //顺序表可能达到的最大长度
typedef struct {
char id[8];
char name[20];
double price;
} BOOK;
typedef struct {
BOOK *elem; //存储空间的基地址
int length; //图书表中当前图书个数
} SqList; //图书表的顺序存储结构 SqList
SqList Ll;
void menu(); //主界面函数
int InitList(SqList *L); //初始化空表;
void inputBook(SqList *L); //录入图书信息
void printfBook(SqList L); // 打印图书信息
void seekBook(SqList L); //查找图书信息
void seekBookISBN(SqList L); //按ISBN查询图书
void seekBookName(SqList L); //查找书名图书信息
int seekBookSeat(SqList L); //查找位置图书信息
int ListInsert(SqList *L); // 插入图书信息
void listDeleta(SqList *L); //删除图书信息
void revisePrice(SqList L); //修改图书信息(价格)
void sortPrice(SqList L); //排序图书价格
void color(short x); //改变字体颜色
void backtrack(); //返回
int main() {
//程序入口
menu();
return 0;
}
void menu() {
//主界面
int l;
printf("\t欢迎使用图书管理系统\t\n");
printf("\t 0.初始化图书表 \t\n");
printf("\t 1.录入图书信息 \t\n");
printf("\t 2.打印图书信息 \t\n");
printf("\t 3.查找图书信息 \t\n");
printf("\t 4.插入图书信息 \t\n");
printf("\t 5.删除图书信息\t\n");
printf("\t 6.修改图书信息\t\n");
printf("\t 7.排序图书价格 \n");
printf("\t 8.统计图书数量 \n");
printf("=================================\n");
printf("请输入要执行的操作: ");
scanf("%d", &l);
switch (l) {
case 0:
system("cls");
InitList(&Ll);
if (Ll.elem) {
color(2);//绿色字体
printf("图书表初始化成功!\n");
color(0xF);//白色字体
}
menu();
break;
case 1:
system("cls");
inputBook(&Ll);
Sleep(2000);
system("cls");
menu();
break;
case 2:
system("cls");
printfBook(Ll);
break;
case 3:
system("cls");
seekBook(Ll);
break;
case 4:
system("cls");
ListInsert(&Ll);
break;
case 5:
system("cls");
listDeleta(&Ll);
break;
case 6:
system("cls");
revisePrice(Ll);
break;
case 7:
system("cls");
sortPrice(Ll);
break;
case 8:
printf("表长为:%d\n", Ll.length);
Sleep(5000);
menu();
break;
default:
color(0xc); //红色字体
printf("[输入错误]请重新输入有效数字!\n");
Sleep(1000);
color(0xF);//白色字体
system("cls");
menu();
break;
}
}
void color(short x) {
//改变字体颜色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);
}
int InitList(SqList *L) {
//初始化空表
(L)->elem = (BOOK *) malloc(sizeof(BOOK) * MAXSIZE); //申请内存空间
if (!(L)->elem)
exit(OVERFLOW);
(L)->length = 0;
return OK;
}
void inputBook(SqList *L) {
//录入图书信息
int number;
printf("请输入存储的数量:");
scanf("%d", &number);
getchar();
int start = L->length;
for (int i = start; i < (start + number); i++) {
printf("请输入第%d本图书信息!\n", i + 1);
printf("图书ISBN:");
scanf("%s", (L)->elem[i].id);
getchar();
printf("图书名字:");
scanf("%s", (L)->elem[i].name);
getchar();
printf("图书价格:");
scanf("%lf", &(L)->elem[i].price);
getchar();
(L)->length++;
printf("\n");
}
color(2);//绿色字体
printf("[tip]录入完成!\n");
color(0xF);//白色字体
}
void printfBook(SqList L) {
// 打印图书信息
if (L.length == 0) {
return;
}
printf("ISBN 书名 定价\n");
for (int i = 0; i < L.length; i++) {
printf("%-20s%-20s%.2f\n", L.elem[i].id, L.elem[i].name, L.elem[i].price);
}
printf("\n\n是否返回主界面?(y/n)\n");
getchar();
if (getchar() == 'y') {
system("cls");
menu();
}
}
void seekBook(SqList L) {
//查找图书信息
int l;
printf("\t欢迎使用图书查询系统\t\n");
printf("\t 1.按ISBN查询图书 \t\n");
printf("\t 2.按书名查询图书 \t\n");
printf("\t 3.按位置查询图书\t\n");
printf("\t 4.返回 \n");
printf("\t=================================\n");
printf("\t请输入要执行的操作: ");
scanf("%d", &l);
switch (l) {
case 1:
system("cls");
seekBookISBN(L);
break;
case 2:
system("cls");
seekBookName(L);
break;
case 3:
system("cls");
seekBookSeat(L);
break;
case 4:
system("cls");
menu();
break;
default:
color(772);
printf("[输入错误]请3秒后重新输入有效数字!\n");
Sleep(3000);
color(7);
system("cls");
seekBook(L);
break;
}
}
void backtrack(){
printf("\n\n是否返回主界面?(y/n)\n");
getchar();
if (getchar() == 'y') {
system("cls");
menu();
}
}
void seekBookISBN(SqList L) {
//按ISBN查询图书
char id_1[8];
printf("请输入需要查询书籍的ISBN:");
scanf("%s", id_1);
for (int i = 0; i < L.length; i++) {
if (strcmp(L.elem[i].id, id_1)==0) {
printf("\nISBN为%s的书籍信息如下:\n", id_1);
color(2);//绿色字体
printf("ISBN:%-20s书名:%-20s价格:%.2lf!\n", L.elem[i].id, L.elem[i].name, L.elem[i].price);
color(0xF);//白色字体
backtrack();
}
}
color(0xc);
printf("\n【错误】无相关书籍信息!\n");
color(0xF);//白色字体
backtrack();
}
void seekBookName(SqList L) {
//查找书名图书信息
char name_1[20];
printf("请输入需要查询书籍的书名:");
scanf("%s", name_1);
for (int i = 0; i < L.length; i++) {
if (strcmp(L.elem[i].name, name_1)==0) {
printf("\n书名为%s的书籍信息如下:\n", name_1);
color(2);//绿色字体
printf("ISBN:%-20s书名:%-20s价格:%.2lf!\n", L.elem[i].id, L.elem[i].name, L.elem[i].price);
color(0xF);//白色字体
backtrack();
}
}
color(0xc);
printf("\n【错误】无相关书籍信息!\n");
color(0xF);//白色字体
backtrack();
}
int seekBookSeat(SqList L) {
//查找位置图书信息
int seat;
printf("请输入需要查询书籍的位置:");
scanf("%d", &seat);
if (seat < 1 || seat > L.length)
return ERROR;
for (int i = 0; i < L.length; i++) {
if ((i + 1) == seat) {
printf("\n位置为%d的书籍信息如下:\n", seat);
color(2);//绿色字体
printf("ISBN:%-20s书名:%-20s价格:%.2lf!\n", L.elem[i].id, L.elem[i].name, L.elem[i].price);
color(0xF);//白色字体
backtrack();
}
}
color(0xc);
printf("\n【错误】无相关书籍信息!\n");
color(0xF);//白色字体
backtrack();
return OK;
}
int ListInsert(SqList *L) {
// 插入图书信息
BOOK e;
int insertSeat;
printf("请输入插入的位置:");
scanf("%d", &insertSeat);
getchar();
if ((insertSeat < 1) || (insertSeat > L->length))
return ERROR;
printf("\n请需要插入都图书信息!\n");
printf("图书ISBN:");
scanf("%s", e.id);
getchar();
printf("图书名字:");
scanf("%s", e.name);
getchar();
printf("图书价格:");
scanf("%lf", &e.price);
getchar();
printf("\n");
for (int i = L->length - 1; i >= insertSeat - 1; i--) {
L->elem[i + 1] = L->elem[i];
}
L->elem[insertSeat - 1] = e;
++L->length;
color(2);//绿色字体
printf("\n\n【tip】插入成功!是否返回主界面?(y/n)\n");
color(0xF);//白色字体
char ch = getchar();
if (ch == 'y') {
system("cls");
menu();
}
return OK;
}
void listDeleta(SqList *L) {
//删除图书信息
int i;
printf("请输入需要删除的图书位置:");
scanf("%d", &i);
if ((i < 1) || (i > L->length))
return;
printf("\n位置为%d的书籍信息如下:\n", i);
color(2);//绿色字体
printf("ISBN:%-20s书名:%-20s价格:%.2lf!\n", L->elem[i].id, L->elem[i].name, L->elem[i].price);
color(0xF);//白色字体
for (int j = i; j <= L->length; j++) {
L->elem[j - 1] = L->elem[j];
}
L->length--;
printf("\n\n【tip】删除成功!是否返回主界面?(y/n)\n");
getchar();
if (getchar() == 'y') {
Sleep(10);
system("cls");
menu();
}
}
void revisePrice(SqList L) {
// 修改图书信息(价格)
char isbn[8];
double pr;
printf("请输入要修改的书籍的ISBN:");
scanf("%s", isbn);
for (int i = 0; i < L.length; i++) {
if (strcmp(L.elem[i].id, isbn)==0) {
printf("\n原书籍信息如下:\n");
color(2);//绿色字体
printf("ISBN:%-20s书名:%-20s价格:%.2lf!\n\n", L.elem[i].id, L.elem[i].name, L.elem[i].price);
color(0xF);//白色字体
printf("请输入修改后的价格:");
scanf("%lf", &pr);
L.elem[i].price = pr;
printf("\n修改后书籍信息如下:\n");
color(2);//绿色字体
printf("ISBN:%-20s书名:%-20s价格:%.2lf!\n\n", L.elem[i].id, L.elem[i].name, L.elem[i].price);
color(0xF);//白色字体
printf("\n\n【tip】是否返回主界面?(y/n)\n");
getchar();
if (getchar() == 'y') {
system("cls");
menu();
}
}
}
color(0xc);
printf("\n【错误】无相关书籍信息!\n");
color(0xF);//白色字体
printf("\n\n【tip】是否返回主界面?(y/n)\n");
getchar();
if (getchar() == 'y') {
system("cls");
menu();
}
}
void sortPrice(SqList L) {
//排序图书价格 降序
BOOK t;
for (int i = 0; i < L.length; i++) {
for (int j = 0; j < L.length - i - 1; j++) {
if ((L.elem[j].price) < (L.elem[j + 1].price)) {
t = L.elem[j];
L.elem[j] = L.elem[j + 1];
L.elem[j + 1] = t;
}
}
}
printf("排序后书籍信息如下(降序)\n");
printfBook(L);
}