eliminar vocales

Iniciado por ALONSOQ, 6 Septiembre 2012, 17:09 PM

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

ALONSOQ

Hola estoy haciendo un programa que invierta una cadena y elimie las vocales.

La primera parte la tengo controlada, pero a la hora de eliminar vocales no consigo eliminar todas, ¿ podeis echarme un cable, por favor?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void invertir (char p[]);

main()
{
char palabra[80];

printf("dime una palabra\n");
gets (palabra);
invertir (palabra);
printf("\n");
system("pause");       
}

void invertir (char p [])
{
     int i,j;
     j=strlen(p);
     printf("al reves:\n");
   
    for(i=0;i<=j;i++)
    {
     if (p[i]=='a' || p[i]=='e' ||  p[i]=='i' ||p[i]=='o'||p[i]=='u')     
     {
     p[i]=' ';
     }       
    printf("%c",p[j-i-1]);
   }   
}

DickGumshoe

#1
¡Hola!

Primero debes invertir la palabra, puesto que, si por ejemplo, pones "hola"


h = 0
o = 1
l = 2
a = 3


y dices:


i = 0 ---> si p[i] es una vocal, se convierte en un espacio --> imprimes p[j-i-1], o lo que es lo mismo, p[3], que es una letra que todavía no has eliminado, siendo una vocal.



Entonces, queda así:

void invertir (char p [])
{
    int i,j;
    j=strlen(p);
    printf("al reves:\n");

   for(i=j-1; i >=0 ;i--)
   {

       if (p[i]=='a' || p[i]=='e' ||  p[i]=='i' ||p[i]=='o'||p[i]=='u')
       {
              p[i] = ' ';
       }
      printf("%c", p[i]);
  }
}


Un saludo.

avesudra

#2
Hola ALONSOQ , te has liado un poco , y yo también me lío con tu código así que he optado porque elimine las vocales primero, y imprima la cadena desde atrás hacia adelante , es más facil  >:D mira:
void invertir (char p [])
{
   int i;
   int largo=strlen(p)-1;// La posición [0] es una letra , por eso el menos 1 lo que haría sería poner el caracter nulo primero.
   printf("al reves:\n");
   for(i=0; i<=largo; i++)//mientras que i sea menor o igual que largo elimina las vocales.
   {
       if (p[i]=='a' || p[i]=='e' ||  p[i]=='i' ||p[i]=='o'||p[i]=='u')
       {
           p[i]=' ';
       }
   }
   for(i = largo; i >= 0; --i)//i es igual al largo(apunta a la ultima letra) , mientras i sea mayor o igual que 0 imprime desde atrás.
   {
       printf("%c",p[i]);
   }
}


EDITO: DickGumShoe te lo ha aclarado mejor , que el ha entendido lo que querías hacer con las letras i y j.
Regístrate en

DickGumshoe

Avesudra, una pequeña anotación, AlonsoQ está estudiando C, y si no recuerdo mal no se pueden declarar las variables justo cuando la vas a usar, debe ser al principio de la función (en C++ sí que se puede).

Un saludo.

avesudra

#4
Cita de: DickGumshoe en  6 Septiembre 2012, 17:44 PM
Avesudra, una pequeña anotación, AlonsoQ está estudiando C, y si no recuerdo mal no se pueden declarar las variables justo cuando la vas a usar, debe ser al principio de la función (en C++ sí que se puede).

Un saludo.
Ummm entiendo entiendo ya no se lo digo más , perdón ALONSOQ, gracias por la aclaración Dick  ;)
Regístrate en

rir3760

Cita de: ALONSOQ en  6 Septiembre 2012, 17:09 PMHola estoy haciendo un programa que invierta una cadena y elimie las vocales.
Lo primero que debes aclarar es a que te refieres con eliminar las vocales ya que en tu programa solo las sustituyes por un espacio.

Si la idea es no imprimirlas una forma es, utilizando la función "strchr" (prototipo en <string.h>):
void invertir(char cad[])
{
   size_t i;
   
   i = strlen(cad);
   while (i > 0)
      if (strchr("AEIOUaeiou", cad[--i]) == NULL)
         putchar(cad[i]);
   putchar('\n');
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

BlackZeroX

Cita de: DickGumshoe en  6 Septiembre 2012, 17:44 PM
Avesudra, una pequeña anotación, AlonsoQ está estudiando C, y si no recuerdo mal no se pueden declarar las variables justo cuando la vas a usar, debe ser al principio de la función (en C++ sí que se puede).

Un saludo.

En C99 si se puede hacer eso...

Dulces Lunas!¡.
The Dark Shadow is my passion.