2016-01-20 6 views
0

Если я ввода этого кода:Почему этот код не работает правильно? (C++)

#include<iostream> 
using namespace std; 
int main() 

{ 

int input, qty, min, max; 
bool validity = 1; 

cout << "How many integers would you like to enter? \n"; 
cin >> qty; 

if (qty <= 0) 
    cout << "Please enter a positive number\n"; 

else 
{ 
    cout << "Please enter " << qty << " integers:" << endl; 

    for (int x=0; x < qty; x++) 
    { 
     cin >> input; 

     if (input > max) 
      max = input; 

     if (input < min) 
      min = input; 

    } 

} 


if (validity) 
{ 
    cout << "Minimum: " << min << endl; 
    cout << "Maximum: " << max << endl; 
} 


return 0; 
} 

Он работает, как ожидалось.

Но если у меня есть это:

#include<iostream> 
using namespace std; 
int main() 

{ 

int input, qty, min, max; 
bool validity = 1; 

cout << "How many integers would you like to enter? \n"; 
cin >> qty; 

if (qty <= 0) 
    cout << "Please enter a positive number\n"; 

else 
{ 
    cout << "Please enter " << qty << " integers:" << endl; 

    for (int x=0; x < qty; x++) 
    { 
     cin >> input; 

     if (input > max) 
      max = input; 

     if (input < min) 
      min = input; 

    } 

} 

if (max > 2147483646) 
{ 
    cout << "Please enter a valid value for integers." << endl; 
    validity = 0; 
} 

if (min < -2147483647) 
{ 
    cout << "Please enter a valid value for integers." << endl; 
    validity = 0; 
} 

if (validity) 
{ 
    cout << "Minimum: " << min << endl; 
    cout << "Maximum: " << max << endl; 
} 


return 0; 
} 

Это дает мне ошибочные значения.

Что я делаю неправильно? Любая помощь приветствуется. (Я - noob btw). Добавление небольшого текста здесь, чтобы я мог опубликовать этот вопрос .............................

+1

Я получаю [полезные предупреждения компилятора] (http://coliru.stacked-crooked.com/a/8d634c21f4b7f180). – chris

ответ

2

max и min неинициализированный. В C++ это означает, что значения могут быть вообще любыми, если только в say Java, где примитивы автоматически инициализированы до 0.

Один из способов исправить - установить первый флаг и установить max и min первое значение вошел.

bool first = true; 
for (int x=0; x < qty; x++) 
{ 
    cin >> input; 

    if(first) 
    { 
     max = input; 
     min = input; 
     first = false; 
    } 
    if (input > max) 
     max = input; 

    if (input < min) 
     min = input; 

} 

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

Так что if(input > max) проверяет, превышает ли количество случайных чисел от -2 до 2 миллиардов. (не полезно). Введенный там флаг first инициализирует min/max в первой итерации цикла for, или первое значение, введенное пользователем, которое гарантируется как минимальным, так и максимальным значением введенного значения, поскольку это единственное введенное значение ,

+0

Спасибо! Это исправлено: –

+0

w00t! рад помочь. Также вы должны поместить фигурные скобки {} после всех if-утверждений, даже для однострочных. Это сэкономит вам много головной боли в долгосрочной перспективе. Удачи! – TinyTheBrontosaurus

+0

* В C++ это означает, что значения могут быть вообще любыми *. Фактически, использование неинициализированных переменных - это [* undefined behavior *] (https://en.wikipedia.org/wiki/Undefined_behavior), поэтому может случиться что угодно (включая сбои и т. Д.). Обычно компиляторы используют все, что хранится в этой ячейке памяти, но не следует полагаться на это. – vsoftco

Смежные вопросы