【问题标题】:Arrange all the words in a list in alphabetical order in C++在 C++ 中按字母顺序排列列表中的所有单词
【发布时间】:2015-10-07 15:32:46
【问题描述】:
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <vector>
#include <string>

using namespace std;

void alpha_sorting(vector<string>& a);
void swap_function(vector<string>& x,int& l);
string alpha_least(vector<string>& list,int& idx);
int min_word_index(string& min,vector<string>& listed);

int main(){
    ifstream infile;
    infile.open("words.txt");
    if(!infile.is_open()){
        cout << "Could not open the input file" << endl;
        exit(EXIT_FAILURE);
    }
    vector<string> words;
    string temp;
    while(infile >> temp){
        words.push_back(temp);
    }
    sort_words_alphabetically(words);
    cout << "Those words in alphabetical order are " << endl;

    return 0;
}

void alpha_sorting(vector<string>& a){
    int index = 0;
    while(index < a.size()){
        swap_min_to_top(a, index);
        index++;
    }
    for(int i = 0;i < a.size();i++){
        cout << a[i] << endl;
    }
}

void swap_function(vector<string>& x,int& l){
    string temporary;
    temporary = x[l];
    wrdx[loc] = minimum_word(x, l);
    int min_idx = min_word_index(x[l], x);
    x[min_idx] = temporary;
}

string alpha_least(vector<string>& list,int& idx){
    string temp = list[idx];
    for(int i = idx;i < list.size();i++){
        if(list[i] < temp){
            temp = list[i];
        }
    }
    return temp;
}

int min_word_index(string& min,vector<string>& listed){
    for(int i = 0;i < listed.size();i++){
        if(min == listed[i]){
            return i;
        }
    }
    return -1;
}

大家好,

简而言之,作业要求我们从文件中读取单词并按字母顺序排列它们并将它们显示到屏幕上。

该作业明确禁止使用诸如排序等 c++ 函数,并希望我们创建自己的算法来排列这个向量。

我的算法在列表中找到最小值(字母表中的那个)字符串(使用“

有人可以找出我的代码有什么问题吗?

【问题讨论】:

  • 为了对向量进行排序,您可以交换元素。在您的算法中,您没有两个要交换的索引。 看起来您正在搜索中途进行交换。尝试使该函数首先搜索它想要交换的内容,然后才进行交换。
  • @dascandy 我为此创建了 swap_min_to_top 函数。有什么问题吗?
  • 如果这不是作业,你试过std::sort吗?
  • @Afr0:尝试制作一个简单的程序,在包含 2 或 3 个元素的向量上以错误的顺序运行它。然后让它工作。然后,通过添加更多测试调用来扩展它。此外,使用调试器(例如,Visual Studio)查看程序的状态。
  • @dascandy,感谢您的建议,正如 theAlias 指出的那样,我有一个按时间顺序排列的错误。并进一步补充这是家庭作业的想法。这实际上是我第一年的一项任务,我做得很差,所以它总是我打算完成的事情。我还添加了一个功能,使用户可以通过字符串操作搜索在该目录中输入的任何单词。我对此只有一个问题:用于对向量进行排序和实现搜索功能的方法是否足够有效?

标签: c++ string vector alphabetical


【解决方案1】:

快速浏览一下这里的一个问题, 在swap_min_to_top 你做 wrdx[loc] = minimum_word(wrdx, loc); 接着 int min_idx = min_word_index(wrdx[loc], wrdx); 这将使您的min_idx 始终等于loc(因为您刚刚分配了它)

您可能希望min_word_index 从 1+idx 开始处理,而不是从零开始

【讨论】:

  • 鉴于他承认这是家庭作业,我不想太明确地指出这一点 - 他有一些学习要做,以找出它为什么不起作用,然后它做了什么.此外,了解有关调试、调试器和单元测试的基本知识。
  • 非常感谢@theAlias。该程序现在可以正常运行了!
【解决方案2】:

使用经典冒泡排序,您必须继续。感谢维基百科。请将回答权授予用户 Christophe BoueeCinq 。 ccgousset@gmail.com

 #include <iostream>
    #include <fstream>
    #include <cstdlib>
    #include <vector>
    #include <string>
    #include <stdlib.h>
    #include <conio.h>
    using namespace std;

    int flag=0;
    string tmp="";
    int index=0;
    int k=0;

    int main()
    {
        ifstream infile;
        infile.open("words.txt");
        if(!infile.is_open())
        {
            cout << "Could not open the input file" << endl;
            exit(EXIT_FAILURE);
        }
        vector<string> words;
        string temp;
        while(infile >> temp)
        {
            words.push_back(temp);
            cout <<temp<<endl;
        }
        cout <<"-----"<<endl;

        int inx=0;
        int i=0;
        int change=0;
        int j=0;

        i =words.size(); // longueur(t)
        change = 1;
        while ((i>0) && (change==1))
        {
            change = 0;
            for (j=1; j<words.size()-1; j++) //        pour j allant de 1 à i-1 pas 1 faire
            {
                if  (words[j] > words[j + 1])
                {
                    tmp = words[j];
                    words[j] = words[j+1];
                    words[j+1] = tmp;
                    change = 1;
                }
            } //       fin pour
            i = i - 1;
            // fin tant que
        }

        _getch();


      for (j=0; j<words.size(); j++)
      cout <<"xx "<<words[j]<<endl;
    }

【讨论】:

  • 你好 Gitaar,首先我以匿名方式参与网站的生活。我的真实邮件 ccgousset@gmail.com 已过期(在我看来……)。二 为什么这个否定制裁适用于我的代码?此代码正在运行,并且是许多响应之间唯一真正好的响应。你当然不是白痴。 Amicalement Christophe。
  • “争论或讨论的目的不应该是胜利,而是进步” - Joseph Joubert 在另一条令人愉快的评论中转述了 Pierre de Coubertin “只有两个女儿母亲的失败”
  • 嗨,我看到你删除了那个冒犯性的评论,所以我删除了我的解决这个问题的评论。关于否决票(不是我的):您(和“我们”)似乎因语言障碍而绊倒。 “请将答案权限授予用户 Christophe B*******q .c*******t@gmail.com” 声音/外观作为一个问题发给很多人(希望该问题的答案被发送到一个电子邮件地址)。在 SO 上,问题必须作为问题(而不是答案)发布,问题和答案的 cmets/备注留在 cmets(不是电子邮件)中。
  • 另外,很多用户不赞成所谓的“仅代码”答案。 “使用经典冒泡排序,您必须继续” 不是很清楚。这是否意味着 OP(提出问题的人)必须在他的代码之后加上他的代码,或者他必须用来自维基百科的冒泡排序代码替换(部分)他的代码,或者......?在您查看代码中的 cmets 之前,似乎没有进一步的解释。然而,这些 cmets 是法语的,因此对很多“我们”来说是不可读的。此外,在 SO 上,我们仅“要求”英语(我尝试通过谷歌翻译运行您的 cmets 以改进您的答案,但是 ....
  • ... 没有呈现可理解的结果)。以上三个都是人们投反对票的常见原因。我发布这些 cmets 是为了帮助您了解为什么您可能会被否决,并帮助您了解 SO 的“工作原理”。现在,我无法撤消其他人的反对意见,但如果您可以添加一些额外信息并尝试将法语部分翻译成英语(达到可以理解的水平),那么我会赞成(我什至很乐意帮助您如果我至少了解您是/试图说/写的内容,请“润色”一些措辞/语法)。祝你好运!!
猜你喜欢
  • 1970-01-01
  • 2020-03-29
  • 2012-11-28
  • 2017-05-19
  • 2018-07-13
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多