Отговори на тема  [ 35 мнения ]  Отиди на страница Предишна  1, 2, 3  Следваща
Незабавен изход от функция в С 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 03, 2005 11:31 am
Мнения: 766
Местоположение: Пловдив
Мнение 
http://people.ischool.berkeley.edu/~nakov/algoplus/

Има я в книжарниците скъпа е , но си заслужава.


Пон Апр 04, 2011 11:53 pm
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Нед Апр 17, 2005 9:23 am
Мнения: 112
Мнение 
Цецо написа:
Reader написа:
Цецо, примерът ти не пасва по функционалност на неговия код. :wink:
Със сигурност не мога да постигна неговата "функционалност" :):):)
:D
Не, имах предвид, че "код"-а след второто условие при него не се изпълнява, ако условието е изпълнено, а в твоя пример се изпълнява винаги.
Ама като не ще да уточни блоковете и условията…


Вто Апр 05, 2011 7:55 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пет Фев 05, 2010 7:53 pm
Мнения: 25
Мнение 
TheHungry благодаря за информацията за книгата, ще я потърся да видя дали ми е по джоба.

Reader написа:
Цецо написа:
Reader написа:
Не, имах предвид, че "код"-а след второто условие при него не се изпълнява, ако условието е изпълнено, а в твоя пример се изпълнява винаги.
Ама като не ще да уточни блоковете и условията…


Общо взето, е така:

Код:
do{
code;

if(условие1){
    code;
    if(условие2){
       code;
       връшане в do;
     }
    if(условие3){
       code;
       връшане в do;
     }
    code1;
}
else if(условие2) code;
else code;

}while(условие0); 



Чудя се за елегантен и правилен подход за изпълнение на тази ситуация, защото с иф и елз ми изглежда много оплетено.
Условие2 трябва да се провери когато е изпълнено условие1 и когато не е изпълнено, затова с онези goto си рекох да спестя малко писане. :D
Също така след изпълнение на условие2 и 3 и кода за него, искам да изляза до do, без да се изпълни code1.


Вто Апр 05, 2011 9:01 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Май 01, 2009 4:01 pm
Мнения: 1438
Мнение 
Тотално си се оплел. Изтрии тия паяжини и започни отначало!


Вто Апр 05, 2011 10:13 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пет Фев 05, 2010 7:53 pm
Мнения: 25
Мнение 
Дайте ми някаква насока, не ми идват много варианти като идеи.
switch не мога да ползвам защото условията да са ><

:oops:


Вто Апр 05, 2011 10:34 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 9:39 pm
Мнения: 2283
Мнение 
Там дето си чел не пише ли нищо за оператора 'continue' ? Сложи на мястото на 'връшане в do;' 'continue'.


Вто Апр 05, 2011 10:38 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пет Фев 05, 2010 7:53 pm
Мнения: 25
Мнение 
Пише, но не ми е ясно дали ще прескочи от условие2 на code1, или направо в do (мда като се замисля там ще иде). Но в книгата пише, че е лоша практика да се ползва, и щяхте да ме сецнете пак :D :D


Вто Апр 05, 2011 10:44 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 9:39 pm
Мнения: 2283
Мнение 
Приеми 'continue' като goto към условието на цикъла - с други думи след него се завърта нов цикъл. Дали е добра или лоша практика - ако прави прави кода по-ясен и изчистен може да ползваш всичко.


Вто Апр 05, 2011 11:24 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Нед Апр 17, 2005 9:23 am
Мнения: 112
Мнение 
iivantodorov, пак не е ясно дали „code“-тата след условия2 са еднакви. Ако да, и не искаш да използваш continue (макар че си е напълно нормален оператор), един вариант е (добавих номерация на code, за да се различават):
Код:
do {
   code0;
   if (условие1)
   {
      code9;
   }
   if (условие2)
   {
      code2;
   }
   else if (условие1)
   {
      if (условие3)
      {
         code3;
      }
      code1;
   }
   else code5;
} while (условие0);


Вто Апр 05, 2011 11:49 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пет Фев 05, 2010 7:53 pm
Мнения: 25
Мнение 
Да, извинявам се, да видим дали така ще е по-разбираемо:


Код:
do{
code;

if(условие1){
    code1;
    if(условие2){
       code2;
       връшане в do;
     }
    if(условие3){
       code3;
       връшане в do;
     }
    code4;
}
else if(условие2) code2;
else code5;

}while(условие0); 


Reader по твоя начин мисля, че ако условие3 е изпълнено ще се изпълни и code1 а не трябва.
Да видим дали мога да променя малко твоята идея:

Код:

do {
   code;
   if (условие1)
     {
      code1;
     }
   if (условие2)
     {
      code2;
     }
   else if (условие3)
          {
           code3;
          }
   else if (условие1)
          {
           code4;
          }
   else code5;
} while (условие0);


Какво мислите за това?
Макар че и с continue става, тук не повтарям код2.
Ама като видя толкова if-ове и ми изтръпва снагата. :D
Не може да няма друг похват. :-k

ПП. Уф, че съм тъп като галош 46-ти номер :evil:
Условие3 не трябва да се проверява ако не е изпълнено условие1.
И така, прибягвам до continue:

Код:

do {
   code;
   if (условие1)
     {
      code1;
     }
   if (условие2)
     {
      code2;
     }
   else if (условие1)
          {
            if (условие3)
             { 
              code3;
              continue;         //за да не се изпълни code4
             }
           code4;
          }
   else code5;
} while (условие0);


Последна промяна iivantodorov на Вто Апр 05, 2011 1:50 pm, променена общо 2 пъти



Вто Апр 05, 2011 1:33 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
ох въобще не мога да ти следя мисълта, ама много объркано го раздаваш. Имам чуството, че от нещо дребно сам си правиш грандиозни проблеми.

Така не става ли:

Код:
do{
     code;
     if(условие1){
          code1;
          if(условие2)
              code2;
          else if(условие3)
               code3;
          else
               code4;
     }
     else if(условие2)
         code2;
     else
         code5;
}while(условие0); 


Винаги се стреми да избягваш goto и continue. Не, че не можеш да ги ползваш, не е забранено, ама без тях е по-четливо. Ще спестиш някоя и друга наносекунда..... на цената на нечетлив и объркан код.

П.С.

Сега прегледах предишните ти постове и съвсем се обърках. Ти всеки код, който постваш пминава по различни пътища.... Как да ти кажем как да го направиш, като ти самия не можеш да дефинираш какво искаш да направиш.

Ако ти е по лесно дефинирай го разказвателно:

Ако е изпълнено условие бла-бла, да се изпълни код бла-бла и т.н. Ама го прегледай 10 пъти да си сигурен и да ти дадем код, който после да можеш да осмислиш.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Последна промяна Цецо на Вто Апр 05, 2011 1:59 pm, променена общо 1 път



Вто Апр 05, 2011 1:49 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пет Фев 05, 2010 7:53 pm
Мнения: 25
Мнение 
Благодаря ти Цецо, както и на всички взели участие в темата и ударили едно рамо на новобранеца. :)

Твоя код става, но кажи ми последния в горното ми мнение дали и той ще направи същото?
Казваш, да избягвам continue/goto, но в случая горе ако кода е правилен, избягвам едно повторение на поредица от конструкции както и един if.
Тези if-ве не бавят ли повече изпълнението на програмата?


Вто Апр 05, 2011 1:57 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 9:39 pm
Мнения: 2283
Мнение 
@iivantodorov
Може ли да бъде изпълнено повече от едно условие едновременно, т.е. условие1 и 3 да речем ? Не редно при три условия да имаш повече от толкова(3) проверки - или нещо не знаем, или нещо не е наред в решението.


Вто Апр 05, 2011 1:59 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
Ми не, моят и твоят код ще правят различни неща. Защото моя ще провери условие 2, само ако е валидно условие 1. Докато ти ще провериш условие 2, даже и условие 1 да е отрицателно.

Проблема е че незнам ти какво точно искаш :)

Иначе if не е бавен. Нищо от нормалния синтаксис на езика не е "бавно". Забавянията идват от това което си сложил в "code".

Пак ти казвам - мисли мащабно. На структури. Отделни блокове които се изпълняват при ясни условия. Представи си целия алгоритъм като блок-диаграма. Избягвай всячески пресичане на пътища. Стреми се всичко да е изградено на дървовиден принцип. Като тръгнеш от началото в зависимост от условията минаваш през отделни блокчета и стигаш до края, без да се връщаш назад. Разклоняващи се пътища и ясно обособени блокве.

Не се стреми да избягваш повторения на сегменти с код (отделните блокчета). Просто ги сложи в отделна функция и си я викай. Така и кода и скоростта няма да пострадат.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Вто Апр 05, 2011 2:00 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 17, 2005 5:07 pm
Мнения: 813
Местоположение: Сливен
Мнение 
Не мога да разбера .. едно време като ни учеха почнаха с едно много убаво нещо -> блоксхема,алгоритъм ,flowchart .. както искате така го кажете ...
@iivantodorov я вместо компилатора вземи лист и химикал и си го надраскай със стрелкичките , да видиш после как бат Цецо ще ти изгенерира кода, който да copy->paste връщайки му бирата :P

едит-> Ей цецо ме изпреварил


Вто Апр 05, 2011 2:08 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 35 мнения ]  Отиди на страница Предишна  1, 2, 3  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни