gpt4 book ai didi

来自 txt 文件的 C++ 插入排序

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:44:54 26 4
gpt4 key购买 nike

我必须从一个 .txt 文件中读取并用另一个 .txt 文件将其读出。我必须使用插入排序才能根据两个数字对它们进行排序。我只能做到这一点,我不知道如何在这个程序中进行插入排序,我有两个数字要排序。

这是我的代码:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main(void)
{
int serialno[100], suratno[100], ayatno[100];
string order;

string str;
char ch;
int i = 0;
int j, temp;

ifstream fin;
fin.open("text.txt");

if(!fin)
{
cout << "Cannot open file \'text.txt\'! Quitting.\n";
exit(0);
}

while(fin)
{

fin.get(ch); //gets .

getline(fin, order, '('); //allegedly it removes the delimiter char from stream too

fin >> suratno;
fin.get(ch); //gets :
fin >> ayatno;
fin.get(ch); //gets )
fin.get(ch); //gets \n

cout << serialno << "." << order << "("<<suratno<<":<<ayatno<<")\n";
}

fin.close();

//sort algorithm
for (int i = 0; i < length; i++){
j = i;

while (j > 0 && suratno [j] < suratno [j-1]){
temp = suratno [j];
suratno [j] = suratno [j-1];
suratno [j-1] = temp;
j--;
cout << serialno << endl;
}
}
}

ofstream fout;
fout.open("newtext.txt");

if(!fout)
{
cout << "Cannot open output file\'orderedquranorders.txt\'!Quitting.\n";
exit(0);
}

i = 0;
//write sorted list to output file

fout.close();

cout << i << " orders successfully sorted and written.\n";
}

这是文本文件(应该使用括号中的数字,首先是冒号前的数字,其次是冒号后的数字):

1. Do not be rude in speech (3:159) 
2. Restrain Anger (3:134)
3. Be good to others (4:36)
4. Do not be arrogant (7:13)
5. Forgive others for their mistakes (7:199)
6. Speak to people mildly (20:44)
7. Lower your voice (31:19)
8. Do not ridicule others (49:11)
9. Be dutiful to parents(17:23)

当前输出:

  1. 说话不要粗鲁 (3:159)
  2. 抑制愤怒 (3:134)
  3. 善待他人 (4:36)
  4. 孝顺 parent (17:23)

预期输出:

  1. 抑制愤怒 (3:134)
  2. 说话不要粗鲁 (3:159)
  3. 善待他人 (4:36)
  4. 孝顺 parent (17:23)

按数字排序,序列号保持不变

最佳答案

为了比较两对数字,你可以这样比较:

 if(suratno[i] < suratno[i-1] || (suratno[i] == suratno[i-1] && ayatno[i] < ayatno[i-1])){
/* swap */
}

或者您可以使用一个表达式:expr = suratno * 10000 + ayatno .并只做一个比较:

 if(expr[i] < expr[i-1]){
/* swap */
}

此外,我对您的算法/代码有一些观察:

  • 不要使用 using namespace std .特别是在大型程序中,因为它会导致不明显的错误(参见示例 here )。而是使用 using std::<name>当你想避免std:: .前任。 using std::string .一般来说,避免 using namespace xxxx .
  • 我看到你确实手动解析了输入行,我更喜欢使用正则表达式,它更加通用和强大,但需要一点学习。
  • 当需要写入错误消息时,始终写入 stderr 流 cerr在 C++ 中。
  • 在排序算法中,最好从 1 开始而不是从 0 开始,因为第一个项目没有前一个项目可以比较。
  • 最后,可以使用现有的 C++ 函数完成交换。

这里是你的代码重组和使用正则表达式,我尽量解释:

#include <iostream>
#include <fstream>
#include <string>
#include <regex>
#include <vector>
#include <algorithm>

using std::string;

struct Line {
int expr; // Expression used to compare
string text; // Original line without initial number
};

int main() {
std::regex linePattern(
"\\d+" // 1 or more digits
"\\. " // '. ' (dot followed by 1 space)
"(" // begin char group #1
".*" // zero or more chars
"\\(" // '(' (left parenthesis)
"(\\d+)" // char group #2 (suratno: 1+ digits)
":" // ':' (colon)
"(\\d+)" // char group #3 (ayatno: 1+ digits)
"\\)" // ')' (right parenthesis)
")" // end char group #1
);
std::smatch groups; // Regular expression found char groups
std::vector<Line> lines; // Vector to store the readed lines

// Read lines parsing content
std::ifstream fin("text.txt");
if(!fin){
std::cerr << "Cannot open file 'text.txt'! Quitting.\n";
return 1;
}
string line;
while (std::getline(fin, line))
if (std::regex_search(line, groups, linePattern) && groups.size() > 0) {
int suratno = std::stoi(groups[2]);
int ayatno = std::stoi(groups[3]);
int compExpr = suratno * 10000 + ayatno; // assumes ayatno < 10,000
lines.push_back({ compExpr, groups[1] });
}
fin.close();

// sort algorithm (better start in 1)
for (size_t i = 1; i < lines.size(); i++)
for (size_t j = i; j > 0 && lines[j].expr < lines[j - 1].expr; j--)
std::swap(lines[j], lines[j - 1]);

std::ofstream fout("newtext.txt");
if(!fout){
std::cerr << "Cannot open output file 'orderedquranorders.txt'! Quitting.\n";
return 1;
}
for (size_t i = 0; i < lines.size(); i++)
fout << i + 1 << ". " << lines[i].text << std::endl;
fout.close();

std::cout << lines.size() << " orders successfully sorted and written.\n";
return 0;
}

注意:正则表达式实际上是一个字符串"\\d+\\. (.*\\((\\d+):(\\d+)\\))" ,我使用了一种 C/C++ 功能,该功能在编译前连接以空格分隔的字符串,因此编译器只会看到一个字符串。

不要忘记使用 -std=c++11 进行编译选项。

关于来自 txt 文件的 C++ 插入排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40865531/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com