====== Pascal ======
* [[http://de.wikipedia.org/wiki/Pascal_%28Programmiersprache%29|Pascal]]
* [[http://freepascal.org/|Free Pascal - HomePage]]
* [[http://de.wikipedia.org/wiki/Free_Pascal|Free Pascal]]
* [[http://www.lazarus-ide.org/|Lazarus]] - GUI für FreePascal
===== Installation =====
==== Linux Mint 17.2 ====
wichtig:
> aptitude install fpc lazarus fpc-source fp-units-fcl lcl
optional:
> aptitude install lazarus-ide lazarus-ide-gtk2 lcl-gtk2 lcl-units lcl-utils
===== FreePascal-Beispiel-Kode =====
* **[[David's Pascal-Seite]]**
* **[[https://de.wikipedia.org/wiki/Hallo-Welt-Programm|Hallo-Welt-Programm]]**
* **[[http://www.willemer.de/informatik/lang/pascal.htm]]**
* **[[http://wiki.freepascal.org/Lazarus_Documentation#Free_Pascal_Compiler_Documentation|Free Pascal Compiler Documentation]]**
* [[http://www.tutorials.at/pascal/]]
* [[http://wiki.freepascal.org/Lazarus_Documentation/de]]
* [[http://wiki.freepascal.org/Lazarus_Tutorial/de]]
* [[http://www.lazarusforum.de/|deutsches LazarusForum]]
* **[[ftp://ftp.freepascal.org/pub/fpc/docs-pdf/prog.pdf|Programmer’s Guide for Free Pascal (PDF)]]**
* [[http://www.freepascal.org/docs-html/rtl/|Free Pascal Run-Time Library]] - /rtl/
* **[[http://www.freepascal.org/docs-html/rtl/sysutils/index.html|unit sysutils]]**
* //[[http://www.freepascal.org/docs-html/rtl/sysutils/conversionroutines.html|ConversionRoutines]]// - Miscellaneous conversion routines
* [[http://www.freepascal.org/docs-html/rtl/sysutils/strtoint.html|StrToInt()]]
* [[http://www.freepascal.org/docs-html/rtl/sysutils/floattostr.html|FloatToStr()]]
* [[http://www.freepascal.org/docs-html/rtl/sysutils/strtofloat.html|StrToFloat()]]
* [[http://www.freepascal.org/docs-html/rtl/sysutils/texttofloat.html|TextToFloat()]]
* **[[http://www.freepascal.org/docs-html/rtl/system/index.html|unit System]]**
* **[[http://www.freepascal.org/docs-html/rtl/math/index.html|unit math]]**
* **[[http://www.freepascal.org/docs-html/rtl/video/index.html|unit video]]**
* [[http://wiki.freepascal.org/Pascal_for_CSharp_users#FPC_Language_Features_not_available_in_C_.23|Syntax-Vergleich von C# mit Pascal]]
* [[http://wiki.freepascal.org/Reserved_words#Reserved_words_in_Free_Pascal|reservierte Worte in FreePascal]]
* [[http://www.freepascal.org/docs-html/ref/refse83.html#x147-16900012.8|operators]]
* [[http://www.freepascal.org/docs-html/ref/refsu51.html#x144-15400013.2.3|Relational operators]]
* **''=''** . . . . . Equal
* **''<''''>''** . . . . Not equal
* **''<''** . . . . . Stricty less than
* **''>''** . . . . . Strictly greater than
* **''<''''=''** . . . . Less than or equal
* **''>''''=''** . . . . Greater than or equal
* **''in''** . . . . Element of
==== Programmierkurs: Delphi: Pascal: Grundlegende Datentypen ====
* [[https://de.wikibooks.org/wiki/Programmierkurs:_Delphi:_Pascal:_Grundlegende_Datentypen]]
=== Texttypen ===
**Char**\\
__**String**__
Der Typ Char dient dazu, ein einzelnes ASCII-Zeichen zu speichern.
Der Typ String bezeichnet eine Zeichenkette mit variabler Länge. Das heißt, er kann keine Zeichen, ein Zeichen oder auch mehrere beinhalten.
Strings müssen im Quelltext immer von Apostrophen umschlossen werden.
Mehrere Strings lassen sich miteinander mit Hilfe des +-Operators zu einem größeren Text verknüpfen (konkatenieren).
Man kann mit Zahlen in einem String nicht rechnen, obwohl sie im String gespeichert werden können.
Um ein einzelnes Zeichen eines Strings anzusprechen, genügt es, in eckigen Klammern dahinter zu schreiben, welches Zeichen man bearbeiten oder auslesen möchte.
Die Datentypen Char und String sind in gewisser Weise kompatibel. Man kann z.B. ein Char an einen String anhängen oder ein Zeichen aus einem String in einem Char speichern.
=== ganzzahlige Datentypen ===
^ Name ^ Wertbereich ^
^ Shortint | ''-128'' //bis// ''127'' |
^ Smallint | ''-32768'' //bis// ''32767'' |
^ Longint (entspricht Integer) | ''-2^31'' //bis// ''2^31-1'' |
^ __Int64__ | ''-2^63'' //bis// ''2^63-1'' |
^ Byte | ''0'' //bis// ''255'' |
^ Word | ''0'' //bis// ''65535'' |
^ Cardinal/Longword | ''0'' //bis// ''2^32-1'' |
Für die Division muss hier **''"DIV"''** verwendet werden.
=== Gleitkommazahlen ===
^ Name ^ Wertbereich ^ Speicherbedarf ^
^ Single | ''-1,5 * 10^45'' //bis// ''3,4 * 10^38'' | 4 Byte |
^ __Double__ | ''-5,0 * 10^324'' //bis// ''1,7 * 10^308'' | 8 Byte |
^ Extended | ''-3,6 * 10^4951'' //bis// ''1,1 * 10^4932'' | 10 Byte |
Für die Division muss hier **''"/"''** verwendet werden.
**Extended** bietet zwar die höchste Genauigkeit, ist aber stark an das System gebunden.\\
__Wenn Daten in diesem Format gespeichert werden und auf anderen Rechnern verwendet werden sollen, kann dies zu Problemen führen.__
=== Wahrheitswerte ===
__**Boolean**__
==== Hallo Welt ====
program HalloWelt;
begin
Writeln('Hallo Welt!');
Readln; {Wartet auf Eingabe des Benutzers, ansonsten würde das Programm sofort wieder beendet}
end.
==== Abfrage ====
program Abfrage;
var
Name: string;
begin
Writeln('Wie heisst du?');
Readln(Name);
Writeln('Hallo ' + Name + '! Schoen, dass du mal vorbeischaust.');
Readln; {Wartet auf Eingabe des Benutzers, ansonsten würde das Programm sofort wieder beendet}
end.
Program Taschenrechner1;
var
a : Int64;
b : Int64;
c : Int64;
begin
WriteLn('Bitte geben Sie den ersten Summanden ein:');
readln(a);
WriteLn('Bitte geben Sie den zweiten Summanden ein:');
readln(b);
c := a + b;
WriteLn(a , ' + ' , b , ' = ' , c);
readln();
end.
Program Taschenrechner4;
Uses sysutils;
var
a : Int64;
b : String;
c : Int64;
d : Int64;
begin
WriteLn('Geben Sie bitte die erste Zahl ein:');
ReadLn (a);
WriteLn('Geben Sie bitte den Operator (+, -, * oder /) ein:');
ReadLn (b);
WriteLn('Geben Sie bitte die zweite Zahl ein:');
ReadLn (c);
if b = '+' then
WriteLn(a , ' + ' , c , ' = ' , a + c);
if b = '-' then
begin
d := a - c;
WriteLn(a , ' - ' , c , ' = ' , d);
end;
if b = '*' then
begin
d := a * c;
WriteLn(a , ' * ' , c , ' = ' , d);
end;
if b = '/' then
begin
d := a DIV c;
WriteLn(a , ' / ' , c , ' = ' , d);
end;
end.
==== Kommandozeilenparameter ====
[[http://wiki.freepascal.org/Command_line_parameters_and_environment_variables]]
program Parameter1;
begin
WriteLn('Programmname: ', ParamStr(0));
WriteLn('Anzahl der Parameter: ', ParamCount);
WriteLn('Param 1: ', ParamStr(1));
end.
program Parameterliste;
var
I: Int64;
begin
WriteLn('Program: ', ParamStr(0));
for I := 1 to ParamCount do
WriteLn('Param ', I, ': ', ParamStr(I));
end.
Program Taschenrechner3;
Uses sysutils;
var
s1 : String;
s2 : String;
a : Int64;
b : String;
c : Int64;
d : Int64;
e : String;
begin
s1 := ParamStr(1);
a := StrToInt(s1);
b := ParamStr(2);
s2 := ParamStr(3);
c := StrToInt(s2);
if b = '+' then
begin
d := a + c;
e := 'OK';
end;
if b = '-' then
begin
d := a - c;
e := 'OK';
end;
if b = 'x' then
begin
d := a * c;
e := 'OK';
end;
if b = '/' then
begin
d := a DIV c;
e := 'OK';
end;
if e = 'OK' then
WriteLn(a , ' ' , b , ' ' , c , ' = ' , d)
// vor ELSE darf kein ";" stehen!
else
WriteLn('Übergeben Sie bitte eine Mathe-Aufgabe, bei der zwei Zahlen mit einem Operator der 4 Grundrechenarten (+, -, x oder /) berechnet werden sollen.');
end.
==== String-Integer-Umwandlung ====
Program Taschenrechner2;
Uses sysutils;
var
a : String;
b : String;
c : Int64;
d : Int64;
e : Int64;
begin
a := ParamStr(1);
b := ParamStr(2);
c := StrToInt(a);
d := StrToInt(b);
e := c + d;
WriteLn(c , ' + ' , d , ' = ' , e);
end.
==== Schleifen ====
* [[https://de.wikibooks.org/wiki/Programmierkurs:_Delphi:_Pascal:_Schleifen]]
Program Fibonacci1;
var
i : int64;
a, b, c : int64;
d : Double;
begin
b := 1;
c := 1;
for i := 1 to 40 do
begin
a := b;
b := c;
c := a + b;
d := c / b;
Writeln(i, ': ', c, ' / ', b, ' = ', d);
end;
end.
==== Datei-Operationen ====
[[http://www.tutorials.at/pascal/09-dateizugriff.html]]
=== Datei lesen ===
erst die Datei anlegen und einen kurzen Text reinschreiben:
> vi /tmp/datei_lesen.pas
program Datei_lesen;
USES crt;
VAR Dateizeiger: Text; (* Dateizeiger *)
Gelesen, Pfad: String;
BEGIN
Assign (Dateizeiger, '/tmp/datei_lesen.pas'); (* Pfad festlegen *)
Reset (Dateizeiger); (* Datei zum Lesen oeffnen *)
REPEAT
ReadLn (Dateizeiger, Gelesen); (* eine Zeile lesen *)
WriteLn (Gelesen); (* eine Zeile am Bildschirm ausgeben *)
UNTIL EOF (Dateizeiger); (* Abbruch, wenn das Zeilenende erreicht ist; also wenn EOF TRUE liefert *)
Close (Dateizeiger); (* Datei schliessen *)
END.
=== Datei schreiben ===
PROGRAM Datei_schreiben;
USES Crt;
VAR Dateizeiger: Text;
Dateiinhalt, Pfad: String;
BEGIN
Assign (Dateizeiger, '/tmp/datei_schreiben.pas');
ReWrite (Dateizeiger); (* Datei zum Schreiben oeffnen! *)
WriteLn ('Geben Sie nun den Text ein, der in die Datei geschrieben werden soll.');
WriteLn ('Geben Sie "exit" ein, um abzuschließen.');
REPEAT
ReadLn (Dateiinhalt);
IF Dateiinhalt <> 'exit' THEN
WriteLn (Dateizeiger, Dateiinhalt); (* eine Zeile in die Datei schreiben *)
UNTIL Dateiinhalt = 'exit'; (* Abbruchbedingung *)
Close (Dateizeiger); (* Datei schliessen *)
END.
> cat /tmp/datei_schreiben.pas
=== Programme ausführen ===
* [[http://www.lazarusforum.de/|Deutsches Lazarus-Forum]]
* [[https://wiki.freepascal.org/Executing_External_Programs/de]]
RunCommand('/bin/bash',['-c','echo $PATH'],s);
ShellExecute('firstcommand.exe | secondcommand.exe');
ShellExecute('dir > output.txt');
// Simple one-liner (ignoring error returns) :
if ShellExecute(0,nil, PChar('"C:\my dir\prog.exe"'),PChar('"C:\somepath\some_doc.ext"'),nil,1) =0 then;
// Execute a Batch File :
if ShellExecute(0,nil, PChar('cmd'),PChar('/c mybatch.bat'),nil,1) =0 then;
// Open a command window in a given folder :
if ShellExecute(0,nil, PChar('cmd'),PChar('/k cd \path'),nil,1) =0 then;
// Open a webpage URL in the default browser using 'start' command (via a brief hidden cmd window) :
if ShellExecute(0,nil, PChar('cmd'),PChar('/c start www.lazarus.freepascal.org/'),nil,0) =0 then;
ShellExecute(0, nil, 'firefox.exe', nil, 'C:\programme\mozilla firefox', SW_SHOWNORMAL);
var olddir: String;
olddir := GetCurrentDir;
SetCurrentDir('/hier/soll/programm/ausgeführt/werden');
ExecuteProcess('C:/abc.exe',['param1','param2']);
SetCurrentDir(olddir);
program Test01;
USES
Crt,
ShellApi;
var
Laufwerk: char;
Kommando: string;
begin
Writeln('Auf welchem Laufwerk (z.B.: C) soll die Operation vorgenommen werden?');
Readln(Laufwerk);
If (Laufwerk = '') Then exit;
Writeln;
Writeln('Die Operation wird jetzt auf ' + Laufwerk + ' durchgeführt. Ist das richtig? Weiter mit ENTER.');
Readln; {Wartet auf Eingabe des Benutzers, ansonsten würde das Programm sofort wieder beendet}
Writeln;
Kommando := ('"' + Laufwerk + ':\TestDir\A" "' + Laufwerk + ':\TestDir\B" /MIR /MT');
Writeln('Kommando: robocopy ' + Kommando);
Result := ShellExecute(0, nil, PChar('robocopy'), PChar(Kommando), nil, 0);
Writeln(Result);
Writeln;
Writeln('fertig');
Readln; {Wartet auf Eingabe des Benutzers, ansonsten würde das Programm sofort wieder beendet}
end.
==== sonstiges ====
* [[http://wiki.freepascal.org/CGI_Web_Programming]]