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

Log in to reply