圖書管理系統
1.前言
在大一下,我們的C語言課程布置了一次大作業,要求做出一個管理系統,整個系統可以設計為資料插入模塊、資料修改模塊、資料洗掉模塊、資料顯示模塊和資料查詢模塊,各種資訊管理系統本質上是沒有太大區別的,對于資料的操作都是差不多的,
2.功能及其相關函式
2.1 選單界面的構建
建立兩個界面函式,用來搭建主頁,這里用到兩個頭檔案
#include<conio.h>
定義了通過控制臺的資料輸入與輸出函式
#include<windows.h>
用來調整方框大小與背景顏色
#include<conio.h>
#include<windows.h>
void Menu1()
{
system("mode con cols=54 lines=30");
system("color F2");
printf("**********歡迎使用****大學圖書管理系統***********\n");
}//標題函式1
void Menu2()
{
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\t\t1.錄入圖書\t\t\n");
printf("\t\t2.顯示圖書\t\t\n");
printf("\t\t3.查詢圖書\t\t\n");
printf("\t\t4.修改圖書\t\t\n");
printf("\t\t5.洗掉圖書\t\t\n");
printf("\t\t0.退出\t\t\n");
printf("\t\t輸入你的操作:");
}//標題函式2
2.2 功能一 錄入圖書
設定一個WriteToFile()函式,利用scanf函式將資料輸入給結構體,利用fwrite函式將結構體資料寫入"book1.dat"這個二進制檔案中,利用while函式可以進行反復錄入,
2.3 功能二 顯示圖書
利用fread()函式將資料讀出二進制檔案
while (!feof(fp))
{
if (fread(&stu, LEN, 1, fp))
{
printf("%10s\t%8s\t\t%5s\n", stu.id, stu.name, stu.author);
}
}
此時利用if陳述句可以有效避免結構體資料被重復讀出,
2.4 功能三 查詢圖書
此時利用strcmp函式進行圖書ID的“檢索”,利用fread函式讀出,再利用printf函式讀出來,
2.5 功能四 修改圖書
此時利用strcmp函式進行圖書ID的“檢索”,并將其結構體內的所有資料進行重新輸入,達到修改的目的,此時的fseek函式有確定檔案指標的效果,
2.6 功能五 洗掉圖書
洗掉圖書原理:重新建立一個臨時檔案,將除了需要舊檔案洗掉的內容全部復制到臨時檔案中,再利用remove函式洗掉掉舊檔案,使用rename函式將臨時檔案改名為舊檔案名字,達到洗掉的目的
3.注意事項
(1):可以利用鏈表簡化程式
(2):應該要盡可能
擴充管理系統的功能
(3):本人使用VS2017撰寫程式,不同的版本可能不兼容
(4):main()中利用到do-while和switch函式實作主頁選單的效果

4.源程式
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#define LEN sizeof(book)
typedef struct book //確認結構體
{
char id[8];
char name[31];
char author[27];
char publish[31];
double price;
}book;
void Menu1();//標題函式
void Menu2();//選單函式
void WriteToFile();//書籍資訊輸入的函式
void ReadFromFile();//顯示所有資訊的函式
void QueryFile();//書籍的查詢函式
void ModifyFile();//書籍的修改函式
void DeletFile();//洗掉資料的函式
int main()
{
int select;
do
{
Menu1();
Menu2();
scanf("%d", &select);
switch (select)
{
case 1:
WriteToFile();
break;
case 2:
ReadFromFile();
break;
case 3:
QueryFile();
break;
case 4:
ModifyFile();
break;
case 5:
DeletFile();
break;
default:
printf("退出程式!");
exit(0);
break;
}
}while ((select == 1 || select == 2)||(select == 3|| select == 4)||( select == 5));
return 0;
}//利用switch函式進行選單的選擇
void Menu1()
{
system("mode con cols=54 lines=30");
system("color F2");
printf("**********歡迎使用長沙理工大學圖書管理系統***********\n");
}//標題函式1
void Menu2()
{
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\t\t1.錄入圖書\t\t\n");
printf("\t\t2.顯示圖書\t\t\n");
printf("\t\t3.查詢圖書\t\t\n");
printf("\t\t4.修改圖書\t\t\n");
printf("\t\t5.洗掉圖書\t\t\n");
printf("\t\t0.退出\t\t\n");
printf("\t\t輸入你的操作:");
}//標題函式2
void WriteToFile()
{
FILE *fp = NULL;
book stu;
char flag = 'y';
fp = fopen("book1.dat", "ab+");//打開檔案
if (fp == NULL)
{
printf("檔案打開失敗!\n");
exit(1);//1表示在有錯的方式退出程式
}
while ((flag == 'y' || flag == 'Y'))
{
system("cls");
Menu1();
printf("請輸入圖書id:");
scanf("%s", stu.id);
printf("請輸入書名:");
scanf("%s", stu.name);
printf("請輸入書籍作者:");
scanf("%s", &stu.author);
printf("請輸入出版社:");
scanf("%s", &stu.publish);
printf("請輸入價格:");
scanf("%lf", &stu.price);
fwrite(&stu, LEN, 1, fp);
fflush(stdin);
printf("繼續輸入嗎?繼續請輸入y或Y:");
getchar();
scanf("%c", &flag);
}
fclose(fp);//關閉檔案
return;
}//圖書添加的函式
void ReadFromFile()
{
system("cls");
Menu1();
FILE *fp = NULL;
book stu;
fp = fopen("book1.dat", "rb");
if (fp == NULL)
{
printf("檔案打開失敗");
exit(1);
}
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf(" id\t\t書名\t\t作者\n");
fseek(fp, 0, SEEK_SET);
while (!feof(fp))
{
if (fread(&stu, LEN, 1, fp))
{
printf("%10s\t%8s\t\t%5s\n", stu.id, stu.name, stu.author);
}
}
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
system("pause");
system("cls");
fclose(fp);
return;
}
void QueryFile()
{
system("cls");
Menu1();
book stu;
char x[8];
int flag = 0;
FILE *fp;
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\t\t請輸入圖書id:");
scanf("%s", x);
printf(" ID 書名 作者 出版社 價格\n");
fp = fopen("book1.dat", "rb");
if (fp == NULL)
{
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("錯誤\n");
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
return;
}
fseek(fp, 0, SEEK_SET);
while (fread(&stu, LEN, 1, fp))
{
if (strcmp(x, stu.id) == 0)
{
printf("%3s %5s %5s %10s %5.2lf\n", stu.id, stu.name, stu.author, stu.publish, stu.price);
flag = 1;
}
if (flag = 0)
{
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("沒有圖書資訊");
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
}
}
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
fclose(fp);
system("pause");
system("cls");
return;
}
void ModifyFile()
{
system("cls");
Menu1();
book stu;
FILE *fp;
char x[8];
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("請輸入圖書id:");
scanf("%s", x);
fp = fopen("book1.dat", "rb+");
if (fp == NULL)
{
printf("檔案打開失敗");
exit(1);
}
fseek(fp, 0, SEEK_SET);
while (fread(&stu, LEN, 1, fp))
{
if (strcmp(x, stu.id) == 0)
{
printf("請重新輸入圖書id: ");
scanf("%s", stu.id);
printf("請重新輸入書名: ");
scanf("%s", stu.name);
printf("請重新輸入書籍作者 : ");
scanf("%s", &stu.author);
printf("請重新輸入圖書出版社 : ");
scanf("%s", &stu.publish);
printf("請重新輸入圖書價格 : ");
scanf("%lf", &stu.price);
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
fflush(stdin);
fseek(fp, 0-LEN, SEEK_CUR);
fwrite(&stu, LEN, 1, fp);
fclose(fp);
}
if (feof(fp))
{
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("沒有圖書資訊");
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
}
}
system("pause");
system("cls");
return;
}
void DeletFile()
{
system("cls");
Menu1();
book s;
FILE* fp;
char a[10];
fp = fopen("book1.dat", "rb+");
if (fp == NULL)
{
printf("打開檔案錯誤!!!\n");
exit(1);
}
printf("\n請輸入圖書ID:");
scanf("%s", a);
printf("\n\t\t\t洗掉成功\n");
fseek(fp, 0, SEEK_SET);
FILE* fp1;
fp1 = fopen("linshi.dat", "ab+");//讀寫新建一個臨時檔案
while (fread(&s, LEN, 1, fp))//從原檔案讀一個結點
{
if (strcmp(a, s.id) != 0)//不是要洗掉的內容
{
fwrite(&s, LEN, 1, fp1);
}
}
fclose(fp);
fclose(fp1);
remove("book1.dat");//洗掉原檔案
rename("linshi.dat", "book1.dat");//重命名為原檔案
fflush(stdin);
system("pause");
system("cls");
return;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/287773.html
標籤:其他
