链表 删除
音像图书租借管理系统,运行后发现同一个人同时借几本书,当还了第一本书后,该租借者所有的借书数据都被删除了,要怎么改才能只删除已还书的那部分数据?(以下是部分代码)#include<stdio.h> #define Max 100 #include<string.h>#include<conio.h>#include<stdlib.h>struct date{ //租借&归还日期 int year; char ch1; int month; char ch2; int day; };struct library{ //音像图书库 char bianhao; char name; int price; int amount; int shengyu; }; struct borrower{ //租借者信息 char uname; char bianhao; struct date borrow; int money; struct date back; int rent; };char mima1; void print(); void mima(); void build_book(); //创建音像图书库 void borrow_book(); //租借音像图书 void back_book(); //归还音像图书 void buy_book(); //购进音像图书 void scrap_book(); //报废音像图书 void storage_book(); //图书库存储概况 int borrow_day(struct borrower e); //计算租借的天数void print(){ system("cls");printf("\t\n" "\t\n" "\t\n" "\t |------------------------------------------|\t\n" "\t | 音像租借管理系统 |\t\n" "\t |------------------------------------------|\t\n" "\t | 请输入选项编号(0-6) |\t\n" "\t |------------------------------------------|\t\n" "\t | . 1--创建音像图书库 |\t\n" "\t | . 2--租借音像图书 |\t\n" "\t | . 3--归还音像图书 |\t\n" "\t | . 4--购进音像图书 |\t\n" "\t | . 5--报废音像图书库 |\t\n" "\t | . 6--音像图书库概况 |\t\n" "\t | . 0--退出系统 |\t\n" "\t |------------------------------------------|\t\n");} int main(void){ char choice,yesno; char op; int i=0,pnum=0; char psword; fflush(stdin); //密码功能 printf("\n"); printf("\n"); printf("\n"); printf(" 【欢迎使用音像租借管理系统】 \n"); printf("\n"); printf(" 请输入登录密码:"); do{ i=0; while((psword=getch())!='\r'){ printf("*"); i++; } psword='\0'; printf("\n"); if(strcmp(psword,"123456")==0){ printf(" 密码正确!\n"); do{ print(); printf(" "); fflush(stdin); scanf(" %c",&choice); switch(choice) { case '1':build_book(); break; case '2':borrow_book(); break; case '3':back_book(); break; case '4':buy_book(); break; case '5':scrap_book(); break; case '6':storage_book(); break; case '0':system("cls"); printf("\n"); printf("\n"); printf("\t\t\t--------------------------------------------\t\n"); printf("\t\t\t|感谢使用本软件!已正常退出,按任意键结束。|\t\n"); printf("\t\t\t--------------------------------------------\t\n"); exit(0); default:printf("\n 没有选项为%c的选项!\n",choice); printf("\n 请输入任意键继续!"); }printf("\n 要进入主菜单吗(y/n)?\n"); fflush(stdin); yesno=getchar(); if(yesno!='y'&&yesno!='Y'&&yesno!='N'&&yesno!='n'){ printf("\n 请重新输入(y/n)!\n"); fflush(stdin); yesno=getchar(); } else if(yesno=='N'||yesno=='n'){ system("cls"); printf("\n"); printf("\n"); printf("\t\t\t--------------------------------------------\t\n"); printf("\t\t\t|感谢使用本软件!已正常退出,按任意键结束。|\t\n"); printf("\t\t\t--------------------------------------------\t\n"); exit(0); } }while(yesno=='Y'||yesno=='y');}else{ pnum++; if(pnum==1) printf(" 还有两次机会,请输入密码:"); else if(pnum==2) printf(" 最后一次机会,请输入密码:"); else if(pnum>=3){ printf(" 错误超过3次,结束!\n"); return 0; } } }while(pnum<3); //最多允许输3次}//创建音像图书库 void build_book() { char ch,op; struct library a; FILE *fp1=NULL; fflush(stdin); fp1=fopen("d:\\Library.txt","a"); if(fp1==NULL){ printf("\n文件打开错误!\n"); exit(0); } printf("\n 请输入音像图书的编号(B_**、V_**和R_**):"); scanf("%s",a.bianhao); strcpy(ch,a.bianhao); if(ch!='B'&&ch!='V'&&ch!='R'){ printf(" 非法输入!\n"); printf(" 请按任意键重新输入!"); op=getchar(); op=getchar(); build_book(); } printf(" 请输入音像图书的名称:"); scanf("%s",a.name); printf(" 请输入音像图书的原价:"); scanf("%d",&a.price); printf(" 请输入音像图书的原数量:"); scanf("%d",&a.amount); printf(" 请输入音像图书的剩余数量:"); scanf("%d",&a.shengyu); if(a.amount <=a.shengyu ){ printf(" 原数量不得小于剩余数量!请重新输入!\n"); printf(" 请输入音像图书的原数量:"); scanf("%d",&a.amount); printf(" 请输入音像图书的剩余数量:"); scanf("%d",&a.shengyu);} fprintf(fp1,"%s\t%s\t%d\t%d\t%d\n",a.bianhao,a.name,a.price,a.amount,a.shengyu); if(fclose(fp1)){ printf("不能关闭文件!\n"); exit(0); } printf("\n 创建音像图书《%s》成功!\n",a.name); printf("\n 输入任意键继续!\n"); op=getchar(); op=getchar(); system("cls"); } //租借音像图书 void borrow_book() { struct library a={0},b={0},*p1=NULL,*p2=NULL; //b为结构数组 struct borrower c={0}; char ch={0},op; int n=0,m=0; FILE *fp1; FILE *fp2; fflush(stdin); if((fp1=fopen("d:\\borrow.txt","a"))==NULL){ printf("文件打开错误!\n"); exit(0); } if((fp2=fopen("d:\\Library.txt","r"))==NULL){ printf("文件打开错误!\n"); exit(0); } printf("请输入您的姓名: "); scanf("%s",c.uname); printf("请输入租借的书的编号: "); scanf("%s",c.bianhao); printf("请输入租借的日期(年/月/日): "); scanf("%d%c%d%c%d",&c.borrow.year,&c.borrow.ch1 ,&c.borrow.month,&c.borrow.ch2,&c.borrow.day); strcpy(ch,c.bianhao); fprintf(fp1,"%s\t%s\t%d%c%d%c%d ",c.uname ,c.bianhao,c.borrow.year,c.borrow.ch1,c.borrow.month,c.borrow.ch2,c.borrow.day); p1=b; while(feof(fp2)==0){ fscanf(fp2,"%s%s%d%d%d",p1->bianhao,p1->name,&p1->price,&p1->amount,&p1->shengyu); p1++; n++; } for(p1=b;p1<b+n;p1++) if(strcmp(c.bianhao,p1->bianhao)==0) { p2=p1; m=1; break; } if(m==0){ printf("无此音像图书!\n"); printf("输入任意键继续!\n"); op=getchar(); op=getchar(); } elseif((strcmp(ch,p2->bianhao)==0)&&(p2->shengyu==0)) { printf("\n此音像图书已全部借出!\n"); printf("输入任意键继续!\n"); op=getchar(); op=getchar(); } elseif((strcmp(ch,p2->bianhao)==0)&&(p2->shengyu!=0)) { printf("应交的押金额为 %d 元!",(p2->price)*3); c.money=(p2->price)*3; p2->shengyu=p2->shengyu-1; fprintf(fp1,"%d\n",c.money); fclose(fp1); fclose(fp2); printf("\n输入任意键继续!\n"); op=getchar(); op=getchar(); } if((fp2=fopen("d:\\Library.txt","w"))==NULL){ printf("文件打开错误!\n"); exit(0); } for(p1=b;p1<b+n;p1++) fprintf(fp2,"%s\t%s\t%d\t%d\t%d\n",p1->bianhao,p1->name,p1->price,p1->amount,p1->shengyu); system("cls"); fclose(fp2); } //归还音像图书 void back_book() { struct library a={0},b={0},*p1=NULL,*p2=NULL; //b为结构数组 struct borrower c={0},d={0},*p3=NULL,*p4=NULL; char ch={0},ch1,op; int day,n1=0,n2=0,m=0,rent,money_1; int x,i; int month_day={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}}; FILE *fp1; FILE *fp2; fflush(stdin); if((fp1=fopen("d:\\Library.txt","r"))==NULL){ printf("文件打开错误!\n"); exit(0); } if((fp2=fopen("d:\\borrow.txt","r"))==NULL){ printf("文件打开错误!\n"); exit(0); } printf("请输入您的名字: "); scanf("%s",c.uname); printf("请输入归还的书的编号:"); scanf("%s",c.bianhao); printf("请输入归还的日期(年/月/日):"); scanf("%d%c%d%c%d",&c.back.year,&c.back.ch1,&c.back.month,&c.back.ch2,&c.back.day); strcpy(ch,c.bianhao); strcpy(ch1,c.uname); //在文件中寻找被借的书 p1=b; p3=d; while(feof(fp1)==0){ fscanf(fp1,"%s%s%d%d%d",p1->bianhao,p1->name,&p1->price,&p1->amount,&p1->shengyu); p1++; n1++; } while(feof(fp2)==0){ fscanf(fp2,"%s%s%d%c%d%c%d%d",p3->uname ,p3->bianhao,&p3->borrow.year,&p3->borrow.ch1,&p3->borrow.month,&p3->borrow.ch2,&p3->borrow.day,&p3->money); p3++; n2++; } for(p1=b;p1<b+n1;p1++) if(strcmp(ch,p1->bianhao)==0){ p2=p1; break; } for(p3=d;p3<d+n2;p3++) if(strcmp(ch,p3->bianhao)==0&&strcmp(ch1,p3->uname)==0){ p4=p3; m=1; break; } //当输入的姓名或者借书的编号错误时 if(m==0){ printf("您没有借书记录!\n"); printf("输入y重新填写资料,输入n返回上一菜单!\n"); scanf(" %c",&op); if(op=='y') back_book(); if(op=='n') { system("cls"); main() ; } } printf("\n此音像图书名为《%s》 \n",p2->name); if((fp1=fopen("d:\\Library.txt","w"))==NULL){ printf("文件打开错误!\n"); exit(0); } p2->shengyu =p2->shengyu+1; for(p1=b;p1<b+n1;p1++) fprintf(fp1,"%s\t%s\t%d\t%d\t%d\n",p1->bianhao ,p1->name,p1->price,p1->amount ,p1->shengyu ); //计算租借的总天数 x=(p4->borrow.year%4==0&&p4->borrow.year%100!=0||p4->borrow.year%400==0); if(p4->borrow.year==c.back.year){ if(p4->borrow.month==c.back.month) day=c.back.day-p4->borrow.day; else { day=month_day-p4->borrow.day; for(i=p4->borrow.month+1;i<c.back.month;i++) day=day+month_day; day=day+c.back.day; } } else{ day=month_day-p4->borrow.day; for(i=p4->borrow.month+1;i<=12;i++) day=day+month_day; if(p4->borrow.year-c.back.year==1){ for(i=0;i<c.back.month;i++) day=day+month_day; day=day+c.back.day; } else{ if(x==0) day+=365; else day+=366; for(i=0;i<c.back.month;i++) day=day+month_day; day=day+c.back.day; } } printf("一共租借了 %d 天!\n",day); if(ch=='B') rent=day; if(ch=='V') rent=day*2; if(ch=='R') rent=day*3; if(rent>=p3->money) money_1=0; if(rent<p3->money) money_1=p3->money-rent; printf("已交押金 %d 元,应交租金 %d元,应退金额 %d 元\n",p4->money,rent,money_1); fclose(fp1); fclose(fp2); //删除租借者的信息 p3=d; n1=0; if((fp2=fopen("d:\\borrow.txt","r"))==NULL){ printf("文件打开错误!\n"); exit(0); } while(feof(fp2)==0){ fscanf(fp2,"%s%s%d%c%d%c%d%d",p3->uname ,p3->bianhao,&p3->borrow.year,&p3->borrow.ch1,&p3->borrow.month,&p3->borrow.ch2,&p3->borrow.day,&p3->money); p3++; n2++; } fclose(fp2); for(p3=d;p3<d+n1;p3++) if(strcmp(ch1,p3->uname)==0) { p4=p3; break; } if((fp2=fopen("d:\\borrow.txt","w"))==NULL){ printf("文件打开错误!\n"); exit(0); } for(p3=d;p3<d+n1-1;p3++){ if(strcmp(p4->uname,p3->uname)==0) break; else fprintf(fp1,"%s%s%d%c%d%c%d%d",p3->uname ,p3->bianhao,p3->borrow.year,p3->borrow.ch1,p3->borrow.month,p3->borrow.ch2,p3->borrow.day,p3->money); }printf("成功删除 %s 的信息!\n",p4->uname); printf("按任意键结束!");op=getchar();op=getchar();system("cls"); fclose(fp2); } 这是什么? 啊? 可能系统问题,上面代码有点乱,下面是重新整理的代码,只是一部分代码(删除信息部分在最下面两个模块),只需要大佬告诉我一下如何只删除已还书那部分数据即可。
#include<stdio.h>
#define Max 100
#include<string.h>
#include<stdlib.h>
struct date{ //租借&归还日期
int year;
char ch1;
int month;
char ch2;
int day; };
struct library{ //音像图书库
char bianhao;
char name;
int price;
int amount;
int shengyu;
};
struct borrower{ //租借者信息
char uname;
char bianhao;
struct date borrow;
int money;
struct date back;
int rent; };
void build_book(); //创建音像图书库
void borrow_book(); //租借音像图书
void back_book(); //归还音像图书
void buy_book(); //购进音像图书
void scrap_book(); //报废音像图书
void storage_book(); //图书库存储概况
int borrow_day(struct borrower e); //计算租借的天数
int main(void){
char choice;
char op;
do{
printf(" ------------------------------------------- \n\n");
printf(" 请输入选项编号(0-6) \n\n");
printf(" ------------------------------------------- \n\n");
printf(" . 1--创建音像图书库 \n");
printf(" . 2--租借音像图书 \n");
printf(" . 3--归还音像图书 \n");
printf(" . 4--购进音像图书 \n");
printf(" . 5--报废音像图书库 \n");
printf(" . 6--音像图书库概况 \n");
printf(" . 0--退出系统 \n\n");
printf(" ------------------------------------------- \n");
scanf(" %c",&choice);
switch(choice) {
case '1':build_book();
break;
case '2':borrow_book();
break;
case '3':back_book();
break;
case '4':buy_book();
break;
case '5':scrap_book();
break;
case '6':storage_book();
break; case '0':break;
default:printf("\n 没有选项为%c的选项!\n",choice);
printf("\n 请输入任意键继续!");
op=getchar();op=getchar();system("cls");
}
}while(choice!='0');
printf("\n感谢使用本软件!已正常退出,按任意键结束。\n");
return 0;
}
//创建音像图书库
void build_book() {
char ch,op;
struct library a;
FILE *fp1=NULL;
fflush(stdin);
fp1=fopen("d:\\Library.txt","a");
if(fp1==NULL){
printf("\n文件打开错误!\n");
exit(0);}
printf("\n 请输入音像图书的编号:");
scanf("%s",a.bianhao);
strcpy(ch,a.bianhao);
if(ch!='B'&&ch!='V'&&ch!='R'){
printf(" 非法输入!\n"); printf(" 请按任意键重新输入!");
op=getchar();
op=getchar();
build_book();}
printf(" 请输入音像图书的名称:");
scanf("%s",a.name);
printf(" 请输入音像图书的原价:");
scanf("%d",&a.price);
printf(" 请输入音像图书的原数量:");
scanf("%d",&a.amount);
printf(" 请输入音像图书的剩余数量:");
scanf("%d",&a.shengyu);
if(a.amount <=a.shengyu ){
printf(" 原数量不得小于剩余数量!请重新输入!\n");
printf(" 请输入音像图书的原数量:");
scanf("%d",&a.amount);
printf(" 请输入音像图书的剩余数量:");
scanf("%d",&a.shengyu);}
fprintf(fp1,"%s\t%s\t%d\t%d\t%d\n",a.bianhao,a.name,a.price,a.amount,a.shengyu);
if(fclose(fp1)){ printf("不能关闭文件!\n");
exit(0);}
printf("\n 创建音像图书《%s》成功!\n",a.name);
printf("\n 输入任意键继续!\n");
op=getchar();
op=getchar();
system("cls");
}
//租借音像图书
void borrow_book() {
struct library a={0},b={0},*p1=NULL,*p2=NULL; //b为结构数组
struct borrower c={0};
char ch={0},op;
int n=0,m=0;
FILE *fp1;
FILE *fp2;
fflush(stdin);
if((fp1=fopen("d:\\borrow.txt","a"))==NULL){
printf("文件打开错误!\n");
exit(0);}
if((fp2=fopen("d:\\Library.txt","r"))==NULL){
printf("文件打开错误!\n");
exit(0); }
printf("请输入您的姓名: ");
scanf("%s",c.uname);
printf("请输入租借的书的编号: ");
scanf("%s",c.bianhao);
printf("请输入租借的日期(年/月/日): ");
scanf("%d%c%d%c%d",&c.borrow.year,&c.borrow.ch1 ,&c.borrow.month,&c.borrow.ch2,&c.borrow.day);
strcpy(ch,c.bianhao);
fprintf(fp1,"%s\t%s\t%d%c%d%c%d ",c.uname ,c.bianhao,c.borrow.year,c.borrow.ch1,c.borrow.month,c.borrow.ch2,c.borrow.day);
p1=b;
while(feof(fp2)==0){
fscanf(fp2,"%s%s%d%d%d",p1->bianhao,p1->name,&p1->price,&p1->amount,&p1->shengyu);
p1++;
n++;
}
for(p1=b;p1<b+n;p1++)
if(strcmp(c.bianhao,p1->bianhao)==0) {
p2=p1;
m=1;
break;
}
if(m==0){
printf("无此音像图书!\n");
printf("输入任意键继续!\n");
op=getchar();
op=getchar();
}
elseif((strcmp(ch,p2->bianhao)==0)&&(p2->shengyu==0)) {
printf("\n此音像图书已全部借出!\n");
printf("输入任意键继续!\n");
op=getchar();
op=getchar();
}
elseif((strcmp(ch,p2->bianhao)==0)&&(p2->shengyu!=0)) {
printf("应交的押金额为 %d 元!",(p2->price)*3);
c.money=(p2->price)*3;
p2->shengyu=p2->shengyu-1;
fprintf(fp1,"%d\n",c.money);
fclose(fp1);
fclose(fp2);
printf("\n输入任意键继续!\n");
op=getchar();
op=getchar();
}
if((fp2=fopen("d:\\Library.txt","w"))==NULL){
printf("文件打开错误!\n");
exit(0);
}
for(p1=b;p1<b+n;p1++)
fprintf(fp2,"%s\t%s\t%d\t%d\t%d\n",p1->bianhao,p1->name,p1->price,p1->amount,p1->shengyu);
system("cls");
fclose(fp2);
}
//归还音像图书
void back_book() {
struct library a={0},b={0},*p1=NULL,*p2=NULL; //b为结构数组
struct borrower c={0},d={0},*p3=NULL,*p4=NULL;
char ch={0},ch1,op;
int day,n1=0,n2=0,m=0,rent,money_1;
int x,i;
int month_day={
{0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31}};
FILE *fp1;
FILE *fp2;
fflush(stdin);
if((fp1=fopen("d:\\Library.txt","r"))==NULL){
printf("文件打开错误!\n");
exit(0);
}
if((fp2=fopen("d:\\borrow.txt","r"))==NULL){
printf("文件打开错误!\n");
exit(0);
}
printf("请输入您的名字: ");
scanf("%s",c.uname);
printf("请输入归还的书的编号:");
scanf("%s",c.bianhao);
printf("请输入归还的日期(年/月/日):");
scanf("%d%c%d%c%d",&c.back.year,&c.back.ch1,&c.back.month,&c.back.ch2,&c.back.day);
strcpy(ch,c.bianhao);
strcpy(ch1,c.uname); //在文件中寻找被借的书
p1=b;
p3=d;
while(feof(fp1)==0){
fscanf(fp1,"%s%s%d%d%d",p1->bianhao,p1->name,&p1->price,&p1->amount,&p1->shengyu);
p1++;
n1++;
}
while(feof(fp2)==0){
fscanf(fp2,"%s%s%d%c%d%c%d%d",p3->uname ,p3->bianhao,&p3->borrow.year,&p3->borrow.ch1,&p3->borrow.month,&p3->borrow.ch2,&p3->borrow.day,&p3->money);
p3++;
n2++;
}
for(p1=b;p1<b+n1;p1++)
if(strcmp(ch,p1->bianhao)==0){
p2=p1;
break;
}
for(p3=d;p3<d+n2;p3++)
if(strcmp(ch,p3->bianhao)==0&&strcmp(ch1,p3->uname)==0){
p4=p3;
m=1;
break;
}
//当输入的姓名或者借书的编号错误时
if(m==0){
printf("您没有借书记录!\n");
printf("输入y重新填写资料,输入n返回上一菜单!\n");
scanf(" %c",&op);
if(op=='y')
back_book();
if(op=='n') {
system("cls");
main() ;
}
}
printf("\n此音像图书名为《%s》 \n",p2->name);
if((fp1=fopen("d:\\Library.txt","w"))==NULL){
printf("文件打开错误!\n");
exit(0);
}
p2->shengyu =p2->shengyu+1;
for(p1=b;p1<b+n1;p1++)
fprintf(fp1,"%s\t%s\t%d\t%d\t%d\n",p1->bianhao ,p1->name,p1->price ,p1->amount ,p1->shengyu );
//计算租借的总天数
x=(p4->borrow.year%4==0&&p4->borrow.year%100!=0||p4->borrow.year%400==0);
if(p4->borrow.year==c.back.year){
if(p4->borrow.month==c.back.month)
day=c.back.day-p4->borrow.day;
else {
day=month_day-p4->borrow.day;
for(i=p4->borrow.month+1;i<c.back.month;i++)
day=day+month_day;
day=day+c.back.day;
}
}
else{
day=month_day-p4->borrow.day;
for(i=p4->borrow.month+1;i<=12;i++)
day=day+month_day;
if(p4->borrow.year-c.back.year==1){
for(i=0;i<c.back.month;i++)
day=day+month_day;
day=day+c.back.day;
}
else{
if(x==0)
day+=365;
else
day+=366;
for(i=0;i<c.back.month;i++)
day=day+month_day;
day=day+c.back.day;
}
}
printf("一共租借了 %d 天!\n",day);
if(ch=='B')
rent=day;
if(ch=='V')
rent=day*2;
if(ch=='R')
rent=day*3;
if(rent>=p3->money)
money_1=0;
if(rent<p3->money)
money_1=p3->money-rent;
printf("已交押金 %d 元,应交租金 %d元,应退金额 %d 元\n",p4->money,rent,money_1);
fclose(fp1);
fclose(fp2);
//删除租借者的信息
p3=d;
n1=0;
if((fp2=fopen("d:\\borrow.txt","r"))==NULL){
printf("文件打开错误!\n");
exit(0);
}
while(feof(fp2)==0){
fscanf(fp2,"%s%s%d%c%d%c%d%d",p3->uname ,p3->bianhao,&p3->borrow.year,&p3->borrow.ch1,&p3->borrow.month,&p3->borrow.ch2,&p3->borrow.day,&p3->money);
p3++;
n2++;
}
fclose(fp2);
for(p3=d;p3<d+n1;p3++)
if(strcmp(ch1,p3->uname)==0) {
p4=p3;
break;
}
if((fp2=fopen("d:\\borrow.txt","w"))==NULL){
printf("文件打开错误!\n");
exit(0);
}
for(p3=d;p3<d+n1-1;p3++){
if(strcmp(p4->bianhao,p3->bianhao)==0)
continue;
elsefprintf(fp1,"%s%s%d%c%d%c%d%d",p3->uname ,p3->bianhao,p3->borrow.year,p3->borrow.ch1,p3->borrow.month,p3->borrow.ch2,p3->borrow.day,p3->money);
}
printf("成功删除 %s 的信息!\n",p4->uname);
printf("按任意键结束!");
op=getchar();
op=getchar();
system("cls");
fclose(fp2); }
页:
[1]