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

Felder verschmelzen in Turbo pascal

Discussion in 'Programmieren' started by diver02, Sep 23, 2005.

Thread Status:
Not open for further replies.
  1. diver02

    diver02 ROM

    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

    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

    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

    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

    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

    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

    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
     
Thread Status:
Not open for further replies.

Share This Page