# Quersumme und Schleifen - ich verstehe es nicht...



## Claudia1986 (7. März 2009)

Hallo zusammen,

ich stehe vor einem Problem welches ich alleine einfach nicht hinbekomme. Seit gut acht Stunden sitze ich daran und bin, bis auf Fehlermeldungen, nicht einen Schritt weitergekommen.

Aus einer beliebig langen Zahl muss ich die Quersumme ziehen die den Wert von 44 nicht übersteigen darf. Tut sie es dennoch, muss wieder die Quersumme gezogen werden bis eben die 44 erreicht wurde. Ich bekomme es zwar mit einer if-else Anweisung hin, muss aber dafür auch jedes Mal die Funktion wieder erneut einbauen.

Das mit der while Schleife bekomme ich einfach nicht auf die Reihe.

Könnte mir bitte jemand helfen?


----------



## ZodiacXP (7. März 2009)

Das kannst du rekursiv lösen oder eine gesonderte Funktion schreiben, die die Quersumme errechnet und in eine while einbauen.

Vielleicht fragst du dich was rekursiv ist.
Hier zum Beispiel eine Funktion die rekursiv die Quersumme errechnet:

```
function quer($zahl)
{
  // Abbruch-Bedingung
  if ($zahl == 0)
  {
    return 0;
  }
  // Rekursion (Funktion ruft sich auf bis zur Abbruchbedingung)
  return ($zahl % 10) + quer((int) $zahl / 10)
}
```

$zahl % 10 : % heißt Modulo (Rest). Zum Beispiel 1 % 3 = 1; 2 % 3 = 2; 3 % 3 = 0 (kein Rest). So kriegst du die letzte Ziffer einer Zahl mit 12345 % 10 = 5

(int) $zahl / 10 bedeutet, dass die Zahl durch 10 geteilt wird und die Nachkommastelle wird durch (int) (dies ist ein Type-Cast) einfach abgeschnitten.

Nun hast du eine Funktion die zeigt was rekursion ist anhand der Quersumme.
Du kannst es selbst nun mit einer rekursiven Funktion versuchen oder ganz stumpf eine while bauen mit der Abbruchbedingung (kleiner 44), wobei aber der Lerneffekt ausbleibt 

Letzteres ist glaube ich das was du gerade Versuchst, wo ich eigentlich kein Problem sehe  zeige doch deinen Quelltext mal.


----------



## deepthroat (7. März 2009)

Hi.

Evlt. solltest du mal sagen was eigentlich das Problem ist? Bekommst du Fehlermeldungen? Oder eine Endlosschleife?

Probier's mal so:

```
do {
  $quer = quersumme($zahl);
  $zahl = $quer;
} while ($quer > 44);
```
Gruß


----------



## Gumbo (7. März 2009)

Oder iterativ:
	
	
	



```
function quer($zahl)
{
	$summe = 0;
	while ($zahl > 0) {
		$summe += ($zahl % 10);
		$zahl = (int) $zahl / 10;
	}
	return $summe;
}
```


----------



## Claudia1986 (7. März 2009)

Bitte nicht lachen wenn Fehler drin sind, aber ich bin eine totale Anfängerin was php angeht - befasse mich gerade mal drei Tage damit. Die Funktion habe ich im Netz gefunden, nur wirklich nachvollziehen was da geschieht? Nicht so richtig und ja, ein Schleife würde mir weiterhelfen, aber wie mache ich es?


```
<?
 
$zahl = "658955556228465156";
 
function quersumme($zahl)
{
  settype($zahl, "string");
  $res = 0;
  for($i=0; $i<strlen($zahl); $i++)
  {
    $res = $res + $zahl[$i];
  }
  return $res;
}

$zahl2 = quersumme($zahl);

while($zahl > '22')

	{ 
	echo "$zahl<br>";
	quersumme($zahl); 
	
	}
else { echo"$zahl"; }

?>
```


----------



## CookieBuster (7. März 2009)

Diese Funktion ruft die einzelnen Zahlen auf (mit $zahl[$i]). In der Schleife wird einfach hochgezählt  von der ersten Zahl ($zahl[0]) bis zum ende des Strings ($zahl[strlen($zahl)-1])


----------



## Claudia1986 (7. März 2009)

CookieBuster hat gesagt.:


> Diese Funktion ruft die einzelnen Zahlen auf (mit $zahl[$i]). In der Schleife wird einfach hochgezählt  von der ersten Zahl ($zahl[0]) bis zum ende des Strings ($zahl[strlen($zahl)-1])



Zuerst soll ja aus allen bereits vorhandenen Zahlen die Quersumme gesucht werden. Steht diese fest, sollte weiterhin solange eine Quersumme errechnet werden bis eben die 44 nicht mehr überschritten wird...

...ich bekomme es einfach nicht hin.


----------



## CookieBuster (7. März 2009)

Die oberen Lösungen sind alle Korrekt, aber ich kann ja auch noch eine Poste, noch net neue . Sieht aber relativ simpel dann aus:


```
$zahl = "6453216216";
while($zahl >= 44) {
for($i = 0; $i < strlen($zahl); $i++) {
    $Quer += $zahl[$i];
}
$zahl = (string)$Quer;
}
```


Ist nicht getestet, vielleicht hab ich auch nen kleinen Gedankenfehler drin. Sollte aber vom Prinzip her stimmen.


----------



## deepthroat (7. März 2009)

CookieBuster hat gesagt.:


> Ist nicht getestet, vielleicht hab ich auch nen kleinen Gedankenfehler drin.


Ja, ist ein kleiner Fehler drin. Die Bedingung soll ja nur auf die Quersumme zutreffen, nicht auf die Zahl selbst. D.h. dein Algorithmus würde für alle Zahlen <= 44 nicht funktionieren.

Deshalb ist es sinnvoller eine fußgesteuerte Schleife zu verwenden als eine kopfgesteuerte, da zuerst mal eine Quersumme berechnet werden muss bevor die Bedinung geprüft werden kann.

@Claudia1986: Dein Code hat Fehler die der PHP Interpreter sicherlich bemängelt. Warum zeigst du dann nicht die Fehlermeldung (wenn ich dich schon danach frage)?

Die Funktion *quersumme *kannst du ja so lassen. Und wie man dann solange Quersummen zu berechnet, bis die Quersumme <= 44 ist, hab ich dir schon gezeigt.

Obwohl wir ja eigentlich bei tutorials.de sind, und nicht bei ichschreibdirdeinencode.de  hier mal im Zusammenhang:

```
$zahl = "658955556228465156";
 
function quersumme($zahl)
{
  settype($zahl, "string");
  $res = 0;
  for($i=0; $i<strlen($zahl); $i++)
  {
    $res = $res + $zahl[$i];
  }
  return $res;
} 

do {
  $zahl = quersumme($zahl);
  echo "$zahl<br>";
} while ($zahl > 44);
```
Gruß


----------



## CookieBuster (7. März 2009)

@deeptrhorat

aber wenn ich $zahl die Quersumme zuweise, direkt bevor die Bedingung geprüft wird, dann müsste es ja trotzdem funktionieren (ab ich gemacht)

Fußgesteuert muss sie trotzdem sein. Da hast auf jeden Fall recht.


----------



## Claudia1986 (7. März 2009)

deepthroat hat gesagt.:


> Ja, ist ein kleiner Fehler drin. Die Bedingung soll ja nur auf die Quersumme zutreffen, nicht auf die Zahl selbst. D.h. dein Algorithmus würde für alle Zahlen <= 44 nicht funktionieren.
> 
> Deshalb ist es sinnvoller eine fußgesteuerte Schleife zu verwenden als eine kopfgesteuerte, da zuerst mal eine Quersumme berechnet werden muss bevor die Bedinung geprüft werden kann.
> 
> ...


danke sehr... *schäm*

Aber ich begreife es immer noch nicht...

Was geschieht da im Einzelnen? Wie gesagt, ich bin absolute Anfängerin...

Der Fehlercode der bei meinem Weg erscheint ist folgender:


> Parse error: parse error, unexpected T_ELSE in C:\xampp\htdocs\rechne\index.php on line 25


in Freund hatte mir vor in paar Tagen XAMPP installiert und gemeint das wäre für einen Anfänger ausreichen. Aber bis auf HTML habe ich bislang nichts mit Programmieren zu tun gehabt...


----------



## deepthroat (7. März 2009)

Claudia1986 hat gesagt.:


> danke sehr... *schäm*
> 
> Aber ich begreife es immer noch nicht...
> 
> Was geschieht da im Einzelnen? Wie gesagt, ich bin absolute Anfängerin...


Womit hast du denn jetzt Probleme? Mit der Berechnung der Quersumme? Oder mit der do while Schleife?


Claudia1986 hat gesagt.:


> Der Fehlercode der bei meinem Weg erscheint ist folgender:
> 
> 
> 
> ...


Hast du dir die Fehlermeldung denn mal durchgelesen? Sagt doch eigentlich recht deutlich, das das *else* in Zeile 25 nicht erwartet wurde, also da nicht stehen darf.

Der Fehler resultiert daher, dass du einfach bei deinem *if ... else* das *if* durch *while* ersetzt hast. Da muß dann halt das else weg, denn das darf nur mit einem if zusammenstehen.

Gruß


----------

