Другие языки программирования и технологии

Ошибка в языке С++ :"Run-Time Check Failure #3 - The variable 'interval2' is being used without being initialized".

В общем, это алгоритм ( находится ниже) сортировки 3-х чисел по неубыванию. Почему-то с числами 123 он работает и выводит "1 2 3", а с числами 321 выдает эту ошибку. Хотелось бы разобраться.

#include
using namespace std;
int main(int argc, char* argv[]) {
int a, b, c;
cin >> a >> b >> c;
int interval1;
int interval2;
int interval3;
if (a >= b && a >= c)
{
interval3 = a;
}
if (a >= b && a < c)
{
interval2 = a;
}
if (a < b && a < c)
{
interval1 = a;
}
if (b >= a && b >= c)
{
interval3 = b;
}
if (b >= a && b < c)
{
interval2 = b;
}
if (b < a && b < c)
{
interval1 = b;
}
if (c >= a && c >= b)
{
interval3 = c;
}
if (c >= a && c < b)
{
interval2 = c;
}
if (c < a && c < b)
{
interval1 = c;
};

cout << interval1 << " " << interval2 << " " << interval3 << endl;
system("pause");
return 0;
}
Подставляем 3 2 1 в программу и видим:

if (3 >= 2 && 3 >= 1) { interval3 = 3; } // сработало
if (3 >= 2 && 3 < 1) { interval2 = 3; } // пропущено
if (3 < 2 && 3 < 1) { interval1 = 3; } // пропущено
if (2 >= 3 && 2 >= 1) { interval3 = 2; } // пропущено
if (2 >= 3 && 2 < 1) { interval2 = 2; } // пропущено
if (2 < 3 && 2 < 1) { interval1 = 2; } // пропущено
if (1 >= 3 && 1 >= 2) { interval3 = 1; } // пропущено
if (1 >= 3 && 1 < 2) { interval2 = 1; } // пропущено
if (1 < 3 && 1 < 2) { interval1 = 1; } // сработало

interval3 == 3 // нормально
interval1 == 1 // нормально
interval2 == неведомая фигня // ошибка

Существует всего 6 вариантов перестановок. Потому что-то вроде такого (не уверен, что нигде не ошибся с индексами, но общий принцип от этого не меняется):

switch (4 * ((int)(a > b)) + 2 * ((int)(a > c)) + 1 * ((int)(b > c))) {
case 0: cout << a << ' ' << b << ' ' << c; break;
case 1: cout << a << ' ' << c << ' ' << b; break;
case 3: cout << c << ' ' << a << ' ' << b; break;
case 4: cout << b << ' ' << a << ' ' << c; break;
case 6: cout << b << ' ' << c << ' ' << a; break;
case 7: cout << с << ' ' << b << ' ' << a; break;
}
Дамир Мадьяров
Дамир Мадьяров
97 976
Лучший ответ
Зайтжон Кахаров Спасибо, разобрался. Кстати, у вас в case 7 "с" русская.
используй последоватльность
if
else if
else if
.
.
.
else

Иначе у тебя a при изменении в одном блоке может удовлетворяться в последующих так как у тебя идут нульцевые ифы подряд

А ошибка у тебя говорит о том, что не при любых вариантах переменная interval2 инициализируется. В каком то варианте она остается не заданной. Ошибка времени выполнения)))
Alex Skorobogatov
Alex Skorobogatov
10 755
Если a, b, c могут быть только положительными.

int interval1 = -1;
int interval2 = -1;
int interval3 = -1;
...
cout << (interval1 == -1) ? "Unknown" : to_string(interval1);
cout << (interval2 == -1) ? "Unknown" : to_string(interval2);
cout << (interval3 == -1) ? "Unknown" : to_string(interval3);
Taras Ivanov
Taras Ivanov
8 552
int main() {
int a,b,c;
int interval1,interval2,interval3;
int state=0;
cin >> a >> b >> c;
state = (a < b) ? 4 : 0;
state |= (b < c) ? 2 : 0;
state |= (a < c) ? 1 : 0;
switch (state) {
case 7: interval1=a; interval2=b; interval3=c; break;
case 5: interval1=a; interval2=c; interval3=b; break;
case 4: interval1=c; interval2=a; interval3=b; break;
case 3: interval1=b; interval2=a; interval3=c; break;
case 2: interval1=b; interval2=c; interval3=a; break;
case 0: interval1=c; interval2=b; interval3=a; break;
}
cout << interval1 << interval2 << interval3 << endl;
return 0;
}