Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: howaboutno en 29 Octubre 2012, 19:18 pm



Título: ejercicio en C
Publicado por: howaboutno en 29 Octubre 2012, 19:18 pm
hola!
para el siguiente problema: llevo dandole vueltas y me he ido liando...lo que tengo es esto pero no me funciona, ya no se que hacer... alguien me puede sacar del lio que tengo?
Leer una cadena  de hasta 80 caracteres y pasarla en función de una variable
de opción (menu) a mayúsculas ó a minúsculas e imprimir la cadena resultante


 
Código:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
    int menu(void);
    void mayus(char*);
    void minus(char*);
    int main()
    {       char frase[80];
    
            printf("Introduce una frase \n");
            fflush(stdout);
            fflush(stdin);
            gets(frase);
    
            menu();
            mayus(frase);
            minus(frase);
            return 0;
    } //fin del main
    
    int menu(void)
    {
            int opcion;
            printf("1.Pasar a mayusculas\n");
            fflush(stdout);
            printf("2.Pasar a minúsculas\n");
            fflush(stdout);
            do
            {
            printf("Introduce opción: \n");
            fflush(stdout);
            scanf("%d",&opcion);
            }while(opcion<1 || opcion>2);
            return opcion;
    
        
    } //fin del menu
    
    void mayus(char *frase)
    {
            int t;
            char *p;
            p=frase;
          
            for(t=0;frase[t];t++)
                    {
                    frase[t]=toupper(frase[t]);
                    p++;
                    }
            printf("%s",p);
            fflush(stdout);
    } //fin de funcion mayusculas
    
    void minus(char *frase)
    {
            int t;
            for(t=0;t<strlen(frase);t++)
                    {
                    frase[t]=tolower(frase[t]);
            printf("%s",frase);
            fflush(stdout);
                    }
    } //fin de funcion minusculas
 


Título: Re: ejercicio en C
Publicado por: Caster en 29 Octubre 2012, 20:35 pm
Buenas!

Bueno supongo que en el codigo que quieres compilar incluiras las librerias, aunque aqui no las muestras, sin ellas no pretendas que te compile el codigo:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  

Depues, en la funcion mayus(), utilizas la variable t, pero la tienes como un comentario, aasi que realmente no esta declarada:

Código
  1. //int t;

Y despues otros consejos:

-Evita el uso de gets()
-Evita el uso de fflush(stdin)

Mirate este post y lo veras con mas detalle:

http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html

Otro fallo, elijas la opcion que elijas siempre se ejecutara primero la funcion mayus() y despues minus() porque si que haces al ususario escoger la opcion, pero despues no esta programador para que se ejecute segun el susuario elija, no se si me explico bien.

Saludos

PD: Edita tu post y pon tu codigo entre etiquetas geshi, para que sea mas facil de leer


Título: Re: ejercicio en C
Publicado por: howaboutno en 29 Octubre 2012, 21:05 pm
Buenas!

Bueno supongo que en el codigo que quieres compilar incluiras las librerias, aunque aqui no las muestras, sin ellas no pretendas que te compile el codigo:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  

Depues, en la funcion mayus(), utilizas la variable t, pero la tienes como un comentario, aasi que realmente no esta declarada:

Código
  1. //int t;

Y despues otros consejos:

-Evita el uso de gets()
-Evita el uso de fflush(stdin)

Mirate este post y lo veras con mas detalle:

http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html

Otro fallo, elijas la opcion que elijas siempre se ejecutara primero la funcion mayus() y despues minus() porque si que haces al ususario escoger la opcion, pero despues no esta programador para que se ejecute segun el susuario elija, no se si me explico bien.

Saludos

PD: Edita tu post y pon tu codigo entre etiquetas geshi, para que sea mas facil de leer

ya, lo del int t; ha sido fallo mio pero no por eso no funciona, entre tantos cambios que he hecho lo habré liado mas de la cuenta. Si, en eso pensaba yo, en lo del menú que se ejecutan aparte, pero como lo hago para que se ejecute en funcion de la opcion elegida?


Título: Re: ejercicio en C
Publicado por: Caster en 29 Octubre 2012, 21:38 pm
Ya se, tambien hay algunos fallos en los bucles para transformar la cadena, tu primero leete el post que te deje mas arriba, editalo con los consejos que se dan, y vuelve a postear el codigo y yo te ayudo. Para que se ejecute una funcion segun lo que elijas se neceita una estructura condicional, como puede ser un if - else, o un switch por ejemplo.

Saludos


Título: Re: ejercicio en C
Publicado por: leosansan en 29 Octubre 2012, 21:53 pm
Tienes que pasar a la función menú la variable opción por referencia, para luego usar el valor adecuado en la función main.
Por otro lado en los for puedes poner la condición terminar de leer frase al llegar al carácter nulo='\0'. Más o menos te quedaría así:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.    int menu(int *opcion);
  4.    void mayus(char*);
  5.    void minus(char*);
  6.    int main()
  7.    {       char frase[80];
  8.            int opcion=0,op;
  9.            printf("Introduce una frase \n");
  10.            gets(frase);
  11.            op=menu(&opcion);
  12.            if (op==1)
  13.                mayus(frase);
  14.            if (op==2)
  15.                minus(frase);
  16.            return 0;
  17.    }
  18.  
  19.    int menu(int *opcion)
  20.    {
  21.            printf("1.Pasar a mayusculas\n");
  22.            printf("2.Pasar a minusculas\n");
  23.            do
  24.            {
  25.            printf("Introduce opcion: \n");
  26.                        scanf("%d",&opcion);
  27.            }while(opcion<1 || opcion>2);
  28.            return opcion;
  29.    }
  30.  
  31.    void mayus(char *frase)
  32.    {
  33.           int t;
  34.            for(t=0;frase[t]!='\0';t++)
  35.                    frase[t]=toupper(frase[t]);
  36.            printf("%s",frase);
  37.    }
  38.  
  39.    void minus(char *frase)
  40.    {
  41.            int t;
  42.            for(t=0;frase[t]!='\0';t++)
  43.                    frase[t]=tolower(frase[t]);
  44.            printf("%s",frase);
  45.        }
  46.  
Saludos!.


Título: Re: ejercicio en C
Publicado por: howaboutno en 29 Octubre 2012, 22:43 pm
Ya se, tambien hay algunos fallos en los bucles para transformar la cadena, tu primero leete el post que te deje mas arriba, editalo con los consejos que se dan, y vuelve a postear el codigo y yo te ayudo. Para que se ejecute una funcion segun lo que elijas se neceita una estructura condicional, como puede ser un if - else, o un switch por ejemplo.

Saludos

muchas gracias, ya lo he leído pero es que la profesora que me da el curso de programación nos obliga a poner el gets, el fflush...


Título: Re: ejercicio en C
Publicado por: howaboutno en 29 Octubre 2012, 22:44 pm
Tienes que pasar a la función menú la variable opción por referencia, para luego usar el valor adecuado en la función main.
Por otro lado en los for puedes poner la condición terminar de leer frase al llegar al carácter nulo='\0'. Más o menos te quedaría así:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.    int menu(int *opcion);
  4.    void mayus(char*);
  5.    void minus(char*);
  6.    int main()
  7.    {       char frase[80];
  8.            int opcion=0,op;
  9.            printf("Introduce una frase \n");
  10.            gets(frase);
  11.            op=menu(&opcion);
  12.            if (op==1)
  13.                mayus(frase);
  14.            if (op==2)
  15.                minus(frase);
  16.            return 0;
  17.    }
  18.  
  19.    int menu(int *opcion)
  20.    {
  21.            printf("1.Pasar a mayusculas\n");
  22.            printf("2.Pasar a minusculas\n");
  23.            do
  24.            {
  25.            printf("Introduce opcion: \n");
  26.                        scanf("%d",&opcion);
  27.            }while(opcion<1 || opcion>2);
  28.            return opcion;
  29.    }
  30.  
  31.    void mayus(char *frase)
  32.    {
  33.           int t;
  34.            for(t=0;frase[t]!='\0';t++)
  35.                    frase[t]=toupper(frase[t]);
  36.            printf("%s",frase);
  37.    }
  38.  
  39.    void minus(char *frase)
  40.    {
  41.            int t;
  42.            for(t=0;frase[t]!='\0';t++)
  43.                    frase[t]=tolower(frase[t]);
  44.            printf("%s",frase);
  45.        }
  46.  
Saludos!.

muchas gracias!! ya he visto mis fallos que son bastantes, aun me queda por aprender, pero dicen que de los fallos se aprende :P


Título: Re: ejercicio en C
Publicado por: leosansan en 29 Octubre 2012, 23:28 pm
muchas gracias!! ya he visto mis fallos que son bastantes, aun me queda por aprender, pero dicen que de los fallos se aprende :P
Muy bien, eso es aptitud positiva.
Saludos!.


Título: Re: ejercicio en C
Publicado por: howaboutno en 30 Octubre 2012, 13:34 pm
bueno, lo he retocado y me ha quedado asi

Código:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

char menu(void);
void mayus(char []);
void minus(char []);
int main(void) {
char frase[80];
int opc;

printf("Introduce una cadena \n");
fflush(stdout);
fflush(stdin);
gets(frase);

printf("Elige una opción: \n");
fflush(stdout);
opc=menu();
if(opc=='1')
mayus(frase);
if (opc=='2')
minus(frase);


return 0;
}

char menu(void)

{ char opcion;

do
{
printf("1.Pasara a mayúsculas \n");
printf("2. Pasar a minusuclas \n");
fflush(stdout);
scanf("%c",&opcion);
} while(strchr("12",opcion)==NULL);
return opcion;
} //fin del menu

void mayus(char frase [])

{
int t;

for(t=0;t<strlen(frase);t++)
{
if(islower(frase[t]) !=0)
{
frase[t]=toupper(frase[t]);
}
}
printf("%s",frase);
fflush(stdout);
} //fin de mayus

void minus(char frase [])

{
int t;

for(t=0;t<strlen(frase);t++)
{
if(isupper(frase[t]) !=0)
{
frase[t]=tolower(frase[t]);
}
}
printf("%s",frase);
fflush(stdout);
} //fin de minus