Ergebnis 1 bis 14 von 14

Thema: Hilfe bei Turbo Pascal

  1. #1

    Hilfe bei Turbo Pascal

    Hallo, ich schreibe hier mal für einen Freund:

    Er hat übelst die Problem in Informatik, 11 Klasse. Ich habe es auch schon probiert, komme allerdings auch nicht klar um ihn zu helfen. Es sind vier Aufgaben, die er schreiben muß und er such jemanden, der ihn dabei hilft (es macht).
    Hier sind die Programme: Blatt 1
    Blatt 2

    Er wäre für jede Hilfe dankbar. Ich auch

  2. #2
    Ich werds meinem Vater mal vorhalten, versprechen kann ich aber nix

  3. #3
    Die Antworten wären interessant.
    Aber vorerst sollte man doch irgendwie die Fragen verstehen.


    (Wer denkt sich soetwas aus)

  4. #4
    ich probier mich am wochenende mal dran
    (hab ja auch TP in Informatik ^^)

    mal schaun...

  5. #5
    ²Malakai

    Ich hoffe du hast ein besseren Lehrer als ich

  6. #6
    Aloa

    Die aufgaben sind alle recht einfach und zudem noch sehr interessnt ..

    ich reisse mal hier die loesungen kurz an

    Aufgabe 7_1

    Das kgv von a und b ist die kleinste zahl, die sowohl a als auch b als teiler hat .. daher koennte man folgendermassen vorgehen

    Code:
    function kgv(a,b:integer):integer;
    var result:integer;
    begin
    result:=1;
    while ((result mod a)<>0)OR((result mod b)<>0) do inc(result);
    kgv:=result;
    end;
    Erklaehrung ... solange result bei der division durch a einen rest ungleich 0 gibt oder analog bei b, so ist die zahl nicht durch a und b teilbar ... somt erhoehen wir um 1 ... und da wir bei 1 beginnen, tasten wir uns von unten an das kgv heran

    man koennte die ganze sache beschleunigen, wenn man vorher ueberprueft, ob a oder b kleiner ist und dann statt mit 1 mit dem kleineren der beiden werte angngen lassen zu zaehlen, da ein kgv nie kleiner als a und b sein kann

    Code:
     if a < b then result:=a else result:=b;
    Aufgabe 7_2

    Hierbei liegt das Problem darin, das die zahlen so lang sind, das sie nicht mehr in ein integer passen ...

    es gibt mehere loesungen ...
    man koennte veruchen, die zahlen als real zu speichern .. aber das wird wahrscheinlich nicht ausreichen ...

    auf neueren compilern gibt es auch 64 bit integer typen .. aber die unterstuetzt TP noch nicht ...

    die sicherste moegliechkeit ist, die zahlen als strings zu speichern und die bereechnungen selber zu uebernehmen ...

    dazu verwendet man am besten die regeln fuer die schriftliche addition / subtraktion / multiplikation, die dir ja gelaeufig sein sollten ...

    dann musst du den kuerzeren string mit nullen am anfang auffuellen, das beide die selbe laenge haben

    und dann liest du die strings von rechts nach links aus und betrachtest die einzelnen zeichen als ziffern (val und str helfen hier sicherlich oder du rechnest per ord und chr um)

    das ganze packst du in eine forschleife ...

    Code:
    function c2b(c:char):byte;
    begin
    c2b:=ord(c)-ord('0');
    end; 
    
    function b2c(b:byte):char;
    begin
    b2c:=chr(b+ord('0'));
    end;
    
    function add(zahl1,zahl2:string):string;
    var addstring:string;
        temp,i,rest:byte;
    begin
    {zahl1 = lange zahl  zahl 2 = kurze zahl, aufgefuellt mit beginnenden Nullen }
    
    addstring:='';
    rest:=0;
    for i:=length(zahl1) downto 1 do
    begin
    temp:=c2b(zahl1[i])+c2b(zahl2[i])+rest;
    if temp>10 then begin 
                     rest:=1;
                     temp:=temp-10;
                    end
    else rest:=0;
    addstring:=b2c(temp)+addstring;
    end;
    if rest<>0 then addstring:=b2c(rest)+addstring;
    add:=addstring;
    end;
    das ganze machst du analog fuer die subtraktion und die multiplikation .. wobei die multiplikation etwas kniffliger wrden koennte und du vielleicht zum zwischenspeichern der strings eine textdatei verwenden solltest

    Aufgabe 7_3

    diese aufgabe besteht aus zwei teilabschnitten .. a) dem ermitteln der teiler (wieder mit mod) und dere aufsummieren und vergleichen mit der zahl selber ...

    das ganze sieht dann so aus

    Code:
    var perfekt,zahl,i,summe:integer;
    begin
    perfekt:=0;
    zahl:=6; {wir fangen mit 7 an, da es sonst zu trivial wird 1 waere perfekt und 6 waere perfekt .. aber die sind nicht gesucht}
    repeat
    inc(zahl); {daher 7}
    summe:=0;
    for i:=1 to zahl-1 do 
    if (zahl mod i)=0 then summe:=summe+i;
    {alle teiler aufsummiert, jetzt testen ob summe = zahl}
    if summe = zahl then
    begin
    inc(perfekt);
    writeln(perfekt,'. perfekte Zahl: ',zahl);
    end;
    until perfekt>=4;
    end.
    Aufgabe 7_4

    Der trick der verkuerzung ist folgender:
    1) Da jede gerade zahl durch 2 teilbar ist, kann sie keine primzahl sein.
    2) Da eine Primzahl nur durch 1 und sich selbst teilbar ist kommen nur die zahlen, die kleiner als die wurzel der zahl sind als teiler in frage, da wenn der teiler groesser als die wurzel waere, er als zweiten faktor eine zahl brauchte, die kleiner als die wurzel ist

    daher ergibt sich folgende aenderung:

    die zeile pz:=TRUE; aendern wir in pz:=Odd(zahl) or (zahl=2);
    damit wird erst gar nicht nach teilern gesucht, wenn die zahl gerade ist

    zudem koennen wir eine weitere beschleunogung vornehmen, indem wir die zeile inc(probenteiler) in inc(probenteiler,2) umaendern .. da eine ungerade zahl nie eine gerade zahl als teiler haben kann, muessen wir nur auf ungerade zahlen als teiler testen .. und die erhaellt man, indem man zu einer ungeraden zahl (probenteiler:=1) immer 2 addiert

    um bedingung 2) zu erfuellen reicht es aus, die bedingung der repeatschleife zu aendern in

    UNTIL (Probeteiler>=sqrt(zahl)) OR not(PZ);

    damit waeren wir fertig mit der bechleunigung

    zudem hat das vorgegebene programm einen schoenheitsfehler und einen bug:

    die zeile Probeteiler:=-1; gleich an anfang hat keinerlei funktion und kann entfallen ... und 1 ist laut definition KEINE primzahl und dennoch gibt das programm bei 1 TRUE zurueck ... dies laesst sich durch eine eifache aenderung beheben :

    pz:=(odd(zahl) AND (zahl<>1)) or (zahl=2);

    die ausgabe aller primzahlen bis 10000 laesst sich in einer einfachen forschleife realisieren bzw schneller ueber eine repeat until schleife

    Code:
    i:=1;
    repeat
    i:=i+2;
    if prim(i) then write(i,'   ');
    until i>=10000;
    fuer den abstand zwischen den primzahlen zaehlt man einfach bei der ueberpruefung mit, wieoft keine primzahl seit der letzten primzahl auftauchte

    Code:
    i:=1; luecke:=0; letzte_PZ:=0;
    jenseits50:=false;
    repeat
    i:=i+2; luecke:=luecke+2;
    if prim(i) then 
     begin 
     luecke:=0;
     if jenseits50 then naechste_PZ:=i else letzte_PZ:=i;
    end;
    jenseits50:= luecke>=50 or jenseits50;
    until (jenseits50) and (luecke=0);
    writeln('Zwischen ',letzte_PZ,' und ',naechste_PZ,' stehen erstmals 50 andere Zahlen');
    So das wars .. hoffe, ich konnte dir etwas weiterhelfen ...

    Fuer Bugs, tippfehler und Richtigkeit wird wie immer keinerlei haftung uebernommen. Alle texte sind NICHT getestet und frei aus dem gefaechtnis geschrieben

    Gruss Ineluki

    Geändert von Ineluki (05.06.2003 um 05:57 Uhr)

  7. #7
    Oh, danke schön. Ich werde mich nachher mal ran setzen und es ausprobieren.

    Weitere Lösungsvorschläge sind gerne erwünscht.

  8. #8
    ²Ineluki

    Bitte sag mir nicht, dass du das aus dem Gedächtniss hast

  9. #9
    Zitat Zitat
    Alle texte sind NICHT getestet und frei aus dem gedaechtnis geschrieben
    Doch ... alles frei ins forum geschrieben ... sind doch kinderleicht solche problemchen

  10. #10
    @Ineluki

    Habe heute mal deine "Aufzeichnungen" meinem Info-Lehrer gezeigt. Er war, wenn man die Rechtschreibfehler weglässt, sehr beeindruckt.

  11. #11
    hm .. rechtschreibfehler ? ...

    naja schau auf die zeit ^^

    ich war an dem tag sehr muede .. und zudem hab ich ueber eine stunde an dem post geschrieben ... da sind wohl ein paar rechtschreibfehler erlaubt ^^

    was hat dein lehrer denn noch gesagt ? .. wuerde mich wirklich interessieren .. und ob er meinen loesungsvorschlaegen zugestimmt hat

    Gruss Ineluki

  12. #12
    Die Rechtschreibfehler seien dir verziehen

    Zu deiner Frage: Also erstmal fand er deine Aussage nett, mit dem einfach aber interessant.
    Deine Lösungsvorschläge fand er in Ordnung und richtig.
    Auch wenn ich nicht gut im Erzählen bin und es auch nicht so rüberkommt, er war wirklich begeistert.


    PS: Doch auf eins möchte ich noch hinweisen - Aufgabe 7_4 kann man noch weiter beschleunigen

    PS-2: Wie hasst du es blos geschafft so zu denken und auf die Lösungen zu kommen ?

  13. #13
    Zitat Zitat
    PS: Doch auf eins möchte ich noch hinweisen - Aufgabe 7_4 kann man noch weiter beschleunigen
    PS-2: Wie hasst du es blos geschafft so zu denken und auf die Lösungen zu kommen ?
    hm .. hatte mich im prinzip her nur auf die beschleunigung durch dieses odd und das sqrt geschraenkt .. aber wo wir schon mal dabei sind ... wie wollte ers denn beschleunigt haben ?

    und zu der anderen frage .. hm keine ahnung .. die loesungen lagen doch auf der hand ... aufgabe lesen, loesung wissen, quelltext ins forum schreiben .... da muss man nicht mal gross ueberlegen .... die aufgaben waren wirklich einfach ....

    naja .. vielleicht spielt da einwenig mathematisches verstaendnis und erfahrung mit hinein .. ich peogrammiere immerhin schon ueber ne dekade ^^

  14. #14
    Zitat Zitat
    ich peogrammiere immerhin schon ueber ne dekade ^^
    Jetzt verstehe ich wenigsten woher du dein Wissen hast

    Zitat Zitat
    wie wollte ers denn beschleunigt haben ?
    Keine Ahnung, er hat nur gesagt "Nicht schlecht, aber es geht noch besser" (macht er immer damit wir uns den Kopf zerbrechen dürfen ).

    Seit dem denke ich die ganze Zeit nach wie man dieses blöde Programm noch weiter verbessern könnte.
    Na ja, hab ja sonst nichts weiter zu tun

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •