先编程实现书名升序排序输出,然后输入任意书名实现查询。
1) 使用记事本编辑不少于10本书的书名,其中的书名包含有中文、英文等,最大长度不超过32字节,保存生成书名文件1。
2) 程序中输入书名分隔符,读入文件1获取共有几本书M;
3) 程序中动态申请存放M本书的数组,将文件1的书名装入内存中;
4) 对书名进行升序排序,并保存到文件2中;
5) 输入任意书名,使用折半查找算法实现查询功能;
运行结果:
代码如下:
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
//读取文件内容
char** read_file(const char* filename,char sp,int *m)
{
int cnt=0,i=0,j,t;
ifstream infile;
char *fileBuffer = NULL;
char** books=NULL;
infile.open(filename,ios::binary);
if(infile.is_open())
{
infile.seekg(0,ios::end);
long len = infile.tellg(); //获取文件长度
infile.seekg(0, ios::beg); //设置读取位置为起始位置
fileBuffer = new char[(size_t)len + 1];
memset(fileBuffer,0,(size_t)len + 1);
infile.read(fileBuffer,len);
infile.close();
//判断有多少本书
while(i<len)
{
if(fileBuffer[i] == sp)
cnt++;
i++;
}
if(fileBuffer[i-1] != sp)
cnt++;
*m = cnt;
books = new char*[cnt];
i=0;
j=0;
t =0;
while(i<len)
{
if(fileBuffer[i]==sp)
{
books[t][j] = 0;
t++;
books[t] = new char[32];
j=0;
}else
{
if(t==0 && i==0)
books[t] = new char[32];
books[t][j++] = fileBuffer[i];
}
i++;
}
books[t][j] = 0;
delete[] fileBuffer;
}
return books;
}
//冒泡排序
void bubble_sort(char** a,int n)
{
int i,j;
char* t;
for (i=0;i<n-1;i++)
{
for (j=0;j<n-1-i;j++)
{
if(strcmp(a[j] ,a[j+1]) > 0) //从小到大,升序
{
t = a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
//数组以升序排列时,二分法查找x,返回所在的数组下标
int binSearch(char* x, char** a, int n)
{
int low, high, mid;
low = 0;
high = n-1;
while(low <= high)
{
mid = (low + high) / 2;
if(strcmp(x , a[mid])<0)
high = mid - 1;
else if(strcmp(x ,a[mid])>0)
low = mid + 1;
else
return mid;
}
return -1;
}
int main()
{
char** books = NULL;
char buf[32];
int nmb = 0,i,index=0;
ofstream fs("file2.txt");
char ch;
cout << "请输入分隔符:";
ch = cin.get();
cin.get(); //接收回车符
books = read_file("file1.txt",ch,&nmb);
bubble_sort(books,nmb);
cout << "排序后的书名:"<< endl;
for (i=0;i<nmb;i++)
{
cout << books[i]<<endl;
fs << books[i] << ch;
}
fs.close();
cout << "请输入需要查找的书名:";
cin.getline(buf,32);
index = binSearch(buf,books,nmb);
if (index<0)
{
cout << "未找到"<<endl;
}else
cout << "下标(排序后):"<< index<<endl;
//释放空间
for (i=0;i<nmb;i++)
{
delete[] books[i];
books[i] = 0;
}
delete[] books;
books = 0;
return 0;
}