# C++ - bestimmte Ziffer einer Zahl ausgeben



## Sick-Angel (24. Oktober 2004)

Hi,

ich bin C++ und überhaupt Programmier-Anfänger, und hab übers WE einige Beispiele zu lösen, ohne dass wir vorher die bestimmten Funktionen besprochen haben. 

Jetzt häng ich schon bei dem ersten Beispiel, wobei ich von dem aus die anderen wohl ableiten kann. Und zwar sollen wir die Funktion mod bzw. % anwenden, ohne dass uns die vorher erklärt wurde (also weiß ECHT nicht, wie was warum funktionieren sollte).

- Schreiben Sie ein Programm, das zwei Zahlen m und n einliest und die n-te Ziffer der Zahl m ausgibt
z.B. m=1358 n=2 Ausgabe: 5 

---
Soweit klar, hab in einem anderen Forum den Ansatz bekommen:


> *int* a = 10, b = 3;
> _// die ganzzahlige Division von a durch b liefert als Ergebnis 3 Rest 1_
> *int* c = a / b; _// c hat nun den Wert 3_
> *int* d = a % b; _// d hat nun den Wert 1_


Wo ich nicht genau durchblick, wie ich dadurch auf die gewünschte Ziffer kommen soll. Ich steh da echt sowas von auf der Leitung und komm einfach nicht runter.  

Bitte nicht falsch verstehen: ich möchte keine fertigen Codes, die ich dann brav abgeben kann und nix check. Immerhin muß ich dann vor Ort ein ähnliches Beispiel programmieren und außerdem bin ich dort, WEIL ich C++ lernen und dann auch können will! 

Und mod scheint ja noch eins der Simpleren zu sein, wenn mir da endlich mal der Knoten aufgeht.

Vielen Dank schon im Voraus!

verzweifelte Grüße
Angie

PS: hab natürlich auch die Suchfunktion gequält  - das, was meinem Beispiel am Nächsten kommt wär folgender Thread:
http://www.tutorials.de/forum/showthread.php?t=134197&highlight=modulo

Allerdings nicht immer für die 3. Stelle z.b., sondern je nachdem, was die 2. Eingabe bewirkt. 
Wir haben nicht sonderlich viele Funktionen angesprochen. Angewandt hatten wir nur Grundrechnungsarten, und kurz erwähnt, dass es sowas wie If- und While gibt. Sollte es damit zu lösen sein können.


----------



## Java/CppProgrammer (24. Oktober 2004)

Die Funktion von Modulu:

Der Wert den eine Modulu Operation zurückgibt,ist der Rest der Division.

Z.B.

i=8%4= 2 Rest 0 , folglich enthält i nun den Wert null.
i=9%4=2 Rest 1, i enthält nun den Wert 1 

hoffe ich konnte weiterhelfen


----------



## Sick-Angel (24. Oktober 2004)

Hi, 

danke für die rasche Antwort!

Dass Modulo den Rest zurückgibt, weiß ich durch googlen. Hab damit auch folgendes Beispiel gelöst, um rauszufinden, ob die eingegebene Zahl glatt durch 3 teilbar ist:



> #include <iostream.h>
> int main()
> {
> int a,b;
> ...


Das war aber auch schon das Maximum, was ich daraus ziehen konnte. Wie ich das auf die Stellenbestimmung und Ziffernausgabe umlenken soll, ist schon/noch Ende.

lg
Angie


----------



## Java/CppProgrammer (24. Oktober 2004)

Ich habe einen Lösungsansatz, weiß aber nicht ganz wo der Fehler liegt  :-( . 
Naja poste ihn trotzdem, vieleicht findet ein anderer den Fehler 


```
#include <iostream>

using namespace std;
//Beispiel 789 zweite ziffer von rechts
int main()
{
  int zahl;
  int zifferrechts;
  cout<<"geben sie die zahl ein"<<'\n';//789
  cin>>zahl;
  cout<<"geben sie an, an welcher stelle die gesuchte ziffer   von   rechts steht"<<'\n';//2
  cin>>zifferrechts;
int loesung;
loesung=zahl%(10^zifferrechts);//89
loesung=loesung-(loesung%(10^(zifferrechts-1)));//80
loesung=loesung/(10^(zifferrechts-1));//8
cout<<loesung<<'\n';
}
```


----------



## Java/CppProgrammer (24. Oktober 2004)

Hier ne Lösung: (Das sieht wegen der ganzen casts so unübersichtlich aus)

```
#include <iostream>
#include <cmath>
using namespace std;
//Beispiel 789 zweite ziffer von rechts
int main()
{
  int zahl;
  int zifferrechts;
  cout<<"geben sie die zahl ein"<<'\n';//789
  cin>>zahl;
  cout<<"geben sie an, an welcher stelle die gesuchte ziffer   von   rechts steht"<<'\n';//2
  cin>>zifferrechts;
int loesung;
loesung=zahl%( static_cast<int> (pow(10.0, static_cast<double>(  zifferrechts))));//89
loesung=loesung-(loesung%( static_cast<int> (pow(10,(static_cast<double> ( zifferrechts) -1.0)))));//80
loesung=loesung/static_cast<int>( pow(10,static_cast<double>( zifferrechts)-1.0));//8
cout<<loesung<<'\n';
}
```

Die Formel für meinen Rechenweg ist eigentlich nur 
(zahl%(10^gesuchteziffervonrechts))-(zahl%(10^gesuchteziffervonrechts-1))/(10^(gesuchteziffervonrechts-1))
Warum das so ist überlass ich dir.(Musst ja auch was zu tun haben)


----------



## squeaker (24. Oktober 2004)

Schau auch mal ins java-Forum. Thomas hat eine sehr elegante Lösung gefunden.


----------



## Thomas Darimont (24. Oktober 2004)

Hallo!

Habs mal kurz portiert:


```
#include <iostream>
#include <stdlib.h>
#include <math.h>

using namespace std;

int getZahlAnStelle(const int zahl, const int stelle){
      return int(zahl/pow(10.0,int(log10(double(zahl))-stelle))) % 10;
}    

int main(int argc, char *argv[])
{
  int zahl=1358;
  int stelle = 2;
  /*
  cout << "Geben sie eine Zahl ein: ";
  cin >> zahl;
  cout << "Welche Stelle wollen sie sehen? ";
  cin >> stelle;
  */
  cout << zahl << " " << stelle <<endl << getZahlAnStelle(zahl,stelle)<< endl;
  
  system("PAUSE");	
  return 0;
}
```

Gruß Tom


----------



## Sick-Angel (24. Oktober 2004)

Hallo zusammen,

erstmal VIEEEEEEELEN dank für die zahlreichen Antworten! Ihr habt mir echt enorm weitergeholfen. Denke, so langsam sickert das Mod-Zeugs auch bei mir durch, werd aber wohl noch n bisschen damit rumspielen müssen.

Den Code von Java/CppProgrammer hab ich genauer unter die Lupe genommen, und es erscheint mir recht einleuchtend. 
Hab nur noch 2 Fragen dazu:
- Gibts einen Unterschied zwischen #include <cmath> und #include <math.h> ? Wir hatten nur letzteres im Unterricht durchgenommen.
- Was macht "pow" genau?

lg,
Angie


----------



## Thomas Darimont (24. Oktober 2004)

Hallo!

Zu den Header Datein schaust du hier:
http://www.tutorials.de/forum/showthread.php?postid=109957

Die Funktion pow(a,b) macht nichts anderes als a hoch b zurückzugeben (eben a als Basis und b als Exponent -> b-te Potenz von a.

HTH
Gruß Tom


----------



## Sick-Angel (24. Oktober 2004)

Thomas Darimont hat gesagt.:
			
		

> Zu den Header Datein schaust du hier:
> http://www.tutorials.de/forum/showthread.php?postid=109957


zum cmath steht nix dabei. *?* was math.h kann, hatten wir schon. deswegen auch meine frage zum unterschied zu cmath (falls es einen gibt)


----------



## NinjaOne (25. Oktober 2004)

- Schreiben Sie ein Programm, das zwei Zahlen m und n einliest und die n-te Ziffer der Zahl m ausgibt
z.B. m=1358 n=2 Ausgabe: 5 

Hallo Sick-Angel,
ich weiß zwar nicht wofür du %(Rest) benutzen möchtest, aber das Problem würde ich so lösen. Das mit der ein und Ausgabe bekommst du ja hin also nur das wesendliche.

int m=1358;
int n=2;
char Buffer[100]="";
char Ergebnis=0;

sprintf(Buffer,"%d",m);
if(strlen(Buffer)>=n) Ergebnis=Buffer[n];

oder 

int m=1358;
int n=2;
CString Buffer="";
char Ergebnis=0;

Buffer.Format("%d",m);
if(Buffer.GetLength()>=n) Ergebnis=Buffer.GetAt;

Aber was man da mit der Rest-Funktion machen möchte ?

Ich hoffe ich konnte dir Helfen.
bye.


----------

