Integer mit Integer aus Array-Element vergleichen

Umut

Grünschnabel
Hallo Community,

ich habe das folgende Problem: 15 Zahlen sollen per Tastatur-Eingabe eingegeben und in ein Integer Array gespeichert werden. Jedesmal, wenn eine Zahl eingegeben wurde, soll geprüft werden, ob die Zahl schon im Array gespeichert ist. Wenn ja, soll die Position (nicht der Index) ausgegeben werden, ansonsten soll ein Text wie "Zahl vorhanden" ausgegeben werden.

Soweit bin ich schon gekommen:

C:
#include <stdio.h>

int main() {
    int z[14];

   for (int i=0; i<14; i++) {
      printf("%d. Zahl: ", i+1);
      scanf("%d", &z);

      // Ab hier komme ich nicht weiter
      if (.......) {
         printf("Zahl vorhanden");
      }
   }
}

Wie vergleiche ich die eingegeben Int-Zahlen mit den Array-Elementen ?
 
Hi

Wenn ja, soll die Position (nicht der Index) ausgegeben werden,
Das versteh ich nicht ganz. Der Index ist die Position.

Ein Problem vor deiner Frage: scanf stimmt so nicht.
Code:
scanf("%d", &z);
ist richtig, wenn z ein einzelnes int ist.
Die 14 ints in z sind aber z[0] bis z[13]
Z.b.
Code:
scanf("%d", &z[4]);
könnte man machen,
oder abhängig von i eben
Code:
scanf("%d", &z[i]);
C++:
for (int i = 0; i < 14; i++) {
    printf("%d. Zahl: ", i+1);
    scanf("%d", &z[i]);

    // Ab hier komme ich nicht weiter
    if (.......) {
        printf("Zahl vorhanden");
    }
}

Zum Hauptproblem: Eine einzelne if-Bedingung reicht nicht, weil man alle bisher
eingegebenen Zahlen prüfen muss (ob sie mit der Neuen übereinstimmen). Ca. so:
C++:
int i, j;
for (i = 0; i < 14; i++) {
    printf("%d. Zahl: ", i+1);
    scanf("%d", &z[i]);

    for(j = 0; j < i; j++) {
        if(z[j] == z[i])
        {
            //z[i] schon irgendwo vorher vorhanden
        }
    }
}

Was noch fehlt: Die schon vorhandene Zahl wieder "vergessen". Wenn man gerade z[3] eingelesen hat,
dessen Wert auch schon bei zB. z[1] ist, wird das mit dem oberen Code zwar erkannt, aber nichts getan.
Dann ein i++ wegen der Schleife, und als Nächstes liest man z[4] ein => z[3] ist dringeblieben.
Alles klar? :)
Wenn z[3] schon vorhanden war muss man als Nächstes eben wieder z[3] einlesen, also das i++ der
Schleife darf nicht stattfinden. Man kanns zwar nicht direkt ausschalten, aber:
C++:
int i, j;
for (i = 0; i < 14; i++) {
    printf("%d. Zahl: ", i+1);
    scanf("%d", &z[i]);

    for(j = 0; j < i; j++) {
        if(z[j] == z[i])
        {
            i--;
        }
    }
}
Bei einer schon vorhandenen Zahl wird i zuerst 1 runter und dann gleich wieder rauf gezählt
=> Bleibt praktisch gleich.

Und was tut man, wenn die Zahl mehrmals schon vorkommt?
i mehrmals um 1 runterzählen würde mehrere Zahlen "vergessen".
=> Theoretisch richtig, aber die gleiche Zahl kann in den schon vorhandenen alten ja nur
einmal drin sein, eben wegen diesem Code. Trotzdem hat es einen Vorteil, die Schleife nach dem
ersten Fund abzubrechen; Geschwindigkeit. Es macht keinen Sinn, den Computer das restliche
Array prüfen zu lassen, wenn man sowieso schon alles weiß, was man wissen wollte.

C++:
int i, j;
for (i = 0; i < 14; i++) {
    printf("%d. Zahl: ", i+1);
    scanf("%d", &z[i]);

    for(j = 0; j < i; j++) {
        if(z[j] == z[i])
        {
            i--;
            break;
        }
    }
}
 
Zuletzt bearbeitet:
Vielen Dank für deine Hilfe! Es klappt schonmal wie erwartet!
Mit der Position ist z.B. "1. Zahl" "2. Zahl" etc. gemeint. Es soll nicht der Inhalt wie z.B. 37 angezeigt werden, sondern nur, an welcher Stelle die Zahl drinsteht (wenn vorhanden).
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück