Forum: Mikrocontroller und Digitale Elektronik Neu angefangen mit C Programmieren


von Taw U. (tawo20)


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

von Peter D. (peda)


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.

von A. S. (Gast)


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.

von Robert (Gast)


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

von omg (Gast)


Lesenswert?

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!

von Taw U. (tawo20)


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.

von omg (Gast)


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

von Robert (Gast)


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?

von omg (Gast)


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.

von omg (Gast)


Lesenswert?

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

von PittyJ (Gast)


Lesenswert?


von Peter D. (peda)


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
     }

von ein Beispiel (Gast)


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
}

von Joachim B. (jar)


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.

von Etappensieger der Tour de Frongs (Gast)


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

von Stefan F. (Gast)


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.

von Nick M. (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Bei den Backmischungen von Dr. Oetker und co.

Sind die dann so wie diese Codegeneratoren vom fraglichen Frager?

von Joachim B. (jar)


Lesenswert?

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?

von Andreas D. (rackandboneman)


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

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
Noch kein Account? Hier anmelden.