IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Exercice Organisation séquentielle Logique (chaînée)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2011
    Messages : 2
    Par défaut Exercice Organisation séquentielle Logique (chaînée)
    Bonjour à tous, j'ai un problème dans un de mes programmes.
    Je suis étudiant en informatique et je doit réaliser l'exercice suivant.
    Encoder le Nom et le Prénom d'ouvrier et les stocker dans un fichier.
    Il faut trier l'affichage dans l'ordre Alphabétique et le fichier doit être organiser de manière séquentielle logique, donc je dois créer un algorithme de chaînage.
    Je suis parvenus à commencé cet algorithme mais je suis bloqué et je ne vois pas comment réaliser les opérations qu'il me manques.
    Mon problème survient dans la fonction "Chainage" , je ne cherche pas à avoir la solution de fin du code, j'aimerais juste qu'on m'aiguille vers les opération à effectuer.
    Merci d'avance.

    Voici le code de mon programme, je n'ai pas encore mis le Header des fonctions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    #include<stdio.h>
    #include<windows.h>
    #include<conio.h>
     
    void Remplir(struct contact[] , int, long*);
    void Display(struct contact*, int);
    void Chainage(struct contact[], long*, int);
     
    struct contact
    {
    	char Nom[20];
    	char Prenom[20];
    	long svt;
    };
     
    void main()
    {
    	long pto=-1;
    	int choix, nbf=0;
    	int quit=0;
    	char confirm;
    	struct contact fiche[100];
     
    	do
    	{
    		do
    		{
    			printf("\nMenu du programme");
    			printf("\n-----------------");
     
    			printf("\nAppuyer sur 1 pour ajouter une fiche contact");
    			printf("\nAppuyer sur 2 pour afficher la liste des contact");
    			printf("\nAppuyer sur 3 pour supprimer le fichier[Contact.dat]");
    			printf("\nAppuyer sur 4 pour quitter l'application");
    			printf("\nVotre choix: ");
    			fflush(stdin);
    			scanf("%d",&choix);
    			if(choix<1||choix>4)
    				printf("\nErreur de saisie!");
    		}while(choix<1||choix>4);
     
    		switch (choix)
    		{
    		case 1:
     
    			printf("\nAjout d'un ouvrier");
    			printf("\n------------------");
    			Remplir(fiche, nbf,&pto);
    			nbf++;
    			break;
    		case 2:
    			printf("\nAffichage des fiches");
    			printf("\n--------------------");
     
    			Display(&fiche[0], nbf);
    			system("pause");
    			break;
    		case 3:
    			do
    			{
    				printf("\nEtes-vous sur de vouloir supprimer le fichie ?(o/n): ");
    				fflush(stdin);
    				scanf("%c",&confirm);
    				if(confirm!='o'&& confirm!='n')
    					printf("\nErreur de saisie!");
    			}while(confirm!='o'&& confirm!='n');
     
    			switch (confirm)
    			{
    			case ('o'):
    				remove("contact.dat");
    				printf("\nFichier supprime");
    				break;
    			case ('n'):
    				printf("\nSuppression annulee");
    				break;
    			}
    			break;
    		case 4:
    			printf("\nAu revoir");
    			quit=1;
    			break;
    		}
    	}while(quit!=1);
    }
     
    void Remplir(struct contact fiche[], int nb, long *pto)
    {
    	FILE *fp;
    	fp=fopen("contact.dat","ab");
     
    	fwrite(pto,sizeof(long),1,fp);
    	printf("\nEntrez le nom du contact: ");
    	fflush(stdin);
    	fgets(fiche[nb].Nom,20,stdin);
     
    	printf("\nEntrez le prenom du contact: ");
    	fflush(stdin);
    	fgets(fiche[nb].Prenom,20,stdin);
     
    	Chainage(fiche, pto, nb);
    	fclose(fp);
    }
     
    void Display(struct contact *pf, int nb)
    {
    	int i=0;
    	int out;
    	int dep=0;
    	int exist=0;
    	FILE *fp;
    	fp=fopen("contact.dat","rb");
     
     
    	if(fp==((FILE *)NULL))
    	{
    		printf("\nErreur d'ouverture du fichier");
    		printf("\nFichier inexistant!");
    		exist=1;
    	}
    	out=0;
    	fseek(fp,sizeof(long),SEEK_SET);
    	fread(pf,sizeof(struct contact),1,fp);
    	printf("\nNom: %s",pf->Nom);
    	printf("\nPrenom: %s",pf->Prenom);
    	printf("\nSvt: %ld\n",pf->svt);
    	fclose(fp);
    }
     
    void Chainage(struct contact fiche[], long *pto,int nbo)
    {
    	int valid=0;
    	FILE *fp;
    	fp=fopen("contact.dat","w+b");
    	struct contact *prec;
     
    	if(*pto==-1)
    	{
    		fiche[0].svt=-1;
    		fseek(fp,2*sizeof(long),SEEK_SET);
    		fwrite(&fiche[0],sizeof(struct contact),1,fp);
    		*pto=0;
    	}
    	else
    	{
    		fseek(fp,2*sizeof(long)+*pto*sizeof(struct contact),SEEK_SET);
    		fread(prec,sizeof(struct contact),1,fp);
     
    		while(*prec!=-1);
    		{
     
    		}
    	}
    	rewind(fp);
    	fwrite(pto,sizeof(long),1,fp);
    	fclose(fp);
    }

  2. #2
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Bonjour

    quelques remarques (pour commencer, et dans le désordre)

    1 - tarte à la crème : l'indentation est supposée être une aide, pas un obstacle. Bannis les caractères tabulation (j'ai écrit caractère, pas touche TAB (bien configurée dans ton éditeur pour qu'elle produise des caractères espace))

    2 - toujours sur la lisibilité : débarrasse ton code de toutes les variables locales inutiles voire jamais utilisées : i, out, dep, exist dans Display par exemple. Tu y verras plus clair et nous aussi. Les déclarations de variables locales à un bloc dans le bloc (et pas en début de fonction) sont pratiques et plus lisibles aussi.

    3 - commence par remplir "fiche" avec ce qui existe déjà (ou pas) dans contact.dat sinon ton chainage ... ne serait-ce que parce que tu vas démarrer avec un nombre de fiches nul ce qui n'est pas forcément le cas

    4 - limite aussi tes ouvertures de (du même) fichier et fais attention à ce que tu fais : dans Remplir, tu l'ouvres en mode "ab", dans la même fonction, alors que le fichier est encore ouvert, tu appelles Chainage qui ... l'ouvre en mode "w+b". Certes tes 2 variables fp dans les 2 fonctions n'ont rien à voir entre elles mais elles correspondent au même fichier (disque) ouvert en écriture/append : casse-cou !

    C'est sur qu'on peut ouvrir plusieurs fois un même fichier mais quand c'est simultané, en écriture/append, ça part vite en vrille...

    Essaye de plus séparer ton cycle de travail (saisie, ajout, chainage) et les entrées-sorties sur contact.dat :

    1 - charge ton fichier (s'il existe) et referme le
    2 - lance ton cycle de saisie et travaille sur fiche (et pas sur le fichier)
    3 - quand tu quittes, met à jour ton fichier avec les modifications (ajouts) faites précédemment

    5 - sois aussi plus explicite sur ce que tu veux faire. Je suppose que le champ svt signifie "suivant" et va te permettre de garder tes fiches dans l'ordre alphabétique sans avoir à trier effectivement tes fiches (donc tes "enregistrements" dans contact.dat) : c'est ça ?

    6 - des commentaires (courts) sur la signification de certaines variables ne seraient pas de trop

    Globalement, faut revoir ton découpage en différentes fonctions (et peaufiner les arguments que tu passes ou pas (voir "nb" dans Display)) parce que là ça part un peu dans tous les sens.

  3. #3
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Voici quelques remarques sans y avoir regardé de trop prêt:

    • main() retourne un entier de type int
    • fflush() sur un flux entrant engendre un comportement indéfini
    • utiliser fwrite() pour enregistrer une structure dans un fichier, c'est sale et pas très portable. Il te faut sérialiser manuellement tes données ou utiliser un format texte. La méthode que je recommande est de sauver dans un fichier texte. Si tu veux un fichier binaire, tu peux éventuellement le compresser après.
    • Les saisies utilisateur ne sont pas très robustes


    Avec mes meilleures salutations

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2011
    Messages : 2
    Par défaut
    @Thierry Chappuis:

    Pour le MAIN ,les professeur nous on donné l'habitude de travailler uniquement sur VOID.

    Pour le fflush c 'est la consigne du professeur pour vider les buffer.
    Le fwrite est l'unique fonction d'écriture vue en cours donc je dois uniquement utiliser celle-là.

    Je n'ai blindé aucune saisie car le but de l'exercice est de développer son algorithme de chainage.

    Merci plxpy je vais essayer de modifier avec tes conseils et voir ce que ça donne.

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Pour le MAIN ,les professeur nous on donné l'habitude de travailler uniquement sur VOID.

    Pour le fflush c 'est la consigne du professeur pour vider les buffer.
    Il faudra alors dire aux profs qu'ils conseillent de mauvaises choses à leurs élèves.

    Voici ce que dit la norme C90, concernant main :

    5.1.2.2.1 Program startup
    The function called at propram startup is named main. The implementation declares no
    prototype for this function. It can be detined with no parameters

    int main(void) { /*...*/ }

    or with two parameters (referred to here as argc and argv, though any names may be used, as
    they are local to the function in which they are declared)

    int main(int argc, char *argv[]) { /* . . . */ }
    Et concernant fflush :

    7.9.5.2 The fflush function

    Synopsis

    #include <stdio.h>
    int fflush(FILE *stream);

    Description

    If stream points to an output stream or an update stream in which the most recent operation
    was not input, the fflush function causes any unwritten data for that stream to be delivered to
    the host environment to be written to the file ; otherwise, the behavior is undefined.
    G.2 Undefined behavior
    The behavior in the following circumstances is undefined:

    (...)

    - The stream for the fflush function points to an input stream or to an update stream in which the
    most recent operation was input (7.9.5.2).

  6. #6
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par Hunter0014 Voir le message
    @Thierry Chappuis:

    Pour le MAIN ,les professeur nous on donné l'habitude de travailler uniquement sur VOID.

    Pour le fflush c 'est la consigne du professeur pour vider les buffer.
    Le fwrite est l'unique fonction d'écriture vue en cours donc je dois uniquement utiliser celle-là.

    Je n'ai blindé aucune saisie car le but de l'exercice est de développer son algorithme de chainage.

    Merci plxpy je vais essayer de modifier avec tes conseils et voir ce que ça donne.
    Comme je le répète sans cesse à mes étudiants, ne faites confiance à personne, surtout pas à votre professeur... En ce qui concerne le langage C, s'il y a un doute, le document de référence se trouve ici. Les paragraphes cités par jeroman font autorités au sujet des points cités plus haut. Parle-en à ton professeur, et modifie le prototype que tu utilises pour main().

    Pour vider le tampon du flux d'entrée standard, utilise une fonction comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    m_flush_istream(FILE *fp)
    {
        if (fp != NULL)
        {
            int c;
     
            while ((c =fgetc(fp)) != '\n' && c != EOF)
            {
            }
        }
    }
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

Discussions similaires

  1. Exercice fichiers séquentiels.
    Par tonykart13 dans le forum Général Python
    Réponses: 11
    Dernier message: 03/10/2011, 09h52
  2. [Turbo Pascal] Exercice sur une chaîne de caractères
    Par mah00 dans le forum Turbo Pascal
    Réponses: 35
    Dernier message: 10/01/2010, 13h47
  3. [Turbo Pascal] Exercice fichier séquentiel
    Par agan2012 dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 07/07/2009, 14h10
  4. [TP] Chaîne de caractères (exercice)
    Par The future scientist dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 05/05/2007, 12h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo