Программа для нахождения минимума, максимума, среднего, медианы и режима

Фон

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

Пример ввода

Введите целые числа и введите букву, когда закончите.

-2 3 3 5 6 4 4 8 9 9 9 1 -2 10 10 10

Пример вывода

Your numbers are: -2 -2 1 3 3 4 4 5 6 8 9 9 9 10 10 10
Max: 10
Min: -2
Average: 5.4375
Median: 5.5
Mode: 9 10 (3)

Мой код

#include <iostream>
using namespace std;

void main()
{
double value, sum;
double average, minimum, maximum;
int count;
// initialise
sum = 0.0;
count = 0;
cout << "Enter a value: ";
cin >> value;
minimum = value;
maximum = value;
while (value >= 0.0)
{
// process value
sum += value;
count++;
if (value > maximum)
maximum = value;
else if (value < minimum)
minimum = value;
// get next value
cout << "Enter a value: ";
cin >> value;
}
if (count == 0)
cout << "No data entry" << endl;
else
{
average = sum / count;
cout << "There were " << count << " numbers" << endl;
cout << "Average was " << average << endl;
cout << "Minimum was " << minimum << endl;
cout << "Maximum was " << maximum << endl;
}
}

-1

Решение

Если вы хотите использовать STL, вы можете написать что-то вроде этого (используйте c ++ 11):

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
template<typename A, typename B>
std::pair<B,A> flip_pair(const std::pair<A,B> &p)
{
return std::pair<B,A>(p.second, p.first);
}
template<typename A, typename B>
std::multimap<B,A> flip_map(const std::map<A,B> &src)
{
std::multimap<B,A> dst;
std::transform(src.begin(), src.end(), std::inserter(dst, dst.begin()),
flip_pair<A,B>);
return dst;
}
int main() {
std::string line;
std::cout << "Enter numbers: ";
std::getline(std::cin, line);
std::istringstream iss(line);
std::vector<int> elements;
elements.reserve(1000);
std::string elem;
while (std::getline(iss, elem, ' ')) {
try {
elements.push_back(std::stoi(elem));
} catch (...) {  }
}
double sum = 0.0;
std::size_t n = elements.size();
std::sort(elements.begin(), elements.end());
std::cout << "max=" << elements.back() << std::endl;
std::cout << "min=" << elements.front() << std::endl;
for (auto &x: elements) {
sum += x;
}
if (n == 0) return 1;
std::cout << "avg=" << sum / n << std::endl;
if (n == 1) {
std::cout << "med=" << elements[0] << std::endl;
}
else if (n % 2 == 0) {
std::size_t i = n/2;
std::cout << "med=" << (double)(elements[i] + elements[i-1]) / 2.0 << std::endl;
}
else {
std::cout << "med=" << elements[n/2] << std::endl;
}
std::set<int> elements_set;
for (auto &x: elements) {
elements_set.insert(x);
}
std::map<int, std::size_t> elements_count;
for (auto &x: elements_set) {
elements_count.insert(std::pair<int, std::size_t>(x, std::count(elements.begin(), elements.end(), x)));
}
std::multimap<std::size_t, int> count_elements;
count_elements = flip_map(elements_count);
std::cout << "mod: ";
std::size_t count_mod = count_elements.rbegin()->first;
for (auto &x: count_elements) {
if (x.first == count_mod) {
std::cout << x.second << ", ";
}
else {  }
}
std::cout << "(" << count_mod << ")" << std::endl;
return 0;
}
0

Другие решения

Медиана:

Во-первых, вам нужно отсортировать свои номера. Вы можете сохранить их в массиве, а затем использовать алгоритм сортировки, например, сортировка по вставке, сортировка по выбору и т. д. После сортировки массива медиана — это среднее число. Ниже приведен код для реализации сортировки вставкой, предполагая, что вы сохранили свои числа в arr[] а также length это длина вашего массива.

    void insertion_sort(double arr[], int length) {
int i, j;
double tmp;
for (i = 1; i < length; i++) {
j = i;
while (j > 0 && arr[j - 1] > arr[j]) {
tmp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = tmp;
j--;
}//end of while loop
print_array(arr,5);
}//end of for loop
}//end of insertion_sort.

Режим:

Вы можете иметь счетчик для отслеживания каждого числа в вашем массиве. Наиболее частым является режим.

0

Следующий код является отредактированной версией вашего кода, которая полностью работает:

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
double value, sum;
double average, minimum=(int)INFINITY, maximum=-(int)INFINITY, median;
map<int,int>modes;
vector<int>data;
int count,mxmode=0;
// initialise
sum = 0.0;
count = 0;
cout << "Enter a value: ";

while (cin >> value)
{
// process value
sum += value;
count++;
if (value > maximum)
maximum = value;
else if (value < minimum)
minimum = value;

modes[ value ]++;
mxmode = max(mxmode, modes[value]);
data.push_back(value);

// get next value
cout << "Enter a value: ";
}
if (count == 0)
cout << "No data entry" << endl;
else
{
average = sum / count;

sort(data.begin(), data.end());

if(data.size()%2==0) median = ( data[ data.size()/2 - 1 ] + data[ data.size()/2 ] )/2.0;
else median = data[ data.size()/2 ];

cout << "There were " << count << " numbers" << endl;
cout << "Average was " << average << endl;
cout << "Minimum was " << minimum << endl;
cout << "Maximum was " << maximum << endl;
cout << "Median was " << median << endl;
cout << "Median was";

for (auto &x: modes)
if(x.second == mxmode) cout<<" "<<x.first;

cout<<" ("<<mxmode<<")" << endl;
}
}

Помните:

  • Не забудьте скомпилировать его с самыми последними -std=c++11 пометить, как я использовал функцию C ++ 11.
  • Ввод заканчивается EOF или в консоли вы можете прекратить его, нажав Ctrl + Z затем Войти (Используйте соответствующие ключи, если вы используете ОС, отличную от Windows).
0
По вопросам рекламы [email protected]