[Ayuda]Problema con variables

Iniciado por FrancoMoglia, 6 Abril 2016, 04:57 AM

0 Miembros y 2 Visitantes están viendo este tema.

FrancoMoglia

Que tal gente del foto, es mi primer post, sepan disculpar los errores...

tengo un problema con la programacion en C, estoy utilizando la IDE ZinjaI.

el problema es que escribo mi codigo pero al momento de la ejecucion, pide que se ingrese un caracter/numero y los toma de a dos, es decir se saltea uno... les dejo imagenes por si no se entendio lo que he escrito..

Mod: Imágenes dirigen a site erroneo

PARA EVITAR LO DE LAS IMAGENES, LES PASO EL PROPIO CODIGO COMPLETO:
#include <stdio.h>
#include <conio.h>
int main()
{
   /*realizar un programa que permita:
   a) ingresar 15 caracteres.
   b)calcular la cantidad de vocales.
   c) indicar la cantidas de vocales por tipo
   d)usar sentencia switch*/
   char a;
   int conta,conte,conti,conto,contu,cont;
   cont=0;
   conta=0;
   conte=0;
   conti=0;
   conto=0;
   contu=0;
   while(cont<15)
   {
      printf("Ingrese un caracter:\n");
      scanf("%c",&a);
      switch(a){
      case 'a':conta++;break;
      case 'e':conte++;break;
      case 'i':conti++;break;
      case 'o':conto++;break;
      case 'u':contu++;break;
      default:cont++;break;
      }
      cont++;
   }
   printf("La cantidad de 'a' introducidas fueron %d\n",conta);
   printf("La cantidad de 'e' introducidas fueron %d\n",conte);
   printf("La cantidad de 'i' introducidas fueron %d\n",conti);
   printf("La cantidad de 'o' introducidas fueron %d\n",conto);
   printf("La cantidad de 'u' introducidas fueron %d\n",contu);
   return 0;
}

Y EL ERROR OCURRE ASI:

Ingrese un caracter:
a
Ingrese un caracter:
Ingrese un caracter:
a
Ingrese un caracter:
Ingrese un caracter:
..
etc..

engel lex

puedes publicar la sección de código respectiva al problema (las imagenes estaban mal direccionadas)

si lo haces procura usar las etiquetas GeSHi
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

class_OpenGL

El error ocurre porque cuando tu introduces un carácter en la consola y le das a enter para confirmas, en realidad estás enviando el carácter que has escrito más el carácter de fin de línea (en C representado con '\n'). Entonces, después de leer cada carácter, tendrías que limpiar el búfer de stdin. Sé como se hace en C++, pero no en C, eso quiere decir que el código que te voy a mostrar para limpiar el búfer quizás no funcione.

while('\n' != fgetc(stdin));

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

FrancoMoglia

muchas gracias por responder, la pregunta surge porque mi profesora no me quiso enseñar, me dijo que busque en foros, asi que mucho no entiendo, podrias mostrarme en que parte del codigo que yo pase, va ese fragmento que tu me dices? muchas gracias

class_OpenGL

Va después de cada vez que uses scanf, fgec o demás funciones para leer datos desde la consola. Es importante que sepas por qué usas esa línea. Lo que hace esa línea es leer todos los caracteres de la consola que no se han leído por ciertas circunstancias. Por ejemplo, el que es tu caso, lees un carácter de la consola, pero cuando envías ese carácter desde la consola, estás enviando ese carácter más un carácter de fin de línea (se genera cuando pulsas enter). Entonces, cuando lees con scanf("%c", ...);, estás leyendo un carácter pero dejando el salto de línea sin leer. Por eso, después de usar scanf leemos todos los caracteres hasta que hayas leído un salto de línea.

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

FrancoMoglia

Muchisimas gracias por responder y tomarte el tiempo de explicarme, sobre todo porque soy nuevo en esto de programar y la profesora no quiso explicarme que estaba sucediendo, de nuevo gracias por tu tiempo, ya comprobe el codigo y ahora funciona perfectamente. Saludos