# wörter in zahlen umwandeln!



## daniel_hh (12. Oktober 2004)

Hallo, eine frage hab ich noch. Und zwar wie kann ich denn in das Prgramm z.B. zahlen in das Programm eingeben wie "drei" und er gibt mir als ergebnis 3 aus?


----------



## Java/CppProgrammer (12. Oktober 2004)

Meinst du das Programm ?


```
#include <iostream>
#include <string>
#include <ctype>

using namespace std;

string unter20(unsigned long wert, bool eins)
{
  switch(wert)
    {
      case 1:
        if(eins)
          return("eins");
        else
          return("ein");
      case 2: return("zwei");
      case 3: return("drei");
      case 4: return("vier");
      case 5: return("fuenf");
      case 6: return("sechs");
      case 7: return("sieben");
      case 8: return("acht");
      case 9: return("neun");
      case 10: return("zehn");
      case 11: return("elf");
      case 12: return("zwoelf");
      case 13: return("dreizehn");
      case 14: return("vierzehn");
      case 15: return("fuenfzehn");
      case 16: return("sechszehn");
      case 17: return("siebzehn");
      case 18: return("achtzehn");
      case 19: return("neunzehn");
      default: return("-Fehler-");
    }
}

//*******************************************************

string zehner(unsigned long wert)
{
  switch(wert/10)
    {
      case 2: return("zwanzig");
      case 3: return("dreissig");
      case 4: return("vierzig");
      case 5: return("fuenfzig");
      case 6: return("sechzig");
      case 7: return("siebzig");
      case 8: return("achtzig");
      case 9: return("neunzig");
      default: return("-Fehler-");
    }
}

//*******************************************************

string unter100(unsigned long wert,bool eins)
{

  if(wert<20)
    return(unter20(wert,eins));

  if(wert%10)
    return(unter20(wert%10,false)+"und"+zehner(wert));
  else
    return(zehner(wert));
}

//*******************************************************

string unter1000(unsigned long wert, bool eins)
{
  if(wert<100)
    return(unter100(wert,eins));

  if(wert%100)
    return(unter20(wert/100,false)+"hundert"+unter100(wert%100,eins));
  else
    return(unter20(wert/100,false)+"hundert");
}

//*******************************************************

string tausend(unsigned long wert)
{
  string s="";
  if(wert>=1000)
    s=unter1000(wert/1000,false)+"tausend";
  if(wert%1000)
    s+=unter1000(wert%1000,true);
  return(s);

}

//*******************************************************

string million(unsigned long wert)
{
  string s="";
  if(wert>=1000000)
    {
      int mil=wert/1000000;
      if(mil==1)
        s="einemillion";
      else
        s=unter1000(mil,false)+"millionen";
      wert%=1000000;
    }
  return(s+tausend(wert));
}

//*******************************************************

string milliarde(unsigned long wert)
{
  string s="";
  if(wert>=1000000000)
    {
      int mil=wert/1000000000;
      if(mil==1)
        s="einemilliarde";
      else
        s=unter1000(mil,false)+"milliarden";
      wert%=1000000000;
    }

  return(s+million(wert));
}

//*******************************************************

string toWord(unsigned long wert)
{
  if(wert==0)
    return("Null");

  string s=milliarde(wert);
  s[0]=toupper(s[0]);
  return(s);
}

//*******************************************************




int main()
{
unsigned long wert;

  cout << "Bitte Zahl eingeben:";
  cin >> wert;
  cout << toWord(wert) << endl;

        return 0;
}
```


----------



## daniel_hh (12. Oktober 2004)

ne meine es genau andersrum. Bei diesem Programm wird ja ne Zahl eingegeben und dann sagt er dir das Wort. Aber ich wollte das genau andersrum, also drei eingeben und 3 rausbekommen!


----------



## Java/CppProgrammer (12. Oktober 2004)

Wie groß sollen die Zahlen den sein? Wenns nur bis 20 geht kann man ja sowas machen:
(if eingabe=="zwanzig")


----------



## daniel_hh (12. Oktober 2004)

ja klar das kann man machen aber ich will ja nicht 1 milliarde mal If eingabe ... machen. Wiest du wie das mit funktionen geht?


----------



## Tobias K. (12. Oktober 2004)

moin


Das läßt sich auch einfacher mit weniger if machen!
In welcher Sprache soll es denn sein? C oder C++?


mfg
umbrasaxum


----------



## Java/CppProgrammer (12. Oktober 2004)

Ich hab die Lösung schon ,ich bräuchte nur eine Methode um 2 Strings zu vergleichen(nicht lexikographisch). Allerdings 2 C++ strings aus der STL (strcmp fuktioniert leider nicht))
Das wäre die Lösung (wenn auch unsauber) man müsste nur noch strcmp ersetzen.


```
int main()
{
  char wert[200];
  cout << "Bitte Zahl eingeben:";
  cin >> wert;
  cout<<wert;
  string r(wert);
  int x=0;
  while((strcmp(r,toWord(x)))!=0)
  { 
	 x++;
  }
  cout<<x;	  
  int y;
  cin>>y;
  

        return 0;
}
```


----------



## daniel_hh (12. Oktober 2004)

In C++ soll das sein Ich habs mal so veruscht.
char main(char wert) 

{ 
  switch(wert) 
    { 

      case 'zwei': return('2'); 
      } 

  cin>> wert;
  cout << wert;
} 

Aber leider gibt er mir immer wenn ich zwei eintippe z aus. Wisst ihr was ich verändern muss oder geht es garnicht?


----------



## Tobias K. (12. Oktober 2004)

moin


Hier eine möglichkeit:

```
struct zahl
{
	char zahltext[10];
} zahl[10];

int _tmain(int argc, _TCHAR* argv[])
{
	char text[10];
	

	strcat(zahl[0].zahltext, "null");
	strcat(zahl[1].zahltext, "eins");
	strcat(zahl[2].zahltext, "zwei");
	strcat(zahl[3].zahltext, "drei");
	strcat(zahl[4].zahltext, "vier");

	cin>> text;
	
	int i=0;
	while(i<=10)
	{
		if(strcmp(zahl[i].zahltext, text)==0)
		{
			cout<< i;
			break;
		}
        i++;
	}
         
         return 0;
}
```

Muss zugeben ist ne mischung aus C und C++ läuft aber ohne Probleme.

Zu dienem verushc mit " case 'zwei' " das geht weder bei C noch bei C++, so etwas geht "erst" bei C# und vielleicht bei C.Net.

Egal wie du es machst wirst du nie darum herumkommen erstmal die Zahlen als Text in deinen Quellcode zuschrieben! Oder du speicherst sie erst in einer Datei und liesst sie dann aus, aber das würde ich sagen erstmal nciht.



mfg
umbrasaxum


----------



## Tobias K. (12. Oktober 2004)

moin


Es wird nur ein z ausgegeben weil dein char wert nur ein Zeichen aufnehmen kann, also das erste deines eingegeben strings!

Kann es sein das du noch nciht viel mit C/C++ gemacht hast?
Es scheint als fehlt dir das Grundwissen das man selbst für do simple Sachen haben muss.


@Java/CppProgrammer
Das ist deine Lösung?! Ich wette so läuft sie nicht! Warum erhöhst du x wenn du es eh nciht wieder benutzt?! Kann es sein das du ne Schleife vergessen hast.


mfg
umbrasaxum


----------



## Java/CppProgrammer (12. Oktober 2004)

So jetzt funktioniert es, hier der Sorce( falls mans übersieht, das "tuupper" aus der Funktion stringtoWord ist gelöscht worden):


```
string toWord(unsigned long wert)
{
  if(wert==0)
    return("Null");

  string s=milliarde(wert);
  return(s);
}

//*******************************************************

int main()
{
  string r;
  string s;
  cin>>r;
  int x=0;
  s=toWord(x);
  while((strcmp(r.c_str(),s.c_str()))!=0)
  {
	  x++;
	  s=toWord(x);
  }
  cout<<x;

  int y;
  cin>>y;
return 0;
}
```


----------



## Tobias K. (12. Oktober 2004)

moin


Erklär mal bitte was dein Code macht?!
Wozu die Schleife?
UNd mit deiner Funktion kommst du an den if abfragen auch nciht vorbei, also genau das gleiche wie deiner erste "Version" nur das die if Abfragen in einerr eigenen Funktion stehen.


mfg
umbrasaxum


----------



## Java/CppProgrammer (12. Oktober 2004)

1. Das Programm funktioniert! Auch ohne dass ich if eingbaut habe.( Das if in der ersten Version war ein Versehen, es sollte while heißen)
2. Es funktioniert nach einem eigentlich sehr sehr leicht verständlich Prinzip: 
Dem String s wird als erstes der Rückgabewert von toWord (0) zugewiesen.
Dann startet die while schleife, die solange läuft, bis (strcmp(r.c_str(),s.c_str())) 0 ist, die Strings also gleich sind. Die Schleife erhört mit jedem Durchlauft den Wert den toWord zurückliefert. 


Irgentwie scheint es mir als hättest du irgentwas gegen mich.

Eigentlich gar nicht so schwer


----------



## Beichtpfarrer (12. Oktober 2004)

toll......
Auf diese Weise musst du den gesamten Zahlenbereich als string abspeichern, den du kennen willst.
Bei einem normalen 4 Byte-Int sprengt die Datenmasse wahrscheinlich deine Festplatte.

Denk doch mal über methodischeres Vorgehen nach.

Ich habe eine Funktion für Zahlen->String umwandlung geschrieben und denke, mit ein wenig nachdenken (Was glaubst du, was ein Programmierer macht? -> Algorithmen entwerfen) könnte man die auch umkehren um es für deine Zwecke String->Zahl -Umwandlung zu benutzen.


```
string unter20[]={"","ein","zwei","drei","vier","fuenf","sechs","sieben","acht","neun","zehn","elf","zwoelf","dreizehn","vierzehn","fuenfzehn","sechszehn","siebzehn","achtzehn","neunzehn"};
string zehner []={"","zehn","zwanzig","dreissig","vierzig","fuenfzig","sechzig","siebzig","achtzig","neunzig"};
string gruppen[]={"","tausend","millionen","milliarden","billionen","billiarden","trillionen","trilliarden","quadrillionen"};


string getstring(int value){
	string result;
	bool bMinus = false;
	if(value<0){
		bMinus = true;
		value = -value;
	}
	if(value==0)
		result = "null";
	else if(value%1000==1){
		result = "minus";
		value/=1000;
	}
	int i = 0;
	while(value){
		result=gruppen[i++] + result;
		if(value%100<20)
			result = unter20[value%100] + result;
		else{
			result=zehner[value%100/10]+result;
			if(value%10)
				result=unter20[value%10]+"und"+result;
		}
		if(value%1000>=100)
			result = unter20[value%1000/100] + "hundert" + result;
		value /= 1000;
	}
	return (bMinus?"minus ":"")+result;
}
```


----------



## Tobias K. (12. Oktober 2004)

moin


@Java/CppProgrammer
Nö, hab nchts gegen dich, finde nur deine Art zu Programmieren merkwürdig.


@Beichtpfarrer
Du hast recht.
Nur bin ich mir nciht sicher, ob man so sehr auf deiner Funktion aufbauen kann/sollte.

Bei Eingaben wie "neunzehntausend" wird es wohl eher ums parsen und dann wieder ums vergleichen gehen. Aber trotzdem hast du mich auf gute Ideen gebracht werde mich gleich mal ranmachen.

Und gibt es bei dir nicht ein Problem wenn man eine 1 eingibt?!


mfg
umbrasaxum


----------



## Java/CppProgrammer (12. Oktober 2004)

Beichtpfarrer hat gesagt.:
			
		

> toll......
> Auf diese Weise musst du den gesamten Zahlenbereich als string abspeichern, den du kennen willst.
> Bei einem normalen 4 Byte-Int sprengt die Datenmasse wahrscheinlich deine Festplatte.



Wieso sollte ich den ganzen Zahlenbereich abspeichern? 
Beim dem Aufruf von toWord wird doch immer nur eine Zahl als String erstellt benutz und gelöscht. 
Also hab ich immer nur einen String.
Das Programm läuft zugegebenermaßen extrem langsam, es war auch nur eine erste Lösung für seine Frage.
Irgentwie versteh ich nicht warum das Programm so langsam läuft.


> Ich habe eine Funktion für Zahlen->String umwandlung geschrieben und denke, mit ein wenig nachdenken (Was glaubst du, was ein Programmierer macht? -> Algorithmen entwerfen) könnte man die auch umkehren um es für deine Zwecke String->Zahl -Umwandlung zu benutzen.



Genau das hab ich auch gemacht, wenn du dr meinen ersten geposteten code ansiehst,nähmlich eine Funktion Zahlen->String.
Dann habe ich durch überlegen(jaja sowas macht ein Programmierer)
das Ding umgedreht. 
Das das langam ist sehe ich ein. Tut mir leid, ich bin halt noch ein Newbie.


----------



## Beichtpfarrer (12. Oktober 2004)

Stimmt, musste gar nicht den gesamten Zahlenbereich speichern 
Ich habs nicht richtig angeguckt, sondern nur _otf_ gesehen, dass in einer while verglichen wurde.
Der Kommentar mit dem Überlegen war übrigens nicht auf dich abgezielt, sondern vielmehr auf den Fragesteller.

Warum das so langsam ist, sollte ja wohl klar sein:
-Erstellung von Zahlenstrings für jede Zahl unterhalb der gewünschten
-dabei oft Speicherreservierung usw für string-Klasse
-Vergleichen von ewig vielen Strings


@umbrasaxum
Warum, was für ein Problem bei 1 ?
Klar muss man da parsen und kann sicher nicht nur einfach abschreiben.
Ich mein vom Konzept her...


----------



## Tobias K. (12. Oktober 2004)

moin

Ja vom Konzept her hast du absolut recht! Da wollt ich auch ncihts gegen sagen.

Bei eins ist deine Ausgabe doch "ein"?!
Man mag mich pingelig nennen aber das finde ich falsch.


mfg
umbrasaxum


----------



## Beichtpfarrer (12. Oktober 2004)

äh, lol, hatte nen kleinen Tippfehler...

```
else if(value%1000==1){
		result = "minus";
		value/=1000;
	}
```
sollte eigentlich heißen (das hatte ich vorher auch schonmal so, aber wohl irgendwann wieder vertauscht...)

```
else if(value%1000==1){
		result = "eins";
		value/=1000;
	}
```


----------



## Tobias K. (12. Oktober 2004)

moin


Ja so siehts doch besser aus 


mfg
umbrasaxum


----------



## Beichtpfarrer (12. Oktober 2004)

Die erste Variante macht auch relativ wenig Sinn....


----------



## daniel_hh (12. Oktober 2004)

kann man das auch so machen das man zahlen als wörter eingeben kann und gleichzeitig als zahlen?


----------



## Tobias K. (12. Oktober 2004)

moin


Du willst gleichzeitig eine Zahl und ein Wort eingeben?! Das will ich sehen!


Falls du ein Programm meinst das von Zahlen nach Text und umgekehrt kann, dann kann ich sagen ja das geht.

Du brauchst dann aber wohl zwei Funktionen für die verschiedenen Fälle die du nach bedarf Aufrufst und vorher halt Prüfen ob des Eingegebene aus Zahlen oder Buchstaben besteht.


mfg
umbrasaxum


----------

