Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: alvr en 3 Enero 2013, 19:39 pm



Título: {Solucionado} [C] Detectar tres mayúsculas seguidas
Publicado por: alvr en 3 Enero 2013, 19:39 pm
AQUÍ LA SOLUCIÓN (http://foro.elhacker.net/programacion_cc/c_problema_con_bucle-t379890.0.html#msg1815079)

Hola, tengo que hacer un programa en el que se escriba la frase y detecte si hay tres mayusculas consecutivas mediante una función. Aquí dejo el enunciado.

Citar
Se introduce por teclado un texto que acaba en un punto. Escribir un programa que nos indique si existen tres letras mayúsculas consecutivas en el texto. Para resolver el problema realizar una función EsMayusc que a partir de un carácter nos devuelva un 1 si el carácter es alfabético mayúscula y devuelva un 0 en cualquier otro caso. No deberán leerse más datos que los necesarios.

Y aquí dejo el código que tengo hasta ahora, pero que claramente no funciona:

Código:
#include <stdio.h>

int esMayus(char c);

void main() {

char letra;

printf("Escribe una secuencia de texto: ");
scanf("%c", &letra);

while(letra != '.') {

if(esMayus(letra) == 1) {

scanf("%c", &letra);

if(esMayus(letra) == 1) {

scanf("%c", &letra);

if(esMayus(letra) == 1) {

printf("Encontrado.");

}

}

}

scanf("%c", &letra);

}

}

int esMayus(char c) {

if(c >= 'A' && c <= 'Z') return 1;
else return 0;

}


Título: Re: [C] Problema con bucle
Publicado por: avesudra en 3 Enero 2013, 20:18 pm
Hola alvr , tu tienes que introducir un texto no letra a letra por lo tanto el:
Código
  1. scanf("%c",&letra);
No puede ser , ya que estás leyendo una sola letra.Además tienes que declarar un array de carácteres para albergar un texto no una sola letra, así que así no es:
Código
  1. char letra;
Debería de ser así:
Código
  1. char frase[20];/** El 20 lo puedes cambiar por la cantidad de carácteres que quieras **/
Entonces ahora para leer la frase que vas a introducir terminada en un punto debes usar el especificador de formato '%s'(sin las comillas) así:
Código
  1. scanf("%s",&frase);
Pero esta función solo lee palabras. Así que tendrás que lidiar con esta(mejor dicho con la segura):
Código
  1. gets(frase);
Aunque esta función no es muy segura ( echale un vistazo a |Lo que no hay que hacer en C/C++. Nivel basico| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html) ) Esta función se sustituye por fgets:
Código
  1. fgets(frase,20,stdin);
Una vez tienes la frase leída e introducida en el array de carácteres trabajas con punteros o con el índice dentro de los corchetes y vas comprobando. En tu programa el problema principal es que solo lees letras no una frase.La función de comprobar si es mayúscula está bien. Si necesitas más ayuda aquí estamos.


Título: Re: [C] Problema con bucle
Publicado por: leosansan en 3 Enero 2013, 21:33 pm
Hola, tengo que hacer un programa en el que se escriba la frase y detecte si hay tres mayusculas consecutivas mediante una función.
Citar

Citándote: Y aquí dejo el código que tengo hasta ahora, pero que claramente funciona:
Código
  1. #include <stdio.h>
  2.  
  3. int esMayus(char c);
  4.  
  5. void main() {
  6.  
  7. char letra;
  8.    int cont=0;
  9. printf("Escribe una secuencia de texto terminada en punto: ");
  10. scanf("%c", &letra);
  11.  
  12. while(letra != '.') {
  13.  
  14. if(esMayus(letra) == 1)
  15.            cont++;
  16.        scanf("%c", &letra);
  17. }
  18.    (cont==3)? puts ("Encontrado"):puts ("No encontrado");
  19.     return 0;
  20. }
  21. int esMayus(char c) {
  22. if(c >= 'A' && c <= 'Z') return 1;
  23. else return 0;
  24. }
  25.  
Saluditos!. .........  :rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes:
P.D: avesudra el uso de char no implica que debas estar dándole al enter cada vez, pruébalo y lo veras..


Título: Re: [C] Problema con bucle
Publicado por: alvr en 3 Enero 2013, 22:06 pm
Gracias por la ayuda leosansan pero necesito que compruebe que hay tres mayúsculas seguidas, y por el código que has enviado cuenta las mayúsculas que hay incluso estando separadas.


Título: Re: [C] Problema con bucle
Publicado por: durasno en 3 Enero 2013, 23:44 pm
Solo es cuestion que hagas algunas modificaciones nada mas, el codigo base te lo hicieron(tampoco pidas todo)


Saludos


Título: Re: [C] Problema con bucle
Publicado por: leosansan en 3 Enero 2013, 23:45 pm
Gracias por la ayuda leosansan pero necesito que compruebe que hay tres mayúsculas seguidas, y por el código que has enviado cuenta las mayúsculas que hay incluso estando separadas.
Comprueba si funciona ahora:
Código
  1. #include <stdio.h>
  2.  
  3. int esMayus(char c);
  4.  
  5. int main() {
  6.  
  7. char letra;
  8.    int cont=0;
  9. printf("Escribe una secuencia de texto: ");
  10. scanf("%c", &letra);
  11.  
  12. while(letra != '.') {
  13. if(esMayus(letra) == 1) {
  14.            scanf("%c", &letra);
  15.                if(esMayus(letra) == 1) {
  16.                    scanf("%c", &letra);
  17.                        if(esMayus(letra) == 1) {
  18.                            scanf("%c", &letra);
  19.                            if(esMayus(letra) ==0)
  20.                                cont++;
  21.                            }
  22.                        }
  23.                    }
  24. scanf("%c", &letra);
  25. }
  26.    if ((cont>=1)) printf ("Encontrado %d veces",cont);
  27.    else puts ("No encontrado");
  28.    return 0;
  29. }
  30.  
  31. int esMayus(char c) {
  32.  
  33. if(c >= 'A' && c <= 'Z') return 1;
  34. else return 0;
  35.  
  36. }
  37.  
Saluditos!. .........  :rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes:


Título: Re: [C] Problema con bucle
Publicado por: alvr en 4 Enero 2013, 00:03 am
leosansan, no pide lo mismo, pero gracias de todas formas.

Al final he empezado de nuevo y parece que funciona bien. Aquí dejo el código por si alguno le resulta útil en un futuro.

Código:
#include <stdio.h>
 
int esMayus(char c);
 

void main() {
 
char letra;
int l1, l2, l3, enc = 0;

printf("Escribe una secuencia de texto: ");
scanf("%c", &letra);
 
while(letra != '.' && enc == 0) {

if(esMayus(letra) == 1) {

l1 = 1;
scanf("%c", &letra);

if(esMayus(letra) == 1) {

l2 = 1;
scanf("%c", &letra);

if(esMayus(letra) == 1 && l2 == 1) {

l3 = 1;
scanf("%c", &letra);
enc = 1;

}

}

} else {

scanf("%c", &letra);

}

}

if(l1 == l2 && l2 == l3) printf("Tres mayusculas consecutivas.");
else printf("No hay tres mayusculas consecutivas.");

}
 
int esMayus(char c) {
 
if(c >= 'A' && c <= 'Z') return 1;
else return 0;
 
}


Título: Re: {Solucionado} [C] Problema con bucle
Publicado por: durasno en 4 Enero 2013, 02:12 am
Creo q no hace falta tantos scanf para la lectura, solo reseteando la variable cont a cero cuando no hay 3 consecutivos alcanzaria; algo asi:

Código
  1. while(letra != '.') {
  2.  
  3. if(esMayus(letra) == 1)
  4. {
  5.  cont++;
  6.  if(cont==3)
  7.    consecutivo++;
  8. }
  9. else cont=0;
  10. scanf("%c", &letra);
  11.  
  12. }
  13.   (consecutivo!=0)? printf ("Consecutivos: %d veces\n",consecutivo):puts ("No encontrado");

Saludos

PD: lo creo q no considera es si se ingresan mas de 3 mayusculas consecutivas


Título: Re: {Solucionado} [C] Problema con bucle
Publicado por: zonahurbana en 4 Enero 2013, 04:35 am
Una forma de hacerlo en C++:
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int esMayus(char c){
  5. if(c>='A' && c<='Z') return 1;
  6. else return 0;
  7. }
  8.  
  9. int main()
  10. {
  11.    string frase;
  12.    do{
  13.    cout<<"Ingrese frase terminada en punto: ";
  14.    cin>>frase;
  15.    }while(frase.size()<3 || frase.find('.')==-1);
  16.    for(size_t i=0; i<frase.find('.')-2; ++i)
  17.        if(esMayus(frase[i]) && esMayus(frase[i+1]) && esMayus(frase[i+2]))
  18.        {
  19.            cout<<"Existen 3 mayusculas seguidas en el texto.";
  20.            return 0;
  21.        }
  22.    cout<<"No existen 3 mayusculas seguidas en el texto.";
  23.    return 0;
  24. }


Título: Re: [C] Problema con bucle
Publicado por: leosansan en 4 Enero 2013, 14:25 pm
..................................................

Al final he empezado de nuevo y parece que funciona bien.

Lamentablemente alvr no hace lo que debería ya que cuenta como tres si hay cuatro mayúsculas seguidas, por no decir que tampoco cuenta las apariciones, cosas ambas que en mi código si hacen.
Idem para el código de durasno, aunque él si cuenta las apariciones.

Saluditos!. ............. :rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes: