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

Какой оператор в Си позволяет досрочно завершить ВСЕ циклы (например если цикл в цикле) или как это вообще можно сделать

Задание: Дана матрица Р с двумя строками и десятью столбцами, каждым столбцом которой задана абсцисса и ордината одной из десяти точек плоскости. Если нет ни одной пары точек, расстояние между которыми меньше заданной величины R, заменить на нуль в матрице Р все отрицательные абсциссы точек, увеличив ординаты этих точек на R
Часть программы:
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; i++)
{
if (((a[i][0] - a[j][0]) ^ 2 + (a[i][1] - a[j][1]) ^ 2)>s^2)
{
for (k = 0; k < 10; k++)
{
if (a[k][0] < 0) { a[k][0] = 0; a[k][1] = a[k][1] + s; }
printf("%3d%3d", a[k][0], a[k][1]);
}
//в этом месте мне нужен оператор который завершит все циклы
}

}

}
break выйдет из одного только цикла, потому или флаги или goto... как раз в таком случае как исключение его рекомендовали. Goto не страшный оператор, если передача идет вперед по коду, а не назад... вот тогда предсказать все ветвления жутко сложно. Да и как для return, если goto всего один, то проблем в понимании нет.
Жансерік Монголия
Жансерік Монголия
85 534
Лучший ответ
Только goto. Но лучше переписать программу с флагами. Для начала - ^ - это не степень. И цикл тут нужен только двойной, выставляющий флаг, а после него, если флаг выставлен - одинарный, меняющий координаты.

int hasNearPoints = 0;
for (i = 0; !hasNearPoints && i < 10; i++)
{
for (j = 0; !hasNearPoints && j < 10; i++)
{
hasNearPoints = ((a[i][0] - a[j][0])*(a[i][0] - a[j][0]) + (a[i][1] - a[j][1])*(a[i][1] - a[j][1])>s*s); //операция сравнения вернет 0, если ложь
}
}
if( hasNearPoints ) {
//меняем в цикле нужные точки
}
Если к написанию программ подходить культурно, то означенное место нужно вштырить return. Разумеется, для этого нужно фрагмент кода оформить в виде функции. goto в таком коде - это умопомрачение. Другой его не заметит, а через пару месяцев забудешь: зачем тут стоит goto.

Операторы досрочного завершения циклов есть в других языках, а в C можно использовать специальные функции, но они неудобны и не совсем понятны.
Евгений Бугаев
Евгений Бугаев
88 398
for (i = 0; i < 10; i++)
{
bool flag = false;
for (j = 0; j < 10; i++)
{
if (((a[i][0] - a[j][0]) ^ 2 + (a[i][1] - a[j][1]) ^ 2)>s^2)
{
for (k = 0; k < 10; k++)
{
if (a[k][0] < 0) { a[k][0] = 0; a[k][1] = a[k][1] + s; }
printf("%3d%3d", a[k][0], a[k][1]);
}
//в этом месте мне нужен оператор который завершит все циклы
flag = true;
break;
}
if (flag) break;
}
if (flag) break;
}

но обычно я заворачиваю такое в метод класса и вызываю return)
Сергей Логашкин Какой класс в C?
Сергей Логашкин А еще - неправильно делать две точки выхода из цикла. И flag лучше как-то осмысленнее называть.
bool found = false;//кстати, bool - это тоже плюсы
for (i = 0; !found && i < 10; i++) {
...
if(...)found = true;
}
goto
Андрей <>
Андрей <>
7 018
return, goto, break с флагами.
Кирилл Дукмас
Кирилл Дукмас
1 755
Михаил Мельчаков А break с флагом это как? Можете привести простой пример?
break;
goto считается плохим тоном. Посему break. А что, в Си break параметров (кол-ва разрываемых циклов) иметь не может?
Михаил Мельчаков break завершает только текущий цикл