Alguien podria ayudarme a encontrar el error?

Si eres principiante y tienes alguna consulta entra en este foro.
Responder
Mensaje
Autor
Avatar de Usuario
JoelC07
Mensajes: 7
Registrado: 01/04/2018 2:47 pm

Alguien podria ayudarme a encontrar el error?

#1 Mensaje por JoelC07 » 01/04/2018 3:17 pm

Hola a todos! Espero que alguien pueda ayudarme a encontrar el error. Probé con version de windows 7,8 y 10 de 64bits. Dudo que sea eso, pero en las recomendaciones me aclara que especifique eso.
El programa consiste en ingresar una cantidad determinada de caracteres (letras), e imprimir en pantalla si son vocales o consonantes. El error que tengo es el siguiente: cuando yo ingreso la cantidad de caracteres (por ejemplo 5) toma a todas las letras que yo ingrese como consonantes, sin embargo cuando yo, en vez de ingresar el numero 5, pongo cualquier caracter (por ejemplo una letra) el programa discrimina entre consonantes y vocales. Espero me entiendan y puedan ayudarme. Cualquier duda estaré para contestarlas y muchas gracias desde ya. Aquí el enunciado y el programa:


Código: Seleccionar todo

[i]/*Definir una estructura cuyos campos permitan guardar la cantidad de 
caracteres que sean vocales y la cantidad que sean consonantes. Ingresar N 
caracteres, y contabilizar en la estructura definida los caracteres de acuerdo a su 
tipo (vocales o consonantes).*/[/i] 


#include<stdio.h> 
#include <ctype.h> 

typedef struct 
	{ 
		int cV; //contador de vocales 
		int cC; //contador de consonantes 
	}contador; 

int main() 
{ 
contador c; 
char car,carM; 
int N,n=0; 
printf("Ingrese la cantidad de caracteres a guardar: "); 
scanf("%d",&N); 
while(N<0) 
	{ 
		printf("Ingrese la cantidad de caracteres a guardar: "); 
		scanf("%d",&N); 
	} 
c.cV=0; 
c.cC=0;	
while(n<N) 
	{ 
		n++; 
		printf("Ingrese un caracter: "); 
		scanf("%c",&car); 
		fgetc(stdin); 
		carM=toupper(car); 
		if(carM=='A'||carM=='E'||carM=='I'||carM=='O'||carM=='U') 
			{ 
				printf("Vocal\n");	//Puse esta linea para ver si entraba al "if" o saltaba al "else" 
				c.cV++; 
			} 
		else 
			{ 
				printf("Consonante\n"); //Esta linea es lo mismo que arriba. Quería saber si la leía 
				c.cC++; 
			} 
	} 
printf("Hay %d vocales y %d consonantes",c.cV,c.cC);	

return 0; 
}

mollok
Mensajes: 521
Registrado: 30/01/2018 9:47 am
Ubicación: Mallorca, España

Re: Alguien podria ayudarme a encontrar el error?

#2 Mensaje por mollok » 01/04/2018 4:52 pm

Este es el resultado que obtengo:
Ingrese la cantidad de caracteres a guardar: 5
Ingrese un caracter: a
Vocal
Ingrese un caracter: f
Consonante
Ingrese un caracter: y
Consonante
Ingrese un caracter: u
Vocal
Ingrese un caracter: e
Vocal
Hay 3 vocales y 2 consonantes
while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}

Avatar de Usuario
JoelC07
Mensajes: 7
Registrado: 01/04/2018 2:47 pm

Re: Alguien podria ayudarme a encontrar el error?

#3 Mensaje por JoelC07 » 01/04/2018 4:54 pm

Esto me ocurre si ingreso un caracter numerico:

Ingrese la cantidad de caracteres a guardar: 5
Ingrese un caracter: a
Consonante
Ingrese un caracter: e
Consonante
Ingrese un caracter: c
Consonante
Ingrese un caracter: u
Consonante
Ingrese un caracter: y
Consonante
Hay 0 vocales y 5 consonantes

Y esto si ingreso "accidentalmente" un caracter alfabetico:

Ingrese la cantidad de caracteres a guardar: e
Ingrese un caracter: Vocal
Ingrese un caracter: a
Vocal
Ingrese un caracter: e
Vocal
Ingrese un caracter: c
Consonante
Ingrese un caracter: u
Vocal
Ingrese un caracter: y
Consonante
Ingrese un caracter: b
Consonante
Ingrese un caracter: ... Y asi infinitamente

Perdon por editar tantas veces la respuesta
New Programmer

Avatar de Usuario
daltomi
Mensajes: 354
Registrado: 28/04/2007 7:29 pm
Ubicación: Argentina

Re: Alguien podria ayudarme a encontrar el error?

#4 Mensaje por daltomi » 01/04/2018 6:27 pm

Buenas.

El problema es que scanf no maneja los saltos de linea (Enter).
Prueba, por el momento, si colocando fgetc después de los 2 primeros scanf (el último ya lo tiene) soluciona el problema.

Avatar de Usuario
JoelC07
Mensajes: 7
Registrado: 01/04/2018 2:47 pm

Re: Alguien podria ayudarme a encontrar el error?

#5 Mensaje por JoelC07 » 01/04/2018 7:47 pm

Decís que ponga el fgetc después de leer el número N? No sería innecesario ya que el problema se genera únicamente cuando quiere leer caracteres tipo chat?
New Programmer

Avatar de Usuario
daltomi
Mensajes: 354
Registrado: 28/04/2007 7:29 pm
Ubicación: Argentina

Re: Alguien podria ayudarme a encontrar el error?

#6 Mensaje por daltomi » 01/04/2018 8:32 pm

El problema no es el tipo que lee sino que tiene que ver con un buffer interno de la librería estándar de C.
En dicho buffer(espacio de memoria) queda el salto de línea (al presionar Enter) ('\n') y nadie lo consume.
Al llamar a scanf se encuentra con el salto de línea y suceden cosas raras.
Existen muchas formas de lidiar con esto, setbuf, fgets + sscanf, etc.
La manera mas rápida es después del scanf llamara a alguna función que "consuma" ese salto de línea, por eso el fgetc(stdin).

Un ejemplo fgets + sscanf:

Código: Seleccionar todo

#include<stdio.h> 
#include<ctype.h> 

struct contador
{ 
    unsigned int vocales;
    unsigned int consonantes;
}; 

/* 
  Evita el uso de scanf.
  En su lugar usamos ésta función para leer y
  sscanf para obtener el resultado del formato.
*/
const char * leer()
{
    static char linea[100];
    fgets(linea, sizeof(linea), stdin);
    return linea;
}


int main() 
{ 
    struct contador contador = { .vocales = 0, .consonantes = 0}; 
    int caracteres = 0;

    do  {
        printf("Ingrese la cantidad de caracteres a guardar: "); 
        sscanf( leer(), "%d", &caracteres); 

    } while (caracteres <= 0);


    for(; caracteres; caracteres--)
    {
        char letra;

        printf("Ingrese una letra: "); 
        sscanf( leer(), "%c", &letra); 

        switch (toupper(letra))
        { 
            case 'A':
            case 'E':
            case 'I':
            case 'O':
            case 'U':
                puts("Vocal.");
                ++contador.vocales;
                break;
            default:
                puts("Consonante.");
                ++contador.consonantes;
        } 
    }

    printf("Hay %d vocales y %d consonantes.\n", contador.vocales, contador.consonantes);
    return 0; 
}

Avatar de Usuario
JoelC07
Mensajes: 7
Registrado: 01/04/2018 2:47 pm

Re: Alguien podria ayudarme a encontrar el error?

#7 Mensaje por JoelC07 » 01/04/2018 8:40 pm

Recién pude resolver el problema como me lo sugeriste anteriormente. Muchas gracias por tu ayuda! Ahora leeré el que hiciste porque hay varias cosas que no conozco.
New Programmer

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 4 invitados