Forum: Compiler & IDEs Double Wert in einzelne Ziffern aufteilen


von H. C. (sunshine)


Lesenswert?

Hi,

ich schreibe eine Applikation in einer C-Verwandten programmiersprache.

Hier möchte ich meinen Double-Wert z.B. 18.34623 ein Einzelziffern 
aufteilen, so dass ich die einzelnen Ziffern durch aufruf eines 
Soundfiles als Ton ausgeben lassen kann.
Meine Tondateien habe ich entsprechend bezeichnet
"eins.wav", zwei.wav", "punkt.wav" usw.

Nur wie teile ich meinen Double Wert geschickt in die ein?

Ich dachte erst an DoubleToStr(x) und diesen String dann Ziffer für 
Ziffer durchzugehen.
Allerdings liefert meine Funktion StrToInteger() liefert auch beim 
Aufruf StrToInteger(".") den Wert 0 zurück, so dass ich nicht 
unterscheiden kann, ob es wirklich eine 0 ist, oder nur der Punkt :-(

Übersehe ich hier gerade eine leichte Lösung?

von radiostar (Gast)


Lesenswert?

H. C. schrieb:
> Übersehe ich hier gerade eine leichte Lösung?

char c = string[i];

if (c == '0') then..
else if (c == '1') then..
else...

von Karl H. (kbuchegg)


Lesenswert?

H. C. schrieb:

> Ich dachte erst an DoubleToStr(x) und diesen String dann Ziffer für
> Ziffer durchzugehen.
> Allerdings liefert meine Funktion StrToInteger() liefert auch beim
> Aufruf StrToInteger(".")

Was jetzt?
DoubleToStr oder StrToInteger?

> den Wert 0 zurück, so dass ich nicht
> unterscheiden kann, ob es wirklich eine 0 ist, oder nur der Punkt :-(

Und?
einen String kann man zum Beispiel auch vorab abtesten, ob er nur aus 
einem Punkt besteht. Und eine Funktion StrToInteger ist auch nicht von 
Gott gegeben und in Stein gemeisselt.

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

radiostar schrieb:
> H. C. schrieb:
>> Übersehe ich hier gerade eine leichte Lösung?
>
> char c = string[i];
>
> if (c == '0') then..
> else if (c == '1') then..
> else...

Da ist switch/case aber eleganter:
1
switch (c)
2
{
3
    case 0: soundfile = "null.wav"; break;
4
    case 1: soundfile = "eins.wav"; break;
5
    ....
6
};

von radiostar (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Da ist switch/case aber eleganter:

Oh, Mann. Ich wollte keinen Schönheitswettbewerb gewinnen, sondern eine 
Lösungsmöglichkeit aufzeigen.

von Karl H. (kbuchegg)


Lesenswert?

Fragt sich nur fuer welche Fragestellung du eine Loesungsmoeglichkeit 
aufzeigst. Fuer die Frage des TO jedenfalls nicht

von Anhalter (Gast)


Lesenswert?

Karl Heinz schrieb:
> Fragt sich nur fuer welche Fragestellung du eine
> Loesungsmoeglichkeit
> aufzeigst. Fuer die Frage des TO jedenfalls nicht

Die Lösung ist richtig. Die Frage ist falsch.

von radiostar (Gast)


Lesenswert?

Karl Heinz schrieb:
> Fragt sich nur fuer welche Fragestellung du eine Loesungsmoeglichkeit
> aufzeigst. Fuer die Frage des TO jedenfalls nicht

Hmm. Ein wenig Mitdenken erwarte ich schon. Klar: wenn eine 
ausformulierte Plug-andPlay-Lösung erwartet wird, dann ist mein 
Vorschlag unzureichend. Aber muß man alles bis ins Letzte vorkauen?

von Amateur (Gast)


Lesenswert?

double Zahl;
char   Puffer [ 20 ];
sprintf ( Puffer, "%f", Zahl );

for ( int Zaehler = 0; Puffer [ Zaehler ] != '\0'; ++Zaehler ) {
  switch ( Puffer [ Zaehler ] ) {
    '0': Null_Wav_Raus ();
         break;
    '1': Null_Wav_Raus ();
         break;
         ...;
         break;
    '9': Neun_Wav_Raus ();
         break;
    '.': Punkt_Wav_Raus (); // oder Komma
         break;
    default: Mist_Im_String_Wav_Raus();
  }
}
... oder so

von Karl H. (kbuchegg)


Lesenswert?

radiostar schrieb:
> Karl Heinz schrieb:
>> Fragt sich nur fuer welche Fragestellung du eine Loesungsmoeglichkeit
>> aufzeigst. Fuer die Frage des TO jedenfalls nicht
>
> Hmm. Ein wenig Mitdenken erwarte ich schon. Klar: wenn eine
> ausformulierte Plug-andPlay-Lösung erwartet wird, dann ist mein
> Vorschlag unzureichend. Aber muß man alles bis ins Letzte vorkauen?

LIes dir noch mal das Anfangsposting durch und stell dir dabei eine 
Frage.
Wobei hat er Probleme?
Beim erzeugen des Strings oder beim Auswerten der Character im String?

: Bearbeitet durch User
von H. C. (sunshine)


Lesenswert?

Hi,
danke für eure Hilfe und danke für den Tipp mit dem "zuvor" den String 
nach . oder , durchsuchen. Dieser Schritt hat mir im Kopf zu einer 
Lösung gefehlt :-)

Ich möchte nun gerne die Zahlen nicht der Reihe nach ausgeben, sondern 
so wie sie wirklich heißen. Dazu habe ich mir folgendes überlegt:

Ich benötige folgende Zahlen/Wörter als wav-Datei:
1-12
"zehn"
"zwanzig"
"dreißig"
"zig"
"hundert"
"tausend"
"und"
"komma"

Anschließend würde ich folgende Einteilungen vornehmen
zahl <= 12   --- direkte Ausgabe
12 < zahl <= 39   -- Einer-Stelle + "zehn" // "zwanzig" // "dreißig"
39 < zahl <= 99   -- Einer-Stelle + Zehnerzahl + "zig"
99 < zahl <= 999  -- Hunderterzahl + "hundert" + Einer-Stelle + 
Zehnerzahl + "zig"
usw.

Gibt es sowas bereits fertig in C programmiert?

von Amateur (Gast)


Lesenswert?

Wenn Du eine Bibliothek brauchst um Zahlen, die Du ja in rechnerlesbarer 
Form vorliegen hast - also vor der Konvertierung in das dezimale System 
- brauchst, so solltest Du Dir Dein Lehrgeld (Leergeld) zurückgeben 
lassen.

Du hast die Zerlegung ja schon fast fertig.

Übrigens: Der Text "vier" + "zig" klingt holpriger als "vierzig".

von chris (Gast)


Lesenswert?

H. C. schrieb:
> Ich benötige folgende Zahlen/Wörter als wav-Datei:

vergiss nicht die 17 ;)
Sieben-Zehn hört sich komischer an als Sieb-Zehn

von Rolf M. (rmagnus)


Lesenswert?

chris schrieb:
> H. C. schrieb:
>> Ich benötige folgende Zahlen/Wörter als wav-Datei:
>
> vergiss nicht die 17 ;)
> Sieben-Zehn hört sich komischer an als Sieb-Zehn

Das gilt natürlich auch für 70. Und sechs-zehn klingt auch eigenartig, 
oder gar eins-hundert-sieben-und-zehn-zig.

: Bearbeitet durch User
von H. C. (sunshine)


Lesenswert?

OK, danke für den Tipp!

Nun habe ich noch ein Problem mit meiner Applikation.
Diese arbeitete synchron und ich müsste nach dem Abspielen des 
jeweiligen Files angeben, wie lange danach "geschlafen" werden soll.

Gibt es irgendwie die Möglichkeit, die einzelnen wav-Datei temporär 
aneinanderzuheften, so dass meine Applikation nur noch eine einzelne 
wav-Datei aufrufen muss?!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

H. C. schrieb:
> ich müsste nach dem Abspielen des jeweiligen Files angeben, wie lange
> danach "geschlafen" werden soll.

Machs anders: lass Dir vom Abspieler ein Signal schicken, wenn er fertig 
ist, und warte ("schlafe") bis zum Eintreffen dieses Signals.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.