Я надеюсь, что хранители Грааля проявят некоторую милость и позволят мне ответить.
Позвольте мне сначала перечислить проблемы, которые я обнаружил при чтении:
- Использование простые 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;
}
Надеюсь, это поможет. Если у вас возникнут дополнительные вопросы, пожалуйста, задавайте. Я рад объяснить все более подробно.