Prozeduren mit anderen Variablen wiederholen (in Pascal)

Alle Arten von Programmen und Anwendungen: Egal ob Betriebssysteme, Systemtools, Grafikbearbeitung, Musikeditoren oder Textverarbeitung. Hier wird über alles gesprochen.
Daddy-Dennis
Very Good Newbie
Very Good Newbie

 
Beiträge: 40
Registriert: 16.09.2004
Di 21. Sep 2004, 23:56 - Beitrag #1

Prozeduren mit anderen Variablen wiederholen in PASCAL

HI, also ich würde gerne eine Prozedur wie diese

$this->bbcode_second_pass_code('', '
Procedure Eingabe;
Begin
clrscr;
WRITELN('Willkommen bei teiler_daheim von Dawid Golebiewski (alle Rechte vorbehalten)');
z:=0;
teiler:=0;
WRITELN;
writeln('Gib den Zaehler ein!');
readln(z);
writeln('Gib den Nenner ein!');
ReadLn(n);
writeln('Wollen sie nen zweeten Bruch eingebbn? j/n ');
readln(wille2);
{IF wille2='j' THEN}


IF z=0 THEN WRITELN('Bitte gescheite Zahlen eingeben!');
IF z=0 THEN HALT(0);
IF n=0 THEN WRITELN('Bitte gescheite Zahlen eingeben!');
IF n=0 THEN HALT(0);
End;

')

gerne nochmal aufrufen (wenn wille2 = j), nur das die Abfrageergebnisse in die Variablen z2 und n2 geschrieben werden sollen, statt z und n!

Wünschenswert wäre auch eine änderung des Textes in Zähler2 o.ä. muss aber net.


Also ich dachte mir ich ruf diese Prozedur noch in der IF-THEN zeile auf , und zwar so:

IF wille2='j' THEN Eingabe (z2,n2);

Nur _wie_ muss ich das schreiben, um den gewünschten Effekt zu erzielen? Bei meinem, öh, TP for windows 1.5 ( gibts auch nen neueren?) funz die help nich.

blobbfish
Listenkandidat
Lebende Legende

Benutzeravatar
 
Beiträge: 3022
Registriert: 26.01.2003
Mi 22. Sep 2004, 12:08 - Beitrag #2

Hast du ahnung von Arrays? Die wären jetzt äußerst hilfreich. Dann packst du das einfach in eine Schleife und feddich.

Daddy-Dennis
Very Good Newbie
Very Good Newbie

 
Beiträge: 40
Registriert: 16.09.2004
Mi 22. Sep 2004, 15:43 - Beitrag #3

aah, arrays... KP

Ich hab diverse Lektüre, ich sollte die doch besser mal zuende lesen...aber alles steht da nicht drin!
Mal sauen!

blobbfish
Listenkandidat
Lebende Legende

Benutzeravatar
 
Beiträge: 3022
Registriert: 26.01.2003
Mi 22. Sep 2004, 16:02 - Beitrag #4

Jo, Lektüre ist das erste was man tun sollte. Wenn man dann fertig ist, selber drüber nachdenken, wenn es nicht geht und dann mal wen fragen.

Was hast du denn für Lektüre? Es gibt ja massig Online--tuts für Pascal da wird so ziemlich alles wichtige erklärt.

MagicMagor
Junior Member
Junior Member

 
Beiträge: 72
Registriert: 23.02.2003
Mi 22. Sep 2004, 16:18 - Beitrag #5

So mal sehen.. es geht nur darum mehrere Brüche einzugeben?
Ich hab nicht wirklich viel Ahnung von TP, aber so in etwa könnte es aussehen:

$this->bbcode_second_pass_code('', '
type
TBruch = record
zaehler, nenner: integer;
wert: single;
end;

Var
Daten: array of TBruch;

begin
.
.
.
procedure AddBruch(x, y: integer;);
var L: integer;
begin
If y = 0 then
begin
WriteLN('Was richtiges eingeben bitte')
exit;
end;
L:=Length(Daten);
SetLength(Daten,L+1);
Daten[L].zaehler:=x;
Daten[L].nenner:=y;
Daten[L].Wert:=(x/y);
end;

procedure Eingabe;
var z, n: integer;
begin
repeat
clrscr;
Writeln('Hier dein Text');
readln(z);
readln(n);
AddBruch(z,n);
WriteLN('Noch einen Bruch? j/n');
readln(eingabe);
until eingabe = 'n';
end;')
Da ich nicht viel Ahnung von TP habe, weiß ich nicht inwieweit dynamisches Arrays (und damit die Befehle Length() und SetLength() unterstützt werden..), auch sonst ist es möglich, daß zB die Typdeklaration von records anders aussieht. Auch die vorherige Deklaration von Variablen (hier mit VAR geschehen) ist vielleicht unter TP nicht nötig.

Edit: Die schleife vergessen =)

Daddy-Dennis
Very Good Newbie
Very Good Newbie

 
Beiträge: 40
Registriert: 16.09.2004
Mi 22. Sep 2004, 16:52 - Beitrag #6

Ja ich nehm Onlinelektüre.

Aber eins frag ich mich, wie mir denn Arrays helfen sollen?

Ich muss ja aus meinem ersten bruch , der aus zähler un nenner besteht, den ggt und und kgv berechnen.

Anstatt das ewig weiterzuführen, will ich die prozedur für den ggt so ausführen , dass diesmal aus de, nenner und zähler des anderen bruches der ggt errechnet wird!

Eine function wäre wohl am einfachsten (oder?) , da müsste ich nur 2mal separat die werte überlifern.

Dann steh ich aber vor dem Problem, dass dann die variable ggT überschrieben wird! Bei ner Prozedur könnte ich hingegen noch schnell ein

Beliebige_variable := ggT

die Beliebige_variable bekommt dann den Wert des ersten ggT zugewiesen. Aber wie schreib ich denn, dass die Prozedur die anderen Zahlen nehmen soll?

Also statt z und n sollte er z2 und n2 nehmen!!!

Hier die Proz:

$this->bbcode_second_pass_code('', '
Procedure gT;
Begin
ggT:=1;
a:=z;
b:=n;
IF z=0 THEN ggT:=n ELSE
IF n=0 THEN ggT:=z;
IF (z MOD N)=0 THEN ggT:=n;

while b<>0 do
begin
rest:=a mod b;
a:=b;
b:=rest;

ggT:=a;
End;
')

Irgendwie ne Möglichkeit , ne Prozedur so zu schreiben:

(ggT ist global definiert)

Procedure gt(wert1,wert2: WORD);
VAR a,b,rest: WORD;
Begin

ggT:=1;
a:=wert1;
b:=wert2;
IF wert1=0 THEN ggT:=wert2 ELSE
IF wert2=0 THEN ggT:=wert1;
IF (z MOD N)=0 THEN ggT:=n;

while b<>0 do
Begin
rest:=a mod b;
a:=b;
b:=rest;

ggT:=a;

ENd;


Kan´n ich in der Prozedur nicht mit IF irgendwie eine anweisung einfügen, die ihn dazu bringt die Prozedur von vorne mit anderen Ausgangswerten zu beginnen??

MagicMagor
Junior Member
Junior Member

 
Beiträge: 72
Registriert: 23.02.2003
Mi 22. Sep 2004, 17:17 - Beitrag #7

Was du machen kannst, ist die Prozedur sich selbst nochmal aufrufen lassen.

Alle lokalen Variablen, die direkt unter dem Prozedurkopf deklariert werden, sind lokal für diesen einen Prozeduraufruf. Wenn die Prozedur ein zweites Mal aufgerufen wird, hat diese eigene lokale Variablen, die nicht in Konflikt kommen mit denen des ersten Prozeduraufruf. (Hoffe das war verständlich *g*)

Oder vielleicht besser ein Beispiel.
Ich mache das jetzt mal mit ner Funktion, weil es dann am meisten Sinn macht.

$this->bbcode_second_pass_code('', '
function Fak(x:integer):integer;
begin
If x=1 then
result:=1;
If x > 1 then
result:=x*Fak(x-1);
end;
')
Das müßte ne Funktion zum Berechnen der Fakultät sein..
Beim erneuten Aufrufen von Fak() wird neuer Speicher reserviert. Das x, mit dem ich die Funktion am Anfang starte (zB 5) wird nicht verringert, sondern mit der Fakultät seiner Vorgängerzahl multipliziert. Das ganze ist eine rekursive Funktion, weil die Funktion sich immer wieder selber aufruft, dabei immer einen Schritt zurück geht (x-1) bis die Abruchsbedingung (hier x=1) erreicht ist. Auf Delphi-source.de gibts da nen gutes Tutorial zu.

Generell würde ich dir empfehlen erstmal die Grundlagen per Online-lektüre oder sonst was zu lernen, viele Fragen kann man sich dann nämlich selber beantworten.

Daddy-Dennis
Very Good Newbie
Very Good Newbie

 
Beiträge: 40
Registriert: 16.09.2004
Mi 22. Sep 2004, 19:00 - Beitrag #8

Ich hab die Grundlagen ja alle intus.

Ich will halt möglichst optimal coden, alle Probleme könnte ich mit ewig vielen Codezeilen auch erledigen, aber das ist ja nicht Sinn der Sache.

Und nein, meine Frage wurde net so janz beantwortet.

Also angenommen ich hätte meine gt prozedur in eine funktion umgewandelt.

Ein Funktion würde ich dann mit (nennen wir die funktion gt_funk)


{Hauptproq}
Begin
eingabe;
gt_funk(z,n);
End.

aufrufen.
Aber die Funktion dazu bringen, andere eigangswerte zu nehmen, gehen wie?

Ich kann die Funktion zwar im hauptproq nochmal aufrufen, aber dann gibt sie ja wieder die variable gt_funk zurück, und nicht wie gewünscht eine zweite!

OMG@m3

MagicMagor
Junior Member
Junior Member

 
Beiträge: 72
Registriert: 23.02.2003
Mi 22. Sep 2004, 19:48 - Beitrag #9

Ich verstehe das Problem nicht so ganz.

$this->bbcode_second_pass_code('', '
a:=gt_funk(1,2);
b:=gt_funk(2,3);
')

Wo ist das Problem?

Daddy-Dennis
Very Good Newbie
Very Good Newbie

 
Beiträge: 40
Registriert: 16.09.2004
Mi 22. Sep 2004, 21:12 - Beitrag #10

hrrr, ich sollte wohl doch besser den compiler wechseln.

So lüppts net , aber vllt. mit dem 7.0 .

vogt31337
Junior Member
Junior Member

 
Beiträge: 69
Registriert: 25.06.2003
Mi 22. Sep 2004, 21:34 - Beitrag #11

@Daddy-Dennis,

wenn du *optimal* coden willst solltest du eine funktion nehmen und werte übergeben. Dann brauchst du keine Arrays, sondern nur lokale variablen. Du übergibst Werte und erhälst welche zurück.

Das is soweit ich das kenne die sauberste Art und weise zu programmieren.

Alles andere halte ich für fusch.
Aber sei gewarnt, Pascal hat ein Problem mit selbstdefinierten Variablen. Es lann solche nicht zurückliefern! Ka warum, delphi kanns aber auch nicht wirklich.

Bei sowas hilft nur eine globale Variable(record), was aber nicht die feine englische Art ist.

Ich denke du hast die Grundlagen alle intus...

$this->bbcode_second_pass_code('', '
function schlagmichtot(erstevariable : integer; zweitevariable : string): real;
var irgendeinelokale: integer;
begin
....
end;
')

so sieht in etwa der Prototyp für Werte Übergabe und Rückgabe aus.

@Magic-Magor,
die Fak funktion geht aber nur mit ganzen Zahlen. Ansonsten musst du mal im Matheduden nachschlagen, da gibts eine definition, die sich verwenden lässt um die Hochzahlen zu berechnen (irgendwas mit e hoch irgendeinenm ln).

MfG

Daddy-Dennis
Very Good Newbie
Very Good Newbie

 
Beiträge: 40
Registriert: 16.09.2004
Mi 22. Sep 2004, 22:26 - Beitrag #12

edit


Zurück zu Software

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste

cron