Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aidez moi pour mon projet C à rendre pour le 26/05

23 mai 2017 à 17:44:04

Sauriez-vous m'aidez pour mon projet ? Il ne me reste plus beaucoup de temps et j'ai pas mal d'erreurs que ne sais pas comment résoudre et il y a des modules que je ne sais pas comment faire.

Le but est de créer un système pour gérer une bibliotheque en langage c.

  • Partager sur Facebook
  • Partager sur Twitter
23 mai 2017 à 17:55:19

Yop,

Ben ça dépend, si tu présentes bien les choses et que tu fais quelques efforts bien sûr que tu recevras de l'aide :)

Je t'invite donc à présenter plus en détails le projet, ainsi que de partager tes essais de code et expliquer ce qui peut te bloquer :)

  • Partager sur Facebook
  • Partager sur Twitter
23 mai 2017 à 18:06:36

Re salut Gam' ( tu as déja répondu sur un de mes nombreux autres posts ),

Donc il me faut un programme dans lequel, un membre peut s'inscrire, dans lequel on peu introduire un nouveau livre et dans lequel un membre peut louer un des livres.

Je pensais donc tout stocker dans un tableau ( dans mon module Tab() ) pour tout enregistrer dans un fichier .txt à la fin pour que ce soit sauvegardé pour pouvoir reprendre les informations par la suite.

Voici l'ensemble de mon code :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*--------------------------------------- VARIABLES GLOBALES -----------------------------------------*/
// comme ça, les variables sont accessibles dans toutes les fontions!
void gerer_membres();
void gerer_livres();
void tab();
void showTab();
void save();
void locationLivre();

/*--------------------------------------- DECLARATION DES STRUCTURES -----------------------------------------*/

struct
{
    int ID;
    char nom[50];
    char prenom[50];
    char titre_livre[50];
    char resultat[100];
    int CP_ville;

}ligneTab[15];

/*--------------------------------------- Modules -----------------------------------------*/

void gerer_membres()
{
     char choix;
     int i,j;
do{
        system("cls");
        printf("\nQuelle action voulez-vous faire concernant les membres ?\n\n");
        printf("- A = Ajouter un membre\n");
        printf("- S = Supprimer un membre\n");
        printf("- R = Revenir au menu principal\n");
        printf("\nVotre choix : ");

        scanf("%c", &choix);
        printf("\n");

        switch (choix)
        {
        case 'A':

            printf("Combien de membres a rajouter ? ");
            scanf("%d", &i);
            for (j=0;j<i;j++)
                {
                    printf("\nNom: ");
                    fgets(ligneTab[j].nom,500,stdin);

                    printf("\nPrenom: ");
                    fgets(ligneTab[j].prenom,500,stdin);
                    printf("\nCode Postal de la ville : ");
                    scanf("%d",&ligneTab[j].CP_ville);
                    fflush(stdin);

                    system("pause");
}
                break;

        }

    }while( choix != 'R');
}
void gerer_livres(/*S_livre*livre,S_auteur*auteur, int *compteur_livre*/)
{
    /*------------Ouverture du fichier des livres ----------------*/

    char choix;
     int j,livre_add;
do{
        system("cls");
        printf("\nQuelle action voulez-vous faire concernant les livres ?\n\n");
        printf("- A = Ajouter un livre\n");
        printf("- R = Revenir au menu principal\n");
        printf("\nVotre choix : ");

        scanf("%c", &choix);
        printf("\n");

        switch(choix)
        {
    case 'A':
            printf("Combien de livres a rajouter ? ");
            scanf("%d", &livre_add);

            for (j=0;j<livre_add;j++)
                {
                    /* *compteur_livre += 1; // = compteur_livre+1*/
                    printf("Titre du livre: ");
                    gets(ligneTab[j].titre_livre);
system("pause");
                        break;
                }
        }

  }while( choix != 'R');
}

void Tab()
{
    int i;
    memset(ligneTab[i].nom, 0, 50); // créé une ligne du tableau pour les noms ( membre ) -- memset(*str, int c, size_t n) *str = ou ca va l'écrire, c = la valeur écrite, taille de ce qu'on écrit
    memset(ligneTab[i].prenom, 0, 50); // créé une ligne du tableau pour les prénoms ( membre )
    memset(ligneTab[i].CP_ville, 0, 50); // créé une ligne du tableau pour les villes ( membre )
    memset(ligneTab[i].titre_livre, 0, 50); // créé une ligne du tableau pour les livres ( livres )
    memset(ligneTab[i].resultat, 0, 100);
    // création du tableau
    strcpy(ligneTab[0].ID, "1. ");
    strcpy(ligneTab[1].ID, "2. ");
    strcpy(ligneTab[2].ID, "3. ");
    strcpy(ligneTab[3].ID, "4. ");
    strcpy(ligneTab[4].ID, "5. ");
    strcpy(ligneTab[5].ID, "6. ");
    strcpy(ligneTab[6].ID, "7. ");
    strcpy(ligneTab[7].ID, "8. ");
    strcpy(ligneTab[8].ID, "9. ");
    strcpy(ligneTab[9].ID, "10. ");
    strcpy(ligneTab[10].ID,"11. ");
    strcpy(ligneTab[11].ID,"12. ");
    strcpy(ligneTab[12].ID,"13. ");
    strcpy(ligneTab[13].ID,"14. ");
    strcpy(ligneTab[14].ID,"15. ");

}

void showTab()
{
    int i;
    for(i=0; i<15; i++)
    {
        if(ligneTab[i].nom == 0  )
        {
            printf(" AH...Pas de nom -"); // Cela met /
        }

        else
        {
            printf("Test %s -",ligneTab[i].nom); // Sinon, affiche les noms
        }
    }
printf("\n");
    for(i=0; i<15; i++)
    {
        if(ligneTab[i].prenom != 0)
        {
            printf(" %s -",ligneTab[i].prenom); // Sinon, affiche les prenoms
        }

        else
        {
            printf(" Pas de prenom -"); // Cela met /
        }

    }
printf("\n");


    for(i=0; i<15; i++)
    {
        if(ligneTab[i].CP_ville != 0)
        {
            printf(" %d -",ligneTab[i].CP_ville); // Sinon, affiche les codes postales de ville
        }

        else
        {
            printf(" Pas de CP -"); // Cela met /
        }
    }
printf("\n");


    for(i=0; i<15; i++)
    {
        if(ligneTab[i].titre_livre != 0)
        {
            printf(" %s -",ligneTab[i].titre_livre); // Sinon, affiche les noms
        }

        else
        {
            printf(" Pas de titre -"); // Cela met /
        }
    }
printf("\n");
}

void save()
{
    int i;
    FILE *fichier = NULL; //initialisé sur NULL pour être certain qu'il n'y ai pas d'erreur, c'est + sûr
    fichier = fopen("tableau.txt", "w");
    if(fichier != NULL)
    {
        for(i=0;i<15;i++)
        {
            fprintf(fichier,"%s %s %d\n%s  %s",ligneTab[i].nom,ligneTab[i].prenom,ligneTab[i].CP_ville,ligneTab[i].titre_livre,ligneTab[i].resultat);
        }
    }
    fclose(fichier);
}

void lire_Save()
{
    int i;
    FILE *fichier = NULL; //initialisé sur NULL pour être certain qu'il n'y ai pas d'erreur, c'est + sûr
    fichier = fopen("tableau.txt", "r");
    if(fichier != NULL)
    {
        for(i=0;i<15;i++)
        {
            fscanf(fichier,"%s %s %d\n%s ",&ligneTab[i].nom,&ligneTab[i].prenom,&ligneTab[i].CP_ville,&ligneTab[i].titre_livre,&ligneTab[i].resultat);
        }
        fclose(fichier);
    }
}

void locationLivre()
{
    printf("Quel est votre nom de membre ? ");
}

/*--------------------------------------------  MAIN  --------------------------------------------------*/

int main()
{
  Tab();
  lire_Save();
  char choix;
do
    {
        system("cls");
        printf("\nQuelle action voulez-vous faire ?\n\n");
        printf("- M  = Gerer les membres\n");
        /*printf("- A  = Afficher les membres\n");*/
        printf("- L  = Gerer les livres\n");
        /*printf("- P  = Afficher les livres\n");*/
        printf("- T = Afficher tout le tableau\n");
        printf("- S  = Sortir du programme\n\n");
        printf("Votre choix : ");

        scanf("%c", &choix);
        printf("\n");

         // On ne peut rien declarer dans un switch
        switch(choix)
        {
        case 'M':
            gerer_membres(); //mettre l'adresse et pas la valeur sinon va incrémenter la valeur et pas au bon endroit
            system("pause");
            break;

        case 'L':
            gerer_livres();
            system("pause");
            break;

case 'T':
            showTab();
            system("pause");
            break;

        case 'E':
            locationLivre();
            system("pause");
            break;


        }
    } while (choix != 'S');

save();

    return 0;
}

J'ai par contre aussi 2-3 problèmes : 1) Dans le module gérer membre, je n'arrive pas à ajouter un nom, cela passe directement au prénom.

2) Le programme crache à la ligne : Tab(); dans mon main.

  • Partager sur Facebook
  • Partager sur Twitter
23 mai 2017 à 20:22:00

Bonsoir,

Plein de chose à dire sur ton code…

Je vais commencer à l'envers:

« 2) Le programme crache à la ligne : Tab(); dans mon main. »

Dans ta fonction Tab au début tu déclare i sans l'initialiser et tu l'utilise juste après, sans valeurs…

« 1) Dans le module gérer membre, je n'arrive pas à ajouter un nom, cela passe directement au prénom. »

Après ton scanf ligne 49 tu ne vide pas le buffer, du coup ta variable ligneTab[j].nom prend ce qui reste dans le buffer

Ensuite, dans les environs de la lignes 50, tu à une « faille ». Étant données que tu à fixer la taille de ton tableau à 15, si tu saisie une valeurs supérieur tu va avoir droit à un magnifique débordement de pille comme on les aimes. Du coup tu dois penser a vérifier cette valeurs avant de faire quoi que ce soit d'autre avec.

De plus, (histoire de faire plus propre et compliqué un poil les choses), essai d'utiliser des pointeurs, notamment pour tes tableau (et justement ta structure).

Tu peux également créer des commentaires de documentations pour expliquer ce que font chacune de tes fonctions.

  • Partager sur Facebook
  • Partager sur Twitter
Ensemble créons l'avenir !
23 mai 2017 à 20:39:49

Oui j'ai résolu le probleme 2) merci ;)

Super, Problème 1) résolu grâce à toi, encore merci!

D'accord, j'ai bien compris et comment je peux vérifier cette valeurs ?

Je vais mettre des commentaires de suite

  • Partager sur Facebook
  • Partager sur Twitter
23 mai 2017 à 21:48:59

Tu peux déclarer une constante pour définir la valeur max, puis faire un do…while où tu lit le nombre de membres que tu souhaite rajouter, si cette valeur est inférieur à 0 (ou 1, ou ce que tu veux) ou supérieur au à la valeur maximum (prendre en compte le -1 pour la taille de tableaux) tu redemande de saisir la valeur.
  • Partager sur Facebook
  • Partager sur Twitter
Ensemble créons l'avenir !
23 mai 2017 à 21:59:17

J'ai compris le début mais je n'ai pas trop compris cette partie la :  " si cette valeur est inférieur à 0 (ou 1, ou ce que tu veux) ou supérieur au à la valeur maximum (prendre en compte le -1 pour la taille de tableaux) tu redemande de saisir la valeur."

Modif. : Je n'ai rien dis, j'ai relus une nième fois et j'ai pigé, merci bien!

En fait je n'ai tout de même pas compris l'utilité du do...while mais bien de la condition

J'ai donc fais ceci pour l'instant : ( en espérant avoir bien compris )

int valeur_max=15;
            printf("Combien de membres a rajouter ? ");
            scanf("%d", &i);
            fflush(stdin);
            if(i<0 || i>valeur_max)
            {
                printf("Combien de membres a rajouter ? ");
                scanf("%d", &i);
            }
            for (j=0;j<i;j++)
                {
                    printf("\nNom: ");
                    fgets(ligneTab[j].nom,500,stdin);

                    printf("\nPrenom: ");
                    fgets(ligneTab[j].prenom,500,stdin);
                    printf("\nCode Postal de la ville : ");
                    scanf("%d",&ligneTab[j].CP_ville);
                    fflush(stdin);



-
Edité par williamvh7 23 mai 2017 à 22:07:11

  • Partager sur Facebook
  • Partager sur Twitter
23 mai 2017 à 22:06:54

Le do while va te permettre de re-demander à l'utilisateur de re saisir la valeur (ici le nombre de membres) si elle n'est pas compris dans les bornes que tu souhaite. Ainsi tu t'assure qu'il ne rentre pas de valeurs incorrectes.
  • Partager sur Facebook
  • Partager sur Twitter
Ensemble créons l'avenir !
23 mai 2017 à 22:13:02

Et je le mets où et je mets quoi dans le while alors ?
  • Partager sur Facebook
  • Partager sur Twitter
23 mai 2017 à 22:19:14

Tu fait quelque chose comme ceci (vers la ligne 49):

// À définir en haut du fichier
#ifndef MAX_MEMBERS
#define MAX_MEMBERS 15
#endif

/*
 * Ensuite dans ton code, tu remplace ceci :
 * printf("Combien de membres a rajouter ? ");
 * scanf("%d", &i);
 * par :
 */

do {
    printf("Combien de membres a rajouter ? ");
    scanf("%d", &i);
    fflush(stdin);
} while( (i < 0) || (i > MAX_MEMBERS-1) );




Sans oublié le flush

-
Edité par Heziode 23 mai 2017 à 22:21:12

  • Partager sur Facebook
  • Partager sur Twitter
Ensemble créons l'avenir !
23 mai 2017 à 22:25:13

Attention, fflush() fonctionne uniquement sur les flux de sortie, donc pas sur stdin   /!\

Pour vider stdin tu peux faire

void vider_stdin(void)
{
    int c = 0;

    while (c != '\n' && c != EOF)
        c = getchar();
}



  • Partager sur Facebook
  • Partager sur Twitter
23 mai 2017 à 22:32:42

Merci Heziode! Et saurais-tu m'expliquer

#ifndef MAX_MEMBERS
#define MAX_MEMBERS 15
#endif
 ligne par ligne stp histoire d'être sur de ce qu'il fait
Et dans le do while, pourquoi MAX_MEMBERS-1 ?

J'ai appris ça pour "vider le buffer clavier" en cours donc je fais comme ça ;)

-
Edité par williamvh7 23 mai 2017 à 22:36:07

  • Partager sur Facebook
  • Partager sur Twitter
23 mai 2017 à 22:39:18

+1 pour Gam' pas de fflush sur stdin car comportement indéterminé. Voir http://en.cppreference.com/w/c/io/fflush

For input streams (and for update streams on which the last operation was input), the behavior is undefined.

WilliamVanHaute a écrit:

J'ai appris ça pour "vider le buffer clavier" en cours donc je fais comme ça ;)

-
Edité par WilliamVanHaute il y a moins de 30s


Bon ça ne doit pas être un cours au top.

-
Edité par cauld 23 mai 2017 à 22:39:32

  • Partager sur Facebook
  • Partager sur Twitter
23 mai 2017 à 23:12:41

Autant pour moi pour le buffer, j'ai pas fait de C depuis un moment, j'avais zappé…

Alors, la première ligne est une directive qui vérifie si la constante MAX_MEMBERS n'est pas définit, si elle n'est pas définis, il va à la ligne suivante (la 2), qui elle définis la constante en lui attribuant la valeur 15. La troisième est la fin du bloc d'instruction.

  • Partager sur Facebook
  • Partager sur Twitter
Ensemble créons l'avenir !
23 mai 2017 à 23:27:38

Un grand merci à toi! J'ai tout compris :)

Maintenant je m'attaque au module pour prêter un livre, tu aurais une idée de comment faire ?

void locationLivre()
{
    printf("Quel est votre nom de membre ? ");

    printf("Quel livre souhaitez-vous louer ? ");
}

Dans le main :

case 'E':
            locationLivre(); //Pour louer un livre
            system("pause");
            break;




-
Edité par williamvh7 23 mai 2017 à 23:28:02

  • Partager sur Facebook
  • Partager sur Twitter
24 mai 2017 à 8:55:08

Ce que tu peux faire pour simplifier la saisie de l'utilisateur et mieux contrôler ce qu'il saisie, c'est qu'au lieu de lui demandé son nom et le nom du livre, tu lui demande par exemple son numéro de membre (ici pour faire simple, tu peux prendre son index dans le tableau), pareil pour les livres. Tu lui affiche la liste des livres en préfixant par le numéro de celui-ci. (pense à donner le numéro de membre quand il viens d'être ajouter)
  • Partager sur Facebook
  • Partager sur Twitter
Ensemble créons l'avenir !
24 mai 2017 à 9:10:29

Ok je vois! Le probleme est que je ne sais pas trop quels sont les id de mes membres et de mes livres... :/
  • Partager sur Facebook
  • Partager sur Twitter
24 mai 2017 à 10:44:03

Comme propose Heziode tu peux donner l'index comme id, seulement il y a je pense un probleme.

Si un utilisateur se prensente, il s'ajoute et devient l'id 0. Mais si ensuite un deuxieme se presente et s'inscris, il ecrase le premier et prend l'id 0. Je pense que tu devrais plutot rajouter le nom apres le dernier sans recommencer a l'indice 0.

Sauf si tu as prevu qu'il fallait tout ajouter d'un seul coup et c'est bon.

Edit ; Je pense que le mieux est de faire un tableau pour les membre avec nom et id

un tableau pour les livres avec titre et id

un tableau pour les location qavec un membre et un livre

-
Edité par thetui 24 mai 2017 à 10:47:32

  • Partager sur Facebook
  • Partager sur Twitter
24 mai 2017 à 11:12:29

Oui je vais faire plusieur tableaux, se sera plus simple.

Tu entends quoi par " Tout rajouter d'un seul coup ?

  • Partager sur Facebook
  • Partager sur Twitter
24 mai 2017 à 11:21:57

Si tu as cinq membres

soit tu ajoutes les cinq d'un coup et ca marche

Soit tu en ajoutes d'abord trois puis deux et c'est la merde.

  • Partager sur Facebook
  • Partager sur Twitter
25 mai 2017 à 11:13:35

Oui effectivement comme tu m'as expliqué plus haut, de fait, lorsque j'introduis un nouveau membre, il prends la place du précédent et donc, je n'ai jamais plusieurs membres à moins d'en introduire plusieurs. Que me conseillerais-tu de faire pour améliorer ceci ?
  • Partager sur Facebook
  • Partager sur Twitter
25 mai 2017 à 12:39:21

Je pense que le mieux serait de remplacer tes tableaux statiques par des pointeurs, ainsi tu pourras les agrandir a ta guise avec des realloc().

typedef struct {
  ... //les attributs de membres
} Membre;
typedef struct {
  ... //les attributs de livre
} Livre;
typedef struct {
  ... //les attributs de location
} Location;

Membre *tab_m;
int nb_membres;
Livre *tab_l;
Location *tab_loc;

// quand tu veux agrandir
nb_membres++;
tab_m = realloc(tab_m, nb_membres * sizeof(Membre));



  • Partager sur Facebook
  • Partager sur Twitter
25 mai 2017 à 12:51:55

C'est ce que j'avais à la base mais je trouvais que c'était vachement se compliquer le vie :/

Tu as une autre idée en tête ? :)

  • Partager sur Facebook
  • Partager sur Twitter
25 mai 2017 à 13:15:58

Je pense que c'est la bonne soluton, en effet ca permet de creer des membre tant qu'on veut.

Ce que ne permet pas un tableau statique.

  • Partager sur Facebook
  • Partager sur Twitter
25 mai 2017 à 13:49:39

En soit, mon tableau statique peut créer 15 membres la non ? Ou alors j'ai mal compris ce que j'ai fais... :/

  • Partager sur Facebook
  • Partager sur Twitter
25 mai 2017 à 14:00:27

Comme je l'ai également dis, tu devrais utiliser des pointeurs pour tes tableaux. 

Actuellement tu peux rentrer 15 membre dans ton tableau, mais comme tu ne récupère pas l index de la dernière personne insérer, tu repars du début à chaque fois. 

Une fois assimilé, les pointeurs ne seront plus une gène, mais pour progresser avec, il faut les utiliser :p

  • Partager sur Facebook
  • Partager sur Twitter
Ensemble créons l'avenir !
25 mai 2017 à 14:02:57

D'accord! Il faut donc que je trouve un moyen de compter mes membre etc. ?

  • Partager sur Facebook
  • Partager sur Twitter
25 mai 2017 à 14:18:13

Oui, et avec ton code ça ne devrait pas être trop difficile
  • Partager sur Facebook
  • Partager sur Twitter
Ensemble créons l'avenir !
25 mai 2017 à 14:22:50

Je compte faire une variable globale initialisée à zéro et dès que l'on rentre un nouveau membre, elle augmente de 1, nickel non ? :)

-
Edité par williamvh7 25 mai 2017 à 14:33:10

  • Partager sur Facebook
  • Partager sur Twitter
25 mai 2017 à 14:26:44

Ça peut faire l affaire. 

Et ce qui est bien avec ce compteur c ers que tu peux également  l utiliser avec un pointeur pour savoir où tu en es 

  • Partager sur Facebook
  • Partager sur Twitter
Ensemble créons l'avenir !