先编程实现书名升序排序输出,然后输入任意书名实现查询。

先编程实现书名升序排序输出,然后输入任意书名实现查询。
1) 使用记事本编辑不少于10本书的书名,其中的书名包含有中文、英文等,最大长度不超过32字节,保存生成书名文件1。
2) 程序中输入书名分隔符,读入文件1获取共有几本书M;
3) 程序中动态申请存放M本书的数组,将文件1的书名装入内存中;
4) 对书名进行升序排序,并保存到文件2中;
5) 输入任意书名,使用折半查找算法实现查询功能;

运行结果:

img

代码如下:


#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;

}