C :: Aufgabe #5

3 Lösungen Lösungen öffentlich

Ausgabe Weihnachtsbaum

Anfänger - C von Gustl - 07.12.2012 um 18:44 Uhr
Schreiben Sie ein Konsolenprogramm welches einen Weihnachtsbaum ausgibt.
Vor der Ausgabe soll noch die Höhe des Weihnachtsbaum abgefragt werden. (MIN 3)
Der Weihnachtsbaum soll bei einer Höheneingabe von 10 folgendermaßen aussehen:

Konsolenausgabe:

      *
***
*****
***
*****
*******
*****
*******
*********
###


Die Schwierigkeit besteht in den Stufenabschnitten der Tanne. Die Zeile die die meisten Sterne enthält sollte natürlich dann auch die letzte sein, also muss das Programm vielleicht bei einer zu großen Höheneingabe das Zeichnen der Sterne abbrechen und dann den Stamm ausgeben. (So wie bei diesem Beispiel, angegeben ist 10 aber der Baum hat nur 10 Reihen, ohne Baumstamm)

Lösungen:

vote_ok
von devnull (8870 Punkte) - 29.06.2013 um 21:03 Uhr
Quellcode ausblenden C-Code
/****************************************
 * baum.c     Weihnachtsbaum
 * 
 * OS     :   GNU/Linux
 * compile:   gcc -Wall -o baum baum.c
 * example:   ./baum 10
 *
 * devnull    29-06-2013                
 ****************************************/
#include <stdlib.h>
#include <stdio.h>

int width( int row )
{
  return ((row-1)/3 + (row-1)%3 )*2	+ 1;
}

void print_row( int row, int mrow )
{
	int i,mtree,wtree,wleft;
	char ctree;

    mtree = (mrow>3)?(mrow-(mrow-1)%3-1):mrow;
	ctree = (row>mtree)?'#':'*';
	wtree = (row>mtree)?(mrow<7?1:3):width(row);
	wleft = (width(mtree)-wtree)/2 + 1;
	for (i=1;i<=wleft;i++) printf(" ");  
	for (i=1;i<=wtree;i++) printf("%c",ctree);  
	printf("\n"); 
}

/* main */
int main( int argc, char **argv )
{
	int maxrow=10;
	int row;

    if (argc>1) {
		maxrow = atoi(argv[1]);
		maxrow = (maxrow<3)?3:maxrow;
	}
	for (row=1;row<=maxrow;row++) 
		print_row(row,maxrow);
	return 0;
}
vote_ok
von mraimbot (590 Punkte) - 08.01.2019 um 01:01 Uhr

Konsolenausgabe:

\C-Aufgaben> .\Aufgabe-0005.exe
Wie viele Reihen soll ein Baumteil haben?: 3
Wie gross soll der Baum werden (in Zeilen)?: 10
*
***
*****
***
*****
*******
*****
*******
*********
###

\C-Aufgaben> .\Aufgabe-0005.exe
Wie viele Reihen soll ein Baumteil haben?: 5
Wie gross soll der Baum werden (in Zeilen)?: 11
*
***
*****
*******
*********
*******
*********
***********
*************
***************
###
Quellcode ausblenden C-Code
///////////////////////////////////////////////////////////
//! @file Aufgabe-0005.c
//! @date 08.01.2019
//! @author Sebastian Schröder
//! @details
//! Compiler    : gcc 5.1.0
//! C-FLAGS     : -pipe -std=c99 -Wall -Wextra -pedantic -Werror -D_DEFAULT_SOURCE -O0 -g -o Aufgabe-0005.exe Aufgabe-0005.c
//! Testumgebung: Windows 10 - Windows PowerShell
//!
//! Aufgabe: Ausgabe Weihnachtsbaum
//! Schreiben Sie ein Konsolenprogramm welches einen Weihnachtsbaum ausgibt.
//! Vor der Ausgabe soll noch die Höhe des Weihnachtsbaum abgefragt werden. (MIN 3)
//! Der Weihnachtsbaum soll bei einer Höheneingabe von 10 folgendermaßen aussehen:
//! Konsolenausgabe:
//! 
//!       *
//!      ***
//!     *****
//!      ***
//!     *****
//!    *******
//!     *****
//!    *******
//!   *********
//!      ###
//! 
//! Die Schwierigkeit besteht in den Stufenabschnitten der Tanne. Die Zeile die die meisten Sterne enthält
//! sollte natürlich dann auch die letzte sein, also muss das Programm vielleicht bei einer zu großen Höheneingabe
//! das Zeichnen der Sterne abbrechen und dann den Stamm ausgeben. (So wie bei diesem Beispiel, angegeben ist 10
//! aber der Baum hat nur 10 Reihen, ohne Baumstamm)
///////////////////////////////////////////////////////////


#include <stdio.h>
#include <stdlib.h>


#define TREEOFFSET 3


void printTree(int treeHeight, int treePartSize);
int getNumber (int min, const char *output);


int main (/*int argc, char **argv*/) {
	printTree (getNumber (3, "Wie gross soll der Baum werden (in Zeilen)?: "), getNumber (2, "Wie viele Reihen soll ein Baumteil haben?: "));
	return EXIT_SUCCESS;
}


void printTree(int treeHeight, int treePartSize) {
	treeHeight--;
	int sizeLastPart = treeHeight % treePartSize;
	int numParts = treeHeight / treePartSize + (sizeLastPart == 0 ? 0 : 1);
	int numSegments = 0;
	int currTreePartSize;
	int centerPos = numParts * (treePartSize - 1) - numParts + TREEOFFSET + 1;
	int i;
	
	for (int partID = 0; partID < numParts; ++partID) {
		currTreePartSize = (partID == numParts -1 && sizeLastPart > 0) ? sizeLastPart : treePartSize;
		for (int row = 0; row < currTreePartSize; ++row) {
			/* print offset */
			for (i = 0; i < TREEOFFSET; ++i) {
				printf (" ");
			}
			/* print free room on left side */
			for (i = TREEOFFSET; i < centerPos - numSegments; ++i) {
				printf (" ");
			}
			/* print left side of tree */
			for (i = 0; i < numSegments; ++i) {
				printf ("*");
			}
			/* print center of tree */
			printf ("*");
			/* print right side of tree */
			for (i = 0; i < numSegments; ++i) {
				printf ("*");
			}
			printf ("\n");
			numSegments++;
		}
		numSegments -= 2;
	}
	/* print trunk of tree */
	for (i = 0; i < centerPos - 1; ++i) {
		printf (" ");
	}
	printf ("###\n");
}


int getNumber (int min, const char *output) {
	int value = 0;
	int check = 0;
	char ch;

	do {
		printf ("%s", output);
		check = scanf ("%i", &value);

		while ((ch = getchar ()) != '\n' && ch != EOF);

		if (1 != check) {
			printf("Eingabe ungueltig. Eingabe muss eine positive Ganzzahl sein.\n");
		}

		if (min > value) {
			printf("Eingabe ungueltig. Eingabe muss mindestens %i betragen.\n", min);
			check = 0;
		}
	} while (check != 1);
	
	return value;
}


#undef TREEOFFSET
vote_ok
von kathleenw (3600 Punkte) - 21.07.2020 um 12:15 Uhr
Quellcode ausblenden C-Code
#include <stdio.h>
#include <stdlib.h>

void zeichne_stamm(int hoehe, int breite_stamm)
{
    int j;
    
    for (j=1; j<=(hoehe - breite_stamm)/2; j++) {
        printf(" ");
    }
    for (j=((hoehe - breite_stamm)/2)+1; j<=((hoehe - breite_stamm)/2)+breite_stamm; j++) {
        printf("#");
    }
    for (j=((hoehe - breite_stamm)/2)+breite_stamm+1; j<hoehe; j++) {
        printf(" ");
    }
    printf("\n");
}

void zeichne_baum(int hoehe, int baum[], int hoehe_baum)
{
    int i,j;
    
    for (i=1; i<= hoehe_baum; i++) {
        for (j=1; j<=(hoehe - baum[i])/2; j++) {
            printf(" ");
        }
        for (j=((hoehe - baum[i])/2)+1; j<=((hoehe - baum[i])/2)+baum[i]; j++) {
            printf("*");
        }
        for (j=((hoehe - baum[i])/2)+baum[i]+1; j<hoehe; j++) {
            printf(" ");
        }
        printf ("\n");
    }
}

int main(void)
{
    int hoehe, i, j, ebenen, z, z_start, hoehe_stamm, hoehe_baum, breite_stamm;
    
    printf("Wie hoch soll der Baum werden? Bitte nur Werte größer gleich 3. ");
    if (scanf("%d", &hoehe)!=1) {
        printf("Falsche Eingabe.\n");
        return EXIT_FAILURE;
    }
    if (hoehe<3) {
        printf("Falsche Eingabe.\n");
        return EXIT_FAILURE;
    }
    
    int baum[hoehe+1];
    ebenen = hoehe / 3;
    z_start= hoehe - 1;
    z = hoehe - 1;
    hoehe_baum = ebenen * 3;
    hoehe_stamm = hoehe - (ebenen * 3);
    if (hoehe > 12)
        breite_stamm = 5;
    else
        breite_stamm = 3;
    

    //Breite der Ebenen in Array von 1 bis hoehe-1
    for (j = 0; j < hoehe_baum; j = j + 3) {
        for (i=1; i<=3; i++){
            baum[i + j] = hoehe - z;
            z = z - 2;
        }
        z_start = z_start - 2;
        z = z_start;
    }
    
    //Zeichne Baum
    
    zeichne_baum(hoehe, baum, hoehe_baum);
     
    //Zeichne Stamm
    for (i = 0; i<hoehe_stamm; i++)
        zeichne_stamm(hoehe,breite_stamm);
    
    //Sollte kein Stammm gehen weil durch 3 teilbar dann zeichne einen ran
    if (hoehe_stamm==0)
        zeichne_stamm(hoehe,breite_stamm);
    
    return EXIT_SUCCESS;
}