一、简单实现
library.c
#include<stdio.h> //图书馆管理系统面向多用户,最多可借十本书
#include<string.h>
#include<stdlib.h> //书籍管理者,账号 :management 密码:自定义
#include"manage.h"
FILE *ma;
FILE *fp, *yh, *pt, *yh1;
int a=1;
int main(void)
{
int number;
int bookamount, i=0, sizename;
char title[10], title1[10], returnbook[10];
char username[20], username1[20], username2[20], password[10], password1[10];
char simplebook[10], allbook[10][10] = {"1","1","1","1","1","1","1","1","1","1"};
printf("==========欢迎来到图书馆==========\n");
break1: printf("1:登录\n2:注册\n3:退出\n输入操作序号:");
number = number_1(); //返回操作数字
if (number == 3)
{
exit_t();
}
printf("用户名:");
scanf("%s", &username);
printf("密码:");
scanf("%s", &password);
char content[20] = "目录#";
strcpy(username2, username);
strcat(username2, "||");
strcat(content, username);
strcat(username, "||");
strcat(username, password); //合并用户名和密码
//登录
if (number == 1)
{
fp = fopen("userinfo1", "r");
while (fscanf(fp, "%s", username1) == 1)
{
if (strcmp(username, username1)!=0) //用户名和密码验证
{
a = 0;
}
else
{
printf("登录成功!\n");
a = 1;
break;
}
}
if (a == 0)
{
printf("登录失败!用户或密码错误!\n");
goto break1;
}
}
else if (number ==2 ) //注册
{
printf("密码确认:");
scanf("%s", &password1);
sizename = sizeusername(username2); //返回输入了多少个字符串
fp = fopen("userinfo1", "r"); //验证用户名是否重复
while (fscanf(fp, "%s", username1) == 1)
{
if (strncmp(username1, username2, sizename) == 0)
{
printf("用户名重复!\n");
fclose(fp);
goto break1;
}
}
fclose(fp);
if (strcmp(password, password1) != 0)
{
printf("注册失败!密码不一致。\n");
goto break1;
}
else
{
printf("注册成功!\n");
strcat(username, "\n"); //合并换行,加入换行是为了更好的在文件中显示
fp = fopen("userinfo1", "a+");
fprintf(fp, username);
}
}
if (strncmp(username, "management||", 7) == 0); //判断是否为管理员,如果是管理员跳转
{
management();
}
allbooktitle();
//借书还书
break2: printf("1:借书\n2:还书\n3:退出\n输入操作序号:");
number = number_1();
yh = fopen(content, "a+");
if (number == 1) //借书,限制借书本数10本
{
bookamount = 0;
while (fscanf(yh, "%s", title1) == 1)
{
bookamount++;
}
if (bookamount < 10) //判断借书是否超过10本
{
printf("输入借书名称:");
scanf("%s", title);
yh1 = fopen(content, "r");
while (fscanf(yh1, "%s", title1) == 1)
{
if (strcmp(title1, title) == 0)
{
printf("已借此书!\n");
fclose(yh1);
goto break2;
}
}
fclose(yh1);
a = findbook(title);
if (a != 0)
{
printf("查无此书!\n");
goto break2;
}
strcat(title, "\n");
fprintf(yh, title);
fclose(yh);
printf("借书成功!\n");
goto break2;
}
else
{
printf("借书数量以上线,请还书!\n");
goto break2;
}
}
else if (number == 2 ) //还书
{
a = 0;
printf("已借书目录:\n"); //打印已借书目录
while (fscanf(yh, "%s", title1)==1)
{
a++;
printf(" %s 、", title1);
if(a % 5 == 0)
printf("\n");else;
}
printf("\n还书名称:");
scanf("%s", returnbook);
fseek(yh, 0L, SEEK_SET);
while (fscanf(yh, "%s", title1) == 1)
{
a = 1;
if (strcmp(title1,returnbook) == 0) //检查是否有此书,返回为0则有
{
bookamount = 0;
fseek(yh, 0L, SEEK_SET);
while (fscanf(yh, "%s", simplebook) == 1) //将已借的书储存在数组中
{
strcpy(allbook[bookamount], simplebook);
bookamount++;
}
fclose(yh);
pt = fopen(content, "w");
for (i = 0; i < 10; i++)
{
if (strcmp(allbook[i], "1") == 0) break;
if (strcmp(allbook[i], returnbook) != 0)
{
strcat(allbook[i], "\n");
fprintf(pt, allbook[i]);
}
}
printf("还书成功!\n");
fclose(pt);
break;
}
else a = 0;
}
if (a != 1)
{
printf("查无此书!请重新操作。\n");
}
goto break2;
}
else //退出
{
exit_t();
}
return 0;
}
management.h
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
extern FILE *fp, *yh, *pt, *yh1;
extern FILE *ma;
extern int a;
int number_1() //得出操作数字
{
int breaknumber;
char number1[10];
while ( scanf("%s", &number1) )
{
if (strcmp(number1, "1") == 0)
{
breaknumber = 1;
return breaknumber;
break;
}
else if ( strcmp(number1, "2")==0 )
{
breaknumber=2;
return breaknumber;
break;
}
else if ( strcmp(number1, "3") == 0)
{
breaknumber=3;
return breaknumber;
break;
}
else
{
printf("输入错误!\n输入操作序号:");
}
}
}
int sizeusername(char s[20]) //得出输入了多少个字符串
{
int i = 0, ch = 0;
while ( s[i] != '\0')
{
ch++;
i++;
}
return ch;
}
void exit_t() //退出
{
printf("退出成功!\n");
fclose(fp);
fclose(yh);
exit(0);
}
void allbooktitle() //输出图书馆书籍
{
a=0;
char bookname[10];
ma=fopen("书籍","r");
printf("图书馆书籍:\n");
while ( fscanf(ma, "%s", bookname) == 1)
{
a++;
printf(" %s 、", bookname);
if(a%8==0)
{
printf("\n");
}
}
fclose(ma);
printf("\n");
}
int findbook(char bookname[10]) //判断书籍中是否有此书
{
char simplebook[10];
ma = fopen("书籍","r");
while ( fscanf(ma, "%s", simplebook) == 1)
{
a=1;
if( strcmp(simplebook, bookname) == 0)
{
a=0;
break;
}
}
fclose(ma);
return a;
}
void management()
{
int number;
char bookname[10],title1[10];
break3: printf("1:更改书籍\n2:查看数据\n3:退出\n输入操作序号:");
number = number_1();
if (number == 1)
{
break4: printf("1:添加\n2:删除\n3:返回\n输入操作序号:");
number = number_1();
if(number == 1) //添加
{
ma = fopen("书籍", "a+");
printf("输入书籍名称:");
scanf("%s",&bookname);
yh1 = fopen("书籍", "r");
while( fscanf(yh1, "%s", title1) == 1)
{
if( strcmp(title1, bookname) == 0)
{
printf("已有此书!\n");
fclose(yh1);
goto break4;
}
}
fclose(yh1);
strcat(bookname, "\n");
fprintf(ma, bookname);
fclose(ma);
printf("添加成功!\n");
goto break4;
}
else if (number == 2) //删除
{
allbooktitle();
FILE *ma1;
char outbook[10];
printf("输入移除的书籍:");
scanf("%s", &outbook);
a = findbook(outbook);
if (a != 0);
{
printf("查无此书!\n");
goto break4;
}
ma = fopen("书籍", "r");
ma1 = fopen("中间书籍", "w");
while (fscanf(ma, "%s", bookname) == 1)
{
if (strcmp(bookname, outbook) != 0)
{
strcat(bookname, "\n");
fprintf(ma1, bookname);
}
}
fclose(ma1);
fclose(ma);
ma=fopen("书籍", "w");
ma1=fopen("中间书籍", "r");
while(fscanf(ma1, "%s", bookname)==1)
{
strcat(bookname, "\n");
fprintf(ma, bookname);
}
fclose(ma1);
fclose(ma);
printf("删除成功!\n");
goto break4;
}
else goto break3;
}
else if (number == 2)
{
break5: printf("1:查看书籍\n2:查看用户\n3:返回\n输入操作序号:");
number = number_1();
if(number == 1) //查看书籍
{
allbooktitle();
goto break5;
}
else if (number == 2) //查看用户
{
ma = fopen("userinfo1", "r");
printf("用户名||密码:\n");
while(fscanf(ma, "%s", bookname) == 1)
{
printf("%s", bookname);
printf("\n");
}
fclose(ma);
goto break5;
}
else goto break3;
}
else exit_t(); //退出
}
首次使用要先注册名称management,密码自定义,作为管理将书籍写入,有错请联系删改,谢谢!
建议:文件指针的引用很乱,建议自己写代码时不要定义全局变量;可以通过函数传递指针,用完文件指针及时关闭,goto最好语句不要用。
要养成良好的代码书写格式。
二、加入链表
具体内容不变,相关函数变了。
manage2.h
#ifndef MANAGE_H_
#define MANAGE_H_
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct node
{
char Item[20];
struct node *next;
}Node;
typedef struct{
Node *list;
}Link;
/*得出输入数字 */
/*返回值为1,2,3 */
int number_1(void);
/*得出输入了多少个字符串 */
int sizeusername(char s[20]);
/*退出 */
void exit_t(Link *plist);
/*管理员 */
void management(Link* plist);
/*链表初始化 */
void InitializeList(Link* plist);
/*确定链表是否为空 */
bool ListIsEmpty(const Link* plist);
/*确定链表是否为满 */
/*返回true为还有内存空间,否则无可利用空间*/
bool ListIsFull(const Link* plist);
/*链表末尾添加项 */
/*返回true添加成功,否则失败 */
bool AddItem(char item[], Link *plist);
/*遍历链表,把函数作用于每一项 */
/*返回true为找到传入的字符串,否则没有该项*/
bool Traverse(const Link* plist, void (*pfun)(char item[]), char str[]);
/*释放已分配内存 */
void EmptyTheLlist(Link* plist);
/*链表实现书籍的输出 */
void allbooktitle(Link* plist);
#endif
manage2.c
#include"manage.h"
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdbool.h>
extern FILE *fp, *yh, *pt, *yh1;
extern FILE *ma;
extern int a;
/*输出函数 */
static void ShowItem(char item[]);
/*得出输入数字 */
int number_1(void)
{
int breaknumber;
char number1[10];
while (scanf("%s", &number1)) {
if (strcmp(number1, "1") == 0) {
breaknumber = 1;
return breaknumber;
}
else if (strcmp(number1, "2") == 0 ) {
breaknumber = 2;
return breaknumber;
}
else if (strcmp(number1, "3") == 0) {
breaknumber = 3;
return breaknumber;
break;
}
else
printf("输入错误!\n输入操作序号:");
}
}
/*得出输入了多少个字符串*/
int sizeusername(char s[20])
{
int i = 0, ch = 0;
while(s[i] != '\0') {
ch++;
i++;
}
return ch;
}
/*退出 */
void exit_t(Link *plist)
{
EmptyTheLlist(plist);
printf("退出成功!\n");
fclose(fp);
fclose(yh);
exit(0);
}
/*管理员*/
void management(Link* plist)
{
bool right;
int number;
char bookname[10], title1[10];
break3: printf("1:更改书籍\n2:查看数据\n3:退出\n输入操作序号:");
number = number_1();
if (number == 1) {
break4: printf("1:添加\n2:删除\n3:返回\n输入操作序号:");
number = number_1();
if (number == 1) {//添加
ma = fopen("书籍", "a+");
printf("输入书籍名称:");
scanf("%s", &bookname);
yh1 = fopen("书籍", "r");
while (fscanf(yh1, "%s", title1) == 1) {
if (strcmp(title1, bookname) == 0) {
printf("已有此书!\n");
fclose(yh1);
goto break4;
}
}
fclose(yh1);
strcat(bookname, "\n");
fprintf(ma, bookname);
fclose(ma);
printf("添加成功!\n");
goto break4;
}
else if(number==2){ //删除
allbooktitle(plist);
FILE *ma1;
char outbook[10];
printf("输入移除的书籍:");
scanf("%s", &outbook);
right = Traverse(plist, NULL, outbook);
if (right == false) {
printf("查无此书!\n");
goto break4;
}
ma = fopen("书籍", "r");
ma1 = fopen("中间书籍", "w");
while (fscanf(ma, "%s", bookname) == 1) {
if (strcmp(bookname, outbook) != 0) {
strcat(bookname,"\n");
fprintf(ma1,bookname);
}
}
fclose(ma1);
fclose(ma);
ma = fopen("书籍", "w");
ma1 = fopen("中间书籍", "r");
while(fscanf(ma1, "%s", bookname) == 1) {
strcat(bookname, "\n");
fprintf(ma, bookname);
}
fclose(ma1);
fclose(ma);
printf("删除成功!\n");
goto break4;
}
else
goto break3;
}
else if(number == 2)
{
break5: printf("1:查看书籍\n2:查看用户\n3:返回\n输入操作序号:");
number = number_1();
if (number == 1){ //查看书籍
allbooktitle(plist);
goto break5;
}
else if (number == 2) //查看用户
{
ma = fopen("userinfo1","r");
printf("用户名||密码:\n");
while (fscanf(ma, "%s", bookname) == 1) {
printf("%s",bookname);
printf("\n");
}
fclose(ma);
goto break5;
}
else
goto break3;
}
else
exit_t(NULL); //退出
}
/*链表初始化*/
void InitializeList(Link* plist)
{
plist->list = NULL;
}
/*确定链表是否为空 */
bool ListIsEmpty(const Link* plist)
{
if (plist->list == NULL) {
return false;
}
else {
return true;
}
}
/*确定链表是否为满 */
bool ListIsFull(const Link* plist)
{
int num;
Node* p;
p = (Node*)malloc(sizeof(Node));
if (p == NULL) {
num = 0;
}
else {
num = 1;
}
free(p);
if (num == 0)
return false;
else
return true;
}
/*链表末尾添加项 */
bool AddItem(char item[], Link* plist)
{
bool full = ListIsFull(plist);
if (full == false) {
printf("链表以满!\n");
return false;
}
Node* pnew;
Node* scan = plist->list;
pnew = (Node*)malloc(sizeof(Node));
if (pnew == NULL) {
return false;
}
strcpy(pnew->Item, item);
pnew->next = NULL;
if (plist->list == NULL) {
plist->list = pnew;
}
else
{
while (scan->next != NULL) {
scan = scan->next;
}
scan->next = pnew;
}
return true;
}
/*遍历链表,把函数作用于每一项*/
bool Traverse(const Link* plist, void (*pfun)(char item[]), char str[])
{
int n = 0;
bool right;
if(right = ListIsEmpty(plist) == false)
{
printf("无书籍\n");
return false;
}
Node* scan = plist->list;
if(str == NULL){
printf("图书馆书籍:\n");
while (scan != NULL) {
(*pfun)(scan->Item);
scan = scan->next;
n++;
if(n%8 == 0){
printf("\n");
}
}
return true;
}
else{
while (scan != NULL) {
if (strcmp(scan->Item,str) == 0){
return true;
}
scan = scan->next;
}
}
return false;
}
/*输出函数 */
static void ShowItem(char item[])
{
printf("% -15s ", item);
}
/*释放已分配内存 */
void EmptyTheLlist(Link* plist)
{
Node* psave;
while (plist->list = NULL)
{
psave = plist->list->next;
free(plist->list);
plist->list = psave;
}
}
/*链表实现书籍的输出 */
void allbooktitle(Link* plist)
{
bool right;
EmptyTheLlist(plist);
FILE* fpuser;
fpuser = fopen("书籍", "r");
char bookname[10];
InitializeList(plist);
while (fscanf(fpuser, "%s", bookname) == 1)
{
right = AddItem(bookname, plist);
if(right == false){
return;
}
}
Traverse(plist, ShowItem, NULL);
fclose(fpuser);
printf("\n");
}
library2.c
#include<stdio.h> //图书馆管理系统面向多用户,最多可借十本书
#include<string.h>
#include<stdlib.h>
#include<stdbool.h> //书籍管理者,账号 :management 密码:777
#include"manage.h"
FILE *ma;
FILE *fp, *yh, *pt, *yh1;
int a=1;
int main(void)
{
bool right;
int number;
Link plink;
int bookamount, i=0, sizename;
char title[10], title1[10], returnbook[10];
char username[20], username1[20], username2[20], password[10], password1[10];
char simplebook[10], allbook[10][10] = {"1","1","1","1","1","1","1","1","1","1"};
printf("==========欢迎来到图书馆==========\n");
break1: printf("1:登录\n2:注册\n3:退出\n输入操作序号:");
number = number_1(); //返回操作数字
if (number == 3) {
exit_t(&plink);
}
printf("用户名:");
scanf("%s", &username);
printf("密码:");
scanf("%s", &password);
char content[20] = "目录#";
strcpy(username2, username);
strcat(username2, "||");
strcat(content, username);
strcat(username, "||");
strcat(username, password); //合并用户名和密码
/*登录*/
if (number == 1){
fp = fopen("userinfo1", "r");
while (fscanf(fp, "%s", username1) == 1){
if (strcmp(username,username1) != 0)
a = 0; //用户名和密码验证
else{
printf("登录成功!\n");
a = 1;
break;
}
}
if(a == 0){
printf("登录失败!用户或密码错误!\n");
goto break1;
}
}
else if (number == 2) /*注册*/
{
printf("密码确认:");
scanf("%s", &password1);
sizename = sizeusername(username2); //返回输入了多少个字符串
fp = fopen("userinfo1", "r"); //验证用户名是否重复
while (fscanf(fp,"%s",username1) == 1) {
if (strncmp(username1, username2, sizename) == 0) {
printf("用户名重复!\n");
fclose(fp);
goto break1;
}
}
fclose(fp);
if (strcmp(password, password1) != 0) {
printf("注册失败!密码不一致。\n");
goto break1;
}
else {
printf("注册成功!\n");
strcat(username, "\n"); //合并换行,加入换行是为了更好的在文件中显示
fp = fopen("userinfo1", "a+");
fprintf(fp, username);
}
}
if (strncmp(username, "management||", 7) != 0); //判断是否为管理员,如果是管理员跳转
else management(&plink);
allbooktitle(&plink);
//借书还书
break2: printf("1:借书\n2:还书\n3:退出\n输入操作序号:");
number = number_1();
yh = fopen(content, "a+");
if (number == 1) //借书,限制借书本数10本
{
bookamount = 0;
while (fscanf(yh, "%s", title1) == 1)
bookamount++;
if (bookamount < 10) {//判断借书是否超过10本
printf("输入借书名称:");
scanf("%s", title);
yh1 = fopen(content, "r");
while (fscanf(yh1, "%s", title1) == 1) {
if (strcmp(title1, title) == 0) {
printf("已借此书!\n");
fclose(yh1);
goto break2;
}
}
fclose(yh1);
right = Traverse(&plink, NULL, title);
if (right == false) {
printf("查无此书!\n");
goto break2;
}
strcat(title, "\n");
fprintf(yh, title);
fclose(yh);
printf("借书成功!\n");
goto break2;
}
else {
printf("借书数量以上线,请还书!\n");
goto break2;
}
}
else if (number == 2 ){ //还书
a = 0;
printf("已借书目录:\n"); //打印已借书目录
while (fscanf(yh, "%s", title1) == 1) {
a++;
printf(" %-15s ", title1);
if (a % 5 == 0)
printf("\n");
}
printf("\n还书名称:");
scanf("%s", returnbook);
fseek(yh,0L, SEEK_SET);
while (fscanf(yh, "%s", title1) == 1)
{
a =1 ;
if (strcmp(title1, returnbook) == 0) {//检查是否有此书,返回为0则有
bookamount = 0;
fseek(yh, 0L, SEEK_SET);
while (fscanf(yh, "%s", simplebook) == 1) { //将已借的书储存在数组中
strcpy(allbook[bookamount], simplebook);
bookamount++;
}
fclose(yh);
pt = fopen(content, "w");
for(i=0; i<10; i++) {
if (strcmp(allbook[i],"1") == 0)
break;
if (strcmp(allbook[i], returnbook) != 0) {
strcat(allbook[i], "\n");
fprintf(pt, allbook[i]);
}
}
printf("还书成功!\n");
fclose(pt);
break;
}
else a = 0;
}
if (a == 1);
else
printf("查无此书!请重新操作。\n");
goto break2;
}
else //退出
exit_t(&plink);
return 0;
}