Hilfe mein Programm gibt nur blödsinn wieder ?!



  • otze schrieb:

    @mirauder nö das is kein problem, das i wird in dem code ja mindestens 30 mal wieder auf 0 gesetzt^^

    Das das i immer wieder auf 0 gesetzt wird ist mir natürlich auch aufgefallen.

    Das Probelm ist wenn man eine Zuweisung macht die über den Array Grenzen dann so aussieht:

    ASCII[2005] = EINGABE[2005];
    

    Dann wird an eine undefinierten stelle im Speicher etwas geschrieben was an einer anderen undefinierten Stelle steht.

    Gruß Mirauder Mo



  • Also wenn das alles so klappt dann danke ...
    Ja ich muss zugeben ich bin halt n totaler C++ newbe und hab versucht n proggie zu schreiben das mir den eingegeben text in ASCII code umwandelt und mit den zahlen dann rechnet und wieder zurück in ASCII schreibt... sone art mini verschlüsselung halt aber es klappte halt net.
    TEXT->ASCII->/4->^2->Float zu int->wieder TEXT

    aber wenn jemand dafür n abgespeckten code hat würde der mich schon mal interessieren.

    MfG
    ToxicaLBraiN



  • Wenn du die while Schleifen so übernimmst wie ich es geschrieben habe, also überall "while(EINGABE[i])" dann geht es doch. Falls du nicht den ASCII Code des neuen Zeichen haben willst, sondern das Zeichen musst du es bei der Ausgabe nach "char" casten, wie otze es beschrieben hat.

    Ich persönlich würde die while Schleifen aber so bevorzugen:

    int laenge = strlen(EINGABE);
    int i = 0;
    while(i<laenge) { ...}
    

    dann kannst du laenge in jeder Schleife benutzen.

    Und einen Flieskomma Wert auf Null zu vergleichen, wie du es hier "while(ASCII[i])" gemacht hast solltest du dir gleich abgewöhnen.

    Gruß Mirauder Mo



  • Cool ... Grosses THX an euch



  • Zur Danksagung doch noch registriert!

    Hier noch eine Etwas kompaktere Variante deines Programms:

    int main()
    {
        float ASCII[2000];
        float NASCII[2000];
        float UMRECHN[2000];
        float UMRECHN2[2000];
        float UMRECHN3[2000];
    //    float UMRECHN4[2000];
        int   TEST[2000];
        float TEST2[2000];
        int   TEST3[2000];
        int   i=0;
        char  EINGABE[2000];
    
        cout << "BITTE GEBEN SIE EINEN TEXT MIT MAX. 1999 ZEICHEN EIN: \n";
        cin.getline(EINGABE, 1999, '\n');
    
        while(EINGABE[i]){
            ASCII[i] = EINGABE[i];
            NASCII[i] = ASCII[i];
            UMRECHN[i] = NASCII[i] / 5.0f;
            UMRECHN2[i] = UMRECHN[i] * UMRECHN[i];
            UMRECHN3[i] = UMRECHN2[i] / 4.0f;
            TEST[i] = UMRECHN3[i];
            TEST2[i] = UMRECHN3[i] - TEST[i];
    		if(TEST2[i] >= 0.5)
                TEST3[i] = TEST[i] + 1;
            else
                TEST3[i] = TEST[i];
    		++i;
    	}
    
        i = 0;
        while(EINGABE[i]) {
            cout << (char)TEST[i++] << '\n';
    	}
        cout << endl;
    
        cin.get();
        return 0;
    }
    

    Spart ne menge Overhead. Die Ausgabe hab ich in der extra Schleife gelassen, obwohl man sie natürlich auch noch in die andere Schleife mit nehmen könnte.



  • oh das sieht echt gut aus ... wie gesagt bin noch am lernen wie das alles so geht.
    Und registriert hab ich mich mal lieber weil ja , wie ich mich so kenne , doch noch probleme auftauchen und weil ich gemerkt hab das wenigstens in diesem Forum n paar gescheite köpfe sind und nicht wie in anderen nur dummschwätzer
    :)...
    also nochmals vielen dank an alle die sich damit bescheftigt haben ...

    MfG

    ToxicaLBraiN



  • der nächste schritt wär jetzt nurnoch, folgenden block so umzuschreiben, dass du keine 5 variablen brauchst,sondern nurnoch eine 😉

    ASCII[i] = EINGABE[i]; 
    NASCII[i] = ASCII[i]; 
    UMRECHN[i] = NASCII[i] / 5.0f; 
    UMRECHN2[i] = UMRECHN[i] * UMRECHN[i]; 
    UMRECHN3[i] = UMRECHN2[i] / 4.0f; 
    TEST[i] = UMRECHN3[i];
    

    kleiner tipp(weis nicht, ob du das schon weist) der compiler berechnet erst das was rechts vorm gleichheitszeichen steht,und weist es erst zuletzt dem teil zu, der links steht, deshalb funktioniert auch folgende zeile:
    UMRECHN[i] = UMRECHN[i] * UMRECHN[i];
    so sparst du dir schon eine variable 😉



  • nee soweit bin ich in meinem Buch noch net( M+T C++ Der Leichte Einstieg von Peter Wollschlaeger) aber ich hab da noch eine kleine frage:

    Ich habe ja einmal UMRECHN Quadriert:

    UMRECHN[i] = UMRECHN[i] * UMRECHN[i];
    

    aber was ist wenn ich des wieder zurück haben will (also entschlüsseln)?
    Kann ich dann:

    UMRECHN[i] = UMRECHN[i] ^ -1;
    

    Weil das würde dann doch des Wurzelzeichen ersetzen oder ? Oder gibt es da noch eine bessere möglichkeit die Wurzel aus einer Variablen zu ziehen ?

    MfG

    ToxicaLBraiN



  • sorry hatte ausversehen den post zwei mal gepostet 🙂



  • ^ steht nicht für potenzieren 😞

    #include<cmath>
    ...
    UMRECHN[i] = sqrt(UMRECHN[i]);
    

    Gruß Mirauder Mo

    ps.: Hättest du auch gefunden wenn du die suchfunktion benutzt hättest 🙂



  • ok 🙂
    jetzt muss ich nur noch das ding so umschreiben das es ne oberfläche hat und dateien öffnet 🙂 aber das bekomme ich auch noch hin

    MfG

    ToxicaLBraiN



  • x hoch -1 (x^-1)ist übrigens nicht Wurzelziehen.
    Das wäre x hoch 1/2 (x^1/2). 🙂



  • ^ ist logisches XOR, aber ich würde die Wurzel auch nicht als pow(a, -1) realisieren, weil sqrt schneller ist.

    MfG MAV



  • Ich habe gerade mal den Quelltext von Mirauder_Mo asuprobiert und habe gemerkt das die exe die Zahlen nicht rundet befor er es ausgibt

    #include <iostream>
    #include <cstring>
    using namespace std;
    
    int main() 
    { 
        float ASCII[2000]; 
        float NASCII[2000]; 
        float UMRECHN[2000]; 
        float UMRECHN2[2000]; 
        float UMRECHN3[2000]; 
    //    float UMRECHN4[2000]; 
        int   TEST[2000]; 
        float TEST2[2000]; 
        int   TEST3[2000]; 
        int   i=0; 
        char  EINGABE[2000]; 
    
        cout << "BITTE GEBEN SIE EINEN TEXT MIT MAX. 1999 ZEICHEN EIN: \n"; 
        cin.getline(EINGABE, 1999, '\n'); 
    
        while(EINGABE[i]){ 
            ASCII[i] = EINGABE[i]; 
            NASCII[i] = ASCII[i]; 
            UMRECHN[i] = NASCII[i] / 5.0f; 
            UMRECHN2[i] = UMRECHN[i] * UMRECHN[i]; 
            UMRECHN3[i] = UMRECHN2[i] / 4.0f; 
            TEST[i] = UMRECHN3[i]; 
            TEST2[i] = UMRECHN3[i] - TEST[i]; 
            if(TEST2[i] >= 0.5) // Dies sollte eigentlich die float Zahlen runden 
                TEST3[i] = TEST[i] + 1;  // Tut es aber nicht
            else 
                TEST3[i] = TEST[i]; 
            ++i; 
        } 
    
        i = 0; 
        while(EINGABE[i]) { 
            cout << (char)TEST[i++] << '\n'; 
        } 
        cout << endl; 
    
        cin.get(); 
        return 0; 
    }
    

    Was kann ich stattdessen machen ???

    MfG

    ToxicaLbraiN



  • Nur mal so gesagt, was soll das hier:

    ASCII[i] = EINGABE[i];
            NASCII[i] = ASCII[i];
            UMRECHN[i] = NASCII[i] / 5.0f;
            UMRECHN2[i] = UMRECHN[i] * UMRECHN[i];
            UMRECHN3[i] = UMRECHN2[i] / 4.0f;
            TEST[i] = UMRECHN3[i];
            TEST2[i] = UMRECHN3[i] - TEST[i];
    

    Ich würde es so schreiben:

    UMRECHN[i] = ((EINGABE[i]/5.0f)*(EINGABE[i]/5.0f)))/4.0f;
    

    Im Übrigen heißt es Umrechnen, außerdem wird TEST2[i] immer 0 sein.
    Völliger Schwachsinn der Code, aber lass mal, denn:
    Nichts ist nutzlos! Der Code kann immer noch als schlechtes Beispiel dienen. :p

    MfG MAV, der heute mal kühn ist 🙂



  • ey mis, das war doch die aufgabe, welche ich ihm gestellt hatte, damit er das lernt ;).

    najut,ich verzeih dir, du bist ja heute so kühn, da mach ich mich lieber ganz klein, quetsch mich in die Ecke, und hoffe, dass du mich nicht siehst 😃



  • Mis2com schrieb:

    Völliger Schwachsinn der Code

    Ich darf doch darum bitten das das was hier als MEIN CODE bezeichntet wird nicht als völligen Schwachsinn zu betittel. Ich habe einfach den ursprünglichen code genommen und das selbe ergebniss produziert, dazu gehörte auch das die zwischenergebnisse gespeichert wurden. Sonst hätte ich es gewiss nicht auf diese Weise gemacht.

    @ToxicaLBraiN wo rundet er nicht?

    Gruß Mirauder Mo



  • Mis2com schrieb:

    UMRECHN[i] = ((EINGABE[i]/5.0f)*(EINGABE[i]/5.0f)))/4.0f;
    

    Wenn dann doch gleich:

    UMRECHN[i] = EINGABE[i]*EINGABE[i]/100.0f;
    


  • er soll am ende befor er die zahlen als int übergibt noch runden, sprich z.B.: 65,89 in 66 runden weil sonst der code den du "verschlüsseln" lässt nicht mehr zurückzubekommen ist aber das macht der code:

    TEST2[i] = UMRECHN3[i] - TEST[i]; 
            if(TEST2[i] >= 0.5) 
                TEST3[i] = TEST[i] + 1; 
            else 
                TEST3[i] = TEST[i];
    

    deswegen kommt nicht der richtige ASCII raus

    MfG

    ToxicaLBraiN



  • Da TEST und TEST3 beides int sind kann gar nichts gerundet werden.

    Aber an sich wird der bei einer zuweisung von float zu int nur der nachkommateil abgeschnitten. um das kaufmännisch runden zu realisieren addiert man einfach 0.5 auf die Flieskommazahl.

    TEST3[i] = TEST2[i] + 0.5f;
    

    Gruß Mirauder Mo


Anmelden zum Antworten