首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

这是小弟我自己用C语言编写的图书信息管理系统的一部分代码。菜鸟请懂的人赐教

2013-07-04 
这是我自己用C语言编写的图书信息管理系统的一部分代码。初学者请懂的人赐教#define DATAp-data.bookID,p-

这是我自己用C语言编写的图书信息管理系统的一部分代码。初学者请懂的人赐教
#define DATA  p->data.bookID,p->data.bookname,p->data.author,p->data.booktype,p->data.publisher,p->data.time,p->data.price
#define END     "    ----------------------\n"
int saveflag=0;  /*是否需要存盘的标志变量*/
/*定义与图书有关的数据结构*/
typedef struct book      /*标记为book*/
{
char bookID[20];        /*登录号*/
char bookname[20];      /*书名*/
char author[20];        /*作者名*/
char booktype[20];      /*分类号*/
char publisher[20];     /*出版单位*/
char time[20];          /*出版时间*/
    char price[20];         /*价格*/
struct book*next;
};
void Sort_Book(struct book *head);                          //对图书进行排序   
void bookID_Sort(struct book *head);                       //按图书登录号排序    
 
/*定义每条记录或结点的数据结构,标记为:node*/
typedef struct node
{
struct book data;  /*数据域*/
struct node *next;    /*指针域*/
}Node,*Link;   /*Node为node类型的结构变量,*Link为node类型的指针变量*/
void menu()  /*主菜单*/
{
system("cls");   /*调用DOS命令,清屏.与clrscr()功能相同*/
printf("\n\n               广东工业大学商学院图书信息管理系统                \n");
    printf("     *************************菜单*********************************\n");
    printf("     *1 输入图书信息                  6 修改图书信息            *\n");
    printf("     *2 打印图书信息                  7 插入图书信息            *\n");
    printf("     *3 排序图书信息                  8 删除图书信息            *\n");


    printf("     *4 统计图书信息                  9 保存图书信息            *\n");
    printf("     *5 查找图书信息                  0 退出系统                *\n");
    printf("     **************************************************************\n");
}
/* ------------------printheader函数,格式化表头-------------------------*/
void printheader() /*格式化输出表头*/
{
printf(HEADER1);
printf(HEADER2);
printf(HEADER3);
}
/* -----------------------printdata函数,格式化输出数据-----------------*/
void printdata(Node *pp) /*格式化输出表中数据*/
{
Node* p;
p=pp;
printf(FORMAT,DATA);

}
/* ------------------------------Wrong函数,输出按键错误信息---------------------*/
void Wrong()  /*输出按键错误信息*/
{
printf("\n\n\n\n\n***********错误!:输入发生错误!请按任意键继续**********\n");
getch();
}
/*--------------------------- NOfind函数,用于输出未查找此图书的信息-----------------------*/
void Nofind()  /*输出未查找此图书的信息*/
{
printf("\n=====>没有找到此图书!\n");
}
/*---------------------------------------- Disp函数---------------------------------*/
void Disp(Link l)  /*显示单链表l中存储的图书记录,内容为book结构中定义的内容*/
{
Node *p;
p=l->next; 
if(!p)  /*p==NULL,NUll在stdlib中定义为*/
{
printf("\n=====>没有图书数据!\n");
getch();
return;
}
printf("\n");
printheader(); 

while(p)    
{   
printdata(p);
p=p->next;  /*移动直下一个结点*/
printf(HEADER3);
}
getch();
}
Node* Locate(Link l,char findmess[],char booknameorbookID[])
{
Node *r;
if(strcmp( booknameorbookID,"bookID")==0)
{
r=l->next;
while(r)
{
if(strcmp(r->data.bookID,findmess)==0)
return r;
r=r->next;
}//结束while(r)
}//结束if(strcmp(booknameorbookID,"bookID")==0)

else if(strcmp(booknameorbookID,"bookname")==0)  
{
r=l->next;
while(r)
{
if(strcmp(r->data.bookname,findmess)==0)    
return r;
r=r->next;
}//结束while(r)
}//结束else if(strcmp(booknameorbookID,"bookname")==0)
return 0; /*若未找到,返回一个空指针*/
}//结束Node* Locate(Link l,char findmess[],char booknameorbookID[])


/*输入字符串,并进行长度验证(长度<lens)*/
void stringinput(char *t,int lens,char *notice)
{
   char n[255];
   do{
printf(notice);  
scanf("%s",n);  
if(strlen(n)>lens) printf("\n 超出要求长度! \n");
     }while(strlen(n)>lens);
  strcpy(t,n); 
}
     /*---------------------------------增加图书记录-----------------------------------*/
void Add ( Link l )
{
Node *p,*r,*s;  
char ch,flag=0,bookID[16];
r=l;
s=l->next;
system("cls");
Disp(l);
while(r->next!=NULL)
r=r->next;
while(1)
{
while(1) 
{
stringinput(bookID,16,"\n输入登录号(输入返回菜单):"); 
flag=0;
if(strcmp(bookID,"0")==0) 
{
return;
}
s=l->next;
while(s)
{
if(strcmp(s->data.bookID,bookID)==0)
{
flag=1;
break;
}
s=s->next;
}
if(flag==1)
{  
getch();
printf("=====>登录号%s不存在,再试一次? (是(y)/否(n)):",bookID);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')continue;
else
return;
}
else
{
break;
}
}
p=(Node *)malloc(sizeof(Node));
if(!p)
{
printf("\n allocate memory failure ");
return ;
 }
strcpy(p->data.bookID,bookID); /*将字符串bookID拷贝到p->data.bookID*/
stringinput(p->data.bookname,16,"书名:");
stringinput(p->data.author,16,"作者名:");
stringinput(p->data.booktype,16," 分类号:");
stringinput(p->data.publisher,16," 出版单位:");
stringinput(p->data.time,16," 出版时间:");
stringinput(p->data.price,16," 价格:");
        p->next=NULL;
r->next=p;
r=p;
saveflag=1;
}
    return ;
}
//图书排序
void Sort_Book(struct book *head)  
{  
    int a;  
    printf("           ================================================================\n");  
    printf("                 **  1-按图书登录号排序        2-按图书价格排序    **\n");  
    printf("                 **  3-按作者名排序            0-取消排序操作  **\n");


    printf("           ================================================================\n");  
    printf("请输入您选择的编号:");  
    scanf("%d",&a);
    getchar();
    switch(a){
    case 0:  
        break;  
    case 1:  
        bookID_Sort(head);  
        break;  
    case 2:  
        Price_Sort(head);  
        break;  
    case 3:  
        author_Sort(head);  
        break;    
    default:  
        printf("您的输入有误!\n");  
        break;  
    }
}
//按图书登录号排序   
void bookID_Sort(struct book *head)  
{  
    struct book *a[1000],*p,*p1,*temp;  
    int i,k,index,n=0;  
    char b;  
    p1=head;  
    for(p=head;p;p=p->next)  
        n++;  
    for(i=0;i<n;i++){  
        a[i]=p1;  
        p1=p1->next;  
    }  
    for(k=0;k<n-1;k++)  
    {  
        index=k;  
        for(i=k+1;i<n;i++)  
       {  
            if(a[i]->bookID<a[index]->bookID)  
               index=i;  
       }  
       temp=a[index];  
        a[index]=a[k];  
        a[k]=temp;  


    }  
   printf("排序成功!\n");  
   printf("是否显示排序结果?(y/n)\n");  
    scanf("%s",&b);  
    getchar();  
    switch(b){  
   case 'n':  
       break;  
    case 'y':  
        printf("        ================================================================\n");  
        printf("        ** 登录号  图书名   作者名   分类号   出版单位   出版时间    价格  **\n");  
        for(i=0;i<n;i++){  
            printf("**%d  %s  %s  %s  %s  %d  %.2f\n\n",p->bookID,p->bookname,p->author,p->booktype,p->publisher,p->time,p->price);  
        }  
        printf("        ================================================================\n");  
        break;  
    default:  
        printf("您的输入有误!\n");  
        break;  
    }  
}  

/*---------数据存盘,若用户没有专门进行此操作且对数据有修改,在退出系统时,会提示用户存盘----*/
void Save(Link l)
{
FILE* fp;
Node *p;
int count=0;
fp=fopen("c:\\book","wb");
if(fp==NULL) 
{
printf("\n=====>文件打开失败!\n");
getch();
return ;
}
p=l->next;
while(p)
{
if(fwrite(p,sizeof(Node),1,fp)==1)
{   
p=p->next;
count++;  
}
else
{   
break;
}
}

if(count>0)
{  
getch();
printf("\n\n\n\n\n=====>保存文件完成,总的图书数是:%d\n",count);
getch();
saveflag=0;}
else
{
system("cls");
printf("当前链接为空,没有图书记录被保存!\n");
getch();
}
fclose(fp); /*关闭此文件*/
}
/*--------------------------------主函数--------------------------――――---------*/
void main()
{  
Link l;      /*定义链表*/
FILE *fp;    /*文件指针*/


int select;     /*保存选择结果变量*/
char ch;     /*保存(y,Y,n,N)*/
int count=0; /*保存文件中的记录条数(或结点个数)*/
Node *p,*r;   /*定义记录指针变量*/
l=(Node*)malloc(sizeof(Node));

if(!l)
 {      
printf("\n allocate memory failure "); 
return ;   


l->next=NULL;
r=l;
fp=fopen("C:\\book","ab+"); 

if(fp==NULL)
{   
printf("\n=====>不能打开文件!\n");
exit(0);
}//结束if(fp==NULL)
while(!feof(fp))

p=(Node*)malloc(sizeof(Node));
if(!p)
{  
printf(" memory malloc failure!\n");    
exit(0);      
}//结束if(!p)

if(fread(p,sizeof(Node),1,fp)==1) 
{
p->next=NULL;
r->next=p;
r=p;                            
count++;   
}//结束if(fread(p,sizeof(Node),1,fp)==1)

}//结束while(!feof(fp))

fclose(fp); /*关闭文件*/
printf("\n=====>打开文件成功,总的图书数目是: %d.\n",count);

menu();

while(1)
       {        getch();
        system("cls");
        menu();
p=r;
printf("\n              请输入你的选择(0~9):");   
scanf("%d",&select);
if(select==0)
{   
if(saveflag==1) 


printf("\n=====>是否保存修改到文件?  是(y)/否(n):");
scanf("%c",&ch);
if(ch=='y'||ch=='Y')Save(l);
}//结束if(saveflag==1) 

printf("\n=====>商学院12班制作!\n\n=====>谢谢您的使用!\n");
getch();
break;
}//结束if(select==0)
 switch(select)
{  
case 1:Add(l);break;           
case 2:system("cls");Disp(l);break;         
case 3:Sort(l);break;         
default: Wrong();getch();break;        
}
}            

} 图书 管理 C


[解决办法]
printf里面的%和变量的一一对应关系
scanf里面的%和变量以及变量前加不加&的一一对应关系
是C代码中非常容易出错的地方,而且通常编译还不出错。
所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

在每个最后不带\n的printf后面加fflush(stdout);
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。

热点排行