Probleme mit einer C Aufgabe



  • Hallo Leute,

    vielleicht kann mir ja jemand bei einem Problem helfen. Ich habe folgende C Aufgabe:

    int Array1: 1 1 1 2 1 0 <- Tore von 6 Spielen einer Fußballmannschaft

    int Array2: 0 1 0 1 1 1 <- Tore von 6 Spielen der anderen Fußballmanschaft

    int spielAnz <- Anzahl der ausgetragenen Spiele (in dem Fall 6)

    Nun soll ich eine Funktion schreiben, die alle Spielnummern als Folge ausgibt, die nur einmal vorkommen. Also Ausgabe: 4 6, denn 2:1 im vierten und 0:1 im sechsten Spiel sind einmalige Ergebnisse.

    Desweiteren soll die Anzahl der einmaligen Spielergebnisse ausgegeben werden. (in dem Fall 2 Spiele)

    Folgendes habe ich jetzt geschrieben:

    #include <stdio.h>
    #include <stdlib.h>
    
    int einmalig(int folgeA[], int folgeB[], int anz){
    
       int zaehler1, zaehler2, doppeltzaehler, einmal, folgeNeu[100];
    
       einmal = 0;
    
       for (zaehler1 = 0; zaehler1 < anz-1; zaehler1++){
    
          doppeltzaehler = 0; 
    
         for (zaehler2 = zaehler1; zaehler2 < anz-1; zaehler2++){
    
           if (folgeA[zaehler1] == folgeA[zaehler2+1] && folgeB[zaehler1] == folgeB[zaehler2+1]){
    
             doppeltzaehler++;}
    
           if (doppeltzaehler == 0){
    
           folgeNeu[zaehler1] = zaehler1;
           einmal++;
    
         }
         }
    
       }
    
    return einmal;
    }
    
    int main (void) {
    
    int mA[100], mB[100], spielAnz, zaehler, einmaligAnz;
    
    printf("Geben Sie die Anzahl der Spiele ein: ");
    scanf("%d", &spielAnz);
    printf("\n Geben Sie die einzelnen Tore der Mannschaft A ein :");
    for (zaehler=0; zaehler < spielAnz; zaehler++){
    
      scanf("%d", &mA[zaehler]);
    
    } 
    
    printf("\n Geben Sie die einzelnen Tore der Mannschaft B ein :");
    for (zaehler=0; zaehler < spielAnz; zaehler++){
    
      scanf("%d", &mB[zaehler]);
    
    } 
    
    einmaligAnz = einmalig(mA, mB, spielAnz);
    
    printf("Einmalige Spielergebnisse: %d", einmaligAnz);
    
    system("Pause");    
    
    }
    

    Bitte nicht schlagen für eventuell falsch eingerückte Zeilen ;).

    Leider gibt mir das Programm immer 9 als Spielanzahl raus. Das liegt wohl daran, dass wenn der Zeiger 1 schon etwas weiter ist, der Zeiger 2 die Elemente vor Zeiger 1 nicht mehr abgleicht, da Zeiger 2 immer = Zeiger 1 beim inneren Schleifenbeginn. Somit denkt das Programm, dass bestimmte mehrfache Ergebnisse einmalig sind, weil die identischen Ergebnisse ja hinter den Zeigern liegen.

    Kann mir denn vielleicht jemand sagen, was ich falsch mache? 😞 🙂

    MfG Clickmaster



  • hab nix gemacht. nur codeblocks einrü

    #include <stdio.h>
    #include <stdlib.h>
    
    int einmalig(int folgeA[], int folgeB[], int anz)
    {
    
        int zaehler1, zaehler2, doppeltzaehler, einmal, folgeNeu[100];
    
        einmal = 0;
    
        for (zaehler1 = 0; zaehler1 < anz-1; zaehler1++)
        {
    
            doppeltzaehler = 0;
    
            for (zaehler2 = zaehler1; zaehler2 < anz-1; zaehler2++)
            {
    
                if (folgeA[zaehler1] == folgeA[zaehler2+1] && folgeB[zaehler1] == folgeB[zaehler2+1])
                {
    
                    doppeltzaehler++;
                }
    
                if (doppeltzaehler == 0)
                {
    
                    folgeNeu[zaehler1] = zaehler1;
                    einmal++;
    
                }
            }
    
        }
    
        return einmal;
    }
    
    int main (void)
    {
    
        int mA[100], mB[100], spielAnz, zaehler, einmaligAnz;
    
        printf("Geben Sie die Anzahl der Spiele ein: ");
        scanf("%d", &spielAnz);
        printf("\n Geben Sie die einzelnen Tore der Mannschaft A ein :");
        for (zaehler=0; zaehler < spielAnz; zaehler++)
        {
    
            scanf("%d", &mA[zaehler]);
    
        }
    
        printf("\n Geben Sie die einzelnen Tore der Mannschaft B ein :");
        for (zaehler=0; zaehler < spielAnz; zaehler++)
        {
    
            scanf("%d", &mB[zaehler]);
    
        }
    
        einmaligAnz = einmalig(mA, mB, spielAnz);
    
        printf("Einmalige Spielergebnisse: %d", einmaligAnz);
    
        system("Pause");
    
    }
    


  • Ich erzeuge ein 3tes Array und trenne die Vergleichs- von der Zähllogik. In dem neuen Array "markiere" ich die Begegnungen, die nicht einmalig sind mit -1. Anschließend zähle ich nur noch aus. In dem inneren For teste ich zunächst, ob die Partie mit der ich vergleichen will -1 markiert ist. Ist das so, so wurde sie früher schon einmal positiv uneinmalig getestet. (Kommentar 1)
    Das zweite mal teste ich auf "schon mal markiert worden sein" in der innersten Schleife um nicht unnötig zu vergleichen. (Kommentar 2)
    Ich hoffe damit auf die kleinste nötige Anzahl von Vergleiche zu kommen...

    int einmalig(int mA[], int mB[], int anz)
    {
        int ergebnis[100], folgeNeu[100];
        int i, j, einmal = 0;
    
        memset(ergebnis, 0, anz * sizeof(int));
        for(i = 0; i < anz - 1; i++) {
            if(ergebnis[i] != 0)                    // Kommentar 1
                continue;
            for(j = i + 1; j < anz; j++) {
                if(ergebnis[j] != 0)                // Kommentar 2   
                    continue;
                if(mA[i] == mA[j] && mB[i] == mB[j]) {
                    ergebnis[i] = ergebnis[j] = -1;
                }
            }
        }
    
        for(i = 0, j = 0; i < anz; i++) {
            if(ergebnis[i] != -1) {
                einmal++;
                folgeNeu[j++] = i;
            }
        }
    
        return einmal;
    }
    
    int main(void)
    {
        int mA[] = {1, 1, 1, 2, 1, 0};
        int mB[] = {0, 1, 0, 1, 1, 1};
        int spielAnz = 6;
        int einmaligAnz;
    
        einmaligAnz = einmalig(mA, mB, spielAnz);
    
        printf("Einmalige Spielergebnisse: %d\n", einmaligAnz); 
        system("pause");
        return 0;
    }
    

Anmelden zum Antworten