[DUDA] Contador de vocales. Medio-Solucionado xD

Iniciado por pitka, 29 Noviembre 2010, 13:37 PM

0 Miembros y 1 Visitante están viendo este tema.

pitka

Buenas, llevo un tiempo leyendo el foro, y me parece espectacular y decidi registrarme ya que veo que tienen la disposicion de ayudar a personas que no saben como yo, de antemano gracias!

Entrando al tema mi duda es la siguiente, estoy aprendiendo c/c++, he estado tratando de hacer un programa que cuente las vocales de un texto ingresado por teclado lo cual he logrado, pero no puedo hacer que finalice el texto al introducir uncaracter especifico (ejemplo un "@" o ".") para finalizar sin tener que darle enter, ademas de que tambien me gustaria usar un ciclo para repetir todo mientras el usuario quiera, pero se me embasuran las variables y ni idea de como limpiarlas de nuevo, estuve leyendo aqui en busca de una funcion llama fflush, pero segun lei no es lo que necesito http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html
lo que lei en ese enlace me ayudo, porque me habian dicho que necesitaba usar "gets", buen esa es mi duda ya me extendi, mucho esto es lo que llevo de codigo
por cierto me ayude con unos codigos que encontre en internet pero ninguno me dijo lo que necesitaba por eso me anime a preguntar despues de que busque  :D



modificacion

he conseguido hacer un ciclo, y solucione lo del "embasuramiento del buffer" aunque aun no tengo muy claros los conceptos, lo arregle usando esto.. que encontre en muchas partes  #define BORRA_BUFFER while( getchar() != '\n'); y luego agregue BORRA_BUFFER al final del ciclo antes de evaluar la condicion, y se soluciona, pero me surgio una duda con respecto a esa macros.. y es que hace exactamente?? gracias..

Leber

Para repetir cuando el usuario quiera, tendras que hacer un bucle, con un do-while te bastaria. Comparas su entrada com por ejemplo un exit.

do {
             
         }while(strcmp(cadena_usuario, "exit") != 0)



"Solo los tontos carecen de preucupaciones." Johann Wolfgang Goethe

pitka

#2
Cita de: Leber en 30 Noviembre 2010, 01:08 AM
Para repetir cuando el usuario quiera, tendras que hacer un bucle, con un do-while te bastaria. Comparas su entrada com por ejemplo un exit.

do {
           
        }while(strcmp(cadena_usuario, "exit") != 0)





Lo hice asi, y agregue esa funcion que encontre para borrar el buffer pero me gustaria saber exactamente como lo hace. y tambien quisiera saber como terminar el texto al presionar una tecla.. supongamos que luego de que comienzo a escribir cuando el programa lo pide "era un dia muy... @" y que el programa despues de que introduzca @ me diga las vocales son tales y tales blablabla..  sin necesidad de presionar enter si me explico? gracias de antemano


Beakman

#3
Para hacer lo de las teclas tenes que usar alguna librería.
Como ncurses.

Aca hay un ejemplo para reconocer una tecla.

En windows tambien se puede hacer con la conio. :¬¬

pitka

Dejo el codigo terminado, aunque como dije, falta la parte de hacer que deje de leer el codigo al presionar una tecla determinada. Cualquier aclaracion que me quieran hacer respecto al code pues seran muy bien recibidas..!todo sea por aprender
#include <stdio.h>
#include <string.h>
#define BORRA_BUFFER while( getchar() != '\n');

int main()
{
       char texto[100];
       int vocales[5]; 
       int i, total=0; 
       char resp;
       do
       {
       
       for(i=0; i<5; i++) 
            vocales[i] = 0;
       system("cls");     
       printf("Introduce el texto: ");
       
       fgets(texto, 100, stdin); 
   

       for(i=0; i<strlen(texto); i++)
       {
               
            if(toupper(texto[i])=='A') 
              vocales[0]++;
            else if(toupper(texto[i])=='E')
              vocales[1]++;
            else if(toupper(texto[i])=='I')
              vocales[2]++;
            else if(toupper(texto[i])=='O')
              vocales[3]++;
            else if(toupper(texto[i])=='U')
              vocales[4]++;
       }
       
              // Calcula el total de vocales

       for(i=0; i<5; i++)
           total += vocales[i];

       if(total==0)
         {
             system("cls");           
             printf("No hay vocales");
         }
           else
           {
              system("cls");
              printf("\n____________________");
              printf("\nCantidad de vocales: %d\n\n", total);
              printf("A --> %d\n", vocales[0]);
              printf("E --> %d\n", vocales[1]);
              printf("I --> %d\n", vocales[2]);
              printf("O --> %d\n", vocales[3]);
              printf("U --> %d\n", vocales[4]);
              printf("%s", texto);
            }
         getch();
        printf("\n\nSalir? S/N ");
        scanf("%s", &resp);
        BORRA_BUFFER
        } while (toupper(resp)!='S');

        return 0;
}


pitka

#6
Cita de: pablomi en  1 Diciembre 2010, 14:47 PM
Para qué ese define? xD

Ni idea =X, aunque creo que limpia el buffer del teclado antes de que vuelva a dar otra vuelta, antes de que lo tuviera no funcionaba y despues que lo coloque se arreglo, es una duda que tengo planteada seria fabuloso si alguien me dijera exactamente que hace..!! aunque sirva >:D

Akai

lo que hace es ir cogiendo caracteres del buffer hasta que se encuentra un \n, o salto de linea.

Pongamos que tu quieres leer sólo un carácter --> 'a'. Pero al ponerlo en la consola y darle al teclado, en realidad se pasa como "a\n" por el enter que presionas al poner el dato. En este caso, limpiaría el '\n' que queda en el buffer.

Otro caso sería por ejemplo que quieras leer sólo un carácter y te pongan algo tipo "blablablabla". Tu programa leería 'b' y luego te quedaría en el buffer "lablablabla\n". Mismo procedimiento que antes, y se traga hasta el '\n'.

El tema de hacerlo por macro... bueno, ¿vagancia? Es lo mismo que si te declaras una función (esto tendría un ligero aumento del coste) o pones while(getchar()!='\n'); cuando quieras limpiar el buffer que es lo que hace la macro.

xassiz~

No no, a lo que me refiero es que no es rentable poner un DEFINE para utilizarlo solo una vez además, que te cuesta poner el while directamente? xD Sería mas legible

EddyC

#9
Que tal , te doy una variante usando punteros a cadena q es mucho mas corta , te devuelve la cantidad de vocales en el texto , lo que pusiste de la "@" no lo entendi bien , si te referis a que termine de buscar vocales cuando encuentra una es muy simple y si lo necesitas te muestro como seria la modificacion , saludos .


#include <stdio.h>
#include <conio.h>

int contar_vocales(char *);

void main()
{char cad[500];
printf("Ingrese el texto a contar vocales : ");
gets(cad);  
printf("La cantidad de Vocales en el texto es %d",contar_vocales(cad));
getch();
}


int contar_vocales(char *cad)
{int cont=0;
char *aux=cad;   //creas un puntero auxiliar con la direccion del comienzo de cad
while(*aux)          // entra mientras el contenido de la cadena != de '\0'
  {if(*aux=='a'||*aux=='e'||*aux=='i'||*aux=='o'||*aux=='u') // podes agregar mayus
            cont++;
   aux++;              
  }
return cont;

}