Comment empêcher la fonction de se répéter ?

Résolu
Harvard226 Messages postés 11 Statut Membre -  
Harvard226 Messages postés 11 Statut Membre -
Bonjour,
J'ai créé une fonction pour me permettre d'ajouter une classe ainsi que les renseignements qui vont avec (effectif et code de la classe ) dans un fichier nommé classe qu'elle (la fonction) crée elle. Mais après un premier tour (tout ce passe bien en ce moment là) elle recommence. Je n'ai pourtant pas utilisé de boucle.

3 réponses

  1. NHenry Messages postés 15235 Date d'inscription   Statut Modérateur Dernière intervention   387
     
    Sans code impossible de répondre.
    0
  2. Harvard226 Messages postés 11 Statut Membre
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    //renseignements sur les classes
    struct classe
    {
    int num;
    char nom[50];
    int effec;
    };
    struct classe classes;
    
    //fonction de recherche classe
    int recherche_classe(int code)
    {
    
    FILE*classe ;
    classe = fopen("classes.g11", "r");
    if(classe !=NULL)
    {
    do
    {
    fscanf(classe,"%d ;%s ;%ld\n",&classes.num,&classes.nom,&classes.effec);
    fflush(stdin);
    if(classes.num== code)
    {
    fclose(classe);
    return 1; 
    }
    }while(!feof(classe));
    fclose(classe);
    return 0;
    }
    }
    
    
    //ajouter une classe
    <gras>Void ajouter_classe()</gras>
    {
    FILE*classe;
    int code;
    /*char c;
    c=';';*/
    classe=fopen("classes.g11","a");
    printf("\nentrez l'identifiant de la classe: ");
    scanf("%d",&code);
    fflush(stdin);
    
    while(recherche_classe(code)==1)
    {
    printf("\ncette classe existe deja\n");
    printf("entrer un nouvel identifiant");
    scanf("%d",&code);
    }
    if(classe != NULL)
    {
    classes.num=code;
    printf("%d\n",classes.num);
    printf("\nentrer le nom de la classe: ");
    //gets(classes.nom);
    scanf("%s",classes.nom);
    fflush(stdin);
    printf("%s\n",classes.nom);
    printf("\nentrer l'effectif de la classe:");
    scanf("%d",classes.effec);
    printf("%d\n",classes.effec);
    fflush(stdin);
    
    fprintf(classe,"%d ;%s ;%d\n",classes.num,classes.nom,classes.effec);
    fflush(stdin);
    
    fclose(classe);
    }
    }
    
    //afficher la liste des classes
    void affiche_classe()
    {
    FILE*classe =fopen("classes.g11", "r");
    printf("la liste des classes est :\n\n");
    printf("Code de la classe \t; nom de la classe\t; effectif de la classe\n");
    if(classe!=NULL)
    {
    do
    {
    fscanf(classe,"%d ;%s ;%d\n",&classes.num,&classes.nom,&classes.effec);
    fflush(stdin);
    printf("%d\t ;%s\t ;%d\n",classes.num,classes.nom,classes.effec);
    }
    while (!feof(classe));
    fclose(classe);
    }
    }
    
    
    int main()
    {
    int choix;
    char T;
    do
    {
    printf("entrer 1 pour ajouter une classe\n");
    printf("entrer 2 pour afficher la liste des classes\n");
    printf("entrez votre choix: ");
    scanf("%d",&choix);
    while(choix>=1 && choix<=2)
    {
    switch(choix)
    {
    case 1:ajouter_classe();
    break;
    case 2:affiche_classe();
    break;
    }
    }
    
    printf("\nvoulez vous continuer O/N");
    scanf("%s",&T);
    fflush(stdin);
    }
    while(T=='o' ||T=='O');}
    0
  3. Utilisateur anonyme
     
    Bonjour,

    Je n'ai pourtant pas utilisé de boucle.
    Bien sûr que si :
    while(choix>=1 && choix<=2)
    (l. 107).
    0
    1. Harvard226 Messages postés 11 Statut Membre
       
      Oui mais apres l'appel de la fonction, après un premier tour la fonction est encore rappeler alors que normalement l'exécution devrait se poursuivre dans le int main.
      0
    2. Utilisateur anonyme
       
      L'exécution se poursuit bien dans main, mais dans la boucle
      while
      , donc elle est réexécutée.
      0
    3. Harvard226 Messages postés 11 Statut Membre
       
      Dans ce cas là ne devrait-on pas me proposer normalement d'entrer 1 pour ajouter une classe et 2 pour afficher la liste des classes. ?
      0
    4. Utilisateur anonyme
       
      Non puisque ces instructions sont hors de la boucle
      while
      .
      0
    5. Harvard226 Messages postés 11 Statut Membre
       
      Oui effectivement ça marche maintenant.
      Merci pkpkmépkpk
      0