Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Leer valores distintos de cero y terminar el programa con 0 sin imprimirlo

Estas en el tema de Leer valores distintos de cero y terminar el programa con 0 sin imprimirlo en el foro de C/C++ en Foros del Web. Código: #include <stdio.h> #include <stdlib.h> /* Tema: III. Estructuras Repetitivas 3. Escriba un programa que lea e imprima una serie de números distintos de cero. ...
  #1 (permalink)  
Antiguo 10/04/2015, 13:36
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 4 meses
Puntos: 5
Pregunta Leer valores distintos de cero y terminar el programa con 0 sin imprimirlo

Código:
#include <stdio.h>
#include <stdlib.h>
 
/*
Tema: III. Estructuras Repetitivas
 
3. Escriba un programa que lea e imprima una serie de números distintos de cero.
El algoritmo debe terminar con un valor de cero que no se debe imprimir.
Además de visualizar la cantidad de valores leídos.
*/
 
int main()
{
    //Declaración de variables
    int liNumero, liContadora = 0;
 
    //Entrada de datos
    while (liNumero != 0)
    {
        liContadora++;
 
        printf("Ingrese un n%cmero: ", 163);
        scanf("%d", &liNumero);
    }
 
    //Procesamiento
 
    //Salida de datos
    printf("\nCantidad de valores le%cdos: %d\n", 161, liContadora - 1);
 
    return 0;
}
Llevo ese código, pensé que al ser 0 no entraría al WHILE, además como puedo imprimirlos si no se puede utilizar arreglos.

Alguien puede ayudarme con estas dos cosas, alguna idea?.
  #2 (permalink)  
Antiguo 10/04/2015, 13:52
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Leer valores distintos de cero y terminar el programa con 0 sin imprimirlo

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(){
  5.     int liNumero, liContadora = 0;
  6.  
  7.     do {
  8.        
  9.         printf("Ingrese un n%cmero: ", 163);
  10.         scanf("%d", &liNumero);
  11.        
  12.         liContadora++;
  13.     }while( !(liNumero == 0) );  //mientras numero no sea igual a cero...
  14.    
  15.     printf("\nCantidad de valores le%cdos: %d\n", 161, liContadora - 1);
  16.  
  17.     return 0;
  18. }
Aun que no creo que sea eso que te han pedido. Creo que lo mejor seria guardar en un array y imprimirlo al fin.
  #3 (permalink)  
Antiguo 10/04/2015, 14:30
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Leer valores distintos de cero y terminar el programa con 0 sin imprimirlo

yo opino igual porque si no dime como haces para no imprimir el 0. Solo se me ocurre un modo y seria hookear el teclado y no creo que sea lo que te pidan XD
  #4 (permalink)  
Antiguo 10/04/2015, 17:22
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 4 meses
Puntos: 5
Respuesta: Leer valores distintos de cero y terminar el programa con 0 sin imprimirlo

yo opino lo mismo, el 0 aparecerá obligado ya que debes darlo como entrada para finalizar el programa.

simplemente con esto:
liContadora - 1
no tomo en cuenta el valor 0, es lo único lógico sin usar arreglos.
  #5 (permalink)  
Antiguo 20/04/2015, 20:44
 
Fecha de Ingreso: abril-2015
Mensajes: 1
Antigüedad: 9 años
Puntos: 0
Respuesta: Leer valores distintos de cero y terminar el programa con 0 sin imprimirlo

Hola. Soy nuevo en el foro, y creo se puede hacer una solución un poco "viva" para esta situación:
Tengan en cuenta este código en c++, simple, pero el cual resuelve el problema

include <iostream>
using namespace std;

int main() {

int a,b,c;

int a=b=c=5;

cout<<a<<b<<c<<"\b"<<" ";

return 0;

}
En este caso, lo que se hace es imprimir todos los números de seguido, cuando se llega al último de ellos se retrocede el puntero(la rayita _ que aparece en la pantalla de msdos) y se imprime un espacio, el cual reemplaza al último valor. Eso "impide que se vea al valor" aunque esté almacenado en la memoria.
Podrias aplicar el mismo criterio, cuando llegues al momento de imprimir el último elemento, que será el cero, dile al compilador que imprima \b y luego un espacio en blanco.
Como dije previamente, es un poco "avivado" :)
  #6 (permalink)  
Antiguo 21/04/2015, 00:59
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Leer valores distintos de cero y terminar el programa con 0 sin imprimirlo

Cita:
Iniciado por Kike87 Ver Mensaje
Hola. Soy nuevo en el foro, y creo se puede hacer una solución un poco "viva" para esta situación:
Tengan en cuenta este código en c++, simple, pero el cual resuelve el problema

include <iostream>
using namespace std;

int main() {

int a,b,c;

int a=b=c=5;

cout<<a<<b<<c<<"\b"<<" ";

return 0;

}
En este caso, lo que se hace es imprimir todos los números de seguido, cuando se llega al último de ellos se retrocede el puntero(la rayita _ que aparece en la pantalla de msdos) y se imprime un espacio, el cual reemplaza al último valor. Eso "impide que se vea al valor" aunque esté almacenado en la memoria.
Podrias aplicar el mismo criterio, cuando llegues al momento de imprimir el último elemento, que será el cero, dile al compilador que imprima \b y luego un espacio en blanco.
Como dije previamente, es un poco "avivado" :)
Bienvenido al foro.

Tres cosillas:

  • El código decóralo con la etiqueta del lenguaje que corresponda (mira el desplegable "Highlight" al escribir el mensaje)
  • Estaría bien que el código compilase (falta la '#' del include y el 'int' de a=b=c=5 sobra ;) )
  • No veo qué tiene que ver este código con la pregunta realizada por RGT
Cita:
Iniciado por RGT Ver Mensaje
Llevo ese código, pensé que al ser 0 no entraría al WHILE, además como puedo imprimirlos si no se puede utilizar arreglos.

Alguien puede ayudarme con estas dos cosas, alguna idea?.

Tu código tiene dos problemas:


  • liNumero no está incializado... esto implica que, aunque dificil, se puede dar que el valor inicial de liNumero fuese 0 y tu programa fallaría
  • liContadora lo inicializas a 0 y lo incrementas cada vez que entras en el while antes incluso de pedir el valor, luego liContadora SIEMPRE va a valer 1 o más aunque el primer valor introducido sea 0. Prueba a inicializar liContadora a -1

También puedes evitar la incialización de liNumero cambiando el while por un do-while:

Código C++:
Ver original
  1. int main()
  2. {
  3.     //Declaración de variables
  4.     int liNumero, liContadora = -1;
  5.  
  6.     //Entrada de datos
  7.     do
  8.     {
  9.         liContadora++;
  10.  
  11.         printf("Ingrese un n\243mero: ", 163);
  12.         scanf("%d", &liNumero);
  13.     } while (liNumero != 0);
  14.  
  15.     //Procesamiento
  16.  
  17.     //Salida de datos
  18.     printf("\nCantidad de valores le\241dos: %d\n", liContadora);
  19.  
  20.     return 0;
  21. }

Aunque también puedes inicializar liContadora a 0 e incrementar su valor únicamente si el usuario introduce un valor diferente a 0.

Código C++:
Ver original
  1. int main()
  2. {
  3.     //Declaración de variables
  4.     int liNumero, liContadora = 0;
  5.  
  6.     //Entrada de datos
  7.     do
  8.     {
  9.         printf("Ingrese un n\243mero: ");
  10.         scanf("%d", &liNumero);
  11.     } while (liNumero != 0 && ++liContadora);
  12.  
  13.     //Procesamiento
  14.  
  15.     //Salida de datos
  16.     printf("\nCantidad de valores le\241dos: %d\n", liContadora);
  17.  
  18.     return 0;
  19. }

La comparación del while funciona así:

  • Primero se ejecuta la comparación liNumero!=0. Si ésta no se cumple, al ser una operación AND, el programa dejará de comparar y saldrá del while. (FALSE && X ) == FALSE
  • Si la condición se cumple, el programa necesita realizar la segunda comparación para saber si debe ejecutar el do-while de nuevo... en este caso hace un preincremento de liContadora. Como el valor inicial de liContadora es 0, el preincremento siempre valdrá 1 o más, que, al ser diferente de 0, hará que el compilador lo trate como si se tratase de un TRUE. Al final el contador se incrementa y el bucle se vuelve a ejecutar.


Un saludo

Última edición por eferion; 21/04/2015 a las 01:13

Etiquetas: arreglo, cero, distintos, int, numero, programa, terminar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:22.