一、系統(tǒng)功能
?????? 圖書管理系統(tǒng)要求實(shí)現(xiàn)圖書管理的基本功能,包括圖書的錄入、刪除、查找和導(dǎo)入/導(dǎo)出等。圖書的屬性包括書號、書名、第一作者、版次、出版社、出版年等信息。
1.創(chuàng)建:創(chuàng)建圖書管理系統(tǒng),用逐條輸入的方式;
2.顯示:分屏顯示圖書管理系統(tǒng)中的所有記錄;
3.插入:向圖書管理系統(tǒng)中插入一條記錄;
4.刪除:刪除一條已經(jīng)存在的記錄項;
5.排序:以編號為依據(jù)升序排列所有記錄項;
6.查找:根據(jù)用戶輸入的屬性值查找符合條件的記錄項;
7.導(dǎo)入/導(dǎo)出:可以從文件讀入已有的圖書管理系統(tǒng),也可將系統(tǒng)中的圖書信息導(dǎo)出到文件;
8.反序:以編號為依據(jù)將按序排列的記錄項反序排列;
9.刪除相同記錄。
?????? 構(gòu)建菜單系統(tǒng),程序執(zhí)行過程為:循環(huán)顯示主菜單,用戶在Give your choice:處輸入選項,即按照功能列表輸入0~10中的任意一個數(shù)字,按回車后,執(zhí)行相應(yīng)的功能。功能執(zhí)行完畢,返回菜單。
二、菜單功能
?????? 各菜單項功能如下:
?????? (1)Input Records(建立有序表)
?????? 從鍵盤上一次輸入一條圖書記錄(書號、書名、第一作者、版次、出版社、出版年),以“書號”為序建立有序表。插入一條記錄后,顯示提示信息:確認(rèn)是否輸入下一條記錄,如確認(rèn),繼續(xù)輸入,否則,退出輸入功能。
?????? (2)Display All Records(顯示所有結(jié)點(diǎn)記錄)
?????? 按順序顯示表中所有記錄,每屏顯示10條記錄,按<Enter>鍵繼續(xù)顯示下一屏。
?????? (3)Insert a Record(插入一條結(jié)點(diǎn)記錄)
?????? 在以“書號”為序排列的表中插入一條記錄,插入后,表仍有序。輸出插入成功的信息。
?????? (4)Delete a Record(按“書號”查找,找到后刪除該條結(jié)點(diǎn)記錄)
?????? 輸入待刪除記錄的“書號”,顯示提示信息,讓用戶再次確認(rèn)是否要刪除。確認(rèn)后,將該“書號”的記錄刪除。
?????? (5) Sort(排序)
?????? 以“書號”為升序排列表中的記錄。
?????? (6)Query(查找并顯示一個結(jié)點(diǎn)記錄)
?????? 輸入“書號”,查找該記錄,找到后顯示記錄信息。
?????? (7)Add Records from a Text File(從文件中添加數(shù)據(jù)到系統(tǒng)中)
?????? 用戶可事前建立一個文件data.txt,存放多條待加入的記錄。提示輸入文件的文件名,然后從該文件中一次性加入多條圖書記錄。文件data.txt格式如下(可以使用英文或拼音表示中文信息):
?????? (8)Write to a Text File(將系統(tǒng)中記錄寫入文件)
?????? 將圖書管理系統(tǒng)中的全部記錄寫入文件records.txt,要求文件格式和文件data.txt相同。
?????? (9)Reverse List(將表反序)
?????? 將表中的所有結(jié)點(diǎn)按“書號”反序存放。
?????? (10)Delete the Same Records(刪除相同記錄)
?????? 刪除書名、第一作者、版次、出版社、出版年均相同的記錄。
?????? (0)Quit(退出圖書管理系統(tǒng)程序)
?????? 退出圖書管理系統(tǒng)程序。
三、程序?qū)崿F(xiàn)
?????? 1. 數(shù)據(jù)結(jié)構(gòu)
???? 用結(jié)構(gòu)體數(shù)組實(shí)現(xiàn)圖書信息的記錄和管理。每個數(shù)組元素為一個結(jié)構(gòu)體變量,其結(jié)構(gòu)如下:
?????? 在主函數(shù)中定義結(jié)構(gòu)體數(shù)組Bookinfo books[NUM];用作記錄存儲。
?????? 2. 各主要功能函數(shù)
?????? (1)數(shù)據(jù)輸入
?????? int Input(Bookinfo dictList[],int n);
?????? 從鍵盤輸入若干條記錄,依次存放到結(jié)構(gòu)體數(shù)組dictList中,n為數(shù)組原有記錄數(shù),函數(shù)返回最后的記錄數(shù)。
?????? (2)輸出數(shù)據(jù)
?????? void Diplay(Bookinfo dictList[],int n);
?????? 顯示所有圖書信息,每10本暫停一次,n為數(shù)組元素個數(shù)。
?????? (3)插入一條結(jié)點(diǎn)記錄
?????? int Insert(Bookinfo dictList[],int n, Bookinfo *s);
?????? 按書號序插入記錄s,返回記錄個數(shù)。
???????? int Insert_a_record(Bookinfo dictList[],int n);
?????? 輸入待插入的圖書書號、書名、作者、版本號、出版社名、出版年等圖書信息,調(diào)用Insert函數(shù)按書號作有序插入,輸出插入成功信息,返回記錄個數(shù)。
?????? (4)刪除一條結(jié)點(diǎn)記錄
?????? int Delete(Bookinfo dictList[],int n, char *book);
?????? 刪除書名為book的第一條圖書記錄,返回數(shù)組中的記錄數(shù)。
?????? int Delete_a_record(Bookinfo dictList[],int n);
?????? 輸入待刪除的書名,經(jīng)確認(rèn)后調(diào)用Delete函數(shù),同時列出同一書名的所有書目,輸入待刪除書目的書號,提示是否刪除,確認(rèn)后,輸出刪除成功與否的信息,返回數(shù)組中的記錄數(shù)。
?????? (5)排序
?????? void Sort_by_ISBN(Bookinfo dictList[],int n);
?????? 數(shù)組按書號升序排列。
?????? (6)查詢數(shù)據(jù)
?????? int Query(Bookinfo dictList[],int n, char *book);
?????? 查找并顯示書名為book的所有記錄,查找成功返回該書名記錄個數(shù),否則返回-1。
?????? void Query_a_record(Bookinfo dictList[], int n);
?????? 輸入待查找的書名,調(diào)用Query函數(shù)查找該書的記錄,輸出查找成功與否的信息和該書名的所有記錄。
?????? (7)從文件中整批輸入數(shù)據(jù)
?????? int AddfromText(Bookinfo dictList[],int n, char *filename);
?????? 從文件filename添加一批記錄到數(shù)組中,調(diào)用Insert()函數(shù)作有序插入,返回添加記錄后的新記錄數(shù)。
?????? (8)將記錄寫到文件
?????? void WriteText(Bookinfo dictList[],int n,char *filename);
?????? 將數(shù)組中的記錄全部寫入文件filename中。
?????? (9)將表反序存放
?????? void? Reverse(Bookinfo dictList[]);
?????? 按書號反序存放表。
?????? (10)刪除雷同記錄
?????? int DeleteSame(Bookinfo dictList[], int n);
?????? 刪除數(shù)組中書名、作者、版本號、出版社名、出版年均相同的記錄,n為數(shù)組原有記錄數(shù),函數(shù)返回最后的記錄數(shù)。
?????? (0)退出管理系統(tǒng)
?????? void Quit(Bookinfo dictList[]);
?????? 退出系統(tǒng)
程序代碼如下
#pragma warning(disable:4996)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<conio.h>
#define NUM 100 // * 最大的書籍信息數(shù)量
#define NUM1 20
#define NUM2 60
// * 定義結(jié)構(gòu)體
typedef struct
{
char ISBN[10]; // * 書號
char book[30]; // * 書名
char author[20]; // * 作者
int edition; // * 版本號
char press[50]; // * 出版社名
int year; // * 出版年
} Bookinfo;
//**************************************************************************************************************************************
//
// * 一.界面設(shè)計函數(shù)
void Enter();// * 1.輸入回車控制
void Space();// * 2.輸入20個空格
void Star();// * 3.輸入星形
void Beauty(); // * 4.美化界面
void BigSpace();// * 5.兩個空格
//**********************************************************************************************************************************
// * 二. 菜單函數(shù)
void Menu();// * 1.開始界面
// ******************************************************************************************************************************
//
// * 三. 主要的操作函數(shù)
int Input(Bookinfo dictList[], int n);// * 在原來數(shù)組后面加一個數(shù)組
void Display(Bookinfo dictList[], int n);// * 顯示所有的圖書信息
int Insert(Bookinfo dictList[], int n, Bookinfo* s);// * 插入一條結(jié)點(diǎn)記錄(按書號插入) // * 返回數(shù)組中的記錄數(shù)
int Insert_a_record(Bookinfo dictList[], int n);// * 輸入待插入的信息,調(diào)用Insert函數(shù)插入
int Delete(Bookinfo dictList[], int n, char* book); // * 刪除一條結(jié)點(diǎn)記錄
int Delete_a_record(Bookinfo dictList[], int n);// * 輸入書名,調(diào)用Delete列出,然后選擇刪除的書號
void Sort_by_ISBN(Bookinfo dictList[], int n);// * 數(shù)組按照書號進(jìn)行升序排序
int Query(Bookinfo dictList[], int n, char* book);// * 查詢數(shù)據(jù)
void Query_a_record(Bookinfo dictList[], int n);// * 輸入要查找的書名,調(diào)用Query查詢記錄,輸出查找成功與否的信息和該書名的所有記錄
int AddfromText(Bookinfo dictList[], int n, char* filename);// * 從文件中添加一批數(shù)據(jù)記錄到數(shù)組之中,同時調(diào)用Insert函數(shù)作有序插入
// * 返回記錄數(shù)量
void WriteText(Bookinfo dictList[], int n, char* filename);// * 將記錄寫回文件
void Reverse(Bookinfo dictList[]);// * 將表反序存放
int DeleteSame(Bookinfo* dictList[], int n);// * 刪除雷同記錄
int Quit(Bookinfo* dictList[], int n);// * 釋放空間,退出系統(tǒng)
// ******************************************************************************************************************************
// * 四. 輔助函數(shù)
Bookinfo InputBookInformation(); // * 1. 用來輸入一本書的信息,返回值是這個信息
void OutputBookInformation(Bookinfo book); // * 2. 輸出書籍的信息
Bookinfo freadBookInformation(FILE* fp); // * 3. 從文件中讀取信息
int FILEOutputBookInformation(Bookinfo book, FILE* fp);// * 4. 把數(shù)組的信息儲存到文件之中
int DeleteByISBN(Bookinfo dictList[], int n, char ISBN[]);// * 5. 根據(jù)書號刪除相應(yīng)的圖書
void OutputBookHead();// * 6.輸出書籍的表頭信息
int DeleteByISBNAndName(Bookinfo dictList[], int n, char ISBN[], char bookname[]);// * 7. 根據(jù)書號和姓名刪除相應(yīng)的圖書
// * 和第五個類似,但是加了一些限制條件
int JudgeSameName(Bookinfo dictList[], int n, char bookname[]);// * 8. 判斷是否有相同的書名, 是返回1,否返回0(和7類似)
int Ask(); // * 9.在寫入文件的時候進(jìn)行詢問是否寫入
void Signin();// * 10.judge登錄系統(tǒng)
// *************************************************************************************************************************
// * 主函數(shù)
int main()
{
//system("color 02");
int i;
char filename[20];
strcpy(filename, "data.txt");
Bookinfo books[100];// * 建立有動態(tài)儲存空間的數(shù)組
int n = 0; // * 儲存書籍的數(shù)量
int choice; // * 用來選擇
Signin();
while (1)
{
// * 先把數(shù)組里所有的沒有數(shù)據(jù)的edition變成0,便于找到數(shù)組終止的地方
for (i = n; i < NUM; i++)
{
books[i].edition = 0;
}
Menu();
scanf("%d", &choice); // * 從鍵盤中讀取字符
getchar();// * 消化換行符
switch (choice)
{
case 1: n = Input(books, n);
break;
case 2: Display(books, n);
break;
case 3: n = Insert_a_record(books, n);
break;
case 4: n = Delete_a_record(books, n);
break;
case 5: Sort_by_ISBN(books, n);
break;
case 6: Query_a_record(books, n);
break;
case 7: n = AddfromText(books, n, filename);
break;
case 8: WriteText(books, n, filename);
break;
case 9: Reverse(books);
break;
case 10: n = DeleteSame(books, n);
break;
case 0: Quit(books, n);
break;
}
//system("pause");
system("cls");
}
return 0;
}
// ******************************************************************************************************
//
// 和菜單有關(guān)的函數(shù)
//
// * 輸入回車控制
void Enter()
{
int i;
for (i = 0; i < 3; i++)
{
printf("\n");
}
}
//輸入20個空格
void Space()
{
int i;
for (i = 0; i < NUM1; i++)
{
printf(" ");
}
}
//輸入星形
void Star()
{
int i;
Space();
for (i = 0; i < NUM2; i++)
{
printf("*");
}
printf("\n\n");
}
// * 美化界面,差不多可以讓輸出到控制臺的中心
void Beauty()
{
Enter();
Space();
Space();
}
// * 輸入四十個空格
void BigSpace()
{
Space();
Space();
}
//開始界面
void Menu()
{
Star();
BigSpace();
printf("The Book Management System\n\n");
Star();
BigSpace();
printf(" Menu\n\n");
Star();
BigSpace();
printf("1.Input Records\n");
BigSpace();
printf("2.Display All Records\n");
BigSpace();
printf("3.Insert a Record\n");
BigSpace();
printf("4.Delete a Record\n");
BigSpace();
printf("5.Sort\n");
BigSpace();
printf("6.Query\n");
BigSpace();
printf("7.Add Record from a Text File\n");
BigSpace();
printf("8.Write to a Text File\n");
BigSpace();
printf("9.Reverse List\n");
BigSpace();
printf("10.Delete the Same Records\n");
BigSpace();
printf("0.Quit\n\n");
Star();
BigSpace();
printf("\b\b\bGive Your Choice(1~10):");
}
// * **************************************************************************************************
// * 和操作有關(guān)的函數(shù)
// * 輸入一個書籍的信息
int Input(Bookinfo dictList[], int n)
{
system("cls");
char judge; // * 用來判斷是否繼續(xù)輸入
while (1)
{
dictList[n] = InputBookInformation(); // * 輸入書籍信息并錄入數(shù)組
// * 還是設(shè)置可以插入相同的書吧不然功能10就失業(yè)了
/*if (JudgeSameISBN(dictList, n, dictList[n].ISBN))
{
printf("已存在相同的書號的書?。?!\n");
system("pause");
return n;
}*/
n++;
while (1)
{
system("cls");
Beauty();
printf("是否繼續(xù)輸入(y/n):");
judge = getch(); // * 消化換行符
system("cls");
// * 判斷是否正確輸入
if (judge == 'y' || judge == 'n' ||
judge == 'Y' || judge == 'N')
break;
}
// * 判斷是否退出
if (judge == 'y' || judge == 'Y')
continue;
return n;
}
}
// * 在翻頁的功能上還需要完善一下
// * 完善好了,可以自由翻頁了
void Display(Bookinfo dictList[], int n)
{
system("cls");
int i;
int page;// * 記錄當(dāng)前頁碼
int page_all = n / 10 + 1; // * 記錄顯示的總頁數(shù)
if (n == 0)
{
Beauty();
printf("系統(tǒng)中沒有錄入圖書!\n");
system("pause");
return;
}
// * 防止書的數(shù)量是10的倍數(shù)出錯
if (n % 10 == 0)
page_all = n / 10 ;
else
page_all = n / 10 + 1;
OutputBookHead(); // * 輸出表頭信息
// * 列出書籍信息的功能
for (i = 0; i < n; i++)
{
OutputBookInformation(dictList[i]);
// * 每十本書暫停一次,或者到達(dá)末尾暫停一次
if ((i + 1) % 10 == 0 || i == n - 1)
{
page = (i / 10) + 1;
// * 輸出頁碼標(biāo)識
printf("\n\n第 %d 頁 \\\ 共 %d 頁(一共 %d 條記錄)\n", page, page_all, n);
Space();
printf("按左方向鍵返回前一頁,右方向鍵來到下頁, enter退出顯示功能");
switch (getch())
{
case 224: //方向鍵區(qū)的ASCII碼
switch (getch())
{
case 75: if (i >= 19) i -= (i % 10 + 11);
else i = -1;
break;// * 按左方向鍵執(zhí)行
case 77: if (page == page_all) i = (page - 1) * 10 - 1;// * 到達(dá)最后一頁的i往后退,減1防止后面i++
break;// * 按右方向鍵執(zhí)行
default:
i -= (i % 10 + 1);// * 輸入其他按鍵不改變原來輸入的值,把i歸位
}
break;
case '\r': return;// * 打enter鍵退出
default:
i -= (i % 10 + 1);// * 輸入其他按鍵不改變原來輸入的值,把i歸位
}
system("cls");
OutputBookHead();
}
}
}
// * 插入一條結(jié)點(diǎn)記錄(按書號插入)
// * 返回數(shù)組中的記錄數(shù)
int Insert(Bookinfo dictList[], int n, Bookinfo* s)
{
int i, j;
int judge = 1; // * 判斷是否沒有比它大的書號
// * 判斷要插入的書號是否重復(fù)
// * 感覺不要判斷重復(fù)因?yàn)?0的功能就是刪除重復(fù)
/*if (JudgeSameISBN(dictList, n, s->ISBN))
{
return n;
}*/
// * 插入圖書
for (i = 0; i < n; i++)
{
// * 判斷插入條件->書號是剛好小于后面那個
if (strcmp(dictList[i].ISBN, s->ISBN) == 1)
{
// * 把所有之后的結(jié)點(diǎn)后移一位再插入
for (j = n; j > i; j--)
{
dictList[j] = dictList[j - 1];
}
dictList[i] = *s;
judge = 0;// * 證明有符合條件的,不用插最后了
break; // * 完成插入了不要循環(huán)了
}
}
// * 如果沒插入就放在最后
if (judge)
{
dictList[n] = *s;
}
return n + 1;
}
// * 傳入待插入的信息,調(diào)用Insert函數(shù)插入
int Insert_a_record(Bookinfo dictList[], int n)
{
system("cls");
int temp = n;// * 緩存n的值以判斷是否是相同書號的書籍
Bookinfo book = InputBookInformation();
n = Insert(dictList, n, &book);
// * 判斷要插入的書號是否重復(fù)
//
// * 感覺不要判斷是否重復(fù)插入因?yàn)?0的功能就是刪除重復(fù)
/*if (n == temp)
{
BigSpace();
printf("已存在相同的書號的書!?。n");
system("pause");
}*/
return n;
}
// * 列出符合書名的圖書并刪除一條結(jié)點(diǎn)記錄
int Delete(Bookinfo dictList[], int n, char* book)
{
system("cls");
int i;
char ISBN[10];// * 輸入書號
int temp = n;// * 儲存n原來的值,如果改變了證明刪除成功了
// * 輸出符合條件的書名的書籍信息
Enter();
OutputBookHead();
for (i = 0; i < n; i++)
{
if (!strcmp(book, dictList[i].book))
{
OutputBookInformation(dictList[i]);
}
}
BigSpace();
printf("\n\n請輸入你要刪除的書號:");
gets(ISBN);
BigSpace();
if ((n = DeleteByISBNAndName(dictList, n, ISBN, book)) < temp)
{
printf("刪除成功!");
}
else printf("刪除失?。?原因可能是因?yàn)闀栞斎胗姓`)\n");
system("pause");
return n;
}
// * 輸入書名,調(diào)用Delete列出,然后選擇刪除的書號
int Delete_a_record(Bookinfo dictList[], int n)
{
system("cls");
Beauty();
char bookname[30];
printf("請輸入要刪除的圖書名字:");
gets(bookname);
// * 判斷數(shù)組中是否有相同的圖書名
if (!JudgeSameName(dictList, n, bookname))
{
printf("\n\n");
BigSpace();
printf("輸入的圖書不存在!\n");
system("pause");
return n;
}
n = Delete(dictList, n, bookname);
return n;
}
// * 數(shù)組按照書號進(jìn)行升序排序
void Sort_by_ISBN(Bookinfo dictList[], int n)
{
system("cls");
int i, j;// * 冒泡排序的循環(huán)變量
Bookinfo temp;// * 交換的中間變量
// * 冒泡排序
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - 1 - i; j++)
{
if (strcmp(dictList[j].ISBN, dictList[j + 1].ISBN) == 1)
{
temp = dictList[j];
dictList[j] = dictList[j + 1];
dictList[j + 1] = temp;
}
}
}
Beauty();
printf("排序完成!一共對 %d 個圖書信息進(jìn)行了排序!\n", n); // * 輸出排序完成的提示信息
system("pause");
}
// * 查詢數(shù)據(jù)
// * 顯示book所有的記錄,返回其個數(shù)(如果沒有就返回0)
int Query(Bookinfo dictList[], int n, char* book)
{
int num = 0;// * 計數(shù)器
int i;
printf("\n\n");
OutputBookHead(); // * 輸入表頭
for (i = 0; i < n; i++)
{
if (!strcmp(dictList[i].book, book))
{
OutputBookInformation(dictList[i]); // * 輸出圖書的信息
num++;
}
}
return num;
}
// * 輸入要查找的書名,調(diào)用Query查詢記錄,輸出查找成功與否的信息和該書名的所有記錄
void Query_a_record(Bookinfo dicList[], int n)
{
system("cls");
char bookname[30];
int num;// * 記錄搜索到的書籍個數(shù)
Beauty();
printf("請輸入要查詢的書籍名稱:");
gets(bookname);
// * 判斷num是否為0,為0輸出沒有該書,非0輸出書籍個數(shù)
if (num = Query(dicList, n, bookname))
{
printf("\n\n搜索到 %d 個相同結(jié)果\n\n", num);
}
else
{
system("cls");
Beauty();
printf("書庫中沒有該書!\n");
}
system("pause");
}
// * 從文件中添加一批數(shù)據(jù)記錄到數(shù)組之中,同時調(diào)用Insert函數(shù)作有序插入
// * 返回記錄數(shù)量
int AddfromText(Bookinfo dictList[], int n, char* filename)
{
system("cls");
Beauty();// * 美化界面
FILE* fp;
int num = n; // * 記錄添加圖書的數(shù)量,有相同書號不添加
Bookinfo booktemp; // * 用來過渡文件中的數(shù)據(jù)
// * 打開文件并判斷打開是否成功
if ((fp = fopen(filename, "r")) == NULL)
{
printf("文件打開失?。。?!\n");
system("pause");
fclose(fp);
return n;
}
while (1)
{
booktemp = freadBookInformation(fp);
// * "end" 是在freadBookInformation 函數(shù)里面設(shè)置的,為了在文件末尾終止循環(huán)
if (!strcmp(booktemp.ISBN, "end"))
{
break;
}
n = Insert(dictList, n, &booktemp);
}
num = n - num; // * 記錄現(xiàn)有文件和原來文件的差值
printf("成功從文件錄入了 %d 本圖書?。ü?%d 本)\n", num, n); // * 錄入成功的提示信息
fclose(fp);
system("pause");
return n;
}
// * 將記錄寫回文件
void WriteText(Bookinfo dictList[], int n, char* filename)
{
system("cls");
Beauty();
// * 文件寫入會破壞原文件,所以在這里提示一下
if (!Ask())
{
return;
}
FILE* fp;
// * 打開并判斷文件打開是否失敗
if ((fp = fopen(filename, "w")) == NULL)
{
printf("文件打開失敗?。?!\n");
return;
}
int i;// * 循環(huán)變量
for (i = 0; i < n; i++)
{
// * 判斷文件寫入是否成功
if (!FILEOutputBookInformation(dictList[i], fp))
{
printf("文件寫入失??!\n");
system("pause");
return;
}
}
Beauty();
printf(" 文件寫入成功!\n\n");
BigSpace();
printf(" 寫入了 %d 個文件\n", n);
system("pause");
fclose(fp);
}
// * 將表反序存放
void Reverse(Bookinfo dictList[])
{
system("cls");
Bookinfo temp[NUM]; // * 同樣定義一個數(shù)組,和原數(shù)組長度相同,用來存放原來數(shù)組信息的信息
int i;
int n; // * 記錄數(shù)組長度
// * 先用temp儲存數(shù)組原來信息
for (i = 0; dictList[i].edition != 0; i++)
{
temp[i] = dictList[i];
}
n = i;
// * 反序存放
for (i = 0; i < n; i++)
{
dictList[i] = temp[n - i - 1];
}
Beauty();
printf("反序存放成功!\n");
system("pause");
}
// * 刪除雷同記錄
int DeleteSame(Bookinfo dictList[], int n)
{
int temp = n; // * 記錄原來的數(shù)目
int i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if (!strcmp(dictList[i].ISBN, dictList[j].ISBN) && i != j)
{
n = DeleteByISBN(dictList, n, dictList[j].ISBN);
j--;// * 刪除之后再判斷一次這個點(diǎn),防止如果兩個要刪的連在一起后面那個刪不了
}
}
}
Beauty();
printf("成功刪除了 %d 本書!\n", temp - n);
system("pause");
return n;
}
// * 退出系統(tǒng)
int Quit(Bookinfo* dicList[], int n)
{
system("cls");
int judge;// * 用來判斷的變量
Enter();
Space();
printf(" 是否退出程序?(y/n)");
while (1)
{
judge = getch();
if (judge == 'y' || judge == 'Y')
{
system("cls");
Beauty();
printf("GOOD BYE!\n\n\n\n\n");
exit(0);
}
else if (judge == 'n' || judge == 'N') return 0;
}
exit(0);
}
//****************************************************************************************************************
// * 這里面寫的是一些輔助的函數(shù)
// * 用來輸入一本書的信息
Bookinfo InputBookInformation()
{
Beauty();
Bookinfo book;
printf("請輸入書號:");
gets(book.ISBN);
BigSpace();
printf("請輸入書名:");
gets(book.book);
BigSpace();
printf("請輸入作者:");
gets(book.author);
BigSpace();
printf("請輸入版本號:");
scanf("%d", &book.edition);
getchar();// * 消化掉scanf帶來的換行符
BigSpace();
printf("請輸入出版社名:");
gets(book.press);
BigSpace();
printf("請輸入出版年:");
scanf("%d", &book.year);
getchar();// * 消化掉scanf帶來的換行符
return book;
}
// * 輸出書籍的信息
void OutputBookInformation(Bookinfo book)
{
printf("%-15s%-15s%-15s%-10d%-30s%-10d\n",
book.ISBN,
book.book,
book.author,
book.edition,
book.press,
book.year);
return;
}
// * 從文件中讀取一本書的信息
Bookinfo freadBookInformation(FILE* fp)
{
Bookinfo book;
fscanf(fp, "%s", book.ISBN);
// * 判斷是否到達(dá)結(jié)尾
// * 因?yàn)榈浇Y(jié)尾的時候還有一行是空的,所以book里面會多讀一個數(shù)據(jù)
// * 這里讓book.ISBN消化了那個數(shù)據(jù)后再判定終止條件
if (feof(fp))
{
strcpy(book.ISBN, "end");
return book;
}
fscanf(fp, "%s", book.book);
fscanf(fp, "%s", book.author);
fscanf(fp, "%d", &book.edition);
fscanf(fp, "%s", book.press);
fscanf(fp, "%d", &book.year);
return book;
}
// * 輸出書籍的信息到文件中
int FILEOutputBookInformation(Bookinfo book, FILE* fp)
{
int judge = fprintf(fp, "%-15s%-15s%-15s%-10d%-30s%-10d\n",
book.ISBN,
book.book,
book.author,
book.edition,
book.press,
book.year);
// * 判斷是否輸入成功
if (judge <= 0)
{
return 0;
}
return 1;
}
// * 根據(jù)書號刪除相應(yīng)的圖書
int DeleteByISBN(Bookinfo dictList[], int n, char ISBN[])
{
int i, j;
for (i = 0; i < n; i++)
{
if (!strcmp(ISBN, dictList[i].ISBN))
{
// * 之后的都前移一位
for (j = i; j < n - 1; j++)
{
dictList[j] = dictList[j + 1];
}
n--;
}
}
return n;
}
// * 根據(jù)書號和姓名刪除相應(yīng)的圖書
int DeleteByISBNAndName(Bookinfo dictList[], int n, char ISBN[], char bookname[])
{
int i, j;
for (i = 0; i < n; i++)
{
if (!strcmp(ISBN, dictList[i].ISBN) && !strcmp(bookname, dictList[i].book))
{
for (j = i; j < n - 1; j++)
{
dictList[j] = dictList[j + 1];
}
i--;
n--;
}
}
return n;
}
// * 管理員登錄
void Signin()
{
int i;// * 用來循環(huán)輸入密碼便于隱藏
int j = 0;
char account[40];
while (1)
{
char password[50] = { '\0' };// * 初始化密碼數(shù)組
Star();
Space();
Space();
printf("The Book Management System\n\n");
Star();
Space();
Space();
printf("account:");
scanf("%s", account);
getchar();// * 消化掉換行符
Space();
Space();
printf("\npassword:");
system("cls");
i = 0;// * 隱藏密碼
while (1)
{
Star();
BigSpace();
printf("The Book Management System\n\n");
Star();
BigSpace();
printf("account:");
printf("%s\n\n", account);
BigSpace();
printf("password:");
for (j = 0; j < i; j++)
printf("*");
password[i] = getch();
if (password[i] == '\r')
break;
// * 輸入backspace的時侯刪除字符串中的字符
if (password[i] == '\b')
{
password[i] = '\0';
i--;
// * 防止減多了
if (i != -1)
i--;
}
system("cls");
i++;
if (i > 20)
{
break;
}
}
// * 比較是否一致
if (!strcmp(account, "admin") && !strcmp(password, "123456\r"))
{
system("cls");
return;
}
printf("\n\n\n");
Space();
printf("the account number or password entered is incorrect\n\n\n\n");
BigSpace();
system("pause");
system("cls");
}
}
// * 輸出書籍的表頭信息
void OutputBookHead()
{
Enter();
printf("%-15s%-15s%-15s%-10s%-30s%-10s\n\n",
"書號",
"書名",
"作者",
"版本號",
"出版社名",
"出版年份");
}
// * 判斷是否有相同的書名, 是返回1,否返回0
int JudgeSameName(Bookinfo dictList[], int n, char bookname[])
{
int i;
for (i = 0; i < n; i++)
{
if (!strcmp(dictList[i].book, bookname))
{
return 1;
}
}
return 0;
}
// * 在寫入文件之前進(jìn)行詢問
int Ask()
{
int judge;// * 用來判斷的變量
Enter();
Space();
printf(" 該操作可能會破壞原有文件,是否繼續(xù)寫入?(y/n)");
while (1)
{
judge = getch();
if (judge == 'y' || judge == 'Y')
{
system("cls");
return 1;
}
else if(judge == 'n' || judge == 'N') return 0;
}
}
程序優(yōu)點(diǎn)
1)美化了界面,定義了四個函數(shù)用來控制控制臺顯示的位置,使得每一步的提示信息都盡可能的居中
2)在進(jìn)入操作的程序之前設(shè)置了一個登錄的界面,只有輸入正確的賬號密碼才能進(jìn)行使用
(賬號:admin,密碼:123456)同時在輸入密碼時也將輸入的字符用*替代,保證了輸入的安全性與系統(tǒng)的安全性
3)在Display功能中,每十個數(shù)據(jù)進(jìn)行輸出時,巧妙的使它擁有了翻頁功能 而不只是把文件顯示十個停頓,導(dǎo)致如果按的速度過快只能重新進(jìn)行一次,提高了使用程序的效率
4)程序清晰易懂,可讀性高,程序所有的細(xì)節(jié)都寫好了注釋,且每個函數(shù)相對獨(dú)立,不會對其他函數(shù)造成很大影響和,定義了9個輔助操作的函數(shù),將讀取所有數(shù)據(jù)的操作變成一個一個數(shù)據(jù)進(jìn)行讀取,將讀取一個文件,寫入一個文件等操作作為一個單獨(dú)的函數(shù)寫出來,提升了程序的可讀性
5)全程序使用了很多的提示語句,在關(guān)鍵的位置都有語句提示,保證了使用的便捷
如:
文章來源:http://www.zghlxwxcb.cn/news/detail-514861.html
6)程序在翻頁、選擇是否繼續(xù)等操作時,都設(shè)定了按其他按鍵不反應(yīng)的功能,可以有效地防止誤觸文章來源地址http://www.zghlxwxcb.cn/news/detail-514861.html
到了這里,關(guān)于C語言課設(shè):圖書管理系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!