Задание: Дана матрица Р с двумя строками и десятью столбцами, каждым столбцом которой задана абсцисса и ордината одной из десяти точек плоскости. Если нет ни одной пары точек, расстояние между которыми меньше заданной величины 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 всего один, то проблем в понимании нет.
Только 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 ) {
//меняем в цикле нужные точки
}
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 можно использовать специальные функции, но они неудобны и не совсем понятны.
Операторы досрочного завершения циклов есть в других языках, а в C можно использовать специальные функции, но они неудобны и не совсем понятны.
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)
{
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)
goto
return, goto, break с флагами.
Михаил Мельчаков
А break с флагом это как? Можете привести простой пример?
break;
goto считается плохим тоном. Посему break. А что, в Си break параметров (кол-ва разрываемых циклов) иметь не может?
Михаил Мельчаков
break завершает только текущий цикл
Похожие вопросы
- Как можно отследить место положение сотового с помощью другого сотового??? Можно ли вообще это сделать?
- Каким циклом можно заменить оператор UpCase в pascale
- Как в цикле вывести последовательность чисел 7 и 0. Например 70, 707 , 700, 770.Цикл от 1 до 1000Язык не важен...
- Заменить цикл условным оператором if
- Объясните тему Циклы, а пальцах? C++
- Цикл for в Дельфи или Паскале
- C++. В операторе switch нельзя разве использовать case x? а x пробежать в цикле for?
- Написал небольшую программу, не могу понять почему не работает цикл while и оператор else
- t-sql (курсоры и циклы - взаимозаменяемы?)
- Вопрос про цикл For
bool found = false;//кстати, bool - это тоже плюсы
for (i = 0; !found && i < 10; i++) {
...
if(...)found = true;
}