Das Programm muss mir eigentlich 2 mal nach "Eingabe" fragen, damit ich erst die Option auswählen kann und dann die Ausgabe. Wie kann ich es dazu Bringen, dass das Programm mich 2 mal nach Eingabe fragt? Ich habe es mit "while" versucht es hat aber nicht geklappt, er fragt mich nur einmal nach der Eingabe! Komme grad nicht weiter, bitte um Hilfe ! Hier mein Code: #include <stdio.h> int main() { int eingabe; char matrix[5][5]; int i; int j; printf("\nDie matrix sieht so aus:\n"); for(int i=0; i<5; i++) { printf("\n"); for(int j=0; j<5; j++) { matrix[i][j]='+'; printf("%c", matrix[i][j]); } } printf("\n\n"); printf("Optionen:\n"); printf(" (1.): Felder mit 0\n"); printf(" (2.): Diagonalen mit 0\n"); printf(" (3.): ein spezielles Feld mit 0 (Spalte)\n"); printf(" (4.): Refresh: Fülle alle Felder wieder mit +\n"); printf(" (5.): Ausgabe der Matrix auf dem Bildschirm\n"); printf(" (6.): Ende des Programms\n"); printf("Eingabe: "); scanf("%i", &eingabe); while (eingabe<1 || eingabe>6){ printf("Eingabe: "); scanf("%i", &eingabe); printf("Ungültige Eingabe! Erneut eingeben (1-6):"); scanf("%i", &eingabe); } switch(eingabe) { case 1: for(int i=0; i<5; i++) { for(int j=0; j<5; j++) { matrix[i][j]='0'; } } break; case 2: if (i==j) for(int i=0; i<5;i++) for(int i=0; i<5; i++) break; case 4: for(int i=0; i<5; i++) { for(int j=0; j<5; j++) { matrix[i][j]='+'; } } break; } return 0; }
Taw U. schrieb: > scanf("%i", &eingabe); > printf("Ungültige Eingabe! Erneut eingeben (1-6):"); > scanf("%i", &eingabe); Das ist Quatsch mit Soße. Du wertest "eingabe" nicht aus, weißt aber, daß es ungültig ist. Und dann überschreibst Du es eh nochmal. Erstelle Dir erstmal einen PAP, damit Du den Ablauf logisch überprüfen kannst.
Willkommen bei C! Taw U. schrieb: > Wie kann ich es dazu Bringen, dass das Programm mich 2 mal nach Eingabe > fragt? > Ich habe es mit "while" versucht es hat aber nicht geklappt, er fragt > mich nur einmal nach der Eingabe! Als erstes: formatieren mit c Tags, also c und /c in [ ]. Dann schauen was in der while Schleife steht. Nur das wird widerholt. Falls das zu schwer ist: das vorgegebene Programm reduzieren, bis Du jede Zeile verstehst. Notfalls bis runter auf eine einzige Print-zeile (quasi ein "Hallo Welt"). Bei konkreten Fragen halt konkret fragen. Ich habe fremden Code und möchte nur die Hausaufgabe erfüllen, ist zu unspezifisch.
Taw U. schrieb: > int i; [...] > case 2: > if (i==j) > for(int i=0; i<5;i++) > for(int i=0; i<5; i++) > break; sieht auch irgendwie spannend aus. Was soll das bewirken? Du definierst 3 Variablen i mit jeweils getrennten Gültigkeitsbereichen in einem Modul... Die Gültigkeitsabfrage könnte man auch in der switch case über den default lösen... Gruß Robert
deine Zweite abfrage funktioniert du gibst da einfach nichts mehr aus. entweder: int i = 0; for( i = 0; i<5 ; i++){ // do stuff } ODER for(int i=0 ; i<5 ; i++){ // do stuff } nur nicht beides!
omg schrieb: > deine Zweite abfrage funktioniert du gibst da einfach nichts mehr aus. > > entweder: > > int i = 0; > > for( i = 0; i<5 ; i++){ > // do stuff > } > > ODER > > for(int i=0 ; i<5 ; i++){ > // do stuff > } > > > nur nicht beides! wie meinst du das wo hab ich das denn beides. Wenn du das bei case 2 meinst das hab ich weggemacht, klappt trzdm nicht.
Taw U. schrieb: > char matrix[5][5]; > int i; //<----- hier > int j; //<----- hier > > printf("\nDie matrix sieht so aus:\n"); > > for(int i=0; i<5; i++) <-- hier > { printf("\n"); > for(int j=0; j<5; j++) <-- hier > { > matrix[i][j]='+'; > printf("%c", matrix[i][j]); > } > } dein code ein bisschen wegen dem int i angepasst und ausgaben nach der zweiten abfrage gemacht und .. #include <stdio.h> #include <stdlib.h> int main() { int eingabe; char matrix[5][5]; int i; int j; printf("\nDie matrix sieht so aus:\n"); for(i=0; i<5; i++) { printf("\n"); for(j=0; j<5; j++) { matrix[i][j]='+'; printf("%c", matrix[i][j]); } } printf("\n\n"); printf("Optionen:\n"); printf(" (1.): Felder mit 0\n"); printf(" (2.): Diagonalen mit 0\n"); printf(" (3.): ein spezielles Feld mit 0 (Spalte)\n"); printf(" (4.): Refresh: Fülle alle Felder wieder mit +\n"); printf(" (5.): Ausgabe der Matrix auf dem Bildschirm\n"); printf(" (6.): Ende des Programms\n"); printf("Eingabe: "); scanf("%i", &eingabe); switch(eingabe) { case 1: for(i=0; i<5; i++) { printf("\n"); for(j=0; j<5; j++) { matrix[i][j]='0'; printf("%c", matrix[i][j]); } } break; case 2: if (i==j) for(i=0; i<5; i++) for(i=0; i<5; i++) break; case 4: for(i=0; i<5; i++) { printf("\n"); for(j=0; j<5; j++) { matrix[i][j]='+'; printf("%c", matrix[i][j]); } } break; } return 0; } case 2 macht natürlich nichts außer i und j nach 5 zu zählen -.-
omg schrieb: > case 2 macht natürlich nichts außer i und j nach 5 zu zählen -.- case 2 zählt nur i hoch. Von j lese ich da nix. Dafür i aber 2x. Wenn zu Beginn von case 2 i!=j, dann ist der break nicht erreichbar, und es wird stattdessen case 4 ausgeführt... Ob das so gewollt ist?
Taw U. schrieb: > printf("Eingabe: "); > scanf("%i", &eingabe); > while (eingabe<1 || eingabe>6){ > printf("Eingabe: "); > scanf("%i", &eingabe); > printf("Ungültige Eingabe! Erneut eingeben (1-6):"); > scanf("%i", &eingabe); > } meine Ausgabe da. Aus Console: Optionen: (1.): Felder mit 0 (2.): Diagonalen mit 0 (3.): ein spezielles Feld mit 0 (Spalte) (4.): Refresh: F³lle alle Felder wieder mit + (5.): Ausgabe der Matrix auf dem Bildschirm (6.): Ende des Programms Eingabe: -1 Eingabe: -1 Ung³ltige Eingabe! Erneut eingeben (1-6):-2 Eingabe: -3 Ung³ltige Eingabe! Erneut eingeben (1-6): klappt doch wie gewünscht 2x eingeben.. hatte das vorhin eben rausgenommen und vergessen wieder rein zu packen. wenn der Wert zwischen 1-5 ist pringt der gar nicht erst in der while schleife .. wenn du das trozdem möchtest must du eine do{ .... }while(irgendeinebedingung); nehmen.. die wird immer einmal durchlaufen.
Robert schrieb: > case 2 zählt nur i hoch. oh ja ^^ omg schrieb: > wenn der Wert zwischen 1-5 ist pringt .. natürlich 1-6
Das gibt es noch: https://www.amazon.de/Programmieren-C-Reference-Manual-deutscher-Sprache/dp/3446154973/ref=sr_1_2?__mk_de_DE=%C3%85M%C3%85%C5%BD%C3%95%C3%91&dchild=1&keywords=kernighan+ritchie&qid=1607597264&sr=8-2 Damit habe ich es damals auch geschafft. Einfach der Reihe nach die Kapitel durcharbeiten.
Taw U. schrieb: > printf("\n\n"); > printf("Optionen:\n"); > printf(" (1.): Felder mit 0\n"); > printf(" (2.): Diagonalen mit 0\n"); > printf(" (3.): ein spezielles Feld mit 0 (Spalte)\n"); > printf(" (4.): Refresh: Fülle alle Felder wieder mit +\n"); > printf(" (5.): Ausgabe der Matrix auf dem Bildschirm\n"); > printf(" (6.): Ende des Programms\n"); > > printf("Eingabe: "); > scanf("%i", &eingabe); > while (eingabe<1 || eingabe>6){ > printf("Eingabe: "); > scanf("%i", &eingabe); > printf("Ungültige Eingabe! Erneut eingeben (1-6):"); > scanf("%i", &eingabe); > } Gerade Anfänger denken, Programmieren besteht im einfach drauflos schreiben. Dabei ist das Einhacken der mit Abstand kleinste Zeitaufwand beim Programmieren. Wenn man sich Gedanken über den Ablauf macht, dann kann man den Code auch besser lesen. Die obige Sequenz ohne unnütze Codedopplungen:
1 | printf("Optionen:\n" |
2 | " (1.): Felder mit 0\n" |
3 | " (2.): Diagonalen mit 0\n" |
4 | " (3.): ein spezielles Feld mit 0 (Spalte)\n" |
5 | " (4.): Refresh: Fülle alle Felder wieder mit +\n" |
6 | " (5.): Ausgabe der Matrix auf dem Bildschirm\n" |
7 | " (6.): Ende des Programms\n"); |
8 | |
9 | while (1) |
10 | {
|
11 | printf("Eingabe (1-6): "); |
12 | scanf("%i", &eingabe); |
13 | if (eingabe>=1 && eingabe<=6) |
14 | break; |
15 | printf("Ungültige Eingabe! Erneut eingeben.\n"); |
16 | }
|
ein kleines Beispiel:
1 | #include <stdio.h> |
2 | #include <stdlib.h> |
3 | |
4 | // Annahme: Matrix ist quadratisch
|
5 | #define MAT_DIM 5
|
6 | #define MAGIC_NUMBER 42
|
7 | #define tostr(x) #x
|
8 | |
9 | void print_matrix (const int (*mat)[MAT_DIM]); |
10 | void init_matrix (int (*mat)[MAT_DIM], const int val); |
11 | void set_diagonals (int (*mat)[MAT_DIM], const int val); |
12 | |
13 | int
|
14 | main (void) |
15 | {
|
16 | int mat[MAT_DIM][MAT_DIM]; |
17 | int input; |
18 | |
19 | do { |
20 | puts ("\n(1) Matrix mit 0 initialisieren"); |
21 | puts ("(2) Diagonalen mit 0 initialisieren"); |
22 | puts ("(3) ein Feld mit 0 initialiseren"); |
23 | puts ("(4) Refresh: Matrix mit " tostr ( |
24 | MAGIC_NUMBER) " initialisieren"); |
25 | puts ("(5) Matrix ausgeben"); |
26 | puts ("(6) Programm beenden\n"); |
27 | |
28 | scanf ("%d", &input); |
29 | |
30 | while (getchar() != '\n') { |
31 | // Puffer loeschen
|
32 | }
|
33 | |
34 | if (input < 1 || input > 6) { |
35 | puts ("FEHLER: ungueltige Eingabe"); |
36 | continue; |
37 | }
|
38 | |
39 | switch (input) { |
40 | case 1: |
41 | init_matrix (mat, 0); |
42 | break; |
43 | case 2: |
44 | set_diagonals (mat, 0); |
45 | break; |
46 | case 4: |
47 | init_matrix (mat, MAGIC_NUMBER); |
48 | break; |
49 | case 5: |
50 | print_matrix (mat); |
51 | break; |
52 | case 6: |
53 | exit (1); |
54 | }
|
55 | |
56 | } while (input != 6); |
57 | |
58 | return 0; |
59 | }
|
60 | |
61 | void
|
62 | print_matrix (const int (*mat)[MAT_DIM]) |
63 | {
|
64 | putchar ('\n'); |
65 | |
66 | for (size_t i = 0; i < MAT_DIM; i++) { |
67 | for (size_t j = 0; j < MAT_DIM; j++) { |
68 | printf ("%d\t", mat[i][j]); |
69 | }
|
70 | putchar ('\n'); |
71 | }
|
72 | |
73 | putchar ('\n'); |
74 | }
|
75 | |
76 | void
|
77 | init_matrix (int (*mat)[MAT_DIM], const int val) |
78 | {
|
79 | for (size_t i = 0; i < MAT_DIM; i++) { |
80 | for (size_t j = 0; j < MAT_DIM; j++) { |
81 | mat[i][j] = val; |
82 | }
|
83 | }
|
84 | puts ("Matrix wurde initialisiert"); |
85 | }
|
86 | |
87 | void
|
88 | set_diagonals (int (*mat)[MAT_DIM], const int val) |
89 | {
|
90 | // Hauptdiagonale
|
91 | for (size_t i = 0; i < MAT_DIM; i++) { |
92 | mat[i][i] = val; |
93 | }
|
94 | |
95 | // Gegendiagonale
|
96 | for (size_t i = 0, j = MAT_DIM - 1; i < MAT_DIM; |
97 | i++, j--) { |
98 | mat[j][i] = val; |
99 | }
|
100 | puts ("Diagonalen wurden initialisiert"); |
101 | }
|
Peter D. schrieb: > Gerade Anfänger denken, Programmieren besteht im einfach drauflos > schreiben. Dabei ist das Einhacken der mit Abstand kleinste Zeitaufwand > beim Programmieren. > Wenn man sich Gedanken über den Ablauf macht, dann kann man den Code > auch besser lesen. ist wie nach Rezept backen oder kochen, wem die Zutaten fehlen und wer nicht die Reihenfolge einhält hat auch Probleme. Es geht doch schon los wenn z.B. Mehl fehlt. Wo bekomme ich Mehl her? Muss ich bezahlen? Habe ich passend Geld? Wo bekomme ich passend Geld her? Funktioniert der Automat? Funktioniert meine EC Karte? Wie geschrieben wurde, das alles aufzudröseln ist beim Programmieren die meiste Arbeit. Nicht einfach Mehl in die Schüssel beim Backen.
Beim Backen bekommt man aber mit den gleichen Zutaten und der gleichen Vorgehensweise überall den gleichen Kuchen. Bei "C" bekommt man , abhängig vom Compiler mit Glück Schwarzwälder Kirsch oder auch nur kalten Hund. SCNR
Etappensieger der Tour de Frongs schrieb: > Beim Backen bekommt man aber mit den gleichen Zutaten und der gleichen > Vorgehensweise überall den gleichen Kuchen. Keineswegs. Das mehr, das Wasser, die Temperatur der Zutaten, die Hefe, der Sauerteig (bei Brot), die Backform, der Ofen, ... all das hat einen großen Einfluss auf den Erfolg. Bei den Backmischungen von Dr. Oetker und co. fällt das nicht so schnell auf, weil dort der Erfolg durch nicht deklarationspflichtige Zutaten aus der Chemiefabrik sichergestellt wird. Ich backe seit fast 2 Jahren mein Brot selber - ohne Chemie. Dennoch gelingt es mir immer noch nicht, vorher zu bestimmen, wie das Brot aussehen wird. Inzwischen gelingen die Brote immer (keine Steine, keine Fladen mehr) aber jedes sieht anders aus. Was wir aus dem Backshop gewohnt sind ist je nach Laden entweder das Ergebnis von Chemie und festgelegten Fabrik-Prozessen oder echte Handwerkskunst.
Stefan ⛄ F. schrieb: > Bei den Backmischungen von Dr. Oetker und co. Sind die dann so wie diese Codegeneratoren vom fraglichen Frager?
Etappensieger der Tour de Frongs schrieb: > Beim Backen bekommt man aber mit den gleichen Zutaten und der gleichen > Vorgehensweise überall den gleichen Kuchen 100% nein, dazu sind schon die Öfen zu unterschiedlich! Ich habe mehr Erfahrung mit backen als mit allen Compilern oder ALLEN stdlib! K&R c89 c99 uvam?
Ein genügend verkorkstes scanf kann allerdings tatsächlich Einfluss auf den weiteren Programmablauf nehmen, wenn auch nicht ganz so unmittelbar :) (Erklärung für die Einsteiger: Wenn weniger Variablenmaterial da ist als notwendig ist um all das unterzubringen was die Platzhalter "anschleppen", kann es sehr schnell passieren dass man unbeteiligte Variablen oder auch Rücksprungadressen auf dem Stack damit überbügelt.... und beides kann tatsächlich den Kontrollfluss verändern.)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.