Concours Informatique Luxembourgeois 2006 Epreuve de Sélection Préliminaire



Ähnliche Dokumente
Kurs 1613 Einführung in die imperative Programmierung

Programmierkurs Java

Über Arrays und verkettete Listen Listen in Delphi

Konzepte der Informatik

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Visual Basic Basisbefehle Hinweis: Der Text in eckigen Klammern [ ] ist variabel, z.b. [var] => 5.3. Eckige Klammern sind stets wegzulassen!

1 topologisches Sortieren

Erwin Grüner

Zur drittletzten Zeile scrollen

Übungen für Woche 10

Professionelle Seminare im Bereich MS-Office

Einführung in die Programmierung

Lehrstuhl Informatik VI Grundzüge der Informatik * WS 2008/2009 Prof. Dr. Joachim Biskup

Informatik GK 12 Klassen Klassen programmieren in Delphi am Beispiel der konkreten Klasse Auto

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Programmierkurs: Delphi: Einstieg

Das sogenannte Beamen ist auch in EEP möglich ohne das Zusatzprogramm Beamer. Zwar etwas umständlicher aber es funktioniert

Datentypen. Agenda für heute, 4. März, Pascal ist eine streng typisierte Programmiersprache

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Grundlagen der Informatik

3.2 Binäre Suche. Usr/local/www/ifi/fk/menschen/schmid/folien/infovk.ppt 1

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Kapitel MK:IV. IV. Modellieren mit Constraints

Grundlagen der Theoretischen Informatik, SoSe 2008

Scala kann auch faul sein

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Algorithmen und Datenstrukturen 2

Übungen Programmieren 1 Felix Rohrer. Übungen

Erstellen einer Collage. Zuerst ein leeres Dokument erzeugen, auf dem alle anderen Bilder zusammengefügt werden sollen (über [Datei] > [Neu])

Lichtbrechung an Linsen

Das Briefträgerproblem

Würfelt man dabei je genau 10 - mal eine 1, 2, 3, 4, 5 und 6, so beträgt die Anzahl. der verschiedenen Reihenfolgen, in denen man dies tun kann, 60!.

Virtuelle COM-Schnittstelle umbenennen

Primzahlen und RSA-Verschlüsselung

Objektorientierte Programmierung

Zahlen und das Hüten von Geheimnissen (G. Wiese, 23. April 2009)

Platinen mit dem HP CLJ 1600 direkt bedrucken ohne Tonertransferverfahren

M. Graefenhan Übungen zu C. Blatt 3. Musterlösung

Algorithmen und Datenstrukturen

Sin-Funktion vgl. Cos-Funktion

Wirtschaftsinformatik I

E-PRIME TUTORIUM Die Programmiersprache BASIC

Programmiervorkurs SS 2011 Technische Universität Darmstadt Jan Hendrik Burdinski, Felix Kerger

EINFACHES HAUSHALT- KASSABUCH

Übung Grundlagen der Programmierung. Übung 03: Schleifen. Testplan Testergebnisse

1 Vom Problem zum Programm

php Hier soll ein Überblick über das Erstellen von php Programmen gegeben werden. Inhaltsverzeichnis 1.Überblick Parameterübergabe...

Arge Betriebsinformatik GmbH & Co.KG, CAP News 40, Februar CAP-News 40

Excel Funktionen durch eigene Funktionen erweitern.

Electronic Systems GmbH & Co. KG

Diana Lange. Generative Gestaltung Operatoren

Informationsblatt Induktionsbeweis

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Arbeiten mit UMLed und Delphi

Bedienungsanleitung für den Online-Shop

Sortieren durch Einfügen. Prof. Dr. W. Kowalk Sortieren durch Einfügen 1

Klausur in 12.1 Themen: Zahlsysteme, Grundlagen von Delphi (Bearbeitungszeit: 90 Minuten)

Definition und Begriffe

Eine Baumstruktur sei folgendermaßen definiert. Eine Baumstruktur mit Grundtyp Element ist entweder

Übung 9 - Lösungsvorschlag

MSXFORUM - Exchange Server 2003 > SMTP Konfiguration von Exchange 2003

Kapiteltests zum Leitprogramm Binäre Suchbäume

Beispiel 19. December 4, 2009

Aber zuerst: Was versteht man unter Stromverbrauch im Standby-Modus (Leerlaufverlust)?

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

Thema: Winkel in der Geometrie:

Wichtige Information zur Verwendung von CS-TING Version 9 für Microsoft Word 2000 (und höher)

PLIOMARK-PRINT. Gebrauchsanweisung

Java: Vererbung. Teil 3: super()

5.2 Neue Projekte erstellen

7DVWH.HOOQHU. Kassensystem SANYO (X&D6RIWKapitel 42

Der Zwei-Quadrate-Satz von Fermat

1. Motivation / Grundlagen 2. Sortierverfahren 3. Elementare Datenstrukturen / Anwendungen 4. Bäume / Graphen 5. Hashing 6. Algorithmische Geometrie

Zeichen bei Zahlen entschlüsseln

Anwendungsbeispiele Buchhaltung

Bilder zum Upload verkleinern

Mathematik. UND/ODER Verknüpfung. Ungleichungen. Betrag. Intervall. Umgebung

Datenbank-Verschlüsselung mit DbDefence und Webanwendungen.

Typo3 - Schulung: Fortgeschrittene I an der Hochschule Emden/Leer

präsentiert: Ventildeckel lackieren

Zahlenwinkel: Forscherkarte 1. alleine. Zahlenwinkel: Forschertipp 1

Eine Anwendung mit InstantRails 1.7

Umrechnung von Nettolöhnen in Bruttolöhne AHV/IV/EO/ALV. Conversion des salaires nets en salaires bruts AVS/AI/APG/AC

Leere Zeilen aus Excel-Dateien entfernen

Objektorientierte Programmierung

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Internationales Altkatholisches Laienforum

Modellierung und Programmierung 1

Ein + vor dem Ordnernamen zeigt an, dass der Ordner weitere Unterordner enthält. Diese lassen sich mit einem Klick (linke Maustaste) anzeigen.

Erstellen einer GoTalk-Auflage

Informatik Grundlagen, WS04, Seminar 13

Typdeklarationen. Es gibt in Haskell bereits primitive Typen:

Einfügen von Bildern innerhalb eines Beitrages

Datenbanken Kapitel 2

Einführung in die Programmierung

Leichte-Sprache-Bilder

Das Dilemma des Einbrechers Wer die Wahl hat, hat die Qual!

affilinet_ Flash-Spezifikationen

Transkript:

Concours Informatique Luxembourgeois 2006 Epreuve de Sélection Préliminaire Solutions modèles écrites en Delphi avec l'option "Console application" Problème I Paires amicales 20 points program PAIRES_AMICALES; var I,A,B : integer; function SD (X : integer) : integer; var SO,I : integer; SO := 1; for I := 2 to round(sqrt(x)) do if X mod I = 0 then SO := SO + I + X div I; SD := SO for I := 1 to 32767 do A := SD(I); B := SD(A); if (B = I) and (A < I) then writeln (A,' ',I) readln. La fonction SD (Somme_Diviseurs) retourne la somme des diviseurs demandée du nombre X. Optimisation: on ne calcule qu'à la racine carrée de X, les diviseurs supérieurs à la racine carrée sont trouvés par X div I La condition (A < I) évite l'affichage double: 220 284 et 284 220 et des affichages comme 6 6 28 28 etc. qui sont des nombres parfaits. Remarque: une boucle suffit! (* thx Claudi *) Page 1 de 6

Problème II Occurrences 20 points program occurrences; var f : text; occ : array ['A'.. 'Z'] of integer; i,ch : char; En définissant un tableau dont l'index est du type "caractère" (char) on obtient un programme court et facile. Le type char étant énumérable on peut l'utiliser à cette fin. (* ouverture du ficher d'entrée en lecture *) assign(f,'occ_in.txt'); reset(f); (* initialisation du tableau *) for i := 'A' to 'Z' do occ[i] := 0; (* traitement du fichier d'entrée *) while not eof(f) do read(f,ch); if ord(ch) > 91 then ch := chr(ord(ch)-32); occ[ch] := occ[ch] + 1 conversion en majuscules (voir code ASCII). (* fermeture du ficher d'entrée *) close(f); (* affichage du résultat *) for i := 'A' to 'Z' do writeln(i,' ',occ[i]); readln Un mot à propos des fichiers externes: Pour utiliser un fichier externe de type texte (utilisé le plus souvent) on doit déclarer une variable du type text: var f : text; Pour établir la relation entre la variable f et un fichier externe on utilise l'instruction: assign (f,'path:<nom du fichier>'); Pour ouvrir un fichier en lecture: reset(f); Pour lire dans un fichier: read(f,<nom de variable>) La fonction booléenne eof(f) ( of file) indique la fin du fichier. Pour ouvrir un fichier en écriture: rewrite(f); Pour écrire dans un fichier: Pour fermer un fichier: write(f,<nom de variable>) close(f) Page 2 de 6

Problème III Sudoku 30 points program SUDOKU; var F : text; I,J,ROW,COL,ZERO,SOMME,X,Y : integer; SU : array [1..9,1..9] of integer; MODIFIE : boolean; (* lecture du fichier d'entrée *) assign(f,'sudo_in.txt'); reset(f); read(f,su[i,j]); close(f); Cette variable booléenne est mise à true si le programme modifie le Sudoku. Dans ce cas le traitement est relancé par la répétitive repeat. repeat MODIFIE := false; (* on examine chaque ligne *) ZERO := 0; SOMME := 0; COL := 0; SOMME := SOMME + SU[I,J]; if SU[I,J] = 0 then ZERO := ZERO + 1; COL := J if ZERO = 1 then SU[I,COL] := 45 - SOMME; MODIFIE := true On calcule la somme de tous les nombres de la i-ième ligne. La somme des nombres de 1 à 9 étant 45, le neuvième chiffre manquant est égal à: 45 - SOMME On compte le nombre de zéros de la i-ième ligne. Si on a trouvé un seul zéro dans la i-ième ligne on ajoute le chiffre manquant au Sudoku. Le Sudoku étant maintenant modifié, on met la valeur de la variable MODIFIE à vrai. (* on examine chaque colonne *) ZERO := 0; SOMME := 0; ROW := 0; SOMME := SOMME + SU[I,J]; if SU[I,J] = 0 then ZERO := ZERO + 1; ROW := I if ZERO = 1 then SU[ROW,J] := 45 - SOMME; MODIFIE := true Page 3 de 6

(* on examine chaque sous-carré 3x3 *) X := 1; while X <= 7 do Y := 1; while Y <= 7 do ZERO := 0; SOMME := 0; COL := 0; ROW := 0; for I := X to X + 2 do for J := Y to Y + 2 do SOMME := SOMME + SU[I,J]; if SU[I,J] = 0 then ZERO := ZERO + 1; ROW := I; COL := J if ZERO = 1 then SU[ROW,COL] := 45 - SOMME; MODIFIE := true Y := Y + 3 X := X + 3 until not MODIFIE; Les premiers chiffres en haut et à gauche des sous-carrés ont les coordonnées: 1,1 1,4 1,7 4,1 4,4 4,7 7,1 7,4 7,7 d'où les instructions: et X := 1; while X <= 7 do for I := X to X + 2 do X := X + 3 de même pour la variable Y (* écriture du fichier de sortie *) assign(f,'sudo_out.txt'); rewrite(f); write(f,su[i,j],' '); writeln(f) close(f). Page 4 de 6

Problème IV Maison de St. Nicolas 30 points Bei dieser Aufgabe handelt es sich um ein Problem aus dem Bereich der Graphen. Hier wird ein so genannter Euler-Weg gesucht (siehe auch das Königsbergerbrückenproblem z.b. im "Duden für Informatik"). Als Literatur sei das Buch von Andreas Brandstädt empfohlen, Graphen und Algorithmen, B.G. Teubner Stuttgart. Es bleibt allerdings relativ theoretisch. In unserer Aufgabe ist eine Lösung nur dann möglich, wenn als Startpunkt ein Knoten mit einer ungeraden Kantenzahl gewählt wird. Nur bei A und bei B ist die Kantenzahl ungerade nämlich 3. Bei C und E gibt es 4 Kanten und bei D sind es deren zwei. Wird als Startpunkt A gewählt ist der Endpunkt notgedrungen B und umgekehrt. Im unteren Beispielprogramm wird daher nur Punkt A als Startpunkt benutzt. Mit einer Schleife ist es aber einfach alle Punkte zu testen (siehe unten). Das Programm gibt dann 44 verschiedene Lösungen aus. Mit B als Startpunkt gibt es also ebenfalls 44 Lösungen die zu den 44 "A"-Lösungen symmetrisch sind. Insgesamt ergeben sich demzufolge 88 verschiedene Lösungen. Die hier benutzte Programmiermethode ist das so genannte "Backtracking". Hierbei werden alle möglichen Wege durchlaufen. Beim Erreichen einer Sackgasse wird der letzte Schritt rückgängig gemacht und ein anderer Weg ausprobiert. Dieses Rücknehmen (backtracking) und Neuprobieren erfolgt mit Hilfe rekursiver Aufrufe der Prozedur TRYOUT. Unter Rekursion versteht man dass Prozeduren sich selbst aufrufen. Hierzu ist ein Studium des Buches von Niklaus Wirth, Datenstrukturen und Algorithmen, B.G. Teubner Stuttgart, angeraten. Unter dem Kapitel "Backtracking" findet man unter anderem die bekannten Aufgaben "Acht Damen Problem" und "Springerweg". Zuerst muss die so genannte Adjazenzmatrix definiert werden. Wir wählen dazu ein zweidimensionales Feld mit Namen P (für possible). Als Index dienen die Buchstaben von A bis E und die Werte sind true oder false. Ein Wert true bedeutet dann, dass zwischen den beiden Knoten eine Verbindung besteht, false bedeutet, dass keine Verbindung besteht. Beispiel: P['A','B'] := true zwischen A und B besteht eine Verbindung P['A','D'] := false zwischen A und D besteht keine Verbindung Dabei reicht es aus die Werte true zu definieren. Delphi setzt die Werte false als default. Nun wird die Resultatsvariable RES mit dem Startpunkt (A) initialisiert und die Prozedur TRYOUT mit diesem Startpunkt als Parameter aufgerufen. Die Prozedur TRYOUT versucht nun einen ersten Verbindungsweg mit Hilfe der Adjazenzmatrix zu finden. Wenn dies gelingt wird in der Adjazenzmatrix den eingeschlagene Weg als false, also nicht zur Verfügung steh, markiert: P[X,SUIV] := false;. Auch der Rückweg wird versperrt: P[SUIV,X] := false;. Dann erfolgt der rekursive Aufruf der Prozedur TRYOUT mit dem jetzt erreichten Punkt als Parameter. Falls kein Weg mehr zur Verfügung steht, wenn also vom zuletzt erreichten Punkt kein Weg mehr in der Adjazenzmatrix frei ist, dann kommt die Prozedur TRYOUT zum Ende und der rekursive Aufruf reicht eine Stufe zurück. Der zuletzt eingeschlagene Weg wird wieder frei: P[X,SUIV] := true; P[SUIV,X] := true; und in der Resultatsvariablen wird die letzte Stelle entfernt (rücknehmen: backtracking). Mit einer einfachen Veränderung des Programms kann man sich alle Zwischenschritte anzeigen lassen (siehe veränderte Prozedur TRYOUT). Page 5 de 6

program NICOLAS; var P : array ['A'..'E','A'..'E'] of boolean; RES : string; procedure TRYOUT (X : char); var SUIV : char; for SUIV := 'A' to 'E' do if P[X,SUIV] then P[X,SUIV] := false; P[SUIV,X] := false; RES := RES + SUIV; TRYOUT(SUIV); P[X,SUIV] := true; P[SUIV,X] := true; RES := copy(res,1,length(res)-1) if length(res) = 9 then writeln(res) Ausprobieren eines möglichen Weges Rekursiver Aufruf Zurücknehmen Ein Weg gefunden! Ausgabe des Resultats. P['A','B'] := true; P['A','C'] := true; P['A','E'] := true; P['B','A'] := true; P['B','C'] := true; P['B','E'] := true; P['C','A'] := true; P['C','B'] := true; P['C','D'] := true; P['C','E'] := true; P['D','C'] := true; P['D','E'] := true; P['E','A'] := true; P['E','B'] := true; P['E','C'] := true; P['E','D'] := true; RES := 'A'; TRYOUT ('A'); readln. Um alle Punkte als Startpunkt zu testen: for I := 'A' to 'E' do RES := I; TRYOUT (I) Adjazenzmatrix Veränderte Prozedur TRYOUT, zum Anzeigen aller Zwischenergebnisse: procedure TRYOUT (X : char); var SUIV : char; for SUIV := 'A' to 'E' do if P[X,SUIV] then RES := RES + SUIV; P[X,SUIV] := false; P[SUIV,X] := false; writeln(res); readln; TRYOUT(SUIV); P[X,SUIV] := true; P[SUIV,X] := true; RES := copy(res,1,length(res)-1); writeln(res); readln; Anzeigen der Zwischenresultate (vorwärts) if length(res) = 9 then writeln('solution found: ',RES) Anzeigen der Zwischenresultate (rückwärts) Page 6 de 6