"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

pascal probs, find den fehler nicht

hanzi 22.01.2004 - 19:41 938 18
Posts

hanzi

flawless victory.
Registered: Nov 2002
Location: ~
Posts: 2621
Ich frag ja nur ungern, aber ich hab da ein problem mit meiner Programmier Hausübung :)
Wir sollen mit hilfe vom "Bubblesort" vom User eingegebene wörter sortieren, nur ich baue wiedermal eine endlosschleife :D

Kann mir plz jemand sagen was da der Fehler ist, ich sehe ihn echt nicht :(

Festgestellt hab ich aber, dass er irgendwo in dem fett-geschriebenen Teil des Textes sein muss.

btw. es ist nicht die beste lösung, dazu fehlt mir noch viel wissen...
[.. gibt es eine Funktion die mir die anzahl der Stellen eines Arrays zurückgibt? ]

Code:
program stringread;
USES crt;

type data =  array[1..5] of string;

var str : data;
    i : integer;



procedure swap ([COLOR=red]var*[/COLOR] x,y : string);
  var dummy : string;
begin
  dummy := x;
  x := y;
  y := dummy;
end;


procedure bubble([COLOR=red]var*[/COLOR] daten:data);
var i:integer;
    swapped:boolean;


begin

  repeat

   swapped := false; // flag initialisieren ;)

    [B] for i:= 1 to 4 do begin

      if daten[i] > daten[i+1] then begin

        swap (daten[i],daten[i+1]);
        swapped := true;

      end;

    end;[/B]

  until (swapped=false);

end;


begin

  //clean tha screen ;)
  clrscr();

  // einlesen der komischen Zeichenfolgen die der User eintippselt
  writeln('Geben sie bitte 5 Zeichenketten ein!');

  for i:=1 to 5 do begin
    readln(str[i]);
  end;


  writeln;  // eine leere zeile :eek:
  writeln;  // ...und nochmal

  bubble(str);  // blubber blubber

  // ergebis ausgeben
  writeln('Hier die geordnete version!');
  for i:=1 to 5 do begin
    writeln(str[i]);
  end;


  readkey; // luxxuz
end.

* das var Fehlte, das war der ganze Fehler.
Ohne var = call by value
Mit var = call by reference
Bearbeitet von hanzi am 22.01.2004, 20:14

Frys_Assassin

information keeper
Avatar
Registered: Oct 2001
Location: New New York
Posts: 2503
ich kann mich nimmer so genau an die funktionsweise von pascal erinnern, aber ich habe den verdachte daß deine swap funktion zwar swapt, aber nur in der procedure. dh es wird kein wert zurückgegeben und in der hauptschleife bleibt dann alles wies is. deswegen auch ne endlosschleife weil ers immer wieder probiert. in c heisst was du machst call by value, aber besser wäre call by reference falls dir das was sagt.

hanzi

flawless victory.
Registered: Nov 2002
Location: ~
Posts: 2621
jo call by reference sagt mir was :)
das wäre dann so:
procedure swap (var x,y : string);

werds gleich testen


EDIT:



THX!!
Frys_Assassin das war der einzige fehler... :D
funzt jetzt
Bearbeitet von hanzi am 22.01.2004, 20:14

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25423
DAS wundert mich aber jetzt.. du vergleichst strings, das kann gar nicht funktionieren. welche tp version hast du? (ich frag auch weil du // für kommentare verwendet hast.. das is mir auch neu :) )

hanzi

flawless victory.
Registered: Nov 2002
Location: ~
Posts: 2621
ich verwende free pascal ;)
da funzt das alles :D

btw. sicher kann ich strings vergleichen, ich kann auch die .exe uppen wenn du es mir net glaubst :D :p

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25423
aha.. na ja, mir kann es einerlei sein, deinem lehrer vielleicht nicht.

DKCH

...
Registered: Aug 2002
Location: #
Posts: 3280
die kommentare sind dubios, aber was ist am strings vergleichen verkehrt?

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25423
'100' < '99'

MightyMaz

hat nun auch einen Titel
Registered: Feb 2003
Location: .de
Posts: 619
komplette Strings vergleichen ist nicht möglich !
Du kannst höchstens, basierend auf den Ascii Werten der Buchstaben, das erste Zeichen Vergleichen (was vieleicht in dem Dialekt automatisch geschieht ?), wobei du da aber ja noch nach Groß und Kleinschreibung unterscheiden mußt und auch überlegen mußt, was mit Sonderzeichen passiert.

Was ist nun z.b. größer ?

"§)=$%$" oder doch eher "'*_$§$" ? :D

Geigerzeiger

Addicted
Registered: Jan 2004
Location: anywhere
Posts: 449
ist schon ne weile her wie ich mich mit PASCAL beschäftigt hab. Wir haben damals auch die ganzen sortier-algorithmen durchgmacht, wennst an fehler so net findest, solltest a moi an debugger einsetzen.
Der hat ma immer weitergholfen. Du muasst das prog Step-byStep ausführen und dabei watches einbauen

DKCH

...
Registered: Aug 2002
Location: #
Posts: 3280
ah, stimmt, type definitionen lesen hilft :D

nur nach dem anfangsbuchstaben sortieren ist ja dann auch fad, weil was tust bei "aa" und "ab", kommisar zufall?

Geigerzeiger

Addicted
Registered: Jan 2004
Location: anywhere
Posts: 449
Zitat von MightyMaz
komplette Strings vergleichen ist nicht möglich !
Du kannst höchstens, basierend auf den Ascii Werten der Buchstaben, das erste Zeichen Vergleichen (was vieleicht in dem Dialekt automatisch geschieht ?), wobei du da aber ja noch nach Groß und Kleinschreibung unterscheiden mußt und auch überlegen mußt, was mit Sonderzeichen passiert.

Was ist nun z.b. größer ?

"§)=$%$" oder doch eher "'*_$§$" ? :D

AFAIK kann man in PAS schon strings komplett vergleichen. Man kann auch zb schreiben: if str1 < str2 then... Wenn str1 größer als str2 ist dann .... Da wird sowieso alphabetisch überprüft.

atrox

in fairy dust... I trust!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
Zitat von mat
'100' < '99'
'99' < 'ATROX'
'ATROX' < 'MAT'
'MAT' < 'atrox'

hanzi

flawless victory.
Registered: Nov 2002
Location: ~
Posts: 2621
es geht.

im anhang das compilierte programm als .txt file
(rename to .exe)

click here

es wird sortiert wie im wörterbuch.
nur großbuchstaben kommen vor kleinbuchstaben (oder umgekeht?)
Bearbeitet von hanzi am 22.01.2004, 21:58

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25423
na das geht ja mördergut.. muahaha :D

probier mal:
1000
9
34
87
23
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz