IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Programme Calcul de moyenne


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 15
    Par défaut Programme Calcul de moyenne
    Bonjour,

    Je souhaiterais faire un programme qui demande à l'utilisateur de saisir n etudiants, de récupérer ce nombre et d'en faire une allocation dynamique.

    On demande ensuite de saisir le nom de l'étudiant ensuite la note.
    Ces réponses sont ensuite stockés dans un fichier avec le format suivant :


    La note doit toujours se trouver à cet endroit. (J'en aurai besoin plus tard pour mes calculs).

    Je souhaite que le nom et les noms soit stockés dans des tableaux de type char [10+1] et note [5+1].

    J'ai fait un début de code mais à ce stade je suis bloqué.
    Je n'arrive pas à écrire dans le fichier et je ne vois pas comment faire en sorte que la note soit toujours au meme endroit dans ce fichier.

    Si quelqu'un pouvait m'éclairer
    Merci par avance.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
     
    char * saisie(void); // prototype de la fonction saisie
    void lecture(float); // prototype de la fonction afficher
     
    saisie(); //appel de la fonction saisie
     
    }
     
     
     
     
    char * saisie (void) {
     
     
        int nbretudiant=0, i=0;
     
        //char nom [10+1];
        //char age [5+1];
     
        char [10+1] nom;
        char [5+1] note;
     
        // On demande le nombre de notes à l'utilisateur
        printf("Combien d'etudiants ? ");
        scanf("%d", &nbretudiant);
     
        FILE*f;
        f=fopen("c:\\etudiants.txt","w+");
     
       if (nbretudiant > 0) // Il faut qu'il ait au moins une note
        {
              nom = malloc(nbretudiant * sizeof(char));
              note = malloc(nbretudiant * sizeof(char));
     
           if (nom == NULL) // On vérifie si l'allocation a marché ou pas
           {
                exit(0); // On arrête tout
           }
     
            // On demande le nom des amis un à un
            for (i = 0 ; i < nbretudiant ; i++)
            {
                printf("Nom de l'eleve numero %d ? \n", i + 1);
                scanf("%s", &nom[i]);
                //printf("nom de l'elève %s",&nom[i]);
     
     
                printf("Note de l'eleve numero %d ? \n",i + 1);
                scanf("%s", &note[i]);
     
            }
     
            // On affiche les âges stockés un à un
            printf("\n\nVos etudiants ont les notes suivantes :\n");
            for (i = 0 ; i < nbretudiant ; i++)
            {
     
     
     
                //fgets(f,"%s", &nom[i]);
                //fgets(f,": %s",&note[i]);
     
     
     
     
     
            }
     
            fclose(f);
     
            // On libère la mémoire allouée avec malloc, on n'en a plus besoin
            free(nom);
            free(note);
     
        }
     
        return 0;
     
    }

  2. #2
    Membre expérimenté
    Profil pro
    DSI
    Inscrit en
    Mai 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DSI

    Informations forums :
    Inscription : Mai 2009
    Messages : 120
    Par défaut
    Bonjour,

    peut être en utilisant des tabulations plutot que des espace entre tes notes et tes eleves, normalement tes notes devraient apparaitrent sur la meme colonne.

    Par contre il faut prevoir un nombre de tabulation assez grand pour ne pas avoir de surprise (par exemple si tu met 1 tabulations et que tu as un nom composé ca risque de pas etre bien aligné.)

    J'éspère avoir compris ton problème, et je dirais que cette "solution" que je donne n'est qu'une astuce rapide mais qui doit fonctionner.

    D'ailleur attention, si tu affiches ton programme dans une console je ne suis pas sur que les tabulations soit bien traités, par conséquent seul dans ton fichier tu auras le bon résultat.

    Bonne journée

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 15
    Par défaut
    Salut Merci pour ta réponse mais l'utilisation des espaces est un pré-requis.

    Mais pour l'instant le soucis c'est que je n'arrive pas à utiliser malloc avec les char que j'ai défini. Impossible de compiler le programme et donc d'écrire dans le fichier.

  4. #4
    Membre expérimenté
    Profil pro
    DSI
    Inscrit en
    Mai 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DSI

    Informations forums :
    Inscription : Mai 2009
    Messages : 120
    Par défaut
    Rebonjour, donc si j'ai bien compris tu as une liste de notes et de noms sous forme de char donc en faite tu un tableau et dedans un char * pour chaque note et chaque nom :

    nom[0][0...100] = "etudiant1\0"
    ...
    nom[n][0...100] = "etudiant n\0"

    Et pareil pour les notes.

    Essaye quelque chose de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    char **nom;
    char **note;
     
    nom = malloc(nbretudiant);            //Ici un tableau du nombre d'etudiant
    note = malloc(nbretudiant);           //Pareil
     
    //Allocation des sous tableaux pour les scanf
    for ( i = 0; i < nbretudiant; i++){
             nom[i] = malloc(sizeof(char) * 100);  //100 char possible pour le nom
             note[i] = malloc(sizeof(char) * 10);  //10 char possible pour la note
    }
     
    //Les scanf :
     
    scanf("%s", &nom[i][0]);   
    scanf("%s", &note[i][0]);
    //Pour chaque eleve i, utilisation de l'adresse du début du sous-tableau
     
    //Pour afficher correctement on fait pareil :
    printf("%s : %s\n", &nom[i][0], &note[i][0]);
     
    //Ne pas oublier de liberer la memoire 
    for ( i = 0; i < nbretudiant; i++){
                free(nom[i]);
                free(note[i]);
    }
     
    free(nom);     
    free(note);
    //J'ai pas fait de c depuis un moment si quelqu'un peut confirmer que les deux derniers free sont utiles.

    Quelque chose dans ce genre devrait mieux fonctionner.

    Bonne journée

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 15
    Par défaut
    J'ai suivi tes conseils.

    Mon programme ressemble à ça maintenant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
     
    char saisie(void); // prototype de la fonction saisie
    void lecture(float); // prototype de la fonction afficher
     
    saisie(); //appel de la fonction saisie
     
    }
     
     
     
     
    char saisie (void) {
     
     
        int nbretudiant=0, i=0;
     
        char **nom;
        char  **note;
     
     
        // On demande le nombre de notes à l'utilisateur
        printf("Combien d'etudiants ? ");
        scanf("%d", &nbretudiant);
     
     
        nom = malloc(nbretudiant);            //Ici un tableau du nombre d'etudiant
        note = malloc(nbretudiant);           //Pareil
     
        for ( i = 0; i < nbretudiant; i++){
             nom[i] = malloc(sizeof(char) * 100);  //100 char possible pour le nom
             note[i] = malloc(sizeof(char) * 10);  //10 char possible pour la note
    }
     
     
        FILE*f;
        f=fopen("c:\\etudiants.txt","w+");
     
            // On demande le nom des amis un à un
            for (i = 0 ; i < nbretudiant ; i++)
            {
                printf("Nom de l'eleve numero %d ? \n", i + 1);
                scanf("%s", &nom[i][0]);
                //printf("nom de l'elève %s",&nom[i]);
     
     
                printf("Note de l'eleve numero %d ? \n",i + 1);
                scanf("%s", &note[i][0]);
     
     
            }
     
            // On affiche les âges stockés un à un
            printf("\n\nVos etudiants ont les notes suivantes :\n");
            for (i = 0 ; i < nbretudiant ; i++)
            {
                fprintf("f,%s : %s\n", &nom[i][0], &note[i][0]);
     
     
     
            }
     
            fclose(f);
     
            // On libère la mémoire allouée avec malloc, on n'en a plus besoin
            free(nom);
            free(note);
     
            for ( i = 0; i < nbretudiant; i++){
                free(nom[i]);
                free(note[i]);
    }
            return 0;
     
        }
    Maintenant je voudrais faire en sorte que la note se trouve toujours à la même position malgré la longueur du nom.

    Merci en tout cas j'ai bien avancé.

  6. #6
    Membre expérimenté
    Profil pro
    DSI
    Inscrit en
    Mai 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DSI

    Informations forums :
    Inscription : Mai 2009
    Messages : 120
    Par défaut
    Rebonjour,

    partons du principe qu'un nom fait au maximum 20 char alors on peut tres bien dire que on aligne sur le 21 char les notes.

    Par conséquent il suffit de prendre les noms et de rajouter des espaces a la fin

    Exemple :

    nom[1] = "jean"

    jean = 4 char donc il manque 16 char pour arriver a 20 (\0 non compris)

    on peut faire quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //Fin du nom
    int depart = strlen(nom[1]);
     
    //On ajoute des espaces
    for (i = depart; i < 20; i++){
       nom[1][i] = ' ';
    }
    //On ajoute un caractere de fin
    nom[1][i] = '\0';
     
    printf ("%s %s", &nom[1][0], &note[1][0]);
    Normalement en appliquant une transformation de cette sorte les notes devraient etre alignées.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 15
    Par défaut
    Ok merci je comprend le principe.

    Par contre ce code doit venir remplacer mon ancienne boucle celle qui écris dans le fichier à savoir ?? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
       for (i = 0 ; i < nbretudiant ; i++)
          {
     
     
                fprintf(f,"%s  %s\n", &nom[i][0], &note[i][0]);
     
     
     
           }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf ("%s %s", &nom[1][0], &note[1][0]);
    le i est devenu un 1 ici, je comprend pas.

    Merci encore

Discussions similaires

  1. programme calculant les moyennes depuis un fichier
    Par mooshu dans le forum Général Python
    Réponses: 3
    Dernier message: 25/06/2013, 20h11
  2. Programme calcul de valeur moyenne
    Par PhyRen dans le forum Fortran
    Réponses: 4
    Dernier message: 20/08/2011, 18h40
  3. Programmation Shell avec Red Hat Calcul de moyenne
    Par jcpoulard dans le forum Linux
    Réponses: 3
    Dernier message: 22/02/2006, 22h08
  4. calculer une moyenne avec une requete externe
    Par allowen dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/01/2005, 16h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo