C++ Anfänger- Programm funktoniert nicht!



  • Vielen Dank, aber irgendwie verstehe ich das nicht ganz.

    Wieso geht denn das Programm zu, bevor die ganze Programmierung durchgelaufen ist?

    Muss ich irgendeinen Code eingeben?

    mfG Leo



  • Wer lesen kann, ist klar im Vorteil.
    Lies dir die 2. Zeile nochmal durch und versuche sie zu verstehen, also Hinweis noch: unter Konsole versteht man in Windows auch das "DOS-Fenster", siehe auch den Forumstitel.



  • Das Programm schließt sich, nachdem die Zahl umgerechnet ausgegeben wurde. Du könntest z.B. eine Schleife machen:

    while(true)
    	{
    			printf("Gib eine Zahl ein : ");
    			scanf("%d",&Zahl);
    
    			printf("\nDie Zahl ist Hexal : %x. \n",Zahl);
    			printf("\nDie Zahl ist Oktal : %o \n", Zahl);
    	}
    


  • Mein Programm sieht jetzt so aus:

    #include <cstdlib>
    #include <iostream>

    using namespace std;

    int main(int argc, char *argv[])
    {
    int Code;
    printf("Gib bitte den Code ein: ");
    scanf("%d",&Code);

    if(Code!=7330)
    {
    printf("Falsch\n!");
    return EXIT_SUCCESS;
    }

    if(Code==7330)
    {
    printf("Zugriff gew\x84hrt!\n");
    }
    int Zahl;

    while(true)
    {
    printf("Gib eine Zahl ein : ");
    scanf("%d",&Zahl);
    printf("\nDie Zahl ist Hexal : %x. \n",Zahl);
    printf("\nDie Zahl ist Oktal : %o \n", Zahl);
    }

    return EXIT_SUCCESS;
    }

    Sorry wenn ich euch mit meinen fragen langweile, aber es geht trotzdem zu bevor es die Zahl ausgerechnet hat.

    @Wutz

    Sorry aber ich werde auch beim 10 mal Lesen nicht schlau aus deinem Post, ich weiss ja das sich das Programm schliesst, aber wie kann ich das verhindern?

    mfG Leo



  • Starte Dein Konsolenprogramm aus der Konsole!



  • Du weisst was eine Win32-Konsole ist?
    Öffne da dein Programm. Und berichte wie das da funktioniert 👍

    Wenn du mit einer IDE programmierst, hast du da auch oft die Möglichkeit das Programm auf Konsole zu testen.

    Und nimm für deinen Quelltext den C/C++ Button hier, der erste direkt unter den Smilies 👍

    Dann schreibst du C++. Aber C++ sind nur die ersten 3 Zeilen deines Quelltextes, wenn ich nichts übersehen hab. Warum nicht die weiteren? Seid ihr noch nicht so weit? Oder was hindert dich?

    MfG f.-th.



  • #include <cstdlib>
    

    ist unnötig. Wenn du rein in C programmieren willst, ist denke ich

    #include <stdio.h>
    

    die richtige Wahl statt

    #include <iostream>
    using namespace std;
    

    Zu deinem Problem, geh auf Start -> Ausführen (evtl. in den Eigenschaften des Startmenüs einstellen) -> 'cmd', dann hast du die Konsole offen. Dann mit 'cd' in den Ordner, wo deine .exe liegt, wechseln und den vollständigen Dateinamen angeben. Damit geht das Fenster nicht zu, nachdem das Programm beendet wurde.

    In diesem konkreten Fall hast du wahrscheinlich den falschen Code eingegeben. 7330 muss der sein, sonst beendet das Programm nach der Meldung 'Falsch!'.



  • Danke für euere Antworten und Hinweise, sebstverständlich werde ich ab jetzt den Quelltext mit dem (

    ) ausgeben.

    @f.th-
    Ja eben ich hab so ein PDF gedownloadet das mir alles Schritt für Schritt erklärt. Dort stehen eben wahrscheinlich nur die C-Befehle.
    --------------------------------------------------

    @Thuruk

    Vielen Dank für deine Erklärung, noch eines ist mir unklar:
    nach dem cd muss ich den path meiner Datei angeben?

    ---------------------------------------------------

    Bis jetzt habe ich meine Programme immer so aufgemacht:

    1. Ausführen-->Kompileren
    2. Ausführen-->Ausführen

    -------> Das Programm ging als Konsolenprogramm auf.

    Nun mache ich das wieder so, aber es ist fehlerhaft.
    Was ist eigentlich das kompilieren, erstellt es da eine .exe?

    mfG Leo
    PS: Ihr müsst jetzt nicht meinen ich sei ein Unfähiger Computer-Bediener, bis jetzt arbeitete ich immer auf dem Mac und nun habe ich mir per Bootcamp eine Windows-Partition geholt.



  • Nach 'cd' (change directory) muss der Pfad des Ordners, in dem die durch den Compiler und Linker erstellte .exe liegt, angegeben werden.

    Du kannst außerdem eine Verknüpfung am Desktop erstellen, als Pfad C:\Windows\system32\cmd.exe angeben, darauf rechte Maustaste -> 'ausführen in', da den Pfad angeben, damit startet die Konsole in dem gewünschten Ordner.



  • Herzlichen Dank an alle!!!!

    Nun muss man den Code eingeben, dann kommt man soll eine Zahl eingeben und diese wird dann umgerechnet.

    Alles so wie es soll. vielen Dank.

    Nun habe ich aber erneut eine Frage.
    Ich hoffe ihr nehmt mir das nicht übel.

    Nun:

    Das Ziel ist es einen NotenCalculator zu basteln:

    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    float Gesamtpunktzahl;
    printf("Bitte geben sie die Gesamtpunktzahl ein: \n");
    scanf("%d",&Gesamtpunktzahl);
    
    float r;
    printf("Bitte geben sie ein, welche Punktzahl für eine Sechs nötig ist: \n");
    scanf("%d",&r);
    
    float punktezahleins;
    printf("Bitte geben sie ein, welche Punktzahl für eine Eins nötig ist: \n");
    scanf("%d",&punktezahleins);
    
    float y;
    float erreichtepunktzahl;
    printf("Bitte geben sie ein, welche Punktzahl der Schueler erreicht hat : \n");
    scanf("%d",&erreichtepunktzahl);
    (erreichtepunktzahl*5)=y;
    {
    float Ergebnis;
    while(Ergebnis!=7);
    }
    {
    float Ergebnis;
    float note;
    float r;
    float z;
    float x;
    r=punktezahleins;
    y/r=x;
    x+1=note;
    
    printf("Die note ist %f\n",note);
        return EXIT_SUCCESS;
    }
    }
    

    bei dem Befehl (erreichtepunktzahl*5)=y; gibt es den Fehler

    Non-Ivalue in assigment

    Wie kann ich das verhindern?

    mfG Leo



  • In c++ (wie auch Assembler) ist links immer der Zieloperant angegeben.

    y=(e+5) schreibt den Wert (e+5) in die für y reservierte Speicherstelle und ist daher richtig.



  • Herzlichen Dank, jetzt hab ich alles so:

    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    float Gesamtpunktzahl;
    printf("Bitte geben sie die Gesamtpunktzahl ein: \n");
    scanf("%d",&Gesamtpunktzahl);
    
    float r;
    printf("Bitte geben sie ein, welche Punktzahl für eine Sechs nötig ist: \n");
    scanf("%d",&r);
    
    float punktezahleins;
    printf("Bitte geben sie ein, welche Punktzahl für eine Eins nötig ist: \n");
    scanf("%d",&punktezahleins);
    
    float y;
    float erreichtepunktzahl;
    printf("Bitte geben sie ein, welche Punktzahl der Schueler erreicht hat : \n");
    scanf("%d",&erreichtepunktzahl);
    y=(erreichtepunktzahl*5);
    {
    float Ergebnis;
    while(Ergebnis!=7);
    }
    {
    float Ergebnis;
    float note;
    float r;
    float z;
    float x;
    r=punktezahleins;
    x=(y/r);
    note=(x+1);
    
    printf("Die note ist %d\n",note);
        return EXIT_SUCCESS;
    }
    }
    

    es rechnet trotzdem nich die Note aus, sondern es erscheint gar nichts.

    Ist es ein Fehler im letzten printf?

    Die Berechnung sollte so erfolgen:

    (erreichte Punkte{durch}Punktzahl für die Eins) +1= Note.

    mfG Leo



  • Zeile 27 ist mal Unsinn. Wenn du eine While-Schleife machen willst, hat die so auszusehen:

    while(true){
    //do something
    }
    

    Bei dir stehen einige komische Klammern und ein Semikolon gleich nach 'while'.



  • Danke, hab das jetzt mal so gemacht:

    #include <cstdlib> 
    #include <iostream> 
    
    using namespace std; 
    
    int main(int argc, char *argv[]) 
    { 
    float Gesamtpunktzahl; 
    printf("Bitte geben sie die Gesamtpunktzahl ein: \n"); 
    scanf("%d",&Gesamtpunktzahl); 
    
    float r; 
    printf("Bitte geben sie ein, welche Punktzahl für eine Sechs nötig ist: \n"); 
    scanf("%d",&r); 
    
    float punktezahleins; 
    printf("Bitte geben sie ein, welche Punktzahl für eine Eins nötig ist: \n"); 
    scanf("%d",&punktezahleins); 
    
    float y; 
    float erreichtepunktzahl; 
    printf("Bitte geben sie ein, welche Punktzahl der Schueler erreicht hat : \n"); 
    scanf("%d",&erreichtepunktzahl); 
    y=(erreichtepunktzahl*5); 
    
    int note;
    while(true)
    
    {
    float note; 
    float r; 
    float z; 
    float x; 
    r=punktezahleins; 
    x=(y/r); 
    note=(x+1);
    }
    printf("Die note ist %d\n",note); 
    return EXIT_SUCCESS;
    }
    

    Es lässt sich zwar kompilieren, aber es rechnet die Note noch nicht aus.
    mfG Leo



  • Mir ist auch noch nicht klar was du da mit der Schleife machen willst.

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    	double peins, perreicht;
    	cout << "Bitte geben Sie die Werte der Variablen 'Punktezahl fuer die Eins' und 'Erreichte Punkte' ein: ";
    	cin >> peins >> perreicht;
    
    	cout << "Die erreichte Note ist " << perreicht/peins+1 << ".\n";
    
    	return EXIT_SUCCESS;
    }
    

    Das wäre eine einfache Lösung, die nach deiner Formel die Note berechnet.



  • float note;
    float r;
    float z;
    float x;
    

    Wie oft, genoni, kommt jede dieser Zeile in deinem Quelltext vor?
    Und was passiert dann?
    Okay, das kann gar funktionieren aber nur, wenn der Programmierer nicht den Überblick verliert. Also, wenn bei einem Anfänger eine dieser Zeilen, oder vergleichbare vorkommen, immer überlegen, ist das irgend wo vom Auftraggeber so vorgegeben? Wenn nicht, eine übersichtlichere Lösung vorziehen.

    Zur Krönung der Unübersichtlichkeit:

    int note;
    ...
    float note;
    

    😮
    weist du was du da willst oder machst?

    MfG f.-th.



  • Was vergessen 😡

    Also, wenn bei einem Anfänger eine dieser Zeilen oder vergleichbare mehr als einmal in einem Quelltext vorkommen immer überlegen, ist das irgend wo vom Auftraggeber so vorgegeben?

    So sollte das besser sein.



  • Sorry, ich war jetzt eine Woche ohne Internet abwesend.

    Vielen Dank für die Antworten.

    @Thuruk,

    Deine Version funktioniert bestens, herzlichen Dank.

    @f-th

    lach*, mir ist klar dass meine Programme extrem unübersichtlich sind.
    Ich habe einfach mal mit denen mir Bekannten Befehlen losgelegt und es wurden dann immer mehr Änderungen.

    Wenn ich das nun ähnlich meiner Vorgabe machen möchte, muss ich dann nur diese floats anders gestalten? Oder geht das so gar nicht?

    mfG Leo



  • Hab ich doch geschrieben, solange du den Überblick über deinen Quelltext hast bekommst du das hin 👍
    Wenn du den Überblick verlierst, ... 🤡

    Also würde ich den Quelltext übersichtlich formatieren.
    Dann solltest du dir selber im Quelltext keine Fallen aufbauen in der Form das du dich selbst austrickst.

    float r;
      printf("Bitte geben sie ein, welche Punktzahl für eine Sechs nötig ist: \n");
      scanf("%d",&r);
    

    Was willst du damit erreichen? Okay, es kann sein das es nur eine mögliche Punktzahl für eine 6 gibt? Dann gibt es innerhalb von Europa Staaten wo 6 die schlechteste Zensur ist und andere wo eine 6 die beste ist. Also soll das Programm in Deutschland, in Österreich, in der Schweiz oder sonst wo spielen?

    So ein wenig Hintergrund brauche ich schon, wenn das ein halbwegs gutes Programm werden soll. Ich nehme an du solltest dich auch mal eingehender damit beschäftigen. Zum einen mit dem Hintergrund und zum anderen mit den Grundlagen von C und/oder C++.

    int note; //  siehe 4 Zeilen später
      while(true)
    
      {
        float note; // note hast du doch gerade als int definiert und bislang nicht gebraucht???
    

    MfG f.-th.



  • Herzlichen Dank.

    Das Programm soll in der Schweiz spielen, wo 6 die höchste und 1 die tiefste Note ist. Das mit dem Note hab ich gar nicht gesehen 😞 . Wie gesagt, ich hab erst vor 2 Wochen mit C angefangen und kenne darum nur wenige Befehle. Als dann eine Bekannte gesagt hat ihr fehle ein Programm das Noten berechnet, habe ich gesagt ich könne versuchen eines zu basteln. 🙂

    mfG Leo


Anmelden zum Antworten