Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: SoyelRobert en 3 Enero 2014, 14:56 pm



Título: problema con el siguiente codigo [C]
Publicado por: SoyelRobert en 3 Enero 2014, 14:56 pm
Estoy intentado hacer un programa al cual se le introduce un texto por teclado y que vaya cambiando las vocales por su siguiente vocal:

Si lee una 'a' devuelve una 'e'.

Si lee una u devuelve una 'a'.

No se tienen en cuenta mayusculas ni vocales acentuadas.

Este es el codigo:

Código:
#include <stdio.h>

int esVocal (char c);
char sigVocal (char c);

int main ()
{
char c;
do{
    if(esVocal(c)) sigVocal(c);
    printf("%c", c);
        }while(scanf("%c", &c)!= EOF);

return 0;
}


int esVocal (char c){
if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u') return;
}

char sigVocal (char c){
if(c=='a')c='e';
if(c=='e')c='i';
if(c=='i')c='o';
if(c=='o')c='u';
if(c=='u')c='a';

return c;
}

El problema es que no cambia la vocal:

si la entrada es:

 
Citar
hola que tal

la salida es:

Citar
hola que tal

cuando deberia ser:

Código:
 Hule qui tel

Una vez lo consiga hacer con la entrada por teclado y la salida por monitor el siguiente paso seria hacerlo con ficheros. salu2


Título: Re: problema con el siguiente codigo [C]
Publicado por: leosansan en 3 Enero 2014, 15:26 pm
Estoy intentado hacer un programa al cual se le introduce un texto por teclado y que vaya cambiando las vocales por su siguiente vocal:

Si lee una 'a' devuelve una 'e'.

Si lee una u devuelve una 'a'.

No se tienen en cuenta mayusculas ni vocales acentuadas.
...................................................................
Una vez lo consiga hacer con la entrada por teclado y la salida por monitor el siguiente paso seria hacerlo con ficheros. salu2

Antes que nada procura indentar o sangrar el código para que sea más legible y elige las etiquetas de C++, aunque el código sea en C. Salen de esa forma coloreado y es más fácil leerlo.

Y en tema pon una breve descripción de lo que buscas, no aclara nada eso de "problema con el siguiente codigo [C]"

Te pongo el código con las correciones que me han parecido y que no se aparten de tu código original. Por cierto,  ya veras cómo salir del bucle.   ;) ;) ;).


Código
  1. #include <stdio.h>
  2.  
  3. int esVocal (char c);
  4. char sigVocal (char c);
  5.  
  6. int main (){
  7.    char c;
  8.    do{
  9.        puts ("Introduzca vocal:");
  10.        scanf("%c",&c);
  11.        while (getchar ()!='\n');
  12.        if(esVocal(c)!=0)
  13.            printf("%c\n", sigVocal(c));
  14.    }while(c!= EOF);
  15.    return 0;
  16. }
  17.  
  18. int esVocal (char c){
  19.    int si_o_no=0;
  20.    if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u')
  21.        si_o_no=1;
  22.    else si_o_no=0;
  23.    return si_o_no;
  24. }
  25.  
  26. char sigVocal (char c){
  27.    if(c=='a')
  28.        c='e';
  29.    else if(c=='e')
  30.        c='i';
  31.    else if(c=='i')
  32.        c='o';
  33.    else if(c=='o')
  34.        c='u';
  35.    else if(c=='u')
  36.        c='a';
  37.    return c;
  38. }
  39.  

¡¡¡¡ Saluditos! ..... !!!!

:rolleyes: ;) ;) ;) :rolleyes:


Título: Re: problema con el siguiente codigo [C]
Publicado por: SoyelRobert en 3 Enero 2014, 16:17 pm
hola leosansan, no se lo que quiere decir indentar un cogido la verdad...

y respecto a lo que has programado, se sale un poco de lo que en un principio buscaba programar, mira:

el asunto era crear un programa en C que al tu introducir un texto cambie todas las vocales que aparezcan por la siguiente vocal que le toque, no se trata de introducir una única vocal para que la modifique sino introducir un texto entero donde aparezcan blancos, saltos de linea, etc (cualquier caracter hasta que se acabe el fichero, EOF)

salu2 y gracias


Título: Re: problema con el siguiente codigo [C]
Publicado por: joanj94 en 3 Enero 2014, 16:28 pm
Código:
#include <stdio.h>

int esVocal (char c);
char sigVocal (char c);

int main ()
{
char c;
do{
    if(esVocal(c)){
         sigVocal(c);
    }
    printf("%c", c);
    return 0;
}
while(scanf("%c", &c)!= EOF);

int esVocal (char c){
if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u') return;
}

char sigVocal (char c){
if(c=='a')c='e';
if(c=='e')c='i';
if(c=='i')c='o';
if(c=='o')c='u';
if(c=='u')c='a';

return c;
}

Nose si asi funciona, solo meti los claudators al if, porque vamos, a medida que lee las letras queres que si es una vocal la canvie segun la funcion sigVocal. no?


Título: Re: problema con el siguiente codigo [C]
Publicado por: SoyelRobert en 3 Enero 2014, 16:32 pm
Código:
#include <stdio.h>

int esVocal (char c);
char sigVocal (char c);

int main ()
{
char c;
do{
    if(esVocal(c)){
         sigVocal(c);
    }
    printf("%c", c);
        }while(scanf("%c", &c)!= EOF);

return 0;
}


int esVocal (char c){
if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u') return;
}

char sigVocal (char c){
if(c=='a')c='e';
if(c=='e')c='i';
if(c=='i')c='o';
if(c=='o')c='u';
if(c=='u')c='a';

return c;
}

Nose si asi funciona, solo meti los claudators al if, porque vamos, a medida que lee las letras queres que si es una vocal la canvie segun la funcion sigVocal. no?

si metes el printf dentro del if solo pintara en caso de que c sea una vocal, por lo tanto, no pintria consonantes.


Título: Re: problema con el siguiente codigo [C]
Publicado por: joanj94 en 3 Enero 2014, 16:35 pm
Código:
Código:
#include <stdio.h>

int esVocal (char c);
char sigVocal (char c);

int main ()
{
char c;
do{
    if(esVocal(c)){
         sigVocal(c);
    }//fin if
    printf("%c", c);
}// fin dentro del do
while(scanf("%c", &c)!= EOF);

return 0;
}//fin main

int esVocal (char c){
if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u') return;
}// fin esVocal

char sigVocal (char c){
if(c=='a')c='e';
if(c=='e')c='i';
if(c=='i')c='o';
if(c=='o')c='u';
if(c=='u')c='a';

return c;
}//fin sigVocal

El printf esta fura del if


Título: Re: problema con el siguiente codigo [C]
Publicado por: SoyelRobert en 3 Enero 2014, 16:44 pm
si perdona me he colado pero nada tampoco sirve , no cambia las vocales la salida es la misma que la entrada al igual que en mi codigo :(


Título: Re: problema con el siguiente codigo [C]
Publicado por: joanj94 en 3 Enero 2014, 16:54 pm
Por cierto, como termina el supuesto texto? con un . o simplemente termina?


Título: Re: problema con el siguiente codigo [C]
Publicado por: SoyelRobert en 3 Enero 2014, 17:08 pm
Por cierto, como termina el supuesto texto? con un . o simplemente termina?

?? con un EOF (control Z)


Título: Re: problema con el siguiente codigo [C]
Publicado por: amchacon en 3 Enero 2014, 17:09 pm
Indentar es poner las tabulaciones, vamos poner el código bonito.

Este es tú codigo sin indentar:
Código
  1. #include <stdio.h>
  2.  
  3. int esVocal (char c);
  4. char sigVocal (char c);
  5.  
  6. int main ()
  7. {
  8. char c;
  9. do{
  10.    if(esVocal(c)) sigVocal(c);
  11.    printf("%c", c);
  12.        }while(scanf("%c", &c)!= EOF);
  13.  
  14. return 0;
  15. }
  16.  
  17.  
  18. int esVocal (char c){
  19. if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u') return;
  20. }
  21.  
  22. char sigVocal (char c){
  23. if(c=='a')c='e';
  24. if(c=='e')c='i';
  25. if(c=='i')c='o';
  26. if(c=='o')c='u';
  27. if(c=='u')c='a';
  28.  
  29. return c;
  30. }

Este es el código indentado:

Código
  1. #include <stdio.h>
  2.  
  3. int esVocal (char c);
  4. char sigVocal (char c);
  5.  
  6. int main ()
  7. {
  8.    char c;
  9.    do
  10.    {
  11.        if(esVocal(c)) sigVocal(c);
  12.        printf("%c", c);
  13.    }
  14.    while(scanf("%c", &c)!= EOF);
  15.  
  16.    return 0;
  17. }
  18.  
  19. int esVocal (char c)
  20. {
  21.    if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u') return;
  22. }
  23.  
  24. char sigVocal (char c)
  25. {
  26.    if(c=='a')c='e';
  27.    if(c=='e')c='i';
  28.    if(c=='i')c='o';
  29.    if(c=='o')c='u';
  30.    if(c=='u')c='a';
  31.  
  32.    return c;
  33. }
  34.  

En cuanto al fallo de tú código, scanf lee hasta un espacio o salto de línea. Para leer letra a letra puedes usar getch() de la librería conio.h, decirte que no es estandar pero cumple su propósito.

Otro error que tienes es:

Código
  1. int esVocal (char c)
  2. {
  3.    if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u') return;
  4. }// fin esVocal

No devuelves nada?


Título: Re: problema con el siguiente codigo [C]
Publicado por: joanj94 en 3 Enero 2014, 17:24 pm
Bien he supuesto que el texto termina con un punto y te he codificado esto, y funciona bien
Código
  1. #include <stdio.h>
  2.  
  3. void sigVocal ();
  4.  
  5. char c;
  6.  
  7. int main (){
  8. c=getchar();
  9. do{
  10. sigVocal();
  11. printf("%c", c);
  12. c=getchar();
  13. }// fin dentro del do
  14. while(c!= '.');
  15. printf("\n");
  16. }//fin main
  17.  
  18. void sigVocal (){
  19. if(c=='a'){c='e';}
  20. else if(c=='e'){c='i';}
  21. else if(c=='i'){c='o';}
  22. else if(c=='o'){c='u';}
  23. else if(c=='u'){c='a';}
  24. else {c=c;}
  25. }//fin sigVocal


Título: Re: problema con el siguiente codigo [C]
Publicado por: SoyelRobert en 3 Enero 2014, 17:31 pm
exactamente, justo lo acabo de sacar yo tambien:


Código
  1. #include <stdio.h>
  2.  
  3. int esVocal (char c);
  4. char sigVocal (char c);
  5.  
  6. int main ()
  7. {
  8. char c;
  9. do{
  10.    if (esVocal(c)) printf("%c", sigVocal(c));
  11.    else printf("%c", c);
  12.  
  13.        }while(scanf("%c", &c)!=EOF);
  14.  
  15. return 0;
  16. }
  17. int esVocal (char c){
  18.  
  19. return
  20. (c=='a'||c=='e'||c=='i'||c=='o'||c=='u');
  21.  
  22. }
  23. char sigVocal (char c){
  24.  
  25. switch(c){
  26. case 'a': c='e'; break;
  27. case 'e': c='i'; break;
  28. case 'i': c='o'; break;
  29. case 'o': c='u'; break;
  30. case 'u': c='a'; break;
  31. }
  32. return (c);
  33. }
  34.  
  35.  

 ;-) gracias

EDIT: no se como ponerlo bonito la verdad :(


Título: Re: problema con el siguiente codigo [C]
Publicado por: joanj94 en 3 Enero 2014, 17:35 pm
Bueno yo no se meter los colores, pero lo tabulo jajaja

PD: Un consejo los break, goto, y uso de librerias estilo conio.h evitalos si no son requeridos, lo digo porque si es un ejercicio de universidad o lo que sea, muchas veces te pueden penalizar por eso ;) (ademas de garantizar asi una maxima compatibilidad en todos los OS)


Título: Re: problema con el siguiente codigo [C]
Publicado por: SoyelRobert en 3 Enero 2014, 17:41 pm
Bueno yo no se meter los colores, pero lo tabulo jajaja

PD: Un consejo los break, goto, y uso de librerias estilo conio.h evitalos si no son requeridos, lo digo porque si es un ejercicio de universidad o lo que sea, muchas veces te pueden penalizar por eso ;) (ademas de garantizar asi una maxima compatibilidad en todos los OS)

exactamente, de hecho todos mis examenes empiezan asi:

(http://i42.tinypic.com/2d0xpy0.png)

sin embargo por breaks y goto no me penalizan.


Título: Re: problema con el siguiente codigo [C]
Publicado por: rir3760 en 3 Enero 2014, 17:55 pm
exactamente, justo lo acabo de sacar yo tambien
Todavía hay un error en el programa, cuando se ejecuta la primera iteracion del bucle:
Código
  1. int main()
  2. {
  3.   char c;
  4.  
  5.   do {
  6.      if (esVocal(c))
  7.         printf("%c", sigVocal(c));
  8.      else
  9.         printf("%c", c);
  10.   }while (scanf("%c", &c) != EOF);
  11.  
  12.   return 0;
  13. }
El valor inicial de la variable "c" es no definido o basura, para procesar la variable solo después de almacenar en ella un valor se debe cambiar el bucle por uno con la condición al principio de este:
Código
  1. int main()
  2. {
  3.   char c;
  4.  
  5.   while (scanf("%c", &c) != EOF)
  6.      if (esVocal(c))
  7.         printf("%c", sigVocal(c));
  8.      else
  9.         printf("%c", c);
  10.  
  11.   return 0;
  12. }

PD: Un consejo los break, goto, y uso de librerias estilo conio.h evitalos si no son requeridos
En el caso del programa de SoyelRobert las sentencias "break;" en la función "sigVocal" son necesarias para tener el efecto deseado, si se eliminaran la función siempre retornaría 'a' como la siguiente vocal.

Un saludo


Título: Re: problema con el siguiente codigo [C]
Publicado por: joanj94 en 3 Enero 2014, 17:59 pm

En el caso del programa de SoyelRobert las sentencias "break;" en la función "sigVocal" son necesarias para tener el efecto deseado, si se eliminaran la función siempre retornaría 'a' como la siguiente vocal.

Un saludo

Por eso en el que yo le hice, uso el else if


Título: Re: problema con el siguiente codigo [C]
Publicado por: leosansan en 3 Enero 2014, 18:28 pm
.............................................
el asunto era crear un programa en C que al tu introducir un texto cambie todas las vocales que aparezcan por la siguiente vocal que le toque, no se trata de introducir una única vocal para que la modifique sino introducir un texto entero donde aparezcan blancos, saltos de linea, etc (cualquier caracter hasta que se acabe el fichero, EOF)

En todo caso hasta que se acabe la cadena o frase, es decir hasta \0. Lo otro sería para ficheros, que no es el caso, supongo.

Citar

Introduzca frase:
leosansan salio una tarde que llovia.

leusensen selou ane terdi qai lluvoe.



Código
  1. /*hay que modificar la condicion del while*/
  2. #include <stdio.h>
  3.  
  4. int esVocal (char c);
  5. char sigVocal (char c);
  6.  
  7. int main (){
  8.    int i;
  9.    char c,frase[100];
  10.    puts ("Introduzca frase:");
  11.        scanf("%100[^\n]s",frase);
  12.        while (getchar ()!='\n');
  13.    do{
  14.        if(esVocal(frase[i])!=0)
  15.            frase[i]=sigVocal (frase[i]);
  16.        i++;
  17.    }while(frase[i]!= '\0');
  18.    printf("\n%s\n",frase);
  19.    return 0;
  20. }
  21.  
  22. int esVocal (char c){
  23.    int si_o_no=0;
  24.    if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u')
  25.        si_o_no=1;
  26.    else si_o_no=0;
  27.    return si_o_no;
  28. }
  29.  
  30. char sigVocal (char c){
  31.    if(c=='a')
  32.        c='e';
  33.    else if(c=='e')
  34.        c='i';
  35.    else if(c=='i')
  36.        c='o';
  37.    else if(c=='o')
  38.        c='u';
  39.    else if(c=='u')
  40.        c='a';
  41.    return c;
  42. }
  43.  

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: problema con el siguiente codigo [C]
Publicado por: SoyelRobert en 3 Enero 2014, 18:32 pm
En todo caso hasta que se acabe la cadena o frase, es decir hasta \0. Lo otro sería para ficheros, que no es el caso, supongo.

sip jaja exactante, queria hacerlo para sentencias para la entrada estandar y para textos en caso de tratarse de ficheros:

Código
  1. #include <stdio.h>
  2.  
  3. int esVocal (char c);
  4. char sigVocal (char c);
  5.  
  6. int main ()
  7. {
  8. char c;
  9. FILE *fe;
  10. FILE *fs;
  11.  
  12. fe= fopen("C:\entrada.txt", "r");
  13. fs= fopen("C:\salida.txt", "a");
  14.  
  15. if(fe == NULL) puts("error en apertura de fichero");
  16. else {
  17.    while (fscanf(fe,"%c", &c) != EOF)
  18.        if (esVocal(c))
  19.            fprintf(fs,"%c", sigVocal(c));
  20.        else
  21.            fprintf(fs,"%c", c);
  22.  
  23. }
  24.   return 0;
  25. }
  26. int esVocal (char c){
  27.  
  28.  
  29. if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u') return 1;
  30. else return 0;
  31.  
  32. }
  33. char sigVocal (char c){
  34.  
  35. switch(c){
  36. case 'a': c='e'; break;
  37. case 'e': c='i'; break;
  38. case 'i': c='o'; break;
  39. case 'o': c='u'; break;
  40. case 'u': c='a'; break;
  41. }
  42. return (c);
  43. }
  44.  

 ::)


Título: Re: problema con el siguiente codigo [C]
Publicado por: rir3760 en 3 Enero 2014, 19:48 pm
Por eso en el que yo le hice, uso el else if
En este caso se puede utilizar cualquiera de las dos sentencias de selección (if, switch) sin problemas, que la sentencia switch requiera sentencias "break;" para su correcto funcionamiento no la invalida.

Un saludo


Título: Re: problema con el siguiente codigo [C]
Publicado por: amchacon en 3 Enero 2014, 19:55 pm
Insisto SoyelRobert:
Código
  1. int main ()
  2. {
  3. char c;
  4. FILE *fe;
  5. FILE *fs;
  6.  
  7. fe= fopen("C:\entrada.txt", "r");
  8. fs= fopen("C:\salida.txt", "a");
  9.  
  10. //...
  11.  
  12. }

Deja 4 espacios después de una llave, asi se pueden identificar bloques fácilmente:
Código
  1. int main ()
  2. {
  3.    char c;
  4.    FILE *fe;
  5.    FILE *fs;
  6.  
  7.    fe= fopen("C:\entrada.txt", "r");
  8.    fs= fopen("C:\salida.txt", "a");
  9.  
  10.    //...
  11. }

Eso en un editor de código es seleccionar las líneas y apretar TAB. O bien usar el plugin que indenta el código automaticamente (en el Codeblocks se llama "Source code formatter (AStyle)").

Estás prácticas son prácticamente obligadas para cualquier progamador, de hecho algunos lenguajes (como el python) no tienen llaves y se identifican los bloques con la indentación.


Título: Re: problema con el siguiente codigo [C]
Publicado por: SoyelRobert en 3 Enero 2014, 20:18 pm

Eso en un editor de código es seleccionar las líneas y apretar TAB. O bien usar el plugin que indenta el código automaticamente (en el Codeblocks se llama "Source code formatter (AStyle)").

Estás prácticas son prácticamente obligadas para cualquier progamador, de hecho algunos lenguajes (como el python) no tienen llaves y se identifican los bloques con la indentación.

gracias  :)


Título: Re: problema con el siguiente codigo [C]
Publicado por: leosansan en 3 Enero 2014, 21:55 pm
sip jaja exactante, queria hacerlo para sentencias para la entrada estandar y para textos en caso de tratarse de ficheros:
...........................................

Que sirva de precedente, aclaren bien las preguntas que hagan y así no perdemos el tiempo en buscarte soluciones que no les servirán. Y esto lo digo de forma general, no por tí en particular.¡¡¡ Pero es que resulta frustante !!!, da ganas de dejarlo. ;)

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)