Supportnet / Forum / Anwendungen(Java,C++...)
dringend hilfe bei pascal-(function)-aufgabe benötigt
Frage
hallo!
also ich hab das problem, dass ich in einem pascal kurs ein prog schreibe muss, welches u.A. eine funktion fordert welche die anzahl der ziffern einer zahl bestimmt. also z.b.; zahl 1000 hat 4 ziffern.
den rest den progs habsch schon, nur komm ich ni auf diese funtcion (zu simpel und bin ich zu blöd?!)..
bitte helft mir schnell
danke
mfg
alex
Antwort 1 von Edeltraud
Hallo,
wandle die Zahl in einen String und frage dann die Länge des Strings ab.
Eine Möglichkeit.
Gruss Edeltraud
wandle die Zahl in einen String und frage dann die Länge des Strings ab.
Eine Möglichkeit.
Gruss Edeltraud
Antwort 2 von Rangoo
Laut meiner Aufzeichnungen von vor hunderten von Jahren, gibt es die einfache Funktion length(Variable). Allerdings kann es sein, dass du den Integer dann zunächst zum string mutieren musst, da steht nämlich dabei, dass die Funktion zum Ermitteln der Länge von Strings ist.
Also: y:=length(str(x));
Du siehst, du bist einfach zu blöd. ;-)
So long
Also: y:=length(str(x));
Du siehst, du bist einfach zu blöd. ;-)
So long
Antwort 3 von skaman
tag, danke erstma für eure schnell hilfe, aber ich bin erst seit ca 1nem moant in dem kurs, bisher sind wir echt erst bei funktionen und procedure, und was ihr mir bisher angeboten habt is irgendwie spanisch für mich, gehts ni auch einfacher mit schleifen oder so???
trotzdem danke!
mfg alex
trotzdem danke!
mfg alex
Antwort 4 von Rangoo
Das ist so einfach wie möglich. *g* Du hast deine Funktion xy und in die schreibst du einfach die oben genannte Zeile rein...
Du könntest auch...
v:=1;
s:=1;
if x<0 then
x:=x*-1;
repeat
v:=v*10;
y:=x/v;
if y>1 then
s:=s+1;
until y<1;
s gibt dabei die Anzahl der Stellen an. Wenn du eine genauere Erklärung ders Ablaufs willst, melde dich noch mal.
So long
PS: Ich hoffe, mir ist kein Basic-Code ins Pascal gerutscht. Wäre dankbar, wenn du das mal überprüfst, Edeltraud.
Du könntest auch...
v:=1;
s:=1;
if x<0 then
x:=x*-1;
repeat
v:=v*10;
y:=x/v;
if y>1 then
s:=s+1;
until y<1;
s gibt dabei die Anzahl der Stellen an. Wenn du eine genauere Erklärung ders Ablaufs willst, melde dich noch mal.
So long
PS: Ich hoffe, mir ist kein Basic-Code ins Pascal gerutscht. Wäre dankbar, wenn du das mal überprüfst, Edeltraud.
Antwort 5 von Edeltraud
Hallo,
eine einfache Lösung mit der Case-Anweisung:
function Anzahl(Zahl : Integer): Integer;
begin
case zahl of
0..9 : Anzahl := 1;
10..99 : Anzahl := 2;
100..999 : Anzahl := 3;
1000..9999 : Anzahl := 4;
10000..99999 : Anzahl := 5;
end; {case}
end;
eine einfache Lösung mit der Case-Anweisung:
function Anzahl(Zahl : Integer): Integer;
begin
case zahl of
0..9 : Anzahl := 1;
10..99 : Anzahl := 2;
100..999 : Anzahl := 3;
1000..9999 : Anzahl := 4;
10000..99999 : Anzahl := 5;
end; {case}
end;
Antwort 6 von skaman
danke für eure schnelle hilfe!
werds glei ma probieren und es wird schon gehen, schreib das morgen nochma rein obs geklappt hat...
thx
mfg
alex
werds glei ma probieren und es wird schon gehen, schreib das morgen nochma rein obs geklappt hat...
thx
mfg
alex
Antwort 7 von Rangoo
Ach jadele, noch ein kleiner Bugreport in meinem Code, auch wenn du den wohl nicht verwenden wirst: die drittletzte Zeile muss >= heißen, sonst stimmt das nicht...
Aber das nur so als Verbesserung. Habe kein Pascal mehr und konnte das deshalb nicht überprüfen. *g*
So long
Aber das nur so als Verbesserung. Habe kein Pascal mehr und konnte das deshalb nicht überprüfen. *g*
So long
Antwort 8 von Bluescorpion
Hi man könnte auch die Zahl in einer Schleife so lange durch zehn Teilen bis sie kleiner 1 ist, das sollte auch gehen und sieht besser.
MfG Andre
MfG Andre
Antwort 9 von Rangoo
@Andre:
Was anderes tu ich ja eigentlich nicht. Ich vergrößere nur immer den Teiler um Faktor 10, das läuft also praktisch auf das Gleiche hinaus, schließlich zähle ich auch, bis die Zahl kleiner 1 ist.
Die Case-Anweisund von Edeltraud hat übrigens den Nachteil, dass man für jede Stellenzahl eine Anweisung schreiben muss.
Übrigens interessiert mich die Auflösung, Alex. *g*
So long
Was anderes tu ich ja eigentlich nicht. Ich vergrößere nur immer den Teiler um Faktor 10, das läuft also praktisch auf das Gleiche hinaus, schließlich zähle ich auch, bis die Zahl kleiner 1 ist.
Die Case-Anweisund von Edeltraud hat übrigens den Nachteil, dass man für jede Stellenzahl eine Anweisung schreiben muss.
Übrigens interessiert mich die Auflösung, Alex. *g*
So long
Antwort 10 von Edeltraud
Hallo,
hier noch eine Lösung mit repeat ... until
function Anzahl(Zahl : Integer): Integer;
var Stellen : Integer;
begin
Stellen := 0;
repeat
Zahl := Zahl div 10;
Inc(Stellen);
until Zahl <= 0;
Anzahl := Stellen;
end;
@Rangoo: / geht unter Pascal nicht so, wegen der strengen TypenPrüfung. Stattdessen div.
Case ist mir eben sofort eingefallen.
Gruss, Edeltraud
hier noch eine Lösung mit repeat ... until
function Anzahl(Zahl : Integer): Integer;
var Stellen : Integer;
begin
Stellen := 0;
repeat
Zahl := Zahl div 10;
Inc(Stellen);
until Zahl <= 0;
Anzahl := Stellen;
end;
@Rangoo: / geht unter Pascal nicht so, wegen der strengen TypenPrüfung. Stattdessen div.
Case ist mir eben sofort eingefallen.
Gruss, Edeltraud
Antwort 11 von Rangoo
Damals, als ich Pascal gelernt habe, gab es solche Typenprüfungen noch nicht. Das war aber auch zu der Zeit, als Pascal noch TurboPascal hieß, unter DOS lief und keine Mausunterstützung hatte. Also gaaaaanz früher. ;-)
Wofür dient eigentlich Inc(Stellen);? Ist das der neue Ausdruck für Stellen:=Stellen+1;?
Übrigens solltest du
until Zahl<1; nehmen, oder? Wenn du teilst, wechselst du definitiv nie das Vorzeichen. Außerdem gilt bei 10:10, dass das Ergebnis 1 noch eine weitere Stelle zulässt.
So long
Wofür dient eigentlich Inc(Stellen);? Ist das der neue Ausdruck für Stellen:=Stellen+1;?
Übrigens solltest du
until Zahl<1; nehmen, oder? Wenn du teilst, wechselst du definitiv nie das Vorzeichen. Außerdem gilt bei 10:10, dass das Ergebnis 1 noch eine weitere Stelle zulässt.
So long
Antwort 12 von Edeltraud
Hallo Rangoo,
Inc = Increment 1
Inc(Stellen, 10) = Increment 10
Ist aber wie Stellen := Stellen+1;
nur schneller und weniger compilierter Code.
<= 0 ist schon richtig
denn in der 3 Teilung ist das Egebnis schon 1 und jetzt noch einmal geteilt ergibt 0,1 also <= 0.
Ist meiner Meinung nach der sichere Weg.
Da du ja bei der Funktion z.B. auch 0,5 übergeben kannst. Und auch dann soll es noch ohne RuntimeError funktionieren.
Gruss, Edeltraud
Inc = Increment 1
Inc(Stellen, 10) = Increment 10
Ist aber wie Stellen := Stellen+1;
nur schneller und weniger compilierter Code.
<= 0 ist schon richtig
denn in der 3 Teilung ist das Egebnis schon 1 und jetzt noch einmal geteilt ergibt 0,1 also <= 0.
Ist meiner Meinung nach der sichere Weg.
Da du ja bei der Funktion z.B. auch 0,5 übergeben kannst. Und auch dann soll es noch ohne RuntimeError funktionieren.
Gruss, Edeltraud
Antwort 13 von Rangoo
10/10=1, erste Stelle
1/10=0,1, zweite Stelle.
0<0,1, daher bei <=0
0,1/10=0,01, dritte Stelle
0,01/10=0,001, vierte Stelle
...
Zahlen ohne Minus sind grundsätzlich größer als 0. Es sei denn, du rundest sie unwahr, also mit int. Dann werden sie gleich 0.
So long
1/10=0,1, zweite Stelle.
0<0,1, daher bei <=0
0,1/10=0,01, dritte Stelle
0,01/10=0,001, vierte Stelle
...
Zahlen ohne Minus sind grundsätzlich größer als 0. Es sei denn, du rundest sie unwahr, also mit int. Dann werden sie gleich 0.
So long
Antwort 14 von Edeltraud
Hallo Rangoo,
das mag in BASIC so sein.
In Pascal müssen die Variablen vorher definiert werden. In diesem Beispiel ist Zahl = Integer. 0,1 wäre aber schon keine GanzZahl mehr sondern ein Typ REAL. Also eine Zahl mit Nachkommastellen, und das geht in Pascal so nicht. Deshalb auch div statt /. / ist der Teiler für RealZahlen unter Pascal. Div liefert unter Pascal immer eine GanzZahl, Nachkommastellen werden abgeschnitten.
Daher ist <= 0 richtig.
Gruss, Edeltraud
das mag in BASIC so sein.
In Pascal müssen die Variablen vorher definiert werden. In diesem Beispiel ist Zahl = Integer. 0,1 wäre aber schon keine GanzZahl mehr sondern ein Typ REAL. Also eine Zahl mit Nachkommastellen, und das geht in Pascal so nicht. Deshalb auch div statt /. / ist der Teiler für RealZahlen unter Pascal. Div liefert unter Pascal immer eine GanzZahl, Nachkommastellen werden abgeschnitten.
Daher ist <= 0 richtig.
Gruss, Edeltraud

