Loading...
butoff avatar butoff 33 Точки

Изход от няколко вложени циклъла без break?

От вложени цикли излизам с break. Например:

for (int i = 0; i < 10; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    for (int k = 0; k < 10; k++)
                    {
                        if (sum > 5) { break; }
                    }
                if (sum > 5) { break; }
                    }
            if (sum > 5) { break; }
             }
Защо не ми се получава с while() с променлива в най-вътрешния цикъл?  Защо не я следи? Променивата е глобална.

 int i = 0;
            while (i < 10 && ok)
            {
                for (int j = 0; j < 10; j++)
                {
                    for (int k = 0; k < 10; k++)
                    {
                        if (sum > 5) { ok = false; }
                    }
                }
            i++;
            }

Тагове:
0
Fundamentals Module
sevgin0954 avatar sevgin0954 557 Точки

Най добрия вариант е да изкараш циклите в нов метод и с return, а с while не ти се получава защото трябва да стигне до края за да се върне в началото и да направи проверка i < 10 && ok . Пусни си дебъгера и ще разбереш

0
02/06/2017 14:50:36
AnnaProgrammer avatar AnnaProgrammer 74 Точки

Пробвай с goto

            while (i < 10)
            {
                for (int j = 0; j < 10; j++)
                {
                    for (int k = 0; k < 10; k++)
                    {
                        if (sum > 5) { 
                            goto Exit;

                          }
                    }
                }
                i++;
            }
            Exit:
            Console.WriteLine (" "); //statement

-1
AnnaProgrammer avatar AnnaProgrammer 74 Точки

Не е, и не го препоръчвам. Но за дребни и незначителни програми е най-бързия начин.

Иначе другия начин е с break:

            int i = 0;
            bool ok = true;
            int sum = 0;

            while (i < 10 && ok)
            {
                for (int j = 0; j < 10; j++)
                {
                    for (int k = 0; k < 10; k++)
                    {
                        sum = i + j + k;
                        if (sum > 5) {
                            ok = false;
                            break;
                        }
                    }
                    if (ok == false) {
                        break;
                    }
                }
                i++;
            }
            Console.WriteLine (sum); //6

Доста по-обемист е laugh Може да има и друг начин, но аз не се сещам. Не мисля, че е проблем да се използва goto ако само това е целият код на програмата.

0
02/06/2017 15:28:39
AnnaProgrammer avatar AnnaProgrammer 74 Точки

А друг варянт е, както каза Севгин, с метод който връща стойност. Знам малко C и там ставаше доста странно в сравнение със скриптовите езици, които аз досега съм ползвала - трябваше да се декларира извън Main(), после да се извика вътре в него, абе ако искаш провери как е на C# laugh

0
maya_ip avatar maya_ip 28 Точки

Смени направо стойностите на променливите i,j и т.н., които ползваш в циклите като ги приравниш на края на интервала им и ще излезеш от тях. В твоят случай може да направиш :

 if (sum > 5) { i=10;j=10;break; }

Ако трябва да определиш нещо на база на реалните им стойности е добре да го направиш отново в тази точка и пак да ги приравниш на максимумите на интервалите им. 

0
butoff avatar butoff 33 Точки

Много хитро решение! Благодаря!

0
kolioi avatar kolioi 641 Точки

Ами ти почти си го направил smiley От while() цикъла излизаш когато i стане равно на 10 или когато ok стане false. През това време въртиш двата вложени for() цикъла. Е, как може да излезеш от тях? Ами просто трябва на всяка итерация да проверяваш дали ok не е станало false - също както правиш в while() цикъла.

int i = 0;
while (i < 10 && ok)
{
  for (int j = 0; j < 10 && ok; j++)
    {
      for (int k = 0; k < 10 && ok; k++)
        {
          if (sum > 5) { ok = false; }
        }
    }
  i++;
}

Всъщност дори не ти трябва променливата ok, може просто да проверяваш дали sum > 5, ето така:

int i = 0;
while (i < 10 && sum <= 5)
{
  for (int j = 0; j < 10 && sum <= 5; j++)
    {
      for (int k = 0; k < 10 && sum <= 5; k++)
        {
          if (sum > 5) { break; }
        }
    }
  i++;
}

А къде изчисляваш стойността на sum???

0
krasi1105 avatar krasi1105 380 Точки

Във втория пример проверката е излишна.

0
spzvtbg avatar spzvtbg 581 Точки

променливата е глобална да но дори и д я променяше някъде в примера си програмата си има ред на изпълнение

в твоя пример ще спре вътрешния фор цикъл и ще продължи със следващата интерация на външния фор цикъл който ще завърти отново вътрешния и тнт,  когато приключи и с двата чак тогава ще се качи да провери условието на уайлцикъла

0
butoff avatar butoff 33 Точки

Благодаря за всички отговори!  Видя ми се излишно повторение на код повтарянето на break, но май това е начина. 

Досега бърках ползването на булева променлива като флаг в  while() цикъл. Мислех си, че като се промени флага излизаш от

цикъла. Но така работи хардуерния флаг при микроконтролерите, тук си има ред....

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.