c语言 图书馆 帮忙看一下谢谢!

NUMBER962497 2015-06-01 11:00:45
运行时按1,然后再查找图书,最后查找全部
结果

程序的部分:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <windows.h>
struct ts
{
int lx;
char tsm[100];
char bh[30];//bian hao
char zz[20];
double jg;
int bs;//ben shu
struct ts *next;
};

//子函数声明
void yonghu();
void Admincd();
void studentcd();
struct ts *zjts();
void czts();//查找图书
void WriteData_wb(struct ts *head);
void WriteData_ab(struct ts *head);
void cztscd();//查找图书菜单
void czall();//查找全部
main()
{
/*int system(const char *string);//清屏 system("cls");*/
yonghu();
}//子函数
void yonghu()
{
int i,j=0;
char c, mi[20];
printf("请选择用户类型登陆(管理员请选择1 学生请选择2):");
scanf("%d", &i);
if (i == 1)
{
Admincd();
}
if (i == 2)
{
studentcd();
}
}

void Admincd()
{
int gnsz;
printf("================================================================================");
printf("| |");
printf("| ***图书馆管理*** |");
printf("| |");
printf("| 1.增加图书 2.查找图书 |");
printf("| 3.修改图书数据 4.删除图书 |");
printf("| 5.退出 |");
printf("| |");
printf("| |");
printf("================================================================================");
printf("请输入相应功能的数字:\n ");
scanf("%d", &gnsz);//输入功能数字
switch (gnsz)
{
case 1:WriteData_wb(zjts()); printf("\n**数据已成功保存**\n"); printf("请按任意键返回主菜单!"); system("pause"); system("cls"); Admincd(); break;
case 2:czts(); break;
case 5:printf("请按任意键退出!"); break;
default:printf("请输入0-6范围内的数字!"); Admincd();
}
}
void studentcd()
{
int gnsz,i;
printf("================================================================================");
printf("| |");
printf("| ***图书馆学生管理*** |");
printf("| 1.查找图书 2.借阅图书 |");
printf("| 3.归还图书 |");
printf("| |");
printf("================================================================================");
printf("请输入相应功能的数字:\n ");
scanf("%d", &gnsz);//输入功能数字
switch (gnsz)
{
case 1:zjts(); scanf("%d",&i); break;

default:printf("请输入0-6范围内的数字!");
}
}
struct ts *zjts()
{
struct ts *p1, *p2, *head;
int temp;
p1 = p2 = head = NULL;
printf("请输入一个学生,以回车分开\n");
while (1)
{
p1 = (struct ts *)malloc(sizeof(struct ts));
printf("\n请选择图书类型:");
printf("(1.哲学、宗教 2.社会科学总论 3.军事 4.经济 5.文学 6.数理科学和化学 7.综合性图书)\n ");
scanf("%d", &p1->lx);
printf("输入图书名称:\n ");
scanf("%s", p1->tsm);
printf("请输入图书编号:\n ");
scanf("%s", p1->bh);
printf("请输入图书作者姓名:\n ");
scanf("%s", p1->zz);
printf("图书价格:\n ");
scanf("%d", &p1->jg);
printf("请输入存本数:\n ");
scanf("%d", &p1->bs);
if (p2 != NULL)
{
p2->next = p1;
}
else
{
head = p1;
}
printf("是否继续输入?(是的话输入1,不是的话输入0):");
scanf("%d", &temp);
if (0 == temp)
{
p1->next = NULL;
break;
}
p2 = p1;
}

return head;
}
void czts()
{
int i;
cztscd();
printf("请输入相应功能数字:");
scanf("%d", &i);
switch (i)
{
case 1:czall(); break;
/*case 2:cztsm(); break;
case 3:czzz(); break;
case 4:czmh(); break;*/
case 5:Admincd(); break;
default:printf("请输入正确的数字!"); cztscd(); break;
}
}

struct ts *ReadData(void)
{
struct ts *head = NULL;
struct ts *p1, *p2;//s = p1;p = p2;

FILE *fp;
if ((fp = fopen("book.txt","rb+")) == NULL)
{
printf("打开文件出错\n");
exit(0);
}
while (!feof(fp)) {
if ((p1 = (struct ts*)malloc(sizeof(struct ts))) == NULL)
{
printf("内存申请出错\n");
fclose(fp);
exit(0);
}
if (fread(p1, sizeof(struct ts), 1, fp) != 1)
{
free(p1);
break;
}
if (head == NULL)
head = p2 = p1;
else{
p2->next = p1;
p2 = p1;
}
}
fclose(fp);
return (head);
}
void WriteData_wb(struct ts *head) {
FILE *fp;
struct ts *p;
if ((fp = fopen("book.txt", "wb")) == NULL)
printf("\a error! Can not open the file!");
p = head;
while (p != NULL) {
if (fwrite(p, sizeof(struct ts), 1, fp) != 1) {
printf("写入数据出错\n");
fclose(fp);
return;
}
p = p->next;
}
fclose(fp);
}
void WriteData_ab(struct ts *head) {
FILE *fp;
struct ts *p;
if ((fp = fopen("book.txt", "ab")) == NULL)
printf("\a error! Can not open the file!");
p = head;
while (p != NULL) {
if (fwrite(p, sizeof(struct ts), 1, fp) != 1) {
printf("写入数据出错\n");
fclose(fp);
return;
}
p = p->next;
}
fclose(fp);
}
void cztscd()
{
printf("================================================================================");
printf("| |");
printf("| ***查找图书*** |");
printf("| 1.查找全部 2.书名查询 |");
printf("| 3.作者查询 4.模糊查询 |");
printf("| 5.返回菜单 |");
printf("| |");
printf("================================================================================");
}
void czall()
{
int i;
struct ts *pt;
pt = ReadData();
do {
printf("%d %s %s %s %lf %d\n",
&pt->lx, pt->tsm, pt->bh, pt->zz, &pt->jg, &pt->bs);
pt = pt->next;
} while (pt != NULL);
printf("\n");

}
...全文
223 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hgj_1992 2015-06-03
  • 打赏
  • 举报
回复
struct ts *ReadData(void) 中的p2未初始化
ralln 2015-06-03
  • 打赏
  • 举报
回复
这里你用的是do...while,至少执行了一次,用while(){}能更好点
ralln 2015-06-03
  • 打赏
  • 举报
回复
void czall() { int i; struct ts *pt; pt = ReadData(); do { printf("%d %s %s %s %lf %d\n", &pt->lx, pt->tsm, pt->bh, pt->zz, &pt->jg, &pt->bs); pt = pt->next; } while (pt != NULL); printf("\n"); } 问题在这里,如果函数执行失败,传回来一个空指针,你对空指针进行操作当然报错
ralln 2015-06-03
  • 打赏
  • 举报
回复
请选择用户类型登陆(管理员请选择1 学生请选择2):1 ================================================================================ | | | ***图书馆管理*** | | | | 1.增加图书 2.查找图书 | | 3.修改图书数据 4.删除图书 | | 5.退出 | | | | | ================================================================================ 请输入相应功能的数字: 2 ================================================================================ | | | ***查找图书*** | | 1.查找全部 2.书名查询 | | 3.作者查询 4.模糊查询 | | 5.返回菜单 | | | ================================================================================ 请输入相应功能数字:1 打开文件出错 Press any key to continue
赵4老师 2015-06-01
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧