Tannenbaum?
-
Hi Leute!
Ich soll ein Programm schreiben, dass mir folgendes Bild (Tannenbaum) ausgibt:
* *** ***** * * *
Mein code dazu:
#include<stdio.h> int main() { int i, j; for(i=0; i<3; i=i+1) { putchar(' '); } for(i=0; i<1; i=i+1) { putchar('*'); } for(i=0; i<3; i=i+1) { putchar(' '); } putchar('\n'); for(i=0; i<2; i=i+1) { putchar(' '); } for(i=0; i<3; i=i+1) { putchar('*'); } for(i=0; i<2; i=i+1) { putchar(' '); } putchar('\n'); for(i=0; i<1; i=i+1) { putchar(' '); } for(i=0; i<5; i=i+1) { putchar('*'); } for(i=0; i<1; i=i+1) { putchar(' '); } putchar('\n'); for(i=0; i<7; i=i+1) { putchar('*'); } for(j=0; j<3; j=j+1) { putchar('\n'); for(i=0; i<3; i=i+1) { putchar(' '); } for(i=0; i<1; i=i+1) { putchar('*'); } for(i=0; i<3; i=i+1) { putchar(' '); } } return 0; }
Wo kann man da was verbessern? Arrays soll ich nicht verwenden...
-
print(" *\n"); print(" ***\n"); print(" *****\n"); print(" *\"); print(" *\"); print(" *\"); print(" *\");
-
printf(" *\n"); printf(" ***\n"); printf(" *****\n"); printf(" *\n"); printf(" *\n"); printf(" *\n"); printf(" *\n");
-
printf( " * \n" " *** \n" " ***** \n" " * \n" " * \n" " * \n" " * \n");
-
Um mal die eigentlich Frage zu beantworten: Derzeit erledigt dein Programm ganz exakt eine Aufgabe und diese umständlich. Siehe die anderen Beiträge, wie man eine ganz bestimmte Ausgabe viel direkter erzeugen kann. Aber mit den Schleifen bist du dennoch auf den richtigen Weg: Werde abstrakter! Schreib ein Programm für Tannenbäume beliebiger Höhe. Dies ist allgemein guter Stil, weil man für nur wenig Mehraufwand wesentlich flexiblere Lösungen bekommt.
Reicht dir dies als Bemerkung oder soll ich konkreter werden?
-
SeppJ schrieb:
... Schreib ein Programm für Tannenbäume beliebiger Höhe. Dies ist allgemein guter Stil, weil man für nur wenig Mehraufwand wesentlich flexiblere Lösungen bekommt. ...
Und morgen haben wir hier die Frage ´wie programmiere ich einen Osterhasen?´
Da sind dann die grossen Ohren schwierig! :p
-
Hallo bandchef,
Ich habe meine aktuelle Schlaflosigkeit ausgenutzt und ein kleines Programm für dein Problem geschrieben, welches wesentlich flexibler und "sauberer" ist als dein ursprünglicher Code. Es geht in die Richtung die Sepp3 schon vorgegeben hat.
Man kann sicherlich noch etwas daran verbessern bzw. optimieren, aber ich denke es ist eine gut lesbare Lösung. Im Grunde ist die eigentliche Funktion in print_tannenbaum gekapselt.
Als Parameter gibst du die gewünschte Breite und Höhe sowie das "Zeichenzeichen" an. Damit der Stamm auch schön zentriert zur Krone (kann man das bei einer Tanne auch so nennen?) sind ausschließlich ungerade Breiten zulässig.
Die Angabe der Höhe ist eigentlich nur eine Formsache - man könnte auch ein bestimmtes Verhältnis codieren, so kannst du die Stammlänge noch beeinflussen oder du könntest sogar prinzipiell auch Pyramiden mit der Funktion zeichnen (Einfach Höhe = Breite / 2 übergeben).
Hier der Code:
#include <stdio.h> void print_tannenbaum(int, int, char); /* */ int main (int argc, const char** argv) { /* To ensure that the fir tree will be centric all sizes must not be mod 2 */ const int max_size = 39; const int step_size = 5; int current_size = 7; for (; current_size < max_size; current_size += step_size) { print_tannenbaum(current_size, current_size, '*'); printf("\n"); } return 0; } /* * This function prints a fir tree with the given width and height * and character to the standard output. */ void print_tannenbaum(int width, int height, char character) { int y = 0; int x = 0; int whitespaces = 0; /* Return without output if the given width - 1 isn't mod 2. This makes the drawing easier. */ if (((width - 1) % 2) != 0) return; whitespaces = width / 2; /* Print the fir tree */ for(y = 0; y < height; y++) { /* If whitespaces are > 0 we are drawing the top of the fir tree. Otherwise we have to draw the root. */ if (whitespaces > 0) { for (x = 0; x < whitespaces; x++) printf(" "); for (x = 0; x < width - (2 * whitespaces); x++) printf("%c", character); } else { /* The root's width is always a 4th of the fir tree's width. If the root's width is mod 2 we must add 1 to center the root in relation to the fir tree. */ int root_width = width / 4; if (root_width % 2 == 0) root_width++; for (x = 0; x < (width / 2) - (width / 8); x++) printf(" "); for (x = 0; x < root_width; x++) printf("%c", character); } whitespaces--; printf("\n"); } }
Und die Ausgabe zu diesem Beispielcode:
* *** ***** * * * * * *** ***** ******* ********* *********** ************* *************** ***** ***** ***** ***** ***** ***** ***** ***** ***** * *** ***** ******* ********* *********** ************* *************** ***************** ******************* ********************* *********************** ************************* ******* ******* ******* ******* ******* ******* ******* ******* ******* ******* ******* ******* ******* ******* * *** ***** ******* ********* *********** ************* *************** ***************** ******************* ********************* *********************** ************************* *************************** ***************************** ******************************* ********************************* *********************************** ********* ********* ********* ********* ********* ********* ********* ********* ********* ********* ********* ********* ********* ********* ********* ********* ********* ********* *********
Beste Grüße,
Alexander
-
SeppJ schrieb:
Um mal die eigentlich Frage zu beantworten: Derzeit erledigt dein Programm ganz exakt eine Aufgabe und diese umständlich. Siehe die anderen Beiträge, wie man eine ganz bestimmte Ausgabe viel direkter erzeugen kann. Aber mit den Schleifen bist du dennoch auf den richtigen Weg: Werde abstrakter! Schreib ein Programm für Tannenbäume beliebiger Höhe. Dies ist allgemein guter Stil, weil man für nur wenig Mehraufwand wesentlich flexiblere Lösungen bekommt.
Reicht dir dies als Bemerkung oder soll ich konkreter werden?
Das hast Du jetzt von so Vorschlägen :xmas1:
-
Wenn man's ganz genau nimmt, sind Zeichenketten auch Arrays (const char[]). Bitte nicht nachfragen, in "Rund um die Programmierung" gibt's einen 8-Seiten-Thread darüber und mehr werden es auch hoffentlich nicht.
-
picaschaf schrieb:
.... Man kann sicherlich noch etwas daran verbessern bzw. optimieren, aber ....
.... es fehlen noch die Lichter - am besten flackernd - an deinem Tannenbaum.
-
lässt sich ja leicht machen... einfach wenn möglich alle 2 zeichen ne andere farbe nehmen und das ganze mit 200-300 ms abstand machen... =b