Seite 1 von 1

Wachsender Tannenbaum

Verfasst: So Jan 11, 2015 3:50 pm
von MartyMcFly1976
Hallo ihr Programierprofis !

Ich als Anfänger hab ein Problem bei der C Programierung, ich sollte ein wachsendes Dreieck programieren und dies funktioniert auch !

Ich möchte das Programm aber gerne etwas umschreiben und komme aber nicht auf die Richtige Lösung.

Über ein wenig Unterstützung und ein paar Denkanstöße würde ich mich sehr freuen.

Hier der Code den ich bis jetzt programiert hab.

Code: Alles auswählen

#include <stdio.h>
#include "conio.h"
 
int main(void)
{

    int i, j, k;
    int hoehe;
    int anzahlSterne, anzahlLeer;
 
    printf("\t\t\tDer wachsende Tannenbaum\n");
    printf("\t\tBitte die Hoehe des Tannnenbaumes eingeben:\t ");
    scanf("%d", &hoehe);
 
    for (i = 1; i <= hoehe; i++) 
    {
        
        anzahlLeer = i;
        anzahlSterne = (hoehe + 1 - i) * 2 - 1;
 
        for (j = 1; j <= anzahlLeer; j++) 
            printf(" ");
 
        for (k = 1; k <= anzahlSterne; k++)	
            printf("*");
 
        printf("\n");
    }
 
	getch();

    return 0;
}
Wie man im Text schon lesen kann, möchte ich das Dreieck umdrehen und wie einen Tannenbaum auf einem Stamm wachsen lassen.

Meine Fragen hierzu wären :

1 Wie bekomm ich das Dreieck gedreht?
2 Wie bekomme ich den Baum dann in die Mitte des Bildes?
3 Wie kann ich dann den Stamm unter dem Dreieck einfügen so das es nach einem Baum aussieht?

Danke schon mal für die Hilfe !

G.Marty

Re: Wachsender Tannenbaum

Verfasst: So Jan 11, 2015 5:28 pm
von cloidnerux
Ein guter Weg solche konkreten Probleme zu lösen ist es, sie in kleinere Teile zu untergliedern und einzeln zu lösen, wird auch "Teile und herrsche" genannt.

In deinem Fall bedeutet das, dass du 3 einzelne Probleme hast:
Wie zeichnet man den Stamm, wie die "Äste"(Dreieck) und wie verschiebt man das ganze in die Mitte.

Ein möglichkeit die Teilprobleme zu lösen ist ein "stupider" Ansatz. Einfach eine Lösung, egal wie umfangreich oder "hässlich" programmieren und dann Stückweise muster zu erkennen und das ganze vereinfachen.
Für das Umgekehrte Dreieck mit der Höhe 3:

Code: Alles auswählen

  *
 ***
*****
Kannst du einfach schauen wie viele Leerzeichen in der ersten Zeile eingefügt werden müssen, und wie viele Sterne, dann das selbe für die nächste und alle weiteren und schaust ob du irgendwelche Muster erkennen kannst.

Re: Wachsender Tannenbaum

Verfasst: So Jan 11, 2015 9:43 pm
von MartyMcFly1976
Hallo !

Danke erstmal für die Antwort, nur leider kann ich nicht wirklich was damit anfangen.

Das ich den Stamm über die Leerzeichen einzeichnen kann weiss ich, ich habe aber das Problem das ich das Dreieck weder gedreht noch in die Mitte bekomme um den Stamm darunter zu zeichnen. Auch das einsetzten von \t rückt nur die Sterne auseinander aber nicht das komplette Dreieck in die Mitte.

Das ist erst das zweite Programm was ich komplett allein schreiben soll und hänge nun schon seit Tagen an dieser Stelle fest. Weder über das Internet noch sonst finde ich einen Lösungsansatz um etwas weiter zu kommen.

Ich denke das der Fehler warum das Dreieck auf dem Kopf steht in dieser Zeile stekt :

Code: Alles auswählen

anzahlSterne = (hoehe + 1 - i) * 2 - 1;
Ich habe hier schon alles gedreht und die Werte verändert, leider ohne Erfolg.

MfG

Marty

Re: Wachsender Tannenbaum

Verfasst: Mo Jan 12, 2015 1:23 am
von canlot
Hey, tut mir Leid wenn ich nur den Code hier reinstelle aber es ist schon spät, kommt auch nicht wieder vor.
Aber wie ich sehe hast du je bereits Arbeit geleistet, so hatte ich gerade Lust, es nachzubauen, keine Kommentare leider :roll: aber du kannst dir Gedanken machen warum was und wie funktioniert und Morgen ist auch ein Tag ;)

Code: Alles auswählen

void baumkrone(int breite)
{
    int leerzeichen = breite/2 - 1;

    int sternchen = 1;

    for(int i = 0; i < breite/2; ++i)
    {
        for(int temp_leer = leerzeichen; temp_leer > 0; --temp_leer)
            std::cout << " ";

        for(int zeichen = sternchen; zeichen > 0; --zeichen)
            std::cout << "*";

        sternchen++;
        sternchen++;
        leerzeichen--;
        std::cout << std::endl;
    }
}
Das ist der Code für die Baumkrone, der Baumstamm ist ja auch einfacher.
std::cout musst du durch prints ersetzen abenfalls std::endl.

Re: Wachsender Tannenbaum

Verfasst: Mo Jan 12, 2015 4:50 pm
von mfro
weil ich rekursive Lösungen (meist) elegant finde:

Code: Alles auswählen

void christmas_tree(int width)
{
    char stars[] = "*************************************************************************************************";
    static int max_width = 0;

    if (width > max_width) max_width = width;

    if (width > 1)
    {
        christmas_tree(width - 1);
    }
    
    stars[width] = '\0';
    printf("%*s\n", max_width / 2 + width / 2, stars);
}

int main(int argc, char *argv[])
{
    int width;

    if (argc != 2)
    {   
        fprintf(stderr, "usage: %s <width of tree>\n", argv[0]);
        exit(1);
    }
    
    width = atoi(argv[1]);

    christmas_tree(width);
}   
Hier wird der rekursive Abstieg (allerdings ziemlich ineffektiv) dazu genutzt, herauszufinden "wo die Mitte" ist.

Re: Wachsender Tannenbaum

Verfasst: Mo Jan 12, 2015 5:19 pm
von Xin
mfro hat geschrieben:weil ich rekursive Lösungen (meist) elegant finde:

Code: Alles auswählen

void christmas_tree(int width)
{
    static int max_width = 0;
    if (width > max_width) max_width = width;
Hier wird der rekursive Abstieg (allerdings ziemlich ineffektiv) dazu genutzt, herauszufinden "wo die Mitte" ist.
Aber niemals mehr als einen Baum gleichzeitig zeichnen, sonst muss Weihnachten in Mutanten umgenannt werden :-D

Re: Wachsender Tannenbaum

Verfasst: Mo Jan 12, 2015 5:32 pm
von mfro
Xin hat geschrieben: Aber niemals mehr als einen Baum gleichzeitig zeichnen, sonst muss Weihnachten in Mutanten umgenannt werden :-D
Von Wäldern war hier nie die Rede ;).

Re: Wachsender Tannenbaum

Verfasst: Mo Jan 12, 2015 8:34 pm
von MartyMcFly1976
Hallo !

Danke für die Antworten aber wenn ich die Programme einfach so übernehme bringt das leider gar nichts und ist absolut nicht zielführend.

Ich wäre bei jeder Frage seitens meines Lehrers total überfragt und bitte mit mir DEUTSCH zu sprechen bzw. zu schreiben...... rekursive WAS ??...... static int max_width = 0; HÄ??

Ich hab bis jetzt 20 Unterichtsstunden absolviert und absolut keine Ahnung was in den letzten Antworten überhaupt steht.

Echt nett gemeint mit den speziellen Antworten aber ich muss hier beim Schulstoff bleiben, denn den muss ich ja auch erklären warum es so funktioniert.

Code: Alles auswählen

#include <stdio.h>
#include "conio.h"
 
int main(void)
{

    int i, j, k;
    int hoehe;
    int anzahlSterne, anzahlLeer;
 
 
    printf("\t\t\tDer wachsende Tannenbaum\n\n");
    printf("\t\tBitte die Hoehe des Tannnenbaumes eingeben:\t ");
    scanf("%d", &hoehe);
 
    for (i = 1; i <= hoehe; i++) 
    {
        anzahlLeer = hoehe - 1;
        anzahlSterne = 2 * i - 1;
 
        for (k = 1; k <= anzahlSterne; k++)	
            printf("*");

		for (j = 1; j <= anzahlLeer; j++) 
            printf(" ");
 
        printf("\n");
    }
 
	getch();

    return 0;
}
Bis hier hin bin ich heute gekommen und hab den Baum schon mal so umprogrammiert das er nicht mehr auf dem Kopf steht.

Nun muss ich nur noch die Zeile mit den Leerzeichen und dann den Stamm darunter anpassen.

Hier hänge ich jetzt wieder seit Stunden fest und komme einfach nicht weiter da ich den Sinn der Zeilen nicht verstehe und auch nicht deuten kann.

Und nochmal die BITTE an euch ich bin absoluter ANFÄNGER !!!

MfG

Marty

Re: Wachsender Tannenbaum

Verfasst: Di Jan 13, 2015 1:25 am
von Xin
Sieht doch schonmal schick aus. :-)

Nimm statt der Leerzeichen mal Punkte (".").
Dann siehst Du als erstes, dass Deine Leerzeichen sich hinter dem Baum befindet. Praktischerweise wären die Punkte vor dem Baum, um ihn einzurücken. ^^

Dann stellst Du fest, dass Du die Anzahle der Leerstellen von der Höhe des Baums abhängig machst und nicht von der Zeile, die Du zeichnest, also i.

Re: Wachsender Tannenbaum

Verfasst: Mi Jan 14, 2015 7:20 pm
von MartyMcFly1976
Soooooo..... ! :idea: :idea:

Danke für den Tip und heute hatte ich mal wieder Zeit mich an das Programm zu setzen.

Schaut gut aus :D

Als ich den Baum erstmal hatte, dann war das mit dem Stamm kein Problem mehr !

Code: Alles auswählen

#include <stdio.h>
#include "conio.h"

int main(void)
{

    int i, j, k,b;
    int hoehe;
    int anzahlSterne, anzahlLeer;
	int Baumstamm;

    printf("\t\t\tDer wachsende Tannenbaum\n\n");
    printf("\t\tBitte die Hoehe des Tannnenbaumes eingeben:\t ");
    scanf("%d", &hoehe);

    for (i = 1; i <= hoehe; i++)
    {
        anzahlLeer = hoehe + 1 - i;
        anzahlSterne = 2 * i - 1;
		Baumstamm = hoehe;

	   for (j = 1; j <= anzahlLeer; j++)
            printf(" ");

        for (k = 1; k <= anzahlSterne; k++)   
            printf("*");
		

        printf("\n");

    }
	
	for (b = 1; b <=Baumstamm; b++)
		printf(" ");
		printf("*\n");

	for (b = 1; b <=Baumstamm; b++)
		printf(" ");
		printf("*\n");

	for (b = 1; b <=Baumstamm; b++)
		printf(" ");
		printf("*\n");

	for (b = 1; b <=Baumstamm; b++)
		printf(" ");
		printf("*\n");
	
   getch();

    return 0;
}
Ich danke Euch für die Hilfe ! :D

MfG

Marty