Printf Art-Größe Abhängig von benutzereingabe. Wie?



  • Hi, ich habe ein kleines Problem.
    Am besten poste ich hier direkt die Aufgabenstellung und erklär dann wo mein Problem liegt.

    Schreiben Sie ein C-Programm, das bei Eingabe einer positiven ganzen Zahl n zwischen 1 und 21 ein
    Viereck auf der Konsole gemäß folgender Richtlinien ausgibt:
    Ist die eingelesene Zahl n gerade, dann soll ein Viereck mit einem angedeuteten „+“ durch Aufruf der
    von Ihnen zu implementierenden Funktion void plus(int a) ausgegeben werden, welches eine
    Größe von n Zeilen und n Spalten hat. Für den Aufruf plus(6) soll z.B. die folgende Ausgabe
    erfolgen:

    ++++++
    +-++-+
    ++++++
    ++++++
    +-++-+
    ++++++

    • Ist die eingelesene Zahl n ungerade, dann soll ein ein Viereck mit einem angedeuteten „x“
    durch Aufruf der von Ihnen zu implementierenden Funktion void kreuz(int a)
    ausgegeben werden, welches eine Größe von n Zeilen und n Spalten hat. Für den Aufruf
    kreuz(7) soll z.B. die folgende Ausgabe erfolgen:

    xxxxxxx
    xx---xx
    x-x-x-x
    x--x--x
    x-x-x-x
    xx---xx
    xxxxxxx

    Also die Unterscheidung zwischen Gerade/Ungerade ist kein Problem, einfach mit der Modulo-Funktion. Das ganze handle ich dann über einen if-else ab.
    Nur weiss ich nicht wie ich die Vierecke abhängig von der Variable N mache, ohne 20 verschiedene if-Fälle zu konstruieren?!
    (Anstatt dem "-" in den Vierecken sind Leerzeichen gefragt, wusste nur nicht wie ich das von der Formatierung hier richtig poste.
    Bitte um Hilfe, ich poste anbei auch gleich mal meinen bisherigen Code:

    #include<stdio.h>

    int n;

    int main()
    {
    printf("Geben sie eine ganze Zahl zwischen 1 und 21 ein\n");
    scanf("%d", &n);

    if ( n < 1 || n > 21){

    printf("Ungueltige Eingabe\n");
    }
    else{

    if ( n % 2 == 0 ) {
    }

    else {
    }

    }
    void plus(int a){

    }
    void kreuz(int a){

    }

    return 0;
    }

    Vielen Dank schonmal für die Hilfe 😉
    PS: Ich habe erst seit kurzem mit C angefangen, also gern alle Fehler anmerken.


  • Mod

    Kennst du schon Schleifen? Höchstwahrscheinlich ja, denn das ist eine typische Aufgabe, um den Umgang damit zu lernen.



  • Riallyyy schrieb:

    (Anstatt dem "-" in den Vierecken sind Leerzeichen gefragt, wusste nur nicht wie ich das von der Formatierung hier richtig poste.

    Du kannst den Text mit der Maus markieren und dann unter den Smilies die Formatierungen anklicken.
    Das ist Courier:
    `++++++

    +-++-+

    ++++++

    ++++++

    +-++-+

    ++++++`

    Das ist Code:

    xxxxxxx
    xx---xx
    x-x-x-x
    x--x--x
    x-x-x-x
    xx---xx
    xxxxxxx
    

    Und hier C

    #include<stdio.h>
    
    int n; 
    
    int main() 
    { 
            printf("Geben sie eine ganze Zahl zwischen 1 und 21 ein\n");   
            scanf("%d", &n);
    
        if ( n < 1 || n > 21){
    
            printf("Ungueltige Eingabe\n");
    }
        else{
    
            if ( n % 2 == 0 ) {
            }
    
            else {
            }
    
    }
       void plus(int a){
    
       }
       void kreuz(int a){
    
       }
    
       return 0;     
    }
    

    (in Farbe und bunt)

    Dein Einrückungsstil ist unübersichtlich.
    Und verzichte auf globale Variablen.

    Fang mit einem einfachen Quadrat an (ohne Leerzeichen)
    Finde die Gesetzmäßigkeit für die Muster heraus.

    Schleifen kann man verschachteln und sie müssen nicht bei einem festen Wert anfangen.

    Zur Ausgabe von einzelnen Zeichen braucht man auch kein printf. Da reicht putchar.



  • Ok vielen Dank schonmal für die Hilfe.
    Ich versuche mich jetzt nochmal daran und mal schaun was dabei rauskommt.



  • hat jemand vieleicht ne lösung?^^ komm mit dem plus viereck ned wirklich weiter und mit x kreuz noch gar nich angefangen ....


  • Mod

    Hast du ein normales Viereck hinbekommen? Zeig mal, was du hast.



  • #include <stdio.h>
    void plus(int a){
    	int d=a+1;
    	int b=a+1;
    	int c=a+1;
    	while (--b>0)
    	{
    	printf("+");
    	}
    	while(--c>0){
    		printf("\n");
    		while(--d>0){
    			if(d==a){
    				printf("+");
    			}
    			else if(d==a/2){
    				printf("+");
    			}
    			else if(d==((a/2)+1)){
    				printf("+");
    			}
    			else if(d==1){
    				printf("+");
    			}
    
    			else{
    				printf(" ");
    			}
    		}
    		d=a+1;
    	}
    
    }
    
    void kreuz (int a){
    }
    
    int main(){
    	int a;
    	printf("Gib eine Zahl zwischen 1 und 21 ein:");
    	scanf("%i",&a);
    	if(a<1||a>21){
    		printf("Fehler");
    		return 1;
    	}
    	else
    		if(a%2==0){
    			plus(a);
    		}
    		else{
    			kreuz(a);
    		}
    	return 0;	
    }
    

    so weit bin ich bis jetzt zeig halt für + die zeilen schon richtig jetzt halt nochmal verschachteln für des "große" plus im bild .... komm halt langsam nich mehr klar mit den verschachtelten while schleifen



  • #include <stdio.h>
    void plus(int a){
    	int d=a+1;
    	int b=a;
    	int c=a-1;
    	int e=a;
    	int f=a+1;
    	int g=a+1;
    	int h=a+1;
    	/*while (--b>0)
    	{
    	printf("+");
    	}*/
    	while(--c>0){
    		printf("\n");
    		if(c==a){
    			while(--h>0){
    				printf("+");
    			}
    		}
    		else if(c==((a/2)-1)){
    			while (--f>0){
    				printf("+");
    			}
    			printf("\n");
    		}
    		if(c==((a/2)-1)){
    			while(--g>0){
    				printf("+");
    			}
    			printf("\n");
    		}
    		while(--d>0){            //zeile +schreiben
    			if(d==a){
    				printf("+");
    			}
    			else if(d==a/2){
    				printf("+");
    			}
    			else if(d==((a/2)+1)){
    				printf("+");
    			}
    			else if(d==1){
    				printf("+");
    			}
    
    			else{
    				printf(" ");
    			}
    		}
    		d=a+1;
    	}
    
    }
    
    void kreuz (int a){
    }
    
    int main(){
    	int a;
    	printf("Gib eine Zahl zwischen 1 und 21 ein:");
    	scanf("%i",&a);
    	if(a<1||a>21){
    		printf("Fehler");
    		return 1;
    	}
    	else
    		if(a%2==0){
    			plus(a);
    		}
    		else{
    			kreuz(a);
    		}
    	return 0;	
    }
    

    update des viereck läuft jetzt ohne erste und letzte zeile xD ja hab irgend nen mist gebaut mit den ganzen variablen unso aber ka ich lass ma so wohl jetzt


  • Mod

    Vielleicht wäre es viel einfacher, wenn du for statt while benutzen würdest?

    Und noch eine alternative Idee (denn deine ist wirklich ein wenig umständlich):
    Geh vielleicht einfach alle Punkte durch und entscheide von jedem Punkt, ob er ein + oder ein - ist. Das ist einfacher zu formulieren, als zu gucken, wie viele + oder - nacheinander gezeichnet werden müssen. Für das stehende Kreuz könnte das zum Beispiel so aussehen:

    #include <stdio.h>
    
    // ungleich Null, wenn Koordinate (x,y) Teil eines Kreuzes der Größe size * size ist
    int is_cross(unsigned x, unsigned y, unsigned size)
    {
    	// Ränder
    	if (x == 0 || y == 0 || x == size - 1 || y == size - 1)
    		return 1;
    
    	// Mittleres Kreuz
    	unsigned mitte = (size - 1) / 2;
    	if (x == mitte || x == mitte + 1 || y == mitte || y == mitte + 1)
    		return 1;
    
    	// Alles andere gehört nicht zum Kreuz
    	return 0;
    }
    
    int main(void) 
    {
    	for(int i = 0; i < 5; ++i)
    	{
    		unsigned size;
    		scanf("%u", &size);
    
    		// Systematisch alle Felder durchgehen
    		for(unsigned y = 0; y < size; ++y)
    		{
    			for(unsigned x = 0; x < size; ++x)
    			{
    				// jedes Feld passend malen
    				if(is_cross(x, y, size))
    					putchar('+');
    				else
    					putchar('-');
    			}
    			putchar('\n');
    		}
    		putchar('\n');
    	}
    	return 0;
    }
    

    http://ideone.com/mhcUC9



  • vielen vielen dank für die hilfe hät allein noch ewig gebraucht 🙂

    hier nochma die ganze endgültige lösung für alle dies noch interessiert (hoffe es macht nix wenn ich das von dir jetzt eingebaut hab)

    #include <stdio.h>
    
    int is_cross(unsigned x, unsigned y, unsigned size) 
    //Hilfsfunktion für kreuz
    {
        // Ränder
        if (x == 0 || y == 0 || x == size - 1 || y == size - 1)
            return 1;
    
        // Mittleres Kreuz
        unsigned mitte = (size - 1) / 2;
        if (x == mitte || x == mitte + 1 || y == mitte || y == mitte + 1)
            return 1;
    
        // Alles andere gehört nicht zum Kreuz
        return 0;
    }
    
    void plus(int a){
    	unsigned size;
    	size=a;
    	// Systematisch alle Felder durchgehen
            for(unsigned y = 0; y < size; ++y)
            {
                for(unsigned x = 0; x < size; ++x)
                {
                    // jedes Feld passend malen
                    if(is_cross(x, y, size)) 
    				//spring zu hilfsfunktion
                        putchar('+');
                    else
                        putchar(' ');
                }
                putchar('\n');
            }
            putchar('\n');
    }
    
    int is_kreuz(unsigned x,unsigned y, unsigned size)
    {
    	//Rand
    	if(x==0 || y==0 || x ==size-1|| y== size - 1)
    		return 1;
    
    	//Mitte Kreuz
    	if(x==y||x+y==size-1)
    		return 1;
    
    	return 0;	
    }
    //hier startet fall ungerade
    void kreuz(int a){
    	unsigned size;
    	size=a;
    
    		for(unsigned y = 0; y < size; ++y)
    		{
    
    			for(unsigned x=0;x<size;++x)
    			{
    
    					if(is_kreuz(x,y, size))
    					//sprung in die kreuz mal funktion
    						putchar('x');
    					else
    						putchar(' ');
    			}	
    			putchar('\n');
    		}
    		putchar('\n');
    
    }
    
    int main(){
    	int a;
    	printf("Gib eine Zahl zwischen 1 und 21 ein:");
    	scanf("%i",&a);
    	if(a<1||a>21){
    		printf("Fehler");
    		return 1;
    	}
    	else
    		if(a%2==0){
    			plus(a);
    		}
    		else{
    			kreuz(a);
    		}
    	return 0;	
    }
    


  • Ich konnte mir da das Frickeln nicht verkneifen, obwohl ich da in eine deutlich weniger sinnvolle Richtung gespielt habe. Zu Anschauungszwecken, was man mit printf so alles machen kann:

    #include <stdio.h>
    
    void line(int n) {
      puts("+++++++++++++++++++++" + 21 - n);
    }
    
    void middle_bar(int n) {
      printf("+%*c+%*c\n",
              n      / 2 - 1, n % 2 == 0 ? '+' : ' ',
             (n - 1) / 2    ,              '+');
    }
    
    void plus(int n) {
      line(n);
    
      for(int i = 0; i < (n - 3) / 2; ++i) {
        middle_bar(n);
      }
    
      for(int i = 0; i <= (n + 1) % 2; ++i) {
        line(n);
      }
    
      for(int i = 0; i < (n - 3) / 2; ++i) {
        middle_bar(n);
      }
    
      line(n);
    }
    
    int iabs(int i) {
      return i < 0 ? -i : i;
    }
    
    void cross(int n) {
      int m = n - 3;
    
      line(n);
    
      for(int i = -m; i <= m; i += 2) {
        printf("+%*c%*c%*c\n",
               (m - iabs(i)) / 2 + 1       ,          '+',
                    iabs(i)                , i != 0 ? '+' : ' ',
               (m - iabs(i)) / 2 + (i != 0),          '+');
      }
    
      line(n);
    }
    
    int main(void) {
      plus(6);
      puts("\n");
      plus(7);
      puts("\n");
      plus(10);
      puts("\n");
      plus(11);
      puts("\n");
      cross(10);
      puts("\n");
      cross(11);
    }
    

    ...aber mach so was bloß nicht in Produktionscode.


Anmelden zum Antworten