Bildschirmausgabe Sanduhr - ADS



  • Hallo zusammen!

    Ich hänge gerade an einer Aufgabe und komme irgendwie nicht auf die Lösung.

    Ich soll mit C einen Algorithmus ein Programm entwickeln, mit dem ich verschiedene Parameter (Höhe und Breite) einlesen kann und diese dann wie bei folgendem Beispielen ausgegeben werden:
    Höhe=5, Breite=5
    XOOOX
    XXOXX
    XXXXX
    XXOXX
    XOOOX

    oder
    Höhe=4, Breite=3
    XOX
    XXX
    XXX
    XOX

    oder
    Höhe=5, Breite=9
    XOOOOOOOX
    XXOOOOOXX
    XXXOOOXXX
    XXOOOOOXX
    XOOOOOOOX

    Soweit bin ich bisher (fktx ist eine kurzaufgabe die da mit reinsoll):

    [cpp]#include <stdio.h>
    
    void fktx(int h, int b)
    {
        int i,j;
    
        for(i = 0; i < h; i++)
        {
            printf("\n");
            for(j = 0; j < b; j++)
            {
                printf("X");
            }
        }
    }
    
    void sanduhr(int h, int b)
    {
        int i,j,k;
    
        for(i = 0; i < h; i++)
        {
            printf("\n");
            for(j = 0; j < b; j++)
            {
                printf("X");
                for(k = 0; k < b-2*j; k++)
                {
                    printf("O");
                }
            }
        }
    }
    
    int main(void)
    {
        fktx(4,5);
        printf("\n");
        sanduhr(5,5);
    }
    [/cpp]
    

    Die dritte for-schleife ist natürlich humbuck...hab alles probiert was mir einfällt...auch mit while oder if oder ähnliches.

    Wäre super eine Hilfe zu bekommen..ein großer Tipp oder so 🙂

    Gruß



  • naja:

    #include <stdio.h>
    #include <conio.h>
    
    int main(void){
    
    	int i,j;
    	int sub=2;
    	int SUB=2;
    	int leng = 5;
    	int breite = 7;
    
    	for(i=0; i<leng; i++){ // zeile		
    			for(j=0; j<sub/2; j++)
    				printf("X");
    			for(j=0; j<breite-sub; j++)
    				printf("O");
    			for(j=0; j<sub/2; j++)
    				printf("X");
    		if(i==leng/2)
    			SUB*=-1;
    		sub+=SUB;
    		printf("\n");
    	}
    
    	getch();
    	return 0;
    }
    


  • Hallo itedvo!

    Danke für deinen Vorschlag. Es funktioniert, allerdings nur mit den höhe=5 und breite=7. Wenn der Wert der Höhe geändert wieder, kommt eine falsche Ausgabe.

    Gruß



  • es funktioniert so gut wie bei jedem wert, es gibt jedoch ausnahmen...

    zum beispiel breite 5 und laenge ebenfall 5... da muss ich noch kurz drann feilen,
    aber grundsátzlich funktionierts... hab dass noch kurz geschrieben bevor ich in
    den ausgang gegangen bin, ich schreibe gerade von einem pc in einem lokal 😋



  • #include <stdio.h> 
    
    #define MY_MAX(x,y) ((x) < (y) ? (y) : (x)) 
    
    typedef struct{ 
        int Hoehe; 
        int Breite; 
    }SandUhr; 
    
    static unsigned SandEinlesen(SandUhr* InOut){ 
        printf("Bitte Hoehe und Breite eingeben >> "); 
        if(scanf("%d%d", &InOut->Hoehe, &InOut->Breite) == 2) 
            if(InOut->Hoehe > 0 && InOut->Breite > 0) 
                return 1; 
        return 0; 
    } 
    
    static int SandBerechnen(const SandUhr* IN, int idx){ 
        int tmpIdx, 
            zwRes = IN->Hoehe >> 1, 
            maxSand = IN->Breite > 2 ? IN->Breite - 2 : 0; 
        tmpIdx = idx < zwRes ? idx : IN->Hoehe - 1 - idx; 
        return MY_MAX(maxSand - (tmpIdx << 1), 0); 
    } 
    
    static void ZeichenAusgeben(char Zeichen, unsigned So_Oft_Bitte){ 
        unsigned j; 
        for(j = 0; j < So_Oft_Bitte; ++j) 
            putchar(Zeichen); 
    } 
    
    int main(){ 
        int i, glasDicke, sandDicke; 
        SandUhr Wunsch; 
        char Sand = 'O', Glas = 'X'; 
    
        if(SandEinlesen(&Wunsch)){ 
            for(i = 0; i < Wunsch.Hoehe; ++i){ 
                if(Wunsch.Breite > 1){ 
                    sandDicke = SandBerechnen(&Wunsch, i); 
                    glasDicke = MY_MAX(((Wunsch.Breite - sandDicke) >> 1), 1);
                    ZeichenAusgeben(Glas, glasDicke);
    				if(sandDicke)
    					ZeichenAusgeben(Sand, sandDicke);
    				else if(Wunsch.Breite & 1)
    					ZeichenAusgeben(Glas, 1);
                    ZeichenAusgeben(Glas, glasDicke);
                } 
                else 
                    putchar(Glas); 
                putchar('\n'); 
            } 
        } 
        return 0; 
    }
    

    🙂



  • ok, so ginge es auch... wobei die frage ist, ob das mit static wirklich
    notwendig ist =b



  • Danke Euch beiden. Dass hat mir sehr weitergeholfen. Ich werde noch an eine "eigene" Lösung tüfteln und Eure Codes als Lösungsansatz benutzen 🙂


Log in to reply