Split von "Sternchen Pyramide mit Funktion"



  • Hallo Community,

    ich bin noch ein Grünschnabel, was das Programmieren angeht und versuche mich aktuell an meinen Aufgaben zu meinem Informatik-Kurs. Ich habe die selbe Aufagbe, die mein Vorgänger hatte und dachet deshalb, dass die Frage am besten hier runter passt.

    1)Ich soll eine Pyramide erzeugen, dessen Grundseite am linken Konsolenrand ist
    2)Der Benutzer soll durch eine Eingabe die maximale Höhe der Pyramide bestimmen können.
    3)Falscheingaben sollen abgefangen werden.
    4)Ich soll die Aufgabe durch Rekursion und maximal einer Schleife lösen.
    (In der vorherigen Aufgabe sollte ich das selbe Programm schon beliebig und mit maximal 2 Schleifen schreiben. Dieses Programm läuft schon wunderbar.)

    Ausgabe Bsp.:

    0
    00
    000
    00
    0

    Ich bin aktuell an dieser Stelle (Ich programmiere in C++ und benutze VS2013)

    #include <iostream>
    
    using namespace std;
    
    void Nullen(int nullen, int groesse)
    {
    	//Hiermit werden die Anzahlen der "0" pro Zeile bestimmt
    	for (nullen = 0; nullen < groesse; ++nullen)
    	{
    		cout << "0";
    
    		cout << endl;
    	}
    }
    
    void Zeilenanzahl(int groesse, int zahl, int nullen)
    {
    	Nullen(nullen, groesse);
    
    	if (groesse < zahl)
    	{
    		Zeilenanzahl(groesse + 1, zahl);
    		Nullen(nullen, groesse);
    	}
    }
    
    //Programmanfang
    int main()
    {
    	//Deklaration der Variablen
    	int zahl;
    	int zeilen=1;
    	int groesse = zahl - abs(zahl - zeilen);
    
    	//Begrüßung und Instruktionen
    	cout << "Wilkommen beim Programm: Dreieck!\n" << endl
    		<< "Mit diesem Programm koennen sie ein Dreieck auf der Konsole erzeugen.\n" << endl
    		<< "Im Folgenden koennen Sie durch Eingabe eines Parameters auswaehlen," << endl
    		<< "wie hoch das Dreieck werden soll.\n" << endl
    		<< "Welche Hoehe soll das Dreieck haben ?\n " << endl
    		<< "Geben Sie nun eine ganze Zahl ein, um die Hoehe zu bestimmen:" << endl;
    
    	//Hiermit werden Falscheingaben abgefangen.
    	while (!(cin >> zahl) || zahl<0)
    	{
    		cout << "Falscheingabe! Bitte geben Sie ausschließlich ganze positive Zahlen ein !" << endl;
    
    		//Löschen der Eingabe und leeren des Eingabepuffers 
    		cin.clear();
    		cin.sync();
    	}
    
    	void Zeilenanzahl(int groesse, int zahl, int nullen;
    
    	//Verabschiedung
    	cout << "\nBis zum naechsten Mal!" << endl;
    
    	//Hiermit wird das Programm angehalten, damit der Nutzer die Ausgabe der Konsole lesen kann.
    		system("pause");
    
    	//Programmende
    	return 0;
    }
    

    Er gibt mit eine Fehlermeldung aus die sagt ich darf keine 2 Argumente in der Funktion Zeilenzahl haben. Das verstehe ich nicht , denn ich definiere doch die Funktion und geben an, dass ich 3 Varablen in ihr nutzen will.
    Meiner Meinung nach müsste das Programm laufen aber es tut leider nichts.

    Wäre über Hinweise auf eventuelle Denkfehler in meinem Programm sehr froh denn ich versuche das jetzt schon seit einigen Stunden und finde in meinen Augen keinen Fehler. 😞

    Gruß Tebe


  • Mod

    Guck dir noch mal an, wie man Funktionen aufruft. Und achte auf deine Klammern.



  • Au Backe... Danke! Dass mit der Funktionabfrage ist ja haarsträubend -.- Das mit den Klammern sehe ich jedoch nicht. Ich habe doch alle Klammern wieder geschlossen???
    Mhhh jetzt sieht es so aus :

    #include <iostream>
    
    using namespace std;
    
    void Nullen(int nullen, int groesse)
    {
    	//Hiermit werden die Anzahlen der "0" pro Zeile bestimmt
    	for (nullen = 0; nullen < groesse; nullen++)
    	{
    		cout << "0";
    
    		cout << endl;
    	}
    }
    
    void Zeilenanzahl(int groesse, int zahl, int nullen)
    {
    	Nullen(groesse, nullen);
    
    	if (groesse < zahl)
    	{
    		Zeilenanzahl(groesse + 1, zahl, nullen);
    		Nullen(groesse, nullen);
    	}
    }
    
    //Programmanfang
    int main()
    {
    	//Deklaration der Variablen
    	int zahl;
    	int zeilen=1;
    	int groesse;
    	int nullen=0;
    
    	//Begrüßung und Instruktionen
    	cout << "Wilkommen beim Programm: Dreieck!\n" << endl
    		<< "Mit diesem Programm koennen sie ein Dreieck auf der Konsole erzeugen.\n" << endl
    		<< "Im Folgenden koennen Sie durch Eingabe eines Parameters auswaehlen," << endl
    		<< "wie hoch das Dreieck werden soll.\n" << endl
    		<< "Welche Hoehe soll das Dreieck haben ?\n " << endl
    		<< "Geben Sie nun eine ganze Zahl ein, um die Hoehe zu bestimmen:" << endl;
    
    	//Hiermit werden Falscheingaben abgefangen.
    	while (!(cin >> zahl) || zahl<0)
    	{
    		cout << "Falscheingabe! Bitte geben Sie ausschließlich ganze positive Zahlen ein !" << endl;
    
    		//Löschen der Eingabe und leeren des Eingabepuffers 
    		cin.clear();
    		cin.sync();
    	}
    
    	groesse = zahl - abs(zahl - zeilen);
    
    	Zeilenanzahl(groesse, zahl, nullen);
    
    	//Verabschiedung
    	cout << "\nBis zum naechsten Mal!" << endl;
    
    	//Hiermit wird das Programm angehalten, damit der Nutzer die Ausgabe der Konsole lesen kann.
    		system("pause");
    
    	//Programmende
    	return 0;
    }
    

    Jetzt startet das Programm, aber irgendwie gibt es mir nur eine Leerzeile aus -.- Ich glaube ich sitzte hier einfach zu lange vor und sehe den Wald vor lauter Bäumen nicht ...


  • Mod

    Benutz einen Debugger, um dir die Werte von Variablen ausgeben zu lassen oder mach selber ein paar Ausgaben. Gute Kandidaten wären beispielsweise die Werte, die du an die Funktion übergibst. So kannst du prüfen, ob die wirklich Sinn machen.



  • Hallöchen,

    hier von mir mal ein paar Tips zu deinem Programm aus meiner Sichtweise:

    1. Du verwendest hier und da ziemlich triviale Kommentare. Kommentare sollen erklären warum etwas gemacht wird, nicht was (außer es ist nicht offensichtlich) und nur wenn nötig.
    Ein paar Beispiele:

    //Programmanfang
    //Deklaration der Variablen
    //Begrüßung und Instruktionen
    //Verabschiedung
    ....
    

    Sowas ist nicht gut, weil es einfach das Programm unübersichtlicher mach und nur verwirrt.

    2. System() Aufrufe sollten vermieden werden, es gibt auch andere, einfache Methoden um die Konsole nach dem Programm offen zu halten (ganz simpel, wenn du kein Debugging brauchst: <Strg> + F5).
    Für Näheres einfach mal googeln (Wobei das jetzt in diesem Fall nicht wirklich tragisch ist)

    3. Versuch doch mal das Problem im Kopf zu lösen, bevor du versuchst es zu implementieren. Bei solchen Dingen geht das wunderbar mit Papier+Stift, um so ein Konzept auszuarbeiten. Also einfach mal dein Problem in kleinere Teilprobleme unterteilen (z.B: die Ausgabe einer einzelnen Zeile, woher weiß ich wie viele '0' ich ausgeben soll, woher weiß ich, wie viele '0' der nächste Funktionsaufruf ausgeben soll, ...).

    4. Du könntest eine `bool` Variable als Funktionsparameter übergeben, die dir sagt, ob der nächste Funktionsaufruf nun eine 0 mehr oder eine 0 weniger ausgeben soll (Also ob vor oder nach der Spitze (wo Anzahl '0' == Höhe)). Es reicht im Grunde eigentlich eine Funktion, welche die Pyramide dann rekursiv aufbauen kann.

    5. Deine Funktion `Nullen` ist komisch, weil du einen Parameter einfach in der for-Schleife verwendest, was diesen total sinnlos macht (du setzt `nullen` zu 0 und verwendest die Variable einfach zum Iterieren). Einfach die Variable im Schleifenkop deklarieren:

    for (int i = 0; ...)
    

    In anderen Worten, überdenk dir nochmals deine Funktionen und was sie eigentlich machen sollen.

    6. Man sollte die Variablen so spät wie möglich/früh wie nötig deklarieren/definieren (zumindest meistens). Alles so am Programmanfang ist C-Style

    7. Die Zeile in deinem Programm, die eigentlich am ehesten ein Kommentar benötigen würde, hat keines:

    groesse = zahl - abs(zahl - zeilen);
    

    Ich bin selber nicht gerade ein C++-Experte, aber ich dachte ich könnte dir vielleicht etwas Hilfestellung geben.
    Falls also einer der C++-Cracks (das ist lieb gemeint :P) einen Fehler in meinem Post sieht (ausgeschlossen Rechtschreibfehler, darf man behalten), bitte bescheid geben, ich will ja keinen Unsinn verzapfen!

    Na dann mal viel Erfolg mit deinem Progrämmchen


Anmelden zum Antworten