-
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 151r 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!
-
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 suficienteSalu2
-
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
-
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=3palabra=null
palabras_prohibidas="Lista de palabras prohibidas"
palabras_encontradas=null
contador_prohibidas=0
contador_distintas=0Repetir
….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: SPAMCreo 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)