Difference between revisions of "Break"

From Lazarus wiki
Jump to navigationJump to search
(Translated from Break/de)
 
(more links, mood, wording, unify source code style, typography, spelling mistake)
 
(14 intermediate revisions by 3 users not shown)
Line 1: Line 1:
 
{{Break}}
 
{{Break}}
  
The reserved word '''break''' is one of the [[Loops|loop commands]]<br>
+
The <syntaxhighlight lang="pascal" inline>break</syntaxhighlight> (pseudo) [[Routine|routine]] effectively destroys a [[Loops|loop]].
The command is used to exit a loop before its planned end.<br>
+
Its primary application is to exit a loop prior its planned end.
The '''break''' command can only be used within loops.<br>
+
 
<br>
+
<syntaxhighlight lang="pascal" inline>Break</syntaxhighlight>, with its special meaning of abandoning a loop, can only be written ''within'' loops.
Example:<br>
+
It is not a reserved word¹, therefore you could shadow it, but access it by writing the fully qualified [[Identifier|identifier]] {{Doc|package=RTL|unit=system|identifier=break|text=<syntaxhighlight lang="pascal" inline>system.break</syntaxhighlight>}} at any time, though.
<syntaxhighlight>
+
 
 +
== Collatz conjecture ==
 +
Example:
 +
The following program tackles the [https://en.wikipedia.org/wiki/Collatz_conjecture Collatz problem].
 +
The [[For|<syntaxhighlight lang="pascal" inline>for</syntaxhighlight>-loop]] in <syntaxhighlight lang="pascal" inline>collatzIterative</syntaxhighlight> uses a <syntaxhighlight lang="pascal" inline>break</syntaxhighlight>, a)&nbsp;to check for the terminating condition according to Collatz’ problem, b)&nbsp;to abort prior reaching the data type’s boundaries, and c)&nbsp;while still using the advantage of the <syntaxhighlight lang="pascal" inline>for</syntaxhighlight>-construct (i.&#8239;e.  automatically [[Inc|incrementing]] a variable within a specified range).
 +
 
 +
<!-- leave the ifThen expanded, for those who aren’t quite familiar with the math unit -->
 +
<syntaxhighlight lang="pascal" line highlight="15">
 +
program collatz(input, output, stderr);
 +
 
 +
procedure collatzIterative(n: qword);
 
var
 
var
  intI: Integer;
+
i: qword;
  intA: Integer = 50;
 
 
begin
 
begin
  for intI := 20 to 200 do
+
for i := 0 to high(i) do
  begin
+
begin
      ...
+
writeLn('step ', i:20, ': ', n);
      if intI = intA then break; // If the condition is satisfied, the loop is terminated
+
      ...
+
// Collatz conjecture: sequence ends with 1
  end;
+
if (n = 1) or (n > (high(n) / 3 - 1)) then
 +
begin
 +
// leave loop, as next value may get out of range
 +
break;
 +
end;
 +
 +
// n := ifThen(odd(n), 3 * n + 1, n div 2);
 +
if odd(n) then
 +
// n is odd
 +
begin
 +
n := 3 * n + 1;
 +
end
 +
// n is even
 +
else
 +
begin
 +
n := n div 2;
 +
end;
 +
end;
 
end;
 
end;
 +
 +
var
 +
n: longword;
 +
begin
 +
readLn(n);
 +
 +
if n < 1 then
 +
begin
 +
writeLn(stderr, 'not a positive integer');
 +
halt(1);
 +
end;
 +
 +
collatzIterative(n);
 +
end.
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
Choosing a <syntaxhighlight lang="pascal" inline>for</syntaxhighlight>-loop in conjunction with a <syntaxhighlight lang="pascal" inline>break</syntaxhighlight> is adequate, since the Collatz conjecture ''hypothesizes'' that the described function eventually ends in <syntaxhighlight lang="pascal" inline>1</syntaxhighlight>, but does not tell for sure.
 +
Therefore – mathematically speaking – writing <syntaxhighlight lang="pascal" inline>while n <> 1 do</syntaxhighlight> does not consider the circumstance, that the problem is an ''assumption'', but would suggest it was ''determined'' to eventually result in <syntaxhighlight lang="pascal" inline>n = 1</syntaxhighlight>.
  
 +
== Other remarks ==
 +
However, the usage of <syntaxhighlight lang="pascal" inline>break</syntaxhighlight> is usually considered as bad style, since it “delegitimizes” the loop’s condition expression.
 +
You have to ''know'' a loop’s body contains a <syntaxhighlight lang="pascal" inline>break</syntaxhighlight> to determine all abort conditions.
 +
 +
According to the [[GNU Pascal|GP]]C manual, <syntaxhighlight lang="pascal" inline>break</syntaxhighlight> is a [[Borland Pascal]] extension, whereas [[Mac Pascal]] has <syntaxhighlight lang="pascal" inline>leave</syntaxhighlight>.
 +
[[FPC]], apart from [[Mode MacPas|<syntaxhighlight lang="pascal" inline>{$mode MacPas}</syntaxhighlight>]], only knows <syntaxhighlight lang="pascal" inline>break</syntaxhighlight>, though.
  
 
== See also ==
 
== See also ==
* [[Reserved words]]
+
* {{Doc|package=RTL|unit=system|identifier=break|text=<syntaxhighlight lang="pascal" inline>break</syntaxhighlight>}} in the <syntaxhighlight lang="pascal" inline>system</syntaxhighlight> unit
 +
* [[Exit|<syntaxhighlight lang="pascal" inline>exit</syntaxhighlight>]] to return from ''routines''
 +
* [[Continue|<syntaxhighlight lang="pascal" inline>continue</syntaxhighlight>]] to skip the rest of an iteration
 +
* [[Goto|<syntaxhighlight lang="pascal" inline>goto</syntaxhighlight>]]<!-- an equally disfavored statement as “break” -->
 +
 
 +
<small>
 +
== sources ==
 +
; 1
 +
: compare remarks in [https://www.freepascal.org/docs-html/ref/refsu58.html the reference manual § “The <syntaxhighlight lang="pascal" inline>For..to</syntaxhighlight>/<syntaxhighlight lang="pascal" inline>downto..do</syntaxhighlight> statement”] and [https://www.freepascal.org/docs-html/ref/refsu3.html § “reserved words”]
 +
</small>
 +
 
 +
[[Category:Code]]

Latest revision as of 17:12, 20 November 2020

Deutsch (de) English (en) español (es) suomi (fi) français (fr) русский (ru)

The break (pseudo) routine effectively destroys a loop. Its primary application is to exit a loop prior its planned end.

Break, with its special meaning of abandoning a loop, can only be written within loops. It is not a reserved word¹, therefore you could shadow it, but access it by writing the fully qualified identifier system.break at any time, though.

Collatz conjecture

Example: The following program tackles the Collatz problem. The for-loop in collatzIterative uses a break, a) to check for the terminating condition according to Collatz’ problem, b) to abort prior reaching the data type’s boundaries, and c) while still using the advantage of the for-construct (i. e. automatically incrementing a variable within a specified range).

 1program collatz(input, output, stderr);
 2
 3procedure collatzIterative(n: qword);
 4var
 5	i: qword;
 6begin
 7	for i := 0 to high(i) do
 8	begin
 9		writeLn('step ', i:20, ': ', n);
10		
11		// Collatz conjecture: sequence ends with 1
12		if (n = 1) or (n > (high(n) / 3 - 1)) then
13		begin
14			// leave loop, as next value may get out of range
15			break;
16		end;
17		
18		// n := ifThen(odd(n), 3 * n + 1, n div 2);
19		if odd(n) then
20		// n is odd
21		begin
22			n := 3 * n + 1;
23		end
24		// n is even
25		else
26		begin
27			n := n div 2;
28		end;
29	end;
30end;
31
32var
33	n: longword;
34begin
35	readLn(n);
36	
37	if n < 1 then
38	begin
39		writeLn(stderr, 'not a positive integer');
40		halt(1);
41	end;
42	
43	collatzIterative(n);
44end.

Choosing a for-loop in conjunction with a break is adequate, since the Collatz conjecture hypothesizes that the described function eventually ends in 1, but does not tell for sure. Therefore – mathematically speaking – writing while n <> 1 do does not consider the circumstance, that the problem is an assumption, but would suggest it was determined to eventually result in n = 1.

Other remarks

However, the usage of break is usually considered as bad style, since it “delegitimizes” the loop’s condition expression. You have to know a loop’s body contains a break to determine all abort conditions.

According to the GPC manual, break is a Borland Pascal extension, whereas Mac Pascal has leave. FPC, apart from {$mode MacPas}, only knows break, though.

See also

sources

1
compare remarks in the reference manual § “The For..to/downto..do statement” and § “reserved words”