Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: novatus84 en 24 Noviembre 2014, 19:20 pm



Título: Dudas varias programa
Publicado por: novatus84 en 24 Noviembre 2014, 19:20 pm
Muy buenas estoy haciendo una practica de fibonacci tengo lo siguiente después de mucha comedura de cerebro...
Código
  1. #include <vector>
  2. #include <math.h>
  3. #include <iostream>
  4. using namespace std;
  5.  
  6.  
  7. void fibonacci (int x, int y , vector<int>& v, int n){
  8.    int num1 = x;
  9.    int num2 = y;
  10.    int aux;
  11.    v.push_back(x);
  12.    v.push_back(y);
  13.    for (int d = n-2; d > 0; --d){
  14.        aux = num1 + num2;
  15.        num1 = num2;
  16.        num2 = aux;
  17.        v.push_back(aux);
  18.    }
  19. }
  20.  
  21. int main(){
  22.    int x;
  23.    int y;
  24.    int n;
  25.    cout << "Enter the first term: \n";
  26.    cin >> x;
  27.    cout << "Enter the second term: \n";
  28.    cin >> y;
  29.    cout << "Enter the number of terms: \n";
  30.    cin >> n;
  31.    vector<int> v;
  32.    fibonacci(x, y, v , n);
  33.    cout << endl << "The numbers for the sequence asked are: " << endl;
  34.    for (int i = 0; i <v.size(); ++i){
  35.        cout << v[i] << endl;
  36.    }
  37. }
  38.  

¿como puedo sacar del main la lectura de los datos?
¿como hacer que no se pueda introducir letras, que solo lea datos?
en fin mejorarlo que llevo tiempo con ello y no me apaño no hacen mas que salirme errores, Gracias de antemano, saludos


Título: Re: Dudas varias programa
Publicado por: Orubatosu en 24 Noviembre 2014, 20:24 pm
El tema de control de errores por parte del usuario es... una batalla perdida, los usuarios tontos son muy inteligentes  ;D

Pero, puedes hacer obviamente controles... por ejemplo (una opción, hay otras) la entrada por CIN haz que sea un string, ya que un string virtualmente se lo come "todo". Luego compruebas que lo introducido es efectivamente un número, y si es así lo "das por bueno".

Intenta por ejemplo en una función convertir ese string en un objeto istringstream, y sacas "a piñón" un entero. Si la lectura tiene éxito, el contenido es un entero, si no tiene éxito obras en consecuencia.

Por ejemplo:

Código:
#include <iostream>
#include <sstream>

using namespace std;

int numero(string entrada, bool& correcto){
    int valor;
    istringstream S(entrada);
    if (!(S >> valor)) correcto = false;
    return valor;
}


int main(){
    bool lectura = true;
    string In;
    int X;
    int Y;
    int N;
    cout << "Enter the first term: \n";
    cin >> In;
    X = numero(In, lectura);
    cout << "Enter the second term: \n";
    cin >> In;
    Y = numero(In, lectura);
    cout << "Enter the number of terms: \n";
    cin >> In;
    N = numero(In, lectura);
    // -------------------------
    cout << "Valor de X = " << X << endl;
    cout << "Valor de Y = " << Y << endl;
    cout << "Valor de N = " << N << endl;
    if (!lectura) cout << "Uno de los valores es erroneo" << endl;
}

Eso si, aquí tenemos un "medio problema", y es que tal y como te lo planteo, solo te dice que uno de los valores es erróneo, no cual, y además si introduces un valor como por ejemplo "125df" tomará solo 125 e ignorará el resto.

Espero que te sirva de algo, aunque seguro que a alguien se le ocurre como meter un dato erróneo.