Любой способ найти минимально возможное число из файла - PullRequest
0 голосов
/ 29 апреля 2020

Так что у меня есть этот код прямо здесь, который смотрит на файл .txt и находит наибольшее возможное число из первичного и вторичного, которые добавляются. Но я понятия не имею, как заставить его найти наименьший возможный. Я должен получить вывод наименьшего числа в файле, который равен 15, но я получаю 40, который является просто первым элементом. Нет входных данных.

Содержимое файла:

+Test1 Test2 30 10
+Test3 Test4 45 5
+Test5 Test6 10 5
#include<iostream>
#include<fstream>
#include <stdlib.h>
using namespace std;

struct counter{
    string name;
    string lastname;
    int primary;
    int secondary;
}elements[30];

void Min()
{
    int min = elements[0].primary + elements[0].secondary;
    int total;

    for(int i=1;i>30;i++)
    {
        total=elements[i].primary + elements[i].secondary;

        if(total < min) 
        {
            min=total;
        }

    }
    cout<<"Largest number"<<min<<endl;

}

int main()
{
    ifstream input("Element.txt");
    int i=0;
    while(!input.eof())
    {
        input>> elements[i].name >> elements[i].lastname >> elements[i].primary >> elements[i].secondary;
        i++;
    }

    Min();


    return 0;
}

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Я надеюсь, что хранители Грааля проявят некоторую милость и позволят мне ответить.

Позвольте мне сначала перечислить проблемы, которые я обнаружил при чтении:

  • Использование простые C массивы. Не используйте массивы C -Style в C ++
  • Использование волхвов c номер 30. Почему 30, а не 35 или 555?
  • Не используется constexpr для числа волхвов c. Если вы измените 30 в одном месте на 35, вы забудете об этом в другом месте, что приведет к катастрофе
  • using namespace std; Никогда этого не делайте. Никогда.
  • min должен быть инициализирован с максимальным значением int, чтобы первое сравниваемое значение было меньше.
  • total должно быть определено в l oop и как константа , Он не используется за пределами l oop. Таким образом, вы загрязняете пространство имен вне l oop
  • Поскольку l oop имеет неправильное начальное значение и неправильное условие
  • Текст должен быть: "Smallest Number:"
  • Никогда не используйте while(!input.eof()). Это ошибка.
  • Проверьте, находится ли i в допустимых пределах. В массиве всего 30 элементов. Ограничьте его до этого числа, иначе вы получите неопределенное поведение
  • Вы должны проверить только столько элементов, сколько было прочитано. В противном случае неиспользуемые элементы в массиве всегда равны 0, а результат nin всегда будет равен 0.

Пожалуйста, ознакомьтесь с обновленным решением

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

constexpr unsigned int MaxElements = 30;

struct Counter {
    std::string name{};
    std::string lastname{};
    int primary{};
    int secondary{};
};

Counter elements[MaxElements];

void minTotal(int numberOfElements)
{
    int min = std::numeric_limits<int>::max();
    for (int i = 0; i < numberOfElements; i++) {
        const int total = elements[i].primary + elements[i].secondary;
        if (total < min) {
            min = total;
        }
    }
    std::cout << "Smallest number: " << min << '\n';
}
void maxTotal(int numberOfElements)
{
    int max = std::numeric_limits<int>::min();
    for (int i = 0; i < numberOfElements; i++) {
        const int total = elements[i].primary + elements[i].secondary;
        if (total > max) {
            max = total;
        }
    }
    std::cout << "Biggest number: " << max << '\n';
}

int main()
{
    std::ifstream input("Element.txt");
    int i = 0;
    while (input >> elements[i].name >> elements[i].lastname >> elements[i].primary >> elements[i].secondary)
    {
        i++;
        if (i >= MaxElements) break;
    }
    minTotal(i);
    maxTotal(i);

    return 0;
}

Только для заинтересованных людей, которых я также покажет решение C ++.

Мы будем использовать доступный алгоритм minmax, чтобы найти ответ.

В качестве итератора мы будем использовать std::istream_iterator. И для этого мы перегружаем оператор экстрактора для класса Counter. Кроме того, мы добавляем в структуру вспомогательную функцию sum.

#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <iterator>

struct Counter {
    std::string name{};
    std::string lastname{};
    int primary{};
    int secondary{};
    int sum() const { return primary + secondary; }
};

// Read counter from any istream
std::istream& operator >> (std::istream & is, Counter& c) {
    return is >> c.name >> c.lastname >> c.primary >> c.secondary;
}

int main() {

    // Open the file and check, if it could be opened
    if (std::ifstream input("Element.txt"); input) {

        // Calculate min and max Element
        const auto& [min, max] = std::minmax_element(std::istream_iterator<Counter>(input), {},
            [](const Counter& c1, const Counter& c2) {  return c1.sum() < c2.sum(); });

        // Show result
        std::cout << "\n\nMin: " << min->sum() << "   Max: " << max->sum() << "\n\n";
    }
    else std::cerr << "\n\n*** Error. Could not open source file\n";

    return 0;
}

Надеюсь, это поможет. Если у вас возникнут дополнительные вопросы, пожалуйста, задавайте. Я рад объяснить все более подробно.

1 голос
/ 29 апреля 2020

Вы можете передать все элементы в std :: set (контейнер, который объявлен в (#include <set>)), чем будет легко найти максимальные и минимальные числа, мне кажется, это самый простой способ. Установите сортировку всех элементов автоматически. Пример использования std :: set:

#incluse <set>

int main()
{
std::set <int> st; //creating set
st.insert(3);
st.insert(2);
st.insert(88);
for(auto i:st) //for each cycle
std::cout << i << ", ";
}

Вывод будет 2, 3, 88,

* st.begin () вернет элемент fisrt (минимальное значение, которое вы передали ) Не забудьте использовать звездочку до st.begin ()

...