Ejercicio 2 · Fundamentos de Programación I URV 2015

Tema: Disseny del programa principal i resolució integrada de problemes · Del examen Examen Segundo Parcial. Evaluación Continua 2015-2016 (2015)

Enunciado

Ejercicio 2 (5 puntos). Mensajes electrónicos sospechosos

Se dispone de un conjunto de correos electrónicos introducidos de forma secuencial por teclado con el objetivo de evaluar si alguno de ellos pudiera estar vinculado a comunicaciones delictivas o de terrorismo internacional.

Para facilitar el análisis se cuenta con una lista predefinida de términos de alerta o palabras clave que se obtiene invocando una función previamente desarrollada con la siguiente especificación:

constants

MAX_P:= 60;

MAX_MOTS:= 100;

fconst

tipus

registre paraula_tipus és

mot: taula [MAX_P] de caràcters;

mida: enter;

fregistre

ftipus

funció llegir_mots_clau (var mots_clau: taula de paraula_tipus, dim: enter) retorna enter;

Dicha función almacena las palabras clave en la tabla y devuelve la cantidad real leída. No debe programarse este subprograma.

Formato del flujo de entrada:

La secuencia contiene una cantidad indeterminada de mensajes y se cierra con el centinela global "FINAL" (situado inmediatamente a continuación de la marca "FITEXT" del último correo).

Cada mensaje consta de una cabecera seguida del cuerpo del texto, finalizando este con la marca "FITEXT".

La cabecera contiene, separados por espacios:

Dirección de correo del emisor (cadena de hasta 60 caracteres).

Dirección de correo del receptor (hasta 60 caracteres).

IP de origen (secuencia de caracteres).

IP de destino (secuencia de caracteres).

Fecha del mensaje (día, mes y año como números enteros).

El cuerpo del mensaje contiene frases separadas por puntos y palabras separadas por espacios (sin signos de puntuación adicionales ni acentos). Cada palabra individual tiene un tamaño máximo de 60 caracteres.

Si una palabra clave se repite en el texto, se computa tantas veces como aparezca.

Un mensaje se cataloga como sospechoso si el porcentaje de palabras clave detectadas en su texto supera un umbral fijado por el usuario (solicitado previamente por teclado antes de procesar los mensajes).

Módulos de soporte disponibles (ya implementados):

funció paraules_iguals (p1, p2: paraula_tipus) retorna booleà; (compara sin distinguir mayúsculas/minúsculas).

acció copiar_cadena (p_ori: paraula_tipus, var p_desti: paraula_tipus);

acció escriure_paraula (paraula: paraula_tipus);

a)

Definir las estructuras de datos indispensables para resolver el problema.

b)

Desarrollar el algoritmo modular para procesar la entrada por teclado y proporcionar en la salida estándar:

a. La cabecera detallada (fecha en formato d/m/a, emisor, destinatario, IP origen e IP destino) de cada uno de los correos clasificados como sospechosos.

b. La cantidad total de mensajes sospechosos detectados.

Enunciado: Ejercicio 2 · Fundamentos de Programación I URV 2015

Solución

Según los criterios oficiales de corrección

a. Definir las estructuras de datos indispensables para resolver el problema.

Solución: ```pseudocode constants LONG_MAX = 60; MAX_VOCAB = 100; fconst tipus registre t_mot és contingut: taula[LONG_MAX] de caràcters; longitud: enter; fregistre registre t_calendari és d, m, a: enter; fregistre registre t_vocab_clau és termes: taula[MAX_VOCAB] de t_mot; quants: enter; fregistre registre t_capcalera_correu és remitent: t_mot; destinatari: t_mot; origen_ip: t_mot; desti_ip: t_mot; data_enviament: t_calendari; fregistre ftipus ```

b. Desarrollar el algoritmo modular para procesar la entrada por teclado y proporcionar en la salida estándar la cabecera detallada de los sospechosos y el total.

Solución: ```pseudocode // Verificación de si un término pertenece al listado de palabras de alerta funció es_terme_clau (m: t_mot, diccionari: t_vocab_clau) retorna booleà és var idx: enter; coincidencia: booleà; fvar inici idx ← 0; coincidencia ← fals; mentre (idx < diccionari.quants) i (no coincidencia) fer si paraules_iguals(m, diccionari.termes[idx]) llavors coincidencia ← cert; sino idx ← idx + 1; fsi fmentre retorna (coincidencia); ffunció // Muestra los campos informativos de un correo sospechoso acció imprimir_capcalera_sospechosa (cap: t_capcalera_correu) és inici escriure("\nFecha: ", cap.data_enviament.d, "/", cap.data_enviament.m, "/", cap.data_enviament.a); escriure("\nRemitente: "); escriure_paraula(cap.remitent); escriure("\nDestinatario: "); escriure_paraula(cap.destinatari); escriure("\nIP remitente: "); escriure_paraula(cap.origen_ip); escriure("\nIP destinatario: "); escriure_paraula(cap.desti_ip); escriure("\n"); facció // Lectura secuencial de la cabecera. Retorna falso si se detecta "FINAL" funció llegir_meta_correu (var cap: t_capcalera_correu, marca_fi: t_mot) retorna booleà és var primera_paraula: t_mot; fvar inici llegir_paraula(primera_paraula, LONG_MAX); si paraules_iguals(primera_paraula, marca_fi) llavors retorna (fals); sino cap.remitent ← primera_paraula; llegir_paraula(cap.destinatari, LONG_MAX); llegir_paraula(cap.origen_ip, LONG_MAX); llegir_paraula(cap.desti_ip, LONG_MAX); llegir(cap.data_enviament.d); llegir(cap.data_enviament.m); llegir(cap.data_enviament.a); retorna (cert); fsi ffunció // Procesamiento completo del cuerpo textual del mensaje acció analitzar_contingut_missatge (dicc: t_vocab_clau, fi_cos: t_mot, var paraules_totals: enter, var claus_trobades: enter) és var paraula_actual: t_mot; fvar inici paraules_totals ← 0; claus_trobades ← 0; llegir_paraula(paraula_actual, LONG_MAX); mentre (no paraules_iguals(paraula_actual, fi_cos)) fer paraules_totals ← paraules_totals + 1; si es_terme_clau(paraula_actual, dicc) llavors claus_trobades ← claus_trobades + 1; fsi llegir_paraula(paraula_actual, LONG_MAX); fmentre facció // Programa principal de monitorización Algorisme auditoria_missatges és var diccionari: t_vocab_clau; correu: t_capcalera_correu; centinella_final, centinella_fitext: t_mot; llindar_percentatge, percent_calculat: real; n_totals, n_claus, total_sositosos: enter; hi_ha_correu: booleà; fvar inici diccionari.quants ← llegir_mots_clau(diccionari.termes, MAX_VOCAB); escriure("Introduzca el umbral porcentual de alerta: "); llegir(llindar_percentatge); inicialitzar_cadena(centinella_final, "FINAL"); inicialitzar_cadena(centinella_fitext, "FITEXT"); total_sositosos ← 0; hi_ha_correu ← llegir_meta_correu(correu, centinella_final); mentre (hi_ha_correu) fer analitzar_contingut_missatge(diccionari, centinella_fitext, n_totals, n_claus); si (n_totals > 0) llavors percent_calculat ← (100.0 * n_claus) / n_totals; si (percent_calculat > llindar_percentatge) llavors imprimir_capcalera_sospechosa(correu); total_sositosos ← total_sositosos + 1; fsi fsi hi_ha_correu ← llegir_meta_correu(correu, centinella_final); fmentre escriure("\nHay ", total_sositosos, " mensajes sospechosos, tienen más de un ", llindar_percentatge, "% de palabras clave.\n"); falgorisme ```

La explicación paso a paso, hecha con IA, es Premium. Premium

Resuélvelo aquí mismo: corrección automática, pistas y solución paso a paso.

‹ Ejercicio 1 · 2015 · Exercici 1 · 2013 ›

Más ejercicios de Disseny del programa principal i resolució integrada de problemes