Neu angefangen mit C Programmieren

OP #6506379
Lesenswert?

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;
}
#6506398
Lesenswert?

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.
Gast #6506413
Lesenswert?

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.
Gast #6506414
Lesenswert?

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
OP #6506452
Lesenswert?

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.
Gast #6506469
Lesenswert?

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 -.-
Gast #6506490
Lesenswert?

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?
Gast #6506496
Lesenswert?

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.
#6506604
Lesenswert?

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
     }
Gast #6506611
Lesenswert?

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
}
#6506661
Lesenswert?

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.
Gast #6506671
Lesenswert?

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
Gast #6506744
Lesenswert?

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.
#6506813
Lesenswert?

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.)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren