Browse files

vektorber. und gitignore

  • Loading branch information...
2 parents 05d5394 + e37e89b commit 22c31d442656b3b68b4951ea382a8f4dce75b173 @ceemos committed Nov 24, 2011
Showing with 391 additions and 19 deletions.
  1. +3 −0 .gitignore
  2. +248 −0 acht_damen.adb
  3. +8 −6 auto-comment
  4. +53 −0 textsuche.adb
  5. +79 −13 vektorberechnungen.adb
View
3 .gitignore
@@ -0,0 +1,3 @@
+*~
+*.ali
+*.o
View
248 acht_damen.adb
@@ -0,0 +1,248 @@
+-- FILE: acht_damen.adb
+--
+-- PROJECT: Programmieruebungen, Uebungsblatt 5
+-- VERSION: 1
+-- DATE: 20. 11. 2011
+-- AUTHOR: Marcel Schneider
+--
+-------------------------------------------------------------------------------
+--
+-- <PROCEDURE> Acht_Damen
+-- Findet alle Moeglichkeiten, acht Damen KOllisionsfrei auf einem Schachbrett
+-- unterzubringen.
+--
+
+with Ada.Text_IO;
+use Ada.Text_IO;
+procedure Acht_Damen is
+
+ -- Typ, der angibt, was sich auf einem Feld des Schachbretts befindet.
+ type Feld is (Frei, Dame, Bedroht);
+
+ -- Hilfstyp fuer die Groesse des Schachbretts
+ subtype Index is Integer range 1 .. 7;
+
+ -- Typ der ein Schachbrett mitsamt Figuren darstellt.
+ type Schachbrett is array (Index, Index) of Feld;
+
+ -- PROCEDURE Put
+ --
+ -- Gibt ein Schachbrett schoen grafisch aus,
+ --
+ -- PARAMETERS:
+ -- + stellung: Das Auszugebende Schachbrett
+ --
+ procedure Put (stellung : Schachbrett) is
+ begin
+ for y in Index loop
+ Put_Line ("+---+---+---+---+---+---+---+---+");
+ for x in Index loop
+ Put ("|");
+ case stellung (x, y) is
+ when Frei =>
+ Put (" ");
+ when Dame =>
+ Put (" D ");
+ when Bedroht =>
+ Put (" x ");
+ end case;
+ end loop;
+ Put ("|");
+ New_Line;
+ end loop;
+ Put_Line ("+---+---+---+---+---+---+---+---+");
+ end Put;
+
+ counter : Integer := 0;
+ -- PROCEDURE count
+ --
+ -- Hilfsprozedur, die die Anzahl Aufrufe zaehlt. Wir verwendet, um die
+ -- Anzahl mgl. Kombinationen zu zaehlen.
+ --
+ procedure count is
+ begin
+ counter := counter + 1;
+ end count;
+
+ -- FUNCTION Fakultaet
+ --
+ -- Berechnet die Fakultaet der uebergebenen Zahl.
+ --
+ -- PARAMETERS:
+ -- + zahl: Zahl, deren Fak. berechnet werden soll. (max. 12 oder sowas)
+ --
+ -- RETURNS: zahl!
+ --
+ function Fakultaet (zahl : Integer) return Integer is
+ begin
+ if zahl = 1 then
+ return 1;
+ else
+ return Fakultaet (zahl - 1) * zahl;
+ end if;
+ end Fakultaet;
+
+ -- FUNCTION ist_Unschlagbar
+ --
+ -- Prueft, ob eine Figur an Stelle x, y im geg, Schachbrett geschlagen
+ -- werden koennte.
+ --
+ -- PARAMETERS:
+ -- + stellung: das zu untersuchende Brett.
+ -- + x: Pos. in x-Richtung
+ -- + y: Pos. in y-Richtung
+ --
+ -- RETURNS: true, wenn die Figur nicht geschlagen werden koennte,
+ -- sonst false.
+ --
+ function ist_Unschlagbar (stellung : Schachbrett; x, y : Index)
+ return Boolean is
+
+ -- FUNCTION ist_Dame
+ --
+ -- prueft, ob sich an der geg. Stelle eine Dame befindet.
+ -- Die Stelle darf auch ausserhalb des Bretts liegen.
+ --
+ -- PARAMETERS:
+ -- + x: Pos. in x-Richtung
+ -- + y: Pos. in y-Richtung
+ -- + stellung: Das zu untersuchende Brett.
+ --
+ -- RETURNS: false, wenn sich keine Dame an der Stelle befindet oder die
+ -- Stelle ausserhalb des Feldes liegt, sonst true.
+ --
+ function ist_Dame (x, y : Integer; stellung : Schachbrett)
+ return Boolean is
+ begin
+ return (x >= Index'First and x <= Index'Last and
+ y >= Index'First and y <= Index'Last)
+ and then stellung (x, y) = Dame;
+ end ist_Dame;
+
+ begin
+ if stellung (x, y) = Frei then
+ for i in Index loop
+ if ist_Dame (x + i, y + i, stellung) or
+ ist_Dame (x - i, y - i, stellung) or
+ ist_Dame (x - i, y + i, stellung) or
+ ist_Dame (x + i, y - i, stellung) or
+ ist_Dame (x, y + i, stellung) or
+ ist_Dame (x, y - i, stellung) or
+ ist_Dame (x + i, y, stellung) or
+ ist_Dame (x - i, y, stellung) then
+ return False;
+ end if;
+ end loop;
+ else
+ return False;
+ end if;
+ return True;
+ end ist_Unschlagbar;
+
+ -- PROCEDURE setze_Dame
+ --
+ -- Setzt eine Dame an die geg. Stelle und markiert alle von der Dame
+ -- schlagbaren Felder als bedroht.
+ --
+ -- + x: Pos. in x-Richtung
+ -- + y: Pos. in y-Richtung
+ -- + stellung: Das zu veraendernde Brett.
+ --
+ procedure setze_Dame (x, y : Index; stellung : in out Schachbrett) is
+
+ -- PROCEDURE markiere_Bedroht
+ --
+ -- merkiert ein geg. Feld als bedroht.
+ -- Die Stelle darf auch ausserhalb des Bretts liegen; dann wird nichts
+ -- getan.
+ --
+ -- PARAMETERS:
+ -- + x: Pos. in x-Richtung
+ -- + y: Pos. in y-Richtung
+ -- + stellung: Das zu veraendernde Brett.
+ --
+ procedure markiere_Bedroht (x, y : Integer;
+ stellung : in out Schachbrett) is
+ begin
+ if (x >= Index'First and x <= Index'Last and
+ y >= Index'First and y <= Index'Last)
+ and then stellung (x, y) = Frei then
+ stellung (x, y) := Bedroht;
+ end if;
+ end markiere_Bedroht;
+
+ begin
+ stellung (x, y) := Dame;
+ for i in Index loop
+ markiere_Bedroht (x + i, y + i, stellung);
+ markiere_Bedroht (x - i, y - i, stellung);
+ markiere_Bedroht (x - i, y + i, stellung);
+ markiere_Bedroht (x + i, y - i, stellung);
+ markiere_Bedroht (x, y + i, stellung);
+ markiere_Bedroht (x, y - i, stellung);
+ markiere_Bedroht (x + i, y, stellung);
+ markiere_Bedroht (x - i, y, stellung);
+ end loop;
+-- Put_Line ("Setzte Dame auf " & Integer'Image (x) & ","
+-- & Integer'Image (y));
+-- Put (stellung);
+ end setze_Dame;
+
+ -- FUNCTION konstruiere_Stellungen
+ --
+ -- Konstruiert Stellungen, bei denen sich n Damen auf einem nxn Felder
+ -- grossen Schachbrett nicht schlagen koennen.
+ --
+ -- PARAMETERS:
+ -- + stellung: Zu untersuchendes Schachbrett
+ -- + level: Anzahl Damen, die sich schon auf dem Brett befinden.
+ --
+ -- RETURNS: true, wenn mindestens eine mgl. Stellung gefunden wurde.
+ --
+ function konstruiere_Stellungen (stellung : Schachbrett; level : Integer)
+ return Boolean is
+ brett : Schachbrett := stellung;
+ level_neu : Integer;
+ ziel_erreichbar : Boolean := False;
+ begin
+ for x in Index loop
+ for y in Index loop
+ if brett (x, y) = Frei then
+ setze_Dame (x, y, brett);
+ level_neu := level + 1;
+ if level_neu = Index'Last then
+ -- Put (brett);
+ count;
+ ziel_erreichbar := True;
+ else
+ ziel_erreichbar := ziel_erreichbar
+ or konstruiere_Stellungen (brett, level_neu);
+ end if;
+ end if;
+ brett := stellung;
+ end loop;
+ end loop;
+ return ziel_erreichbar;
+ end konstruiere_Stellungen;
+
+ brett : Schachbrett := (others => (others => Frei));
+ moeglich : Boolean;
+begin
+ -- setze_Dame (3, 5, brett);
+ -- Put (brett);
+
+-- if ist_Unschlagbar (brett, 1, 1) then
+-- Put_Line ("1, 1 ist nicht schlagbar");
+-- end if;
+
+ moeglich := konstruiere_Stellungen (brett, 0);
+ if moeglich then
+ Put_Line ("es ist mgl." & Integer'Image (Index'Last)
+ & " Damen zu setzen");
+ Put_Line ("Anzahl Komb.: "
+ & Integer'Image (counter / Fakultaet (Index'Last)));
+ end if;
+end Acht_Damen;
+
+-- kate: indent-width 3; indent-mode normal; dynamic-word-wrap on;
+-- kate: line-numbers on; space-indent on; mixed-indent off;
View
14 auto-comment
@@ -1,6 +1,6 @@
#!/usr/bin/php
<?php
-# Run: ./auto-comment vektor.adb
+# Run: ./auto-comment acht_damen.adb
if (!isset($argv[1])) {
}
@@ -9,19 +9,21 @@ $out = array();
$skip_main = true;
-foreach ($ada as $z => $line) {
+foreach ($ada as $z => $l) {
+ // Alle folgenden Zeilen Verschmelzen - wg. LF in Deklarationen
+ $line = implode(array_slice($ada, $z), "\n");
$erg = array();
- preg_match("/^( *)(procedure|function) ([^\(]*)(\(.*\))? (return (.*))?is/", $line, $erg);
+ preg_match("/^( *)(procedure|function) ?([^\(\n]*)(\([^\(\)]*\))?[ \n]+(return (.*))?is/s", $line, $erg);
if (count($erg) > 0) {
if ($skip_main) {
$skip_main = false;
- $out[] = $line;
+ $out[] = $l;
continue;
}
if (isset($ada[$z-2]) && substr(trim($ada[$z-2]), 0, 4) == "-- ") {
- $out[] = $line;
+ $out[] = $l;
continue;
}
@@ -58,7 +60,7 @@ foreach ($ada as $z => $line) {
$out[] = "$ind-- ";
}
}
- $out[] = $line;
+ $out[] = $l;
}
$text = implode($out, "\n");
View
53 textsuche.adb
@@ -0,0 +1,53 @@
+-- FILE: textsuche.adb
+--
+-- PROJECT: Programmieruebungen, Uebungsblatt 5
+-- VERSION: 1
+-- DATE: 20. 11. 2011
+-- AUTHOR: Marcel Schneider
+--
+-------------------------------------------------------------------------------
+--
+-- <PROCEDURE> Textsuche
+-- Liest zwei Texte ein und testet, ob der 2. im 1. vorkommt.
+--
+
+
+with Ada.Text_IO, Ada.Strings.Unbounded, Ada.Strings.Unbounded.Text_IO;
+use Ada.Text_IO, Ada.Strings.Unbounded, Ada.Strings.Unbounded.Text_IO;
+procedure Textsuche is
+ function contains (haystack, needle : Unbounded_String) return Boolean is
+ matchedlen : Integer := 0;
+ begin
+ if Length (needle) = 0 then
+ return True;
+ end if;
+ for i in 1 .. Length (haystack) - Length (needle) + 1 loop
+ if Element (haystack, i) = Element (needle, 1) then
+ for j in 1 .. Length (needle) loop
+ if Element (haystack, i + j - 1) = Element (needle, j) then
+ matchedlen := matchedlen + 1;
+ end if;
+ end loop;
+ if matchedlen = Length (needle) then
+ return True;
+ end if;
+ end if;
+ end loop;
+ return False;
+ end contains;
+
+ text, suchtext : Unbounded_String;
+begin
+ Put_Line ("Geben Sie einen Text ein:");
+ text := Get_Line;
+ Put_Line ("Geben Sie einen Suchtext ein:");
+ suchtext := Get_Line;
+ if contains (text, suchtext) then
+ Put_Line ("Suchtext ist enthalten");
+ else
+ Put_Line ("Suchtext ist nicht enthalten");
+ end if;
+end Textsuche;
+
+-- kate: indent-width 3; indent-mode normal; dynamic-word-wrap on;
+-- kate: line-numbers on; space-indent on; mixed-indent off;
View
92 vektorberechnungen.adb
@@ -1,7 +1,7 @@
-- FILE: vektorberechnugen.adb
--
--- PROJECT: Programmieruebungen , Uebungsblatt 4
--- VERSION: 1
+-- PROJECT: Programmieruebungen, Uebungsblatt 4
+-- VERSION: 2
-- DATE: 14. 11. 2011
-- AUTHOR: Marcel Schneider
--
@@ -15,6 +15,10 @@
with Ada.Text_IO, Ada.Float_Text_IO, Ada.Integer_Text_IO;
with Ada.IO_Exceptions;
+<<<<<<< HEAD
+=======
+
+>>>>>>> e37e89b4cee9ec81c8f7cd269164abf392098a7d
procedure vektorberechnungen is
type Vektor is array (Natural range <>) of Float;
@@ -181,6 +185,7 @@ procedure vektorberechnungen is
begin
loop
+ -- Menue ausgeben
Ada.Text_IO.Put_Line ("Was soll berechnet werden?");
Ada.Text_IO.Put_Line ("a) Addition zweier Vektoren,");
Ada.Text_IO.Put_Line ("b) Subtraktion zweier Vektoren,");
@@ -192,16 +197,14 @@ begin
Ada.Text_IO.Get (auswahl);
case auswahl is
+ -- Operationen mit beliebig grossen Vektoren
when 'a' | 'b' | 'c' | 'd' =>
- Ada.Text_IO.Put_Line ("Anzahl Dimensionen?");
- Ada.Integer_Text_IO.Get (dimension);
- declare
- vec_a, vec_b : Vektor (1 .. dimension);
- skalar : Float;
- begin
- Ada.Text_IO.Put_Line ("Daten fuer 1. Vektor:");
- Get (vec_a);
+ begin -- fuers Exception-Handling
+ -- Groesse abfragen
+ Ada.Text_IO.Put_Line ("Anzahl Dimensionen?");
+ Ada.Integer_Text_IO.Get (dimension);
+<<<<<<< HEAD
if auswahl /= 'c' then
Ada.Text_IO.Put_Line ("Daten fuer 2. Vektor:");
Get (vec_b);
@@ -224,8 +227,63 @@ begin
exception
when ADA.IO_EXCEPTIONS.DATA_ERROR =>
Ada.Text_IO.Put_Line ("Bitte geben Zahlen ein!");
+=======
+ declare
+ -- passende Vektoren definieren
+ vec_a, vec_b : Vektor (1 .. dimension);
+ skalar : Float;
+ begin
+ -- Vektoren einlesen
+ Ada.Text_IO.Put_Line ("Daten fuer 1. Vektor:");
+ Get (vec_a);
+
+ -- fuer die Multiplikation mit Skalar wird nur ein Vektor
+ -- benoetigt, sonst 2
+ if auswahl /= 'c' then
+ Ada.Text_IO.Put_Line ("Daten fuer 2. Vektor:");
+ Get (vec_b);
+ end if;
+
+ -- jetzt die Operationen unterscheiden
+ case auswahl is
+ when 'a' =>
+ Put (vec_a + vec_b);
+
+ when 'b' =>
+ -- Differenz ist Summe mit neg. Vektor
+ Put (vec_a + (vec_b * (-1.0)));
+
+ when 'c' =>
+ -- fuer die Skalarmult. noch den Skalar einlesen
+ Ada.Text_IO.Put_Line ("Geben Sie den Skalar an:");
+ Ada.Float_Text_IO.Get (skalar);
+
+ Put (vec_a * skalar);
+
+ when 'd' =>
+ Ada.Float_Text_IO.Put (vec_a * vec_b, 1, 4, 0);
+ Ada.Text_IO.New_Line;
+
+ when others =>
+ null; -- sollte niemals auftreten, wg. aeusserem case
+ end case;
+ end;
+
+ exception
+ -- bei Dimensionsabfrage
+ when Constraint_Error =>
+ Ada.Text_IO.Put_Line ("Geben Sie sinnvolle Werte an!");
+ Ada.Text_IO.New_Line;
+
+ -- Beim Zahlen-Einlesen
+ when Ada.IO_Exceptions.Data_Error =>
+ Ada.Text_IO.Put_Line ("Geben Sie eine Zahl an!");
+ Ada.Text_IO.New_Line;
+>>>>>>> e37e89b4cee9ec81c8f7cd269164abf392098a7d
end;
+
when 'e' =>
+ -- Sonderfall Kreuzprodukt, feste Groesse
declare
vec_a, vec_b : Vektor (1 .. 3);
begin
@@ -236,16 +294,24 @@ begin
Get (vec_b);
Put (vec_a ** vec_b);
+
+ exception
+ -- Beim Zahlen-Einlesen
+ when Ada.IO_Exceptions.Data_Error =>
+ Ada.Text_IO.Put_Line ("Geben Sie eine Zahl an!");
+ Ada.Text_IO.New_Line;
end;
+
when 'x' =>
- exit;
+ exit; -- Programm-Hauptschleife verlssen
+
when others =>
Ada.Text_IO.Put_Line ("Geben Sie bitte etwas vernuenftiges ein.");
+ Ada.Text_IO.New_Line;
+
end case;
end loop;
-
-
end vektorberechnungen;
-- kate: indent-width 3; indent-mode normal; dynamic-word-wrap on;

0 comments on commit 22c31d4

Please sign in to comment.