problema con el siguiente codigo [C]

Iniciado por SoyelRobert, 3 Enero 2014, 14:56 PM

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

joanj94

#10
Bien he supuesto que el texto termina con un punto y te he codificado esto, y funciona bien
#include <stdio.h>

void sigVocal ();

char c;

int main (){
c=getchar();
do{
sigVocal();
printf("%c", c);
c=getchar();
}// fin dentro del do
while(c!= '.');
printf("\n");
}//fin main

void sigVocal (){
if(c=='a'){c='e';}
else if(c=='e'){c='i';}
else if(c=='i'){c='o';}
else if(c=='o'){c='u';}
else if(c=='u'){c='a';}
else {c=c;}
}//fin sigVocal


SoyelRobert

#11
exactamente, justo lo acabo de sacar yo tambien:


Código (cpp) [Seleccionar]
#include <stdio.h>

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

int main ()
{
char c;
do{
   if (esVocal(c)) printf("%c", sigVocal(c));
   else printf("%c", c);

       }while(scanf("%c", &c)!=EOF);

return 0;
}
int esVocal (char c){

return
(c=='a'||c=='e'||c=='i'||c=='o'||c=='u');

}
char sigVocal (char c){

switch(c){
case 'a': c='e'; break;
case 'e': c='i'; break;
case 'i': c='o'; break;
case 'o': c='u'; break;
case 'u': c='a'; break;
}
return (c);
}



;-) gracias

EDIT: no se como ponerlo bonito la verdad :(
getting louder!

joanj94

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)


SoyelRobert

Cita de: 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)

exactamente, de hecho todos mis examenes empiezan asi:



sin embargo por breaks y goto no me penalizan.
getting louder!

rir3760

Cita de: SoyelRobert en  3 Enero 2014, 17:31 PMexactamente, justo lo acabo de sacar yo tambien
Todavía hay un error en el programa, cuando se ejecuta la primera iteracion del bucle:
int main()
{
   char c;
   
   do {
      if (esVocal(c))
         printf("%c", sigVocal(c));
      else
         printf("%c", c);
   }while (scanf("%c", &c) != EOF);
   
   return 0;
}

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:
int main()
{
   char c;
   
   while (scanf("%c", &c) != EOF)
      if (esVocal(c))
         printf("%c", sigVocal(c));
      else
         printf("%c", c);
   
   return 0;
}


Cita de: joanj94 en  3 Enero 2014, 17:35 PMPD: 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
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

joanj94

Cita de: rir3760 en  3 Enero 2014, 17:55 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


leosansan

Cita de: SoyelRobert en  3 Enero 2014, 16:17 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 (cpp) [Seleccionar]

/*hay que modificar la condicion del while*/
#include <stdio.h>

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

int main (){
    int i;
    char c,frase[100];
    puts ("Introduzca frase:");
        scanf("%100[^\n]s",frase);
        while (getchar ()!='\n');
    do{
        if(esVocal(frase[i])!=0)
            frase[i]=sigVocal (frase[i]);
        i++;
    }while(frase[i]!= '\0');
    printf("\n%s\n",frase);
    return 0;
}

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

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


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



SoyelRobert

Cita de: leosansan en  3 Enero 2014, 18:28 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 (cpp) [Seleccionar]

#include <stdio.h>

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

int main ()
{
char c;
FILE *fe;
FILE *fs;

fe= fopen("C:\entrada.txt", "r");
fs= fopen("C:\salida.txt", "a");

if(fe == NULL) puts("error en apertura de fichero");
else {
    while (fscanf(fe,"%c", &c) != EOF)
        if (esVocal(c))
            fprintf(fs,"%c", sigVocal(c));
        else
            fprintf(fs,"%c", c);

}
   return 0;
}
int esVocal (char c){


if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u') return 1;
else return 0;

}
char sigVocal (char c){

switch(c){
case 'a': c='e'; break;
case 'e': c='i'; break;
case 'i': c='o'; break;
case 'o': c='u'; break;
case 'u': c='a'; break;
}
return (c);
}


::)
getting louder!

rir3760

Cita de: joanj94 en  3 Enero 2014, 17:59 PMPor 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
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

amchacon

Insisto SoyelRobert:
Código (cpp) [Seleccionar]
int main ()
{
char c;
FILE *fe;
FILE *fs;

fe= fopen("C:\entrada.txt", "r");
fs= fopen("C:\salida.txt", "a");

//...

}


Deja 4 espacios después de una llave, asi se pueden identificar bloques fácilmente:
Código (cpp) [Seleccionar]
int main ()
{
   char c;
   FILE *fe;
   FILE *fs;

   fe= fopen("C:\entrada.txt", "r");
   fs= fopen("C:\salida.txt", "a");

   //...
}


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.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar