Форум: "Основная";
Текущий архив: 2004.01.20;
Скачать: [xml.tar.bz2];
Внизчем отличаются 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 // проверяет со всеми
выполняет для первого же item"а :)
if form1.ListView1.Items.Item[i].Checked<>true then //не нажата ли ...
← →
Германн (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;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.01 c