Programme Moyenne

kable78 Messages postés 4 Date d'inscription lundi 20 décembre 2010 Statut Membre Dernière intervention 21 décembre 2010 - 20 déc. 2010 à 00:26
kable78 Messages postés 4 Date d'inscription lundi 20 décembre 2010 Statut Membre Dernière intervention 21 décembre 2010 - 21 déc. 2010 à 18:36
Bonjour,

Je cherche à faire un programme qui permet le calcul d'une moyenne à partir d'un fichier.
Dans ce fichier doit figurer le nom de l'élève suivit de sa note.

J'ai commencer par une fonction saisie et création (fichier)
Je demande à l'utilisateur de saisir le nombre d'étudiants.(allocation dynamique).
En fonction de ça j'alloue de la mémoire.
Ensuite je demande la saisie du nom de l'élève et ensuite sa note.

Le problème survient lorsque je veux écrire dans le fichier ce que j'ai récupèré.
Mon programme s'exécute mais m'indique qu'il du cessé de fonctionner.

Voici mon code :

#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 = NULL;

    // 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)); // On alloue de la mémoire pour le tableau
          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("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;

}




Je voudrais que dans mon fichier txt le format ressemble à ça :

DUPOND    10.00
MARTIN    12.00
RICHARD   14.00


En effet, cela me permettrait ensuite de récupérer plus facilement les notes.

Si quelqu'un pouvait m'aider dans un premier temps pour écrire correctement dans ce fichier txt.

Merci par avance

8 réponses

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
20 déc. 2010 à 04:06
salut,

nom = malloc(nbretudiant * sizeof(char));

ici, tu alloue une chaine en supposant que la taille du nom soit définie par le nombre d'etudiant. Avec un étudiant, il faudra qu'il s'appelle "A" ou "B" ou "C" ou ...

Pour connaitre la taille du nom de l'élève, tu devras passer par un buffer temporaire avec une taille (#define MAX_TAILLE_NOMS 255)
char tmpbuf[MAX_TAILLE_NOMS]
scanf("%s", &tmpbuf[0]);

char **noms = new char*(nbetudiants);
noms[0] = strdup(tmpbuf);

noms[0][0] = initiale du premier étudiant.

tu dois faire un tableau a deux dimensions.

Dans les scanf, tu dois passer l'adresse de la chaine noms[i] &noms[i][0].

@++
0
kable78 Messages postés 4 Date d'inscription lundi 20 décembre 2010 Statut Membre Dernière intervention 21 décembre 2010
20 déc. 2010 à 10:38
Bonjour et merci pour cette réponse.
Est-ce que en passant par deux tableaux différents cela n'est plus simple à gérer pour moi.
Je t'avoue que j'ai un peu de mal avec les tableaux à deux dimensions.

Est-ce que avec le code ci-dessous et donc deux tableaux différents un pour les noms et l'autre pour les notes cela n'est pas plus simple à gérer.

Concernant mon malloc comment je peux alors lui allouer automatique 10 cases quelque soit la longueur du nom. Est-ce que le buffer dont tu parles sers à cela ?

#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];

    // 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("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;

}
0
kable78 Messages postés 4 Date d'inscription lundi 20 décembre 2010 Statut Membre Dernière intervention 21 décembre 2010
20 déc. 2010 à 14:16
Bonjour j'ai reussi à avancer.
Voici mon programme :

Maintenant je voudrais faire en sorte que la note se trouve toujours à la position 11.

#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;

    }


Avez-vous une idée de comment je peux faire ça ?
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
20 déc. 2010 à 15:09
oui mais dans ce cas, ce qui est dommage c'est que tu perds beaucoup de memoire avec nom[n] toujours avec 100 octets.

d'où:
char tmpname[100];

if (*tmpname) {
scanf("%s", tmpname);
nom[i] = strdup(tmpname);
}

strdup realloue la memoire qu'il faut pour recopier la chaîne. l'allocation se fait par malloc.

C'est quoi un tableau a deux dimensions:

char *dim1 = "Tableau de char";
char dim1[] = "Tableau de char";
dim1[0] = *dim1 = "T"

char **dim2 = { "tab1", "tab2", tabN" }
char* *dim2 = { char *dim1_0, char *dim1_1, ... }

dim2 pointe vers un tableau de tableau de char.
dim2[0] = *dim2 = char *dim1_0

donc:
nom = malloc(nbretudiant*sizeof(char*));

et n'oublie pas de liberer nom et note.

@++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
20 déc. 2010 à 15:10
oups,

char tmpname[100];
scanf("%s", tmpname);
if (*tmpname) nom[i] = strdup(tmpname);
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
20 déc. 2010 à 15:18
Mince, tu libères bien nom mais avant de liberer son contenu. Logiquement, après libération, le contenu est innaccessible car nom n'a plus de valeur.
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
20 déc. 2010 à 16:11
pour la position de la note, regarde les options de formatages possibles des fonctions printf.
0
kable78 Messages postés 4 Date d'inscription lundi 20 décembre 2010 Statut Membre Dernière intervention 21 décembre 2010
21 déc. 2010 à 18:36
Bonjour,

Merci pour vos réponses.
Je m'en suis sorti.
Vous pouvez clôturé le sujet.
0
Rejoignez-nous