Pascal: Sortierte Zahlenfolgen zusammenfügen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Pascal: Sortierte Zahlenfolgen zusammenfügen

    Hallo,
    also ich arbeite mich momentan in Pascal ein und wollte eine Aufgabe aus dem Buch versuchen zu lösen. Jedoch habe ich da schwierigkeiten mit. DIe Aufgabe lautet folgendermaßen:

    Gesucht ist ein Programm, 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.
    Beispiel: Feld1 enthalte die 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 dem Programm die Elemente 8, 11, 11, 11, 14, 17, 18, 22, 30, 55, 70, 80, 100, d.h. wenn Feld2 erschöpft ist, müssen noch die restlichen Elemente aus Feld1 nach Feld kopiert werden.

    Leider kann ich dazu keinen Ansatz finden, weshalb ich auch nicht dazu in der Lage bin weiterzukommen. Ich wäre sehr dankbar, wenn ich hier einige Tipps zu der AUfgabe erhalten könnte.
    Danke im Voraus
    ozlemmm
  • Vorweg: Ich kann gar kein Pascal.

    Aber zum algorithmischen Problem, hilft dir das vielleicht dennoch:

    Mach dir einfach 2 Zähler, gehe nur mit einem weiter und gebe die kleinere Zahl aus.

    Quellcode

    1. i:=0
    2. j:=0
    3. maxi := array1.length;
    4. maxj := array2.length;
    5. While i+j <maxi+maxj do
    6. Begin
    7. if i<maxi && array1[i] < array2[j]:
    8. print array1[i]
    9. i++;
    10. else:
    11. print array2[j]
    12. j++;
    13. End;
    Alles anzeigen
  • Wo genau hakt es denn? Ich nehme an das einlesen der Zahlen von der Standardeingabe bekommst du hin!? Zeig dochmal was du schon gemacht hast und wo es hakt. Das ist sicherlich ein lösbares Problem.
    Der Algorithmus von d0nut ist schonmal ein guter Ansatz, allerdings müssen da noch ein paar Veränderungen gemacht werden, da du z.B. einen Grenzüberlauf bei array2 bekommen kannst wenn dort öfter kleinere Elemente enthalten sind als in array1 und kleiner ist. Aber wenn du den erstmal in Pascal umgesetzt hast ist das nur noch Kleinram.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • :( für mich ist das leider kein Kinderkram. ich tue mich da sehr schwer. naja, also ich habe mir gedacht, ich habe ja zwei Felder, also brauche ich auch zwei Grenzen. ich denke mal, ich kann mir die Grenzen selber aussuchen? es ist ja nichts angegeben. sagen wir mal, die erste Grenze liegt bei fünf und die zweite bei acht. dann sieht der Anfang folgendermaßen aus:

    Quellcode

    1. program felder (input, output);
    2. const
    3. ersteGrenze = 5;
    4. zweiteGrenze = 8;
    5. grenze = 13;
    6. {ersteGrenze+zweiteGrenze}
    7. ersteGrenzeplus1 = 6;
    8. zweiteGrenzeplus1 = 9;
    9. grenzeplus1 = 14;
    10. type
    11. tIndex1 = 1..ersteGrenze;
    12. tIndex2 = 1..zweiteGrenze;
    13. tIndex = 1..grenze;
    14. tIndex1plus1 = 1..ersteGrenzeplus1;
    15. tIndex2plus1 =1..zweiteGrenzeplus1;
    16. tIndexplus1 = 1..grenzeplus1;
    17. tFeld1 = array [tIndex1] of integer;
    18. tFeld2 = array [tIndex2] of integer;
    19. tFeld = array [tIndex] of integer;
    20. var
    21. Feld1 : tFeld1;
    22. Feld2 : tFeld2;
    23. Feld : tFeld;
    Alles anzeigen


    ist das soweit vollständig und richtig?

    jetzt würde ich dann mit begin weiter machen? dabei würde ich die for-Schleife eisetzen?
  • Ja ich würde jetzt anfangen, d0nuts Code umzusetzen. Ein paar Probleme gib es noch bei deiner Variablendeklaration, die Arraygrößen sind als Konstante angegeben, du weißt ja aber nicht wieviele Zahlen angegeben werden. Das kannst du aber auch hinterher ändern. Es werden dann wahrscheinlich die meisten Konstanten und Typen, aber das würde ich zum Schluss machen, weil du es jetzt ja schon gemacht hast und sichs so übersichtlicher programmieren lässt.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • hmm.. wo ic gerade überlege, wäre es nicht besser, wenn ich noch die variablendeklaration flgendermaßen erweitern würde, bevor ich mit begin angange?

    var
    Feld1 : tFeld1;
    Feld2 : tFeld2;
    Feld : tFeld;
    i : tIndex1Plus1;
    j : tIndex2Plus1;
    k : tIndexPlus1;
    l : tIndex1;
    m : tIndex2;
    n : tIndex;
    ????

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von ozlemmm ()

  • hmm ok,
    dann fange ich also direkt mit begin an. hmmm... ich bin mir SEEEHR unsicher! ist das richtig, dass ich die for-Schleife anwenden muss?
    ich fang einfach mal an:

    begin
    writeln (ersteGrenze: 2, 'gib die werte des ersten feldes sortiert ein: ')
    for i := 1 to ersteGrenze do
    readln (Feld1);
    writeln (zweiteGrenze: 2, 'gib die werte des zweiten feldes sortiert ein: ')
    for j := 1 to zweiteGrenze do
    readln (Feld2[j]);

    ???? ?( ist bestimmt falsch oder? :( ich komme auch nicht mehr weiter :wacko:
  • ?( :( ich tippe das mal hier ab, wie ich das jetzt gemacht habe! leider tut sich da nichts. ich wäre sehr dankbar, wenn mir jemand meine fehler sagen würde.

    Quellcode

    1. program felder (input, output);
    2. const
    3. ersteGrenze = 5;
    4. zweiteGrenze = 8;
    5. grenze = 13;
    6. {ersteGrenze+zweiteGrenze}
    7. ersteGrenzeplus1 = 6;
    8. zweiteGrenzeplus1 = 9;
    9. grenzeplus1 = 14;
    10. type
    11. tIndex1 = 1..ersteGrenze;
    12. tIndex2 = 1..zweiteGrenze;
    13. tIndex = 1..grenze;
    14. tIndex1plus1 = 1..ersteGrenzeplus1;
    15. tIndex2plus1 =1..zweiteGrenzeplus1;
    16. tIndexplus1 = 1..grenzeplus1;
    17. tFeld1 = array [tIndex1] of integer;
    18. tFeld2 = array [tIndex2] of integer;
    19. tFeld = array [tIndex] of integer;
    20. var
    21. Feld1 : tFeld1;
    22. Feld2 : tFeld2;
    23. Feld : tFeld;
    24. i : tIndex1Plus1;
    25. j : tIndex2Plus1;
    26. k : tIndexPlus1;
    27. begin
    28. writeln (ersteGrenze: 2, 'gib die werte des ersten feldes sortiert ein: ')
    29. for i := 1 to ersteGrenze do
    30. readln (Feld1[i]);
    31. writeln (zweiteGrenze: 2, 'gib die werte des zweiten feldes sortiert ein: ')
    32. for j := 1 to zweiteGrenze do
    33. readln (Feld2[j]);
    34. begin
    35. for k := 1 to GRENZE do
    36. begin
    37. if Feld1[i]<=Feld2[j]
    38. then
    39. begin
    40. Feld[k]:=Feld1[i];
    41. i := i+ 1
    42. end
    43. else
    44. begin
    45. Feld[k] := Feld2[j];
    46. j := j+ 1
    47. end
    48. end;
    49. end.
    Alles anzeigen


    das programm compiliert zwar erfolgreich, doch im dos-fenster erscheint dann nur 5 werte des ersten feldes eingeben: wenn ich dies tue und auf enter drücke, tut sich da nichts mehr, der bildschirmcursor geht im dos-fenster in die nächste reihe.
  • Also ich hab dir mal ein Gerüst gebastelt mit der du deine Array-Felder einlesen kannst:
    Achso du solltest idealerweise Delphi verwenden oder zumindest TurboPascal ab Version 6.

    Quellcode

    1. type TFeld = Array of Integer;
    2. function isInt(s: String): Boolean;
    3. var i: Integer;
    4. begin
    5. isInt:=true;
    6. for i := 1 to Length(s) do
    7. if (not (s[i] in ['0'..'9'])) then
    8. isInt:=false;
    9. end;
    10. function GetFeld(): TFeld;
    11. var eingabe: String;
    12. a: TFeld;
    13. begin
    14. repeat
    15. write(' Bitte geben sie eine Zahl ein oder x zum abbrechen: ');
    16. readln(eingabe);
    17. if (isInt(eingabe)) then
    18. begin
    19. SetLength(a,Length(a)+1);
    20. a[length(a)-1]:=StrToInt(eingabe);
    21. end;
    22. until (LowerCase(eingabe) = 'x');
    23. GetFeld:=a;
    24. end;
    25. var
    26. feld1, feld2, feld: TFeld;
    27. begin
    28. Writeln('Feld 1:');
    29. feld1:=GetFeld;
    30. Writeln('Feld 2:');
    31. feld2:=GetFeld;
    32. //sortieren & ausgeben
    33. end.
    Alles anzeigen
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • Die Funktion soll prüfen ob der String eine reine Integer Zahl ist*. Dazu mache ich folgendes:

    Als erstes gehe ich einfach davon aus, es liegt eine Integerzahl vor (deswegen isInt:=true; in Zeile 6)
    Danach gehe ich Zeichen für Zeichen durch und gucke obs eine Zahl ist.
    Wenn nicht, ändere ich das Funktionsergebnis auf false (Zeile 9), andernfalls mache ich nix.
    Wenn also zum Schluss true rauskommt, dann nur weil ichs am Anfang gesetzt hab und nichts gefunden habe, was dagegen spricht.


    *Es werden momentan nur positive Zahlen akzeptiert.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • tut mir leid, wenn ich euch damit nerve, aber ich habs FAST raus! brauche nur noch eine winzig kleine hilfe von euch. ich habe das programm jetzt vollständig geschrieben! die compilierung läuft erfolgreich ab. nur ist da ein fehler, wenn das ergebnisfeld angezeigt wird. und zwar, wenn ich da die zahlen 1,2,3,4,5 für feld 1 und 5,6,7,8,9,10,11,12 für feld2 eingebe, bekomme ich als ergebnis 0 0 0 0 0 0 0 0 0 0 0 5 12
    es handelt sich doch bestimmt um einen kleinen fehler oder? danke im voraus!

    Quellcode

    1. program felder (input, output);
    2. const
    3. ersteGrenze = 5;
    4. zweiteGrenze = 8;
    5. grenze = 13;
    6. {ersteGrenze+zweiteGrenze}
    7. ersteGrenzeplus1 = 6;
    8. zweiteGrenzeplus1 = 9;
    9. grenzeplus1 = 14;
    10. type
    11. tIndex1 = 1..ersteGrenze;
    12. tIndex2 = 1..zweiteGrenze;
    13. tIndex = 1..grenze;
    14. tIndex1plus1 = 1..ersteGrenzeplus1;
    15. tIndex2plus1 =1..zweiteGrenzeplus1;
    16. tIndexplus1 = 1..grenzeplus1;
    17. tFeld1 = array [tIndex1] of integer;
    18. tFeld2 = array [tIndex2] of integer;
    19. tFeld = array [tIndex] of integer;
    20. var
    21. Feld1 : tFeld1;
    22. Feld2 : tFeld2;
    23. Feld : tFeld;
    24. i : tIndex1Plus1;
    25. j : tIndex2Plus1;
    26. k : tIndexPlus1;
    27. begin
    28. writeln (ersteGrenze: 2, 'gib die werte des ersten feldes sortiert ein: ')
    29. for i := 1 to ersteGrenze do
    30. readln (Feld1[i]);
    31. writeln (zweiteGrenze: 2, 'gib die werte des zweiten feldes sortiert ein: ')
    32. for j := 1 to zweiteGrenze do
    33. readln (Feld2[j]);
    34. repeat
    35. if (i <= Grenze1) and (j <= Grenze2) then
    36. begin
    37. if Feld1[i] <= Feld2[j] then
    38. begin
    39. Feld[i+j-1]:=Feld1[i];
    40. i:=i+1;
    41. end
    42. else
    43. begin
    44. Feld[i+j-1]:=Feld2[j];
    45. j:=j+1;
    46. end;
    47. end
    48. else
    49. if (i<=Grenze1) and (j>Grenze2) then
    50. begin
    51. Feld[i+j-1]:=Feld1[i];
    52. i:=i+1;
    53. end
    54. else
    55. if (i>Grenze1) and (j<=Grenze2) then
    56. begin
    57. Feld[i+j-1]:=Feld2[j];
    58. j:=j+1;
    59. end;
    60. until (i>Grenze1) and (j>Grenze2);
    61. writeln (' Das Ergebnisfeld ist:');
    62. for k := 1 to GRENZE do
    63. write (Feld[k]:8);
    64. writeln
    65. end.
    Alles anzeigen
  • Mit FreePascal sollte der Code funktionieren.

    Bei deinem Code steige ich nicht durch und ich gann mir auch nicht wirklich vorstellen, dass er funktioniert. Du benutzt ständig die Variablen Grenze1 und Grenze2, mir ist völlig schleierhaft wo die herkommen und was für einen Wert die haben. Die Werte von i & j sind nach einer for-Schleife undefiniert, du benutzt sie aber ständig zum Vergleich und als Index fürs Array und addierst dabei weißt du nichtmal welche Werte da drinstehen. Es handelt sich also leider nicht nur um einen kleinen Fehler, der vorherige Versuch ist glaub ich dichter dran.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]