Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.20;
Скачать: CL | DM;

Вниз

чем отличаются exit от breake   Найти похожие ветки 

 
miracle_fox ©   (2004-01-07 01:46) [0]

подскажите пожалуйста на примере чем отличаются exit от breake


 
raidan ©   (2004-01-07 01:55) [1]

procedure spentdaysAfterSchool();
begin
repeat
start_day(haveShower,haveMeal);
go_toJob(gtCar);
job();
go_fromJob(gtCar);
repeat
repeat
result:=have_sex(sxTraditional or sxUntraditional);
if result=resDoneOnlyYou then continue else
if result=resDoneSame then break else
if result=resDiedInABed then exit;
until false;
wait(2{часа});
until (time="3am");
sleep();
until died();
end;
//типа умер
//вот exit выходит сразу из процедуры/функции, а break - только из цикла
//хотя использование break и exit - это не очень хорошо с точки зрения структурного программирования
:)))


 
default ©   (2004-01-07 01:59) [2]

"хотя использование break и exit - это не очень хорошо с точки зрения структурного программирования"
это кто такое сказал и почему?


 
TButton ©   (2004-01-07 02:05) [3]

действительно. а что хорошо "с точки зрения структурного программирования"? GoTo?


 
raidan ©   (2004-01-07 02:09) [4]


> "хотя использование break и exit - это не очень хорошо с
> точки зрения структурного программирования"
> это кто такое сказал и почему?

Можно было бы отмазаться, что это я типа сказал и точка :)
Но чувствует, что не сканает :)
Как доказали итальянские математики (маму их :) написать любую программу можно используя только три структуры: следование, цикл с предусловием и множественный выбор.
Это, в общем-то, каноны структурного программирования.
Операторы break и exit нарушают эту логику.
Эти операторы по сути то же самое, что GOTO!
Да абсолютно то же самое!
Вы любите использовать GOTO?
Я - нет!
Но exit"ом все-же часто балуюсь, потому что привычка пакостная :(
Никак от нее не избавлюсь :(

А вот скажи, почему у тебя имя как ссылка на e-mail? ;)))


 
miracle_fox ©   (2004-01-07 02:09) [5]

to TButton: ... с точки зрения структурного программирования хорошо программировать структурно :)

to raidan: знаю и сам ... и всех этому учу ... но в паскале. в дэльфи же пока что нужно программировать быстро. я только 9-й день учусь...


 
raidan ©   (2004-01-07 02:11) [6]


> и всех этому учу ... но в паскале. в дэльфи же пока что
> нужно программировать быстро. я только 9-й день учусь...

А чем отличается Паскаль от Делфи с точки зрения работы логики break и exit?


 
miracle_fox ©   (2004-01-07 02:18) [7]

наверное ничем (в этом плане), НО сдавать работу мне завтра, а ещё пояснительная записка не до конца сделана :( ... вот о чём я


 
raidan ©   (2004-01-07 02:22) [8]

Приведи в поясниловке кусок моего кода :)
Можешь его приукрасить и довести до ума :)


 
miracle_fox ©   (2004-01-07 02:28) [9]

не-е-е. это к ней много отношения не имеет :) я аску делаю и для одного алгоритма (придумал вчера ночью нужно вроде break). вот, если интересно и сам алгоритм (делюсь эксклюзивом :):

procedure TForm1.ICQClient1MessageRecv(Sender: TObject; Msg, UIN: String);
var i,r:integer; // через else?
begin
r:=0;
if form1.checkbox5.Checked=true then
for i:= 0 to (form1.ListView1.Items.Count-1) do //переберает все уины
if uin = form1.ListView1.Items.Item[i].Caption then // проверяет со всеми
if form1.ListView1.Items.Item[i].Checked<>true then //не нажата ли ...
begin
richedit1.Lines.Add("[" + UIN + "] " + Msg);
privateform.richedit1.Lines.Add("[" + UIN + "] " + Msg);
if form1.checkbox4.Checked=true then form1.richedit2.Lines.Add("["+ form1.Edit1.Text+"] "+form1.Edit3.Text);
end;
//успеваю...
if form1.checkbox5.Checked=false then
begin
for i:= 0 to (form1.ListView1.Items.Count-1) do //переберает все уины
if uin = form1.ListView1.Items.Item[i].Caption then // проверяет со всеми
if form1.ListView1.Items.Item[i].Checked<>true then //не нажата ли ...
begin
richedit1.Lines.Add("[" + UIN + "] " + Msg);
privateform.richedit1.Lines.Add("[" + UIN + "] " + Msg);
if form1.checkbox4.Checked=true then form1.richedit2.Lines.Add("["+ form1.Edit1.Text+"] "+form1.Edit3.Text);
r:=i;
break; //или exit.
end;

if uin<>form1.ListView1.Items.Item[r].Caption then
begin
richedit1.Lines.Add("r = "+ inttostr(r));
richedit1.Lines.Add("[" + UIN + "] " + Msg);
privateform.richedit1.Lines.Add("[" + UIN + "] " + Msg);
if form1.checkbox4.Checked=true then form1.richedit2.Lines.Add("["+ form1.Edit1.Text+"] "+form1.Edit3.Text);
end;
end;
end;


 
raidan ©   (2004-01-07 02:36) [10]


> miracle_fox © (07.01.04 02:28) [9]

В твоем случае не однох.... Упс :)
Не все равно :)
Если break, то будет прерван цикл for i:= 0 to (form1.ListView1.Items.Count-1) do //переберает все уины
if uin = form1.ListView1.Items.Item[i].Caption then // проверяет со всеми
if form1.ListView1.Items.Item[i].Checked<>true then //не нажата ли ...
begin

Условие будет проверено.
А если exit, то if uin<>form1.ListView1.Items.Item[r].Caption then begin никогда не проверится.
Только непонятно вот что: если судить по логике, то на этот break/exit будет выполнен только для первого найденного по условию if uin = form1.ListView1.Items.Item[i].Caption then // проверяет со всеми
if form1.ListView1.Items.Item[i].Checked<>true then //не нажата ли ...

Так и нужно?

Так почему у тебя имя как ссылка на e-mail??????


 
miracle_fox ©   (2004-01-07 02:38) [11]

> Так почему у тебя имя как ссылка на e-mail??????
бр-ррр-р ... не понял? miracle_fox - ник, а не имя :)
а что соссно тебя так тревожит в этом вопросе?


 
raidan ©   (2004-01-07 02:39) [12]

Да пусть ник!
А почему? Интересно же :))


 
miracle_fox ©   (2004-01-07 02:40) [13]

... и ещё: хочу проверить этот алгоритм. ты мог бы написать флуда немного на аську с уин: 275525382 - это тестовый.


 
miracle_fox ©   (2004-01-07 02:42) [14]

raidan © (07.01.04 02:39) [12]
>Да пусть ник!
>А почему? Интересно же :))
наверное при регистрации наклацал какие-то настройки, что-то типа: показывать мыльце на форуме .... думаю так :)


 
raidan ©   (2004-01-07 02:44) [15]

:))
А вот флудить на эту аську не получается :(
Не хотит ася посылать ничего на незарегенный у них номер :(


 
miracle_fox ©   (2004-01-07 02:50) [16]

сейчас немного расскажу про алгоритм, что я им имел ввиду:
есть такая опция как "игнорировать посторонних icq-пользователей". это галочка form1.checkbox5.Checked=true (если нажата), есть ещё игнор-лист среди "своих". т.е. они не выбрасываются из контакта ... а просто от них я если не хочу, то не принимаю сообщения пока if form1.ListView1.Items.Item[i].Checked=true ... т.е. выделен такой-то пользователь из контакт-листа. вот такая петрушка ... что-то правда глюкает он немного, может и из-за того, что ты написал


 
miracle_fox ©   (2004-01-07 02:54) [17]

raidan © (07.01.04 02:44) [15]
быть не может ... я сейчас под ним висюлькаю ... просто я не заполнял данные о себе


 
miracle_fox ©   (2004-01-07 02:57) [18]

вопрос ... почему r=0 причём постоянно ... ??? мне это не нужно. как устранить?


 
raidan ©   (2004-01-07 03:01) [19]


> вопрос ... почему r=0 причём постоянно ... ??? мне это не
> нужно. как устранить?

Потому что if uin = form1.ListView1.Items.Item[i].Caption then // проверяет со всеми
if form1.ListView1.Items.Item[i].Checked<>true then //не нажата ли ...
выполняет для первого же item"а :)


 
Германн ©   (2004-01-07 03:02) [20]

2raidan © (07.01.04 02:09) [4]

>Операторы break и exit нарушают эту логику.
>Эти операторы по сути то же самое, что GOTO!
>Да абсолютно то же самое!
>Вы любите использовать GOTO?
>Я - нет!

Я тоже нет. Но эти операторы отнюдь не то же самое, в смысле возможного вреда. GoTo преполагает переход куда-то, куда, как надеется программист, можно перейти без ошибки. А эти операторы выполняют переход в конкретные точки программы, куда действительно можно перейти без ошибки.
А уж выполнять весь цикл поиска чего-то от 0 до 10000..0, если нужный ответ получен на первом шаге - просто глупость. Пусть ею маются "итальянские математики".


 
miracle_fox ©   (2004-01-07 03:09) [21]

нет... ну вот смотри ... значит, если уин совпадает с капшном, тогда поверяем, если галочка не поставлена, то следующий в цикле уже i= не 0, а i=1 ... далее задумка таая: если не было ни одного, у которогобы уин = caption и чтобы не нажатый был, тогда просто цикл заканчивается. т.е. тот, кто мне шлёт сообщение - не из контакт листа а - посторонний, но так как у меня не стоит галочка (по условию if form1.checkbox5.Checked=false then
...), то получаю от этого постороннего. где ошибка? знаю, что есть ....


 
miracle_fox ©   (2004-01-07 03:11) [22]

to Германн: raidan говорит дело. если не хочешь весь миллион вариантов перебирать пользуйся не фором а while. потом, если нужно, анализируй данные ...


 
miracle_fox ©   (2004-01-07 03:20) [23]

уже нашел ошибочку ... если нас не устраивают оба условия при значениях i от 0 и до count листвью:
if uin = form1.ListView1.Items.Item[i].Caption then
if form1.ListView1.Items.Item[i].Checked<>true then

... то r=0. это плохо :( ... т.к. ему присваивается 0 в самом начале. только что проверил вот эту часть:
if form1.checkbox5.Checked=true then
for i:= 0 to (form1.ListView1.Items.Count-1) do //переберает все уины
if uin = form1.ListView1.Items.Item[i].Caption then // проверяет со всеми
if form1.ListView1.Items.Item[i].Checked<>true then //не нажата ли ...
begin
richedit1.Lines.Add("[" + UIN + "] " + Msg);
privateform.richedit1.Lines.Add("[" + UIN + "] " + Msg);
if form1.checkbox4.Checked=true then form1.richedit2.Lines.Add("["+ form1.Edit1.Text+"] "+form1.Edit3.Text);
end;

она рабочая. фигня получается в остальном, что делать, теряюсь в догадках :((((( ...


 
raidan ©   (2004-01-07 03:22) [24]

to miracle_fox: присвой r:=-1 в начале. А то у тебя получается, что если условие не выполнится ни разу, то переменной r ничего и никогда не присвоится!
Но у тебя в начале стоит r:=0!
Уже присвоено значение первой записи!
Если же будет r=-1 то ты гарантированно определишь, что условие не выполнилось ни разу...
Может я и глюкаю, уже поздно :))

to Germann:
> Я тоже нет. Но эти операторы отнюдь не то же самое, в смысле
> возможного вреда. GoTo преполагает переход куда-то, куда,
> как надеется программист, можно перейти без ошибки. А эти
> операторы выполняют переход в конкретные точки программы,
> куда действительно можно перейти без ошибки.
> А уж выполнять весь цикл поиска чего-то от 0 до 10000..0,
> если нужный ответ получен на первом шаге - просто глупость.
> Пусть ею маются "итальянские математики".


Грамотное и умеренное использование break и exit, конечно, не повредит. Иногда это даст выигрыш в скорости. Но поиск в цикле действительно можно сделать с предусловием :)))


 
miracle_fox ©   (2004-01-07 03:29) [25]

to raidan: я в тоске :((( ... буду думать. спасибо. если, нужна будет помощь по дэльфи (когда я его подучу :), обращайся :)
аська моя нормальная 337673878


 
miracle_fox ©   (2004-01-07 03:31) [26]

to raidan: я в тоске :((( ... буду думать. спасибо. если, нужна будет помощь по дэльфи (когда я его подучу :), обращайся :)
аська моя нормальная 337673878


 
miracle_fox ©   (2004-01-07 03:32) [27]

... форум глюканул


 
Германн ©   (2004-01-07 03:54) [28]

2 raidan © (07.01.04 03:22) [24]

>Но поиск в цикле действительно можно сделать с предусловием :)))

Не сомневаюсь.
Но также не сомневаюсь и в том, что, во-первых, такой код очень часто может выглядеть плохо читабельным, во-вторых по скорости он в ряде случаев не потянет и в-третьих и это главное - будет ничуть не более вредобезопасным, чем цикл с Break(причем неважно какой именно - for,repeat или while).


 
miracle_fox ©   (2004-01-07 04:56) [29]

ребята, посмотрите пожалуйста этот алгоритм.
procedure TForm1.ICQClient1MessageRecv(Sender: TObject; Msg, UIN: String);
var i:integer; // через else?
begin
for i:= 0 to (form1.ListView1.Items.Count-1) do
if uin = form1.ListView1.Items.Item[i].Caption then
if form1.ListView1.Items.Item[i].Checked=false then
begin
richedit1.Lines.Add("[" + UIN + "] " + Msg);
privateform.richedit1.Lines.Add("[" + UIN + "] " + Msg);
if form1.checkbox4.Checked=true then
form1.richedit2.Lines.Add("["+ form1.Edit1.Text+"] "+form1.Edit3.Text);
break;
end;

if uin<>form1.ListView1.Items.Item[i].Caption then
if form1.checkbox5.Checked=false then
begin
richedit1.Lines.Add("[" + UIN + "] " + Msg);
privateform.richedit1.Lines.Add("[" + UIN + "] " + Msg);
if form1.checkbox4.Checked=true then
form1.richedit2.Lines.Add("["+ form1.Edit1.Text+"] "+form1.Edit3.Text);
end;
end;


 
Miwa ©   (2004-01-07 07:21) [30]

raidan © (07.01.04 02:36) [10]
Так почему у тебя имя как ссылка на e-mail??????

Наверное потому, что в форме "Написать ответ" заполнено поле "е-маил" :о))

2 moderator: Извините, конечно, за оффтопик, но тут человек так упорно интересуется...


 
Anatoly Podgoretsky ©   (2004-01-07 09:11) [31]

Не надо применять арифметические действия к Checked=false/true


 
miracle_fox ©   (2004-01-07 13:14) [32]

???


 
Alekc   (2004-01-07 13:36) [33]


> ???

if form1.checkbox5.Checked=false then
begin

Это то же самое, что и
if not form1.checkbox5.Checked then
begin

и т.д.


 
Германн ©   (2004-01-08 04:48) [34]

2 miracle_fox © (07.01.04 04:56) [29]
Самая бросающаяся в глаза ошибка - это использование "переменной цикла", т.е., i за его пределами. В этом случае независимо от всяких Break, Exit и т.п. содержимое i неопределено!
Если уж так нужно, то запоминай нужное значение i в какой-то другой переменной.


 
Плохиш_   (2004-01-08 10:43) [35]


miracle_fox © (07.01.04 01:46)
подскажите пожалуйста на примере чем отличаются exit от breake

Никак не пойму, почему всем начинающим не нравятся описания чего-нибудь и примеры к этому из хелпа?


 
miracle_fox ©   (2004-01-08 22:01) [36]

to Германн: а что же делать в ДАННОМ случае, если мне нужно значение переменной i после "выброса" из цикла??? как видишь, если выбрасывает из цикла после того как пройдёт все if ... значит if uin<>form1.ListView1.Items.Item[i].Caption then будет всегда выполнятся! это и нужно, еа если из цикла что-то устраивает, тогда не будет выполнятся. на этом и построен алгоритм ... люди подскажите, что же сделать?


 
Германн ©   (2004-01-08 22:53) [37]

Ну к примеру можно сделать так:
for i:=0 to NNN do begin
------
if (что-то) then begin
if ...Item[i].Caption then begin
--------
Break;
end;
end;
end;



Страницы: 1 вся ветка

Текущий архив: 2004.01.20;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.022 c
3-62994
stat
2003-12-23 16:56
2004.01.20
record


1-63151
jiurajhgjhgty
2004-01-06 22:30
2004.01.20
Хочу в Excel кое-что из delphi удалить.Не знаю как


1-63106
Evgeniy_K
2004-01-07 19:55
2004.01.20
Глюк TSpeedButton


3-62966
GIL
2003-12-24 13:09
2004.01.20
Boolean


1-63181
DDA
2004-01-10 13:09
2004.01.20
Определение какая нажата кнопка