STRESS mit C/C++ Hilfe!!!!



  • Ich weiß nich was du mit der Zeile anfangen willst, aber entweder du hast Wert mit großem W gemeint, dann musst du das natürlich hinschreiben, oder du hast wert mit kleinem W gemeint, dann musst du den Pointer dereferenzieren. Aber da kann man ehrlich gesagt auch selbst draufkommen.

    MfG



  • -.--



  • --



  • die zweite funktion (test) ist doch ueberfluessig, probiers mal so:

    int main() {
       char test[15]="345";
       int wert=0;
    
    if (stringToInt(test,&wert))
       cout<<test<<" ok, wert ist: "<<wert<<endl;
    else
        cout<<test<<" ungueltig\n";
    
    system("pause");
    }
    

    die funktion stringToInt gibt doch mit true/false zurueck, ob der wert ok ist ?!



  • Funktioniert nicht.



  • int W = 5;
    

    😕

    Sollte das nicht

    int W = 0;
    

    sein?



  • Ich habe mich erbarmt deinen Code so zu verändern das mindestens die erste
    Aufgabe bei dir erledigt ist, ich hab ihn auskommentiert, das soll für dich keine geschenkte Lösung sein.

    Vielmehr solltest du versuchen die Kommentare zu lesen und auch zu verstehen, wenn du das Prinzip was dahinter steckt richtig erkannt hast, bin ich mir sicher wirst du den Rest auch selber lösen können, eine 100% Lösung will ich dir nicht
    geben, davon hättest du nichts. Keinen Lerneffekt etcetera...

    Hoffe das du damit was anfangen kannst,
    falls du noch Fragen hast stell sie bitte

    Diesen Code könnte man noch viel kompakter machen, aber der Einfachkeithalber damit du ihn besser verstehst habe ich ihn ziemlich weit ausgedehnt 😉

    #include<iostream>
    #include<cstdio>
    
    using namespace std;
    
    bool stringToInt(const char * str, int * wert);
    
    int main()
    {
        char test[15]="0000148080";
        int wert=0;
        if (stringToInt(test,&wert))
        {
            cout<<test<<" ok, wert ist: "<<wert<<endl;
        }
        else
            cout<<test<<" ungueltig\n";
    
        system("pause");
    
    }
    
    bool stringToInt(const char * str, int * wert)
    {
        // Nullwert überprüfen
        if(str == NULL)
            return false;
    
     //   if(wert == NULL)  // hab ich ausgeklammert, ist vollkommen unsinnig,
     //   return false;     // wieso sollte die Funktion verlassen werden wenn
                            // wert = NULL ist?? Bitte Begründung :)
    
        // Vorzeichen erkennen und überspringe
        int vorzeichen = 1;
        if(*str == '-')
        {
            vorzeichen = -1;
            str++;
        }
        // Das ist soweit ok, wobei du dafür auch short int verwenden könntest, ist aber dir überlassen
    
        // Eigentliche Zahl lesen
    
        // Die gesamte While Funktion habe ich gelöscht da sie zwei schwere Fehler enthielt.
    
        //1. Du hast den Faktor W nicht ausschliesslich mit Faktor 10 multipliziert um eine
        // Zahl höher zu kommen, das ist aber beim Dezinmalen Zahlensystem notwendig (Faktor 10)
    
        //2. Hast du von vorne nach hinten angefangen, was dir überhaupt nix bringt (so wie du das vorhattest)
        //denn: woher soll das Programm wissen das z.B. bei der Zahl 5600, die 5 den Faktor 1000 hat(10*10*10)
        //und die 6, z.B. den Faktor 100 hatte, das geht aus deiner Funktion überhaupt nicht hervor
    
        //hier mal so in kurzen Ansätzen wie du die Aufgabe für dich hoffentlich verständlich lösen kannst ;)
    
        int index;  // eine Variable um durch das Array durchzustöbern
        int W;      // deine Faktor-Variable
        for(index = 0;str[index]!= '\0';index++);   // diese Schleife spult den index bis zum Ende des Stringes
                                                    // bei der Zahl 5600 wäre dies die Stelle nach der letzen Null
        index--;                                    // jetzt verminderst du den index, du bist nun bei der ersten Zahl
                                                    // die den Faktor 1 hat, (Dezimal), die erste 0 bei 5600
    
        for(W = 1;;index--,W*=10)         // Der Kopf der Schleife macht grundlegendes: für jede Zahl die du
        {                                           // nach oben gehst (index) wird der Faktor um 10 multipliziert, d.h. z.B.
                                                    // wenn das Programm bei der 6 ankommt enthält W den Wert 100 ;)
            if(str[index] < '0' || str[index] > '9')  // das war völlig ok, habe es nur halt mit arrays gemacht
            {
                return false;
            }
            else            // etwas verändert ;)
            {
                *wert += W*(str[index]-'0');   // beim Beispiel 4 würde er 4*100 = 400 zu dem Wert hinzuzählen, bei 5 + 5000
            }
    
            if(index == 0)      // Wenn index den Wert 0 erreicht hat, verlasse Schleife
            {
                break;
            }
        }
    
        *wert *= vorzeichen; //Vorzeichen negativ oder positiv ;) nur mit Vorzeichen
    
        return true;    // alles bis hier ok, hoffe es war verständlich und du kommst jetzt damit besser zurecht :)
    }
    

    //EDIT

    achso, und benutz bitte Code-Tags, das macht deinen Code übersichtlicher, und bitte schreib nicht Beiträge wo nur ein '--' oder ähnliches zu sehen ist.

    Das ist nicht Sinn und Zweck der Sache...



  • jerico schrieb:

    Hallo Zusammen
    Unterdessen haben wir eine Aufgabe bekommen. Ihr könnt ja mal reinschauen und mir TIPPS geben. Will nicht gerade das resultat. Aber ein Anfang wäre toll. 😞 Danke

    Aufgabe 1
    Schreiben Sie eine Funktion, die einen String in einen echten int-Wert umwandeln kann. Die
    Funktion muss also den String Zeichen für Zeichen untersuchen und aus den gefundenen
    Ziffern „irgendwie“ den numerischen Wert erstellen. Wenn die Funktion ihre Arbeit nicht korrekt
    beenden kann,

    was ist den das für eine aufgabenstellung

    also muss man doch nicht

    EINEN string in EINEN ECHTEN INT-WERT umwandeln. denn das geht nicht. was man machen kann ist

    ein CHAR in ein INT "umwandeln"

    der soll

    - seine aufgabenstellung nächstes mal sauberer formulieren
    - erstmal der weltöffentlichkeit erklären was "einen echten int-Wert" bedeutet

    arbeiten wir bisher mit unechten? gibt es maybe auch Warp-Ints? lässt sich mit denen schneller rechnen?



  • @adm!n und hash ints (aber erst mit tr1 ;-))
    aber ich denke mit echten ints hat er gemeint das man darauf achtet das der ermittelte wert der echte ist und nicht irgendsowas wie -12345 weil man zu oft etwas dazuaddiert hat, und der speicher nich ausreicht.

    btw: Ich hätte das ganze in einen std::string umgewandelt und mit folgendem template konvertiert: Link !!!



  • Ja Danke vielmals.Ich verstehe denn ablauf. Aber die aufgabenstellung ist mir immer noch unklar. Es wirt verlangt, dass wir einen String in einen echten int wert verwandelt wird? Ist da nicht der ASCII wert verlangt, wenn man zbs einen sting eingibt?

    Aufgabenstellung:
    Aufgabe 1
    Schreiben Sie eine Funktion, die einen String in einen echten int-Wert umwandeln kann. Die
    Funktion muss also den String Zeichen für Zeichen untersuchen und aus den gefundenen
    Ziffern „irgendwie“ den numerischen Wert erstellen. Wenn die Funktion ihre Arbeit nicht korrekt
    beenden kann, weil z.B. ein ungültiges Zeichen gefunden wird, soll sie ihre Arbeit abbrechen
    und einen Fehler zurück melden.
    Der Prototyp der Funktion soll so aussehen:
    bool stringToInt (char* str, int* wert);
    Hierbei ist str ein Zeiger auf den String, der umgewandelt werden soll, wert ist ein Zeiger auf
    eine int-Variable, in die der gefundene Wert gelegt werden soll. Wenn ein Fehler auftritt, gibt die
    Funktion als Rückgabewert false zurück. In diesem Fall darf der Wert, worauf der Zeiger
    wert zeigt, nicht verändert werden. Wenn alles geklappt hat, gibt die Funktion true zurück.
    Gültige Zeichen für einen int-Wert sind die Zifferzeichen 0 – 9 und eventuell an erster Stelle ein
    Minuszeichen.
    Beachten Sie zudem, dass ein String nicht beliebig lang sein darf, int-Werte können nicht
    beliebig gross werden.
    Aufgabe 2
    Schreiben Sie nun eine zweite ähnliche Funktion, die aber einen String in einen double-Wert
    umwandelt. Hier gilt zusätzlich, dass zwischen den Ziffern genau ein Punkt (der Dezimalpunkt)
    stehen kann. Leider gibt es Benutzer, die manchmal auch ein Komma verwenden. Ihre Funktion
    soll auch das Komma als Dezimalpunkt akzeptieren. Beachten Sie zudem, dass auch Zahlen
    ganz ohne Dezimalpunkt eingegeben werden dürfen. Solche Zahlen müssen ebenfalls korrekt
    umgewandelt werden. Der Prototyp der Funktion soll analog wie bei Aufgabe 1 gestaltet
    werden:

    bool stringToDouble (char* str, double* wert);
    Hier einige Beispiele von gültigen Eingaben, die Ihre Funktion korrekt verarbeiten muss:
    „123.456“ ergibt 123.456
    „123,456“ ergibt 123.456 (Komma statt Dezimalpunkt)
    „123“ ergibt 123.0 keine Dezimalstelle
    „123.“ ergibt 123.0 Dezimalpunkt ohne weitere Kommastellen
    „-0.123“ ergibt -0.123 negative Zahl
    „.123“ ergibt 0.123 Start direkt mit Dezimalpunkt
    Zusätzliche Aufgabe für Perfektionisten
    Ihre Funktionen sollten sich nicht durch Leerschläge am Anfang oder Ende der Strings stören
    lassen. Ebenfalls sollten führende Nullen oder Nullen am Ende bei Kommastellen korrekt
    ignoriert werden. Der Benutzer soll also auch etwa folgenden Wert eingeben dürfen:
    „ - 0003.987400000 “ ergibt -3.9874



  • jerico schrieb:

    Ja Danke vielmals.Ich verstehe denn ablauf. Aber die aufgabenstellung ist mir immer noch unklar. Es wirt verlangt, dass wir einen String in einen echten int wert verwandelt wird? Ist da nicht der ASCII wert verlangt, wenn man zbs einen sting eingibt?

    Der ASCII Wert in einem Integer welche eine Zahl zum rechnen enthalten soll
    gibt doch gar keinen Sinn, was willst du den damit O_o

    Das kannst du ausschliessen.

    Dein Lehrer will einfach nur das die zeichenkette im String in eine Zahl umconvertiert wird um mit ihr z.B. rechnen zu können, deswegen packt er sie ja auch danach in einen int. Das ist Sinn und Zweck der Übung, nix anderes, nix mit ASCII Wert o.ä.

    Den ASCII Wert brauchst du nur um die Zahlem vom String zurück zu einer realen Zahl zu rechnen. 😉

    Mehr nicht, fertig aus.

    Searence



  • Danke Vielmal. Ich glaube ich sollte die Aufgabe richtig lesen. Dabei war ich ja längst fertig und hatte die Lösung die ganze Zeit vor den Augen. Danke vielmals. Jetz aufgabe 2 ist wenigstens einfacher hoffe ich.Danke



  • Adm!n schrieb:

    also muss man doch nicht

    EINEN string in EINEN ECHTEN INT-WERT umwandeln. denn das geht nicht.

    Sicher geht das, ist eine ganz gewöhnliche lexikalische Umwandlung. Und wenn dich das "echten" stört, dann überspring es einfach. So kleinlich muss man ja schliesslich auch nicht sein. Jeder weiss schliesslich, was gemeint ist.


Anmelden zum Antworten