2013-03-15 2 views
-3

Je suis nouveau en C++ et j'ai fait une fonction qui lit les éléments dans un vecteur et une fonction qui imprime les éléments. Le problème est que la fonction d'impression ne fonctionne pas bien.l'impression d'un vecteur en C++

#include <iostream> 
    using namespace std; 

1)

int read() 
{ 
    int elements,i; 
    cout<<"Give the number of elements:"; 
    cin>>elements; 
    int v[elements]; 
    for(i=1;i<=elements;i++) 
    { 
     cout<<"v["<<i<<"]="; 
     cin>>v[i]; 
    } 
    return elements; 
} 

2)

void print_vector(int elements) 
{ 
    int i; 
    int v[elements]; 
    for(i=1;i<=elements;i++) 
    { 
     cout<<v[i]; 
    } 
} 

int main() 
{ 
    int n=read(); 
    print_vector(n); 
    return 0; 
} 

Example: 
Give the number of elements:5 
v[1]=1 
v[2]=2 
v[3]=3 
v[4]=4 
v[5]=5 
1348 

Il imprime 1348 au lieu de 12345. Quel est le problème avec la fonction et comment puis-je modifier pour imprimer les bons éléments?

+3

Votre code utilise une extension de compilateur. Utilisez 'std :: vector' à la place de ce tableau de longueur variable. – chris

+3

Veuillez lire [whathaveyoutried.com] (http://whathaveyoutried.com) et suivez les conseils. – djechlin

Répondre

2

Vous avez des erreurs dans la fonction d'impression

for(i=1;i<=elements;i++) 
{     //^^^^^ 
    cout<<v[i]; 
    ++i; //You would like to skip some elements? 
} 

index Vous incrémenter i deux fois et index du tableau commence à 0 et non 1; il se termine sur nombre (elements-1) pas d'éléments, pendant ce temps, vous utilisez array, pas vector.

3
int v[elements]; 

Ceci crée un nouveau tableau d'entiers.

Il est relativement difficile de faire circuler des tableaux, car vous devez faire attention à la façon dont vous gérez l'allocation de mémoire, et ils remontent aux anciens jours de C. Pendant que vous apprenez C++, vous pouvez utiliser un class pour gérer les problèmes de mémoire. std::vector est syntaxiquement similaire à un tableau, mais s'occupe de l'allocation et du redimensionnement pour vous, et se souvient de sa taille.

Vous pouvez passer des objets dans les fonctions par la référence &, et à l'intérieur de la fonction, il sera possible de modifier l'objet transmis, et aura un effet durable une fois la fonction terminée.

void read(vector<int>& elements) { 
    // in here you can resize the vector 
} 

void print(const vector<int>& elements) { 
    // passing in elements by const reference means you can't modify it 
} 

donc tout à fait:

int main() { 
    vector<int> elements; 
    read(elements); 
    print(elements); 
} 

Alternativement, si vous voulez être orienté objet, vous devriez chercher des façons de regrouper les données et les fonctions ensemble, de sorte que vous éviter de passer autour des données tout à fait. Dans ce cas, vous pouvez regrouper le vecteur et les fonctions de lecture et d'impression. appelez peut-être UserIntegers:

class UserIntegers { 
public: 
    void process() { 
     read(); 
     print(); 
    } 
private: 
    vector<int> numbers; 
}; 

Utilisation:

int main() { 
    UserIntegers userIntegers; 
    userIntegers.process(); 
} 
+0

Et comment devrais-je concevoir la fonction d'impression afin qu'elle ne crée pas un nouveau tableau d'entiers? –

2

En read(), vous avez lu les éléments dans un tableau local v. Lorsque la fonction se termine, le tableau disparaît également. La même chose se passe dans print_vector().

Une autre erreur est l'indexation de votre tableau. Vous accédez aux éléments de 1 à elements inclus, qui ignore le premier élément 0 et accède finalement à un élément au-delà des limites du tableau (elements).

Vous devez allouer un tableau, mieux un std::vector, en dehors des deux fonctions et le transmettre en read() pour le remplissage et en print_vector() pour l'impression.

#include <iostream> 
#include <vector> 

void read(std::vector<int> &v) 
{ 
    int elements,i, n; 
    std::cout<<"Give the number of elements:"; 
    std::cin>>elements; 
    for(i = 0; i < elements; i++) 
    { 
     std::cout<<"v["<<i<<"]="; 
     std::cin>> n; 
     v.push_back(n); 
    } 
} 

void print_vector(const std::vector<int> &v) 
{ 
    for(auto i = v.begin(); i != v.end(); ++i) 
    { 
     std::cout << *i; 
    } 
} 

int main() 
{ 
    std::vector<int> v; 
    read(v); 
    print_vector(v); 
    return 0; 
} 
+0

Je pense que vous manquez l'argument de modèle pour std :: vecteur –

+0

@ JorgeNúñez Merci, j'ai raté. Fixé. –