begin process at 2012 05 30 14:20:01
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Général

 > 

Programme Moyenne


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Programme Moyenne

lundi 20 décembre 2010 à 00:26:43 | Programme Moyenne

kable78

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 :

Code C/C++ :
#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;

}




Code :
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




lundi 20 décembre 2010 à 04:06:38 | Re : Programme Moyenne

patatalo

Membre Club Administrateur CodeS-SourceS
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].

@++
lundi 20 décembre 2010 à 10:38:35 | Re : Programme Moyenne

kable78

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 ?

Code C/C++ :
#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;

}
lundi 20 décembre 2010 à 14:16:19 | Re : Programme Moyenne

kable78

Bonjour j'ai reussi à avancer.
Voici mon programme :

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

Code C/C++ :
#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 ?



lundi 20 décembre 2010 à 15:09:26 | Re : Programme Moyenne

patatalo

Membre Club Administrateur CodeS-SourceS
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.

@++
lundi 20 décembre 2010 à 15:10:52 | Re : Programme Moyenne

patatalo

Membre Club Administrateur CodeS-SourceS
oups,

char tmpname[100];
scanf("%s", tmpname);
if (*tmpname) nom[i] = strdup(tmpname);
lundi 20 décembre 2010 à 15:18:32 | Re : Programme Moyenne

patatalo

Membre Club Administrateur CodeS-SourceS
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.
lundi 20 décembre 2010 à 16:11:32 | Re : Programme Moyenne

patatalo

Membre Club Administrateur CodeS-SourceS
pour la position de la note, regarde les options de formatages possibles des fonctions printf.
mardi 21 décembre 2010 à 18:36:39 | Re : Programme Moyenne

kable78

Bonjour,

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


Cette discussion est classée dans : fichier, saisie, char, note, nbretudiant


Répondre à ce message

Sujets en rapport avec ce message

Debutant : ecrire et lire un fichier txt [ par manu ] Bonjour a tous.Je debute, aussi desole.... :)Je cherche donc a ecrire dans un fichier txt, puis a lire ce fichier ligne a ligne, faire un split / expl ecriture fichier txt turboC++ [ par idk ] qqun connais une fonction, qui te place le cursor, (dans un fichier),CAD qui renvoie à la ligne suivante exemple char prenom="tom"char nom="bauq" Et d écriture dans un fichier txt [ par jimtruand ] bonjour,j'ai un fichier txt à traiter et à envoyer via ftp à un serveur. la partie ftp est ok.la partie fichier pt'problèmedans le fichier je dois mod Ecriture/lecture dans un fichier [ par SneakGuy ] Haaa... Merci, sa m'a aider... Enfin, j'ai encore plusieurs problemes...pour l'ecriture j'ai quelque chose qui ressemble a sa:char user[20];char pass[ ça concerne la lecture et l'ecriture sur un fichier et ... [ par wfish ] voila mon pb :j'ai fais un ptit prog de traitement de fichier. il sert à mettre certaines infos prises dans un fichier et les mettre dans un autre !!1 liste chainée et lecture d'un fichier txt [ par whiteknight ] Bonjour j'ai un probleme pour charger des données depuis un fichier texte, les données recupérées doivent etre stocké dans un liste chainée déclaré ai PROBLEME pour retourner un char* a partir d'un fichier [ par kobee12 ] Voici ma fonction. Elle prend en argument un caractere. A partir de ce caractere, elle renvoie la chaine qui lui est associe.Par exemple:"fichier_lang PROBLEME pour retourner un char* apres recuperation d'une chaine(sscanf) d'un fichier [ par kobee12 ] Voici ma fonction. Elle prend en argument un caractere. A partir de ce caractere, elle renvoie la chaine qui lui est associe.Par exemple:"fichier_lang Lecture dans un fichier ... CHaud !! [ par ilyatout ] Bonjour,VOilà g un gros problème, c'est idiot mais je n'y arrive pas.j'ai un fichier de la sorte :NOM : NICOLAS / MARTIN // 28je dois stocker NICOLAS Petite question ayant attrait à la gestion de fichier. [ par meteore ] Voila je suis en train de faire un petit logiciel pour le classement de mes cds.J'ai donc créer une fonction permettant d'ajouter un cd dans une boite


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,170 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales