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 :

probleme boucle infini dans tableau


Sujet :

C++

  1. #1
    Inactif  

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 064
    Points : 4 605
    Points
    4 605
    Par défaut probleme boucle infini dans tableau
    Bonjour

    J'ai un programme qui calcule le prix de 3 panier différents avec 5 produits chacun.

    Il faut que tableau qui s'affiche donne le prix d'un panier dans une supermarché ( sur 1 colonne ) , le prix moyen d'un produit ( sur 1 ligne )

    J'aurais donc un tableau 6 lignes et 4 colonnes .

    Problème arrivé au 5 eme produit du 3 eme supermarché , je saisi mon dernier et mon programme et affiche sur une ligne 4 valeurs sortie de nul part " 1 6 11 6 " ou " 1 6 11 2.33333 "

    Je ne vois pas du tout vient l'erreur ?

    voici le programme

    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
    # include <iostream.h>
     
    int main()
     
    { 
    	//declaration des variables 
     
    	const int t1=6,t2=4;
    	float super[t1][t2],ps,pp; 
    	int l,c;
     
    	// instructions principales
     
    	// remplir le tableau
     
    	cout<<" remplir le tableau : \n ";
     
    	for (c=0;c<=t2-2;c++)
    	{
            cout<<" supermarche "<<c<<" : \n";
    		for(l=0;l<=t1-2;l++)
    		{
    			cout<<" produit "<<l<<" : ";
    			cin>>super[l][c];
    		}
    	}
     
    	cout<<" essai ";
     
    	//affichage tableau 
     
    	for (c=0;c<=t2-2;c++)
    	{
    		for(l=0;l<=t1-2;l++)
    		{
    			cout<<super[l][c];
    			cout<<"\t";
    		}
    		cout<<"\n";
    	} 
     
    	// calcul prix panier par supermarche
     
    	for (c=0;c<=t2-2;c++)
    	{
            ps=0;
    		for(l=0;l<=t1-2;l++)
    		{
                ps=super[l][c]+ps;
                super[5][c]=ps;
            }
        }
     
    	// calcul prix moyen produit  
     
        for (l=0;l<=t1-2;l++)
    	{
            pp=0;
    		for(c=0;c<=t2-2;c++)
    		{
                pp=super[l][c]+pp;
                super[l][3]=(pp/3);   	
    		}
    	}
     
    	// affichage tableau
     
    	for (l=0;l<t1;c++)
    	{
    		for(c=0;c<t2;c++)
    		{
    			cout<<super[l][c];
    			cout<<"\t";
    		}
    		cout<<"\n";
    	}
     
        cin>>pp;
    	return 0; 
    }

  2. #2
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Puisque vous êtes en C++ et non en C, pourquoi n'utilisez-vous std::vector au lieu d'un tableau ?

  3. #3
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut
    Salut,
    Dans toutes tes boucles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (c=0;c<=t2-2;c++)
    	{
    		for(l=0;l<=t1-2;l++)
    		{
    ...
    tu n'initialise jamais ton tableau pour c = 5 et l = 3 puisque tu t'arrête à c = t1 - 2 = 4 et l = t2 - 2 = 2! Pourquoi changer brutalement tes boucles au dernier affichage du tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (l=0;l<t1;c++)
    	{
    		for(c=0;c<t2;c++)
    		{
    ...
    Tes valeurs sont forcément "sorties de nulle part", puisque tu ne les initialisent jamais!!

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 064
    Points : 4 605
    Points
    4 605
    Par défaut
    Citation Envoyé par ptyxs Voir le message
    Puisque vous êtes en C++ et non en C, pourquoi n'utilisez-vous std::vector au lieu d'un tableau ?
    Je ne sais pas encore utiliser std :: vector a mon niveau , et je ne peux pas utiliser autre chose que les boucles for ( vu que c'est le but de l'exercice et imposé )

    Dans toutes tes boucles :
    Code :

    for (c=0;c<=t2-2;c++)
    {
    for(l=0;l<=t1-2;l++)
    {
    ...

    tu n'initialise jamais ton tableau pour c = 5 et l = 3 puisque tu t'arrête à c = t1 - 2 = 4 et l = t2 - 2 = 2! Pourquoi changer brutalement tes boucles au dernier affichage du tableau :
    Code :

    for (l=0;l<t1;c++)
    {
    for(c=0;c<t2;c++)
    {
    ...

    Tes valeurs sont forcément "sorties de nulle part", puisque tu ne les initialisent jamais!!
    Non c'est t1 = 6 et t2 = 4 , je ne vois pas ou voulais en venir avec c et l ? Ces 2 lettres sont des indices qui varient

    Pourriez donner un exemple de declaration ?

    Merci d'avance

  5. #5
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Citation Envoyé par tanaka59 Voir le message
    Je ne sais pas encore utiliser std :: vector a mon niveau , et je ne peux pas utiliser autre chose que les boucles for ( vu que c'est le but de l'exercice et imposé )
    std::vector est plus simple d'utilisation qu'un tableau à mon avis, justement ! C'est en partie pour cela qu'on l'a inventé, du reste !
    En outre on peut parfaitement le parcourir avec une boucle for !

    Tu es apparemment victime d'un enseignement mal conçu du C++....

  6. #6
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    J'ajoute une autre remarque : ton programme contient des "nombres magiques" (des constantes numériques) le mieux est de passer par des constantes ayant un nom intelligible si l'on veut s'y retrouver, du genre :

    ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    depense= prix*nb_articles
    (ce sont de simples exemples, pour donner une idée de ce que j'ai en tête, je ne veux pas dire que ces deux lignes doivent se retrouver dans ton programme, bien entendu)
    D'autre part, tu utilises des variables dont le nom est lui aussi inintelligible (t, l etc...) : donne des noms compréhensibles à tes variables (sauf pour les index d'une boucle où l'on utilise d'ordinaire les lettre i, j etc.).

    La conjonction de ces deux travers rend ton programme illisible pour les autres et probablement même pour toi !! Passer un peu de temps à choisir convenablement des noms de variable en vaut tout à fait la peine.

    D'autre part en C++ on ne déclare pas les variables en bloc en tête du programme, mais au moment où on s'apprête à les utiliser ! Cela aussi accroît la lisibilité du programme pour toi et pour les autres.
    Une boucle for, par exemple, contiendra donc la déclaration de son index, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i = 0; i <= max; i++)
    ou plus rigoureusement si tu parcours un tableau ou un std::vector :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (size_t i = 0; i <= max; i++)

  7. #7
    Inactif  

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 064
    Points : 4 605
    Points
    4 605
    Par défaut
    Citation Envoyé par ptyxs Voir le message
    std::vector est plus simple d'utilisation qu'un tableau à mon avis, justement ! C'est en partie pour cela qu'on l'a inventé, du reste !
    En outre on peut parfaitement le parcourir avec une boucle for !

    Tu es apparemment victime d'un enseignement mal conçu du C++....
    Je confirme , le base que l'on nous enseigne on 10 ans d'age

  8. #8
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par tanaka59 Voir le message
    Je confirme , le base que l'on nous enseigne on 10 ans d'age
    C'est qu'avant de courrir, il faut quand même apprendre à marcher. On ne peut pas expliquer l'opérateur [] et en quoi std::vector<> est mieux qu'un tableau sans expliquer les tableaux d'abord
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    C'est qu'avant de courrir, il faut quand même apprendre à marcher.
    Dans son dernier livre, Bjarne reprend cette analogie, et je suis assez d'accord avec lui : Quand on regarde un enfant qui apprend à se mouvoir, on se rend compte qu'en fait, il apprend à courir bien avant que d'apprendre à marcher. Et bien entendu, il tombe à de multiples reprises, mais ce n'est pas grave, il se relève et a progressé. Ce n'est que bien plus tard quand il aura acquis une bonne expérience qu'il pourra maîtriser finement ses jambes pour mettre en œuvre l'équilibre subtil nécessaire à la marche.

    J'enseigne dans les cours que je donne comment utiliser vector avant de parler de tableau C-style. Pour ça, il n'est nul besoin de détailler la surcharge des opérateurs, ni de faire un comparatif entre ces deux solutions. Il suffit d'expliquer comment utiliser vector, ce qui est bien plus simple que d'expliquer comment utiliser un tableau C-style.

    L'apprentissage des tableaux C-style vient plus tard, au moment où je montre comment créer ses propres classes et comment mettre en place une sémantique de valeur.

    Bien entendu, l'hétérogénéité des niveaux étant une constante dans des cours d'informatiques, certains ont déjà quelques notions de C ou de C++, et veulent utiliser les tableaux C-style dans les exercices que je donne. A ceux-là, et à ceux-là uniquement, j'explique des choses en avance de phase.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/07/2006, 11h11
  2. Réponses: 29
    Dernier message: 17/06/2006, 13h04
  3. Probleme Boucle infinie Recordset.movenext "muet"?
    Par shub dans le forum VBA Access
    Réponses: 7
    Dernier message: 14/06/2006, 13h22
  4. symptome de la boucle infinie dans une requete
    Par ouam81 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 27/05/2005, 12h10
  5. Réponses: 15
    Dernier message: 24/05/2005, 08h34

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