Christbaum



  • Hi @ all

    Ich hab ein kleines C Problem 😉

    Ich hab als Aufgabe bekommen einen Christbaum aus Sternchen zu programmieren. Es soll ein Win32 Konsolenprogramm sein

    Er soll ungefähr so aussehen:

    ***
    *****
    *******
    *********
    ***

    Man kann es ja einfach machen und nur printf() schreiben.

    So hat sollen wir es nicht machen hat er gesagt.

    Wir sollen die Höhe des Baumes am Anfang eingeben

    Ich hab mir schon überlegt man könnte es irgendwie mit einer for Schleife machen oder??

    Die Schleife muss bei jeder Wiederholung 2 * dazu tun und ein " " (Leerzeichen) entfernen.

    Da hab ich aber nicht den Durchblick.

    Könnte mir jemand das erklären?

    Danke im Voraus

    Gruß Robert



  • So sollte er aussehen

    *
       ***
      *****
     *******
    *********
       ***
    

    Die Höhe soll am Anfang des Programms eingegeben werden

    Danke im voraus

    Gruß Robert



  • Ich hab mir schon überlegt man könnte es irgendwie mit einer for Schleife machen oder??

    Ja. Aus der Höhe deines Christbaums ergibt sich auhc die Breite. Also kannst du in einer for-Schleife von 1 bis Höhe durchwandern und jeweils eine Zeile ausgeben. Zuerst (Breite-Zählvariable)/2 Leerzeichen, dann Zählvariable Sternchen.

    Am Ende dann ncoh einen Stumpf passend zeichnen :xmas1:

    MfG SideWinder



  • ohh, guck mal,
    wenn der Baum 5 Zeichen hoch ist, dann hat er an oberster
    Stelle 4 Leerzeichen 1 Sternchen und 4 Leerzeichen.
    Also könnte man aus der Höhe, dann die Leerzeichen berechnen,
    die dann vor und nach dem Stern eingefügt werden.

    Also exakt hoehe-1 Leerzeichen, dann 1 Stern und wieder hoehe-1 Leerzeichen.
    Dann pro weiterer Zeile einfach 2 Leerzeichen weg und 2 Sternchen
    dazu.
    Dafür gibt es bestimmt ein paar Standard-Funktionen in C.
    Das ganze wiederholt man je nach Hoehe und am Ende noch den
    Baumstamm unten dran.
    Fertig.

    Gruß,
    DC

    Ohhhhhh... Zu spät!!!!



  • HI

    Ich kenn mich leier noch nicht so gut in C aus.

    void main (void)
    int ein;
    int i;
    {
    ein=5
    for(i=1;i=ein
    printf("%d",i);
    getch();
    }
    

    Nur wie das mit der for Schleife genau geht kapier ich nicht ganz

    Kann mir wer das erklären?

    Danke im voraus 😉

    Gruß Robert



  • void main (void)
    int ein;
    int i;
    {
    ein=5;
    for(i=1;i=ein
    printf("%d",i);
    getch();
    }
    

    So gehört es natürlich. Jetzt hab ich mich auch angemeldet 🙂

    Gruß Robert





  • void baum(int pos, int stop){
       int i;
       for(i=0; i<stop/2-pos; i++)
           printf(" ");
       for(i=0; i<pos; i++)
           printf("*");
       printf("*");
       for(i=0; i<pos; i++)
           printf("*");
       printf("\n");
       if(pos<stop)
           baum(pos+1,stop);
       if(pos==0) {
           for(i=0; i<stop/2-pos; i++)
              printf(" ");
           printf("*");
       }
    }
    
    int main() {
       baum(0,10);
       return 0;
    }
    

    Nur verwenden, wenns funktioniert und verstanden wurde. :xmas1:



  • Hi

    Ich hab mal was geschrieben

    #include <stdio.h>
    #include <conio.h>
    
    void main (void)
    
    {
    int a;
    int b;
    int c;
    int hoehe;
    
    hoehe=10;
    
           for(a=1;a<=(hoehe*2);a+=2)
    	{
    	for(c=1;c<=a;c++)
    		{       
    		printf("*");
    		}
                 printf("\n");
    	}
    getch();
    }
    

    Die Breite ist nun 2 mal so groß wie die Höhe.

    Nur wie sollen die Leerzeichen kommen. Sie sollen von oben nach unten weniger werden.

    so?

    for(b=hoehe;b<=0;b--)
            printf(" ");
    

    Das geht aber so nicht.

    Hat wer eine Idee=

    Danke im voraus;)

    Gruß Robert



  • versuch's mal mit:

    for(b=hoehe-a/2;b>0;--b) printf(" ");
    

    (schließlich hängt die Anzahl der LEerzeichen davon ab, in welcher Zeile du stehst)



  • Hi @ all

    Ich hab das ganze gestern noch geschrieben und es funktioniert und ich bin tottal happy 🙂

    /*Christbaum - For
    Robert Schilling
    23.12.2005*/
    
    #include <stdio.h>
    #include <conio.h>
    
    void main (void)
    
    {
    	int a,b,c;
    	int hoehe,sth,le,st;
    	char s[100];
    
    	do
    	{
    		printf("\nGeben Sie bitte die Hoehe ein [max 40]:  ");
    			gets(s);
    			sscanf(s,"%d",&hoehe);
    
    			if (0>=hoehe|hoehe>=40)
    				printf("Sie haben eine inkorrekte Eingabe gemacht\n");
    	}
    		while (0>=hoehe|hoehe>=40);
    
    	        for(a=1;a<=hoehe*2;a+=2)
    		{
    			for(b=hoehe-a/2;b>0;--b) 
    			{
    				printf(" ");
    			}
    			for(c=1;c<=a;c++)
    			{       
    				printf("*");
    			}
    			printf("\n");
    		}
    
    	for(sth=1;sth<=hoehe/3;sth++)
    		{
    
    		for(le=1;le<=hoehe-(hoehe/4);le++)
    			printf(" ");
    
    		for(st=1;st<=hoehe/2;st++)
    			printf("*");
    		printf("\n");
    	}
    
    printf("\n\nHappy X-Mas\n\n");
    
    getch();	
    }
    

    Gibts da noch Verbesserungen ???

    Happy X-Mas

    Gruß Robert



  • printf(" ") -> putchar(' ')

    printf("yadda\n") -> puts("yadda")

    getch() -> getchar()

    gets(s) -> fgets(s, laenge von s in bytes, stdin);

    | ist ein bitoperator. fuer logik nimm ||

    mehr leerzeichen in den befehlen verwenden: eins nach jedem komma und semikolon (aber nicht davor), je eins vor und nach einem gleichheitszeichen. keines vor einer schliessenden klammer und keines nach einer oeffnenden klammer, dafuer aber ein leerzeichen vor einer oeffnenden klammer und eines nach einer schliessenden klammer.
    liest sich besser.

    es heisst int main. am ende bitte auch ein return 0 oder wonach dir der sinn steht.

    saubere einrueckung: dein do-while ist deformiert, die beiden verschachtelten for loops danach sind eine ebene zu weit eingerueckt, bei deinem letzten for-loop ist die oeffnende blockklammer eine ebene zu weit drin.



  • Danke 👍

    Wie kann ich ungegrade Zahlen filtern?

    zb so

    if (hoehe="gerade")
    for...
    else
    for...

    Danke im Voraus

    Gruß Robert



  • es heißt

    if(hoehe=="gerade")
    

    Gerade/Ungerade lässt sich wunderbar mit modulo-rechnung filtern (zeichen 😵

    es berechnet den rest

    5 % 2 = 1
    6 % 2 = 0
    16 % 5 = 1

    von der art her ganz logisch, du musst

    hoehe % 2
    

    rechnen.

    was was ist solltest du ganz leicht kapieren (es können nur 1 und 0 entstehen)



  • Danke das geht super 👍 👍



  • Achja: IMMER int main() schreiben! ALles andere ist Bullshit!



  • Und warum 😕



  • ItsNotYou schrieb:

    es heißt

    if(hoehe=="gerade")
    

    nicht, wenn du stringinhalte vergleichen willst. ein pointervergleich mit einem stringliteral ist falsch, da sinnlos.

    es heisst int main und fertig! so stehts im standard, so wirds gemacht. grund: ein programm hat einen rueckgabewert, der den erfolg/misserfolg des programmes angibt. deswegen return 0;, wenn alles gut gelaufen ist.



  • Danke 👍 :xmas1:



  • c.rackwitz schrieb:

    ItsNotYou schrieb:

    es heißt

    if(hoehe=="gerade")
    

    nicht, wenn du stringinhalte vergleichen willst. ein pointervergleich mit einem stringliteral ist falsch, da sinnlos.

    es heisst int main und fertig! so stehts im standard, so wirds gemacht. grund: ein programm hat einen rueckgabewert, der den erfolg/misserfolg des programmes angibt. deswegen return 0;, wenn alles gut gelaufen ist.

    ich habe nur noch mal das if([...]) aufgenommen und das mit dem == klargestellt, das war kein bezug auf "gerade"...



  • nichtsdestotrotz sind diese beiden varianten korrekt aber zweifelhaften sinnes:

    if (foo = "bar")...
    if (foo == "bar")...
    

    laesst sich so schreiben:

    foo = "bar"; // da das if immer true sein wird. ein string liegt schliesslich nicht an adresse null
    if (!strcmp(foo, "bar"))... // wenn man c strings vergleichen will
    

    wollt ich nur der vollstaendigkeit halber losgeworden sein.


Anmelden zum Antworten