先编程实现书名升序排序输出,然后输入任意书名实现查询。
1) 使用记事本编辑不少于10本书的书名,其中的书名包含有中文、英文等,最大长度不超过32字节,保存生成书名文件1。
2) 程序中输入书名分隔符,读入文件1获取共有几本书M;
3) 程序中动态申请存放M本书的数组,将文件1的书名装入内存中;
4) 对书名进行升序排序,并保存到文件2中;
5) 输入任意书名,使用折半查找算法实现查询功能;
先编程实现书名升序排序输出,然后输入任意书名实现查询。
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- 技术专家团-小桥流水 2021-11-27 10:05关注
运行结果:
代码如下:
#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; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 2无用
悬赏问题
- ¥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做蓝牙接受端