Autor Beitrag
R3d0x
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Fr 17.02.06 10:48 
Hey

Ich habe mal eine Frage.Bin gerade dabei einen Rchner zu programmieren,der aber "dynamisch" ist.Das heißt,er sol lauch 10^100 Zahlen berechnen können,ohne irgendwie an byte,interger oder cardinal gebunden zu sein.
Hab erstmal eine mir paar Zahlen generieren lassen,die erstmal nur vierstellig sind,wenn es mit dneen geht,wirds ja auch mit großen Zahlen klappen.

Mein Problem ist folgendes.Hab jetzt in zwei Listen diese Elemente:

Liste1: 1 --> 0 --> 8 --> 2 ,also die Zahl 1082 ( oder 2801,hängt davon ab wie man es ließt,was jetzt egal ist)

Liste2: 3 --> 6 --> 3 --> 1 ,also die Zahl 3631 ( oder 1363,hängt davon ab wie man es ließt,was jetzt egal ist)

Jezt will ich die Zahlen addieren.das Problem ist bei mir jetzt bei den Zehnern, den 8+3 ist größer 10,also muss die 1 bleiben und die 1 rüber zur 6+0,also zu den hunderten.ICh will später von hinten lesen lassen.Ist jetzt egal obs zu den Zehnrn oder einsen rüber geht,ich weiß nur nicht wie ich es mache,dass er die 1 rüberschiebt.

Meine addierfunktion ist folgende:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.BtnAusrechnenClick(Sender: TObject);
var ziffer1,ziffer2:word ;
     zahl:byte ;
begin
resetlist(liste1);
resetlist(liste1);
zahl:=0;
while not endlist(liste1) and (not endlist(liste2))do
begin
readlist(liste1,ziffer1);
readlist(liste2,ziffer2);
zahl:=ziffer1+ziffer2;
if zahl > 10 then
begin
zahl:=ziffer1+ziffer2-10;
end ;
advancelist(liste1);
advancelist(liste2);
edergebnis.text:=edergebnis.text + inttostr(zahl);
end;
end;


--------

Wenn ich es also ausrechne,kommt bei mir dass ergebnis 4613,obwohl es 4713 oder 4614 sein müsste,hängt davon ab wo man die "1" rüberschiebt.
Ich hoffe ich konnte mein Problem erklären,und das ihr mir helfen könnt.Wenn irgendwie Fragen sind was ich überhaupt will,fragt nach,ich helfe gerne damit mir geholfen werden kann :)
Vielen Dank schon mal

mfg R3d0x

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt
Spaceguide
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 552


(D3/D7/D8) Prof.
BeitragVerfasst: Fr 17.02.06 11:37 
So in der Art:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.BtnAusrechnenClick(Sender: TObject);
var ziffer1,ziffer2:word ;
    zahl,merker :byte;
begin
resetlist(liste1);
resetlist(liste1);
zahl:=0; merker := 0;
while not endlist(liste1) and (not endlist(liste2))do
begin
readlist(liste1,ziffer1);
readlist(liste2,ziffer2);
zahl:=ziffer1+ziffer2+merker;
if zahl > 10 then
begin
zahl:=ziffer1+ziffer2-10;
merker := 1;
end else merker := 0;
advancelist(liste1);
advancelist(liste2);
edergebnis.text:=edergebnis.text + inttostr(zahl);
end;
end;
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Fr 17.02.06 11:41 
Hallo,

Du musst Dir schon den Uebertrag merken.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
procedure TForm1.BtnAusrechnenClick(Sender: TObject);   
var ziffer1,ziffer2:word ;   
     zahl:byte ;   
begin   
resetlist(liste1);   
resetlist(liste1);   
//zahl:=0; braucht nicht    
uebertrag := 0;
while not endlist(liste1) and (not endlist(liste2))do   
  begin   
  readlist(liste1,ziffer1);   
  readlist(liste2,ziffer2);   
  zahl:=ziffer1+ziffer2+Uebertrag;   
  //......>=........
  if zahl >= 10 then   
    begin
    zahl:=Zahl-10;//zahl ist schon ziffer1+ziffer2;   
    uebertrag := 1;
    end
  else 
    uebertrag := 0;
  advancelist(liste1);   
  advancelist(liste2);   
  edergebnis.text:=edergebnis.text + inttostr(zahl);   
  end;
If Uebertrag = 1 then 
  edergebnis.text:=edergebnis.text + '1';

Uups, Spaceguide war schneller aber trotzdem heisst es '>= 10' :-)

Gruss Horst
R3d0x Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Fr 17.02.06 11:58 
vielen dank für die hilfe.das mit dem übertrag hatte ich auch shcon mal versucht,aber das problem bleibt,denn wenn ich zb 4560 1621 addiere kann ich nciht einfach "ergebnis" + 1 machen,denn die 1 soll ja nicht zu den einsern,sondern zu den hunderten zb
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Fr 17.02.06 12:15 
Hallo,

wo hakt es, was ist daran falsch?
Die '1' wird doch nur im Abschluss addiert,also nach der while Schleife, falls ein Uebertrag bleibt.
Z.B.:
9999
1000 //1 rueckwaerts
00001 //10000 rueckwaerts

Gruss Horst
Spaceguide
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 552


(D3/D7/D8) Prof.
BeitragVerfasst: Fr 17.02.06 12:18 
Horst, ich würde garnicht versuchen, den Code zu debuggen, das while-Schleifen-Argument ist auch falsch.
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Fr 17.02.06 12:23 
Hallo,

Du hast ja recht BigInt units gibt es wie Sand am Meer.
Aber die Verstaendisfragen sollte man klaeren.
Die kommen sicher noch.

Gruss Horst
R3d0x Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Fr 17.02.06 23:26 
ich glaube,ich kann euch nicht ganz folgen,versthe bestimt was nicht.
aber ich meine, wenn ich zu 1095 + 10 mache,will ich 1105 haben, die +1 kommt nicht ans ende,sondern "in der mitte"
R3d0x Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Sa 18.02.06 09:10 
nur mal kurz als beispiel.addieren unterm strich


1789
+ 1321
------
2110

also musste der übertrag zuerst von den einsern zu den zehnern,dann von den zehnern zu den hunderten und von den hunderten zu tausendern.
ich kann ja dann nicht einfach if ..... ergebnis+1 machen
und noch ne frage,wie kann ich subtrahieren,irgendie funktioniert meine procedure nicht.hab die genau so versucht wie addieren,nur eben ziffer1-ziffer2.
sry,jetzt sinds schon zwei fragen

mfg R3d0x
R3d0x Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: So 19.02.06 09:33 
morgen

weiß jetzt vielleicht einer wie ich den übertrag b eim addieren richtig mache?
oder wie man subtrahieren richtig macht?
die zwei sachen hätte ich grade.versuche später es nochmal selber zu schaffen
R3d0x Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: So 19.02.06 19:27 
ich kann leider ohne zu wissen wie man den übertrag macht,nicht das subtrahieren programmieren.deshalb hoffe ich noch,jemand kann mir helfen

mfg R3d0x
Allesquarks
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: So 19.02.06 19:43 
Abgesehen davon, dass man das in der dritten Klasse lernt ist der Übertrag bei der Addition zweier Zahlen immer maximal 1, dass heißt du kannst das in nen boolean packen und diesen dann in jedem Schritt hinzuaddieren.

Psedocode:

neuziffer:=zahl1[i]+zahl2[i]+ord(uebertrag);
if neuziffer>9 then begin
result[i]:=neuziffer-10;
uebertrag:=true;
else begin
result[i]:=neuziffer;
uebertrag:=false;
end;
R3d0x Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: So 19.02.06 21:01 
vielen dank,hab jetzt doch verstanden was ihr schon gestern gemeint habt.
meine frage wäre folgende:

wie erreiche ich,dass er nicht vorne leißt,sondern hinten anfängt,so wie man es beim addieren in der dritten klasse gelernt hat :)
mit irgendeiner schleife oder so,bin mir aber nicht sicher wie genau.irgendwie mit hilfe einer variable in der dann die listenelmente sind,aber zb 4-1 oder so.

wenn ich richtig liege,kann ich danach ans subtrahieren ran,ohne "rückwärts" gehts nicht beim subtrahieren
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: So 19.02.06 21:12 
user profile iconR3d0x hat folgendes geschrieben:
wie erreiche ich,dass er nicht vorne leißt,sondern hinten anfängt,so wie man es beim addieren in der dritten klasse gelernt hat :)
mit irgendeinerschleife oder so


ausblenden Delphi-Quelltext
1:
2:
3:
4:
begin
 for a downto b do 
 ...
end;
:roll:
R3d0x Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: So 19.02.06 21:23 
ok,beim schreiben kommt man am besten auf die lösung :)

ich habe jetzt durch eine funktion die anzahl der lemte rausgelesen und in result abgespeichert.
nehmen wir an,es sind 4 elemente.
wie müsste die schleife sein?
result downto 1 ?
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: So 19.02.06 21:30 
genau
ich hatte mich vorhin übrigens vertippt: es sollte lauten:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
begin
 for a := result downto 1 do // result > 1
 ...
end;


diese schleife nützt dir aber auch nur etwas, wenn du die loop-variable "a" nutzt :P
R3d0x Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: So 19.02.06 21:45 
ehrlich gesagt ( habt ihr bestimmt nie im leben vermutet ^^ ),weiß ich nciht genau,wie ich es in meine procedure reinbringe

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
procedure TForm1.BtnAusrechnenClick(Sender: TObject);
var ziffer1,ziffer2:word ;
     zahl,uebertrag:byte ;
begin

anzahlElementeListe(summand1); // in result
anzahlElementeListe(summand2);
resetlist(summand1);
resetlist(summand2);
uebertrag := 0;
while not endlist(summand1) and (not endlist(summand2))do
  begin
  readlist(summand1,ziffer1);
  readlist(summand2,ziffer2);
  zahl:=ziffer1+ziffer2+uebertrag;

  if zahl >= 10 then
    begin
    zahl:=Zahl-10;
    uebertrag := 1;
    end
  else
    uebertrag := 0;
  advancelist(summand1);
  advancelist(summand2);
  edergebnis.text:=edergebnis.text + inttostr(zahl);
  end;
If Uebertrag = 1 then
  edergebnis.text:=edergebnis.text + '1';

 end;


sry,bin doof :)

Moderiert von user profile iconUGrohne: Delphi-Tags hinzugefügt.