Wachsender Tannenbaum

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
MartyMcFly1976
Beiträge: 34
Registriert: Sa Dez 06, 2014 5:56 pm

Wachsender Tannenbaum

Beitrag von MartyMcFly1976 » So Jan 11, 2015 3:50 pm

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
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Wachsender Tannenbaum

Beitrag von cloidnerux » So Jan 11, 2015 5:28 pm

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

MartyMcFly1976
Beiträge: 34
Registriert: Sa Dez 06, 2014 5:56 pm

Re: Wachsender Tannenbaum

Beitrag von MartyMcFly1976 » So Jan 11, 2015 9:43 pm

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

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: Wachsender Tannenbaum

Beitrag von canlot » Mo Jan 12, 2015 1:23 am

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.
Unwissenheit ist ein Segen

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Wachsender Tannenbaum

Beitrag von mfro » Mo Jan 12, 2015 4:50 pm

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.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Wachsender Tannenbaum

Beitrag von Xin » Mo Jan 12, 2015 5:19 pm

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
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Wachsender Tannenbaum

Beitrag von mfro » Mo Jan 12, 2015 5:32 pm

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 ;).
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

MartyMcFly1976
Beiträge: 34
Registriert: Sa Dez 06, 2014 5:56 pm

Re: Wachsender Tannenbaum

Beitrag von MartyMcFly1976 » Mo Jan 12, 2015 8:34 pm

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

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Wachsender Tannenbaum

Beitrag von Xin » Di Jan 13, 2015 1:25 am

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

MartyMcFly1976
Beiträge: 34
Registriert: Sa Dez 06, 2014 5:56 pm

Re: Wachsender Tannenbaum

Beitrag von MartyMcFly1976 » Mi Jan 14, 2015 7:20 pm

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

Antworten