PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Delphi: Ich versteh es einfach nicht ...


Kladderadatsch
2005-02-08, 11:27:01
hi,
in der schule haben wir ein programm vorbereitet (auf dessen lösungsweg ich niemals von selbst käme), welches die in ein memo-feld eingegebenen zahlen von klein nach groß ordnen soll und in einer listbox so wieder ausgeben sollte...

hier der code, dessen trace einen schon überfordern kann:

procedure TForm1.Button1Click(Sender: TObject);
var a: array of integer;
k,n,i,x,l: integer;
begin

l:= memo1.lines.count;
setlength (a,l);
a[i]:= strtoint (memo1.lines [l-1]);

for x:= 0 to l-2 do begin
k:= a[x]; n:= x;
for i:= x+1 to l-1 do
if a [i]<k then begin
k:= a[i];
n:= i;
end;

a[n]:= a[x];
a[x]:= k;
end;

for i:= 0 to l-1 do
listbox1.items.add (inttostr (a[i]));
end;

end.

so, aber nun zum problem: das fertige programm spuckt nurnoch nullen aus:|
(das problem hat sich, während ich diesen thread schrieb, ein paar mal verändert;))
aber wo liegt der fehler? ab der ersten schleife bis kurz vor ende, also der zahlenvergabe/tausch der ax dürfte er nicht zu finden sein- das kommt vom lehrer und auch mein trace ist korrekt:tongue:

und noch nebenbei:
werden die (delphi) programme in zukunft noch wesentlich komplexer und schwieriger? man muss doch ein halbes genie sein, alleine um einen lösungsweg zu finden, wie man zahlen der größe nach ordnet;(
oder ist das nur beim "objektorientierten programmieren" der fall?

thx


*update*
ok, a[i] hat die memo-eingabe nicht zugewiesen bekommen:redface:

wenn ich nun aber a[i]:= strtoint (memo1.lines [l-1]) hinzufüge, stürzt das programm mit der meldung "ist kein gültiger integerwert" ab...


*update*
hatt im letzten update aus versehen i statt l verwendet...
nun schauts so aus:
http://img210.exs.cx/img210/8135/neuesbild3zh.jpg

Xmas
2005-02-08, 18:20:08
und noch nebenbei:
werden die (delphi) programme in zukunft noch wesentlich komplexer und schwieriger? man muss doch ein halbes genie sein, alleine um einen lösungsweg zu finden, wie man zahlen der größe nach ordnet;(
oder ist das nur beim "objektorientierten programmieren" der fall?
Also mit der Einstellung wirst du nicht weit kommen. Das Sortieren gehört zu den absoluten Grundlagen der Programmierung, und komplex ist das nun wirklich nicht. Da kommt noch einiges dazu.


Du verwendest i uninitialisiert. Außerdem musst du auch alle Werte aus dem Memofeld in das Array übernehmen, nicht nur einen.


procedure TForm1.Button1Click(Sender: TObject);
var
a: array of integer;
k, n, i, x, l: integer;
begin
l := memo1.lines.count;
setlength(a,l);
for x := 0 to l - 1 do begin
a[x] := strtoint(memo1.lines[x])
end;

for x := 0 to l - 2 do begin
k := a[x];
n := x;
for i := x + 1 to l - 1 do begin
if a[ i] < k then begin
k := a[ i];
n := i;
end
end;
a[n] := a[x];
a[x] := k;
end;

for i := 0 to l - 1 do begin
listbox1.items.add(inttostr(a[ i]))
end;
end;


Noch ein paar Tips: Verwende immer begin und end, auch dort wo du es eigentlich weglassen könntest, weil nur eine Anweisung folgt.
Und verwende Einrückung (oder ist die beim Copy&Paste verlorengegangen?). Nach jedem begin ein Tab mehr, vor jedem end ein Tab weniger.
Schreib nicht mehrere Anweisungen in eine Zeile, und verwende Leerzeichen um Operatoren.

Kladderadatsch
2005-02-09, 21:01:02
danke:)
ich werde es gleich mal ausprobieren.

naja, unsere lehrerin ist computertechnisch selbst ein wenig überfordert und kann auch dementsprechend erklären. mir wurde erst gestern klar, was array überhaupt für einen sinn hat (erst vorletzte info stunde "gelernt").

aber ich finde es nach wie vor ziemlich schwierig, auf solche lösungswege zu kommen. vielleicht ist das ja auch etwas, was man in informatik lernt;)
oder wir gehen völlig feminin an die sache ran, ka...

del_4901
2005-02-09, 22:09:31
danke:)
ich werde es gleich mal ausprobieren.

naja, unsere lehrerin ist computertechnisch selbst ein wenig überfordert und kann auch dementsprechend erklären. mir wurde erst gestern klar, was array überhaupt für einen sinn hat (erst vorletzte info stunde "gelernt").

aber ich finde es nach wie vor ziemlich schwierig, auf solche lösungswege zu kommen. vielleicht ist das ja auch etwas, was man in informatik lernt;)
oder wir gehen völlig feminin an die sache ran, ka...

Oh das kenne ich von Frau Prof. Heiner :)

Kladderadatsch
2005-02-10, 19:08:34
so, danke nochmal. da hätte ich eigentlich auch drauf kommen müssen...


aber noch eine kleine verständnisfrage:
for i := x + 1 to l - 1 do begin
if a[i] < k then begin
k := a[i];
n := i;
end
end;
a[n] := a[x];
a[x] := k;

warum kann ich das rot-markierte n nicht beim i belassen? (das programm stürtzt ab)
oder wird der wert von i durch das end(e der schleife) gelöscht?

Trap
2005-02-10, 19:23:01
Welchen Wert hat n nach der Schleife?

i ist entweder l-1 oder l (weiß nicht auswendig wie es in Delphi geregelt ist)...

Kladderadatsch
2005-02-10, 19:25:43
Welchen Wert hat n nach der Schleife?

i ist entweder l-1 oder l (weiß nicht auswendig wie es in Delphi geregelt ist)...

:confused:

n ist so groß wie das i des ersten a [x+1 bis 4], welches kleiner als a[x], bzw. k ist...(in meinem zweiten kopierten abschnitt)
die größe von i wird pro durchlauf um eins größer, bis es die zeilenlänge des memo-feldes ereicht hat.

das beantwortet meine frage übrigens nicht;)

Trap
2005-02-10, 22:45:22
Wenn du weißt, dass beide etwas total verschiedenes enthalten, warum wunderst du dich dann, dass man das eine nicht an Stelle des anderen verwenden kann?

Wahrscheinlich ist i nach der Schleife i=l, und damit außerhalb des gültigen Bereichs des Arrays.

Grestorn
2005-02-11, 08:05:28
werden die (delphi) programme in zukunft noch wesentlich komplexer und schwieriger? man muss doch ein halbes genie sein, alleine um einen lösungsweg zu finden, wie man zahlen der größe nach ordnet;(
oder ist das nur beim "objektorientierten programmieren" der fall?
Die Probleme sollten ja schon größtenteils gelöst sein, ich wollte nur ein Missverständnis, der aus dem zitierten Absatz klar wird, richtig stellen.

Den Sortieralgorithmus, den Du da vor Dir hast, ist eine Abwandlung des Bubblesort-Algorithmus, mit der einfachste Sortieralgorithmus, den es gibt. Es gibt wesentlich effizientere, aber auch schwerer nachzuvollziehende.

Aber allen ist gemeinsam, dass es sich dabei nur um Algorithmen handelt, also programmiersprachen-unabhängige Beschreibungen einer Lösung für ein klaresm abgegrenztes Problem (hier: "Wie sortiere ich den Inhalt eines Arrays?").

Mit "objektorientiert" hat das ungefähr so viel zu tun, wie der PC-Speaker mit Surround-Sound. Man kann einen Algorithmus in jeder Programmiersprache formulieren, und braucht dabei keine Features, die zum Thema Objektorientierung gehören.

Objektorientierung (das werden ihr hoffentlich auch noch lernen) verknüpft, um es ganz kurz zu fassen, Daten mit Verhalten, und ist eine überaus praktische Sache, wenn man komplexere Programme schreiben will. Aber es gibt keinen Algorthmus, der sich nur mit einer objektorientierten Sprache lösen ließe. Im Gegenteil: Es ist beweisbar, dass jedes objektorientierte Programm auch rein Prozedural umformulieren lässt.

Kladderadatsch
2005-02-11, 13:46:42
Objektorientierung verknüpft, um es ganz kurz zu fassen, Daten mit Verhalten

wie unterscheidet sich das dann von anderen "arten"? bzw. ist das nicht generell das ziel?

(das werden ihr hoffentlich auch noch lernen)

nein, das glaube ich nicht;)

Grestorn
2005-02-11, 14:18:46
wie unterscheidet sich das dann von anderen "arten"? bzw. ist das nicht generell das ziel?Das Ziel schon (das Ziel ist, allgemein, Daten zu verarbeiten).

Es geht hier um die Mittel.

Bei prozeduraler (oder auch strukturierter) Programmierung hast Du nur Funktionen und Prozeduren mit Parametern. Die Prozeduren können nur auf die Parameter oder auf globale Variablen zugreifen.

Bei objektorientierter Programmierung gibt es das neue Konzept einer Klasse. Eine Klasse kombiniert Daten (dann Attribute gennant) und Prozeduren (Methoden genannt). Man kann von einer Klasse Instanzen erzeugen, jede Instanz ist dann ein eigenes Objekt und hat einen eigenen, unabhängigen Satz an Attributen.

Alle Methoden einer Klasse können jetzt nicht nur auf ihre Parameter und globale Variablen zugreifen, sondern auch auf die Attribute des Objekts, für das sie aufgerufen werden.

Beispiel:

Klasse "Obst" mit den Attributen "Größe" und "Gewicht". Für jedes Stück Obst wird eine eigene Instanz dieser Klasse angelegt und die Attribute "Größe" und "Gewicht" entsprechend gesetzt.

Zusätzlich gibt es Vererbung und Polymorphie, mit denen das Verhalten von Objekten durch überschreiben der Methoden in spezialisierten Klassen angepasst werden kann. Aber das führt zu weit und kann in einem kleinen Forums-Beitrag nicht mehr alles untergebracht werden... :)

Kladderadatsch
2005-02-11, 15:05:57
k, dann bin ich mal gespannt, was mich davon in der schule noch alles erwartet;)

mobius
2005-02-13, 16:03:46
k, dann bin ich mal gespannt, was mich davon in der schule noch alles erwartet;)

Ich geb dir mal zwei Tipps, die das Programmieren um einiges erleichtern.

1. Benenn die Variablen immer möglichst sprechend, d.h. nicht N1, N2 etc, sondern NummerHaus, NummerTele. Sonst wirst du kein Programm mehr verstehen, dass du vor längerer Zeit geschrieben hast. Das einzige was sich nicht lohnt richtig zu bennen, sind zähler.
Ich denke es fällt jedem schwer ein Prog zu verstehen, das eine bescheidene Variablenbenennung hat.

2. Arbeite wenn irgendwas nicht läuft, mit dem Debugger. Falls du nicht weisst wie das funktioniert:
Gehe an die Stelle wo du denkst, dass dort die Probleme auftauchen und drücke die Linke Maustaste an den grauen Rand. Dort erscheint ein roter Punkt. Dort wird das Programm anhalten. Nun markierst du die Variablen (oder halt mehrere) und gehst auf den Menüpunkt Start -> Ausdruck hinzufügen.
Die Variable erscheint nun in einem Extra fenster. Nun kannst du das Programm starten. Kommt das Programm an die Stelle, stoppt es und zeigt dir den Variableninhalt. Von nun an kannst du das Programm per F7 in einzelschritten weiterführen. Auf diese Weise kannst du Schritt für Schritt sehen was passiert und so Fehler finden.

Ansonsten viel Spaß in Delphi. Ich schreib grad nen Packprogramm ;)

Kladderadatsch
2005-02-13, 16:16:09
danke:)
ja, das mit den benennungen habe ich mir auch schon gedacht. meine lehrerin scheint davon aber nicht viel zu halten:|
(ich nehms mir aber zu herzen;))

die debug-funktion muss ich wirklich mal ausprobieren; dürfte in kursarbeiten äußerst hilfreich sein;) (ich glaube, so wie sich die lehrkraft manchmal anstellt, ist ihr diese funktion noch unbekannt^^)

mobius
2005-02-13, 19:16:00
danke:)
ja, das mit den benennungen habe ich mir auch schon gedacht. meine lehrerin scheint davon aber nicht viel zu halten:|
(ich nehms mir aber zu herzen;))

die debug-funktion muss ich wirklich mal ausprobieren; dürfte in kursarbeiten äußerst hilfreich sein;) (ich glaube, so wie sich die lehrkraft manchmal anstellt, ist ihr diese funktion noch unbekannt^^)

Muha same here. Meinem Lehrer durfte ich die Debug-Funktion auch erklären, dabei ist ja nun wirklich nicht viel dahinter. Soviel zu den Informatiklehrern an den Schulen ;)
Ist aber wirklich ne gute Sache mit der Funktion, wer schreibt schließlich schon ein Programm das auf Anhieb läuft oder was macht man mit nem 1000 Zeilen Programm wo dann auf einmal ein falsches Ergebnis rauskommt, aber der Code richtig ist? Ai :D

Kladderadatsch
2005-02-13, 19:38:04
habe den debugger gerade ausprobiert. geniale sache:)

kennst du zufällig eine website mit delphi-programmen samt quellcode zum lernen?

PH4Real
2005-02-15, 12:57:12
Bei all der Euphorie über den Debugger sollte man festhalten, dass dieser nur der letzte Strohhalm darstellen sollte.

Sprich Fehler sollten vorher über Unit-Tests, Exceptions und Assertions zumindest eingegrenzt werden.

Nichts ist schlimmer als ein Fehler, der sich erst in viel späteren Programmabläufen bemerkbar macht. Dann heisst es willkommen in der "Debug- und Wartungshölle" ;)

Kladderadatsch
2005-04-24, 12:06:07
hi,
nach langer auszeit mal wieder ein problemchen:
ein programm, welches vom 10er-system ins 16er-system umrechnet.
allerdings verstehe ich den case-befehl nicht so ganz:


var i,a,n: integer;
r: array of integer;
z: array of string;
begin
setlength (r,10);
setlength (z,10);
i:=0;
a:= strtoint(edit1.Text);
repeat
r[i]:= a mod 16;
a:= a div 16;
i:= 1+i;
until a=0;
n:=i;
for i:= 0 to n-1 do begin
case r[i] of 0..9:z[i]:= inttostr (r[i]);
10: z[i]:= 'A';
11: z[i]:= 'B';
12: z[i]:= 'C';
13: z[i]:= 'D';
14: z[i]:= 'E';
15: z[i]:= 'F';
end;
label1.caption:= z[i]+label1.caption;


2 dinge:
1.: warum "n-1"? so wird das letzte array doch gar nicht berücksichtigt?
2.: "case r[i] of 0..9:z[i]:= inttostr (r[i]);" verstehe ich von hinten bis vorne nicht.
die werte von r[i] werden doch z[i] übertragen? wie soll man das inttostr verstehen?
thx für aufklärung :)

Xmas
2005-04-24, 23:13:15
2 dinge:
1.: warum "n-1"? so wird das letzte array doch gar nicht berücksichtigt?
2.: "case r[i] of 0..9:z[i]:= inttostr (r[i]);" verstehe ich von hinten bis vorne nicht.
die werte von r[i] werden doch z[i] übertragen? wie soll man das inttostr verstehen?
thx für aufklärung :)

Wer hat den Code denn verbrochen?
z: array of string; :|

1. Von 0 bis n-1 sind genau n Elemente.
2. r[i] ist ein Integer, der für den Wert der Ziffer an Stelle i steht. Das muss in einen String umgewandelt werden.

Kladderadatsch
2005-04-25, 16:59:27
hm, funktionieren tut er aber:frown:

verbrochen hat den unsere lehrerin;)

wenn ich mehr zeiut habe, poste ich mal den, um vom 16er system ins 10er umzurechnen. das war heute wirklich der abschuss...

Phantom1
2005-04-25, 17:28:28
Macht's euch nicht zu schwer mit den ganzen umrechnungen von binär zu dezimal oder hex usw... Man kann das alles in einer function vereinfachen.

Hier mein Code:
function BaseToBase(Value: string; StartBase, EndBase: Byte): string;
const Digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var i: Integer; dec, j: Int64;
begin
j:=1;
dec:=0;
for i:=Length(Value) downto 1 do begin
dec:=dec + (Pos(Value[i], Digits)-1) * j;
j:=j*StartBase;
end;
Result:='';
repeat
Result:=Digits[dec mod EndBase+1] + Result;
dec:=dec div EndBase;
until dec=0;
end;
Damit kann man jetzt von jedem Basis-System ins andere rechnen. Basis von 1 bis 36 sind möglich!
Die 10er Basis ware das Dezimalsystem, 2er Basis das Binärsystem, 16er Basis Hexadezimalsystem, usw...

Beispiele:
ShowMessage(BaseToBase('10101', 2, 16)); // rechnet von Binär zu Hex
ShowMessage(BaseToBase('FFFF', 16, 10)); // rechnet von Hex zu Dezimal
ShowMessage(BaseToBase('123456', 10, 8)); // rechnet von Dezimal zu Octal

MfG
Phantom1

Kladderadatsch
2005-04-25, 19:51:07
ich mach dir jetzt mal alles rot, wovon wir bisher noch nichts gehört haben;)



Hier mein Code:
function BaseToBase(Value: string; StartBase, EndBase: Byte): string;
const Digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var i: Integer; dec, j: Int64;
begin
j:=1;
dec:=0;
for i:=Length(Value) downto 1 do begin
dec:=dec + (Pos(Value[i], Digits)-1) * j;
j:=j*StartBase;
end;
Result:='';
repeat
Result:=Digits[dec mod EndBase+1] + Result;
dec:=dec div EndBase;
until dec=0;
end;

Beispiele:
ShowMessage(BaseToBase('10101', 2, 16)); // rechnet von Binär zu Hex
ShowMessage(BaseToBase('FFFF', 16, 10)); // rechnet von Hex zu Dezimal
ShowMessage(BaseToBase('123456', 10, 8)); // rechnet von Dezimal zu Octal


:D

aber danke trotzdem. irgendwann werd ich bestimmt mal darauf zurückgreifen:)

Kladderadatsch
2005-04-26, 09:08:35
so, hier der code, um vom 16er-system ins 10er-system umzurechnen:

procedure TForm1.Button1Click(Sender: TObject);
var wert: array of integer; ergebnis: extended; zahl: string;
i,l: integer;
begin
zahl:= edit1.text;
l:= length(edit1.text);
setlength(wert,l);
i:= 0;
for i:= 1 to l do
case zahl[i] of '0'..'9': wert[i-1]:= strtoint (zahl[i]);
'A': wert[i-1]:= 10;
'B': wert[i-1]:= 11;
'C': wert[i-1]:= 12;
'D': wert[i-1]:= 13;
'E': wert[i-1]:= 14;
'F': wert[i-1]:= 15;
end;
ergebnis:= 0;
for i:= l-1 downto 0 do
ergebnis:= power (16,l-1-i)* wert[i] + ergebnis;
label1.caption:= floattostr(ergebnis);
end;


end.

ist das etwa genau so umständlich?
wirklich verstehen kann ich es nicht :|

Grestorn
2005-04-26, 09:26:30
Fehlen die Einrückungen nur in dem Posting, oder sieht das genau so auch bei Euch im Unterricht aus?

Der Code ist schon ziemlich umständlich. Es ist nicht gut, wenn jemand der wenig Erfahrung mit Programmieren hat (wie Eure Lehrerein offensichtlich), anderen eben jenes beibringen will.

Nur ein kleines Beispiel. Es folgen die folgenden beiden Zeilen direkt aufeinenader:


i:= 0;
for i:= 1 to l do


Auch wenn man kein Experte ist, sieht man sofort, dass die erste Zeile überflüssig wie ein Kropf ist. Erst wird i auf 0 gesetzt um nur eine Zeile später auf 1 (Startwert in der Schleife) gesetzt zu werden.

Auch der Umweg über das Array of integers ist haarsträubend.

Das Problem ist, dass Euch die Lehrerin damit mehr verwirrt als sie Euch hilft.

Phantom1
2005-04-26, 09:59:58
Das ist wirklich relativ umständlich. Ich hab deinen Code mal etwas umgeändert.

procedure TForm1.Button1Click(Sender: TObject);
var
zahl: String;
i, ergebnis, wert, base: Integer;
begin
zahl:= Edit1.Text;
base:= 1;
ergebnis:= 0;
for i:= Length(Edit1.Text) downto 1 do begin
wert:=0;
case zahl[i] of
'0'..'9': wert:= StrToInt(zahl[i]);
'A': wert:= 10;
'B': wert:= 11;
'C': wert:= 12;
'D': wert:= 13;
'E': wert:= 14;
'F': wert:= 15;
end;
ergebnis:= ergebnis + wert * base;
base:= base * 16;
end;
Label1.Caption:=IntToStr(ergebnis);
end;

Man könnte das Case auch noch weglassen, aber ich will euch nicht noch extra verwirren.

MfG
Phantom1

Kladderadatsch
2005-04-26, 19:05:02
Fehlen die Einrückungen nur in dem Posting, oder sieht das genau so auch bei Euch im Unterricht aus?


so schaut das bei uns allen aus;)
von einer "ordnung" haben wir noch nichts gesagt bekommen.

@phantom 1

thx; aber hier gibts auch wieder was unbekanntes: base.
aber das schaut wirklich schon wesentlich übersichtlicher und damit leichter aus.


der lehrerin wurde übrigens in der letzten stunde verraten, dass es in delphi eine funktion für potenzen gibt. sie erklärte uns bis dahin, dass dies nicht mgölich sei, da delphi ja mit ^ nichts anfangen könnte;)

Phantom1
2005-04-26, 19:31:55
thx; aber hier gibts auch wieder was unbekanntes: base.
aber das schaut wirklich schon wesentlich übersichtlicher und damit leichter aus.
Base ist ne einfache Variable des Typs Integer.
In jedem Durchlauf berechnet die Variable dann die nächste Potenz (base:=base*16), ist im Grunde das gleiche wie die function Power().

Hier nochmal das gleiche, diesmal nur mit der function Power():

procedure TForm1.Button1Click(Sender: TObject);
var
zahl: String;
i, l, wert: Integer;
ergebnis: Extended;
begin
zahl:= Edit1.Text;
l:=Length(Edit1.Text);
ergebnis:= 0;
for i:= l downto 1 do begin
wert:=0;
case zahl[i] of
'0'..'9': wert:= StrToInt(zahl[i]);
'A': wert:= 10;
'B': wert:= 11;
'C': wert:= 12;
'D': wert:= 13;
'E': wert:= 14;
'F': wert:= 15;
end;
ergebnis:= ergebnis + wert * Power(16, l-i);
end;
Label1.Caption:=FloatToStr(ergebnis);
end;
MfG
Phantom1

Kladderadatsch
2005-04-26, 20:48:48
ergebnis:= ergebnis + wert * Power(16, l-i);

jetzt ist die verwirrung komplett:D
wie um himmels willen kommst du hier ohne zählschleife aus? der "wert" ist doch ein array und muss, wie im von mir geposteten code, auch "stück für stück" abgearbeitet werden :confused:
-->ok, wert ist eigentlich kein array (also im "schul-code" schon;))
steckt also in wert sozusagen die übersetzung der buchstaben des 16ner-systems?
aber wie geht das? wenn wert kein array ist, müssten doch allealten zuweisungen doch bei jeder neuen gelöscht werden? das verstehe ich jetzt wirklich nicht...

aber es funktioniert;)


was ich ebenfalls nicht verstehe:
die variable "zahl" bekommt ja die komplette, ins edit-feld eingetragene zahl zugewiesen. die for-schleife hilft nun, jede einzelne darin vorkommende zahl/buchstaben herauszubekommen.
aber da bei 5 zahlen fünf Is im array existieren, kann doch jede zahl nur einfach behandelt werden und somit niemals als zweistellige zahl identifiziert werden?! (was ja im case-befehl ja funktioniert^^)
--> ok, habe gerade bemerkt, dass das im 16ner system nicht von bedeutung ist;)


warum muss die ausgabe als floattostr ausgegeben werden? es handelt sich doch immer um integer, und niemals um real?!

Phantom1
2005-04-26, 21:18:27
aber wie geht das? wenn wert kein array ist, müssten doch allealten zuweisungen doch bei jeder neuen gelöscht werden? das verstehe ich jetzt wirklich nicht...du übersiehst das die for-scheife in einem Begin .. End block steckt, das heißt alles was zwischen diesem begin und end steht wird jedesmal durchlaufen.

warum muss die ausgabe als floattostr ausgegeben werden? es handelt sich doch immer um integer, und niemals um real?!

Das liegt an der Power() function, die hat einen gleitkomma rückgabewert (extended). Ich hätte diesen rückgabewert natürlich auch runden können mit der function Round(), dann wäre es weider ein Integer und man könnte es wieder mit IntToStr() anzeigen lassen.

MfG
Phantom1

Kladderadatsch
2005-04-26, 21:46:53
ich danke dir phantom 1. jetzt hab ichs endlich geblickt:)

dann bis zur nächsten hürde;)

Kladderadatsch
2005-12-04, 10:23:57
hi,
mal wieder ein kleines problem;)
(am mittwoch ist kursarbeit;()

wir haben ein programm geschrieben, mit welchem man angaben zu personen einmal per save/opendialog und einmal per write(f,xyz) (f als file von tperson) extern abspeichern kann.
die personen sind in einem array 'nummeriert'.

nun soll per eingabe des namens die person aus dem file gelöscht werden:
procedure TForm1.Button9Click(Sender: TObject);
var x,v,o: integer;
begin
assignfile(f,'C:\save.txt');
v := 0;
reset(f);
repeat
read(f,person[v]);
until person[v].name = edit9.text;
x := filesize(f);
For x := v to x do begin
Person[v].name := Person[v+1].name;
Person[v].vorname := person[v+1].vorname;
Person[v].alter := person[v+1].alter;
Person[v].Geschlecht := person[v+1].Geschlecht;
end;
rewrite(f);
write(f,person[v]);
closefile(f);
end;
end;

gebe ich jetzt den namen der zu löschenden person ein, und lade die datei wieder, ist nur noch die vermeintlich gelöschte person enthalten, alle anderen gelöscht:ugly:

zu dem problem noch mehr fragen:
1. wie kann ich dem until noch eine bedingung zufügen (hier eof(f), damit nicht immer der fehler kommt, es würde hinter der datei gelesen werden)
2. kann mir vielleicht jemand type, bzw. tperson näher bringen? ich versteh da irgendwie das prinzip nicht...

()V()r.Freeze
2005-12-04, 11:19:54
gebe ich jetzt den namen der zu löschenden person ein, und lade die datei wieder, ist nur noch die vermeintlich gelöschte person enthalten, alle anderen gelöscht:ugly:


Nur, wenn die zu löschende Person die letzte in der Datei ist

Kladderadatsch
2005-12-04, 14:41:15
Nur, wenn die zu löschende Person die letzte in der Datei ist
nö, buchi;)

icemanemp
2005-12-04, 15:38:42
procedure TForm1.Button9Click(Sender: TObject);
var x,v,o: integer;
begin
assignfile(f,'C:\save.txt');
v := 0;
reset(f);
repeat
read(f,person[v]);
until person[v].name = edit9.text;
x := filesize(f);
For x := v to x do
begin
Person[v].name := Person[v+1].name;
Person[v].vorname := person[v+1].vorname;
Person[v].alter := person[v+1].alter;
Person[v].Geschlecht := person[v+1].Geschlecht;
end;
rewrite(f);
write(f,person[v]);
closefile(f);
end;


Da fehlen ja alle Ausnahmebehandlungen...
Beim Einlesen hat die Variable v immer den Wert 0, also hat das Array mit der Struktur "Person" immer nur die Werte zu einer Person!
Beim For x := v to x läuft ja auch einiges schief! Du sagst zähle von 0 bis z.B. 10, aber x ist auch schon 10! Neue Zählvariable einführen.
Später greifst du dann auch noch auf v und sogar v+1 zu obwohl oben nicht mehr als 1 Element eingelesen wurde! Dürfte eine Exception hochkommen (meiner Meinung nach wird sich v beim Einlesen nicht ändern!!!)

Hardwaretoaster
2005-12-04, 15:58:27
*g* Sortieralgos, das lerne ich auch gerade, Mi Klausur, mit 'nem Augenzwinkern kam, dass wir Quicksort vorwärts udn rückwärts können sollen (der rekursive ist imho wesentlich einfacher, beim iterative verschlucke ich mich eher, die einfachen Algos gegen ja nsonst auch, Hep- und notfalls auch Shelsortr gehen einigermaßen, aber shakersort in Verbindung mit Materialien, die noch was vom Magnetbändern faseln und auf BASIC abgestimmt sind, sowie ebenfalls einem Lehrer, der nicht wirklich gescheit erklären kann...

Spasstiger
2005-12-04, 21:07:32
Macht's euch nicht zu schwer mit den ganzen umrechnungen von binär zu dezimal oder hex usw... Man kann das alles in einer function vereinfachen.

Hier mein Code:[...]

MfG
Phantom1

Coole Sache das, hab den Code eben in ein Java-Programm umgesetzt, allerdings mit leicht abgeänderten Bezeichnern. Man muss halt bei Java bedenken, dass das erste Stelle in einem String den Index 0 hat (im Gegensatz zu Delphi, wo die erste Stelle den Index 1 hat). Hier meine BaseToBase-Methode:
public String BaseToBase(String value, int inbase, int outbase)
{
String outval="";
int j=1; int dec=0;
final String DIGITS="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for(int i=value.length();i>=1;i--)
{
dec = dec + j*(DIGITS.indexOf(value.charAt(i-1)));
j=j*inbase;
}
do
{
outval=DIGITS.charAt(dec%outbase)+outval;
dec = dec/outbase;
}
while(dec!=0);
return outval;
}

Hardwaretoaster
2005-12-04, 22:19:28
@Spasstiger Das mit dem Array komt drauf an, mit der MEthode setlegth wird der Startindex auch autom. auf eins gesetzt, wenn du sie vorher festlegst, kannst es es tatsächlich variieren, AFAIK.

Spasstiger
2005-12-04, 23:28:40
@Spasstiger Das mit dem Array komt drauf an, mit der MEthode setlegth wird der Startindex auch autom. auf eins gesetzt, wenn du sie vorher festlegst, kannst es es tatsächlich variieren, AFAIK.

Hab mich jetzt noch nicht wirklich intensiv mit Java befasst, eigentlich ist es noch nicht mal einen Monat her, seit ich meine ersten Schritte in Java getan habe. Und das zwangsweise, weil wir an der Uni in diesem Semester ein Informatikpraktikum/Javapraktikum absolvieren müssen (ist fürs Vordiplom genauso wichtig wie eine Prüfung).

Hardwaretoaster
2005-12-05, 07:15:06
es geht mirn um die Varation bei Delphi ;)
Java kann ich auch nicht gescheit.

Daltimo
2005-12-05, 13:02:13
Wenn ich daran denke, was bei mir vorige Woche in der letzten Delphi Klausur dran kam, da kannst du das echt vergessen.

Ich werde sie bei Gelegenheit mal rein Posten;)

Aber ist würde ich sagen schon um einiges schwerer als das hier!

Kladderadatsch
2005-12-05, 14:24:23
k, hat sich geklärt. wir haben heute 'seek' verraten bekommen:|

()V()r.Freeze
2005-12-05, 20:39:20
Jo, und das funtzt auch net :biggrin: