elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda para resolver este problema de C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda para resolver este problema de C  (Leído 3,124 veces)
Legors

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Ayuda para resolver este problema de C
« en: 30 Enero 2017, 03:22 am »

Un amigo me ha retado a intentar programar esto en C, soy principiante y por mas que he intentado no lo he logrado.

Le dije que me rendía y que me dijera como hacerlo pero se nego jajaja.

Entrada

Un texto formado por caracteres alfabéticos y blancos. Cada palabra del texto está formada exclusivamente por caracteres alfabéticos y mide entre 1 y 10 caracteres de longitud.

Salida

La cantidad de veces que aparece la palabra "sak" o algo parecido: cualquier cadena de mayúsculas o minúsculas que empiece con una o más "s", siga con una o más "a" y termine con una o más "k".




Llevo esto hasta ahora.

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

int main()
{
    char texto[300];
    int longi, x=0;
    int saltos=0;

    gets(texto);

    longi = strlen (texto);

    for(x=0; x<longi; x++){
        if(texto[x]==' ');
        else{
            if(texto[x]=='s'||texto[x]=='S'){
                while(texto[x]=='s'||texto[x]=='S'){
                    x++;
                }
                if(texto[x]=='a'||texto[x]=='A'){
                    while(texto[x]=='a'||texto[x]=='A'){
                        x++;
                    }
                    if(texto[x]=='k'||texto[x]=='K'){
                        while(texto[x]=='k'||texto[x]=='K'){
                            x++;
                        }
                        if(texto[x]==' '||texto[x]=='\0'){
                            saltos++;
                        }
                    }
                }
            }
        }
    }

    printf("%d", saltos);
}

Casi funciona bien. El problema es que cuenta palabras como "asak" o "tarsak" por que tiene las combinaciones de s, a y k.


« Última modificación: 30 Enero 2017, 15:57 pm por Legors » En línea

Kenji-chan

Desconectado Desconectado

Mensajes: 104


Ver Perfil
Re: Ayuda para resolver este problema de C
« Respuesta #1 en: 30 Enero 2017, 13:51 pm »

muestra cual es el código que llevas para poder orientarte


En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Ayuda para resolver este problema de C
« Respuesta #2 en: 30 Enero 2017, 20:29 pm »

Lo más sencillo es crear una máquina de estados. Es decir, tu buscas la secuencia ' sak', nótese el espacio delante.
Empiezas por un estado de 0 que quiere decir que no tienes ningún carácter de la secuencia.
Sólo cuándo encuentres el espacio pasas al estado 1.
Sigues en el estado 1 mientras encuentres espacios.
Si encuentras el carácter 's' o 'S' pasas al estado 2, si encuentras otro carácter diferente a la 's', 'S', o ' ', regresas al estado 0.
Estando en estado 2 sigues mirando caracteres. Si es una 's' o 'S' sigues en estado 2, si es 'a' o 'A' pasas al estado 3, si es otra situación regresas al estado 0.
Estando en estado 3 sigues mirando caracteres. Si es una 'k' o 'K' sigues en estado 3, si es un espacio ' ' has encontrado la secuencia y aumentas un contador y regresas al estado 0.

Pero te encontrarás con un problema: Si empiezas de esta forma y la primera palabra es sak NO te la contará. Te dejo que resuelvas eso.
En línea

Kenji-chan

Desconectado Desconectado

Mensajes: 104


Ver Perfil
Re: Ayuda para resolver este problema de C
« Respuesta #3 en: 30 Enero 2017, 21:56 pm »

en el if(texto
  • =='  '); puedes ponerlo como
    Código:
    if(texto[x]!='  ')
    y te quitas el else{}
    después ya que sabemos que tenemos que comprobar el texto sak independiente mente de si tiene mayúsculas o no entonces espesamos por comprobar la primera letra sak si esta condición se cumple buscamos si la siguiente letra es a o A con un texto[x+1]  y siesta comprobación también es correcta hacemos lo mismo para la siguiente con texto[x+2]
    y si todo esto se cumple quiere decir que el texto sak se encuentra en esta palabra o frase
    con lo que hacemos un saltos++ y listo ya lo tendríamos terminado
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines