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
xxxxxxxAlso 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.
-
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 ....
-
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
-
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; }
-
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.