Eingabe nicht speichern



  • Hi Leute, ich bin Neu hier und habe ein kleines Problem hoffe jmdn kann mir helfen, ich muss im Studium ein Programm schreiben das solange ganze Zahlen einliest bis eine Null eingegeben wird, die Null soll nicht im Array gespeichert werden. Meine Frage ist wie schaffe ich, dass die Null die die letzte Eingabe sein wird nicht im Array gespeichert wird.

    Danke. 🙂


  • Mod

    Indem du Nullen nicht in deinem Array speicherst?



  • SeppJ schrieb:

    Indem du Nullen nicht in deinem Array speicherst?

    Aber wie mache ich das? (bin noch im ersten Semester)



  • Indem du keine Eingabe direkt im Array speicherst.



  • DirkB schrieb:

    Indem du keine Eingabe direkt im Array speicherst.

    wisst ihr ich bin totaler Anfänger es wäre toll wenn ihr es bisschen genauer erklärt 🙂 ich will nicht dreist sein aber ist es möglich dass ihr einen kleinen Beispiel dazu schreibt?

    Danke



  • Schreib deinen Code hin bis zu der Stelle, an der du nicht weiterkommst.
    Außerdem musst du bei Verwendung von Arrays deren Länge berücksichtigen und nicht mehr Eingaben zulassen, als das Array aufnehmen kann.



  • Wutz schrieb:

    Schreib deinen Code hin bis zu der Stelle, an der du nicht weiterkommst.
    Außerdem musst du bei Verwendung von Arrays deren Länge berücksichtigen und nicht mehr Eingaben zulassen, als das Array aufnehmen kann.

    Also ich habe die Ratschläge glaube ich geschafft umzusetzen, ist das so richtig?

    int i, count = 0;
    
    int array(int x[]){ 
    
      while(1){
        printf ("Bitte geben Sie die %d. Zahl ein: ", count+1);
        scanf ("%d", &x[count]);
    
        if (x[count] == 0)
        {
    	  printf ("\nIhre Eingabe:\n\n");
    	  count--;
          break; 
        }
        count++;
      }
      int a[count];
    
      for(i=0; i<=count; i++){
      	if(x[i]!=0){
    	  a[i]=x[i];}
    	  else 
    	  break;
      }
    
      for (i = 0; i<=count; i++)
      {
    
          printf ("%d. Zahl: %d\n", i+1, a [i]);
    
      }
      return a[count];
    
    }
    


  • für den anfang nicht schlecht. gibts irgendwie warnungen vom compiler? stürzt es irgendwie ab?



  • Maziar schrieb:

    Also ich habe die Ratschläge glaube ich geschafft umzusetzen, ist das so richtig?

    Nein.
    Nein.
    Nein.

    Wutz schrieb:

    Außerdem musst du bei Verwendung von Arrays deren Länge berücksichtigen und nicht mehr Eingaben zulassen, als das Array aufnehmen kann.

    Hast du gar nicht befolgt.

    Du verwendest global Variablen. Das ist schlecht.
    Du nennst die auch noch i. Das grenzt an Wahnsinn.

    Du weißt auch nicht, was du mit dem Rückgabewert der Funktion anfangen sollst.

    Deine Funktion array (nichtsagender Name) weiß nicht, wie groß das Array x ist, in dem es die Daten ablegen soll.

    Beschäftige dich nochmal mit den Grundlagen von Arrays in C.
    Die Definition und den Bereich der Indizes.



  • DirkB schrieb:

    Maziar schrieb:

    Also ich habe die Ratschläge glaube ich geschafft umzusetzen, ist das so richtig?

    Nein.
    Nein.
    Nein.

    Wutz schrieb:

    Außerdem musst du bei Verwendung von Arrays deren Länge berücksichtigen und nicht mehr Eingaben zulassen, als das Array aufnehmen kann.

    Hast du gar nicht befolgt.

    Du verwendest global Variablen. Das ist schlecht.
    Du nennst die auch noch i. Das grenzt an Wahnsinn.

    Du weißt auch nicht, was du mit dem Rückgabewert der Funktion anfangen sollst.

    Deine Funktion array (nichtsagender Name) weiß nicht, wie groß das Array x ist, in dem es die Daten ablegen soll.

    Beschäftige dich nochmal mit den Grundlagen von Arrays in C.
    Die Definition und den Bereich der Indizes.

    Also die Sache ist die eigentliche Aufgabe ist etwas größer:

    (ich muss alle auszuführenden Aktionen als Funktionen formulieren)
    Das Hauptprogramm soll folgende Aktionen nacheinander ausführen:
    Einlesen von Zahlen
    Es sollen solange ganze Zahlen eingelesen werden, bis eine Null eingegeben wird. Die Null soll nicht im Array gespeichert werden.
    Mittelwert der Zahlen ausgeben.
    Die größte Zahl ausgeben.
    Die kleinste Zahl ausgeben.
    Die zweitkleinste Zahl ausgeben.
    Die Zahlen in umgekehrter Reihenfolge und nur mit ihren Absolutbeträgen ausgeben.
    Kopieren Sie hierzu die Absolutbeträge der Zahlen in umgekehrter Reihenfolge in ein anderes Array.



  • Wutz schrieb:

    Außerdem musst du bei Verwendung von Arrays deren Länge berücksichtigen und nicht mehr Eingaben zulassen, als das Array aufnehmen kann.

    Hast du gar nicht befolgt.

    Das Problem hier ist ich weiß ja nicht wie viele Eingaben der Benutzer macht, deshalb kenne ich die Array Länge erst den Eingaben.



  • HansKlaus schrieb:

    für den anfang nicht schlecht. gibts irgendwie warnungen vom compiler? stürzt es irgendwie ab?

    Nein das Programm läuft ohne Probleme aber ich weiß dass ich nicht alles richtig gemacht habe.



  • Deshalb ist die Aufgabenstellung auch Scheiße. Dein Lehrer widerspricht sich in der Aufgabenstellung: Array hat immer eine feste unveränderliche Länge <> variable unbekannte Anzahl von Elementen

    (ich muss alle auszuführenden Aktionen als Funktionen formulieren)

    Das wiederum ist sehr sinnvoll.
    Du musst dir Gedanken machen, was die einzelnen Funktionen machen sollen und dafür für Parameter brauchen: nennt sich Programmdesign.

    int main()
    {
    Arraydefinition
    
    funktion_Einlesen_von_Zahlen(... ... ...);
    ...
    funktion_Kopieren_Absolutbetraege(... ... ...);
    
    return 0;
    }
    


  • Maziar schrieb:

    Wutz schrieb:

    Außerdem musst du bei Verwendung von Arrays deren Länge berücksichtigen und nicht mehr Eingaben zulassen, als das Array aufnehmen kann.

    Hast du gar nicht befolgt.

    Das Problem hier ist ich weiß ja nicht wie viele Eingaben der Benutzer macht, deshalb kenne ich die Array Länge erst den Eingaben.

    Ein Array ist nach seiner Definition nicht in der Größe oder seinem Ort änderbar.

    Demnach musst du wissen, wieviel Daten du in dem Array maximal ablegen kannst.
    (Es geht nicht darum, wieviel Daten du darin abgelegt hast)
    Und diese Information musst du der Funktion mitteilen.

    Es sei denn, du hast schon mit dynamischer Speicherverwaltung gearbeitet.

    Maziar schrieb:

    HansKlaus schrieb:

    für den anfang nicht schlecht. gibts irgendwie warnungen vom compiler? stürzt es irgendwie ab?

    Nein das Programm läuft ohne Probleme aber ich weiß dass ich nicht alles richtig gemacht habe.

    Irgendwo rufst du die Funktion array mit einem Array als Parameter auf.
    Dieses Array hat eine Größe. gib einfach (deutlich ) mehr Daten ein.

    Nebenbei ist das Array a in deiner Funktion vollkommen nutzlos.



  • Vielleicht ist es besser wenn ich den kompletten Code euch zeige:

    #include <stdio.h>
    #include <stdlib.h>
    #define MAX 50
    
    int i, count = 0;
    
    int arrayeingabe(int x[]){ 
    
      while(1){
        printf ("Bitte geben Sie die %d. Zahl ein: ", count+1);
        scanf ("%d", &x[count]);
    
        if (x[count] == 0)
        {
    	  printf ("\nIhre Eingabe:\n\n");
    	  count--;
          break; 
        }
        count++;
      }
      int a[count];
    
      for(i=0; i<=count; i++){
      	if(x[i]!=0){
    	  a[i]=x[i];}
    	  else 
    	  break;
      }
    
      for (i = 0; i<=count; i++)
      {
    
          printf ("%d. Zahl: %d\n", i+1, a [i]);
    
      }
      return a[count];
    
    }
    
    int mittelwert(int a[]){
    	int b=0; 
    	double m;
      for (i = 0; i<=count; i++)
      {
    
          b+=a[i];
    }
    m = (double)b / i;
    printf("%d\n", b);
    printf("%.2f\n", m);
    }
    
    int bignum(int a[]){
    	int big = 1;
    	  for (i = 0; i<count; i++)
      {
    
          if(a[i]>a[i+1] && a[i]>big)
          big = a[i];
          else if(a[i+1]>a[i] && a[i+1]>big)
          big = a[i+1];
    
      }
      printf("Die größte Zahl lautet: %d\n", big);
    }
    
    int minnum(int a[]){
    	int min = 1;
    	  for (i = 0; i<count; i++)
      {
          if(a[i]<a[i+1] && a[i]<=min)
          min = a[i];
          else if (a[i+1]<a[i] && a[i+1] <= min)
          min = a[i+1];
    
      }
      printf("Die kleinste Zahl lautet: %d\n", min);
    }
    
    int main(){
    	int a[MAX];
    	arrayeingabe(a);
    	mittelwert(a);
    	bignum(a);
    	minnum(a);
    return 0;
    }
    


  • Deine Minimum und Maximum-Funktionen sind zu kompliziert, wenn nicht sogar falsch.

    DirkB schrieb:

    Du verwendest global Variablen. Das ist schlecht.
    Du nennst die auch noch i. Das grenzt an Wahnsinn.

    Nutze den Rückgabewert der Funktionen.
    Mache in den Funktionen nur die Berechnung und mach die Ausgabe in der rufenden Funktion.

    I.A. gibt man die Größe des Arrays oder die Anzahl der gültigen Elemente an und nicht den maximalen Index.



  • DirkB schrieb:

    Nutze den Rückgabewert der Funktionen.
    Mache in den Funktionen nur die Berechnung und mach die Ausgabe in der rufenden Funktion.

    Würde ich gerne weiß aber nicht wie 😞



  • Indem du der Funktion einen oder mehrere werte übergibst, die Verarbeitung durchführst und das Ergebnis zurück gibst und dann einer Variable in Main zuweist. Guck dir nochmal das Skript an!



  • double mittelwert(int a[], unsigned int anzahl) {  // size_t statt unsigned int wäre besser
      double m = 0;
      for (i = 0; i<anzahl; i++)
      { m += a[i];
      }
      if (anzahl > 0)
        m /= anzahl;
    
      return m;
    }
    

    Aufruf z.B. mit

    printf("Der Mittelwert beträgt %f\n", mittelwert(a, count));
    


  • Maziar schrieb:

    ... ich muss im Studium ein Programm schreiben das solange ganze Zahlen einliest bis eine Null eingegeben wird, die Null soll nicht im Array gespeichert werden.

    Maziar schrieb:

    Vielleicht ist es besser wenn ich den kompletten Code euch zeige:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX 50
    
    int i, count = 0;
    
    int arrayeingabe(int x[])
    { 
      while(1){
        printf ("Bitte geben Sie die %d. Zahl ein: ", count+1);
        scanf ("%d", &x[count]);
     	
        if (x[count] == 0)
        {
    	  printf ("\nIhre Eingabe:\n\n");
    	  count--;
          break; 
        }
        count++;
      }
      int a[count];
      
      for(i=0; i<=count; i++){
       ...
    

    Wenn Du nicht weist wie viele Zahlen insgesammt kommen, benötigst du in C eine dynamische Datenstruktur wie eine verkettete Liste.

    Da du aber das Limit MAX in deinem Code definierst und das Array auch diese Grösse hat müsste diese Maximalgrösse irgendwo geprüft werden.

    Könnte ungefähr so aussehen:

    int arrayeingabe(int x[])
    { 
      int i, k;
      for(i=0; i<MAX; i++) {
        printf ("Bitte die %d. Zahl eingeben: ", i+1);
        scanf ("%d", &k);
    
        if(k == 0)
           break; 
    
        x[i] = k;
        }
      return i;
    }
    

    Sichererer wäre es zu dem beim Aufruf die Länge anzugeben:

    unsigned arrayeingabe(int *x, unsigned len);
    

Anmelden zum Antworten