Hilfe beim Fehler finden in einem kleinen Programm



  • Servus,

    mein Problem ist, dass ich bei einem Programm, dass ich schreiben soll nicht ganz fertig werde bzw. den letzten Fehler nicht finde 😡 😡

    Die Aufgabe lautet ich soll ein Programm schreiben, dass wenn ich die Breite eingebe folgende Figur ausgeben werden soll:

    x
    xx
    xxx
    xxxx
    xxxxx
    xxxxx
    xxxx
    xxx
    xx
    x

    Also wenn ich z.b. 5 eingebe soll es die oben dargestellte Figur ausgeben.
    Ich hab mir gedacht ich mach es mit zwei Funktionen ein obers Dreieck und ein unteres. Mein Problem ist jetzt bei meinem code, dass bei dem unteren Dreieck nur die Umrandung des Dreiecks dargestellt wird und der Innenraum frei bleibt.

    Hier mein Code:

    #include <stdio.h>
    #include <stdlib.h>
    
    void oberesdreieck(int breite);
    void unteresdreieck(int breite);
    
    int main()
    {
        int breite;
    
        printf("Breite: ");
        scanf("%d", &breite);
    
        oberesdreieck(breite);
        unteresdreieck(breite);
    
    }
    
    void oberesdreieck(int breite)
    {
        int zeile, spalte;
    
        for(zeile=0; zeile<breite; zeile++)
        {
            for(spalte=0; spalte<zeile; spalte++)
            {
                printf("*");
            }
            printf("\n");
        }
    }
    
    void unteresdreieck(int breite)
    {
        int zeile, spalte;
    
        for(zeile=breite; zeile>=0; zeile--)
        {
            for(spalte=breite; spalte>=0; spalte--)
            {
                if(zeile==breite||zeile==breite-spalte||spalte==breite-zeile||spalte==breite)
                {
                    printf("*");
                }
                else
                {
                    printf(" ");
                }
    
            }
            printf("\n");
        }
    }
    

    wäre cool wenn wer wüsste wie ich das untere Dreieck auch noch voll bekomme.
    Denke mein Fehler liegt wohl iwo in Zeile 43 bei der Bedingung wann er die Sterne setzen soll...

    Danke


  • Mod

    Es ist doch zu vermuten, dass der Fehler in den Teilen liegt, in denen sich die beiden Funktionen unterscheiden. Erklaer doch mal den Sinn des Konstrukts in Zeilen 43 ff. In der ersten Funktion hast du nichts vergleichbares.

    Ist die Aufgabenstellung auch wirklich folgende?

    *
    **
    ***
    **
    *
    

    Typischerweise ist sie naemlich

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

    Dann wuerde auch auf einmal die besagte Konstruktion etwas mehr Sinn machen, aber dann waere die Funktion fuer die obere Haelfte falsch, die ja angeblich funktioniert. Hast du den Code aus verschiedenen Loesungen zusammen kopiert?



  • ja,die Aufgabenstellung lautet so.Die Breite, die ich eingebe soll bei der Figur die breiteste Stelle sein, also bei 5 solls so aussehen

    x
    xx
    xxx
    xxxx
    xxxxx
    xxxxx
    xxxx
    xxx
    xx
    x

    die erste funktion macht das obere Dreieck, also

    x
    xx
    xxx
    xxxx
    xxxxx

    die zweite sollte es genau andersherum machen, also

    xxxxx
    xxxx
    xxx
    xx
    x

    aber bei mir kommt folgende Figur heraus wenn ich das Programm ausführe

    x
    xx
    xxx
    xxxx
    xxxxx
    xxxxx
    x   x
    x  x
    x x
    x
    

    Ich wollte mit der zweiten Funktion bezwecken, dass eben die untere hälfte des Dreiecks ausgegeben wird, nur bleibt es eben innen leer. Zusammenkopiert hab ich nix.



  • Ja, aber wieso brauchst du die Leerzeichen?



  • Wenn ich keine Leerzeichen hernehme, kommt ein quadrat raus also

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

    durch die Leerzeichen komme ich auf die dreiecksform, jedoch bleibt es dann auch innen leer.

    im Grunde suche ich nur nach einer Möglichkeit so ein Dreieck auszugeben

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

    zu meinem code:

    zeile== breite -> dadurch wird die oberste line des dreiecks mit * ausgegeben, also die 5*

    zeile==breite-spalte -> dadurch wird die diagonale ausgegeben

    spalte==breite-zeile -> ok das kann man sich sparen, dadurch wird wieder die gleiche diagonale ausgegeben. Hab ich gerade gemerkt.

    spalte==breite -> dadurch werden die 5 Sterne ganz links nach unten hin ausgegeben.



  • vayacontoz schrieb:

    Wenn ich keine Leerzeichen hernehme, kommt ein quadrat raus also

    Das war nicht Sinn der Frage.
    Um diese Form zu zeichnen: Wieso brauchst du da Leerzeichen? Wo sind in diesem Dreieck Leerzeichen? Und wieso in dem unteren und nicht in dem oberen?
    Die Fragen sollen dazu dienen, dass du noch einmal nachdenkst. Das hat jetzt nichts mit deinem Code zu tun.



  • an dem schei** sitz ich jetz schon seit ein paar stunden und ich komm einfach nicht weiter....
    ich hab so ziemlich alle möglichen Formen rausbekommen nur nicht dieses verdammte auf dem Kopf stehende Dreieck



  • Ist n bißchen fies:

    int breite;
    scanf("%d", &breite); 
    int i = 0, j = 0;
    for( i = 0; i < breite; ++i )
    {
    	for( j = 0; j < i; ++j )
    		printf( "%s", "*" ); 
    	printf( "\n" ); 
    }
    for( ; i > 0; --i )
    {
    	for( j = 0; j < i; ++j )
    		printf( "%s", "*" ); 
    	printf( "\n" ); 
    }
    


  • Vielen dank, auf die Lösung wer ich nie und nimmer gekommen....

    eine Frage zu dem Code habe ich. Zeile 10 die for-Schleife. Warum ist da kein Startwert wie es normalerweise der Fall ist also z.b. for(i=0...

    sry. für die Frage, aber ich programmiere erst seit einem knappen Monat(Studienbeginn) und habe keine Vorkenntnisse.

    Danke.



  • vayacontoz schrieb:

    eine Frage zu dem Code habe ich. Zeile 10 die for-Schleife. Warum ist da kein Startwert wie es normalerweise der Fall ist also z.b. for(i=0...

    Nach dem Ende der ersten Schleife hat i den Wert breite, was auch gerade der passende Startwert für die zweite Schleife ist, also kann man die Initialisierung weglassen.



  • vayacontoz schrieb:

    eine Frage zu dem Code habe ich. Zeile 10 die for-Schleife. Warum ist da kein Startwert wie es normalerweise der Fall ist also z.b. for(i=0...

    Ja, das war es was ich mit "n bißchen fies" (für Anfänger) meinte.
    Die Zeile mit der ganzen Länge wird nicht, wie man eigentlich erwarten würde, in Schleife #1 ausgegeben, sondern erst in Schleife #2.

    EDIT:
    Ich hätte in Zeile 10 auch

    for( i = breite; i > 0; --i )
    

    schreiben können, aber es sollte ja auch ein Lerneffekt dabei sein, wenn ich es schon komplett präsentiere.



  • nochmals danke - jetzt kann ich beruhigt ins bett. 👍



  • vayacontoz schrieb:

    nochmals danke - jetzt kann ich beruhigt ins bett. 👍

    Gern geschehen. Wenn jemand richtig verzweifelt ist sollte man auch helfen dürfen.


Anmelden zum Antworten