unit tsp; (* Thomas Klein 1999 *) INTERFACE uses graph,printer,dos,grafik,mouse; const version=3.10; (* Versionsnummer *) maxstadt=75; (* max. Anzahl v. Staedten *) maxstadtquad=5625; (* maxstadt^2 *) maxentfernung=maxlongint; (* max. Entfernung *) maxstrecke=28633115; (* max. Entfernung(+1) zw. zwei Staedten, maxlongint/maxstadt *) maxx=1240; maxy=999; (* max. Koord. f. Karte *) maxzufall=1599; (* max. Entfernung(/1000) bei zufaelliger Erstellung v. entftab *) maxverfahren=40; (* max. Anzahl v. Loesungsverfahren *) type stadt=record (* Stadtkoord. in Karte *) x,y:longint; end; stadtnr=0..maxstadt; (* Nr. von Staedten *) entfernung=longint; (* Entfernungen zw. Staedten *) entfmatrix=array [1..maxstadt,1..maxstadt] of entfernung; (* Entfernungsmatrix *) entftyp=(kart,symm,asymm); (* Art der Entfernungsbestimmung kart: aus Karte, symm: zufaellig symmetrisch, asymm: zufaellig asymm. *) weg=string; (* Wege werden in Strings gespeichert *) wegtypmenge=set of byte; (* Byte-Menge fuer Wegtypen, s. function wegtyp *) var stadtkarte:array [1..maxstadt] of stadt; (* Koord. der Staedte *) entftab:entfmatrix; (* Entfernungstabelle *) entftabtyp:entftyp; (* Art der Entfernungsbestimmung *) vorher,aktuell:weg; (* vorheriger u. aktueller Weg *) stadtanzahl:stadtnr; (* Anzahl Staedte *) verfahren:byte; (* ausgewaehltes Loesungsverfahren *) verfanzahl:byte; (* Anzahl Loesungsverfahren *) verfwegtypen:array [1..maxverfahren] of wegtypmenge; (* Wegtypmengen der Verfahren *) verftext:array [1..maxverfahren] of string[100]; (* Menuetexte/Titel d. Verf., s. procedure verfahren_waehlen *) verfformat:record (* Format des Menues zur Verfahrenswahl *) x,y:byte; (* x: Spalten, y: Zeilen *) end; startpunktwahl:boolean; (* true: automatische Startpunktwahl *) oben,unten,rechts:integer; (* Position der Trennlinien zw. Menues und Karte, links=0 *) leiste,button,karte:menu_desc; (* Menue-Descriptoren *) procedure wegtxt(w:weg;warten:boolean); (* Weg w in Textmodus ausgeben, evtl. nach Ausgabe warten *) procedure neustart; (* setzt wichtige Variablen zurueck *) function weglaenge(w:weg):entfernung; (* ermittelt Weglaenge, 0 falls keine Entfernungstab. vorhanden *) function wegtyp(w:weg):byte; (* ermittelt 'Weg'-Typ; 0: kein Weg, 1: Weg vorhanden, 2: keine doppelten Staedte, 3: wie 2 und zurueck zum Start; +10: keine Unterbrechung, +100: alle Staedte *) procedure menue(abstand:integer;menu:string; backcol,txtcol,trenncol:word;var desc:menu_desc); (* zeichnet Menue in untere Leiste, Parameter wie bei hmenu *) procedure meldung(s:string;hintergrund,schrift:word); (* Meldung in unterer Leiste *) procedure laenge_aus(w:weg); (* gibt Wegl„nge in unterer Leiste aus *) procedure wegtyp_aus(w:weg); (* gibt Wegtyp in unterer Leiste aus *) procedure bildschirm; (* zeichnet Rahmen und rechtes Menue *) procedure start0; (* startet Stoppuhr *) procedure start; (* 'Loesung wird berechnet'(und evtl. Serienteil) ausgeben und Stoppuhr starten *) procedure stop; (* stoppt Stoppuhr *) function zeit:real; (* liefert gestoppte Zeit in Sek. *) procedure zeit_aus(komma:boolean); (* gibt gestoppte Zeit an akt. Pos. aus, evtl. mit vorangestelltem Komma *) procedure zeichne_stadt(nr:stadtnr); (* zeichnet Stadt nr in Karte ein, vorher windowon noetig *) procedure zeichne_kante(stadt1,stadt2:stadtnr); (* zeichnet Pfeil v. stadt1 nach stadt2, vorher window noetig *) procedure zeichne_karte(loeschen:boolean;farbe:word); (* zeichnet Staedte mit farbe in Karte, loeschen=true: bildschirm loeschen *) procedure zeichne_weg(w:weg;loeschen:boolean;farbe:word); (* zeichnet Weg mit farbe in Karte, loeschen=true: bildschirm loeschen *) procedure farbstadt(nr:stadtnr;farbe:word); (* zeichnet Stadt nr mit farbe in Karte *) procedure startstadt(w:weg;farbe:word); (* zeichnet Startstadt von w mit farbe in Karte *) procedure wegkarte(w:weg;loeschen:boolean;wegfarbe,kartenfarbe:word); (* zeichnet Weg und Karte, loeschen=true: bildschirm loeschen *) procedure bestimme_entfernung(nr:stadtnr;typ:entftyp); (* traegt Entfernungen fuer Stadt nr in entftab ein, Berechnung entsprechend typ *) procedure zeige_entftab(schirm:boolean); (* gibt entftab auf Bildschirm(true) oder in Datei(false) aus *) function finde_stadt(xx,yy:longint):stadtnr; (* findet zu (xx,yy) naechste Stadt *) function stadtwahl(button:byte):stadtnr; (* wartet auf 'button'(255: bel.) und bestimmt naechstgelegene Stadt *) procedure neue_stadt(xx,yy:longint); (* traegt stadt mit Koord. (xx,yy) in stadtkarte ein und zeichnet sie *) procedure loesche_stadt(nr:stadtnr); (* entfernt Stadt nr aus stadtkarte, Wege werden geloescht *) procedure nrweg(var w:weg); (* erzeugt Rundweg nach Staedtnr. *) procedure zufallsweg(var w:weg); (* erzeugt zufaelligen Rundweg *) procedure manuellweg(var w:weg); (* manuelle Wegeingabe *) function dateiname(prompt:string):string; (* liefert Dateiname, bei $ wird Directory angezeigt *) procedure speichern(name:string); (* als ASCII-Datei, kann mit bel. Editor bearbeitet werden *) procedure laden(name:string); (* Nichtzahlen, Zeilenenden und mit '#' beginnende Zeilen werden ueberlesen *) function serienteil(wegtypen:wegtypmenge):boolean; (* letzte Serienberechnung speichern, naechste laden, false: keine weitere Datei oder falscher Wegtyp *) procedure eine_stadt; (* Mausklick auf Karte -> eine Stadt ergaenzen/loeschen *) procedure neu; (* alles loeschen *) procedure staedte_ergaenzen; (* mehrere Staedte ergaenzen *) procedure staedte_loeschen; (* mehrere Staedte loeschen *) procedure entfernungen; (* Entfernungen berechnen/eingeben *) procedure weg_bestimmen; (* auf verschiedene Arten Weg vorgeben *) procedure verfahren_waehlen(var wegtypen:wegtypmenge); (* verfahren:=nr L”sungsverfahren, wegtypen:=erlaubte Wegtypen des Verf. Format verftext: '*Menueeintrag|Titelzeile', *=+: fragen, ob automatische Startpunktwahl gewuenscht *) function loesen(wegtypen:wegtypmenge):boolean; (* true: wegtyp(aktuell) in Menge wegtypen enthalten und entftab vorhanden, sonst Meldung *) procedure serie; (* Load-/Save-Name fuer Serienberechnung *) procedure drucken; (* Karte und Weglaenge drucken *) procedure datei_speichern; (* Name waehlen und speichern *) procedure datei_laden; (* Name waehlen und laden *) function ende:boolean; (* Sicherheitsabfrage *) function tspmenue(wegtypen:wegtypmenge):boolean; (* ueberwacht Menue, Verlassen mit Ende/Schliessbutton(false) oder Loesen(true, nur wenn aktueller Weg in wegtypen-Menge *) function tspinit(titel,aufruf:string):boolean; (* Initialisierungen, Bildschirm zeichnen titel: Fenstertitel, aufruf: Menuetext Loesungsroutine false: kein Maustreiber installiert *)