问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
运行结果及报错内容
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
typedef struct book
{
char bnum[10];//书籍编号
char bname[30];//书名
char bauthor[20];//作者
char bclassfy[10];//类别编号
float bprice;//价格
int quantity;//数量
struct book* next;//链表指针
}BookInfo;
BookInfo* CreateBooksList();//创建链表
void Insert(BookInfo* head);//插入
void Delete(BookInfo* head);//删除
void Print(BookInfo* head);//浏览
void Search(BookInfo* head);//查询
void Update(BookInfo* head);//修改
void Save(BookInfo* head);//保存
void Borrowedbooks();//图书借阅
typedef struct User
{
char name[10];//名字
char password[10];//密码
char book[10];//借的书
struct User* next; //下一位用户
}user;
struct bk//查找
{
char bnum[10];//书籍编号
char bname[30];//书名
char bauthor[20];//作者
char bclassfy[10];//类别编号
float bprice;//价格
int quantity;//数量
};
struct ur//查找
{
char name[10];//名字
char password[10];//密码
char book[10];//借的书
};
user* CreateusersList();//创建链表
void userInsert(user* head);//注册用户信息
void userDelete(user* head);//删除用户
void userprint(user* head);//浏览用户
user* serch_username(char* name);//根据名字查找用户
void user_login(); //用户登录
void userUpdate(user* head);//更改用户信息
void userSave(user* head);//保存用户信息
int usermenu();//用户系统
void adminlogin();//管理员登录
//创建用户名单
user* CreateusersList()
{
user* head;
head=(user*)malloc(sizeof(user));//为头结点分配空间
head->next=NULL;//初始化头指针
return head;
}
//注册用户信息
void userInsert(user* head)
{
user *b, *p;
char flag='Y';
p=head;
while (p->next !=NULL)
p=p->next;
//开辟新空间,存储用户信息,并加入链表
while (flag=='Y'||flag=='y')
{
b=(user*)malloc(sizeof(user));//开辟新空间
printf("请输入用户名:");//获取名称信息
fflush(stdin); //清空缓存区
scanf("%s",b->name);
printf("请输入密码:");
fflush(stdin);
scanf("%s",b->password);
p->next=b;//将新增加的节点加入链表
p=b;//指针p向后移动,指向尾结点
b->next=NULL;
printf("注册成功!\n");
fflush(stdin);
break;
}
return;
}
user* user_head; //用户头指针
user* serch_username(char* name) //查找用户名
{
user* np = user_head->next;
while (np)
{
if (!strcmp(np->name, name)) return np;
np = np->next;
}
return NULL;
}
//用户登录
void user_login() //用户登录
{
char name[30];
char password[30];
printf("请输入您的用户名(不超过10个字母):\n");
scanf("%s", name);
printf("请输入您的账号密码(不超过10个字母):\n");
scanf("%s", password);
int i,j=0;
FILE* fp;
struct ur u;
fp=fopen("F:\\c语言课设\\userslist.txt","r");
if(j=0)
{
for(i=0;i<10;i++)
{
fscanf(fp,"%s %s %s\n",&u.name,&u.password,&u.book);
if(strcmp(u.name,name)==0&&strcmp(u.password,password)==0)
{
printf("恭喜您登录成功,即将跳转用户界面...\n");
system("cls");
j=1;
usermenu();
}
}
fclose(fp);
}
if(j=0)
{
printf("用户名或密码错误\n");
}
}
//
//删除用户
void userDelete(user* head)
{
user *b, *p;
char tmp[30];
int flag;
flag=0;
b=head;
p=head;
printf("请输入要删除的用户名:");
fflush(stdin);
scanf("%s",tmp);
//遍历链表
while (p!=NULL)
{
if(strcmp(p->name,tmp)==0)
{
flag=1;
break;
}
p=p->next;
}
if (flag==1)
{
for (;b->next !=p;)
{
b=b->next;
}
b->next=p->next;
free(p);
printf("删除成功!\n");
}
else
printf("该用户不存在!");
return;
}
//浏览用户
void userprint(user* head)
{
user *p;
FILE *fp;
fp=fopen("F:\\c语言课设\\userslist.txt","r");
rewind(fp);
char ch=fgetc(fp);
while(ch!=-1)
{
putchar(ch);
ch=fgetc(fp);
}
fclose(fp);
}
//查找用户
void userSearch(user* head)
{
user *p;
char tmp[30];
int flag=0;
p=head;
if(head==NULL||head->next==NULL)
{
printf("清单为空!\n");
}
else
{
printf("请输入用户名:");
fflush(stdin);
scanf("%s",tmp);
while(p->next !=NULL)
{
p=p->next;
if(strcmp(p->name,tmp)==0)
{
flag=1;
printf("用户名:%s\n",p->name);
return;
}
if(p->next==NULL)
{
printf("\n查询完毕!");
}
}
if(flag==0)
{
printf("没有找到该用户!\n",tmp);
}
}
return;
}
//保存用户信息
void userSave(user* head)
{
user *p;
FILE *fp;
p=head;
//以只写的方式打开文件
fp=fopen("F:\\c语言课设\\userslist.txt","a");
while (p->next !=NULL)
{
p=p->next;
fprintf(fp,"%-6s %-10s\n",p->name,p->password);
}
fclose(fp);
printf("保存成功!\n");
printf("数据已成功保存到F:\\c语言课设\\userslist.txt\n");
}
int menu();//菜单
//创建书单
BookInfo* CreateBooksList()
{
BookInfo* head;
head=(BookInfo*)malloc(sizeof(BookInfo));//为头结点分配空间
head->next=NULL;//初始化头指针
return head;
}
//插入记录
void Insert(BookInfo* head)
{
BookInfo *b, *p;
char flag='Y';
p=head;
while (p->next !=NULL)
p=p->next;
//开辟新空间,存储书籍信息,并加入链表
while (flag=='Y'||flag=='y')
{
b=(BookInfo*)malloc(sizeof(BookInfo));//开辟新空间
printf("请输入图书编号:");//获取书籍信息
fflush(stdin); //清空缓存区
scanf("%s",b->bnum);
printf("请输入书名:");
fflush(stdin);
scanf("%s",b->bname);
printf("请输入作者:");
fflush(stdin);
scanf("%s",b->bauthor);
printf("请输入类别编号:");
fflush(stdin);
scanf("%s",b->bclassfy);
printf("请输入图书价格:");
fflush(stdin);
scanf("%f",&b->bprice);
printf("请输入图书数量:");
fflush(stdin);
scanf("%d",&b->quantity);
p->next=b;//将新增加的节点加入链表
p=b;//指针p向后移动,指向尾结点
b->next=NULL;
printf("添加成功!\n继续添加?(Y/N):");
fflush(stdin);
scanf("%c",&flag);
if(flag=='N'||flag=='n')break;
else if (flag=='Y'||flag=='y')continue;
}
return;
}
//删除记录
void Delete(BookInfo* head)
{
BookInfo *b, *p;
char tmp[30];
int flag;
flag=0;
b=head;
p=head;
printf("请输入要删除的书籍名:");
fflush(stdin);
scanf("%s",tmp);
//遍历链表
while (p!=NULL)
{
if(strcmp(p->bname,tmp)==0)
{
flag=1;
break;
}
p=p->next;
}
if (flag==1)
{
for (;b->next !=p;)
{
b=b->next;
}
b->next=p->next;
free(p);
printf("删除成功!\n");
}
else
printf("该书不存在!");
return;
}
//浏览书单
void print(BookInfo* head)
{
BookInfo *p;
FILE *fp;
fp=fopen("F:\\c语言课设\\bookslist.txt","r");
rewind(fp);
printf("-----------------------------------------------------\n");
printf("|编号 |书名 |作者 |类别编号 |价格 |数量 |\n");
printf("-----------------------------------------------------\n");
char ch=fgetc(fp);
while(ch!=-1)
{
putchar(ch);
ch=fgetc(fp);
}
fclose(fp);
}
//查找书籍
void Search(BookInfo* head)
{
BookInfo *p;
char tmp[30];
int flag=0;
p=head;
if(head==NULL||head->next==NULL)
{
printf("清单为空!\n");
}
else
{
printf("请输入书籍名:");
fflush(stdin);
scanf("%s",tmp);
while(p->next !=NULL)
{
p=p->next;
if(strcmp(p->bname,tmp)==0)
{
flag=1;
printf("编号:%s\n 书名:《%s》\n作者:%s\n分类:%s\n价格:%.2f\n",p->bnum,p->bname,p->bauthor,p->bclassfy,p->bprice);
return;
}
if(p->next==NULL)
{
printf("\n查询完毕!");
}
}
if(flag==0)
{
printf("没有找到《%s》!\n",tmp);
}
}
return;
}
void creat_user_list(char* name, char* password) //创建用户链表
{
user* head;
user* np = (user*)malloc(sizeof(user));
np = user_head;
while (np->next) np = np->next;
User* tp = (user*)malloc(sizeof(user));
strcpy(tp->name, name);
strcpy(tp->password, password);
tp->next = NULL;
np->next = tp;
userSave(head);
}
//修改信息
void Update(BookInfo* head)
{
BookInfo *p;
int flag=0;
char tmp[30];
p=head;
printf("请输入书名:");
fflush(stdin);
scanf("%s",tmp);
while(p->next!=NULL)
{
p=p->next;
if(strcmp(p->bname,tmp)==0)
{
flag=1;//标志找到所要修改修改的书籍
printf("请输入编号:");
fflush(stdin);
scanf("%s",p->bnum);
printf("请输入书名:");
fflush(stdin);
scanf("%s",p->bname);
printf("请输入作者:");
fflush(stdin);
scanf("%s",p->bauthor);
printf("请输入类别编号:");
fflush(stdin);
scanf("%s",p->bclassfy);
printf("请输入价格:");
fflush(stdin);
scanf("%s",p->bprice);
}
}
if (flag==0)
{
printf("没有找到《%s》!\n",tmp);
}
return;
}
//保存书单到文件
void Save(BookInfo* head)
{
BookInfo *p;
FILE *fp;
p=head;
//以只写的方式打开文件
fp=fopen("F:\\c语言课设\\bookslist.txt","a");
while (p->next !=NULL)
{
p=p->next;
fprintf(fp,"%-6s %-10s %-10s %-10s %.2lf %d\n",p->bnum,p->bname,p->bauthor,p->bclassfy,p->bprice,p->quantity);
}
fclose(fp);
printf("保存成功!\n");
printf("数据已成功保存到F:\\c语言课设\\bookslist.txt\n");
}
void user_register() //用户注册
{
char name[30];
printf("请输入您需要注册的用户名(不超过25个字母):\n");
scanf("%s", name);
User* account;
while (account = serch_username(name), account != NULL)
{
printf("该用户名已存在,请重新输入!\n");
scanf("%s", name);
}
printf("请输入您的账号密码(不超过25个字母):\n");
char password[30];
scanf("%s", password);
creat_user_list(name, password);
printf("恭喜您注册成功!\n");
}
//菜单
void main_menu() //主菜单
{
user *head;
BookInfo *headd;
int a,b,c,d;
head=NULL;
while (1)
{
printf("+---------------------------------------------+\n");
printf("* 欢迎进入本图书管理系统! *\n");
printf("* 请输入选项前的数字以确认操作! *\n");
printf("* 1、用户注册 *\n");
printf("* 2、用户登陆 *\n");
printf("* 3、管理员登陆 *\n");
printf("* 0、退出 *\n");
printf("+---------------------------------------------+\n");
int op;
scanf("%d", &op);
switch (op)
{
case 1: if(head==NULL)
{
head=CreateusersList();
}
userInsert(head);
userSave(head);
break;
case 2: user_login();
usermenu();
b=usermenu();
switch (b)
{
case 1:print(headd); usermenu();
case 2:Search(headd); usermenu();
case 3:Borrowedbooks(); usermenu();
case 4:
case 5:userSave(head); usermenu();
case 6:exit(0); break;
}
break;
case 3: adminlogin(); break;
case 0: exit(0); break;
default: printf("错误的指令,请重新输入!\n");
}
}
}
int adminmenu()
{
int sec;
user *head;
BookInfo *headd;
headd=NULL;
printf(" 管理员系统 \n");
printf("-----------------------------------------------------\n");
printf(" 1-图书信息录入\n");
printf(" 2-图书信息浏览\n");
printf(" 3-图书信息查询\n");
printf(" 4-图书信息修改\n");
printf(" 5-图书信息删除\n");
printf(" 6-图书信息保存\n");
printf(" 7-删除用户\n");
printf(" 8-浏览用户\n");
printf(" 9-退出\n");
printf("-----------------------------------------------------\n");
printf("请选择:");
fflush(stdin);
scanf("%d",&sec);
switch (sec)
{
case 1:
if(headd==NULL)
{
headd=CreateBooksList();
}
Insert(headd);
Save(headd);
break;
case 2:print(headd); break;
case 3:Search(headd); break;
case 4:Update(headd); break;
case 5:Delete(headd); break;
case 6:Save(headd); break;
case 7:
case 8:
case 9:exit(0); break;
}
while(sec>7||sec<0)
{
printf("选择有误!\n请重新输入:");
scanf("%d",&sec);
}
return sec;
}
//管理员登录
void adminlogin()
{
char tmp[30];
char tmpp[30];
int flag=0;
printf("请输入用户名:");
fflush(stdin);
scanf("%s",tmp);
printf("请输入密码:");
fflush(stdin);
scanf("%s",tmpp);
if(strcmp("dyq",tmp)==0&&strcmp("123",tmpp)==0)
{
flag=1;
printf("登陆成功\n");
system("cls");
adminmenu();
}
if(flag==0)
{
printf("用户名或密码错误!\n",tmp);
}
return;
}
int usermenu()
{
int b;
printf(" 用户系统 \n");
printf("-----------------------------------------------------\n");
printf(" 1-图书信息浏览\n");
printf(" 2-图书信息查询\n");
printf(" 3-图书借阅\n");
printf(" 4-图书归还\n");
printf(" 5-保存用户信息\n");
printf(" 6-退出\n");
printf("-----------------------------------------------------\n");
printf("请选择:");
fflush(stdin);
scanf("%d",&b);
while(b>6||b<0)
{
printf("选择有误!\n请重新输入:");
scanf("%d",&b);
}
return b;
}
int tjzs()//统计图书文本个数
{
FILE *fp;
int n;
float bprice=0;
int quantity=0;
char bum[10]={'\0'},bname[30]={'\0'},bauthor[20]={'\0'},bclassfy[10]={'\0'};
fp=fopen("library.txt","r");//打开文件
for (n=0;!feof(fp);n++)//逐个读文件
fscanf(fp,"%-6s %-10s %-10s %-10s %.2lf %d\n",bum,bname,bauthor,bclassfy,&bprice,&quantity);
n--;
fclose(fp);//关闭文件
return (n);//返回个数
}
void Borrowedbooks()//借书函数
{
FILE *fp,*fp3;
BookInfo *head=NULL;
BookInfo *p,*p1,*p2;
int i,loop,k,n=0,flag=0,s=0;
int quantity=0;
float bprice=0;
char bnum[10]={'\0'},bname[30]={'\0'},bauthor[20]={'\0'},bclassfy[10]={'\0'},
name[30]={'\0'},password[30]={'\0'},riqi[20]={'\0'},book[10];
char hit=0;
printf("\n请输入借阅书名:\n请输入:");
scanf("%s",book);
k= tjzs();//统计图书馆文件个数
for (i=0;i<k;i++)//先将图书信息建立链表,更改库存
{
fscanf(fp,"%-6s %-10s %-10s %-10s %.2lf %d\n",bnum,bname,bauthor,bclassfy,&quantity,&bprice);
n++;
if(n==1)
{
p1=p2=(BookInfo*)malloc(sizeof(BookInfo));
head=p1;
}
else
{
p2->next=p1;
p2=p1;
p1=(BookInfo*)malloc(sizeof(BookInfo));
}
strcpy(p1->bnum,bnum);//复制书号
strcpy(p1->bname,name);//复制书名
strcpy(p1->bauthor,bauthor);//复制作者
strcpy(p1->bclassfy,bclassfy);//复制出版社
p1->quantity=quantity;//复制现存量
p1->bprice=bprice;//复制单价
}
if(n==0)
head=NULL;
else
{
p2->next=p1;
p1->next=NULL;
fclose(fp);
}
p=head;
for (;p!=NULL;)
{
if(!(strcmp(p->bname,book)))//判断要借书的是否存在,标记等于1,存在库存减一
{
flag=1;
loop=p->quantity;
(p->quantity)--;
}
p=p->next;
}
if(flag&&(loop>0))//存在被借的图书且现存量大于0,把库存量变化后的链表存入文件
{
fp=fopen("F:\\c语言课设\\bookslist.txt","w");
fclose(fp);
fp=fopen("F:\\c语言课设\\bookslist.txt","a");
p=head;
for(;p !=NULL;)
{
fprintf(fp,"%-6s %-10s %-10s %-10s %.2lf %d\n",p->bnum,p->bname,p->bauthor,p->bclassfy,p->bprice,p->quantity);
p=p->next;
}
free(p);
fclose(fp);
if ((fp3=fopen("F:\\c语言课设\\userslist.txt","r"))==NULL)//建读者文件夹存入借书信息
{
fp3=fopen("F:\\c语言课设\\userslist.txt","w");//打开只读文件
fclose(fp3);
}
fp3=fopen("F:\\c语言课设\\userslist.txt","a");
printf("\n请按以下格式输入读者信息:\n姓名 密码 借书书名\n请输入:");//录入读者信息
scanf("%d %s %s %s",&name,password,book);
fprintf(fp,"%s %s %s\n",name,password,book);
fclose(fp3);
printf("借书成功!请两个月内归还!!!按任意键返回\n");
usermenu();//调用借阅系统
}
else
{
if(flag!=0)
printf("此书已被借完!按任意键返回!");//否则输出此书已被借完
else
printf("查找无此书!按任意键返回");
}
usermenu();//调用借阅系统
}
int main()
{
user *head;
BookInfo *headd;
int a,b,c,d;
head=NULL;
for (;;)
{
main_menu();
}
return 0;
}
我的解答思路和尝试过的方法
我想要达到的结果