PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe bei Turbo Pascal



Golden Chocobo
28.05.2003, 19:30
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 (http://mitglied.lycos.de/gogeta/images/other/Info-Blatt1-1.jpg)
Blatt 2 (http://mitglied.lycos.de/gogeta/images/other/Info-Blatt2-2.jpg)

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

Mithrandir Moon
28.05.2003, 23:10
Ich werds meinem Vater mal vorhalten, versprechen kann ich aber nix :)

White Lord
29.05.2003, 00:18
Die Antworten wären interessant.
Aber vorerst sollte man doch irgendwie die Fragen verstehen.
:confused: :confused: :confused:

(Wer denkt sich soetwas aus)

Malakai
29.05.2003, 06:58
ich probier mich am wochenende mal dran ;)
(hab ja auch TP in Informatik ^^)

mal schaun...

White Lord
29.05.2003, 16:17
²Malakai

Ich hoffe du hast ein besseren Lehrer als ich :D

Ineluki
30.05.2003, 05:38
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



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


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 ...



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



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



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



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

Golden Chocobo
01.06.2003, 16:50
Oh, danke schön. Ich werde mich nachher mal ran setzen und es ausprobieren.

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

White Lord
04.06.2003, 02:18
²Ineluki

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

Ineluki
04.06.2003, 04:31
Alle texte sind NICHT getestet und frei aus dem gedaechtnis geschrieben
Doch ... alles frei ins forum geschrieben ... sind doch kinderleicht solche problemchen :D

White Lord
04.06.2003, 20:31
@Ineluki

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

Ineluki
05.06.2003, 05:46
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 :D

Gruss Ineluki

White Lord
07.06.2003, 21:07
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 :D

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

Ineluki
08.06.2003, 00:37
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 ^^

White Lord
10.06.2003, 20:55
ich peogrammiere immerhin schon ueber ne dekade ^^

Jetzt verstehe ich wenigsten woher du dein Wissen hast :eek:


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 :\