程序设计课程实践
------基于C语言图书馆管理系统编程设计
1.课程目的
本程序旨在训练学生的C语言基本编程能力,通过串联C语言输入输出、循环语句、子函数设计、数组、结构体等知识点,完成一个简单系统的设计开发。
2.系统功能
(1)通过菜单的形式实现人机交互界面
(2)实现录入图书基本信息
(3)实现删除指定图书的基本信息
(4)实现修改指定图书的基本信息
(5)实现查询指定图书的基本信息
3.设计思想
(1)人机交互界面
使用printf()和scanf()输入输出函数设计出主界面交互菜单,通过switch case语句判断输入的选项值,执行相对应得子函数。
每一个选项执行完毕,需要考虑清屏(system("cls");),然后重新显示主界面,供用户下一次操作。
设计程序退出菜单选项,用户执行其选项后,需要使用C语言文件操作,保存当前录入得全部图书信息。
程序启动时需要打开上次保存得数据文件,读入到内存中,如果没有则新建一个文件用于程序退出时保存数据。
人机交互界面可以自己设计,可以加上开发者信息,体现每个学生的差异。
展示如下:
(2)添加图书信息
设计为单独的子函供主函数调用。
定义一个结构体类型,包括七个成员变量(图书编号,图书名,作者名,出版单位,数量),并用该类型定义一个全局的结构体数组,供外部录入图书信息时存储。
//定义一个全局变量来存储当前学生个数。
添加图书信息时,需要从外部读入图书的图书编号,图书名,作者名,出版单位,数量,在获取图书编号时需要判断是否输入重复,图书个数变量加一,并根据当前图书个数将其保存在结构体数组对应序号的元素中。
一个图书信息录入结束后可以提示用户输入Y/N来选择是否接着输入下一个图书。
(3)显示全部图书信息
通过对当前结构体数组进行遍历,并显示输出
展示如下:
(4)查找单个图书
根据输入需要查找图书名,遍历当前结构体数组,判断是否含有一致图书名的元素,若有则显示输出对应的信息和成绩,否则显示无此书籍。
显示如下:
(5)修改图书信息
根据输入需要查找图书的编号,遍历当前结构体数组,判断是否含有一致编号的元素,
若有则依次从外部读入用户所修改的值,保存到对应成员变量中。
展示如下:
(6)删除指定图书
根据输入需要查找图书的编号,遍历当前结构体数组,判断是否含有一致图书名称的元素,若有则从该元素之后依次将下一个元素赋值到上一个元素,直至最后一个赋值完成,最后当前图书个数变量减一。
显示如下:
(7)借阅图书
通过对当前结构体数组进行遍历,并显示输出
显示如下:
通过对当前结构体数组进行遍历,并显示输出
显示如下:
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//定义结构体
struct book
{
int id;
char name[30];
char author[30];
char publish[50];
int store;
int total;
int user[10];
int days[10];
};
const char* file = "Book.txt"; //图书文件
//显示整体标题标题函数
void page_title(char* menu_item)
{
printf("\t\t图书馆管理系统\n\n%s-\n\n", menu_item);
}
void add_book(struct book* lib, int* count)
{
void menu();
void page_title(char* menu_item);
system("cls"); //清屏
page_title("注册新书");
printf("序号:");
scanf("%d", &lib[*count].id);
printf("书名:");
scanf("%s", &lib[*count].name);
printf("作者:");
scanf("%s", &lib[*count].author);
printf("出版社:");
scanf("%s", &lib[*count].publish);
printf("数量:");
scanf("%d", &lib[*count].total);
lib[*count].store = lib[*count].total;
(*count)++;
printf("\n");
}
void Show_books(struct book* lib, int count)
{
int i;
system("cls");
for (i = 0; i < count; i++)
{
printf("序号:%d\t ", lib[i].id);
printf("书名:%s\t ", lib[i].name);
printf("作者:%s\t ", lib[i].author);
printf("出版社:%s\t ", lib[i].publish);
printf("存数:%d\t", lib[i].store);
printf("总数:%d\n\n", lib[i].total);
}
}
void search_book(struct book* lib, int count)
{
system("cls");
int i, flag;
char nam[30];
system("cls");
printf("请输入书名:");
scanf("%s", &nam);
if (strlen(nam) > 1)
{
for (i = 0; i < count; i++)
{
if (strcmp(lib[i].name, nam) == 0)
{
printf("序号:%d\t ", lib[i].id);
printf("书名:%s\t ", lib[i].name);
printf("作者:%s\t ", lib[i].author);
printf("出版社:%s\t ", lib[i].publish);
printf("存数:%d\t", lib[i].store);
printf("总数:%d\n", lib[i].total);
flag = 1;
break;
}
}
}
else {
printf("输入错误!\n");
return;
}
if (flag == 0)
{
printf("\n没有找到相关书籍\n");
}
}
void modify_book(struct book* lib, int count)
{
int i, id_change;
system("cls");
page_title("修改图书信息:");
printf("输入要修改的图书id:");
scanf("%d", &id_change);
for (i = 0; i < count; i++)
{
if (lib[i].id == id_change)
{
printf("修改书名:");
scanf("%s", &lib[i].name);
printf("修改作者:");
scanf("%s", &lib[i].author);
printf("修改出版社:");
scanf("%s", &lib[i].publish);
printf("修改数量:");
scanf("%d", &lib[i].total);
lib[i].store = lib[i].total;
printf("修改图书信息成功\n");
}
else if(i==count) printf("\n没有找到相关信息\n");
}
}
void delete_book(struct book* lib, int* count)
{
int i, num;
system("cls");
page_title("删除图书");
printf("输入所要删除的书的id:");
scanf("%d", &num);
for (i = 0; i <*count ; i++)
{
if (lib[i].id==num)
{
memmove(&lib[i], &lib[i + 1], (*count - i - 1) * sizeof(struct book));
(*count)--;
printf("删除成功!\n");
break;
}
else {
printf("未找到相关记录\n");
break; }
}
}
//借书
void borrow_book(struct book* lib, int count)
{
void page_title(char* menu_item);
char name[30];
int i,s,d;
system("cls");
page_title("借阅图书");
printf("请输入要借阅的书籍名称:");
scanf("%s", name);
for (i = 0; i < count; ++i)
{
if (strcmp(name, lib[i].name) == 0)
{
if (i != -1 && lib[i].store > 0)
{
printf("借书证序号:");
scanf("%d", &s);
printf("输入可借天数:");
scanf("%d", &d);
lib[i].user[i] = s;
lib[i].days[i] = d;
lib[i].store--;
printf("借阅成功!\n");
printf("序号:%d\t ", lib[i].id);
printf("书名:%s\t ", lib[i].name);
printf("作者:%s\t ", lib[i].author);
printf("出版社:%s\t ", lib[i].publish);
printf("存数:%d\t", lib[i].store);
printf("总数:%d\n", lib[i].total);
}
else if (lib[i].store == 0)
{
printf("此书已经完全借完\n\n");
}
}
else if(i==count) {
printf("抱歉,未找到匹配的书籍!\n");
break;
}
}
}
//归还图书
void return_book(struct book* lib, int count)
{
int i,s;
char name[30];
page_title("归还图书");
printf("请输入要归还的书籍名称:");
scanf("%s", name);
for (i = 0; i < count; ++i)
{
if (strcmp(name, lib[i].name) == 0)
{
if (i != -1 && lib[i].store < lib[i].total)
{
printf("借阅图书证列表\n");
if (lib[i].user != 0)
{
printf("[%d]--%d天\n", lib[i].user[i], lib[i].days[i]);
}
printf("输入借书证号:");
scanf("%d", &s);
if (lib[i].user[i] == s)
{
lib[i].store++;
printf("归还成功\n");
}
}
else if (i != -1 && lib[i].store == lib[i].total)
{
printf("全部归还\n");
}
}
}
}
//将图书信息保存到文件中
void save_books(struct book* lib, int count, const char* file_name)
{
FILE* fp = fopen(file_name, "wb");
fwrite(&count, sizeof(int), 1, fp);
fwrite(lib, sizeof(struct book), count, fp);
fclose(fp);
}
//从文件中读取图书信息
int load_books(struct book* lib, int* count, const char* file_name)
{
FILE* fp = fopen(file_name, "rb");
if (fp == NULL) {
printf("读取文件失败");
}
fread(count, sizeof(int), 1, fp);
fread(lib, sizeof(struct book), *count, fp);
fclose(fp);
return 1;
}
void menu()
{
page_title("开发者:林**\n操作选单");
printf("用数字选择操作\n\n");
printf("\t\t(1)图书信息录入\t\t(2)显示图书\n");
printf("\t\t(3)查询图书信息\t\t(4)修改图书信息\n");
printf("\t\t(5)删除图书\t\t(6)借阅图书\n");
printf("\t\t(7)归还图书\t\t(8)退出系统\n");
}
int main()
{
char Step = 'Y';
int choice=0, count =0;
struct book* lib = (struct book*)malloc(sizeof(struct book) * 100);
load_books(lib, &count, file);
do {
menu();
printf("请按数字键:\n");
scanf("%d", &choice);
switch (choice) {
case 1:
do {
add_book(lib, &count);
printf("输入(Y)继续添加图书 or 输入(N)结束添加:\n");
scanf("%s", &Step);
} while (Step != 'N');
case 2:
Show_books(lib, count);
break;
case 3:
search_book(lib, count);
break;
case 4:
modify_book(lib, count);
break;
case 5:
delete_book(lib, &count);
break;
case 6:
borrow_book(lib, count);
break;
case 7:
return_book(lib, count);
break;
case 8:
printf("感谢使用图书馆管理系统!\n");
break;
default:
printf("请输入正确的选项!\n");
break;
}
} while (choice != 8);
save_books(lib, count, file);
free(lib);
return 0;
}
以上内容参考文章:http://t.csdnimg.cn/wOwn7