Чтение из файла и сортировка по алфавиту

Я изучаю основы C++ в колледже и полностью застрял на одном из своих заданий.

Мне нужно прочитать ввод из файла со списком (1-25) имен, отсортировать имена по алфавиту, а затем вывести, какие люди будут в начале очереди (например, Эми) и в конце очереди. (пример: Зора). Мой профессор очень разборчив и строго запрещает нам использовать то, что мы не выучили на уроках. Мы изучили только cin, cout, операторы if, циклы, основные операторы, fstream и базовую строку.

#include<iostream>
#include<string>
#include<fstream>
using namespace std;

int main()
{

    //Intialize variables
    string studentName;
    string firstEntry;
    string secondEntry;
    string first;
    string last;
    ifstream inputFile;
    string filename;
    int students;

    //Ask for amount of students
    cout << "Please enter the number of students in the class.\n(The number must be a whole number between 1 and 25.)\n";
    cin >> students;

    //Input validation
    while (students < 1 || students > 25)
    {
        cout << "\nInvalid value. Please enter a value between 1 and 25.\n";
        cin >> students;
    }

    //Get file name from user
    cout << "Please enter the name of the file with the list of students\n";
    cin >> filename;

    //Open the file
    inputFile.open(filename);
    if (inputFile)
    {
        while (inputFile >> studentName)
        {
            cin >> studentName;
            studentName = firstEntry;
            cin >> studentName;
            studentName = secondEntry;

            if (firstEntry < secondEntry)
            {
                firstEntry = first;
                secondEntry = last;
            }
        }
        cout << first << " is the first student in line.";
        cout << last << " is the last student in line.";
    }

    else
    {
    cout << "Error opening the file.\nPlease restart the program and try again.";
    return 1;
    }
    inputFile.close();
    return 0;
}

Также вот файл, из которого я читаю:

Джеки

Сэм

Том

Счет

Мэри

Павел

Зев

Барб

В основном я зациклен на чтении файла и интерпретации части данных.


person Daniel G    schedule 07.03.2018    source источник
comment
Итак, как мы должны знать, что вы узнали в классе, т. е. что разрешено, а что нет? Вам лучше перечислить все уроки, которые вы уже получили, чтобы мы не давали вам советов, которые вы еще не усвоили.   -  person Justin Randall    schedule 07.03.2018
comment
Было бы трудно дать вам совет, не зная тем, которые вы изучили. Поскольку это задание, используйте свои навыки для решения проблемы. Есть много способов решить проблему..но если вы делаете это самостоятельно. тогда вам будет полезно понять основные конструкции программирования.   -  person Sangam Belose    schedule 07.03.2018
comment
Если вам нужны только первый и последний, вам не нужно беспокоиться о сортировке всего списка. Аналогичная проблема будет возвращать минимум и максимум в списке целых чисел.   -  person Ari    schedule 07.03.2018


Ответы (3)


Несколько предложений:

  1. Вы должны тщательно продумать типы переменных и их использование. Поскольку вы решили использовать std::string, вам следует ознакомиться с его основами из документации.

  2. Продуманное именование переменных может помочь вам избежать некоторых очевидных ошибок программирования. Например, вы используете

    cin >> studentName;
    

    что явно должно быть строкой studentName1, а не целым числом.

  3. Планируйте использование переменных. Вам действительно нужны все целые числа? Вы сами сортируете имена по алфавиту, а не по номерам.

  4. Используйте задания осторожно.

    studentName = firstEntry;
    

    указывает, что вы присваиваете значение firstEntry, то есть от 0 до studentName, фактически заменяя все, что оно должно было содержать ранее.

  5. Для фактической сортировки у вас есть выбор между доступными std::string функциями или, если это запрещено ограничениями вашего класса, классической строковой итерацией. В последнем случае самым большим преимуществом будет тот факт, что строку можно повторять как массив символов. Тогда сортировка просто сводится к сравнению символов.

  6. Последний совет, который, судя по вашей попытке, вы, вероятно, уже имели в виду. Поскольку вам нужно вывести только имя и фамилию в очереди, вам не нужно сортировать весь список, просто сохраните имя и фамилию.

Удачи!

person TheSoothsayer    schedule 07.03.2018
comment
Я отредактировал код, чтобы отразить ваши предложения, однако всякий раз, когда он доходит до точки, где он читает файл, код останавливается. Я уверен, что файл находится в правильном месте, потому что я проверил его с помощью cout. Также нам разрешено использовать только функцию базовой строки. Мы ничего не узнали по той ссылке, которую вы разместили. - person Daniel G; 08.03.2018

если вам просто нужно max и mi, просто сравните строки и сохраните в двух отдельных переменных

сначала установите первое имя как min, а затем просмотрите весь файл

сравнить с первоначальным названием

если меньше, замените, иначе сохраните в макс.

сравнить max с входящим текстом, если больше заменить

поправьте меня, если я ошибаюсь

person Sanjeev S    schedule 07.03.2018

Попросите своего профессора научить вас std::set и std::getline, и тогда вы сможете позволить мощности C++ работать на вас.

#include <iostream>
#include <fstream>
#include <set>

int main()
{
    std::ifstream input("names.txt"); ///< open input file
    if (!input.is_open())
    {
        std::cout << "Error opening file!" << std::endl;
        return 1;
    }

    std::set<std::string> sortedNames; ///< set is sorted by default!
    std::string name;
    while (std::getline(input, name)) ///< get every name in file line by line
    {
        sortedNames.insert(name); ///< insert name into sorted set
    }

    for (const auto& n : sortedNames) ///< print sorted names
    {
        std::cout << n << std::endl;
    }
    return 0;
}

Изменить: если вас не интересует полный отсортированный набор имен, и вам нужны только первая и последняя записи, вы можете просто настроить итераторы для этих элементов в вашем наборе и просто разыменовать их, чтобы получить их значения.

 auto iter = sortedNames.begin();   ///< iterator at first element
 auto riter = sortedNames.rbegin(); ///< iterator at last element
 std::cout << "The first student is: " << *iter << std::endl;
 std::cout << "The last student is: " << *riter << std::endl;
person Justin Randall    schedule 07.03.2018