【问题描述】
小明同学特别喜欢买书看书。由于书较多,摆放杂乱,找起来非常麻烦。这学期小明同学上了数据结构与程序设计课后,决定改变这种状况:用C开发一个小型图书管理系统。系统中包含的图书信息有:书名、作者、出版社、出版日期等。首先,图书管理系统对已有的书(原始书库,存放在一个文本文件中)按书名字典序进行(排序)摆放(即将原始无序的图书信息文件生成一个有序的文件,即新书库),以便查找。该管理系统可以对新书库中图书条目进行如下操作:
1.录入。新增书录入到书库中(即从输入中读入一条图书信息插入到已排序好的图书文件相关位置处)
2.查找。按书名或书名中关键字信息在书库中查找相关图书信息,若有多本书,按字典序输出。
3.删除。输入书名或书名中关键字信息,从书库中查找到相关书并将其删除,并更新书库。
【输入形式】
原始的图书信息(原始书库)保存在当前目录下的books.txt中。
用户操作从控制台读入,首先输入操作功能序号(1代表录入操作,2代表查找操作,3代表删除操作,0代表将已更新的图书信息保存到书库中并退出程序),然后在下一行输入相应的操作信息(录入操作后要输入一条图书信息,查找和删除操作后只要输入书名或书名中部分信息)。程序支行过程中可以进行多次操作,直到退出(输入操作0)程序。
要求:
1、原始文件中的图书信息与录入的图书信息格式相同,每条图书信息都在一行上,包括书名(不超过50个字符)、作者(不超过20个字符)、出版社(不超过30个字符)和出版日期(不超过10个字符),只由英文字母和下划线组成,用一个空格分隔。图书信息总条数不会超过500.
2、下划线字符参加排序。
3、图书不会重名。
【输出形式】
进行录入和删除操作,系统会更新图书信息,但不会在控制台窗口显示任何信息。
进行查找操作后,将在控制台按书名字典序分行输出查找到的图书信息,书名占50个字符宽度,作者占20个字符宽度,出版社占30个字符宽度,出版日期占10个字符宽度,都靠左对齐输出。
最终按字典排序的图书信息保存在当前目录下的ordered.txt中,每条图书信息占一行,格式与查找输出的图书信息相同。
【样例输入】
假设books.txt中保存的原始图书信息为:
The_C_programming_language Kernighan Prentice_Hall 1988
Programming_in_C Yin_Bao_Lin China_Machine_Press 2013
Data_structures_and_Algorithm_Analysis_in_C Mark_Allen_Weiss Addison_Wesley 1997
ANSI_and_ISO_Standard_c Plauger Microsoft_Press 1992
Data_structures_and_program_design_in_C Robert_Kruse Pearson_Education 1997
Computer_network_architectures Anton_Meijer Computer_Science_Press 1983
C_programming_guidelines Thomas_Plum Prentice_Hall 1984
Data_structures_using_C Tenenbaum Prentice_Hall 1990
Operating_system_concepts Peterson Addison_Wesley 1983
Computer_networks_and_internets Douglas_E_Come Electronic_Industry 2017
用户控制台输入信息为:
1
Data_structures_and_C_programs Christopher Addison_Wesley 1988
2
structure
1
The_C_programming_tutor Leon_A_Wortman R_J_Brady 1984
2
rogram
3
rogramming
0
【样例输出】
用户输入“2 structure”后,控制台输出:
用户输入“2 rogram”后,控制台输出:
ordered.txt文件内容为:
【样例说明】
先读入books.txt中的10条图书信息,按照书名进行字典序排序;用户进行了五次操作,然后退出:第一次操作是插入了一条图书信息,这时有11条图书信息,按书名字典序排序为:
ANSI_and_ISO_Standard_c Plauger Microsoft_Press 1992
C_programming_guidelines Thomas_Plum Prentice_Hall 1984
Computer_network_architectures Anton_Meijer Computer_Science_Press 1983
Computer_networks_and_internets Douglas_E_Come Electronic_Industry 2017
Data_structures_and_Algorithm_Analysis_in_C Mark_Allen_Weiss Addison_Wesley 1997
Data_structures_and_C_programs Christopher Addison_Wesley 1988
Data_structures_and_program_design_in_C Robert_Kruse Pearson_Education 1997
Data_structures_using_C Tenenbaum Prentice_Hall 1990
Operating_system_concepts Peterson Addison_Wesley 1983
Programming_in_C Yin_Bao_Lin China_Machine_Press 2013
The_C_programming_language Kernighan Prentice_Hall 1988
第二次操作是查找书名包含structure的图书,有4本图书信息按照格式要求输出到屏幕;第三次操作又插入了一条图书信息,这时有12条图书信息;第四次操作查找书名包含rogram的图书,有6本图书信息按照格式要求输出到屏幕;第五次操作是删除书名包含rogramming的图书信息,有三条图书信息要删除,剩下九条图书信息;最后退出程序前将剩余的九条图书信息按照格式要求存储在ordered.txt文件中。
【评分标准】
该程序要求编写图书管理系统。提交程序文件名为books.c。
/*
Name: book
Description: I've done this homework all by myself
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct book
{
char name[50];
char author[20];
char press[30];
char date[10];
};
void sortbyName(struct book array[], int n);
int main()
{
int op, i, j, n, clear = 0;
int total_line = 0;
char temp_string[200]; /*used to calculate the lines in the original document*/
char temp_str[200]; /*used to store the string that needed to be searched */
struct book info[500];
FILE *in, *out;
/*Open the file now*/
if((in=fopen("books.txt","r")) == NULL){
printf("Can't Open file books.txt!\n");
return 1;
}
if((out=fopen("ordered.txt","w")) == NULL){
printf("Can't Open ordered.txt!\n");
return 1;
}
/*firstly, calculate the total lines in the original document*/
while (fgets(temp_string, 500, in) != NULL)
{
total_line++;
}
n = total_line;
fseek(in, 0, SEEK_SET);
for(i = 0; i<n; i++)
{
fscanf(in, "%s %s %s %s", &info[i].name, &info[i].author, &info[i].press, &info[i].date);
}
sortbyName(info, n);
int loop = 1;
while(loop == 1)
{
scanf("%d", &op);
if( op == 1)
{
scanf("%s %s %s %s", &info[n].name, &info[n].author, &info[n].press, &info[n].date);
n++;
sortbyName(info, n);
}
else if(op == 2)
{
/*search for the relative books
have to find the objects and printed out on the screen
no operation to document */
scanf("%s", temp_str);
for(i = 0; i<n; i++)
{
if( strstr(info[i].name, temp_str) != NULL )
{
printf("%-50s%-20s%-30s%-10s\n", info[i].name, info[i].author, info[i].press, info[i].date);
}
}
}
else if(op == 3)
{
scanf("%s", temp_str);
for(i = 0; i<n; )
{
if( strstr(info[i].name, temp_str) != NULL )
{
/*let later array cover the former array that need to be deleted*/
if(i == n-1)
n--;
else
{
while( strstr(info[i].name, temp_str) != NULL)
{
for(j = i; j<n; j++)
{
info[j] = info[j+1];
}
n--;
}
}
}
i++;
}
}
else if(op == 0)
{
for(i=0 ; i<n ; i++)
{
fprintf(out, "%-50s%-20s%-30s%-10s\n", info[i].name, info[i].author, info[i].press, info[i].date);
}
fclose(out);
loop = 0;
}
}
fclose(in);
return 0;
}
void sortbyName(struct book array[], int n)
{
int i, j;
struct book tmp;
for(i=0; i<n; i++)
for(j=i; j<n; j++)
{
if(strcmp(array[i].name ,array[j].name)>0)
{
tmp =array[i];
array[i] = array[j];
array[j] = tmp;
}
}
}