Frage zur Konvertierung in C++

Olli

9*UotD / 13*UotN
ID: 4117
L
21 April 2006
3.518
189
Hi,

ich habe hier mal einen Quelltext aus einem Lehrbuch für C++, leider verstehe ich überhaupt nicht, was das Programm machen soll. Kann mir da vielleicht jemand weiterhelfen?
Danke.

Code:
#include <iostream>
using namespace std;
const int MAX = 256;

int main()
{
    char input[MAX];
    int i = 0;
    double Wert = 0;
    
    cin.getline(input, MAX);
    while(input[i] >= '0' && input[i] <= '9')
    {
       Wert *= 10;
       Wert += input[i] - '0';
       i++;
    }
    if(input[i] == ',')
    {
       double NK = 1;
       i++;
       while(input[i] >= '0' && input[i] <= '9')
       {
           NK *= 10;
           Wert += (input[i] - '0') / NK;
           i++;
       }
    }
    cout << input << Wert << endl;
    system("pause");
    return 0;
}

Gruß
Olli
 
PHP:
#include <iostream> using namespace std; 
const int MAX = 256; 

//deine Mainmethode, die aufgerufen wird wenn du das Programm startest. hier gerade die einzige Funktion überhaupt.
int main() { 
  char input[MAX]; //String mit Maximallänger MAX wird initialisiert
  int i = 0;  
  double Wert = 0; 

  cin.getline(input, MAX); // liest eine Eingabezeile aus der Kommandoline aus
  while(input[i] >= '0' && input[i] <= '9') { //überprüft das chararray (den String zeichen für zeichen), ob eine Ziffer zwischen 0-9 eingegeben wird.
    Wert *= 10; 
    Wert += input[i] - '0'; //wandelt Zeichen in die zugehörige Ziffer um und addiert das Ganze.
    i++; 
  } 
  
  if(input[i] == ',') { //die whileschleife wurde verlassen - wurde statt einer Zahl ein Komma eingegeben?
    double NK = 1; //fließpunktzahl initialisieren.
    i++; 
    while (input[i] >= '0' && input[i] <= '9') { //ists nun wieder eine Ziffer?
      NK *= 10; 
      Wert += (input[i] - '0') / NK; //statt mit 10erpotenz multipliziert wird nun durch die jeweilige 10erpotenz dividiert und zusammengefügt.
      i++; 
    } 
  } 

  cout << input << Wert << endl; //gibt in der Kommandozeile die eigentliche Eingabe sowie den Wert des Programms aus. endl beginnt eine neue Zeile.
  system("pause"); //wartet auf anykey.
  return 0; 
}

Im Prinzip ist das nur der "Zu Fuß-Weg" um einen String in einen Double zu konvertieren. Du liest ein chararray ein und konvertierst (summierst die Stellen auf) des dann Stelle für Stelle in einen Double.

Es wäre schön gewesen wenn du geschrieben hättest zu welchem Kapitel der Code gehört und was du daraus lernen solltest :mrgreen:
Prinzipiell erwähnenswert für C-Neulinge:
:arrow: cin/cout sind Funktionen des <iostream> Paketes was du oben included hast. Die imho schönere Art des prints ;)
:arrow: es gibt auch eine String-Klasse CString, aber das hier sollte wohl wirklich der hardcore-zu-fuß-weg sein.
 
Naja, ein Kapitel gibt es da nicht wirklich.
Aber ich dachte, wenn ich chars eingebe (nach meinem Verständnis Buchstaben) würde das Programm mir die entsprechenden Zahlen des ASCII oder so ausgeben. Aber irgendwie scheint das Programm einfach alles so auszugeben, wie ich es eingebe.
Verstehe es immer noch nicht.

Gruß
Olli
 
jo das Programm wandelt deine chars nur halt in *echte* zahlen um ;) und zwar mit folgender Zeile:
Code:
 Wert += input[i] - '0';

da Wert ein Double ist, rechnet er halt mit den ASCII-Werten für die Chars weiter. Und diese zeile macht einfach nichts anderes, als von deinem char den Wert des Chars '0' (nämlich dezimal 48 ) abzuziehen.
in der ASCII-Tabelle siehst du ziemlich schnell, dass das Ergebnis von "input - 48" deine Ziffer sein muss.

Also wird in dem Programm einfach jeder char (an sich Buchstabe, muss aber ja zwischen 0-9 liegen, wie du in dem 1. while siehst) eingelesen, in einen double umgewandelt, danach mit seiner jeweiligen 10erPotenz multipiziert (damit du die Stellen wieder gut aufsummieren kannst) und aufsummiert. Ab dem Komma gehts halt in die andere Richtung weiter.

Das Programm ist dazu da, einen String in einen Double zu konvertieren. Die Ausgabe ist dabei recht ernüchternd (und MUSS ja übereinstimmen, das ist ja der Sinn des ganzen), geb ich zu.