Problem bei Tannenbaumprogramm



  • Hallo c++ com;

    ich habe ein Programm erstellt was Weihnachtsbäume asugeben soll dies sieht wie folgt aus
    #include <iostream>

    using namespace std;

    int main()
    {
    int h;

    cout << "Weihnachtsbaumzeichner by luisli" << endl;
    cout << "Gebe die Hoehe des baumes an: ";
    cin >> h;
    const int n = h;
    
    if (h >= 3, h <= 15)
    {
    	int h1 = 1;
    	int cloneh = h;
    	int cloneh1 = h1;
    	int clonehh = h;
    	char c = ' ';
    	char d = '*';
    	char a = h * c;
    	char b = h1 * d;
    	char e = cloneh * c;
    	
    	for(int i = 0; i < (n+1); i++)
    	{
    		
    		cout << a << b << endl;
    		h --;
    		h1 + 2;
    	}
    	cout << e << "#" << endl;	
    	}
    	else 
    	{
    		cout << "Falsche Eingabe. Programm wird beendet." << endl;
    	}
    	
    	getchar();
    	return 0;
    

    }
    das Programm hat aber nicht den outpout den ich will
    Output von dem was passiert
    á*
    á*
    á*
    á*
    á*
    á*
    á#
    Output den ich haben will
    -----*
    ----***
    ---*****
    --*******
    -*********
    -----#

    bindestrich = leerzeichen
    vielen dank im vorraus
    luis



  • if (h >= 3, h <= 15) das macht sicher nicht, was du denkst.

    Benutze einen Debugger und schau dir an, was dein Programm tut.

    Bis Weihnachten ist ja noch etwas Zeit 😉



  • @manni66 bei cppshell sagt er das der linke Operator keine Auswirkungen hat selbst wenn ich das ändere oder wegmach hat er mir nur(bei 5)
    á*
    á*
    á*
    á*
    á*
    á*
    á#
    ausgegeben


  • Mod

    Wie viel ist denn Leerzeichen mal Sternchen deiner Meinung nach?



  • @SeppJ was meinst du damit



  • @luis keine Ahnung was @SeppJ gemeint hat. Aber rechne mal '*' * '*' und denk darüber nach ob das irgendeinen sinn ergibt.



  • Meine Güte, macht es einem Anfänger doch nicht schwerer, als es ist.

    In C++ ist char ein Typ, der im Prinzip wie eine Zahl funktioniert, aber bei der Ausgabe das Zeichen ausgibt, dessen Code der Zahl entspricht. Wenn du char c = ' '; schreibst, dann wird c der Zeichencode vom Leerzeichen zugewiesen. Bei ASCII ist das 32. Dann multiplizierst du c mit der eingelesenen Zahl h. Also z.B. bei einer Höhe von 7 würdest du nun 7*32 rechnen und das Ergebnis wieder in den char-Zahlenbereich abschneiden und als Zeichen interpretieren. Das willst du nicht 🙂

    Für variabel lange Zeichenketten nimmt man in C++ den Typ std::string. Schau dir den Constructor (2) hier an: https://en.cppreference.com/w/cpp/string/basic_string/basic_string
    Mit auto s = std::string(10, 'x'); std::cout << s << "\n"; kannst du dir z.B. einen String mit 10 'x'en erzeugen und ausgeben.
    Oder du gibst die Zeichen mit einer for-Loop aus: for (int i = 0; i < 10; ++i) cout << 'X';



  • @wob sagte in Problem bei Tannenbaumprogramm:

    In C++ ist char ein Typ, der im Prinzip wie eine Zahl funktioniert

    sorry, aber so ist es etwas irreführend. char ist ein signed oder unsigned integer type. unterscheidet sich in genau garnichts von anderen integer types.


  • Mod

    @Swordfish sagte in Problem bei Tannenbaumprogramm:

    @wob sagte in Problem bei Tannenbaumprogramm:

    In C++ ist char ein Typ, der im Prinzip wie eine Zahl funktioniert

    sorry, aber so ist es etwas irreführend. char ist ein signed oder unsigned integer type. unterscheidet sich in genau garnichts von anderen integer types.

    Sonderbehandlungen durch jede Ausgabefunktion findest du nicht erwähnenswert? Der ist ein großer Teil von Funktion.



  • @SeppJ sagte in Problem bei Tannenbaumprogramm:

    durch jede Ausgabefunktion

    doch nur bei den io und sstreams



  • @Swordfish
    Ich weiß nicht, aber der Code erinnert mich ein wenig an Python.

    Und unter Python liefert der Ausdruck 4 * ' ' vier Leerzeichen. Folgender Code liefert einen kleinen Tannenbaum.

    4 * ' ' + 1 * '*'
    3 * ' ' + 3 * '*'
    2 * ' ' + 5 * '*'
    

    Vielleicht weht daher der Wind.

    @luis
    Ist dir bewußt dass jedes Zeichen intern durch eine Zahl dargestellt wird?



  • @Quiche-Lorraine sagte in Problem bei Tannenbaumprogramm:

    @luis
    Ist dir bewußt dass jedes Zeichen intern durch eine Zahl dargestellt wird?

    und dass ein char nur ein Zeichen aufnehmen kann
    (und eigentlich auch nur ein int mit kleinem Wertebereich ist)



  • @wob das Problem ist es wird trotzdem nur, selbst wenn ich die Chars durch alles was geht ersetze, wird wieder nur (beispielsweise)
    p1
    p1
    p1
    p1
    p1
    p#
    ausgegeben.
    Ich vermute das liegt an h-- und h1-2 das die Chars a und b nicht geupdated werden wie kann ich das ändern.
    Viele dank im vorraus
    luis



  • Ich verstehe nicht, was du mir dieser Antwort sagen willst bzw. warum du scheinbar glaubst, dass ich erraten kann, was dein Problem ist.



  • @wob
    weil deine Antwort am meisten weitergeholfen hat.
    Habe jetzt auch verstanden was du meintest, aber wie soll ich das umsetzten, weil wenn ich anstatt der char ein integer einsetz kommt ja eine zahl raus.



  • @luis Du könntest erstmal freundlicherweise vorarbeit leisten und deinen Eingangsbeitrag zu diesem Thema ordentlich formatieren und Deine Variablen sinnvoll benennen. So habe ich nichtmal Lust das zu lesen.





  • @luis du kannst das auch gleich mit deinem aktuellen Coden machen und den hier rein Stellen.



  • @luis sagte in Problem bei Tannenbaumprogramm:

    Output den ich haben will
    -----*
    ----***
    ---*****
    --*******
    -*********
    -----#
    bindestrich = leerzeichen

    Ach, ich weiß doch auch nicht.

    #include <cstdlib>
    #include <iostream>
    #include <string>
    
    int main()
    {	
    	std::cout << "Height: ";
    	int height;
    	if (!(std::cin >> height) || !height) {
    		std::cerr << "Input error.\nbye.\n\n";
    		return EXIT_FAILURE;
    	}
    
    	for (int line{}; line + 1 < height; ++line)
    		std::cout << std::string(height - line - 1, ' ') << std::string(line * 2 + 1, '*') << '\n';
    	std::cout << std::string(height - 1, ' ') << "#\n";
    }
    

    oder mit manipulators. Liest sich aber viel hässlicher:

    	for (int line{}; line + 1 < height; ++line)
    		std::cout << std::setw(height - line - 1) << std::setfill(' ') << ' ' << std::setw(line * 2 + 2) << std::setfill('*') << '\n';
    	std::cout << std::setw(height + 1) << std::setfill(' ') << "#\n";
    

    oder mit schleifchen:

    	for (int line{}; line + 1 < height; ++line) {
    		for (int spaces{ 1 }; spaces < height - line; ++spaces)
    			std::cout.put(' ');
    		for (int stars{}; stars < line * 2 + 1; ++stars)
    			std::cout.put('*');
    		std::cout.put('\n');
    	}
    	
    	for (int spaces{ 1 }; spaces < height; ++spaces)
    		std::cout.put(' ');
    	std::cout << "#\n";
    

    aber man sollte es wahrscheinlich bleiben lassen. Es wird nur hässlicher.


Log in to reply