2015-11-27 3 views
-2

Мое упражнение выглядит следующим образом: учитывая список из N целых чисел, найдите его среднее (как двойное), максимальное значение, минимальное значение и диапазон. Ваша программа сначала попросит N, количество целых чисел в списке, которое будет вводить пользователь. Затем пользователь вводит N дополнительных номеров.Поиск min max в C++

Вот мой код:

#include "stdafx.h" 
#include <iostream> 
using namespace std; 

int main() 
{ 
    int n; 
    cout << "Input n: "; 
    cin >> n; 

    int first;    //**LINE NUMBER 1** 
    cout << "No 1 is: "; 
    cin >> first; 
    int max = first; 
    int min = first; 

    for (int i=1; i<n;i++) //**LINE NUMBER 2** 
    { 
     int x; 
     cout << "No " << i+1 << " is: "; 
     cin >> x; 
     first = x;   //**LINE NUMBER 3** 
     if (max < x) 
     { 
      max = x; 
     } 
     if (min > x) 
     { 
      min = x; 
     } 
    } 
    cout << "max is: " << max << endl; 
    cout << "min is: " << min << endl; 
    cout << "mean is: " << (double) (max+min)/2 << endl; //**LINE NUMBER 4** 
    cout << "range is: " << max - min << endl; 

    return 0; 
} 

Однако решение немного отличается:

  • Для линии номер 1, это int first=0; вместо int first;

  • Для линии номер 2, это for (int i=1; i<n;++i) вместо for (int i=1; i<n;i++)

  • В строке номер 3, это first += x; вместо first = x;

  • Для линии с номером 4, это cout << "mean is: " << (double) first/n<< endl; вместо cout << "mean is: " << (double) (max+min)/2 << endl;

Я попробовал несколько примеров, но оба кода производят одни и те же результаты. Почему это? Или я где-то ошибаюсь?

+0

это обман? http://coliru.stacked-crooked.com/a/bad0f9b90e22f17a – sehe

+0

Что это значит? Метод здесь не использует 'iterator' и' algorithm'. Эта проблема и ее решение от открытого курса MIT: http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-096-introduction-to-c-january-iap-2011/ – SiXUlm

+0

Первые два отличия стилистичны. Что касается вторых двух отличий, ваш код не будет правильно вычислять среднее значение, если вводятся более двух значений. Очевидно, что ваши тестовые примеры были недостаточными. – Peter

ответ

3

Ну:

Ни одна из линий не являются сами по себе, НЕПРАВИЛЬНО. Более того, их просто желательно сделать другим путем. то есть:

  • int first =0 только гарантирует, что first == 0 начать с. int first; может вызвать проблемы, потому что оно, первоначально на произвольное число (что бы ни случилось быть на адрес памяти, что переменная указывает)

  • хотя ++i и i++ работают одинаково в течение петель в качестве итератора, они имеют небольшую разницу в других обычаях. Узнайте больше о том, что here

  • first += x по существу first = first + x, что более четко отражает разницу между вашим кодом и этим. Это также дает понять, почему int first = 0 так важен. Если first некоторая случайная величина, то сумма всех чисел (что first должно быть), будет случайным образом начать с номером, не всегда 0.

  • последний один единственный где вы, по сути, ошибаетесь. mean определяется как сумма всех ваших данных, деленная на количество точек данных (то же, что и average), где median описывается как средняя точка данных или номер, который описывает среднюю точку между максимальным и минимальным ваших данных. Где вы рассчитываете, что вы думаете, mean на самом деле median. Сложность этого заключается в том, что иногда, в зависимости от ваших данных, mean = median.Например, если ваши данные 3,4,5 тогда как среднее значение и медиана равна 4

Я надеюсь, что это проясняет вещи для вас :)

+0

хотя бы упомянуть о злобном стиле C-стиля ... – sehe

+0

спасибо за подробный ответ! Все мне понятно, за исключением крошечного момента: после инициализации 'first == 0', я сначала переписываю его' cin >> first'. Это действительно имеет значение? – SiXUlm

+0

Нет, я не понял, что ты это сделал. Если вы инициализируетесь на другое значение, тогда с помощью 'first = 0' будет только отказоустойчивость в этой точке. –