Benutzer-Werkzeuge

Webseiten-Werkzeuge


pascal

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
pascal [2016-03-09 22:34:16] – [Datei-Operationen] manfredpascal [2019-09-08 21:14:42] (aktuell) – [Programme ausführen] manfred
Zeile 1: Zeile 1:
 +====== 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 ====
 +
 +<file>
 +program HalloWelt;
 +
 +begin
 +  Writeln('Hallo Welt!');
 +  Readln; {Wartet auf Eingabe des Benutzers, ansonsten würde das Programm sofort wieder beendet}
 +end.
 +</file>
 +
 +
 +==== Abfrage ====
 +
 +<file>
 +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.
 +</file>
 +
 +<file>
 +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.
 +</file>
 +
 +<file>
 +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.
 +</file>
 +
 +==== Kommandozeilenparameter ====
 +
 +[[http://wiki.freepascal.org/Command_line_parameters_and_environment_variables]]
 +
 +<file>
 +program Parameter1;
 +
 +begin
 +  WriteLn('Programmname: ', ParamStr(0));
 +  WriteLn('Anzahl der Parameter: ', ParamCount);
 +  WriteLn('Param 1: ', ParamStr(1));
 +end.
 +</file>
 +
 +<file>
 +program Parameterliste;
 +
 +var
 +  I: Int64;
 +
 +begin
 +  WriteLn('Program: ', ParamStr(0));
 +  for I := 1 to ParamCount do
 +    WriteLn('Param ', I, ': ', ParamStr(I));
 +end.
 +</file>
 +
 +<file>
 +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.
 +</file>
 +
 +==== String-Integer-Umwandlung ====
 +
 +<file>
 +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.
 +</file>
 +
 +==== Schleifen ====
 +
 +  * [[https://de.wikibooks.org/wiki/Programmierkurs:_Delphi:_Pascal:_Schleifen]]
 +
 +<file>
 +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.
 +</file>
 +
 +
 +==== 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
 +<file>
 +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.
 +</file>
 +
 +
 +=== Datei schreiben ===
 +
 +<file>
 +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.
 +</file>
 +
 +  > 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]]