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 pour tableau croissant


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Février 2006
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 311
    Par défaut Problème pour tableau croissant
    Je suis entrain de faire un exercice qui me semblait facile mais je galère à me casser la tête pour y arriver.

    le but est de créer un tableau de façon trié à chaque fois qu'on entre une valeur.

    J'ai fait cela mais ça semble ne pas fonctionner correctement

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    #define true 1
    #define false 0
     
    int main(void) {
     
    	int tab[10];
    	int val,i,j,l,pos,verif;
     
        // parcourir le tableau 10 fois pour entrer les valeurs
    	for(i=0; i<10; i++) {
     
    		printf("Entrer une valeur positive N ° %d : ",i);
    		scanf("%d",&val);
     
    		// contrôle de boucle pour entrer des nombres positives
    		while(val < 0) {
     
    			printf("Erreur entrer un nombre positif N ° %d : ",i); 
    			scanf("%d",&val);	
    		}
     
    		// au premier indice = 0 de tab on stocke la valeur
    		if(i==0) {
     
    		tab[i]=val;
    	  }
     
    	// au second indice on parcours le tableau et on détermine la position
    	verif=false;
     
    	for(j=0; j<i; j++) {
     
    		if(tab[j] > val) {
     
    			pos=j;
    			verif=true;
     
    		}	
     
    	}	
     
    	if(verif==true) {
     
           for(l=i; l>=pos; l--) {
     
    		    tab[l]=tab[l-1];
     
    		  }
    	    	tab[pos]=val;
    		}
     
    	else
    		tab[i]=val;
    }
     
    for(i=0; i<10; i++)
    	printf("%d\n",tab[i]);
     
    return EXIT_SUCCESS;
    }
    Si quelqu'un aurait une idée de comment m'y prendre.

    Merci

  2. #2
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    Voilà l'instruction qui pose problème:
    for(j=0; j<i; j++) {

    if(tab[j] > val) {

    pos=j;
    verif=true;

    }
    L'erreur est qu'une fois que tu as trouvé une valeur plus grande que val, tu ne t'arrete pas.
    Ainsi, imagine que tu as dans ton tableau:
    0 1 2 4 5 6
    Tu veux inserer 3 avec ton prog =>tu as bien 4>3, tu va bien mettre pos à 4 mais tu continues la boucle et tu as bien 5>3 donc tu vas metree pos à 5 etc

    Tu as deux solutions:
    soit mettre un break à la fin de ta condition, ou alors mettre une condition d'arrêt supplémentaire dans ta boucle for :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(j=0; j<i && tab[j] > val; j++)
    Ce qui te permettra de faire en outre l'économie de la variable vérif


    Dernière petite remarque, il est plus courant de faire un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef enum{FALSE,TRUE} BOOL;
    que de faire deux #define

  3. #3
    Membre très actif
    Inscrit en
    Février 2006
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 311
    Par défaut
    Effectivement je l'ai remarqué et donc j'ai fait le changement en conséquence
    Au début je pensais utiliser un break; mais en pseudo-code ça ne le fait pas de mettre un break si un jour je dois écrire l'algo sur papier pour mes cours .

    Donc j'ai fais un peu différent avec ma logique , je n'avais pas pensé au
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(j=0; j<i && tab[j] > val; j++)
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    #define true 1
    #define false 0
     
    int main(void) {
     
    	int tab[10];
    	int val,i,j,l,pos,verif;
     
        // parcourir le tableau 10 fois pour entrer les valeurs
    	for(i=0; i<10; i++) {
     
    		printf("Entrer une valeur positive N ° %d : ",i);
    		scanf("%d",&val);
     
    		// contrôle de boucle pour entrer des nombres positives
    		while(val < 0) {
     
    			printf("Erreur entrer un nombre positif N ° %d : ",i); 
    			scanf("%d",&val);	
    		}
     
    		// au premier indice = 0 de tab on stocke la valeur
    		if(i==0) {
     
    		tab[i]=val;
    	  }
     
    	// au second indice on parcours le tableau et on détermine la position
    	verif=false;
     
    	for(j=0; j<i && verif != true; j++) {
     
    		if(val < tab[j]) {
     
    			pos=j;
    			verif=true;
     
    		}	
     
    	}	
     
    	if(verif==true) {
     
           for(l=j; l>=pos; l--) {
     
    		    tab[l]=tab[l-1];
     
    		  }
    	    	tab[pos]=val;
     
    	if(pos!=0) {
     
    			i--;
    		}
     
      }
     
    	else
    		tab[i]=val;
    }
     
    for(i=0; i<10; i++)
    	printf("%d\n",tab[i]);
     
    return EXIT_SUCCESS;
    }
    Le problème supplémentaire est que quand je rentre
    Entrer une valeur positive N ° 0 : 1
    Entrer une valeur positive N ° 1 : 0
    Entrer une valeur positive N ° 2 : 3
    Entrer une valeur positive N ° 3 : 2
    Entrer une valeur positive N ° 3 : 5
    Entrer une valeur positive N ° 4 : 4
    Entrer une valeur positive N ° 4 : 7
    Entrer une valeur positive N ° 5 : 6
    Entrer une valeur positive N ° 5 : 8
    Entrer une valeur positive N ° 6 : 9
    Entrer une valeur positive N ° 7 : 10
    Entrer une valeur positive N ° 8 : 13
    Entrer une valeur positive N ° 9 : 11
    Entrer une valeur positive N ° 9 : 14

    Voilà ce qu'il me fait

    0
    1
    2
    4
    6
    8
    9
    10
    11
    14

    Problème, je rentre plus de valeur qu'il en faut dans le tableau mais le tableau ce tri correctement me semble-t-il.

    Merci pour l'indication du typedef j'ai fait ça sur mes connaissances je n'ai pas vraiment vu les enum dans mes cours c'est du C99 je crois le BOOL ?

  4. #4
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Salut.

    Avant tout je te propose une simple amélioration qui serait de mettre cette ligne en début de programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define TAB_SIZE 10
    et tu remplaces "10" par TAB_SIZE partout, comme ça quand tu veux tester avec un tableau de 3 cases (c'est plus simple pour debugger) tu changes simplement la constante.

    Ensuite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef enum{FALSE,TRUE} BOOL;
    n'est pas du C99, c'est simplement une énumération qui a le nom "BOOL", une énumération ne peut prendre que une valeur, ainsi quand tu feras :

    Tu seras sûre que tu ne pourras affecter que FALSE ou TRUE à cette variable.
    Note que dans tes IF tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //if( trouve == true)
    if(trouve)
    //if( trouve == false)
    if(!trouve)
    Pour ce qui de l'erreur dans ton programme, j'en ai au moins relevée une :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for(l=j; l>=pos; l--)
            tab[l]=tab[l-1];
    Imagine un tableau de 3 où tu rentres : 3,2,1. Au moment où tu vas entrer le dernier élément (ici "1") ton tableau sera comme ceci : tab = {2,3, VALEUR INCONNUE}.
    Ensuite l sera égal à 1 (car j == 1) et tu vas faire tab[1] = tab[0]. Donc tu vas écraser le deuxième élément du tableau et tu auras ceci : tab = {2,2, VALEUR INCONNUE}. Ensuite tu vas affecter ta valeur "1" a la première case ce qui donnera tab = {1,2, VALEUR INCONNUE}.

    A propos de valeur inconnue c'est parce que tu n'initialises pas ton tableau à zéro donc ton tableau contient ce qu'il y avait là avant.
    A la déclaration il est conseillé de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int tab[SIZE] = {0};
    Je n'en dit pas plus, tu devrais être capable de te corriger

  5. #5
    Membre très actif
    Inscrit en
    Février 2006
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 311
    Par défaut
    Je viens de corriger mon erreur dans ce que tu disais merci

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    #define true 1
    #define false 0
    // on peu faire à la place typedef enum{FALSE,TRUE} BOOL;
     
    int main(void) {
     
    	int tab[10]={0};
    	int val,i,j,l,pos,verif;
     
        // parcourir le tableau 10 fois pour entrer les valeurs
    	for(i=0; i<10; i++) {
     
    		printf("Entrer une valeur positive N ° %d : ",i);
    		scanf("%d",&val);
     
    		// contrôle de boucle pour entrer des nombres positives
    		while(val < 0) {
     
    			printf("Erreur entrer un nombre positif N ° %d : ",i); 
    			scanf("%d",&val);	
    		}
     
    		// au premier indice = 0 de tab on stocke la valeur
    		if(i==0) {
     
    		tab[i]=val;
    	  }
     
    	// au second indice on parcours le tableau et on détermine la position
    	verif=false;
     
    	// je peux très bien faire for(j=0; j<i && tab[j] > val; j++) ainsi j'ai pas besoin de verif
    	for(j=0; j<i && verif != true; j++) {
     
    		if(val < tab[j]) {
     
    			pos=j;
    			verif=true;
     
    		}	
     
    	}	
     
    	if(verif==true) {
     
           for(l=j; l>=pos; l--) {
     
    		    tab[l+1]=tab[l];
     
    		  }
    	    	tab[pos]=val;
     
      }
     
    	else
    		tab[i]=val;
    }
     
    for(i=0; i<10; i++)
    	printf("%d\n",tab[i]);
     
    return EXIT_SUCCESS;
    }
    Cependant d'après mes tests il y a un gros problème , dans une suite comme celle-ci

    Entrer une valeur positive N ° 0 : 8
    Entrer une valeur positive N ° 1 : 7
    Entrer une valeur positive N ° 2 : 6
    Entrer une valeur positive N ° 3 : 5
    Entrer une valeur positive N ° 4 : 4
    Entrer une valeur positive N ° 5 : 3
    Entrer une valeur positive N ° 6 : 2
    Entrer une valeur positive N ° 7 : 1
    Entrer une valeur positive N ° 8 : 0
    Entrer une valeur positive N ° 9 : -1
    Erreur entrer un nombre positif N ° 9 : 11


    0
    1
    2
    0
    0
    0
    0
    0
    0
    11

    Le tableau ce crée à moitié correctement , ça vient je pense du fait qu'on boucle pas assez ?

  6. #6
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    Pour quoi as tu mis:
    for(l=j; l>=pos; l--)
    tab[l]=tab[l-1];
    Dans ton premier post tu avais mis:
    for(l=i; l>=pos; l--)
    tab[l]=tab[l-1];
    ce qui était correct!

    Reprend donc cette instruction ça devrait marcher

  7. #7
    Membre très actif
    Inscrit en
    Février 2006
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 311
    Par défaut
    merci ça fonctionne.

  8. #8
    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
    Une remarque @Trademark:
    quand tu feras :
    Tu seras sûre que tu ne pourras affecter que FALSE ou TRUE à cette variable.
    Non, rien ne garantit que trouve ne prenne que les valeurs FALSE (ou 0) ou TRUE (ou 1). On peut lui donner d'autres valeurs entières. Sur le type "effectif" utilisé pour représenter une variable du type énumération, on sait seulement que c'est un entier d'un type suffisamment "grand" pour permettre de représenter toutes les constantes de l'énumération.
    L'avantage est surtout documentaire : si une variable est d'un type énumération, on peut raisonnablement présumer qu'elle doit avoir pour valeur l'une des constantes de l'énumération (mais ce n'est pas une obligation)

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

Discussions similaires

  1. Problème pour centrer verticalement dans un tableau
    Par navis84 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 10
    Dernier message: 18/07/2006, 16h56
  2. [Tableaux] Problème pour contrôler un tableau
    Par renaud26 dans le forum Langage
    Réponses: 5
    Dernier message: 10/04/2006, 11h45
  3. Problème de tableau pour un exercice en C++
    Par tigresses57 dans le forum C++
    Réponses: 14
    Dernier message: 05/03/2006, 23h27
  4. Réponses: 1
    Dernier message: 21/02/2006, 15h46
  5. Problème pour lire dans un tableau ...
    Par themis dans le forum Oracle
    Réponses: 1
    Dernier message: 15/02/2006, 18h04

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