Inhaltsverzeichnis

Pascal

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

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

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

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