Foros ZackYFileS

Foros ZackYFileS (http://foros.zackyfiles.com/index.php)
-   PROGRAMACIÓN Lenguajes: Visual Basic, C++, etc (http://foros.zackyfiles.com/forumdisplay.php?f=370)
-   -   Ejercicio C++ -> Cadena de caracteres (http://foros.zackyfiles.com/showthread.php?t=415261)

Snake12 10/03/2006 21:18

Ejercicio C++ -> Cadena de caracteres
 
Hola amigos, tengo que hacer el siguiente ejercicio:

Lea un texto de teclado e indique cuantas veces aparecen una letra mayúscula y cuantas veces una letra minúscula. Además deberá mostrar un texto con todas las letras en mayúscula. Ejemplo:

‘Hola amigo’

Hay 1 letra mayúscula

Hay 8 letras minúsculas

HOLA AMIGO

-En lo que tengo hecho, no sé lo que falla, que es meter la frase en un array, y luego imprimir ese array para ver que está bien, pero no sé que pasa que tengo que escribir mucho más de lo que defino MAXCAD y además me imprime mucho menos.

¿Me echáis una mano?

// Incluir E/S y Librerías Standard
#include <iostream>
#include <cstdlib>
using namespace std;

// Zona de Declaración de Constantes
const char FINCAD = char (0);
const char ENTER = '\n';
const int MAXCAD = 25;

// Zona de Declaración de Tipos
typedef char TCadena [MAXCAD+1];

// Zona de Cabeceras de Procedimientos y Funciones
void leer_cadena ( TCadena &cadena );
void escribir_cadena ( TCadena cadena );

// Programa Principal
int main()
{
// Zona de Declaración de Variables del Programa principal
TCadena frase;

cout << "Introduzca la frase que desee:" << '\n' << endl;
cin.getline ( frase, MAXCAD + 1, ENTER );

leer_cadena ( frase );
escribir_cadena ( frase );

system("Pause"); // Hacer una pausa
return 0; // Valor de retorno al S.O.
}

// Implementación de Procedimientos y Funciones
void leer_cadena (TCadena &cadena )
{
int i;
char c;

i=0;
c = cin.get();
while ( ( i < MAXCAD + 1 ) && ( c != FINCAD ) )
{
cadena [i] = c;
c = cin.get();
i++;
}
cadena[i] = FINCAD;
}

void escribir_cadena (TCadena cadena )
{
int i;

i = 0;
while ( ( i < MAXCAD + 1 ) && ( cadena [i] != FINCAD ) )
{
cout << cadena [i];
i++;
}
}



Muchas gracias!

Efirenet 10/03/2006 23:19

Hola, ¿por qué no usas isupper() para saber si un carácter es mayúscula o no? Y ya que estamos, toupper() para pasar a mayúsculas, isalpha() para saber si es una letra (y así solo contabilizas letras y te olvidas de los espacios, comas, etc).

Un saludo

Coke 11/03/2006 05:20

haz lo que dice Efirenet, aparte que yo lo haría todo en la misma función y la función leer_cadena la quitaría.

Coke.

Snake12 11/03/2006 11:43

Hola amigos, al final lo hice así ayer, pero no he tenido tiempo de ponerlo aquí. El problema que tengo es que los espacios en blanco, comas, etc... me las cuenta como letras minusculas, por lo demás bien. Pero cómo soluciono ese problema??

[CODE]// Incluir E/S y Librerías Standard
#include <iostream>
#include <cstdlib>
using namespace std;

// Zona de Declaración de Constantes
const char FINCAD = char (0);
const char ENTER = '\n';
const int MAXCAD = 25;

// Zona de Declaración de Tipos
typedef char TCadena [MAXCAD + 1];

// Zona de Cabeceras de Procedimientos y Funciones
void convertir_mayus ( TCadena cadena );
void mayus_minus ( TCadena cadena );

// Programa Principal
int main()
{
// Zona de Declaración de Variables del Programa principal
TCadena frase;

cout << "Introduzca la frase que desee:" << '\n' << endl;
cin.getline ( frase, MAXCAD + 1, ENTER );
cout << '\n' << endl;

mayus_minus ( frase );
convertir_mayus ( frase );

system("Pause"); // Hacer una pausa
return 0; // Valor de retorno al S.O.
}

// Implementación de Procedimientos y Funciones
void mayus_minus ( TCadena cadena )
{
int i, mayus, minus;

i = 0;
mayus = 0;
minus = 0;
while ( ( cadena[i] != FINCAD ) && ( i < MAXCAD ) )
{
if ( isupper ( cadena[i] ) )
{
mayus++;
}
else
minus++;
i++;
}
cout << "Hay "<< mayus << " letras mayusculas." << endl;
cout << "Hay " << minus << " letras minusculas." << '\n' << endl;
}

void convertir_mayus ( TCadena cadena)
{
int i;

i = 0;
while ( ( cadena[i] != FINCAD) || ( i < MAXCAD ) )
{
cadena[i] = toupper ( cadena[i] );
i++;
}
cout<< cadena << '\n' << endl;
}
[/CODE]

Bueno, muchas gracias por vuestra ayuda!!

Snake12 11/03/2006 11:48

jajajaja, acabo de encontrar ahora mismo el fallo, en la función de mayus_minus, puse if isupper para ver si es mayúculas, y luego puse un else para las minusculas, y claro, ahí me cuenta todo lo demás, por eso he puesto otro if islower para las minúsculas y ya me lo cuenta bien:

[CODE]void mayus_minus ( TCadena cadena )
{
int i, mayus, minus;

i = 0;
mayus = 0;
minus = 0;
while ( ( cadena[i] != FINCAD ) && ( i < MAXCAD ) )
{
if ( isupper ( cadena[i] ) )
{
mayus++;
}
[COLOR="Red"]if ( islower ( cadena [i] ) )
{
minus++;
}
i++;[/COLOR]
}
cout << "Hay "<< mayus << " letras mayusculas." << endl;
cout << "Hay " << minus << " letras minusculas." << '\n' << endl;
}[/CODE]

Coke 11/03/2006 13:13

si quieres hacerlo asi...

Código PHP:

void mayus_minus TCadena cadena )
{
     
int imayusminus;
     
     
0;
     
mayus 0;
     
minus 0;
     while ( ( 
cadena[i] != FINCAD ) && ( MAXCAD ) )
     {
           if ( 
isupper cadena[i] ) )
           {
                
mayus++;
           }
           else
               
minus++;
           
i++;
     }
     
cout << "Hay "<< mayus << " letras mayusculas." << endl;
     
cout << "Hay " << minus << " letras minusculas." << '\n' << endl;


tienes que usar isalpha como dijo efirenet

Código PHP:

void mayus_minus TCadena cadena )
{
     
int imayusminus;
     
     
0;
     
mayus 0;
     
minus 0;
     while ( ( 
cadena[i] != FINCAD ) && ( MAXCAD ) )
     {
         if(
isalpha(cadena[i])) 
         {
             if ( 
isupper cadena[i] ) )
             {
                  
mayus++;
             }
             else
                 
minus++;
          }
          
i++;
     }
     
cout << "Hay "<< mayus << " letras mayusculas." << endl;
     
cout << "Hay " << minus << " letras minusculas." << '\n' << endl;


y asi es como lo he hecho yo...todo en la misma funcion..

Código PHP:

void procesar_cadena (TCadena cadena )
{
    
int imayusculasminusculas;    
    
mayusculas minusculas 0;
    
cout<<ENTER;
    while ( ( 
MAXCAD ) && ( cadena[i] != FINCAD ) )
    {
        if(
isalpha(cadena[i]))
        {
            if(
isupper(cadena[i]))
            {
                
mayusculas++;
            }
            else
            {
                
minusculas++;
            }
        }
        
cadena[i] = toupper(cadena[i]);    
        
i++;
    }
    
cout<<ENTER;
    
cout <<"Hay "<< mayusculas <<" letras mayusculas\n";
    
cout <<"Hay "<< minusculas <<" letras minusculas\n\n";
    
cout << cadena<<"\n"<<endl;



muy parecido al tuyo.


Coke.

Efirenet 11/03/2006 16:29

Hola. Exacto Coke, así era como se me había ocurrido a mí. Me hice un ejemplito y me quedó así:

[PHP]
// Incluir E/S y Librerías Standard
#include <iostream>
#include <cstdlib>
using namespace std;

// Zona de Declaración de Constantes
const int MAXCAD = 25;

// Zona de Declaración de Tipos
typedef char TCadena [MAXCAD+1];

typedef struct
{
int Mayusculas;
int Minusculas;
char *CadMayus;
} TResultado;

//Cabeceras
TResultado ParsearCadena (char* cad);

// Programa Principal
int main()
{
// Zona de Declaración de Variables del Programa principal
TCadena frase;
TResultado mResult;

cout << "Introduzca la frase que desee: ";
cin.getline ( frase, MAXCAD + 1 );

mResult = ParsearCadena(frase);

cout << "Numero de mayusculas: " << mResult.Mayusculas << endl;
cout << "Numero de minusculas: " << mResult.Minusculas << endl;
cout << "Frase en mayusculas: " << mResult.CadMayus << endl;

system("Pause"); // Hacer una pausa
return 0; // Valor de retorno al S.O.
}

TResultado ParsearCadena (char* cad)
{
TResultado mRes;
char *contCad;

mRes.Mayusculas = 0;
mRes.Minusculas = 0;
mRes.CadMayus = 0;
contCad = cad;
while (*contCad) {
if (isalpha(*contCad)) // Si es una letra
if (isupper(*contCad))
mRes.Mayusculas++; // Es una letra mayúscula
else
mRes.Minusculas++; // Es una letra minúscula
*contCad = toupper(*contCad);
contCad++;
}
mRes.CadMayus = cad;
return mRes;
}
[/PHP]

Se parece bastante a lo que posteó Coke.

Un saludo


La franja horaria es GMT +2. Ahora son las 13:30.

Powered por vBulletin™ Version 3.8.10
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.
Traducido por vBsoporte - vBulletin en español
ZackYFileS - Foros de Debate