[C con Clase] X-files en c++

Fabian Arenas lordjerhyn en gmail.com
Mar Oct 14 19:53:41 CEST 2008


El 14 de octubre de 2008 2:20, bameda <bameda en gmail.com> escribió:

> Hola listeros,
>
> tratando de enseñar C++ me ha pasado un caso muy extraño:
>
>
> ///codigo:
> include <stdio.h>
>
>
> int main(){
>    // Para controlar las iteraciones.
>    int i;
>    // Para contar el numero de vocales.
>    int vocales = 0;
>    // Para guardar los caracteres que se leen por teclado.
>    char caracter;
>
>    // Repetir 10  veces (desde que i = 0, mientras i < 10)
>    for (i = 0; i < 10; i++){
>        // Imprimir
>        printf("Introduzca el caracter %i:\t", i + 1);
>        // Leemos un caracter
>        scanf("%c", &caracter);
>
>        // si el caracter leido es a,e,i,o,u,A,E,I,O,U
>        if (caracter == 'a' || caracter == 'A' || caracter == 'e' ||
> caracter == 'E' || caracter == 'i' || caracter == 'I' || caracter ==
> 'o' || caracter == 'O' || caracter == 'u' || caracter == 'U'){
>            // Aumentamos en 1 el numero de vocales
>            vocales++;
>        } // fin if
>
>    } // fin for
>
>    // Imprimimos numero de vocales
>    printf("- Numero de Vocales: %i\n", vocales);
>    // Imprimimos numero de no vocales (10 - vocales)
>    printf("- Numero de Otros caracteres: %i\n", 10 - vocales);
>
> } // fin mains


mmmm bueno ... la solucion para tu problema es simple ... primero que nada
... agregar el GATO "#" antes del include ... naaaaaaaa broma .... la
solucion es colocar fflush(stdin); .................. te lo explico ... como
alguien dijo anteriormente, no es recomendado, y es una muy mala practica,
el que recibas 2 caracteres, siendo estos el de entrada tuyo, y el otro el
ENTER, ya que cada vez que presiones enter tendras este problema ... y estar
gastando memoria en una variable ( para enter ) .. en la que no se deberia
gastar ... es realmente absurdo ....

Tu problema pasa por el caso de que se esta mandado 2 variables (  una letra
y un enter ), pero se esta reciviendo solo 1 ... la primera en este caso
.... y bueno ... esto provoca que el buffer de teclado se desalinie ... y
por consiguiente las dobles impresiones que sufres .... para solucionar
esto, solo basta poner el fflush(stdin); ( funcion pertenecionte al estandar
de C ), que eliminara ( no la almacenara ni reservara espacio en memoria...
) cualquier entrada adicional que realices ... y que sobre de lo pedido ..
que en este caso es un solo caracter ...

Bueno ... espero haberme explicado con claridad .....

Sl2

>
>
> Este código da error:
> $ ./prueba
> Introduzca el caracter 1:       a
> Introduzca el caracter 2:       Introduzca el caracter 3:       e
> Introduzca el caracter 4:       Introduzca el caracter 5:       i
> Introduzca el caracter 6:       Introduzca el caracter 7:       o
> Introduzca el caracter 8:       Introduzca el caracter 9:       u
> Introduzca el caracter 10:      - Numero de Vocales: 5
> - Numero de Otros caracteres: 5
>
>
>
> en cambio
>
> ///codigo
> #include <stdio.h>
>
>
> int main(){
>    // Para controlar las iteraciones.
>    int i;
>    // Para contar el numero de vocales.
>    int vocales = 0;
>    // Para guardar los caracteres que se leen por teclado.
>    char caracter;
>
>    // Repetir 10  veces (desde que i = 0, mientras i < 10)
>    for (i = 0; i < 10; i++){
>        // Imprimir
>        printf("Introduzca el caracter %i:\t", i + 1);
>        // Leemos un caracter
>        scanf("%c", &caracter);
>
>        // si el caracter leido es a,e,i,o,u,A,E,I,O,U
>        if (caracter == 'a' || caracter == 'A' || caracter == 'e' ||
> caracter == 'E' || caracter == 'i' || caracter == 'I' || caracter ==
> 'o' || caracter == 'O' || caracter == 'u' || caracter == 'U'){
>            // Aumentamos en 1 el numero de vocales
>            vocales++;
>        } // fin if
>        scanf("%c", &caracter); //Leemos el ENTER
>    } // fin for
>
>    // Imprimimos numero de vocales
>    printf("- Numero de Vocales: %i\n", vocales);
>    // Imprimimos numero de no vocales (10 - vocales)
>    printf("- Numero de Otros caracteres: %i\n", 10 - vocales);
>
> } // fin main
>
> este no:
> $ ./prueba
> Introduzca el caracter 1:       a
> Introduzca el caracter 2:       e
> Introduzca el caracter 3:       i
> Introduzca el caracter 4:       o
> Introduzca el caracter 5:       u
> Introduzca el caracter 6:       q
> Introduzca el caracter 7:       q
> Introduzca el caracter 8:       q
> Introduzca el caracter 9:       q
> Introduzca el caracter 10:      q
> - Numero de Vocales: 5
> - Numero de Otros caracteres: 5
>
> Alguien sabe como puedo corregir el primer código sin añadir
> "scanf("%c", &caracter); //Leemos el ENTER"???
>
>
> Gracias
> ____________________________________________
> |
> |    David Barragán Merino
> |    E-mail: bameda en ARROBA@gmail.com
> |    Ingeniería Informática
> |    Universidad Carlos III Madrid
> |____________________________________________
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>



-- 
Fabian Arenas L.
Estudiante de Ingeniería en Informática. UTEM
Web: http://eterniosilicio.blogspot.com/
Linux Registered User #476277 - http://counter.li.org/
Si nada te resulta.......Rutea el algoritmo po GIL!!!
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20081014/35584a12/attachment.html>


Más información sobre la lista de distribución Cconclase