DRINGEND! Ziffern aus einer mehrstelligen Zahl extrahieren



  • Hallo,

    ich habe ein Problem, dass mich schon mehrere Stunden beschäftigt!
    Und zwar lautet die Fragestellung: (Es geht um eine Telefonauskunft-Aufgabe)
    "Lesen Sie die n-Stellige Telefonnummer ein und extrahieren Sie die Ziffern der eingegebenen Telefonnummer. Legen Sie diese in dem Feld "nummer" ab."
    Ich hab das ganze dann mal folgendermaßen ausprobiert
    ...
    for (int a=0; a<b; a++)
    {
    nummer[a]=telefonnummer/pow(10,N-1);
    telefonnummer = telefonnummer - nummer[a]*(pow(10,N-1));
    N--;
    cout << (a+1) << ". Stelle der eingegebenen Nummer lautet: " << nummer[a]<< endl;
    }
    ...wobei telefonnummer vom typ int ist, N die Anzahl der Stellen, die man eingeben sollte.

    Das Problem ist jetzt halt, dass die Operationen in der Schleife die Ziffern nicht richtig bei großem N extrahieren. Bsp.: ich gebe z.B. folgende Telefonnummer ein: 94702563, d.h. N=8.
    Dann wird mir folgendes ausgegeben:
    ...
    8. Ziffer der Telefonnummer lautet: 0.
    Alle anderen Ziffern stimmen! nur diese letzte z.B. nicht.
    Es kommt auch vor, dass die Vorletzte Ziffer auch nicht stimmt.

    Was hab ich falsch gemacht bzw. gibt es eine bessere (elegantere) Methode Ziffern aus einer mehrstelligen Zahl zu extrahieren???
    Ich bin Neu in diesem Gebiet, deshalb kenn ich mich noch nicht so aus.

    Vielen herzlichen Dank schon mal im Voraus!

    Gruß,
    Chris



  • Entweder immer %10 und dann durch 10 teilen, bis halt nix mehr übrig ist, damit kriegste die Ziffern rückwärts. Oder für faule: benutze nen stringstream, schieb die Zahl rein und hol characters raus. Ist vermutlich etwas langsamer, dafür gibt's als Bonus gleich noch korrekte Formatierung, Minuszeichen etc.



  • Hi,

    mann, des ging aber schnell...unglaublich! 🙂
    also erstmal vieln dank für die antwort...
    ich weis allerdings nicht, wie die syntax für deinen zweiten vorschlag aussieht.
    Hab noch nicht so viel mit C++ zu tun gehabt.
    Könntest du eine Beispielzeile hinschreiben?
    Muss man eigentlich für dieses stringstream irgendwas deklarieren?
    Ich hab ehrlich gesagt keine Ahnung! 😞

    Vielen Dank!

    Grüße



  • Hallo

    siehe C++ FAQ, Thread Einmal String und zurück

    bis bald
    akari



  • hmm..hab da alles durchgesucht & versucht ein paar Dinge in mein Programm einzubinden. Es funktioniert einfach nicht! Ich bin kurz vor dem Verzweifeln!!! Bin schon die letzte Nacht bis um 3 davor gesessen & heut morgen bis jetzt auch nochmal. ich bekomm das einfach nicht hin.
    Muss die Aufgabe bis zum Mo. haben & das wird ein Problem werden! 🙂

    Ohje, also falls doch noch jemand ne Idee hat, würd ich mich sehr freuen!
    Ich weis auch nicht, was ich falsch gemacht habe..
    Hier viell. mal die Aufgabenstellung (die erste Aufgabe des Blattes)
    http://www.rz.uni-karlsruhe.de/~ae19/cpp/cppblatt6.pdf

    Gruß,
    Chris



  • Wenn du etwas von deinem Code postest, dann könnte man dir evtl. besser helfen bzw. dir erklären warum/was genau falsch ist... 🙂



  • ja, simmt eigentlich...daran hab ich vor lauter genervt sein nicht mehr dran gedacht! 😉

    Hier mein (noch unvollständiger) Code:

    #include<iostream>
    #include<cstdlib>
    #include<ctime>
    #include<math.h>
    #include <sstream>
    #include <string>
    using namespace std;

    int main()
    {
    int P; //Anzahl P der Zufallsziffern
    int N; //Anzahl N der Ziffern der Telefonnummer
    int telefonnummer,telefonnummer_extrahiert;
    int *ziffernfolge, *nummer; //Zeiger
    srand((unsigned int) time(NULL)); //Zufallsgenerator initialisieren

    cout << "Wieviele Ziffern in Zufallsziffernfolge?: ";
    cin >> P; //Hier wird die Anzahl P der Zufallsziffernfolge eingelesen

    ziffernfolge = new int [P]; //Für das dynamische Feld "ziffernfolge" wird Speicher der Größe P bereitgestellt

    for (int a=0; a<=P; a++) //Hier werden die Zufallszahlen 0 bis 9 generiert und stückweise im Feld gespeichert
    {
    ziffernfolge[a] = rand()%10;
    }

    cout << "Die ersten 20 Zahlen lauten: ";
    for (int a=0; a<=20; a++) //Ausgabe der ersten 20 Zufallszahlen die in der obigen for-Schleife generiert wurden
    {
    cout << ziffernfolge[a];
    }

    do //Laut Aufgabenstellung soll hier der Benutzer wiederholt Telefonnummern eingeben könne
    //..dazu nehm ich jetzt einfach mal eine do-/while-Schleife,
    //..die ständig von Anfang an durchlaufen werden soll, solange meine Eingabe nicht der Zahl 0 entspricht
    //..wird eine 0 eingegeben, so bricht die Schleife ab & man kann keine Telefonnummern eingeben
    {
    cout << "\nWieviele Stellen hat die Telefonnummer? (Maximal=9, Abbruch=0)";
    cin >> N; //Anzahl der Ziffern wird hier eingelesen

    nummer = new int [N]; //Für das dynamische Feld "nummer" wird Speicher der Größe N bereitgestellt

    cout << "Bitte Nummer mit "<< N <<" Ziffern eingeben: ";
    cin >> telefonnummer;

    int b=N;

    for (int a=0; a<b; a++) //hier wird jetzt die Telefonnummer extrahiert,d.h. es werden die einzelnen Ziffern in dem Feld "nummer" gespeichert
    {
    nummer[a]=telefonnummer/pow(10,N-1);
    cout << (a+1) << ". Stelle der eingegebenen Nummer lautet: " << nummer[a] << endl;
    telefonnummer = telefonnummer - nummer[a]*pow(10,N-1);
    N--;
    }

    delete [] nummer; //Löschen der Nummer

    ...........hier kommt dann noch der Rest der Aufgabe rein, von dem ich nicht weis, wie ich ihn schreiben soll!...............
    }
    while (N!=0);

    delete [] ziffernfolge; //Löschen der Ziffernfolge

    system("pause");
    }

    Was ich auch noch nicht so recht weis, wie ich dann da die Ziffern mit den Zufallszahlen vergleichen soll. Ich hab zwar eine Idee, weis aber nicht, wie ich diese in "Codeform" bringen soll!

    Hey, das ist das beste Forum...find ich echt klasse, dass hier so schnell einem geholfen wird!!!



  • smoothydoo schrieb:

    cout << "Die ersten 20 Zahlen lauten: ";
        for (int a=0; a<=20; a++) //Ausgabe der ersten 20 Zufallszahlen die in der obigen for-Schleife generiert wurden
        {
            cout << ziffernfolge[a];
        }
    

    Hier solltest du noch etwas machen. Laut deinem Code ist nicht sichergestellt, dass auch wirklich 20 Zufallszahlen generiert werden. Eine einfache Absicherung wäre zB dies

    for (int a=0; a <= (P < 20 ? P : 20); a++)
    

    Und das Eingeben der Telefonnummer würde ich über einen String realisieren, denn du kannst nicht davon ausgehen, dass int wirklich die Grösse für die geforderte Anzahl an Stellen bietet. Mittels dieses Strings ist es dann auch relativ einfach, alle Ziffern zu extrahieren.

    string telefonnummer;
    do
    {
        cout << "\nWieviele Stellen hat die Telefonnummer? (Maximal=9, Abbruch=0)";
        cin >> N; //Anzahl der Ziffern wird hier eingelesen
    
        nummer = new int [N]; //Für das dynamische Feld "nummer" wird Speicher der Größe N bereitgestellt
    
        cout << "Bitte Nummer mit "<< N <<" Ziffern eingeben: ";
        cin >> telefonnummer;
    
        for (int a=0; a<N; a++) //hier wird jetzt die Telefonnummer extrahiert,d.h. es werden die einzelnen Ziffern in dem Feld "nummer" gespeichert
        {
            nummer[a] = telefonnummer[a] - '0';
            cout << (a+1) << ". Stelle der eingegebenen Nummer lautet: " << nummer[a] << endl;
        }
    
        // hier kommt dann noch der Rest der Aufgabe rein, von dem ich nicht weis, wie ich ihn schreiben soll!
    
        delete [] nummer;                             //Löschen der Nummer
    
    }
    while (N!=0);
    

    Damit kannst du auch <math.h> weglassen. Und falls du den Header doch brauchst, dann nimm bitte <cmath>.

    Was den bisher noch nicht umgesetzten Teil betrifft, da kann ich ehrlich gesagt nur raten, weil ich nicht weiss, was "die Ziffern mit den Zufallszahlen vergleichen" genau bedeuten soll. Die einzelnen Stellen auf Gleichheit zu vergleichen, kannst du ja mittels einer einfachen Schleife realisieren.

    for (int a=0; a < (P<N) ? P : N; a++)
    {
        if (ziffernfolge[a] == nummer[a])
            // gleich
        else
            // nicht gleich
    }
    


  • Kommt mir bekannt vor! *such* *rumpfusch*

    #include <iostream>
    #include <ctime> /* ist ja c++ und net c */
    #include <cstdlib>
    
    typedef unsigned uint;
    
    int main()
    {
        using namespace std;
        srand(uint(time(0))); /* meistens in c++ 0 anstatt NULL */
    
        uint ziffern;
        cout << "Wieviele Ziffern in Zufallsziffernfolge? ";
        cin >> ziffern;
    
        int* ziffernfolge = new int[ziffern];
        for(uint i=0; i<ziffern; ++i) {
            ziffernfolge[i] = rand() % 10;
        }
    
        int max = ziffern > 20 ? 20 : ziffern;
        cout << "Die ersten " << max << " Ziffern lauten: ";
        for(uint i=0; i<max; ++i) {
            cout << ziffernfolge[i];
        }
        cout << endl;
    
        while(1) {
    
            uint stellen;
            cout << "Wieviele Stellen hat die Telefonnummer "
                << "(Maximal 9, Abbruch=0) ? ";
            cin >> stellen;
            if(stellen==0 || stellen>9) break;
    
            uint eingabe;
            cout << "Bitte Nummer mit " << stellen << " Ziffern eingeben : ";
            cin >> eingabe;
    
            int* nummer = new int[stellen];
            int num = eingabe;
            for(uint i=0; i<stellen; ++i, num/=10) {
                nummer[stellen-i-1] = num % 10;
            }
            if(num/10 > 0) {
                cout << "Eingegebene Zahl ist zu lange!" << endl;
                delete[] nummer;
                continue;
            }
    
            bool gefunden;
            for(uint suche=0; suche<ziffern-stellen; ++suche) {
                gefunden = true;
                for(uint stelle=0; stelle<stellen; ++stelle) {
                    if(nummer[stelle] != ziffernfolge[suche + stelle]) {
                        gefunden = false;
                        break;
                    }
                }
                if(gefunden) {
                    cout << eingabe << " wurde an der " << suche
                        << "-ten Stelle gefunden!" << endl;
                    break;
                }
            }
            if(gefunden == false) {
                cout << "Schade! " << eingabe << " wurde nicht gefunden."  << endl;
            }
    
            delete[] nummer;
        }
    
        delete[] ziffernfolge;
    }
    

    Das ist so gewollt und nicht mit dem String!


Anmelden zum Antworten