Prueba y compara el rendimiento de tu PC con nuestro banco de pruebas.

Uff….menuda practica nos han metido xD, un poquito de ayuda?


  • Veteranos HL

    Hola gente!!

    Pues vereis, despues de mas de 1 mes sin hacer programacion (entre vacaciones, examenes i tal…) pues nos han metido una practica un tanto chunguilla.

    Os comento, el programa consiste en introducir un texto, y que el programa nos diga si el texto es spam o no.
    Las palabras consideradas spam son: Viagra Cialis Nigeria Caca Pedo Culo Pis
    El texto sera Spam siempre que cumpla estas 2 condiciones a la vez:

    • El numero total de apariciones de palabras de esta lista sea mayor de 6
    • Aparezcan almenos 3 palabras de esa lista.

    Bueno, pues lo que yo tenia pensado de momento, con diseño descendiente obviamente

    #include<stdio.h>
    #include<string.h>
    #define MAXCAR 15

    1r Nivel

    main ()
    {
    char spam1[viagra], spam2[cialis], spam3[nigeria], spam4[caca], spam5[pedo], spam6[culo], spam7[pis], actual, palabra[MAXCAR];
    int contador=0, contador2=0, s1=0, s2=0, s3=0, s4=0, s5=0, s6=0, s7=0, spam=0;

    leer_primera_palabra(actual,palabra);

    comparar_palabra(actual,spam1[viagra],spam2[cialis],spam3[nigeria],pam4[caca],spam5[pedo],spam6[culo],spam7[pis])

    while(comparador(actual,spam1[viagra],spam2[cialis],spam3[nigeria],pam4[caca],spam5[pedo],spam6[culo],spam7[pis])=1;
    {
    leer_palabra(actual)
    comparar_palabra(actual,spam1[viagra],spam2[cialis],spam3[nigeria],pam4[caca],spam5[pedo],spam6[culo],spam7[pis])
    }
    contador++
    if (actual=spam1) {s1++};
    if (actual=spam2) {s2++};
    if (actual=spam3) {s3++};
    if (actual=spam4) {s4++};
    if (actual=spam5) {s5++};
    if (actual=spam6) {s6++};
    if (actual=spam7) {s7++};
    if (actual=spam1 & s1=1){contador2++};
    if (actual=spam2 & s2=1){contador2++};
    if (actual=spam3 & s3=1){contador2++};
    if (actual=spam4 & s4=1){contador2++};
    if (actual=spam5 & s5=1){contador2++};
    if (actual=spam6 & s6=1){contador2++};
    if (actual=spam7 & s7=1){contador2++};

    texto_spam(contador, contador2, spam);
    if(spam=1){printf("El texto es SPAM \n")};
    else {printf("El texto no es SPAM, no hay troles a la vista \n")};
    }

    2do Nivel

    Void leer_primera_palabra(char actual[])
    {
    Scanf(“%c”,& actual);
    Leer_palabra(actual,palabra);
    }

    Void leer_palabra(char actual, char palabra[]);
    {
    Saltar_espacios(actual);
    Copiar_palabra(palabra,actual);

    Void texto_spam(int contador, int contador2, int spam)
    {
    If(contador > 6 && contador2 > 3){spam=1}
    }

    3r Nivel

    void saltar_espacios(char & actual);
    {
    While(actual == “ “) scanf(“%c”,& actual);
    }

    void copiar_palabra(char palabra[], char & actual);
    {
    int i=0
    while(actual != “ ” && actual != “.”)
    {
    paraula_
    i++
    scanf(“%c”,& actual);
    }
    Paraula_= “\0”;
    }

    Como lo veis? Bueno….ya me lo imagino, pero esta tan mal como yo me pienso, o tiene un pase...xD?

    Saludos y os lo agradecere todo lo que podais decir/opinar ;D__</string.h></stdio.h>



  • Joer macho, llevo 5 años en la carrera y sabes programar mejor que yo 😄

    Suerte!


  • Veteranos HL

    @albertpg:

    Joer macho, llevo 5 años en la carrera y sabes programar mejor que yo 😄

    Suerte!

    Pues si estoy en 1ro!!! xDD



  • Joder que mala pinta tiene ese codigo 😄

    No me acuerdo de lo que podia hacer C pero se me ocurre que se puede resolver facilmente con las funciones de las cadenas
    Si metes todo el texto como si fuera una cadena le puedes hacer por ejemplo
    texto.Contains("Palabra) y te devuelve si el texto tiene esa palabra
    texto.Split("Palabra") te devuelve un array de strings partidos donde se ha encontrado esa palabra. Array.lenght - 1 = numero de apariciones de esa palabra en el texto
    Con eso y un par de if y un par de FOR deberia ser suficiente

    Salu2


  • Veteranos HL

    AlbertPG; lo tuyo es un caso aparte, no entiendo como puedes aprobar la asignatura de MTP sin saber programar; esque no lo entiendo… y MTP2? también la tienes aprobada?

    Cuanto le pagas a tu compañero de trabajo?:D;D

    Saludos!



  • No hombre.. si que se jejeje, pero se me da bastante mal.

    MTP1, la verdad q la aprobé gracias a mis compañeros, y MTP2, las prácticas son más ´fáciles y ahi si que las entendía 😉


  • Veteranos HL

    Como algunas ideas:

    1. Yo crearía un array de cadenas (osea un array de arrays de char) para almacenar todas las palabras prohibidas.

    2. Solo crearía tres funciones: una para leer una palabra de una cadena (no necesitas una para leer la primera palabra y otra para el resto, como lo has puesto), otra para comprobar si una palabra está en el array de palabras y otra para insertar una palabra en el array. Son muy sencillas.

    3. El código main lo único que tendría que hacer es llamar a la función leer palabra, llamar a la función que comprueba si la palabra está en la lista de prohibidas y si lo está incrementar un contador entero (para comprobar si aparecen 6 palabras) y otro contador para ver si aparecen tres palabras distintas. Te lo pongo en pseudocódigo:

    char [] palabra;
    char [][] palabras_prohibidas, palabras_encontradas;
    int contador_prohibidas, contador_distintas;

    "Inicializar palabras_prohibidas con la lista correspondiente"
    "Función LeerPalabra lee una palabra de la cadena_de_entrada, devuelve la palabra como resultado y modifica la cadena, eliminando la palabra leída. Devuelve null si la cadena está vacía"
    "Función EstaEnLaLista comprueba si la palabra está en la lista y devuelve true si lo está o false si no está en la lista"
    "Función InsertarEnLaLista inserta una palabra en la lista devolviendo true si se puede insertar y false si la palabra ya estaba insertada en la lista previamente"

    const max_ocurrencias=6
    const max_distintas=3

    palabra=null
    palabras_prohibidas="Lista de palabras prohibidas"
    palabras_encontradas=null
    contador_prohibidas=0
    contador_distintas=0

    Repetir
    ….palabra=LeerPalabra (cadena_de_entrada)
    ....Si EstaEnLaLista (palabra, palabras_prohibidas) Entonces
    ........ contador_prohibidas++;
    ........ Si InsertarEnLaLista (palabra, palabras_encontradas) Entonces
    ............ contador_distintas++;
    ........ Fin del Si
    ....Fin del Si
    Hasta que (contador_prohibidas>=max_ocurrencias y contador_distintas>=max_distintas) o (palabra=null)

    Si palabra=null Entonces
    .... Las condiciones no se cumplen: No es Spam
    Sino
    .... Las condiciones se cumplen: SPAM

    Creo que es una solución bastante elegante y tiene la ventaja de que te servirá para cualquier conjunto de palabras y para cualquier condición de salida (sean 6 ocurrencias y 3 distintas o cualquier otra)


Accede para responder