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 :

Problème de conditions


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 176
    Points : 99
    Points
    99
    Par défaut Problème de conditions
    Bonjour,

    j'ai fait une fonction qui extrait le maillon d'une liste chainée sur base d'un nom.
    Elle fonctionne très bien si le nom est rentré correctement en Majuscule ou minuscule.
    J'aimerai bien ajouter une condition qui afficherai "Etudiant inconnu" s'il ne trouve pas le nom dans la liste ou si on fait une faute de frappe dans le nom.
    Problème, mon programme ci-dessous plante s'il ne trouve pas le nom ou s'il y a une erreur de frappe.

    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
     
    Etudiant *ExtractElt(Etudiant **tete, char nomEtu[])
    {
        Etudiant *EltCourant,*prec;
        if(*tete != NULL)//Si la liste n'est pas vide
        {
            if(stricmp((*tete)->nom, nomEtu) == 0)// si Elt chercher est premier de la liste
            {
            EltCourant = *tete;
            *tete = (*tete)->next;
            return EltCourant;
            }
            if(stricmp((*tete)->nom, nomEtu) > 0)
            {
                printf("Etudiant inconnu!");
            }
            else// sinon c'est peut-être un des autres
            {
                prec = *tete;
                EltCourant = (*tete)->next;
                while(EltCourant != NULL )
                {
                    if (stricmp(EltCourant->nom, nomEtu) == 0)
                    {
                        prec->next = EltCourant->next;
                        return EltCourant;
                    }
                prec = EltCourant;
                EltCourant = EltCourant->next;
                }
            }
        }
        return EltCourant;
    }

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Tu n'opères pas le même traitement selon le rang du nœud puisque tu gères la tête de liste comme un cas particulier, alors que ce n'est pas nécessaire.

    As-tu posé ton algorithme sur papier avant de te lancer dans l'implémentation C ? As-tu préalablement résolu une partie du problème, à savoir écrit une fonction de simple recherche, qui ne modifie pas ses entrées ?

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 176
    Points : 99
    Points
    99
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    Tu n'opères pas le même traitement selon le rang du nœud puisque tu gères la tête de liste comme un cas particulier, alors que ce n'est pas nécessaire.

    As-tu posé ton algorithme sur papier avant de te lancer dans l'implémentation C ? As-tu préalablement résolu une partie du problème, à savoir écrit une fonction de simple recherche, qui ne modifie pas ses entrées ?
    Si c'est la tête qui est extraite, ça change par rapport au reste de la liste, non? Il ne faut faire pointer la tête de liste sur le suivant, non?

    Je dois dire que je n'ai pas posé ça sur papier, et pas fait de fonction recherche. A la base il me falait une fonction qui extrait un maillon d'une liste pour l'introduire dans une autre liste. C'est le but premier de cette fonction.

    Pour rechercher un élément, je ferai comme ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Etudiant *rechercherElement(Etudiant *tete, char nomEtu[])
    {
        Etudiant *Elt = tete;
        while(Elt != NULL)//Tant que l'on n'est pas au bout de la liste
        {
            if(Elt->nom == nomEtu)
            {
                return Elt;/* Si l'élément a la valeur recherchée, on renvoie son adresse */
            }
            Elt = Elt->next;
        }
        return NULL;
    }

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Cisman Voir le message
    J'aimerai bien ajouter une condition qui afficherai "Etudiant inconnu" s'il ne trouve pas le nom dans la liste ou si on fait une faute de frappe dans le nom.
    Problème, mon programme ci-dessous plante s'il ne trouve pas le nom ou s'il y a une erreur de frappe.
    Bonjour

    Parce que ta fonction retourne dans tous les cas "EltCourant" ce qui sous-entend qu'elle trouve tout le temps un noeud correspondant. Or, il faut lui faire renvoyer une valeur spéciale quand elle ne trouve pas.
    De plus tu lui fais afficher un message. Or il vaut mieux séparer "traitement" de "affichage". Si une fonction doit chercher alors elle cherche mais elle n'affiche rien. Si une fonction doit afficher alors elle affiche mais elle ne fait pas de recherche. Bref chacun sa place quoi.

    Et puis sans déconner c'est quoi cette fonction où il y en a dans tous les sens ? Je t'avais pourtant donné des exemples simples de recherche dans une liste. Tu aurais pu t'en inspirer !!!

    Code c : 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
    Etudiant *ExtractElt(Etudiant **tete, char *nomEtu) {
    	// Si liste vide
    	if (*tete == NULL) return NULL;
     
    	Etudiant *avant;
    	Etudiant *apres;
     
    	// Positionnement pointeurs avant et après
    	for (avant=NULL, apres=(*tete); apres != NULL && stricmp(apres->nom, nomEtu) != 0; avant=apres, apres=apres->next);
     
    	// Si on n'a pas de "apres"
    	if (apres == NULL)
    		// On n'a pas trouvé
    		return NULL;
     
    	// Si on n'a pas de "avant"
    	if (avant == NULL)
    		// L'étudiant trouvé est en début de liste
    		(*tete)=apres->next;
    	else
    		// L'étudiant trouvé est supprimé du chainage
    		avant->next=apres->next;
     
    	// On renvoie l'étudiant trouvé
    	return apres;
    }

    C'est pas plus élégant ainsi ? Et plus évolutif ??? Si par exemple tu veux que ta fonction ne supprime l'étudiant trouvé que sur demande de l'appelant...
    Code c : 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
    Etudiant *ExtractElt(Etudiant **tete, char *nomEtu, int delete) {
    	// Si liste vide
    	if (*tete == NULL) return NULL;
     
    	Etudiant *avant;
    	Etudiant *apres;
     
    	// Positionnement pointeurs avant et après
    	for (avant=NULL, apres=(*tete); apres != NULL && stricmp(apres->nom, nomEtu) != 0; avant=apres, apres=apres->next);
     
    	// Si on n'a pas de "apres"
    	if (apres == NULL)
    		// On n'a pas trouvé
    		return NULL;
     
    	// Si on demande la suppression de l'étudiant trouvé
    	if (delete) {
    		// Si on n'a pas de "avant"
    		if (avant == NULL)
    			// L'étudiant trouvé est en début de liste
    			(*tete)=apres->next;
    		else
    			// L'étudiant trouvé est supprimé du chainage
    			avant->next=apres->next;
    	}
     
    	// On renvoie l'étudiant trouvé
    	return apres;
    }


    Citation Envoyé par Cisman Voir le message
    Pour rechercher un élément, je ferai comme ça.

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Etudiant *rechercherElement(Etudiant *tete, char nomEtu[])
    {
        Etudiant *Elt = tete;
        while(Elt != NULL)//Tant que l'on n'est pas au bout de la liste
        {
            if(Elt->nom == nomEtu)
            {
                return Elt;/* Si l'élément a la valeur recherchée, on renvoie son adresse */
            }
            Elt = Elt->next;
        }
        return NULL;
    }
    Ouais, super. En comparant if(Elt->nom == nomEtu) tu ne fais que comparer deux adresses...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. [débutant] problème de condition dans une requete
    Par banker dans le forum Access
    Réponses: 5
    Dernier message: 22/03/2006, 13h52
  2. Réponses: 7
    Dernier message: 27/02/2006, 18h04
  3. [Debutant]Problème de condition
    Par ghan77 dans le forum Langage
    Réponses: 9
    Dernier message: 13/12/2005, 15h20
  4. Problème de condition, je flanche..
    Par KibitO dans le forum Langage
    Réponses: 13
    Dernier message: 11/11/2005, 12h57
  5. Réponses: 6
    Dernier message: 17/08/2005, 12h38

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