Felder verschmelzen in Turbo pascal

Dieses Thema im Forum "Programmieren" wurde erstellt von diver02, 23. September 2005.

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. diver02

    diver02 ROM

    Registriert seit:
    23. September 2005
    Beiträge:
    2
    Hallo zusammen,

    vielleicht könnt ihr mir helfen. Ich habe die Aufgabe aus 2 einzulesende Zeilen, die sortiert sind, 1 zusammen zu fassen.
    Bei der Ausgabe kommt nur
    0 0 0 0 100 0 0 0 0 0 0 0 0
    Vielleicht kann mal jemand drauf schauen.


    Hier Aufgabe!

    Gesucht ist ein Programm merge, welches zwei (aufsteigend) sortierte Felder von (nicht notwendig verschiedenen) integer Zahlen zu einem sortierten Feld verschmilzt. Dabei sollen mehrfach vorkommende Elemente auch mehrfach im Ergebnisfeld gespeichert werden. Die beiden Felder werden von der Standardeingabe eingelesen, wobei wir voraussetzen, dass nur sortierte Zahlenfolgen eingegeben werden. Eine Präfung dieser Annahme ist nicht erforderlich. Das sortierte Ergebnisfeld wird ausgegeben.

    z.B. Feld1 enthalte Elemente 11,14,18,80,100, Feld2 die Elemente 8,11,11,17,22,30,55,70
    Feld enthält dann nach der Ausführung von merge die Elemente 8,11,11,11,14,17,18,22,30,55,70,80,100, h.d. wenn Feld2 erschöpft ist, müssen noch die restlichen Elemente aus Feld1 nach Feld kopiert werden

    Ergänzen das folgende Programm vollständig

    Hinweis: Ein Kopieren der Feldinhalte von Feld1 und Feld2 nach Feld mit anschließendem Sortieren von Feld ist keine Lösung der Aufgabe!
    Auch das komplette Kopieren eines Feldes nach Feld mit anschliessendem Einsortieren der Elemente das anderen Feldes ist keine Lösung.


    program merge (input, output);
    { liest ohne Eingabeueberpruefung zwei sortierte Felder mit integer-Zahlen ein; beide Felder werden in Feld sortiert zusammengefuegt; das Ergebnis wird ausgegeben; ist die Eingabe unsortiert, so ist das Ergebnisfeld nicht sortiert }

    const
    GRENZE1 = 5;
    GRENZE2 = 8;
    GRENZE = 13; { GRENZE1 + GRENZE2 }
    GRENZE1PLUS1 = 6;
    GRENZE2PLUS1 = 9;
    GRENZEPLUS1 = 14;

    type
    tIndex = 1..GRENZE1;
    tIndex2 = 1..GRENZE2;
    tIndex = 1..GRENZE;
    tIndex1Plus1 = 1..GRENZE1PLUS1;
    tIndex2Plus1 = 1..GRENZE2PLUS1;
    tIndexPlus1 = 1..GRENZEPLUS1;
    tFeld1 = array [tIndex1] of integer;
    tFeld2 = array [tIndex2] of integer;
    tFeld = array [tIndex] of integer;

    var
    Feld1 : tFeld1;
    Feld2 : tFeld2;
    Feld : tFeld;
    i : tIndex1Plus1;
    j : tIndex2Plus1;
    k : tIndexPlus1;
    p1 : integer;
    p2 : integer;

    begin
    p1 := 0;
    p2 := 0;
    { sortierte Felder einlesen }
    writeln ('Bitte'. GRENZE1:2, ' Werte des ersten Feldes', 'sortiert eingeben!');
    for i := 1 to GRENZE1 do
    readln (Feld1);
    writeln ('Bitte', GRENZE2:2, 'Werte des zweiten Feldes','sortiert eingeben!');
    for j := 1 to GRENZE2 do
    readln (FELD2[j]];
    while (i<=GRENZE1) or (j<=GRENZE2) do
    begin
    if (i<=GRENZE1) and (j<=GRENZE2) then
    begin
    if (Feld1[p1] < Feld2[p2]) then
    begin
    Feld := Feld1[p1];
    p1 := p1 + 1;
    end
    else <- Hier hab ich error in statement!
    begin
    Feld[j] := Feld2[p2];
    p2 := p2 + 1;
    end;
    end
    else
    begin
    if (i <= GRENZE1) then
    begin
    Feld := Feld1[p1];
    p1 := p1 + 1;
    end
    else
    begin
    if (j <= GRENZE2) then
    begin
    Feld[j] := Feld2[p2]
    p2 := p2 + 1;
    end;
    end;
    end;
    i := i + 1;
    end;
    writeln (' Das Ergebnisfeld ist:');
    for k := 1 to GRENZE do
    write (Feld[k]:8);
    writeln
    end. {merge}
     
  2. NickNack

    NickNack Megabyte

    Registriert seit:
    5. August 2005
    Beiträge:
    1.667
    tindex ist 2x definiert, dafür fehlt tindex1

    readln (FELD2[j]]; letzte Klammer tauschen gegen runde Klammer;

    writeln ('Bitte'. GRENZE1:2, ' Werte des ersten Feldes', 'sortiert eingeben!'); Punkt hinter 'Bitte'. gegen Komma tauschen

    Hinter Feld[j] := Feld2[p2] fehlt ein Semikolon.
     
  3. Michi0815

    Michi0815 Guest

    Registriert seit:
    7. Januar 2004
    Beiträge:
    3.429
    Code:
    {einleserei etc}
    {...}
    
    p1:=0;
    p2:=0;
    repeat
         if (p1 < Grenze1) and (p2 < Grenze2) then
         begin
              if Feld1[p1] < Feld2[p2] then
              begin
                   Feld[p1+p2]:=Feld1[p1];
                   inc(p1);
              end else begin
                   Feld[p1+p2]:=Feld2[p2];
                   inc(p2);
              end;
         end else
         if (p1<Grenze1) and (p2>=Grenze2) then
         begin
              Feld[p1+p2]:=Feld1[p1];
              inc(p1);
         end else
         if (p1>=Grenze1) and (p2<Grenze2) then
         begin
              Feld[p1+p2]:=Feld2[p2];
              inc(p2);
         end;
    until (p1>=Grenze1) and (p2>=Grenze2);
    
    {ausgeben etc}
    {...}
    
     
  4. diver02

    diver02 ROM

    Registriert seit:
    23. September 2005
    Beiträge:
    2
    Erstmal danke für die Hinweise.
    Leider klappt es mit der Ausgabe nicht so richtig.
    Ich kriege als Ausgabe nur die 2 Felder aber halt nicht die Felder zusammen sortiert.
    Wie bringe ich die Variable k ins Spiel?
     
  5. genius

    genius ROM

    Registriert seit:
    26. September 2005
    Beiträge:
    2
    Hi,

    das Program von Michi arbeitet nach automatenauswertung nicht korrekt, habs mal reinkopiert. Hab es funktionstüchtig abgeändert. z.b. Feld [p1] würde zu Begin der Schleife out of range Adressen beschreiben (weil das Feld von 1 nicht von 0 anfängt.

    Diver .... die Aufgabenstellung kommt mir sehr bekannt vor , schöne Grüsse an die Fernuni Hagen ;)
    <pre>
    Hier mein Programm:
    [..eingaben...]

    { Initialisierung der beiden Feldindizes }
    i:=1;
    j:=1;
    repeat
    { case: beide Feldgrenzen sind nicht erreicht }
    if (i <= Grenze1) and (j <= Grenze2) then
    begin
    if Feld1 <= Feld2[j] then
    begin
    Feld[i+j-1]:=Feld1;
    i:=i+1;
    end
    else
    begin
    Feld[i+j-1]:=Feld2[j];
    j:=j+1;
    end;
    end
    else
    { case: Feld2 ist fertig einsortiert }
    if (i<=Grenze1) and (j>Grenze2) then
    begin
    Feld[i+j-1]:=Feld1;
    i:=i+1;
    end
    else
    { case: Feld1 ist fertig einsortiert }
    if (i>Grenze1) and (j<=Grenze2) then
    begin
    Feld[i+j-1]:=Feld2[j];
    j:=j+1;
    end;
    until (i>Grenze1) and (j>Grenze2); { Schleife bis beide Felder einsortiert sind }
    </pre>
    [...ausgaben..]
     
  6. NickNack

    NickNack Megabyte

    Registriert seit:
    5. August 2005
    Beiträge:
    1.667
    Warum einfach, wenn es auch umständlich geht.

    Feld : Array[0..Maxint] of byte;

    Der eingegebene Wert indiziert Feld und inkrementiert den Feldinhalt.

    Ausgabe:

    For I := 1 to Maxint do
    if Feld > 0 then for j := 1 to feld do
    Write(I:8, ', ');

    Voraussetzung: Grenze ist < Maxint.
     
  7. genius

    genius ROM

    Registriert seit:
    26. September 2005
    Beiträge:
    2
    Weil Feld schon anders deklariert ist und ich weiss nicht genau wenn du Feld so gross machst, wird glaub auch speicher allociert und verschwendet (bin mir aber nicht sicher)

    Gruss
     
Status des Themas:
Es sind keine weiteren Antworten möglich.

Diese Seite empfehlen