Foros del Web » Programación para mayores de 30 ;) » Programación General »

vocales

Estas en el tema de vocales en el foro de Programación General en Foros del Web. Hola a todos, tengo el siguiente programa cuya funcion es contar las vocales (mayusculas y minusculas), pero lo q hace en contar los caracteres. Si ...
  #1 (permalink)  
Antiguo 31/03/2004, 21:40
 
Fecha de Ingreso: marzo-2004
Ubicación: Rep. Dominicana
Mensajes: 31
Antigüedad: 20 años, 1 mes
Puntos: 0
vocales

Hola a todos, tengo el siguiente programa cuya funcion es contar las vocales (mayusculas y minusculas), pero lo q hace en contar los caracteres.
Si alguien puede corregirlo por favor hagalo para conocer el error. GRACIAS...


#include<conio.h>
#include<stdio.h>
void main()
{
char cad[100];
int cont,spc,voc,q,i;
printf("Escriba una cadena\n ");
gets(cad);
voc=0;
for(cont=0;cad[cont]!='\0';cont++)
{
if(cad[cont]=='a'||'e'||'i'||'o'||'u')voc=voc+1;

}

printf("En el texto hay %i vocales",voc);

}
  #2 (permalink)  
Antiguo 01/04/2004, 01:37
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Hola,

Es que tienes que hacer el or de las comparaciones:

if((cad[cont]=='a')||(cad[cont]=='e')||(cad[cont]=='i')||(cad[cont]=='o')||(cad[cont]=='u'))voc=voc+1;

Es que tal como estarias haciendo la comparacion o 'e' es cierto (siempre lo es) o 'i' es cierto o ...

De todas formas, creo que solo te cuenta las minusculas, y tampoco te cuenta las acentuadas.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #3 (permalink)  
Antiguo 01/04/2004, 02:58
Avatar de SunDarK  
Fecha de Ingreso: diciembre-2003
Ubicación: Jerez de la Frontera
Mensajes: 1.193
Antigüedad: 20 años, 4 meses
Puntos: 8
En ese caso podrias hacerle antes de comprobar el caracter un UPPER para que te lo pasara a mayúscula y asi comprobar sin problemas,o bien completar el if con las vocales mayusculas,como te veas ^_^
  #4 (permalink)  
Antiguo 14/04/2005, 02:02
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 8 meses
Puntos: 102
Saludos retomo el tema .

Estoy haciendo un ejercicio similar... contar vocales. Ya lo tengo, he usado un switch y un tolower para no trabajar doble como planteó SunDark... pero el problema es con las vocales acentuadas . No encuentro la forma de cambiarlas a minúsculas... lo de menos sería agregar los otros 10 casos (Mayúsculas y minúsculas acentuadas) ... pero aún así tendré que convertirlas... ¿opciones?

Gracias
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #5 (permalink)  
Antiguo 14/04/2005, 02:56
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 8 meses
Puntos: 102
encontré una mejor manera de hacer la comparativa... digo! me ahorro líneas aunque no sé sí mucha diferencia en cuanto al "gasto" en el proceso... quiero suponer que no mucha... he aquí
Código:
char cadena[22]="Algún texto CUALQUIERA", vocales[20]="aeiouáéíóúAEIOUÁÉÍÓÚ";
int i, j, voc=0;

for(i=0; cadena[i]; i++) {
     for(j=0; j<20; j++)
          if(cadena[i]==vocales[j]) voc++; break;
}
¿qué les parece?... vaya diferencia a hacer muchas líneas si ocupase switch... pero persiste el problema de convertir mayúsculas/minúsculas acentuadas... el problema es que quiero imprimir la cadena al revés e intercalando "M" y "m" ... dicho gráficamente, la cadena anterior debe ser impresa:
ArEiUqLaUc OtXeT nÚgLa

.. justamente coincidió este caso en el que tendré que cambiar una minúscula acentuada por una mayúscula acentuada... intentaré hacer algo aprovechando este mismo bucle... al tener una "i" podré saber su posición.. y quizá desde allí pueda hacer el cambio... se me acaba de ocurrir...

Saludos e ideas sean bienvenidas.

Edito:
He añadido un break al código ... y pregunto. Si hago esto 'j' se quedará con su último valor ¿cierto?.
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"

Última edición por jam1138; 14/04/2005 a las 04:56
  #6 (permalink)  
Antiguo 14/04/2005, 05:09
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 8 meses
Puntos: 102
Pregunta: isalpha() también es válida para vocales acentuadas??
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #7 (permalink)  
Antiguo 14/04/2005, 06:36
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 8 meses
Puntos: 102
Quedó... pongo el código para a quien le sirva y para que "lo critíquen".

El ejercicio consiste en recivir una cadena, imprimirla en orden inverso intercalando Mayúsculas y mnúsculas, indicar su longitud y las vocales que contiene:
Código:
#include <stdio.h>
#include <ctype.h>
#include <string.h>

main() {
     char cadena[100], vocales[20]="aeiouAEIOUáéíóúÁÉÍÓÚ", to='m';
// cadena será donde guardaré lo tecleado por el usuario
// vocales lo manejaré como arreglo para buscarlas... ya no hice el toupper porque no hayé la forma para "convertir" las acentuadas.. así que mejor las tratamos igual
// to será una variable auxiliar para saber si la última LETRA fue mayúscula ó minúsculas
     int i, j, voc=0, lg;
// i la ocuparé para desplazarme en cadena
// j para desplazarme en vocales
// voc será donde guardaré el total de vocales
// lg guardaré la longitud de la cadena

     gets(cadena);

     lg=strlen(cadena);
     for(i=lg-1; i>=0; i++) { // decidí hacer un bucle inverso para aprobecharlo al imprimir y no hacerlo por aparte... ahorro de recusos ¿no?
          if(isalpha(cadena[i])) { // solo si es LETRA... para casos como:  "a A b5T!!!!i" que verdaderamente sea intercalar Mayus/minus 
               for(j=0; j<20; j++) {
                    if(cadena[i]==vocales[j]) { // si es vocal
                         voc++; // sumamos
                         break; // terminamos el ciclo... ahorro de recursos y aprovechamos su uso
                    }
                    if(to=='M') { // si la anterior fue mayúscula
                         cadena[i]= tolower(cadena[i]);
                         to='m'; // guardamos que ésta es minúscula SOLO SI SE HIZO EL CAMBIO
                    } else {
                         cadena[i]= toupper(cadena[i]);
                         to='M';
                    }
// Solo hemos hechos cambios a letras "normales".. las acentuadas no han cambiado... por lo que...
                    if (j>=10 && j<15 && to='M') // el rango de 'j' nos indica que es una letra minúscula acentuada y el 'to' nos indica si se "trato" de cambiarla... no por el simple hecho de que esté acentuada significa que se hará el cambio.
                         cadena[i]= vocales[j+5]; // su posición actual +5 nos da la misma letra en mayúscula
                    else if (j>=15 && j<20 && to='m')
                         cadena[i]= vocales[j-5]; // lo mismo pero al contrario
               }
               printf("%c", cadena[i]); // imprimos el último carácter que trabajamos... 
          }
          printf("\nLongitud: %d\n", lg); // ya fuera del ciclo
          printf("Vocales: %d\n", voc);
     }

return 0;
}
Y listo... sin mayor ciencia.. espero no haberlo comentado demasiado y que dichos comentarios solo confundan en vez de explicar ... Bueno, notese que tube especial cuidado.. en cadenas que expliqué en los comentarios...

Preguntas: Por ahí tenia un error que se lo adjudiqué a la función isalpha() (por ello mi pregunta anterior), entionces la cambié por !isspace()... pero salió peor... ¿alguién podría explicarme ese comportamiento extraño??.. ejemplo: tal como esta ahora, solo cambiando isalpha() por !isspace()... y uno ingresa solo una "á" ... no la cuenta como vocal.. ¿por qué?... no es espacio, cumple la condición y debió de seguir un comportamiento normal... .

Weereber.. Saludos a todos!
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:01.