Nur für diskussionsfreudige Menschen



  • Hallo Zusammen,

    ich entschuldige mich vorab, dass ich so etwas poste (und es erst mein 2ter Post ist), aber im vorigen Post ging auch eine interessente Diskussion los und vielleicht habt ihr ja Interesse hier Optimierungen zu nennen.
    Ich habe eine Frage aus dem Buch C++ programmieren von Breymann falsch verstanden und bin durch die "geänderte" Aufgabenstellung zu einer anderen Lösung gekommen.
    Wer Interesse hat darf gerne einmal den Code zerlegen und beschreiben, was alles so gar nicht sein sollte, bzw. wie man es besser macht. Ich lerne durch die Praxis und die Rückmeldung von Experten doch um einiges besser, als mit dem reinen Selbststudium. Denn irgendwie komme ich immer zur Lösung und hab nur niemanden der die Lösung auch mal analysiert :).

    Wenn das komplett unangebracht ist, dann ignoriert es einfach bzw. schließe ich den Post auch gerne wieder.

    Zur Erklärung was ich verstanden habe und wie die eigentliche Fragestellung war:

    Original:
    1.20 Schreiben Sie ein Programm, das beliebig viele Zahlen im Bereich von -99 bis +100 (einschließlich) von der Standardeingabe liest. Der Zahlenbereich sei in 10 gleich große Intervalle eingeteilt. Sobald eine Zahl außerhalb des Bereichs eingegeben wird, sei die Eingabe beendet. Das Programm soll dann für jedes Intervall ausgeben, wie viele Zahlen eingegeben worden sind. Benutzen Sie für -99, +100 usw. Konstanten (const). Zur Speicherung der Intervalle soll ein vector<int> verwendet werden.

    Mein Verständnis:
    Die 10 Intervalle habe ich als 10 Bereiche der Gesamtzahl der Eingabe interpretiert. Also bspw. bei 33 eingegebenen Zahlen, je 10 Bereiche mit 3 Zahlen. Den Rest habe ich zu den ersten Bereichen verteilt, bis der Rest aufgebraucht ist.

    Mein Code sieht wie folgt aus (ich schreibe die ganzen Aufgaben aus dem Buch als Funktionen und rufe sie bei Bedarf in main() auf):

    void EinsPunktZweiNull()
    {
    	const int min{ -99 };
    	const int max{ 100 };
    	std::vector<int> input{};
    	int helper{0};
    	int numbersInterv{0};
    	int rest{0};
    	int counter{ 0 };
    	
    	std::cout << "Write numbers between -99 and +100 (as much as you want). I will sort them in 10 Intervalls."
    		<< " You can break the input by writing a number out of range.\n"
    		<< "Your input: ";
    
    	while (true)
    	{
    		std::cin >> helper;
    		if (helper < -99  || helper > 100)
    		{
    			break;
    		}
    		input.push_back(helper);	
    	}
    
    	rest = (input.size() % 10);
    	numbersInterv = (input.size() / 10);
    
    
    	for (int j = 0; j < (input.size()); j++)
    	{
    		static int intervallnr{ 1 };
    
    		if (counter == 0)
    		{
    			std::cout << '\n';
    			std::cout << "Intervall Nr." << intervallnr << ":   ";
    			intervallnr++;
    		}
    		if (counter <= numbersInterv)
    		{
    			std::cout << " " << input[j] << " ";
    			counter++;
    			
    		}
    		if (counter >= numbersInterv)
    		{
    			counter = 0;
    		}
    		
    		if (rest != 0 && counter == 0 && numbersInterv != 0)
    		{
    			std::cout << input[j];
    			rest--;
    			j++;
    		}
    	}
    }
    


  • Auf Anhieb sehe ich code-technisch folgendes:

    • du solltest minund max auch benutzen (auch für die Ausgabe) 😉
    • static int intervallnr ist hier falsch (überlege mal, was passiert, wenn du diese Funktion mehrmals aufrufst)
    • Variablen solltest du so nah wie möglich vor der Benutzung definieren (anstatt alle am Anfang der Funktion - ist ja nicht C).
    • du solltest für Teilaufgaben Funktionen erstellen
    • und im Hinblick auf weitere Aufgaben (und mehr Professionalität) IO von Logik trennen

    Die eigentliche Aufgabe hast du aber wohl mißverstanden:
    Die Intervalle beziehen sich auf den Wertebereich, d.h. abhängig von minund max in 10 gleich große Intervalle, d.h. die Größe eines intervalls ist (max - min + 1) / 10 (auch für 10 solltest du eine Konstante anlegen).


  • Mod

    Nein, es ist gemeint, dass du den Bereich A bis B in 10 gleich große Itervalle einteilen sollst. Hier also -99 bis -79, -79 bis -59, etc.



  • @Th69 Vielen Dank dir. Ich hab die Aufgabe auf jeden Fall falsch verstanden, dass hatte ich ja anfangs geschrieben. Und da ich zu meiner "neuen" Aufgabe keine Sachbuch Lösung habe, ist es ideal hier Input zu bekommen. Daher schon mal danke für deine Kommentare. Werde es nochmal umschreiben und diese einpflegen um einen besseren Programmierstil von Anfang an zu lernen.

    Beste Grüße,
    Tommy



  • @SeppJ Ja, so ist die korrekte Aufgabenstellung und Lösung. Und dann nur die Anzahl der jeweiligen eingegebenen Zahlen in den Bereichen ausgeben und nicht die Zahlen selbst.



  • @Kvothe sagte in Nur für diskussionsfreudige Menschen:

    Wenn das komplett unangebracht ist, dann ignoriert es einfach bzw. schließe ich den Post auch gerne wieder.

    Ne, wieso sollte? Ich würde mir nur wünschen daß Du in Zukunft vollständige, ohne Änderung kompilierbare Programme postest.
    Ein mehr auf die Fragestellung bezogener Titel wäre auch nicht schlecht.



  • @Swordfish Hi Swordfish, werde ich gerne machen. Der Titel hatte den Hintergrund, dass ich dachte es gehen die Diskussionen, über die Möglichkeiten wie man es richtig macht, los.



  • Du brauchst nicht zurückhaltend sein. Benenne den Thread nach dem Thema über das du sprechen möchtest und gut ist. Wer sich beteiligen will wird das tun und wer das nicht will auch. Keine falsche Zurückhaltung. Dein Eingangspost ist auf jeden Fall besser als die meisten anderen, die hier so kommen.


Anmelden zum Antworten