Pagina 1 di 1

c calcolare in numero dei voti di un atleta

Inviato: mercoledì 14 maggio 2014, 12:40
da fenics
Salve a tutti, per la verifica di informatica alla mia scuola devo fare un programma in cui io giudice assegno per 5 atleti dei punteggi. Il programma mi stampa il numero del punteggo che è presente + volte
e io ho fatto così, solo che il risultato non porta:

Codice: Seleziona tutto

#include<stdio.h>

#define ATLETI 5
int main()
{
    int vet[ATLETI]={1,2,3,4,5};
    int i, p=0, c=0;

    printf("Assegna 5 voti\n");

    for(i=1; i<=ATLETI; i++)
        {
            scanf("%8d",&vet[i]);
            printf("%s%15s\n","Atleta","Punteggio");
            printf("%6d%15d\n",i,vet[i]);

            if(vet[i]==p)
            {
            c=c+1;
            }
        }
            printf("\nIl voto %d e' assegnato %d volte\n",p,c);

            return 0;
}
es: se io assegno 6, 5, 7, 6,9, lui mi calcola solo l'ultimo, oppure se metto 5 volte "6" mi dice che il 6 è presente solo una volta

Re: c calcolare in numero dei voti di un atleta

Inviato: mercoledì 14 maggio 2014, 14:54
da ienaplinsky
ciao allora incominciamo dagli errori il vettore contiene 5 elementi con indici che vanno da 0 a 4

Codice: Seleziona tutto

vet[ATLETI];
nel for parti da 1 e finisci a 5 salvando in aeree di memoria che non hai allocato quando accedi a vet[5] quindi il for da cosi

Codice: Seleziona tutto

for(i=1; i<=ATLETI; i++)
diventa

Codice: Seleziona tutto

for(i=0; i<ATLETI; i++)
poi

Codice: Seleziona tutto

if(vet[i]==p)
            {
            c=c+1;
            }
p lo inizializzi a 0, quindi se non inserisci un numero uguale a 0 per i voti nell if non ci entrerai mai e c non sarà mai incrementato.
suggerimenti per risolvere l' esercizio
se sai il range dei voti (ad esempio da 1 a 10), puoi crearti un array di frequenze di 10 elementi, e ogni volta che esce un voto aumenti l' elemento dell' array che ha come indice quel voto, ricordandoti sempre di salvare l' indice dell' elemento che ha frequenza massima. In questo modo puoi anche estrarre voti che hanno la stessa frequenza, ad esempio se inserisci 2 volte 1 e 2 volte 2 sei in grado di dire all' utente che due voti hanno la stessa frequenza e quali sono, se il range dei voti non lo conosci o scansioni il vettore dei voti in cerca del voto più frequente oppure usi la stessa tecnica di sopra con un array di frequenze più grande

Re: c calcolare in numero dei voti di un atleta

Inviato: mercoledì 14 maggio 2014, 15:59
da fenics
non ho capito come pèrocedere con il programma. Mi faresti un esempio?? O mi dici tu come fare di modo che poi io studio su il tuo codice??

Re: c calcolare in numero dei voti di un atleta

Inviato: mercoledì 14 maggio 2014, 16:19
da ienaplinsky
supponiamo che i voti ammissibili sono i numeri da 1 a 10, crei un array di frequenze[10] (inizializzando tutti gli elementi a 0), un indice per ricordarti la frequenza massima (lo inizializzi a -1 ad esempio), entri nel for l' utente inserisce un voto lo salvi nel vettore dei voti, aumenti di uno frequenza[voto_appena_inserito - 1]++(-1 sempre per il discorso che si parte da 0), se l' indice che contiene il voto massimo è uguale a -1 allora salvi il voto appena inserito nell' indice, altrimenti controlli se la frequenza[indice - 1] < frequenza[voto_appena_inserito - 1] sovrascrivi indice con il voto appena inserito

Re: c calcolare in numero dei voti di un atleta

Inviato: mercoledì 14 maggio 2014, 16:27
da fenics
in pratica devo rifare tutto il programma allora

Re: c calcolare in numero dei voti di un atleta

Inviato: mercoledì 14 maggio 2014, 16:32
da ienaplinsky
devi aggiungere solo quello che ti ho detto, prova ad implementarlo se poi hai problemi ti aiuto inzia a buttare giù qualcosa

Re: c calcolare in numero dei voti di un atleta

Inviato: mercoledì 14 maggio 2014, 17:00
da fenics

Codice: Seleziona tutto

#include<stdio.h>

#define ATLETI 5

int main()
{
    int vet[ATLETI]={1,2,3,4,5};
    int occorrenze[10];
    int i, p=0;

    printf("Assegna 5 voti\n");

    for(i=0; i<ATLETI; i++)
        {
            scanf("%8d",&vet[i]);
            printf("%s%15s\n","Atleta","Punteggio");
            printf("%6d%15d\n",i,vet[i]);

            for(occorrenze[10]=-1; p<occorrenze[10]; occorrenze[-1]++)
            {
                printf("%d",occorrenze[5]);
            }
            if(occorrenze[i]==-1)
            printf("\nIl voto %d e' assegnato %d volte\n",p,occorrenze[5]);
        }
            return 0;
}
ci sono quasi??

Re: c calcolare in numero dei voti di un atleta

Inviato: mercoledì 14 maggio 2014, 17:26
da ienaplinsky

Codice: Seleziona tutto

for(occorrenze[10]=-1; p<occorrenze[10]; occorrenze[-1]++)
            {
                printf("%d",occorrenze[5]);
            }
            if(occorrenze[i]==-1)
            printf("\nIl voto %d e' assegnato %d volte\n",p,occorrenze[5]);
ci sono molti errori occorrenze[10] e occorrenze[-1] non fanno parte dell' array, ripeto gli indici vanno da 0 a 9, poi questo for dipende da quello che c'era nelle zone di memoria che non sono state inizializzate, p vale 0 non cambia mai, poi perchè stampare occorrenze[5]

io intendevo qualcosa del genere

Codice: Seleziona tutto

#include<stdio.h>

#define ATLETI 5
#define VOTI 10 // range dei voti da 1 a 10
int main()
{
  int voto, frequenzaVoti[VOTI] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // l' array va inizializzato
  int indiceFrequenzaMax = -1, i;
  
  printf("Assegna 5 voti\n");
 
  for(i=0; i<ATLETI; i++)
    {
      // ti assicuri che non venga inserito input indesiderato
      do {
	       scanf("%8d", &voto);
      } while(voto < 1 || voto > 10);
      
      printf("%s%15s\n","Atleta","Punteggio");
      printf("%6d%15d\n",i + 1,voto);
      frequenzaVoti[voto - 1]++;
      // se l' indice è uguale a -1 allora è il primo giro 
      // e lo poni uguale all' unico voto inserito
      if(indiceFrequenzaMax == -1) {
	        indiceFrequenzaMax = voto - 1;
      } // altrimenti controlli se la frequenza del voto inserito è maggiore di quella attualmetne massima
      else if(frequenzaVoti[indiceFrequenzaMax] < frequenzaVoti[voto - 1]) {
	        indiceFrequenzaMax = voto - 1;
      }
      
    }
  
  // serve se vuoi ammettere che possono essere più voti con la stessa frequenza
  for(i = 0; i < VOTI; i++) {
    if(frequenzaVoti[i] == frequenzaVoti[indiceFrequenzaMax]) {
      printf("\nIl voto %d e' assegnato %d volte\n", i + 1, frequenzaVoti[indiceFrequenzaMax]);
    }
  }
  
  
  return 0;
}

Re: c calcolare in numero dei voti di un atleta

Inviato: mercoledì 14 maggio 2014, 17:47
da fenics
Non ci sarei mai arrivato. Ora mi studio il codice e vedo di rifarlo senza guardare. Beh Grazie 1000, un cosa, l'istruzione do cosa fa esattamente??

Re: c calcolare in numero dei voti di un atleta

Inviato: mercoledì 14 maggio 2014, 18:09
da ienaplinsky
è un costrutto del c tipo il while solo che il do while viene eseguito almeno una vota
maggiori info