1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Programm Partition in TurboPascal

Discussion in 'Programmieren' started by sunshine90, Jan 23, 2009.

Thread Status:
Not open for further replies.
  1. Hallo,
    ich habe als Aufgabe bekommen ein Programm in Pascal zu schreiben. Allerdings hab ich da ein kleines Problem. Programmiert hab ich es in FreePascal.
    Die Aufgabenstellung lautet sinngemäß, ich soll ein Programm schreibe, dass n ganze Zahlen einliest und in einem Feld a der Größe n speichert, dann soll das Programm ein Pivotelement (pivot) einlesen.
    Ich soll nun das Feld so ordnen, dass die Elemente die kleiner sind als pivot links stehen und die größer sind rechts.
    Beispieleingabe: 12 3 8 5 9 11 7 4 6 1 pivot: 7
    Beispielausgabe: 3 5 4 6 1 7 12 8 9 11

    Hier also mein Programm:
    program partition;
    uses dos;

    const n=8;
    var a:array [1..n] of integer;
    pivot,links,rechts,i,hilf : integer;

    begin
    for i := 1 to n do
    begin
    write(i, ' .Zahl: ');
    readln(a);
    end;
    write('Pivotelement: );
    readln(pivot);

    for i := 1 to n do
    begin
    links := a[1];
    rechts := a[n];
    ////
    repeat
    while a[links] < pivot do links := a[links] + 1;
    while a[rechts] > pivot do rechts := a[rechts] - 1;

    if a[links] < a[rechts]
    then hilf := a[links];
    a[links] := a[rechts];
    a[rechts] := hilf;
    until links >= rechts;

    write('Ausgabe:');
    for i := 1 to n do
    write(' ', a);
    end.

    Irgendwo in der Nähe von //// muss der Fehler sein, Pascal meckert zwar nicht, aber es funktioniert nicht wie es soll. Auf jeden Fall stimmt die Eingabe und die Ausgabe.
    Wer kann mir helfen??? Bitte, bitte.

    Danke schon mal im vorraus.
    MfG sunshine90
     
  2. kazhar

    kazhar Viertel Gigabyte

    was genau willst du mit
    -> while a[links] < pivot do links := a[links] + 1; <-
    erreichen?

    solange das links'te element im array a kleiner als pivot ist setze den index "links" auf den inhalt des links'ten element des arrays a +1????
     
  3. An der Stelle soll er nachschauen, ob die 1. Zahl des Feldes die links steht, kleiner als das pivotelement ist, wenn ja soll er sie da stehen lassen und zur nächsten Zahl, also zur 2. Zahl von links springen und diese überprüfen usw.
    Ich weiß nicht genau ob das so geht. Oder ob es heißen muss:
    while a[links] < pivot do links := links + 1 ?
    Ich bin mir an der Stellt total unsicher.
     
  4. kazhar

    kazhar Viertel Gigabyte

    dann musst du das auch so schreiben. das ist ein array, keine collection ;)

    also
    links:=1;
    rechts:=n;

    while a[links] < pivot do links := links + 1;

    etc...
     
  5. muss ich das jetzt auch an der stelle
    if a[links] < a[rechts]
    then hilf := a[links];
    a[links] := a[rechts];
    a[rechts] := hilf;
    until links >= rechts;
    ändern? das programm funktioniert nämlich immer noch nicht :(
    also wenn ich die zahlen 1 2 3 4 5 6 7 8 geordnet eingeb und als pivot 4 nehme schreibt er die zahlen einfach so hin und schreibt für die 4 bei der ausgabe ne 0.
    wenn ich die zahlen durcheinander eingebe beendet sich die ausführung und schreibt mir nen error hin.
     
  6. kazhar

    kazhar Viertel Gigabyte

    ein paar kleinigkeiten hab ich verändert. 1x begin/end hinzugefügt. tut es so wie es soll? wirkt auf mich etwas merkwürdig. mit dem selben aufwand könnte man das array auch sortieren.

    Code:
    program partition;
    
    const n=8;
    var a: array [1..n] of integer;
        pivot, links, rechts, i, hilf: integer;
    
    begin
         for i := 1 to n do
         begin
              write(i, ' .Zahl: ');
              readln(a[i]);
         end;
         write('Pivotelement: ');
         readln(pivot);
    
         for i:=1 to n do
         begin
              links := 1;
              rechts := n;
    
              repeat
                   while a[links] < pivot do inc(links);
                   while a[rechts] > pivot do dec(rechts);
    
                   if a[links] >= a[rechts] then 
                   begin
                        hilf := a[links];
                        a[links] := a[rechts];
                        a[rechts] := hilf;
                   end;
              until links >= rechts;
         end;
    
         write('Ausgabe:');
         for i := 1 to n do
              write(' ', a[i]);
    end.
    
     
    Last edited: Jan 23, 2009
  7. ja super!!!
    es geht.
    danke, danke, denke!
    :jump:
     
Thread Status:
Not open for further replies.

Share This Page