Arrays bekommen seltsame Werte



  • Hallo Leute
    ich bin grad dabei ein Programm zur Umrechnung von Schulnoten in das Oberstufen-Punktesystem zu schreiben.
    aber wenn ich das ganze ausführe bekomme ich erst diese Fehlermeldung:
    "Runtime-Check Failture #3 - The variable 'a' is being used without being initialized."

    Wenn ich das ignoriere wird das Programm weiter ausgeführt und die a-arrays bekommen komische Werte, wie 858993475.
    Das kann ich irgendwie nicht ganz nachvollziehen...

    Hier mein Code:

    // Programm zur Noten-Punkteberechnung
    
    #include <iostream>
    #include <string>
    #include <conio.h>
    using namespace std;
    
    int main()
    {
    	int anzNot = 0;
    	int g = 0;				//NotPkt
    	string z;				//Note String
    	int x = 0;				//Laufzähler1
    	int y = 0;				//Laufzähler2
    	int a[10];				//Noten einzeln
    
    	system("CLS");
    	cout << "Bitte gib die Anzahl der einzugebenen Noten ein. Es können nicht mehr als 10 Noten eingegeben werden." << endl;
    	cin >> anzNot;
    
    	while (x < anzNot)
    	{
    		cout << "Gib die Note vom " << x + 1 << ". Fach ein." << endl;
    		cin >> z;
    
    							//Umrechnung in Punkte
    		if (z == "1+")
    		{	g += 15;	}
    		if (z == "1")
    		{	g += 14;	}
    		if (z == "1-")
    		{	g += 13;	}
    		if (z == "2+")
    		{	g += 12;	}
    		if (z == "2")
    		{	g += 11;	}
    		if (z == "2-")
    		{	g += 10;	}
    		if (z == "3+")
    		{	g += 9;	}
    		if (z == "3")
    		{	g += 8;	}
    		if (z == "3-")
    		{	g += 7;	}
    		if (z == "4+")
    		{	g += 6;	}
    		if (z == "4")
    		{	g += 5;	}
    		if (z == "4-")
    		{	g += 4;	}
    		if (z == "5+")
    		{	g += 3;	}
    		if (z == "5")
    		{	g += 2;	}
    		if (z == "5-")
    		{	g += 1;	}
    		if (z == "6")
    		{	g += 0;	}
    		x++;
    							//Zuordnung zu Arrays
    		switch(x)
    		{
    		case 0: a[0] = g;
    			break;
    		case 1: a[1] = g - a[0];
    			break;
    		case 2: a[2] = g - a[1];
    			break;
    		case 3: a[3] = g - a[2];
    			break;
    		case 4: a[4] = g - a[3];
    			break;
    		case 5: a[5] = g - a[4];
    			break;
    		case 6: a[6] = g - a[5];
    			break;
    		case 7: a[7] = g - a[6];
    			break;
    		case 8: a[8] = g - a[7];
    			break;
    		case 9: a[9] = g - a[8];
    		}
    	}
    						//Ausgabe
    	cout << "Deine Noten in Punkte umgerechnet sind: ";
    	while (y < x)
    	{
    		cout << a[x] << ", ";
    		y++;
    	}
    
    	getch();
    	return 0;
    }
    

    Ich bin für jede Hilfe Dankbar
    JanK411


  • Mod

    Wenn du das erste Mal zum switch(x) kommst, dann hat x schon den Wert 1. Und dann wird a[0] benutzt, welches noch uninitialisiert ist.



  • Ich denke das Problem liegt in Zeile 59. Dort ist bereits ein x++. Deswegen ist im switch-statemente nie x = 0, wodruch a[0] nie initialisiert wird. Deswegen hast du nachher ein nicht initialisiertes array a.

    Wahrscheinlich muss das x++ nach dem switch-statement kommen.



  • Das will ich mir garnicht ansehen. Schleifen wär'n nicht schlecht, 's sag ich dir jetzt nur so.

    Umgestaltung! 😃 🙄 hehe
    Ich hätt's so gemacht:

    #include <iostream>
    #include <string>
    
    int main()
    {
        for(std::string note;;)//Altes Notensystem string
        {
            std::cout << "Bitte Note eingeben:\n";
            std::getline(std::cin, note);//Alte Note einlesen
    
            if(note.length() > 2 //Länger als zwei Zeichen ist eine Note eigentlich nicht
            || !isdigit(note.at(0)) //Das erste ist eine Zahl...
            || note.at(0) > '6' //...die nicht größer als 6...
            || note.at(0) < '1'   //Und nicht kleiner als 1 ist
            ||   (note.length() > 1 
               && note.at(1) != '-' //Es gibt nur das - ...
               && note.at(1) != '+'))//...oder + danach, sonst nichts
            {
                std::cout << "Ungültige Note eingegeben! Bitte erneut versuchen.\n";//Dann wird ein Fehler ausgegeben
                continue;
            }
    
            size_t onote(14);///Standardwert: 1, neue Variable die die Note im Neuen System hält
            if(note.length() > 1)//Wenn der string größer als 1 Zeichen ist, ist ein + oder - in der Note
                onote -= ((note.at(1) == '-')? 1 : -1);//Dann wird die Note einen Punkt besser oder schlechter
            onote -= (note.at(0) - '0' - 1) * 3;//Die Hauptnote (also bei 3- die 3) wird mal 3 genommen. Anschließend wird ein Notenpunkt abgezogen.
    
            std::cout << "Die Note im Oberstufensystem:\n" << onote << "\n\n";//Ausgabe der fertigen Note
        }
    }
    

    Edit: Klar kann man sich dafür eine Funktion schreiben.



  • Danke!
    Damit ist die nicht initialisierte Variable behoben.
    aber ich hab immer noch die komischen Werte...
    @Hacker: ich bin noch ein kläglicher Anfänger, müsst ihr wissen... aber ich denke mal, dass selbst wenn ich das ganze so mache, die Werte für a immer noch so seltsam bleiben...



  • Du solltest einmal lernen einen Debugger zu benuetzen. Dann wuerdest du sehen, dass das Array korrekte Werte enthaelt aber die Ausgabe falsch ist:

    cout << "Deine Noten in Punkte umgerechnet sind: "; 
        while (y < x) 
        { 
            cout << a[y] << ", "; // a[y] und nicht a[x] wie in deinem Code
            y++; 
        }
    


  • Oh verdammt...
    hinsehen will gelernt sein!
    was genau ist denn mit "debugger" gemeint?
    ich benutze visual studio 2010 und "debugge" vor jedem Ausführen...

    aber wenn ich das Programm jetzt ausführe sind die Werte immer noch nicht ganz richtig.
    Ich gebe 3 Noten ein: 1+, 2- und 3.
    dann bekomme ich die Werte 15, 10 und 23.
    Der Letzte davon kann ja eigentlich auch nicht stimmen.
    Wenn ich das ganze mit vier Noten mache, genauso usw... (alle Werte ab dem 3. sind falsch)



  • #include <cassert>
    #include <string>
    
    std::string note_von_punkten(unsigned punkte)
    {
      assert(punkte <= 15);
    
      int note = 6- (punkte+2)/3;
      bool plus = punkte%3 == 0;
      bool minus = punkte%3 == 1;
    
      std::string ret_val(2, '\0');
      ret_val[0] = '0' + static_cast<char>(note);
      if(plus)       ret_val[1] = '+';
      else if(minus) ret_val[1] = '-';
    
      return ret_val;
    }
    
    #include <iostream>
    #include <limits>
    
    int main()
    {
      unsigned punkte = 20;
      do
      {
        std::cin >> punkte;
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        std::cin.clear();
      } while(punkte > 15);
    
      std::cout << " == " << note_von_punkten(punkte) << std::endl;
    }
    

    bb


Anmelden zum Antworten