J'essaie de demander à l'utilisateur d'entrer des nombres qui sont placés dans un vecteur, Puis en utilisant un appel de fonction pour calculer les nombres, pourquoi cela ne fonctionne-t-il pas? Je ne suis capable que de composer le premier numéro.
template <typename T>
void write_vector(const vector<T>& V)
{
cout << "The numbers in the vector are: " << endl;
for(int i=0; i < V.size(); i++)
cout << V[i] << " ";
}
int main()
{
int input;
vector<int> V;
cout << "Enter your numbers to be evaluated: " << endl;
cin >> input;
V.Push_back(input);
write_vector(V);
return 0;
}
En l’état, vous ne lisez qu’un seul entier et vous le placez dans votre vecteur. Puisque vous voulez probablement stocker plusieurs entiers, vous avez besoin d'une boucle. Par exemple, remplacer
cin >> input;
V.Push_back(input);
avec
while (cin >> input)
V.Push_back(input);
Ce que cela fait est de tirer continuellement des entrées de cin tant qu'il y a des entrées à saisir; la boucle continue jusqu'à ce que cin trouve EOF ou tente d'entrer une valeur non entière. L'alternative consiste à utiliser une valeur sentinelle, même si cela vous empêche de saisir cette valeur. Ex:
while ((cin >> input) && input != 9999)
V.Push_back(input);
lira jusqu'à ce que vous essayiez de saisir 9999 (ou l'un des autres états rendant le cin invalide), moment auquel la boucle se terminera.
Dans d’autres réponses, vous pourriez interdire un numéro particulier ou demander à l’utilisateur de saisir quelque chose de non numérique pour mettre fin à la saisie. Une meilleure solution consiste peut-être à utiliser std::getline()
pour lire un line of input, puis à utiliser std::istringstream
pour lire tous les nombres de cette ligne dans le vecteur.
#include <iostream>
#include <sstream>
#include <vector>
int main(int argc, char** argv) {
std::string line;
int number;
std::vector<int> numbers;
std::cout << "Enter numbers separated by spaces: ";
std::getline(std::cin, line);
std::istringstream stream(line);
while (stream >> number)
numbers.Push_back(number);
write_vector(numbers);
}
De plus, votre implémentation write_vector()
peut être remplacée par un appel plus idiomatique à l'algorithme std::copy()
pour copier les éléments dans un std::ostream_iterator
dans std::cout
:
#include <algorithm>
#include <iterator>
template<class T>
void write_vector(const std::vector<T>& vector) {
std::cout << "Numbers you entered: ";
std::copy(vector.begin(), vector.end(),
std::ostream_iterator<T>(std::cout, " "));
std::cout << '\n';
}
Vous pouvez également utiliser std::copy()
et quelques itérateurs pratiques pour obtenir les valeurs dans le vecteur sans boucle explicite:
std::copy(std::istream_iterator<int>(stream),
std::istream_iterator<int>(),
std::back_inserter(numbers));
Mais c’est probablement exagéré.
Vous avez besoin d'une boucle pour cela. Alors faites ceci:
while (cin >> input) //enter any non-integer to end the loop!
{
V.Push_back(input);
}
Ou utilisez cette version idiomatique:
#include <iterator> //for std::istream_iterator
std::istream_iterator<int> begin(std::cin), end;
std::vector<int> v(begin, end);
write_vector(v);
Vous pouvez également améliorer votre write_vector
en tant que:
#include <algorithm> //for std::copy
template <typename T>
void write_vector(const vector<T>& v)
{
cout << "The numbers in the vector are: " << endl;
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
}
vous avez 2 options:
Si vous connaissez la taille du vecteur (dans votre cas/exemple, il semble que vous le sachiez):
vector<int> V(size)
for(int i =0;i<size;i++){
cin>>V[i];
}
si ce n'est pas le cas et que vous ne pouvez pas l'obtenir dans votre flux de programme, alors:
int helper;
while(cin>>helper){
V.Push_back(helper);
}
One-liner pour lire un nombre - fixé dans un vecteur (C++ 11):
#include <algorithm>
#include <iterator>
#include <iostream>
#include <vector>
#include <cstddef>
int main()
{
const std::size_t LIMIT{5};
std::vector<int> collection;
std::generate_n(std::back_inserter(collection), LIMIT,
[]()
{
return *(std::istream_iterator<int>(std::cin));
}
);
return 0;
}
Vous avez besoin d'un second entier.
int i,n;
vector<int> V;
cout << "Enter the amount of numbers you want to evaluate: ";
cin >> i;
cout << "Enter your numbers to be evaluated: " << endl;
while (V.size() < i && cin >> n){
V.Push_back(n);
}
write_vector(V);
return 0;
cin est délimité sur l'espace, donc si vous essayez de cin "1 2 3 4 5" dans un seul entier, si vous n'affectez que 1 à l'entier, une meilleure option consiste à envelopper votre entrée et Push_back dans une boucle, et faites-le tester pour une valeur sentinelle, et sur cette valeur sentinelle, appelez votre fonction d'écriture. tel que
int input;
cout << "Enter your numbers to be evaluated, and 10000 to quit: " << endl;
while(input != 10000) {
cin >> input;
V.Push_back(input);
}
write_vector(V);
Vous pouvez simplement le faire avec l’aide de for loop
-> Demander à l'utilisateur l'exécution (combien d'entrées il veut entrer) et le traiter de la même façon que les tableaux.
int main() {
int sizz,input;
std::vector<int> vc1;
cout<< "How many Numbers you want to enter : ";
cin >> sizz;
cout << "Input Data : " << endl;
for (int i = 0; i < sizz; i++) {//for taking input form the user
cin >> input;
vc1.Push_back(input);
}
cout << "print data of vector : " << endl;
for (int i = 0; i < sizz; i++) {
cout << vc1[i] << endl;
}
}
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
vector<string>V;
int num;
cin>>num;
string input;
while (cin>>input && num != 0) //enter any non-integer to end the loop!
{
//cin>>input;
V.Push_back(input);
num--;
if(num==0)
{
vector<string>::iterator it;
for(it=V.begin();it!=V.end();it++)
cout<<*it<<endl;
};
}
return 0;
};
Vous voulez probablement lire plus de nombres, pas seulement un . Pour cela, vous avez besoin d’une boucle
int main()
{
int input = 0;
while(input != -1){
vector<int> V;
cout << "Enter your numbers to be evaluated: " << endl;
cin >> input;
V.Push_back(input);
write_vector(V);
}
return 0;
}
Notez qu'avec cette version, il n'est pas possible d'ajouter le nombre -1 car il s'agit du "signal de fin" . Tapez des nombres aussi longtemps que vous le souhaitez, il sera abandonné si vous tapez -1.
#include<iostream>
#include<vector>
#include<sstream>
using namespace std;
int main()
{
vector<string> v;
string line,t;
getline(cin,line);
istringstream iss(line);
while(iss>>t)
v.Push_back(t);
vector<string>::iterator it;
for(it=v.begin();it!=v.end();it++)
cout<<*it<<endl;
return 0;
}
Dans ce cas, votre boucle while
ressemblera à
int i = 0;
int a = 0;
while (i < n){
cin >> a;
V.Push_back(a);
++i;
}
La size()
initiale de V
sera 0, alors que int n contient une valeur aléatoire car vous ne l'initialisez pas.
V.size() < n
est probablement faux. </ s>
Silly me manque le "Enter the amount of numbers you want to evaluate: "
Si vous entrez une n
inférieure à V.size()
à ce moment-là, la boucle se terminera.
Ajoutez simplement une autre variable.
int temp;
while (cin >> temp && V.size() < n){
V.Push_back(temp);
}
serait plus facile si vous spécifiez la taille du vecteur en prenant une entrée:
int main()
{
int input,n;
vector<int> V;
cout<<"Enter the number of inputs: ";
cin>>n;
cout << "Enter your numbers to be evaluated: " << endl;
for(int i=0;i<n;i++){
cin >> input;
V.Push_back(input);
}
write_vector(V);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main()
{
int x,n;
cin>>x;
vector<int> v;
cout<<"Enter numbers:\n";
for(int i=0;i<x;i++)
{
cin>>n;
v.Push_back(n);
}
//displaying vector contents
for(int p : v)
cout<<p<<" ";
}
Un moyen simple de prendre des entrées en vecteur.