ℳ๓廾匸ꦿ໊ོﻬྀ 2021-11-27 01:15 采纳率: 100%
浏览 151
已结题

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

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

  • 写回答

1条回答 默认 最新

  • 关注

    运行结果:

    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;
    
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月6日
  • 已采纳回答 11月28日
  • 创建了问题 11月27日

悬赏问题

  • ¥15 Oracle中如何从clob类型截取特定字符串后面的字符
  • ¥15 想通过pywinauto自动电机应用程序按钮,但是找不到应用程序按钮信息
  • ¥15 MATLAB中streamslice问题
  • ¥15 如何在炒股软件中,爬到我想看的日k线
  • ¥15 51单片机中C语言怎么做到下面类似的功能的函数(相关搜索:c语言)
  • ¥15 seatunnel 怎么配置Elasticsearch
  • ¥15 PSCAD安装问题 ERROR: Visual Studio 2013, 2015, 2017 or 2019 is not found in the system.
  • ¥15 (标签-MATLAB|关键词-多址)
  • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端