Converting Problem



  • Hallo Leute,

    ich habe unten folgenden Quelltext programmiert. Der Sinn des Programms ist es jedem Studenten der keinen Schein erworben hat eine 5 zuzuweisen und die Durchschnitsnote aller Teilnehmer zu errechnen. Die Note zuzuweisen ist kein Problem. Aber bei der Errechnung der Durchschnittsnote meckert der Compiler, das er Probleme beim umwandeln von int zu float hat. Bspw. in Zeile 44.
    Kann mir bitte jemand nen Tip geben wie ich das umgehen kann? Ich komme einfach nicht drauf. Ansonsten dürfte das Programm korekt sein. Ach ja, die Vorgaben über der main darf ich nicht ändern.
    Für Hilfe wäre ich sehr dankbar. Vielen Dank im Voraus.

    Mfg. Louis

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

    struct Student {
    char name[40];
    char vorname[40];
    int matrikel;
    unsigned hatSchein;
    double note;
    };

    struct Student teilnehmer [] = {{"Meier", "Erwin", 2008, 0, 2.7},
    {"Schmidt", "Klara",2007, 1, 1.3},
    {"Seeger", "Friedrich",2008, 1, 1.0},
    {"Walther", "Hans", 2007, 0, 3.7},
    {"Steinert", "Nico",2008, 1, 4.0}};

    int main(int arg, char *argv[]){
    float l;
    l= sizeof(teilnehmer)/sizeof(Student);

    for(int i=0; i<l; i++){

    teilnehmer[i].hatSchein;

    if(teilnehmer[i].hatSchein==0){
    cout<<teilnehmer[i].vorname<<" "<<teilnehmer[i].name<<" hat eine 5 da er keinen Schein erworben hat!"<<endl;
    }
    }
    cout<<"---------------------------------------------------------"<<endl;

    float avgNote=0;
    for(int i=0; i<l; i++){

    teilnehmer[i].note;

    avgNote += teilnehmer[i].note;

    }
    return avgNote;

    cout<<"Die Durchschnittsnote beträgt "<<avgNote/l<<endl;

    // Hier ist der Programmtext laut Aufgabenstellung zu ergänzen!
    system("pause");
    }



  • Benutz doch bitte die cpp-Tags, dann sieht das auch gleich besser aus, auch wenn die Einrückung zu wünschen übrigen lässt.

    using namespace std;
    #include <string>
    #include <iostream>
    #include <math.h>
    
    struct Student {
    char name[40];
    char vorname[40];
    int matrikel;
    unsigned hatSchein;
    double note;
    };
    
    struct Student teilnehmer [] = {{"Meier", "Erwin", 2008, 0, 2.7},
    {"Schmidt", "Klara",2007, 1, 1.3},
    {"Seeger", "Friedrich",2008, 1, 1.0},
    {"Walther", "Hans", 2007, 0, 3.7},
    {"Steinert", "Nico",2008, 1, 4.0}};
    
    int main(int arg, char *argv[]){
    float l;
    l= sizeof(teilnehmer)/sizeof(Student);
    
    for(int i=0; i<l; i++){
    
    teilnehmer[i].hatSchein;
    
    if(teilnehmer[i].hatSchein==0){
    cout<<teilnehmer[i].vorname<<" "<<teilnehmer[i].name<<" hat eine 5 da er keinen Schein erworben hat!"<<endl;
    }
    }
    cout<<"---------------------------------------------------------"<<endl;
    
    float avgNote=0;
    for(int i=0; i<l; i++){
    
    teilnehmer[i].note;
    
    avgNote += teilnehmer[i].note;
    
    }
    return avgNote;
    
    cout<<"Die Durchschnittsnote beträgt "<<avgNote/l<<endl;
    
    // Hier ist der Programmtext laut Aufgabenstellung zu ergänzen!
    system("pause"); 
    }
    

    Mach doch in student aus note auch ein float.. Macht keinen Sinn da double zu benutzen..
    Und in Zeile 44 kehrst du aus der main zurück.. sprich das Programm ist zu Ende. Ich denke nicht, dass das der Sinn des Programmes sein sollte, oder?

    Die main hat nun mal einen Rückgabetyp von int, also musst du auch ein in zurückgeben. (wenn es unbedingt sein muss, halt casten).
    Ansonsten musst du halt schauen, wo du welche Typen hast und überlegen, was Sinn macht.



  • Sorry, ich werde mich das nächstemal bemühen.
    Also ich hab den Fehler gefunden. Es geht auch mit double. Ich musste einfach nur in Zeile 44 return löschen und siehe da. Der Durchschnitt ist da.
    Dennoch Danke für die Hilfe.
    Mfg. Louis



  • Dir ist aber schon klar weswegen, oder?



  • Na ich würde mal meinen, dadurch das die for-Schleife die einzelnen Noten hintereinander ausgibt und meine Hilsfvarible avgNote dann die Summer der einzelnen bildet ist es völlig überflüssig nach dem Durchlauf zurück auf sum=0 zu springen. Wenn das nicht so ist, würde ich mich über eine Erklärung freuen 😞 .



  • Ich weiss jetzt nicht genau, was du mit sum meinst, aber egal.

    Mit return beendest du die main sofort und gibst einen Wert zurück. Da du aber ein float und kein int zurückgibst, wie es die Vorlage verlangt, gibt es einen Fehler (oder eher Warnung). Unter anderem wird die Durchschnittsnote somit gar nicht ausgegeben.



  • guck mal, jetzt sieht man so gar ein wenig durch:

    #include <string> 
    #include <iostream> 
    #include <cmath> //so heißt der header
    
    using namespace std;
    
    struct Student
    { 
      char name[40]; 
      char vorname[40]; 
      int matrikel; 
      unsigned hatSchein; 
      double note; 
    };
    
    //struct Student teilnehmer [] =  <-- das ist C und in C++ unnötig - und verpöhnt ^^
    Student teilnehmer[] =
    {
      {"Meier", "Erwin", 2008, 0, 2.7}, 
      {"Schmidt", "Klara", 2007, 1, 1.3}, 
      {"Seeger", "Friedrich", 2008, 1, 1.0}, 
      {"Walther", "Hans", 2007, 0, 3.7}, 
      {"Steinert", "Nico", 2008, 1, 4.0}
    };
    
    int main(int arg, char *argv[])
    { 
    //  float l; //wieso float? außerdem ist l nicht gerade der tollste name ^^
      int laenge = sizeof(teilnehmer) / sizeof(Student); 
    
      for(int i=0; i<laenge; i++)
      { 
    //    teilnehmer[i].hatSchein; <-- unnötig, weil nichts passiert
    //    if(teilnehmer[i].hatSchein==0) -> teilnehmer[i].hatSchein == false -> teilnehmer[i].hatSchein != true -> (!teilnehmer[i].hatSchein == true) ->
        if(! teilnehmer[i].hatSchein)
        { 
          cout<<teilnehmer[i].vorname<<" "<<teilnehmer[i].name<<" hat eine 5 da er keinen Schein erworben hat!"<<endl; 
        } 
      }
    
    cout<<"---------------------------------------------------------"<<endl; 
    
      float avgNote=0; 
      for(int i=0; i<laenge; i++)
      { 
    //    teilnehmer[i].note; <-- wieder unnötig
        avgNote += teilnehmer[i].note; 
      }
    //return avgNote; - wie du schon selbst bemerkt hast, ist das hier falsch - warum ist dir klar?!
    
      cout << "Die Durchschnittsnote beträgt " << avgNote/laenge <<endl; 
    
    // Hier ist der Programmtext laut Aufgabenstellung zu ergänzen! 
      system("pause"); //ist zwar nicht der schönste weg, die console offen zu halten, aber offenbar ist es teil der vorgabe ^^
    }
    


  • Ich meine natürlich anstatt sum avgNote. Diese Bezeichnung hat sich für diese Operation so manifestiert. Sorry. Ja, jetzt raff ich das auch. Dadurch das ich keine Klammern gesetzt habe denkt der Compiler er soll an die main returnen. Dabei hatte ich im Sinn, dass das return zurück auf avgNote geht. Ja, jetzt machts auch Sinn. 🙄 😃
    Danke nochmal.



  • Jetzt haste mich aber Neugierig gemacht. Wie kann man denn die Konsole noch offen halten? Ich kenne nur den system("pause")-weg.
    lg



  • Louis schrieb:

    Dadurch das ich keine Klammern gesetzt habe denkt der Compiler er soll an die main returnen. Dabei hatte ich im Sinn, dass das return zurück auf avgNote geht.

    Sry, aber das stimmt so immernoch nicht...
    Du kannst da keine Klammern so setzen, dass er das irgendwohin returnt...
    Du kannst es maximal in ne Funktion auslagern - die dann wieder nen Rückgabetyp besitzt und dann geht das auch mit return...

    bb

    edit: siehe 2.:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-151578.html

    gibt also viele Möglichkeiten - ich bevorzuge die hier:
    mit Standard-C++:

    #include <iostream>
    
    void clear_stream(std::istream &stream) 
    { 
        stream.clear(); 
        stream.ignore( stream.rdbuf()->in_avail() );
    } 
    
    void wait()
    {
    	clear_stream(std::cin);
    	std::cin.get();
    }
    

    gibt allerdings auch noch eine für nur windows und msvc:

    #include <windows.h> //FlushConsoleInputBuffer + GetStdHandle + STD_INPUT_HANDLE
    #include <conio.h> //_getch
    
    void wait()
    {
    	FlushConsoleInputBuffer( GetStdHandle(STD_INPUT_HANDLE) );
    	_getch();
    }
    

    dafür reagiert das hier auf jede Taste und das erste nur auf Enter...
    Die Anwendung sollte zwar klar sein, aber man weiß ja nie:

    int main()
    {
      /*...*/
      wait();
    }
    

    bb



  • Ok, mit den Klammern haste recht. Aber ich glaub den Sinn hab ich verstanden.



  • Also nochmal vielen Dank euch beiden.
    Ich denke, das ich es verstanden habe.

    Mit besten Grüßen
    Louis


Log in to reply