资源描述
一:系统功效
基础功效:
图书录入,删除,查找,和导入导出等。
图书属性:
书号,书名,第一作者,版次,出版年等。
菜单功效:
1. Input Records(输入若干条统计)
从键盘一次输入一本书信息,存放到结构体数组中,然后显示。提醒信息,确定是否输入下一条统计。
2. Display All Records(显示全部统计)
按次序显示全部统计,每屏显示10条统计,按<Enter>键继续显示下一屏。
3. Delete a Record(按书名查找,删除一本书)
输入待删除书书名,显示该书名全部书目,提醒输入待删除书目标书号,提醒是否删除,确定后,删除该书。
4. Sort(排序)
以书名为升序排列数组
5. Insert a record(插入一条统计)
以书名为序排列数组中插入一条统计,插入后,数组仍然有序。输出插入成功后信息。
6. Query(查找并显示一个统计)
输入书名,查找并显示包含该书名全部图书信息
7. Add Records from a Text File(从文件读入图书信息到结构体数组中)
用户可事先建立一个文本文件Dictory.txt。存放全部图书信息,文件格式以下:
2
1182 高等数学刘浩荣 5 同济大学出版社
7300 物理化学王德明 2 化学工业出版社
8. Write to a Text File
将数组中全部统计写入文件Records.txt中,要求格式和Dictory.txt相同。
0. Quit(退出图书管理系统)
新增加菜单功效:
9. Change a record
修改某一条统计值
a. Menu
显示菜单
b. Clear Screen
清屏
c. Pause
按暂停,按任意键继续
二:数据结构
Typedef struct
{
char ISBN[10];//书号
char book[30];//书名
char author[20];//作者
Int edition;//版本号
char press[50];//出版社名
int year;//出版年
}Bookinfo;
三:函数调用关系
Write_to_Text()
Display_main_menu()
Change_a_record()
Delete()
Sort_by_name()
Insert()
Insert_a_record()
AddfromText()
Delete_a_record()
Display()
Query()
Query_a_record()
Input()
main
四:关键算法及实现
i=0
语句B
n+1
是
是
是
否
否
否
b=strcmp((*s).book,dictList[i].book)>=0
c=strcmp((*s).book,dictList[i+1].book)<=0
语句A:dictList[j]=dictList[j-1];
语句B:dictList[i+1]=*s;
i++
n+1
j--
语句A
j>i+1
j=n
b&&c
i<n-1
i=0
插入算法
排序算法
结束
否
否
是
否
否
是
是
是
p=j
语句A
i++
j++
j<n
b>0
P!=i
p=i
j=i+1
i<n-1
i=0
开始
b=strcmp(dictList[p].book,dictList[j].book)
语句A:t = dictList[p];
dictList[p] = dictList[i];
dictList[i] = t;
五:源程序(含注释)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define NUM 100
typedef struct //定义结构体数组
{
char ISBN[10]; //书号
char book[30]; //书名
char author[20]; //作者
int edition; //版本号
char press[50]; //出版社名
int year; //出版年
}Bookinfo;
int Input(Bookinfo dictList[],int n) //从键盘输入数据,存入结构体数组dictList
{
char c1,c2;
do{
c1=getchar();
printf("Please input ISBN:\n");
gets(dictList[n].ISBN);
printf("Please input book:\n");
gets(dictList[n].book);
printf("Please input author:\n");
gets(dictList[n].author);
printf("Please input press:\n");
gets(dictList[n].press);
printf("Please input edition:\n");
scanf("%d",&dictList[n].edition);
printf("Please input year:\n");
scanf("%d",&dictList[n].year);
n+=1;
printf("是否输入下一条?确定(y)|取消(n)\n");//提醒信息
c1=getchar();
}while((c2=getchar())=='y');
return(n); //返回值为新统计数量
}
void Display(Bookinfo dictList[],int n) //显示全部统计,每10个暂停一次,输入回车继续显示
{
int i=0,j;
char input,c;
printf("%-10s%-23s%-18s%-8s%-15s%-4s\n","ISBN","book","author","edition","press","year");
c=getchar();
do{
j=10; //每10个循环一次
do
{
printf("%-10s%-23s%-18s%-8d%-15s%-4d\n",dictList[i].ISBN,dictList[i].book,dictList[i].author,dictList[i].edition,dictList[i].press,dictList[i].year);
i++;
j--;
}while(j && i<n);
if(i==n) break; //若数据全部输出,则跳出循环,
scanf("%c",&input);
}while(input=='\n'); //输入回车,实施循环
}
int delete(Bookinfo dictList[],int n,char *ISBN) //只删除书号为ISBN第一条统计
{
int i,j;
for(i=0;i<n;i++)
{
if(!strcmp(dictList[i].ISBN,ISBN)) //strcmp()函数判定两个字符串是否相等
{
for(j=i;j<n-1;j++)
dictList[j]=dictList[j+1]; //将目标值右面数据全部左移一位
return(n-1);//删除后统计数降低1
}
}
return(n);
}
int Delete_a_record(Bookinfo dictList[],int n)//删除某一条统计
{
int i,j=0;
char book[30],isbn[10],s,c;
c=getchar();
printf("请输入待删除书目标书名\n");
gets(book); //获取书名字符串
printf("%-10s%-23s%-18s%-8s%-15s%-4s\n","ISBN","book","author","edition","press","year");
for(i=0;i<n;i++)
{
if(!strcmp(dictList[i].book,book))
{ //找到同名数据,并输出
printf("%-10s%-23s%-18s%-8d%-15s%-4d\n",dictList[i].ISBN,dictList[i].book,dictList[i].author,dictList[i].edition,dictList[i].press,dictList[i].year);
j++;
}
}
if(j>0)
{
printf("请输入待删除书目标书号\n");
gets(isbn); //获取要删除数据书号
printf("确实要删除该统计?是(y)|否(n)\n"); //提醒删除
if((s=getchar())=='y')
{
for(i=0;i<n;i++)
{
if(!strcmp(dictList[i].ISBN,isbn))
{
//调用delete函数删除
printf("删除成功!\n");
return(delete(dictList,n,dictList[i].ISBN));
}
}
printf("未找到待删除统计!\n");
//删除成功后统计减1
}
else
{
printf("已取消删除!\n"); //取消删除后统计数不变
return n;
}
}else
printf("未找到待删除统计!\n");
}
void Sort_by_name(Bookinfo dictList[],int n)//选择法按书名升序排列
{
int i,j,p;
Bookinfo t;
for(i = 0;i<n-1;i++)
{
p=i;
for(j=i+1;j<n;j++)
if(strcmp(dictList[p].book,dictList[j].book)>0)
p=j;
if(p!=i)
{
t = dictList[p];
dictList[p] = dictList[i];
dictList[i] = t;
}
}
}
int insert(Bookinfo dictList[],int n,Bookinfo *s)//按书名次序插入统计
{
int i,j;
Sort_by_name(dictList,n);
for(i=0;i<n-1;i++)
{
if(strcmp((*s).book,dictList[0].book)<0)
{
for(j=n;j>0;j--)
dictList[j]=dictList[j-1];
dictList[0]=*s;
return(n+1);
}
else if(strcmp((*s).book,dictList[i].book)>=0 && strcmp((*s).book,dictList[i+1].book)<=0)
{
for(j=n;j>i+1;j--)
dictList[j]=dictList[j-1];
dictList[i+1]=*s; //放在i和i+1之间或放在最终一个
return(n+1);
}
}
dictList[n]=*s;
return(n+1);
}
int Insert_a_record(Bookinfo dictList[],int n)//出现问题,调用该函数时总是全部显示统计?
{
int k;
char c;
Bookinfo s;
//输入数据
c=getchar();
printf("Please input ISBN:\n");
gets(s.ISBN);
printf("Please input book:\n");
gets(s.book);
printf("Please input author:\n");
gets(s.author);
printf("Please input press:\n");
gets(s.press);
printf("Please input edition:\n");
scanf("%d",&s.edition);
printf("Please input year:\n");
scanf("%d",&s.year);
k=insert(dictList,n,&s); //依据insert返回值是否大于n判定插入成功是否
if(k>n)
{
printf("插入成功!\n");
return(k);
}
else
{
printf("插入失败!\n");
return(n);
}
}
int Query(Bookinfo dictList[],int n,char *book)//查询并显示书名为book统计
{
int i,count=0;
printf("%-10s%-23s%-18s%-8s%-15s%-4s\n","ISBN","book","author","edition","press","year");
for(i=0;i<n;i++)
{
if(!strcmp(dictList[i].book,book))
{
printf("%-10s%-23s%-18s%-8d%-15s%-4d\n",dictList[i].ISBN,dictList[i].book,dictList[i].author,dictList[i].edition,dictList[i].press,dictList[i].year);
count++;
}
}
if(count)
return count; //查询成功,返回个数
else
return -1; //未找到,返回-1
}
void Query_a_record(Bookinfo dictList[],int n)
{
int i;
char book[30],c;
c=getchar();
printf("请输入待查找书名\n"); //输入书名
gets(book);
if((i=Query(dictList,n,book))>0) printf("共找到%d条统计\n",i); //若查到数据,Query函数返回值为正数
else printf("未找到所查找统计\n");
}
int AddfromText(Bookinfo dictList[],int n,char *filename)
{
int i;
Bookinfo s;
FILE *p;
p=fopen(filename,"r");
fscanf(p,"%d",&i); //先读取文件第一行统计数
while(i--)
{
fscanf(p,"%s%s%s%d%s%d\n",s.ISBN,s.book,s.author,&s.edition,s.press,&s.year); //读取统计具体值
n=insert(dictList,n,&s); //插入到dictList数组中
}
fclose(p);
printf("读取成功!\n");
return(n);
}
void WritetoText(Bookinfo dictList[],int n,char *filename)
{
FILE *p2;
int i;
p2=fopen(filename,"w");
for(i=0;i<n;i++) //按格式写入文件
fprintf(p2,"%-10s%-23s%-18s%-8d%-15s%-4d\n",dictList[i].ISBN,dictList[i].book,dictList[i].author,dictList[i].edition,dictList[i].press,dictList[i].year);
fclose(p2);
printf("写入成功!\n");
}
void Display_main_menu() //显示菜单,另外添加了三个功效,显示菜单,清屏,暂停
{
printf("------------------------------\n1.Input records\n2.Display All Records\n3.Delete a Record\n4.sort\n5.Insert a Record\n6.Query\n7.Add Records from a Text File\n8.Write to a Text File\n9.Change a record\n0.Quit\n\nTIPS\ta.Menu\n\tb.Clear Screen\n\tc.Pause\n------------------------------\nGive your choice:\n");
}
void Change_a_record(Bookinfo dictList[],int n)//修改某一统计值
{
int i;
char book[30],ISBN[30],c;
c=getchar();
printf("请输入待修改图书书名\n");
gets(book);
if((i=Query(dictList,n,book))>0)//确定找到待修改统计
{
printf("共找到%d条统计\n请输入待修改图书书号\n",i);
gets(ISBN);
for(i=0;i<n;i++)
{
if(!strcmp(dictList[i].ISBN,ISBN))
{
printf("请更新书号为%s图书数据\n",ISBN);//开始修改
printf("Please input ISBN:\n");
gets(dictList[i].ISBN);
printf("Please input book:\n");
gets(dictList[i].book);
printf("Please input author:\n");
gets(dictList[i].author);
printf("Please input press:\n");
gets(dictList[i].press);
printf("Please input edition:\n");
scanf("%d",&dictList[i].edition);
printf("Please input year:\n");
scanf("%d",&dictList[i].year);
printf("修改完成!\n");
}
}
}
else printf("未找到相关统计\n");
}
main()
{
static int n=12;
char filename1[30],filename2[30],c;
//创建初始结构体数组,应不少于十个
Bookinfo books[NUM]={
{"97814842","python Language","gnus Lie land",2,"Berkeley",},
{"97871190","history of Chinese","Goa qua",2,"Beijing",},
{"97814129","public communication","Ronald E.Rice",3,"London",},
{"97836422","cultural composition","Yang Pan",2,"pardon",},
{"97801240","analyzing the social","Jennifer beck",1,"Walt",},
{"78016958","recored servicing","Scottish Qua",1,"Chinese",},
{"01354851","management guide","Ferdinand K. Levy",1,"Englewood",1969},
{"1096-424","macroeconomics","Dusk ",2,"Gog",1977},
{"04448649","competitive economics","Ki Hang Kim",2,"Amsterdam",1983},
{"08531419","guide to banking","Robin Pr",7,"London",1973},
{"01311606","guide to banking","Jerry S.Rosen",2,"Englewood",1972},
{"97875100","dirt pricing dynamic","Pamela La",1,"World book",}};
Display_main_menu(); //显示菜单
while(c=getchar()) //连续获取输入,并用switch语句调用对应函数
{
switch(c)
{
case '0':exit(1);break;
case '1':n=Input(books,n);break;
case '2':Display(books,n);break;
case '3':n=Delete_a_record(books,n);break;
case '4':Sort_by_name(books,n);break;
case '5':n=Insert_a_record(books,n);break;
case '6':Query_a_record(books,n);break;
case '7':
printf("请输入文件名\n");
scanf("%s",filename1);
n=AddfromText(books,n,filename1);
break;
case '8':
printf("请输入文件名\n");
scanf("%s",filename2);
WritetoText(books,n,filename2);
break;
case '9':Change_a_record(books,n);break;
case 'a':Display_main_menu();break;
case 'b':system("cls");break;
case 'c':system("pause");break;
}
}
}
六:程序实施(包含经典测试数据)
------------------------------
1.Input records
2.Display All Records
3.Delete a Record
4.sort
5.Insert a Record
6.Query
7.Add Records from a Text File
8.Write to a Text File
9.Change a record
0.Quit
TIPS a.Menu
b.Clear Screen
c.Pause
------------------------------
Give your choice:
à1
Please input ISBN:
à4296
Please input book:
à明朝那些事
Please input author:
à当年明月
Please input press:
à浙江出版社
Please input edition:
à2
Please input year:
à
是否输入下一条?确定(y)|取消(n)
àn
à2
ISBN book author edition press year
97814842 python Language gnus Lie land 2 Berkeley
97871190 history of Chinese Goa qua 2 Beijing
97814129 public communication Ronald E.Rice 3 London
97836422 cultural composition Yang Pan 2 pardon
97801240 analyzing the social Jennifer beck 1 Walt
78016958 recored servicing Scottish Qua 1 Chinese
01354851 management guide Ferdinand K. Levy 1 Englewood 1969
1096-424 macroeconomics Dusk 2 Gog 1977
04448649 competitive economics Ki Hang Kim 2 Amsterdam 1983
08531419 guide to banking Robin Pr 7 London 1973
à<Enter>
01311606 guide to banking Jerry S.Rosen 2 Englewood 1972
97875100 dirt pricing dynamic Pamela La 1 World book
4296 明朝那些事当年明月 2 浙江出版社
à3
请输入待删除书目标书名
à明朝那些事
ISBN book author edition press year
4296 明朝那些事当年明月 2 浙江出版社
请输入待删除书目标书号
à4296
确实要删除该统计?是(y)|否(n)
ày
删除成功!
à4
à2
ISBN book author edition press year
97801240 analyzing the social Jennifer beck 1 Walt
04448649 competitive economics Ki Hang Kim 2 Amsterdam 1983
97836422 cultural composition Yang Pan 2 pardon
97875100 dirt pricing dynamic Pamela La 1 World book
08531419 guide to banking Robin Pr 7 London 1973
01311606 guide to banking Jerry S.Rosen 2 Englewood 1972
97871190 history of Chinese Goa qua 2 Beijing
1096-424 macroeconomics Dusk 2 Gog 1977
01354851 management guide Ferdinand K. Levy 1 Englewood 1969
97814129 public communication Ronald E.Rice 3 London
à<Enter>
97814842 python Language gnus Lie land 2 Berkeley
78016958 recored servicing Scottish Qua 1 Chinese
à5
Please input ISBN:
à84772281
Please input book:
àenglish learning
Please input author:
àtom
Please input press:
àAlla
Please input edition:
à2
Please input year:
à
插入成功!
à6
请输入待查找书名
àrecored servicing
ISBN book author edition press year
78016958 recored servicing Scottish Qua 1 Chinese
共找到1条统计
à7
请输入文件名
àDictory.txt
读取成功!
à2
ISBN b
展开阅读全文