C++ Lectura de datos constante con while (cin)

Enviado por jvilella el Lun, 23/09/2019 - 04:24

Requisitos:

Cuando no sabemos cuántos valores nos escribirán por el teclado usamos la siguiente instrucción:

while (cin>>valor) {
    ...
}

Lo que esto hace es ir leyendo valores del teclado hasta que el usuario presione CTRL+Z en Windows o CTRL+D en MacOS y Linux (o, si se está leyendo un archivo, hasta que se llegue al final del archivo). Por ejemplo:

int suma = 0;
int num;
while (cin >> num) {
    suma = suma + num;
}
cout << suma << endl;

Podemos leer más de un valor con el cin dentro de la condición del while:

int nota;
string alumno;
while (cin >> alumno >> nota) {
    cout << "El/La " << alumno << " ha obtenido un " << nota << endl;
}

Es muy habitual utilizar la fórmula “while(cin)” para rellenar un vector cuando no sabemos cuantos valores introducirá el usuario:

vector<int> paises_visitados;
string pais;
while (cin >> pais) {
    paises_visitados.push_back(pais);
}

 

Printer Friendly, PDF & Email

Comentarios

Hola, Albert.

El programa saldrá del bucle while(cin) cuando ya no queden más datos por leer, es decir, cuando se llegue al final del fichero si se está leyendo datos de un fichero o cuando el usuario indique que se acaba la entrada (por ejemplo, presionando control+Z en terminales Windows o control+D en terminales Linux). El código que pongas después del bucle se ejecutará en ese momento y ahí podrás procesar toda la entrada.

Hay que decir que en el contexto de la programación competitiva la razón por la que hay que saber hacer este tipo de bucles es porque en varios jueces online (en particular jutge.org, que alberga muchos problemas de ediciones de la OIE anteriores) la entrada viene dada por varios casos (sin especificar cuántos) que hay que tratar por separado, así que lo que se hace es un bucle while(cin) en el que en cada iteración se trata un caso de entrada. En esta situación no hay que hacer nada después de salir del while(cin).

#include <iostream>
#include <vector>
using namespace std;
bool Primo(int n)
{
if(n==0 || n==1 || n==4) return false;
for(int i=2;i<n/2;i++)
{
if(n%i==0)return 0;
}
return true;

}
int main()
{
//vector<int> res;
int a,b,n,c;
int cont=0;
while(cin>>a>>b>>n)
{
if(!a)
break;
cont=0;
if(n==1 && Primo(a)==true)
{
cout<<a;
}
else
{
while(true)
{
c=a;
if(Primo(c)==true){

cont++;
}
a=c+b;
if(cont==n)
break;
}
cout<<c;
}
}
return 0;
}
//LO MALO ES QUE AUN SIGUE PIDIENDO DATOS CUANDO TERMINO DE INSERTARLOS

Hola,

Para que el programa deje de leer la entrada, tienes que indicarle que se ha acabado la entrada de algún modo (Control+Z o Control+D sirven en la mayoría de terminales). Creo que el tema de leer la entrada tu programa lo hace bien.

Una cosa que le pasa a tu programa es que entra en bucles infinitos (por ejemplo, cuando a y b no son coprimos). No sé si esa es tu intención...

Añadir nuevo comentario

Texto sin formato

  • No se permiten etiquetas HTML.
  • Saltos automáticos de líneas y de párrafos.
  • Las direcciones de correos electrónicos y páginas web se convierten en enlaces automáticamente.