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 :

Erreur dans un switch


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Par défaut Erreur dans un switch
    Bonjour,
    Mon problème est que lorsque j'exécute mon code tout se passe comme si le choix était déja en mémoire (?!).
    Le switch s'exécute entièrement.
    Peut on m'aider à résoudre se problème, svp?
    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
    /* le tri  strohecker guillaume */
     
    #include <stdio.h>
    #include <stdlib.h>
    #define NB_MAXI_ELEMENT 10000
     
    /* fonction echange */
     
    void Echange(int *Tablo, int i, int j){
    	int temp;
    	temp = Tablo[i];
    	Tablo[i] = Tablo[j];
    	Tablo[j] = temp;
    }
     
    /* algorithme de tri par sélection */
     
    static void TriSelection(int *T, int taille){
    	int k, i, imax;
    	k = taille - 1;
    	while (k > 0){
    		/* recherche de l'indice maximum */
    		imax = 0;
    		for (i = 1; i <= k; i++){
    			if (T[imax] < T[i]){
    				imax = i;
    			}
    		}
    		/* echange */
    		Echange(T, k, imax);
    		k--;
    	}
    }
     
    /* Algorithme de tri à bulle */
     
    static void TriBulle(int *T, int taille){
    	int i, k;
    	k = taille - 1;
    	/* pour chaque passe */
    	while(k > 0){
    		/* on fait remonter le plus grand */
    		for (i = 1; i <= k; i++){
    			if (T[i] < T[i-1]){
    				/* échange de T[i-1] et T[i] */
    				Echange(T, i, i-1);
    			}
    		}
    		k--;
    	}
    }
     
    /* Algorithme de tri par insertion */
     
    static void TriInsertion(int *T, int taille){
    	int k, i, v;
    	for( k = 1; k < taille; k++)
    	{
    		v = T[k];
    		i = k - 1;
    	/* on décale les éléments pour l'insertion */
    		while(( i>= 0) && ( v <T[i]))
    		{
    		T[i+1] = T[i];
    		i--;
    		}
    	/* insertion */
    	T[i+1] = v;
    	}
    }
     
    /* fonction de saisie de tableau */
     
    int SaisieTableau(int tableau[NB_MAXI_ELEMENT]){
    	int taille, i;
    	puts("Saisir la taille de votre tableau : ");
    	scanf("%d", &taille);
    	if(taille > NB_MAXI_ELEMENT){
    		puts("Erreur : Le tableau est trop petit");
    		exit(1);
    	}
    	puts("Saisir les valeurs de votre tableau : ");
    	for(i = 0; i < taille; i++)
    		scanf("%d", &tableau[i]);
    	return taille;
    }
     
    /* fonction d'affichage */
     
    void AffichageTableau(int tableau[], int taille){
    	int i;
    	for(i = 0; i < taille; i++)
    		printf("L'element numero %d vaut %d\n", i, tableau[i]);
    }
     
     
    /* Fonction de choix */
     
    void FaitesVotreChoix(int tableau[], int taille){
    	char choix ;
    	puts("Faites votre choix :");
    	puts("Un tri par selection -----> a");
    	puts("Un tri a bulle -----------> b");
    	puts("Un tri par insertion -----> c");
    	puts("Quitter ------------------> d");
    	choix = (char) getchar();
    	switch(choix){
    	case'a' : 
    		puts("Avant le tri:");
    		AffichageTableau(tableau, taille);
    		puts("Après le tri:");
    		AffichageTableau(tableau, taille);
    		break;
    	case'b' : 
    		puts("Avant le tri:");
    		AffichageTableau(tableau, taille);
    		puts("Après le tri:");
    		AffichageTableau(tableau, taille);
    		break;
    	case'c' : 
    		puts("Avant le tri:");
    		AffichageTableau(tableau, taille);
    		puts("Après le tri:");
    		AffichageTableau(tableau, taille);
    		break;
    	case'd' :
    		break;
    	default : puts("Erreur de saisie!!");
    	}
    }
     
    /* programme test */
     
    int main(void){
    	int tableau[NB_MAXI_ELEMENT];
    	int taille = 0;
    	SaisieTableau(tableau);
    	FaitesVotreChoix(tableau, taille);
    	return 0;
    }

  2. #2
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    Ce qui se passe dans ton cas, c'est que le tampon du flux entrant (donc celui dans lequel tu saisies des caractères) n'est pas vide. Donc ton "choix" est en quelques sorte prédéfini comme tu l'as dis, pour y remédier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        // [...]
        int c;
        while ((c = fgetc(stdin)) != '\n' && c != EOF);
        int choix = getchar();
        switch (choix) { // [...]
    Il faut purger stdin de la manière ci-dessous, puis ton choix est valide par la suite
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  3. #3
    Membre éclairé Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Par défaut
    Merci,
    Avec ton systeme, je peux faire mon choix, mais le programme se coupe ensuite.
    Pourquoi ?

  4. #4
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    Citation Envoyé par emprex Voir le message
    Merci,
    Avec ton systeme, je peux faire mon choix, mais le programme se coupe ensuite.
    Pourquoi ?
    Comment ça "il se coupe"? Soit plus précis
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  5. #5
    Membre éclairé Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Par défaut
    Je fais mon choix,
    il imprime mon choix,
    et m'invite à presser une touche pour continuer.

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Par défaut
    Citation Envoyé par emprex Voir le message
    Je fais mon choix,
    il imprime mon choix,
    et m'invite à presser une touche pour continuer.
    Parce que quand tu as fait <enter> tu l'as ajouté à ton buffer. Ce qui fait qu'il traite le premier caractère puis renconter un '\n'.

    Enfin je dis ça sans regarder trop trop, mais ça serait mon premier guess.

  7. #7
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par emprex Voir le message
    Je fais mon choix,
    il imprime mon choix,
    et m'invite à presser une touche pour continuer.
    Mais le programme est terminé : on fait un choix, il exécute le case correspondant du switch, il sort du switch, il sort de la fonction FaitesVotreChoix, il sort du main. Terminé

  8. #8
    Membre éclairé Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Par défaut
    oui, j'ai pas tout le programme, le voici :
    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
    /* le tri  strohecker guillaume */
     
    #include <stdio.h>
    #include <stdlib.h>
    #define NB_MAXI_ELEMENT 10000
     
     
    /* fonction echange */
     
    void Echange(int tableau[], int i, int j){
    	int temp;
    	temp = tableau[i];
    	tableau[i] = tableau[j];
    	tableau[j] = temp;
    }
     
    /* algorithme de tri par sélection */
     
    static void TriSelection(int tableau[], int taille){
    	int k, i, imax;
    	k = taille - 1;
    	while (k > 0){
    		/* recherche de l'indice maximum */
    		imax = 0;
    		for (i = 1; i <= k; i++){
    			if (tableau[imax] < tableau[i]){
    				imax = i;
    			}
    		}
    		/* echange */
    		Echange(tableau, k, imax);
    		k--;
    	}
     
    }
     
    /* Algorithme de tri à bulle */
     
    static void TriBulle(int tableau[], int taille){
    	int i, k;
    	k = taille - 1;
    	/* pour chaque passe */
    	while(k > 0){
    		/* on fait remonter le plus grand */
    		for (i = 1; i <= k; i++){
    			if (tableau[i] < tableau[i-1]){
    				/* échange de T[i-1] et T[i] */
    				Echange(tableau, i, i-1);
    			}
    		}
    		k--;
    	}
    }
     
    /* Algorithme de tri par insertion */
     
    static void TriInsertion(int tableau[], int taille){
    	int k, i, v;
    	for( k = 1; k < taille; k++)
    	{
    		v = tableau[k];
    		i = k - 1;
    	/* on décale les éléments pour l'insertion */
    		while(( i>= 0) && ( v <tableau[i]))
    		{
    		tableau[i+1] = tableau[i];
    		i--;
    		}
    	/* insertion */
    	tableau[i+1] = v;
    	}
    }
     
    /* fonction de saisie de tableau */
     
    int SaisieTableau(int tableau[NB_MAXI_ELEMENT]){
    	int taille, i;
    	puts("Saisir la taille de votre tableau : ");
    	scanf("%d", &taille);
    	if(taille > NB_MAXI_ELEMENT){
    		puts("Erreur : Le tableau est trop petit");
    		exit(1);
    	}
    	puts("Saisir les valeurs de votre tableau : ");
    	for(i = 0; i < taille; i++)
    		scanf("%d", &tableau[i]);
    	return taille;
    }
     
    /* fonction d'affichage */
     
    void AffichageTableau(int tableau[], int taille){
    	int i;
    	for(i = 0; i < taille; i++)
    		printf("L'element numero %d vaut %d\n", i, tableau[i]);
    }
     
     
    /* Fonction de choix */
     
    void FaitesVotreChoix(int tableau[], int taille){
    	char choix ;
    	int c;
        while ((c = fgetc(stdin)) != '\n' && c != EOF);
    	puts("Faites votre choix :");
    	puts("Un tri par selection -----> a");
    	puts("Un tri a bulle -----------> b");
    	puts("Un tri par insertion -----> c");
    	puts("Quitter ------------------> d");
    	choix = (char) getchar();
    	switch(choix){
    	case'a' : 
    		puts("Avant le tri:");
    		AffichageTableau(tableau, taille);
    		TriSelection(tableau, taille);
    		puts("Apres le tri:");
    		AffichageTableau(tableau, taille);
    		break;
    	case'b' : 
    		puts("Avant le tri:");
    		AffichageTableau(tableau, taille);
    		TriBulle(tableau, taille);
    		puts("Apres le tri:");
    		AffichageTableau(tableau, taille);
    		break;
    	case'c' : 
    		puts("Avant le tri:");
    		AffichageTableau(tableau, taille);
    		TriInsertion(tableau, taille);
    		puts("Apres le tri:");
    		AffichageTableau(tableau, taille);
    		break;
    	case'd' :
    		break;
    	default : puts("Erreur de saisie!!");
    	}
    }
     
    /* programme test */
     
    int main(void){
    	int tableau[NB_MAXI_ELEMENT];
    	int taille = 0;
    	SaisieTableau(tableau);
    	FaitesVotreChoix(tableau, taille);
    	return 0;
    }

  9. #9
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    En exécutant ton programme, j'ai :

    $ ./tri
    Saisir la taille de votre tableau :
    2
    Saisir les valeurs de votre tableau :
    0
    1
    Faites votre choix :
    Un tri par selection -----> a
    Un tri a bulle -----------> b
    Un tri par insertion -----> c
    Quitter ------------------> d
    a
    Votre choix est : a
    Avant le tri:
    Après le tri:
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  10. #10
    Membre éclairé Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Par défaut
    pourquoi le tableau ne s'affiche pas ?

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Par défaut
    Citation Envoyé par emprex Voir le message
    pourquoi le tableau ne s'affiche pas ?
    parce que taille vaut 0 dans ton main et qu'il n'est pas modifié car tu ne le passes pas en paramètre à la fonction saisie

  12. #12
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    Je te conseillerais de lire un bon cours de C pour commencer.

    Connaît-tu la notion de portée des variables?

    Tu appelles "SaisieTableau", tu modifies sa taille à l'intérieur, mais dans le main, ton "taille" vaut toujours 0...

    Donc il est normal qu'il ne t'affiche aucune variable étant donné que lorsque tu appelles "AffichageTablo", tu lui passes une taille nulle...

    ++
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  13. #13
    Membre éclairé Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Par défaut
    Ok, merci à tous.
    Je prends note des conseils sur le cours, d'ailleurs c'est ce que je fais.
    Mais il semble que je n'ai pas encore tout compris.
    Ca ne fait même pas six mois que je fais du C.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tomcat] configuration d'une page d'erreur dans web.xml
    Par Super Castor dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 08/04/2009, 15h58
  2. [Thread] Erreur dans une classe interne
    Par totof2308 dans le forum Général Java
    Réponses: 5
    Dernier message: 03/06/2004, 08h15
  3. [Lien]erreur dans mon programme python
    Par durnambule dans le forum Général Python
    Réponses: 11
    Dernier message: 29/01/2004, 14h59
  4. [Erreur dans la lib...]
    Par Gonath dans le forum OpenGL
    Réponses: 3
    Dernier message: 22/12/2003, 09h02
  5. Erreur dans l'utilisation de SWAP
    Par mire dans le forum Langage
    Réponses: 12
    Dernier message: 15/03/2003, 21h39

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