Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2020
    Messaggi
    1

    [C] Stampare la media dei voti di studenti in vettore letto da input

    salve ragazzi vi chiedo gentilmente di aiutarmi a risolvere questo programma in c
    Si assuma presente in memoria un vettore contenente le informazioni relative alle verbalizzazioni di un esame.
    Il vettore contiene le coppie nome-voto. Ad esempio, il contenuto del vettore potrebbe essere il seguente:
    (gianni 27) (marco 28) (luigi 20) (giovanni 25) (sergio 24) (luisa 29)


    Realizzare lo pseudocodice e il codice di un programma in C che riceve in input dall’utente il vettore e stampi la media dei voti ottenuti dagli studenti
    ed il nome e il voto dello studente col voto piu’ alto. Se piu’ studenti condividono il voto piu’ alto li si devono stampare tutti.Fare almeno 3 funzioni .
    La media la stampa mentre il voto dello studente piu alto me lo da sbagliato.
    e il nome dello studente con il voto piu alto non me lo calcola proprio.

    //Si assuma presente in memoria un vettore contenente le informazioni relative alle verbalizzazioni di un esame.
    //Il vettore contiene le coppie nome-voto. Ad esempio, il contenuto del vettore potrebbe essere il seguente:
    //(gianni 27) (marco 28) (luigi 20) (giovanni 25) (sergio 24) (luisa 29)


    //Realizzare lo pseudocodice e il codice di un programma in C che riceve in input dall’utente il vettore e stampi la media dei voti ottenuti dagli studenti
    //ed il nome e il voto dello studente col voto piu’ alto. Se piu’ studenti condividono il voto piu’ alto li si devono stampare tutti
    codice:
    #include<stdio.h>
    #include<string.h>
    #define dim_pers 6      //dimensione del numero di studenti
    #define dim_stringa 12  //dimensione delle stringhe
    typedef struct{
        char nome[dim_stringa];
        int voto;
    }studente;
    
    
    char nome_voto_studente_piu_alto(studente persona[]);
    float media(studente persona[]);
    int voto_piu_alto( studente persona[]);
    int main(){
    int i;
     studente persona[dim_pers];
     float mediam;
     int v_piu_alto;
     char n_piu_alto;
    
    
          i=0;
        while(i<dim_pers){
        printf("inserisci nome:\n");
        scanf("%s",&persona[i].nome );
        printf("inserisci voto:\n");
        scanf("%d", &persona[i].voto);
        i++;
        }
    
    
    mediam=media(persona);
    
    
    v_piu_alto=voto_piu_alto(persona);
    
    
    n_piu_alto=nome_voto_studente_piu_alto(persona);
    system("pause");
    return 0;
    }
    
    
    
    
    float media(studente persona[]){
    int i;
    float media;
    int somma;
    
    
    media=0;
    somma=0;
    i=0;
        while(i<dim_pers){
        somma=somma+persona[i].voto;
        media=somma/6;
        i++;
        }
        printf("la media tra i voti degli studenti è:%f\n",media);
    return media;
    }
    
    
    
    
    int voto_piu_alto(studente persona[]){
    int i;
    int max;
    int indice;
    
    
        i=0;
        max=0;
        while(i<dim_pers){
            if(max<persona[i].voto){
            indice=0;
            max=persona[i].voto;
            indice=i;
            }
            i++;
    
    
        }
        printf("il voto piu alto tra gli studenti è:%d\n",indice);
    return indice;
    
    
    }
    
    
    char nome_voto_studente_piu_alto(studente persona[]){
    int i;
    char nome_max;
    char indice_max;
        i=0;
        while(i<dim_pers){
    
    
            if(nome_max!=persona[i].nome){
            nome_max=persona[i].nome;
            indice_max=i;
            }
    
    
        i++;
        }
        printf("il  dello studente con il voto piu alto é:%c",indice_max);
    return indice_max;
    }


    mi dite cosa non va bene oltre all'ultima funziona che non so proprio come farla partire?
    praticamente il codice mi calcola la media però non riesco a risolvere le altre 2 funzioni rimaste.
    quando vado a compilare la funzione con il voto piu alto tra gli studenti me la stampa sbagliata
    mentre la funzione con il nome dello studente con il voto piu alto l'ho sbagliata sicuramente tutta e sto cercando di capire come farla.
    Ultima modifica di dome98; 24-01-2020 a 14:33 Motivo: Aggiunti i tag CODE

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Ciao e benvenuto.
    Alcune considerazioni di carattere generale:

    1) Quando fai un post, metti un titolo che faccia capire il contenuto del post. "problemi con il c" non dice nulla del problema specifico che hai e potrebbe andar bene per tutti i post riguardanti il linguaggio C (l'ho corretto io).

    2) Quando posti del codice, inseriscilo all'interno degli appositi tag CODE (pulsante "#" presente nell'area di digitazione dei post), così viene mantenuta formattazione ed indentazione dello stesso (anche questo l'ho corretto io).

    3) Sei tu che devi dire a noi cosa non va, cioè cosa produce come risultato e cosa invece ti aspetti che faccia... eventualmente qualcuno leggerà il codice e cercherà di capire perchè fa quello che fa (o perchè va in errore, se va in errore).

    Ti invito, inoltre, a prendere visione del Regolamento Interno.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2014
    residenza
    Crema
    Messaggi
    205
    codice:
    #include<stdio.h>
    #include<string.h>
    #define dim_pers 6      //costante di dimensione del numero di studenti
    #define dim_stringa 12  //costante di dimensione delle stringhe
    
    
    //definizione struttura
    typedef struct{
        char nome[dim_stringa];
        int voto;
    }studente;
    
    
    //variabili globali
    /*
    char nome_voto_studente_piu_alto(studente persona[]);
    float media(studente persona[]);
    int voto_piu_alto( studente persona[]);
    */
    void riempiArray(studente[]);
    float calcolaMedia(studente[]);
    studente studenteMax(studente[]);
    //main
    int main(int argc, char *argv[]){
      studente persona[dim_pers];
      riempiArray(persona);
      float media = calcolaMedia(persona);
      printf("La media matematica dei voti e': %f\n",media);
      studente vincitore;
      vincitore=studenteMax(persona);
      printf("Lo studente che ha il voto piu' alto e' %s con %d",vincitore.nome,vincitore.voto);
    }
    
    
    //riempio l'array direttamente da funzione
    void riempiArray(studente persona[]){
        int i;
      for(i = 0; i<dim_pers; i++){
        printf("Inserire nome studente %d:",i+1);
        scanf("%s",&persona[i].nome);
        printf("Inserire voto studente %d:",i+1);
        scanf("%d",&persona[i].voto);
      }
    }
    //calcolo la media utilizzando variabili di supporto come la sommatoria
    float calcolaMedia(studente persona[]){
      int somm = 0,i;
      for( i=0; i<dim_pers; i++){
        somm += persona[i].voto;
      }
      float m = (float)somm/dim_pers;
      return m;
    }
    
    
    studente studenteMax(studente persona[]){
      int cmp = 0,i;//variabile d'appoggio, serve per la comparazione [cmp = comparazione]
      char string[dim_stringa];
      studente ris;
      for( i = 0; i<dim_pers;i++){
        if(persona[i].voto > cmp){
          cmp = persona[i].voto;
          strcpy(string,persona[i].nome);
        }
      }
      strcpy(ris.nome,string);
      ris.voto = cmp;
      return ris;
    }
    Ti ho sistemato il codice:
    1-Ho utilizzato i for al posto dei while per semplice comodità, se non li conosci (anche se non credo) ti consiglio di vederteli perchè sono utilissimi.
    2-Ho riempito l'array di "studente" con una funzione, solamente per pulire un po' il codice.
    3-Ho integrato nella stessa funzione ( che ritorna una variabile studente) sia la funzione per il voto massimo che quella per trovare il nome dello studente migliore: in modo da rendere meno complicato l'utilizzo delle variabili
    4-Come ti ho già segnalato nel codice: ti consiglio di non mettere mai printf in funzioni che devono ritornare qualcosa.
    5-le variabili globali che hai utilizzato sinceramente non le trovo utili per completare l'esercizio.
    6-se stai imparando a programmare in c, ricordati sempre di creare i prototipi delle funzioni prima del main, piccola parentesi sul main: il main è una funzione come tutte le altre, perciò deve ritornare qualcosa e soprattutto ha dei parametri all'interno della parentesi, per il linguaggio c i parametri del main sono int argg, char *argv[].
    7-Consiglio completamente personale: cerca di commentare ed indentare meglio ogni codice che scrivi (serve moltissimo per la comprensione del codice agli altri programmatori)

  4. #4
    #codice

    codice:
    void riempiArray(studente[]);
    float calcolaMedia(studente[]);
    // studente studenteMax(studente[]);
    
    int votazioneMax(studente[]);
    void studentiMax(studente[], int v_max);
    
    
    //main
    int main(int argc, char *argv[]){
      studente persona[dim_pers];
      
      int voto_max = 0;
      
      riempiArray(persona);
      float media = calcolaMedia(persona);
      printf("La media matematica dei voti e': %f\n",media);
    //  studente vincitore;
    //  vincitore=studenteMax(persona);
    //  printf("Lo studente che ha il voto piu' alto e' %s con %d",vincitore.nome,vincitore.voto);
        voto_max = votazioneMax(persona);
        studentiMax( persona, voto_max);
        
    }
    
    
    
    
    //riempio l'array direttamente da funzione
    void riempiArray(studente persona[]){
        int i;
      for(i = 0; i<dim_pers; i++){
        printf("Inserire nome studente %d:",i+1);
        scanf("%s",&persona[i].nome);
        printf("Inserire voto studente %d:",i+1);
        scanf("%d",&persona[i].voto);
      }
    }
    //calcolo la media utilizzando variabili di supporto come la sommatoria
    float calcolaMedia(studente persona[]){
      int somm = 0,i;
      for( i=0; i<dim_pers; i++){
        somm += persona[i].voto;
      }
      float m = (float)somm/dim_pers;
      return m;
    }
    
    
    /*
    studente studenteMax(studente persona[]){
      int cmp = 0,i;//variabile d'appoggio, serve per la comparazione [cmp = comparazione]
      char string[dim_stringa];
      studente ris;
      for( i = 0; i<dim_pers;i++){
        if(persona[i].voto > cmp){
          cmp = persona[i].voto;
          strcpy(string,persona[i].nome);
        }
      }
      strcpy(ris.nome,string);
      ris.voto = cmp;
      return ris;
    }
    */
    
    int votazioneMax(studente persona[]){
      int max_v = 0,i;
      for( i=0; i<dim_pers; i++){
        if ( max_v < persona[i].voto )
            max_v = persona[i].voto ;
      }
    
      return max_v;
    }
    
    void studentiMax(studente persona[], int v_max){
      int cmp = 0,i;//variabile d'appoggio, serve per la comparazione [cmp = comparazione]
      char string[dim_stringa];
      studente ris;
      for( i = 0; i<dim_pers;i++){
        if(persona[i].voto == v_max){
          printf("\nStudente con il voto piu' alto e' %s con %d",persona[i].nome,persona[i].voto);
        }
      }
    }
    Ciao
    ti suggerisco una modifica alla soluzione che ti ha inviato compare, soluzione CORRETTA ma che risponde solo parzialmente all'ultimo quesito cioè quello di elencare tutti gli studenti che raggiungono il max voto. La funzione studenteMax in realtà fornisce solo il primo in ordine nell'array che raggiunge il max.
    Nel codice sopra ti ho evidenziato le modifiche inserite correggendo opportunamente il main per utilizzare le due funzioni nuove che ho inserito in sostituzione della studenteMax.
    Ho scelto quella più semplice come logica che prevede una funzione int votazioneMax per trovare il max voto tra tutti quelli ottenuti e una void studentiMax che provvede a stampare i nomi e voto per quelli che raggiungono il max.

    In grassetto le modifiche e le parti commentate

    Ciao
    Andrea
    Ultima modifica di LeleFT; 19-02-2020 a 15:08 Motivo: Aggiunti i tag CODE

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    @pontisoft: le stesse considerazioni fatte all'inizio, valgono anche per te (vedi punto 2, in particolare).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.