elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Empezando en C y con problemas que google y el libro no me solucionan.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Empezando en C y con problemas que google y el libro no me solucionan.  (Leído 3,869 veces)
Lotharsan

Desconectado Desconectado

Mensajes: 6



Ver Perfil
Empezando en C y con problemas que google y el libro no me solucionan.
« en: 22 Marzo 2012, 20:26 pm »

Estoy empezando con C, siguiendo el libro "Guia de autoenseñanza" de Herbert Schildt con Code::Blocks en Ubuntu 11.10.

Realizo los ejercicios del libro y empiezo teniendo problemas con las librerias, como conio.h, la cual he encontrado en google que puedo sustituir con ncurses.h...

Cuando realizo un simple programa y en el libro usan getche() yo uso getchar();
pero he aquí mis problemas...

en un programa simple como:
Código:
/* Programa que lee diez letras. Después de que haya leído las letras, muestra la que está en primer lugar en el alfabeto (la que tiene menor valor) de las introducidas. */

#include "stdio.h"

main()
{
    char ch, menor='z';
    int i;

    for(i=1; i<11; i++)
    {
       printf("Introduce la letra número %d: ", i);
       ch = getchar();
       if(ch<menor) menor=ch;
    }

    printf("La letra de menor valor introducida ha sido %c", menor);
}


Diréctamente me salta siempre un getchar(), haciendo solo la 1ª, 3ª... y llenando con un espacio en blanco ch en la 2ª, 4ª....

buscando en google encontré como limpiar el buffer antes del getchar... pero que si quieres arroz Catalina.... el programa hace exáctamente lo mismo....

No queriendo estancarme horas buscando un porqué sigo con el siguiente ejercicio:

Código:
/* Programa que alcula el área de un círculo, rectángulo o triángulo utilizando una escalera if-else-if */

#include "stdio.h"

main()
{
    int b, a;
    float r;
    char op;

    printf("¿qué área quieres calcular? Rectángulo, Triángulo o Círculo: ");
    fflush(stdin);
    op = getchar();

    if(op=='R'||'r')
    {
        printf("Introduce la base: ");
        scanf("%d", &b);
        printf("Introduce la altura: ");
        scanf("%d", &a);
        printf("El área del rectángulo es: %d", b*a);
    }
    else if(op=='T'||'t')
        {
            printf("Introduce la base: ");
            scanf("%d", &b);
            printf("Introduce la altura: ");
            scanf("%d", &a);
            printf("El área del triángulo es: %d", (b*a)/2);
        }
        else if(op=='C'||'c')
            {
                printf("Introduce el radio: ");
                scanf("%f", &r);
                printf("El área del círculo es: %f", 3.141592*r*r);
            }

}


y he aquí que el programa decide que da igual si a la hora de introducir un caracter por teclado le introduces una T, una C..... porque solo realiza el primer if...

¿dónde está todo el problema este de lidiar con este editor, o sistema o son las funciones, compilador, librerias.....? ya me lo empiezo a plantear todo....

¿alguna ayuda?


En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: Empezando en C y con problemas que google y el libro no me solucionan.
« Respuesta #1 en: 22 Marzo 2012, 21:38 pm »

Hola Lotharsan! La libreria conio.h no es estandar, solo lo podes utilizar en window, por eso tenes problemas en Ubuntu. Mas adelante si queres investiga acerca de ncurses pero por ahora no t lo recomiendo.
Antes de pasar a los codigos vi algo comun en los dos programas, q es: #include "stdio.h". A menos q hayas creado tu propia libreria( cosa q no creo) el include deberia ir asi #include <stdio.h>... Ahora los codigos:
Para solucionar el problema del getchar(), al lado pone fflush(stdin); limpia el bufer utilizado por el teclado, en este caso limpiaria el enter (algunos expertos dicen q es mala practica usar fflush pero en un ejercicio tan simple no veo el inconveniente :))

Para el segundo programa siempre toma el primer if xq tenes mal las condiciones. Deberia ser:
if(op=='R'||op=='r')
else if(op=='T'||op=='t')
else if(op=='C'||op=='c')

Espero te sirva mi respuesta, saludos


En línea

Ahorrate una pregunta, lee el man
Lotharsan

Desconectado Desconectado

Mensajes: 6



Ver Perfil
Re: Empezando en C y con problemas que google y el libro no me solucionan.
« Respuesta #2 en: 22 Marzo 2012, 21:59 pm »

Gracias por la respuesta.... en cuanto al #include, en el libro que menciono viene explicado que puedo introducir la libreria entre comillas como me indicas, y el compilador me lo acepta sin problemas.
De todas formas he probado tu opción y el resultado no varía.... sigue pasando lo mismo después de añadir el fflush(stdin); que como ya había mencionado
Citar
buscando en google encontré como limpiar el buffer antes del getchar... pero que si quieres arroz Catalina.... el programa hace exáctamente lo mismo....
incluso después del getchar(), sigue dando el mismo resultado nefasto.... no entiendo porqué realiza ese salto a cada repetición.

y en cuanto al segundo programa.... tienes toda la razón... muchas gracias.

Me sigue quedando la duda del primer programa. Agradezco cualquier consejo.
En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: Empezando en C y con problemas que google y el libro no me solucionan.
« Respuesta #3 en: 23 Marzo 2012, 03:12 am »

Hola! que raro que siga pasando lo mismo con el fflush despues del getchar, lo probe yo y me anduvo normal.. Bueno te explico mas o menos el error nefasto q te da el getchar(aunq creo q ya lo sabes): cuando vos ingresas un caracter,ej 'x', por teclado inmediatamente ingresas el ENTER el cual tambien es un caracter, entonces tanto el caracter 'x' como el ENTER se almacenan en el bufer del teclado. En la primera llamada a getchar lo que va a hacer es agarrar ese primer caracter 'x' y almacenarlo en ch, luego en el siguiente ciclo del for getchar va a agarrar el caracter ENTER y tambien lo va a almacenar en ch. Es por esto q solo podes ingresar caracteres en el 1º, 3º, 5º... getchars

Como dijist q ch=getchar();fflush(stdin); no te funciona proba con lo siguiente:
scanf("%c",&ch);getchar();
El %c es para ingresar caracteres. Lo malo de ingresar caracteres con scanf es que tambien se almacena el ENTER, es por eso que pongo el getchar, para que lo tome del bufer

Espero se haya entendido algo, no soy muy bueno explicando

Saludos
En línea

Ahorrate una pregunta, lee el man
Lotharsan

Desconectado Desconectado

Mensajes: 6



Ver Perfil
Re: Empezando en C y con problemas que google y el libro no me solucionan.
« Respuesta #4 en: 23 Marzo 2012, 18:25 pm »

Hola,
Gracias por la respuesta....
No es una solución óptima, pero sabiendo que no es correcto pero permitiendome seguir con los ejercicios, he optado por realizar lo que me has aconsejado, vaciando el buffer y poniendo un segundo getchar().... de esta forma sí que realiza los pasos a seguir...

No sé si será por el compilador usado en el sistema que uso, aunque sospecho que los tiros van por ahí....

Gracias de todas formas, con esto puedo continuar.
En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Empezando en C y con problemas que google y el libro no me solucionan.
« Respuesta #5 en: 26 Marzo 2012, 15:20 pm »

¡Buenas!

fflush SOLO SE DEBE UTILIZAR SOBRE FLUJOS DE SALIDA. El funcionamiento sobre flujos de entrada queda indefinido.

En sistemas GNU/Linux, no te va a vaciar el buffer de entrada. Lo que te esta sucediendo es que despues de cada tecla estas pulsando intro, y este queda en la entrada, por lo tanto, el siguiente getchar te leera ese intro y pasara a leer el siguiente par letra+intro.

Despues de realizar cualquier lectura de teclado que sepas que no elimina el salto de linea que introduces al pulsar intro, tienes que terminar de leer la entrada, asi cuando llegue la siguiente lectura no tendras problemas ni comportamientos imprevistos. Utiliza este codigo para terminar de leer la entrada:

Código
  1. int c;
  2.  
  3. //tu lectura
  4. //y ahora vacias el buffer de entrada
  5. while((c = getchar()) != '\n' && c != EOF);
  6.  

Lo que acabamos de hacer es leer hasta que encontremos un salto de linea o hasta que llegue EOF. Lo primero que suceda.

Por cierto, no es que conio sea especifica de windows, es especifica de Borland.

¡Saludos!
« Última modificación: 26 Marzo 2012, 15:22 pm por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Lotharsan

Desconectado Desconectado

Mensajes: 6



Ver Perfil
Re: Empezando en C y con problemas que google y el libro no me solucionan.
« Respuesta #6 en: 29 Marzo 2012, 12:44 pm »

Muchas gracias por la información.... voy a probarlo...
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Libro de visitas...problemas al actualizar la pagina F5
PHP
Lupin 7 4,665 Último mensaje 10 Septiembre 2010, 02:45 am
por Lupin
Empezando en C#: Mis problemas con TreeView
.NET (C#, VB.NET, ASP)
Debci 4 6,635 Último mensaje 18 Octubre 2010, 15:55 pm
por Debci
Descargar libro de google? con JDownloader? « 1 2 »
Software
nichihack 16 11,898 Último mensaje 3 Mayo 2012, 16:04 pm
por Maldito karma
Solucionan una vulnerabilidad en ListaRobinson.es
Noticias
wolfbcn 0 1,264 Último mensaje 27 Octubre 2010, 15:40 pm
por wolfbcn
Google y Samsung solucionan el problema de Android que afecta al 95% de ...
Noticias
wolfbcn 0 1,175 Último mensaje 6 Agosto 2015, 01:42 am
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines