Partage
  • Partager sur Facebook
  • Partager sur Twitter

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

25 mai 2017 à 14:33:15

Par contre j'ai beau chercher et je ne sais pas trop où utiliser ce compteur... Et je t'assure que je fais de mon mieux :/
  • Partager sur Facebook
  • Partager sur Twitter
25 mai 2017 à 14:35:34

Tu l incrément quand tu à lue le nombre de personnes à ajouter. Et tu t en sert pour inséré dans ton tableau
  • Partager sur Facebook
  • Partager sur Twitter
Ensemble créons l'avenir !
25 mai 2017 à 14:40:36

Oui l'incrémentation je l'avais faite ;)

Je m'en suis servi comme ceci :

void Tab_membres()
{
    int i;
    for(i=1;i<=c_membres;i++) // va tourner 1 seule fois
    {
        ligneTab[i].ID_membre = i + 1;
        ligneTab[i].CP_ville = 0; // initialise la variable de 0 à 14
        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 )
    }
}

void Tab_livres()
{
    int i;
    for(i=1;i<=c_livres;i++) // va tourner 1 seule fois
    {
        ligneTab[i].ID_livre = i + 1;
        memset(ligneTab[i].titre_livre, 0, 50); // créé une ligne du tableau pour les livres ( livres )
    }
}

void Tab_locations()
{
    int i;
    for(i=1;i<=c_locations;i++) // va tourner 1 seule fois
    {
        ligneTab[i].ID_resultat = i + 1;
        memset(ligneTab[i].resultat, 0, 100); // crée une ligne pour le prêt d'un livre
    }

}

void showTab_membres()
{
    int i;
    for(i=1; i<=c_membres; i++)
    {
        if(ligneTab[i].nom[0] == 0  ) // si le premier caractère de nom est nul c'est qu'il n'y a pas de nom encodé
        {
            printf("Pas de nom -"); // Affiche à l'écran qu'il n'y a pas de nom
        }

        else
        {
            printf("Test %s -",ligneTab[i].nom); // Sinon, affiche les noms
        }
    }
printf("\n");

    for(i=1; i<=c_membres; i++)
    {
        if(ligneTab[i].prenom[0] == 0)
        {
            printf("Pas de prenom -"); // Affiche à l'écran qu'il n'y a pas de prenom
        }

        else
        {
            printf("Test %s -",ligneTab[i].nom); // Sinon, affiche les prenoms
        }

    }
printf("\n");


    for(i=1; i<=c_membres; i++)
    {
        if(ligneTab[i].CP_ville == 0)
        {
            printf("Pas de CP -"); // Affiche à l'écran qu'il n'y a pas de Code Postal
        }

        else
        {
            printf("Test %s -",ligneTab[i].CP_ville); // Sinon, affiche les CP
        }
    }
}

void showTab_livres()
{
    int i;
    for(i=1; i<=c_livres; i++)
    {
        if(ligneTab[i].titre_livre[0] == 0)
        {
            printf("Pas de livre -"); // Affiche à l'écran qu'il n'y a pas de livres
        }

        else
        {
            printf("Test %s -",ligneTab[i].titre_livre); // Sinon, affiche les CP
        }
    }
}

void showTab_locations()
{
    int i;
    for(i=1; i<=c_locations; i++)
    {
        if(ligneTab[i].resultat[0] == 0)
        {
            printf("Pas de location -"); // Affiche à l'écran qu'il n'y a pas de livres
        }

        else
        {
            printf("%s -",ligneTab[i].resultat); // Sinon, affiche les CP
        }
    }
}

void save()
{
    //----------------------- Membres ---------------------------//

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

    //------------------ Livres ---------------------------------//

    int j;
    FILE *F_livres = NULL; //initialisé sur NULL pour être certain qu'il n'y ai pas d'erreur, c'est + sûr
    F_livres = fopen("livres.txt", "w");
    if(F_livres != NULL)
    {
        for(j=0;j<c_livres;j++)
        {
            fprintf(F_livres,"%d %s\n",ligneTab[j].ID_livre,ligneTab[j].titre_livre);
        }
    }
    fclose(F_livres);

    //------------------ Location -------------------------------//

    int k;
    FILE *F_locations = NULL; //initialisé sur NULL pour être certain qu'il n'y ai pas d'erreur, c'est + sûr
    F_locations = fopen("locations.txt", "w");
    if(F_locations != NULL)
    {
        for(k=0;k<c_locations;k++)
        {
            fprintf(F_locations,"%d %s\n",ligneTab[k].ID_resultat,ligneTab[k].resultat);
        }
    }
    fclose(F_locations);
}

void lire_Save()
{
    //------------------- Membres -----------------------//
    int i;
    FILE *F_membres = NULL; //initialisé sur NULL pour être certain qu'il n'y ai pas d'erreur, c'est + sûr
    F_membres = fopen("membres.txt", "r");
    if(F_membres != NULL)
    {
        for(i=0;i<c_membres;i++)
        {
            fscanf(F_membres,"%d %s %s %d\n",&ligneTab[i].ID_membre,&ligneTab[i].nom,&ligneTab[i].prenom,&ligneTab[i].CP_ville);
        }
    }
    else
    {
        printf("Le fichier membres.txt ne s'est pas ouvert");
    }

        fclose(F_membres);

    //------------------- Livres -----------------------//
    int j;
    FILE *F_livres = NULL; //initialisé sur NULL pour être certain qu'il n'y ai pas d'erreur, c'est + sûr
    F_livres = fopen("livres.txt", "r");
    if(F_livres != NULL)
    {
        for(j=0;j<c_livres;j++)
        {
            fscanf(F_livres,"%d %s\n",&ligneTab[i].ID_livre,&ligneTab[i].titre_livre);
        }
    }
    else
    {
        printf("Le fichier livres.txt ne s'est pas ouvert");
    }
    fclose(F_livres);

    //------------------- Locations -----------------------//
    int k;
    FILE *F_locations = NULL; //initialisé sur NULL pour être certain qu'il n'y ai pas d'erreur, c'est + sûr
    F_locations = fopen("locations.txt", "r");
    if(F_locations != NULL)
    {
        for(k=0;k<c_locations;k++)
        {
            fscanf(F_locations,"%d %s\n",&ligneTab[k].ID_resultat,&ligneTab[k].resultat);
        }
        fclose(F_locations);
    }
    else
    {
        printf("Le fichier locations.txt ne s'est pas ouvert");
    }

fclose(F_locations);

}

Déclarations :

int c_membres=0;
int c_livres=0;
int c_locations=0;




  • Partager sur Facebook
  • Partager sur Twitter
25 mai 2017 à 15:03:15

Tu devrait faire plusieurs tableuax différent Et je reste persuade que les pointeurs sont la soluiton.

Genre:

typedef struct {
    int id;
} Membre;

int main(void) {
	Membre* tab_m = NULL;
	int nb_m = 0;
	add(&tab_m, &nb_m);
	printf("%d", tab_m[0].id);
	return 0;
}

void add(Membre** tab, int* nb){
	(*nb)++;
	*tab = realloc(*tab, (*nb) * sizeof(Membre));
	(*tab)[(*nb) - 1].id = *nb;
}


Et tu fais la meme chose pour les livres et pour les locations.

Avec trois structures différentes donc trois tableaux.

  • Partager sur Facebook
  • Partager sur Twitter
25 mai 2017 à 15:11:57

Ne JAMAIS écrire un appel à réalloc comme ça. Tu n'as aucune garantie que ça réussisse, c'est déjà vrai avec malloc, ça l'est encore plus avec realloc.

int* p;

// assume : p points to an allocated memory block

int* rp ;

if( (rp = realloc(p, size)) == NULL ){
  //p  is still valid
  //rp is NULL
} else {
  //p is not necessarily valid anymore
  //rp points to an allocated memory block of size "size"
}

-
Edité par Ksass`Peuk 25 mai 2017 à 15:12:12

  • Partager sur Facebook
  • Partager sur Twitter

Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

25 mai 2017 à 15:28:06

Et plutôt que d’utiliser realloc en rajoutant un éléments à la fois, ce serait mieux de rajouter plusieurs blocs d’un coup. Sinon, implémenter une structure de liste fait aussi le travail.

  • Partager sur Facebook
  • Partager sur Twitter
Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
25 mai 2017 à 15:33:39

yo@n97one a écrit:

Et plutôt que d’utiliser realloc en rajoutant un éléments à la fois, ce serait mieux de rajouter plusieurs blocs d’un coup.

Un bon parti pris c'est de faire fois 2 en taille jusqu'à atteindre une taille vraiment élevée.

  • Partager sur Facebook
  • Partager sur Twitter

Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

25 mai 2017 à 15:47:30

Thetui : Je ne comprends pas pourquoi est-ce que tu me dis de faire plusieurs tableaux, j'en ai déja un pour les membres, un pour les livres et un pour les location. :) Je ne comprends d'ailleurs toujours pas pourquoi utiliser des pointeurs car si je définis mon compteur en variable globale, pas besoin de le passer en arguments et tout ça

De plus, je t'avoue ne pas comprendre ces ligne-ci car je ne connais pas la fonction realloc et la fonction sizeof :

void add(Membre** tab, int* nb){
    (*nb)++;
    *tab = realloc(*tab, (*nb) * sizeof(Membre));
    (*tab)[(*nb) - 1].id = *nb;



  • Partager sur Facebook
  • Partager sur Twitter
25 mai 2017 à 16:59:13

C'est pour l'allocation manuelle de la mémoire, et concernant les tableaux je te conseille de définir trois structure différentes, puis de faire trois tableaux(un de membre, un de livre, un de location).

Apres si tu preferes ta méthode tu fais comme tu veux mais il me semblait que tu n'avais qu'un seul tableau.

Merci de reposter le code où tu déclare tes tableaux.

J 'ai comme l'impression que tu comprends pas très bien ce que tu fais

-
Edité par thetui 25 mai 2017 à 17:00:40

  • Partager sur Facebook
  • Partager sur Twitter
25 mai 2017 à 21:25:14

Franchement je trouve ma métghode très bien. Mais je ne critique en rien la tienne hein elle est même sûrement mieux que la mienne ;)

Voici le code :

void Tab_membres()
{
    int i;
    for(i=1;i<=c_membres;i++) // va tourner 1 seule fois
    {
        ligneTab[i].ID_membre = i + 1;
        ligneTab[i].CP_ville = 0; // initialise la variable de 0 à 14
        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 )
    }
}

void Tab_livres()
{
    int i;
    for(i=1;i<=c_livres;i++) // va tourner 1 seule fois
    {
        ligneTab[i].ID_livre = i + 1;
        memset(ligneTab[i].titre_livre, 0, 50); // créé une ligne du tableau pour les livres ( livres )
    }
}

void Tab_locations()
{
    int i;
    for(i=1;i<=c_locations;i++) // va tourner 1 seule fois
    {
        ligneTab[i].ID_resultat = i + 1;
        memset(ligneTab[i].resultat, 0, 100); // crée une ligne pour le prêt d'un livre
    }

}

Et lorsque j'affiche les tableaux :

void showTab_membres()
{
    int i;
    for(i=1; i<=c_membres; i++)
    {
        if(ligneTab[i].nom[0] == 0  ) // si le premier caractère de nom est nul c'est qu'il n'y a pas de nom encodé
        {
            printf("Pas de nom -"); // Affiche à l'écran qu'il n'y a pas de nom
        }

        else
        {
            printf("Test %s -",ligneTab[i].nom); // Sinon, affiche les noms
        }
    }
printf("\n");

    for(i=1; i<=c_membres; i++)
    {
        if(ligneTab[i].prenom[0] == 0)
        {
            printf("Pas de prenom -"); // Affiche à l'écran qu'il n'y a pas de prenom
        }

        else
        {
            printf("Test %s -",ligneTab[i].nom); // Sinon, affiche les prenoms
        }

    }
printf("\n");


    for(i=1; i<=c_membres; i++)
    {
        if(ligneTab[i].CP_ville == 0)
        {
            printf("Pas de CP -"); // Affiche à l'écran qu'il n'y a pas de Code Postal
        }

        else
        {
            printf("Test %s -",ligneTab[i].CP_ville); // Sinon, affiche les CP
        }
    }
}

void showTab_livres()
{
    int i;
    for(i=1; i<=c_livres; i++)
    {
        if(ligneTab[i].titre_livre[0] == 0)
        {
            printf("Pas de livre -"); // Affiche à l'écran qu'il n'y a pas de livres
        }

        else
        {
            printf("Test %s -",ligneTab[i].titre_livre); // Sinon, affiche les CP
        }
    }
}

void showTab_locations()
{
    int i;
    for(i=1; i<=c_locations; i++)
    {
        if(ligneTab[i].resultat[0] == 0)
        {
            printf("Pas de location -"); // Affiche à l'écran qu'il n'y a pas de livres
        }

        else
        {
            printf("%s -",ligneTab[i].resultat); // Sinon, affiche les CP
        }
    }
}

Oui c'est pas faux je ne comprends pas tout tout mais franchement ça va encore je trouve

J'ai finalement utilisé des pointeurs mais j'ai des problemes avec ceux-ci, j'utilise des compteur pour des boucles, voici les codes ( pour les membres ) :

Déclaration :

int c_membres=0;
int *p_membres;
p_membres=&c_membres;

switch(choix)
{
case 'M':
gerer_membres(p_membres); //pour ajouter des membres
system("pause");
break;


Ajouter des membres :

void gerer_membres(int *p_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);
        fflush(stdin);
        printf("\n");

        switch (choix)
        {
        case 'A':

            do{

                printf("Combien de membres a rajouter ? ");
                scanf("%d", &i);
                fflush(stdin);

            }while((i<0) || (i>MAX_MEMBERS-1));

            for (j=0;j<i;j++)
                {
                    p_membres++; // * pour dire la valeur
                    printf("%d",p_membres);
                    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);
                }
                break;

        }

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

Initialisation du tableau de membres :

void Tab_membres(int *p_membres)
{
    int i;
    for(i=1;i<=*p_membres;i++) // va tourner 1 seule fois
    {
        ligneTab[i].ID_membre = i + 1;
        ligneTab[i].CP_ville = 0; // initialise la variable de 0 à 14
        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 )
    }
}

Ecriture des informations du tableau des membres dans un fichier :

void save(int *p_locations, int *p_livres,int *p_membres)
{
    //----------------------- Membres ---------------------------//

    int i;
    FILE *F_membres = NULL; //initialisé sur NULL pour être certain qu'il n'y ai pas d'erreur, c'est + sûr
    F_membres = fopen("membres.txt", "a");
    if(F_membres != NULL)
    {
        for(i=0;i<*p_membres;i++)
        {
            fprintf(F_membres,"%d %s %s %d\n",ligneTab[i].ID_membre,ligneTab[i].nom,ligneTab[i].prenom,ligneTab[i].CP_ville);
        }
        printf("\n"); // passer à la ligne pour le prochain enregistrement
    }
    fclose(F_membres);

Des erreurs de pointeurs à me communiquer ?





-
Edité par williamvh7 26 mai 2017 à 15:10:18

  • Partager sur Facebook
  • Partager sur Twitter
28 mai 2017 à 14:54:44

Je pense que personne n'a vu le message :/
  • Partager sur Facebook
  • Partager sur Twitter
28 mai 2017 à 22:19:57

Si, si. Tu attendais une réponse ? Tu as dit que tu avais des problèmes de pointeurs, mais tu n'as pas dit lesquels, ce qui suggère que tu comptais les résoudre tout seul, d'autant que la date limite approchait. Ensuite tu as demandé « des erreurs de pointeur à me communiquer ? » : seuls ceux qui ont envie de faire le débogage à ta place auraient répondu. Tu aurais peut-être dû poser des questions précises, comme tu l'avais d'ailleurs fait jusqu'ici. Quoi qu'il en soit, j'espère que tu as pu terminer ce projet et que, malgré les difficultés, ça t'a plu !

  • Partager sur Facebook
  • Partager sur Twitter
29 mai 2017 à 17:25:32

Oui je comprends! J'ai de la chance, mon professeur à reporter l'échéance à ce vendredi-ci et malgré les problèmes (nombreux ) que je rencontre, j'aime programmer ( meme si ça n'en donne pas l'air ).

Le problème plus précisément est que lorsque j'ajoute un membre, je fais p_membre++; aprés cela je fais un printf pour vérifier sa valeur et cela m'affiche une adresse, je ne comprends pas pourquoi. Du coup l'ecriture dans les fichiers ne marchent pas non plus et je suppose que c'est parce que j'utilise mal mes pointeurs...

Des idéées de debogage ?

  • Partager sur Facebook
  • Partager sur Twitter
30 mai 2017 à 9:05:44

Si p_membres est un pointeur, p_membres++ aura un comportement indeterminé. Pour accéder à sa valeur il faut le déréférencer cad mettre une etoile (*).

Donc ca donne (*p_membres)++ .

  • Partager sur Facebook
  • Partager sur Twitter
30 mai 2017 à 10:02:40

Oui je m'en suis rendu compte mais je fais d'une autre manière bien plus simple pour finir :

    int c_membres=0;
    int c_livres=0;
    int c_locations=0;

    Tab_membres(&c_membres);

Je les déclare simplement comme ceci dans le main

void gerer_membres(int *c_membres)
{
int i,j;
for (j=0;j<i;j++)
                {
                    *c_membres=0;
                    *c_membres+=1; // * pour dire la valeur
                    printf("%d",*c_membres);
                    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);
                }

Et je les utilise comme ceci.

Par contre je n'arrive toujours pas è écrire les éléments dans le fichier membre.txt

Voici le code de l'écriture :

void save(int *c_locations, int *c_livres,int *c_membres)
{
    //----------------------- Membres ---------------------------//

    int i;
    FILE *F_membres = NULL; //initialisé sur NULL pour être certain qu'il n'y ai pas d'erreur, c'est + sûr
    F_membres = fopen("membres.txt", "a");
    if(F_membres != NULL)
    {
        for(i=0;i<*c_membres;i++)
        {
            fprintf(F_membres,"%d %s %s %d\n",ligneTab[i].ID_membre,ligneTab[i].nom,ligneTab[i].prenom,ligneTab[i].CP_ville);
        }
        printf("\n"); // passer à la ligne pour le prochain enregistrement
    }
    fclose(F_membres);
}





-
Edité par williamvh7 30 mai 2017 à 10:08:35

  • Partager sur Facebook
  • Partager sur Twitter