Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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 // проверяет со всеми
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.012 c
7-63427
Monak
2003-10-30 21:22
2004.01.20
Как отлавить нажатие F1??


14-63294
Rauf
2003-12-31 20:47
2004.01.20
(СРОЧНО) В Харьков звонить так: 38 (Украина) 0572 (Харьков)???


1-63252
Maxkat
2004-01-08 19:53
2004.01.20
WinExec, проблема с ненужным копированием файлов


3-63034
ИМХО
2003-12-22 10:52
2004.01.20
TClientDataSet: вопрос на засыпку


14-63407
konstantinov
2003-12-27 16:33
2004.01.20
С Наступающим!!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский