在大一下,我们的C语言课程布置了一次大作业,要求做出一个管理系统,整个系统可以设计为数据插入模块、数据修改模块、数据删除模块、数据显示模块和数据查询模块。各种信息管理系统本质上是没有太大区别的,对于数据的操作都是差不多的。
2.功能及其相关函数 2.1 菜单界面的构建建立两个界面函数,用来搭建主页,这里用到两个头文件
#include
定义了通过控制台的数据输入与输出函数
#include
用来调整方框大小与背景颜色
#include#include
void Menu1()
{
system("mode con cols=54 lines=30");
system("color F2");
printf("**********欢迎使用****大学图书管理系统***********n");
}//标题函数1
void Menu2()
{
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~n");
printf("tt1.录入图书ttn");
printf("tt2.显示图书ttn");
printf("tt3.查询图书ttn");
printf("tt4.修改图书ttn");
printf("tt5.删除图书ttn");
printf("tt0.退出ttn");
printf("tt输入你的操作:");
}//标题函数2
2.2 功能一 录入图书
设置一个WriteToFile()函数,利用scanf函数将数据输入给结构体,利用fwrite函数将结构体数据写入"book1.dat"这个二进制文件中。利用while函数可以进行反复录入。
2.3 功能二 显示图书利用fread()函数将数据读出二进制文件
while (!feof(fp))
{
if (fread(&stu, LEN, 1, fp))
{
printf("%10st%8stt%5sn", 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函数实现主页菜单的效果
#define _CRT_SECURE_NO_WARNINGS #include#include #include #include #include #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("tt1.录入图书ttn"); printf("tt2.显示图书ttn"); printf("tt3.查询图书ttn"); printf("tt4.修改图书ttn"); printf("tt5.删除图书ttn"); printf("tt0.退出ttn"); printf("tt输入你的操作:"); }//标题函数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(" idtt书名tt作者n"); fseek(fp, 0, SEEK_SET); while (!feof(fp)) { if (fread(&stu, LEN, 1, fp)) { printf("%10st%8stt%5sn", 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("tt请输入图书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.2lfn", 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("nttt删除成功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; }



