Difference between revisions of "Basic Pascal Tutorial/Chapter 3/IF/bg"

From Lazarus wiki
Jump to navigationJump to search
(Created page with "{{IF}} {{TYNavigator|Boolean_Expressions|CASE}} Обратно в Резервирани думи. 3Ca - IF (author: Tao Yue, state: changed) Опер...")
 
Line 17: Line 17:
 
Ако булевия израз '''BooleanExpression'''  се изчисли като <tt>true</tt>, операторът '''StatementIfTrue'''  ще се изпълни. В противен случай ще се пропусне.
 
Ако булевия израз '''BooleanExpression'''  се изчисли като <tt>true</tt>, операторът '''StatementIfTrue'''  ще се изпълни. В противен случай ще се пропусне.
  
Операторът <tt>IF</tt> приема само един оператор. Ако искате да се разклоните към поредица от оператори, трябва да ги заградите в <tt>begin-end</tt> [[Frame|блок]], за да приложите всички оператори:  
+
Операторът <tt>IF</tt> приема само един оператор. Ако искате да се разклоните към поредица от оператори, трябва да ги заградите в <tt>begin-end</tt> [[Frame|блок]], за да изпълните всички оператори:  
  
 
<syntaxhighlight lang=pascal>
 
<syntaxhighlight lang=pascal>
Line 27: Line 27:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
There is also a two-way selection:
+
Двойното разклонение изглежда така:
  
 
<syntaxhighlight lang=pascal>
 
<syntaxhighlight lang=pascal>
Line 36: Line 36:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Note there is no <tt>;</tt> following the statement before the <tt>else</tt>, even for the case with compound statements.
+
Забележете, че няма <tt>;</tt> преди <tt>else</tt>, дори и в случая на съставен оператор <tt>begin-end</tt>.
  
 
<syntaxhighlight lang=pascal>
 
<syntaxhighlight lang=pascal>
Line 52: Line 52:
  
  
If the Boolean expression evaluates to <tt>FALSE</tt>, the statement following the <tt>else</tt> will be performed. Note that you may <u>never</u> use a semicolon after the statement preceding the <tt>else</tt>. That causes the computer to treat it as a one-way selection, leaving it to wonder where the else came from. And when a compiler wonders, it usually gets mad and throws a tantrum, or rather, it throws an error
+
Ако '''BooleanExpression''' се пресметне като <tt>FALSE</tt>, тогава ще се изпълни операторът след <tt>else</tt>. Не <u>трябва</u> да използвате <tt>;</tt> след оператора, който е предшества <tt>else</tt>. Това кара компилатора да си мисли, че това е оператор само с едно разклонение, и да се чуди откъде се е взело следващото <tt>else</tt>. A когато компилаторът се чуди, той обикновено извежда съобщение за грешка.
  
If you need multi-way selection, simply nest <tt>if</tt> statements:
+
Ако имате нужда от повече разклонения, можете да вложите няколко <tt>if</tt> оператора:
  
 
<syntaxhighlight lang=pascal>
 
<syntaxhighlight lang=pascal>
Line 66: Line 66:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Be careful with nesting. Sometimes the computer won't do what you want it to do:
+
Бъдете внимателни с влагането. Понякога компилатора няма да направи това, което си мислите:
  
 
<syntaxhighlight lang=pascal>
 
<syntaxhighlight lang=pascal>
Line 76: Line 76:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
The <tt>else</tt> is always matched with the most recent <tt>if</tt>, so the computer interprets the preceding block of code as:
+
Приема се, че <tt>else</tt> винаги се отнася за последния <tt>if</tt>, така че компилатора интерпретира предишните редове като:
  
 
<syntaxhighlight lang=pascal>
 
<syntaxhighlight lang=pascal>
Line 86: Line 86:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
You can get by with a null statement:
+
Може да коригирате с празен оператор:
  
 
<syntaxhighlight lang=pascal>
 
<syntaxhighlight lang=pascal>
Line 96: Line 96:
 
   Statement1;
 
   Statement1;
 
</syntaxhighlight>
 
</syntaxhighlight>
Or you could use a <tt>begin-end</tt> block.  
+
Или може да използвате <tt>begin-end</tt> блок.  
 +
 
 +
Следващото доказва как <tt>;</tt> е ''абсолютно забранено'' преди else:
  
The following proves a semicolon is ''absolutely forbidden'' before an else:
 
 
<syntaxhighlight lang=pascal>
 
<syntaxhighlight lang=pascal>
 
// Paul Robinson 2020-12-16
 
// Paul Robinson 2020-12-16
Line 105: Line 106:
 
// tests the proposition that ; is
 
// tests the proposition that ; is
 
// never legal before ELSE
 
// never legal before ELSE
 
  
 
program err03;
 
program err03;
 
Var
 
Var
 
     Test,test2: Boolean;
 
     Test,test2: Boolean;
 
 
 
Begin
 
Begin
 
 
     Test := True;
 
     Test := True;
 
     Test2 := true;
 
     Test2 := true;
 
 
     if test then
 
     if test then
 
       if test2 then
 
       if test2 then
Line 122: Line 118:
 
     else
 
     else
 
         Writeln('Reached Part 2');
 
         Writeln('Reached Part 2');
 
 
end.
 
end.
 
</syntaxhighlight>
 
</syntaxhighlight>
But the best way to clean up the code would be to rewrite the condition.
+
 
 +
Най-добрия начин да се изчисти проблема е да се пренапише условието.
  
 
<syntaxhighlight lang=pascal>
 
<syntaxhighlight lang=pascal>
Line 135: Line 131:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
This example illustrates where the not operator comes in very handy. If Condition1 had been a Boolean like: <tt>(not(a < b) or (c + 3 > 6)) and g</tt>, reversing the expression would be more difficult than NOTting it.
+
Този пример илюстрира как оператора not може да е много полезен. Ако Condition1 е булев израз като: <tt>(not(a < b) or (c + 3 > 6)) and g</tt>, "обръщането" на израза е доста по-сложно от отрицанието му с <tt>NOT</tt>.
  
Also notice how important indentation is to convey the logic of program code to a human, but the compiler ignores the indentation.  
+
Също така забележете колко е важен отстъпът отляво когато човек чете логиката на програмния код, но пък компилатора не се интересува от празните символи.
  
 
{{TYNavigator|Boolean_Expressions|CASE}}
 
{{TYNavigator|Boolean_Expressions|CASE}}

Revision as of 22:21, 21 April 2021

български (bg) English (en) français (fr) 日本語 (ja) 中文(中国大陆)‎ (zh_CN)

 ◄   ▲   ► 


Обратно в Резервирани думи.


3Ca - IF (author: Tao Yue, state: changed)

Операторът IF ви позволява да разклонявате програмата въз основа на резултата от булева операция. Простото разклоняване изглежда така:

if BooleanExpression then
  StatementIfTrue;

Ако булевия израз BooleanExpression се изчисли като true, операторът StatementIfTrue ще се изпълни. В противен случай ще се пропусне.

Операторът IF приема само един оператор. Ако искате да се разклоните към поредица от оператори, трябва да ги заградите в begin-end блок, за да изпълните всички оператори:

if BooleanExpression then
begin
  Statement1;
  Statement2;
end;

Двойното разклонение изглежда така:

if BooleanExpression then
  StatementIfTrue
else
  StatementIfFalse;

Забележете, че няма ; преди else, дори и в случая на съставен оператор begin-end.

if BooleanExpression then
begin
  Statement1;
  Statement2;
end
else
begin
  Statement3;
  Statement4;
end;


Ако BooleanExpression се пресметне като FALSE, тогава ще се изпълни операторът след else. Не трябва да използвате ; след оператора, който е предшества else. Това кара компилатора да си мисли, че това е оператор само с едно разклонение, и да се чуди откъде се е взело следващото else. A когато компилаторът се чуди, той обикновено извежда съобщение за грешка.

Ако имате нужда от повече разклонения, можете да вложите няколко if оператора:

if Condition1 then
  Statement1
else
  if Condition2 then
    Statement2
  else
    Statement3;

Бъдете внимателни с влагането. Понякога компилатора няма да направи това, което си мислите:

if Condition1 then
  if Condition2 then
    Statement2
else
  Statement1;

Приема се, че else винаги се отнася за последния if, така че компилатора интерпретира предишните редове като:

if Condition1 then
  if Condition2 then
    Statement2
  else
    Statement1;

Може да коригирате с празен оператор:

if Condition1 then
  if Condition2 then
    Statement2
  else
else
  Statement1;

Или може да използвате begin-end блок.

Следващото доказва как ; е абсолютно забранено преди else:

// Paul Robinson 2020-12-16

// Compiler test program  Err03.pas
// tests the proposition that ; is
// never legal before ELSE

program err03;
Var
    Test,test2: Boolean;
Begin
    Test := True;
    Test2 := true;
    if test then
       if test2 then
           Writeln('Reached Part 1');  // semi-colon here should be illegal
     else
        Writeln('Reached Part 2');
end.

Най-добрия начин да се изчисти проблема е да се пренапише условието.

if not Condition1 then
  Statement1
else
  if Condition2 then
    Statement2;

Този пример илюстрира как оператора not може да е много полезен. Ако Condition1 е булев израз като: (not(a < b) or (c + 3 > 6)) and g, "обръщането" на израза е доста по-сложно от отрицанието му с NOT.

Също така забележете колко е важен отстъпът отляво когато човек чете логиката на програмния код, но пък компилатора не се интересува от празните символи.

 ◄   ▲   ►