1
votes

Insérer des nombres divisibles par un nombre dans un vecteur

On m'a donné les nombres entiers 15, 16, 17, 18, 19 et 20.

Je suis censé mettre uniquement les nombres divisibles par 4 dans un vecteur, puis afficher les valeurs dans le vecteur.

Je sais comment résoudre le problème en utilisant des tableaux, mais je suppose que je ne sais pas comment utiliser correctement le refoulement ou les vecteurs.

#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> arrmain; int i,j;

for (int i = 15; i <=20 ; i++)
{
        //checking which numbers are divisible by 4
    if (i%4 == 0)
    {   //if number is divisible by 4 inserting them into arrmain 

        arrmain.push_back(i);
        //output the elements in the vector
        for(j=0; j<=arrmain.size(); j++)
        {
            cout <<arrmain[i]<< " "<<endl;
        }
    }
 }

return 0;
 }

Sortie souhaitée: Nombres divisibles par 4:16, 20


3 commentaires

Votre code semble un peu incohérent et votre {} n'est pas tout au bon endroit, cependant, vous avez dit que la solution semble bonne sauf pour l'indexation hors limites puisque vous utilisez la mauvaise variable comme index. Je recommande d'utiliser des structures plus modernes, comme la boucle for basée sur la plage, car cela rend votre code moins sujet aux erreurs.


Je suis un débutant donc je ne suis pas familier avec la gamme basée sur les boucles. Qu'entendez-vous par indexation hors limite? Merci.


J'ai ajouté une réponse où je l'explique plus en détail


3 Réponses :


0
votes

Après avoir exécuté votre code, j'ai trouvé deux bogues qui sont corrigés dans le code ci-dessous.

vector<int> arrmain; int i, j;

    for (int i = 15; i <= 20; i++)
    {
        //checking which numbers are divisible by 4
        if (i % 4 == 0)
        {   //if number is divisible by 4 inserting them into arrmain 

            arrmain.push_back(i);
            //output the elements in the vector
            for (j = 0; j < arrmain.size(); j++)   // should be < instead of <=
            {
                cout << arrmain[j] << " " << endl;    // j instead of i
            }
        }
    }

Ce code affichera: 16 16 20, car vous imprimez des éléments de vecteur après chaque opération d'insertion . Vous pouvez prendre la deuxième boucle à l'extérieur pour éviter de faire des opérations répétées.

Fondamentalement, les vecteurs sont utilisés en cas de gestion du changement de taille dynamique. Vous pouvez donc utiliser push_back () si vous souhaitez augmenter dynamiquement la taille du vecteur ou vous pouvez utiliser l'opérateur [] si la taille est déjà prédéfinie.


1 commentaires

Mon erreur était de l'approcher comme je le ferais avec un tableau. Merci, je comprends à quel point ma logique est fausse.



1
votes

Le principal problème dans votre code est que vous (1) utilisez la mauvaise variable pour indexer votre vecteur lors de l'impression de ses valeurs, c'est-à-dire que vous utilisez cout au lieu de cout ; et (2) que vous dépassez les limites du tableau lors de l'itération jusqu'à j (au lieu de j . Notez que arrmain [arrmain.size ()] dépasse les limites du vecteur de un car les indices vectoriels sont basés sur 0; un vecteur de taille 5, par exemple, a des indices valides allant de 0..4 code> et 5 est hors limites.

Un problème mineur est que vous imprimez le contenu du tableau encore et encore tout en le remplissant. Vous voudrez probablement l'imprimer une fois après la première boucle, pas encore et encore en son sein.

// could also be written as range-based for loop:
for(auto val : arrmain) {
    cout << val << " "<<endl;
}

Concernant la boucle for basée sur la plage mentionnée dans le commentaire, notez que vous pouvez parcourir les éléments d'un vecteur en utilisant la syntaxe abrégée suivante :

int main()
{
    vector<int> arrmain;

    for (int i = 15; i <=20 ; i++)
    {
        //checking which numbers are divisible by 4
        if (i%4 == 0)
        {   //if number is divisible by 4 inserting them into arrmain

            arrmain.push_back(i);
                    }
    }
    //output the elements in the vector
    for(int j=0; j<arrmain.size(); j++)
    {
        cout <<arrmain[j]<< " "<<endl;
    }

    return 0;
}

Cette syntaxe est appelée une boucle for basée sur une plage et est décrite, par exemple, ici sur cppreference.com .


1 commentaires

Je ne savais même pas que les boucles for basées sur la plage existaient, merci!



1
votes

Comme déjà mentionné dans les commentaires, vous rencontrez quelques problèmes dans votre code. Tout cela vous mordra à la fin lors de l'écriture de plus de code. Beaucoup d'entre eux peuvent vous être indiqués par les outils du compilateur. Par exemple en utilisant -Weverything in clang .

À choisissez les plus importants:

source.cpp: 8: 10: avertissement: la déclaration masque une variable locale [-Wshadow]

pour (int i = 15; i

et

source.cpp: 6: 26: avertissement: variable inutilisée 'i' [-Wunused-variable]

vector arrmain; int i, j;

À côté de ceux-ci, vous avez un problème logique dans votre code:

for (int value : arrmain)
{
    cout << value << " "<<endl;
}

Cela entraînera: 16, 16, 20 lors de l'exécution. Au lieu de cela, vous voulez changer la portée de l'impression afin qu'elle ne s'imprime pas à chaque correspondance.

Enfin, le bogue que vous voyez:

for(innercounter=0; innercounter<=arrmain.size(); innercounter++)
{
    cout <<arrmain[outercounter]<< " "<<endl;
}

Ce bogue est le résultat d'une mauvaise dénomination, permettez-moi de renommer pour que vous voyiez le problème:

for(j=0; j<=arrmain.size(); j++)
{
    cout <<arrmain[i]<< " "<<endl;
}

Maintenant, il devrait être clair que vous utilisez la mauvaise variable pour indexer le vecteur. Ce seront les index 16 et 20, dans un vecteur avec une taille maximale de 2. Comme ces index sont hors limites pour le vecteur, vous avez un comportement indéfini. Lorsque vous utilisez le bon index, vous amène également à sortir d'un index des limites du vecteur, utilisez plutôt .

En plus d'utiliser de meilleurs noms pour vos variables, je recommanderais d'utiliser la plage basée sur. Ceci est disponible depuis C ++ 11.

for values to check
    if value is ok
        print all known correct values


1 commentaires

Merci d'avoir suggéré l'outil de compilation! Ce sera très pratique!