[DUDA] Función mayúscula a minúscula y viceversa

Iniciado por yuna88, 29 Marzo 2014, 16:09 PM

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

yuna88

Hola, buenas tardes,

Tengo que hacer un ejercicio con funciones y tengo que pasar una frase (que ingrese el usuario por teclado) a mayúsculas y minúsculas.

El encabezado de las funciones debe de ser:
void toUpperCase( char frase[ ] )

Dejo el código que llevo realizado hasta ahora:
#include <stdio.h>
#include <stdlib.h>

void pedir_datos(char frase[]);
void toUpperCase(char frase[]);
void toLowerCase(char frase[]);

int main()
{

   char frase[100];
   pedir_datos(frase);
   printf("Frase original: %s\n",frase);
   toUpperCase(frase);
   printf("Mayuscula: %s\n",frase);
   toUpperCase(frase);
   printf("Minuscula: %s\n",frase);
   getch();
   
system("PAUSE");
  return 0;
}


void pedir_datos (char frase[])
{
char s;
   printf("Introduce una frase: \n");
   gets(s);
}


void toUpperCase(char frase[])
{
int s;
   for( ; s!='\0'; s++)
       if(s>='a' && s<='z')
           s-=(char)32;
}


void toLowerCase(char frase[])
{
int s;
   while(s!='\0')
{
       if(s>='A' && s<='Z')
           s+=(char)32;
       s++;
   }
}


¿Alguien ve porque el programa me falla?

Un saludo y muchas gracias  :-*

amchacon

Pos hombre, te dedicas a trastear con la variable s y te olvidas del argumento....
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

leosansan

#2
Tal como lo tienes, amén del despropósito de la variable s, que declaras como char y ya me dirás como un char almacena una cadena, te falta la librería conio.h para el uso de la función getch(). Además todo parece indicar que tanto el getch como el system lo usas para frenar a la consola para que no se cierre, con lo cual intuyo que usas Dev.C++ 4.x y en ese caso es más estándar el uso de la función getchar(), y así te sobraría el getch, el system y las librerías conio y stdlib. En cualquier caso si es correcta mi sospecha, pásate a Dev-C++ 5.x o, mejor aún, a Code::Blocks.

Otro detalle es que llamas a la función toUpperCase tanto para mayúsculas como para minúsculas.

El código funcionando podría ser:


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

void pedir_datos(char frase[]);
void toUpperCase(char frase[]);
void toLowerCase(char frase[]);

int main(){
    char frase[100];
    pedir_datos(frase);
    printf("Frase original: %s\n",frase);
    toUpperCase(frase);
    printf("Mayuscula: %s\n",frase);
    toLowerCase(frase);
    printf("Minuscula: %s\n",frase);
    getchar();
  return 0;
}


void pedir_datos (char frase[]){
    printf("Introduce una frase: \n");
    gets(frase);
}


void toUpperCase(char frase[]){
    int i=0;
    for( ; frase[i]!='\0'; i++)
      if(frase[i]>='a' && frase[i]<='z')
            frase[i]-=32;

}


void toLowerCase(char frase[])
{
int i=0;
  while(frase[i]!='\0') {
        if(frase[i]>='A' && frase[i]<='Z')
            frase[i]+=32;
        i++;
    }
}


Aunque no sé por qué me da que de lo que se trataba era de usar punteros.

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





Yoel Alejandro

¡Hoy amaneció entretenido el foro, muchas dudas, jeje! Ahora mis observaciones. En primer lugar, el uso de getch() (en sistemas Windows) requiere la cabecera <conio.h>

En cuánto a la función de pedir dato, no requieres una cadena auxiliar s [que por cierto en tal caso debería ser declarada como char * y no char], pues gets() debe depositar su dato directamente el frase:

Código (cpp) [Seleccionar]

void pedir_datos (char frase[])
{
    printf("Introduce una frase: \n");
    gets(frase);
}


Debes tener cuidado porque en el main(), el arreglo frase debe tener la longitud suficiente para contener cualquier cadena que introduzca el usuario, de lo contrario ocurriría un desbordamiento de memoria. En tu caso, al haber declarado con longitud de 100 creo que está bien (aunque hay maneras más seguras de hacerlo pero no voy a distraerte el tema con eso).

La función toUpperCase() recorre la cadena, restando 32 al código ASCII de cada carácter encontrado, así pasa de minúscula a mayúscula. Una alternativa es usar la función de biblioteca toupper(c), que pasa el carácter c a mayúsculas (requiere la cabecera <ctype.h>). Por cierto, declara el tipo de s en tu código como char * (apuntador a carácter), e inicialízalo al primer caraćter de la cadena. Si no lo inicializas, el compilador tomará un valor por defecto, generalmente cero, y por eso falla tu programa:
Código (cpp) [Seleccionar]

void toUpperCase(char frase[])
{
   char * s = frase;
   for( ; *s!='\0'; s++)
      if( *s >= 'a' && *s <= 'z')
         *s -= (char)32;
}


Te explico: s es un apuntador a carácter, o lo que es lo mismo, una cadena en C. Ojo, que s no es el valor del carácter sino un apuntador al mismo. El valor de la letra sería *s. Por eso cambiamos s por *s en tu código, y tras la inspección de cada letra incrementa el apuntador para que "apunte" a la siguiente letra de la cadena. Por eso es ++s (y no ++*s, se incrementa el apuntador, no el valor apuntado, era otro error que tenías). La función de minúsculas quedaría similar:
Código (cpp) [Seleccionar]

void toLowerCase(char frase[])
{
   char * s = frase;
   for( ; *s!='\0'; s++)
      if( *s >= 'A' && *s <= 'Z')
         *s += (char)32;
}


Como aditamento (nunca está de más una segunda opción, jeje), una forma de hacer lo mismo con la función de biblioteca toupper() sería:
Código (cpp) [Seleccionar]

void toUpperCase(char frase[])
{
   char * s = frase;
   for( ; *s!='\0'; s++)
      *s = toupper( *s );
}


La salida, en cualquier caso, es la misma:

Introduce una frase:
holA Mundo
Frase original: holA Mundo
holA Mundo
Mayuscula: HOLA MUNDO
Minuscula: hola mundo

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

yuna88

#4
Hola a todos,

Muchas gracia por vuestra gran ayuda.

Efectivamente el programa que utilizo para programar (valga la redundancia) es Dev-C++ 5.4.2, se que hay software mejor que ese pero es el que nos explican en clase así que lo tenemos que hacer con ese sí o sí.

Nuevamente, daros las gracias por vuestra ayuda desinteresada.

Un saludo  :-*

engel lex

"programa que utilizo para programa" normalemnte para distingurlo se llama IDE (ntegrated development environment, entorno de desarrollo integrado) :P
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

leosansan

Cita de: yuna88 en 29 Marzo 2014, 18:09 PM
..................................................
Efectivamente el programa que utilizo para programa (valga la redundancia) es Dev-C++ 5.4.2,
.....................................

Si no me equivoco, si no corregidme, las versiones 5.x  de Dev-C++ ya hacen una pausa de forma automática, con lo que ya está de más el finalizar con un getch, getchar o system, cosa que era necesario en las versiones 4.x.

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





ismaelv

Escribir un programa que permita ingresar una frase por teclado. Luego escribir funciones para imprimir la
frase con los siguientes cambios en el uso de mayúsculas:
a. Oración con mayúscula inicial.
b. Oración en minúsculas.
c. Oración en mayúsculas.
Ejemplo:
Ingrese una frase: "El DIA esta Soleado\n"
Mayúscula inicial: "El día esta soleado\n"
Minúsculas : "el día esta soleado\n"
Mayúsculas : "EL DIA ESTA SOLEADO\n"


//ayuda por favor. no se como hacerlo