Цель этой программы — иметь возможность вводить набор целых двойных значений и выводить общее расстояние в виде суммы. Он также предназначен для распознавания наименьшего и наибольшего расстояний, а также для вычисления среднего значения двух или более расстояний.
Я также хотел бы иметь возможность удалить повторяющийся блок кода в моей программе, который я буквально скопировал, чтобы заставить работать вторую часть исходного кода. Видимо, есть способ удалить репликацию, но я не знаю как.
Вот источник:
/* These includes are all part of a custom header designed
by Bjarne Stroustrup as part of Programming: Principles and Practice
using c++
*/
#include<iostream>
#include<iomanip>
#include<fstream>
#include<sstream>
#include<cmath>
#include<cstdlib>
#include<string>
#include<list>
#include <forward_list>
#include<vector>
#include<unordered_map>
#include<algorithm>
#include <array>
#include <regex>
#include<random>
#include<stdexcept>
// I am also using the "stdafx.h" header.
// reading a sequence of integer doubles into a vector.
This could be the distance between two areas with different paths
int main()
{
vector<double> dist; // vector, double integer value
double sum = 0; // sum of two doubles
double min = 0; // min dist
double max = 0; // max dist
cout << "Please enter a sequence of integer doubles (representing distances): \n";
double val = 0;
while (cin >> val)
{
if (val <= 0)
{
if (dist.size() == 0)
error("no distances");
cout << "The total distance is: " << sum << "\n";
cout << "The smallest distance is: " << min << "\n";
cout << "The greatest distance is: " << max << "\n";
cout << "The average (mean) distance is: " << sum / dist.size() << "\n";
keep_window_open();
return 0;
}
dist.push_back(val); // stores vector value
// updating the runtime values
sum += val;
if (val > min)
min = val;
if (max < val)
max = val;
}
if (dist.size() == 0)
error("no distances");
cout << "The total distance is: " << sum << "\n";
cout << "The smallest distance is: " << min << "\n";
cout << "The greatest distance is: " << max << "\n";
cout << "The average (mean) distance is: " << sum / dist.size() << "\n";
keep_window_open();
}
Кроме того, я пытался ввести небольшой блок исходного кода в виде чего-то вроде «catch (runtime_error e)», но он ожидает какого-то объявления, и я не знаю, как заставить его скомпилировать без ошибок.
Помочь с удалением реплицированного / повторяющегося блока кода, чтобы уменьшить раздувание, было бы здорово — помимо всего прочего.
Вместо того, чтобы иметь if
заявление внутри while
, вы должны объединить два условия, чтобы избежать дублирования этого кода:
while ( (cin >> val) && (val > 0) )
Также вам нужно инициализировать min
в наибольшее значение, а не ноль, если вы хотите, чтобы первое сравнение захватывало первое возможное значение в течение мин.
Создание функции из дублированного кода — это решение общего назначения, которое в вашем случае не является хорошим выбором по двум причинам: во-первых, в этом нет необходимости, поскольку проще и лучше объединить поток управления, чтобы не было нужно вызвать этот код в двух местах. Во-вторых, в дублированном коде используется слишком много локальных переменных, поэтому, если бы была причина превратить дублированный код в функцию, хороший дизайн также потребовал бы сбора некоторых или всех этих локальных переменных в объект.
Если бы не было чище и проще объединить два условия, все равно было бы лучше объединить поток управления, чем придумывать функцию для вызова из двух мест. Вы холодно использовали:
if (val <= 0)
{
break;
}
Других решений пока нет …