Problema array

di il
12 risposte

Problema array

Salve ho questo esercizio da risolvere. Stampare il codice e il numero totale di gol del giocatore che ha fatto più gol in campionato.
In pratica ho un array di giocatori identificati da un numero, con valori ripetuti, e un array di gol. Il mio problema sono i valori ripetuti.
A esempio: giocatori: 10,1,10,7,10 gol: 3,2,3,4,5 Il programma stampa: 10,11 ovvero giocatore 10 con 11 gol.
Io ho pensato di caricare in un terzo array la somma dei gol, ma non riesco a risolvere il problema dei duplicati.
Grazie
Qui sotto il mio codice
int main()
{
    int n=0;
    int g=0;
    int r=0;
    int uguali=0;
    do
    {
        cin>>n;
    }
    while(n<1||n>50);

    int giocatori[n];
    int reti[n];

    for(int i=0;i<n;i++)
        cin>>giocatori[i];


    for(int i=0;i<n;i++)
        cin>>reti[i];

    for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){
            if(giocatori[i]==giocatori[j]){
                uguali++;
                trovato=true;
            }
      }
    }


    int s[uguali];
    int k=0;
    int somma=0;

    for(int i=0;i<n;i++){
            somma=0;
        for(int j=0;j<n;j++){
            if(giocatori[i]==giocatori[j]){
                somma+=reti[j];
                trovato++;
            }
        }
        s[k]=somma;
        k++;
    }

    for(int i=0;i<k;i++)
        cout<<s[i]<<" ";

12 Risposte

  • Re: Problema array

    Innanzitutto voglio sottolineare che gli array statici devono avere come dimensione una costante, quindi per esempio int giocatori[n] è sbagliato.

    Prima di proporti la mia idea, mi serve sapere due cose:
    - conosci l'allocazione dinamica della memoria?
    - i numeri che identificano i giocatori che valori possono assumere? Posso affermare che essi appaertengono all'intervallo [1;99]?
  • Re: Problema array

    Se il compilatore supporta i VLA non è detto che debba usare array allocati con costante.
  • Re: Problema array

    Certo, ma lo standard C++ non prevede i VLA.
  • Re: Problema array

    Ma può funzionare con GCC perché GCC prevede una estensione per supportarli.
  • Re: Problema array

    Prima di proporti la mia idea, mi serve sapere due cose:
    - conosci l'allocazione dinamica della memoria?
    - i numeri che identificano i giocatori che valori possono assumere? Posso affermare che essi appaertengono all'intervallo [1;99]?
    Allora. Ufficialmente non mi hanno ancora spiegato l'allocazione dinamica. Però la ho studiata io da solo.
    Conosco la dualità puntatore array e l'utilizzo di malloc.
    I giocatori variano fra 1 e 50
    Grazie
  • Re: Problema array

    Allora. Ufficialmente non mi hanno ancora spiegato l'allocazione dinamica. Però la ho studiata io da solo.
    Conosco la dualità puntatore array e l'utilizzo di malloc.
    In C++ di solito si utilizza new/delete e non malloc/free.
    I giocatori variano fra 1 e 50
    Non intendevo questo, ma i numeri che identificano il singolo giocatore.
    Ho affermato che tale numero debba essere compreso tra 1 e 99, perchè ho ipotizzato che esso rappresentasse il numero di maglia del generico giocatore.
    Detto questo, l'idea è la seguente:
    - creare un array di 99 interi inizializzato a zero (chiamiamolo v), dove ciascun elemento rappresenta il numero di gol fatti dal giocatore con numero di maglia pari all'indice+1;
    - all'interno di un ciclo che si ripete n volte acquisire le variabili giocatore e reti, per poi imporre che v[giocatore-1]+=reti;
    - alla fine del ciclo avrai che il vettore v conterrà tutte le informazioni sui marcatori (poi come utilizzare queste informazioni lo decidi tu).

    Ovviamente l'esercizio può essere risolto anche in altri modi, ma ritengo che questo sia il modo più semplice.
  • Re: Problema array

    Nippolo ha scritto:


    Allora. Ufficialmente non mi hanno ancora spiegato l'allocazione dinamica. Però la ho studiata io da solo.
    Conosco la dualità puntatore array e l'utilizzo di malloc.
    In C++ di solito si utilizza new/delete e non malloc/free.
    Certo ma mica è vietato. In C++ dovresti usare classi e oggetti come i vector e non gli array.

    Comunque, la questione era solo se fosse possibile o no ... non mi interessa rintuzzare ad ogni post ... andiamo ...
  • Re: Problema array

    Grazie ragazzi ma c'è un problema nella soluzione prospettata. Sembrava avessi risolto ma alcuni test sono falliti.
    creare un array di 99 interi inizializzato a zero 
    il motivo è che il numero di maglia deve essere compreso fra 1 e 99 ma le righe dell'array devono essere fra 1 e 50. E' espressamente scritto nella consegna. Quindi non posso fare un array di 99 interi ma al massimo di 50
    Scusate se non lo ho detto prima
  • Re: Problema array

    Scusate ritiro. Avevo commesso un errore io. E' giusto. Grazie!
    Per curiosità come si risolverebbe con l'allocazione dinamica?
  • Re: Problema array

    Scusate ritiro. Avevo commesso un errore io. E' giusto. Grazie!
    Se vuoi posta il codice, così ci diamo un'occhiata!
    Per curiosità come si risolverebbe con l'allocazione dinamica?
    Dipende cosa intendi con risolvere... in ogni caso utilizzare o meno l'allocazione dinamica non è che cambi più di tanto la strategia risolutiva ideata.
  • Re: Problema array

    Ecco il codice.
    #include <iostream>
    #include <stdio.h>
    
    using namespace std;
    
    int main()
    {
        int n=0;
        int giocatore=0;
        int reti=0;
        int massimo=100;
    
        do
        {
            cin>>n;
        }
        while(n<1||n>50);
    
        int v[massimo];
    
        for(int i=0;i<massimo;i++)
            v[i]=0;
    
        for(int i=0;i<n;i++)
        {
            do{
            cin>>giocatore;
            }
            while(giocatore<1||giocatore>100);
    
            cin>>reti;
    
            v[giocatore-1]+=reti;
        }
    
        /*for(int i=0;i<massimo;i++){
            cout<<v[i]<<endl;
        }*/
    
        int maxi=-1;
        int posmax=-1;
        int i=0;
    
        for(i=0;i<massimo;i++)
        {
            if(v[i]>maxi){
                maxi=v[i];
                posmax=i;
            }
        }
    
        posmax++;
        cout<<posmax<<" "<<maxi;
    
    
    
        return 0;
    }
    
  • Re: Problema array

    - la libreria stdio non serve;
    - inizializzare le variabili a 0 (mi riferisco in questo caso alle variabili n, giocatore e reti) può essere una buona pratica di programmazione (soprattutto nel caso di programmi di grosse dimensioni, perchè può aiutare nella ricerca di eventuali bug), ma non è obbligatorio farlo;
    - se vuoi rispettare lo standard del C++, la dimensione di un array statico deve essere una costante, ma nel tuo caso massimo è una variabile e non una costante. Il problema può essere risolto dichiarando la suddetta variabile come costante, ossia const int massimo = 100;
    - dal momento che il numero di maglia varia da 1 a 99, per il vettore v è sufficiente una dimensione di 99 e non 100. A tal proposito anche la condizione del do/while va corretta in giocatore>99;
    - per inizializzare gli elementi di un array a 0 senza ricorrere ad un ciclo, basta scrivere v[DIM]={};
    - la variabile maxi non serve, basta posmax;
    - invece di inizializzare posmax a -1, puoi inizializzarlo a 0, per poi scorrere l'array a partire dal secondo elemento;
    - il return 0 è superfluo;
    - ti sta bene che se i capocannonieri sono più di uno te ne mostra solo uno (quello con il numero di maglia minore)?
Devi accedere o registrarti per scrivere nel forum
12 risposte