Programación en shell

Iniciado por Lariscal23, 6 Diciembre 2021, 19:58 PM

0 Miembros y 1 Visitante están viendo este tema.

Lariscal23

Buenas tardes,
Soy nueva es este foro, estoy estudiando Ingeniería Informática, y el profesor de Fundamentos de Informática nos ha mandado un trabajo en el que tenemos que calcular la Información asociada de un texto en un archivo, según la posición que introduzca el usuario.
No tengo ni idea de como hacer ese ejercicio, lo he buscado por internet y no he encontrado nada.
También tengo otro problema, al ejecutar el programa me da un fallo que dice finalización del programa en linea 20, cuando el programa solo tiene 14 lineas de código.
Os agradecería un montón que me ayudarais con esto porfa.
Muchas gracias de antemano.
Un saludo.
Larissa


Serapis

Cita de: Lariscal23 en  6 Diciembre 2021, 19:58 PM
...calcular la Información asociada de un texto en un archivo, según la posición que introduzca el usuario
¿Seguro que es es la descripción que te han dado o el resumen que tú haces...?
Es que es ambigüo, tiene múltiples interpretaciones, y en el mundillo de la programación el enemigo número 2 es la ambigüedad.
Yo podría interpretar (por ejemplo), que dado un punto en un fichero se localice el comienzo y final de una palabra, o de una frase... deduciría esto si estás estudiando por ejemplo operaciones con cadenas... es decir si hay un contexto que puede usarse para resolver la ambigüedad.
Ante las dudas reclama a tu profesor más claridad y detalles.

Cita de: Lariscal23 en  6 Diciembre 2021, 19:58 PM
También tengo otro problema, al ejecutar el programa me da un fallo que dice finalización del programa en linea 20, cuando el programa solo tiene 14 lineas de código.
Considera que las líneas en blanco también cuentan.
Sería tremendamente molesto que se diera el índice de una línea de código desechando las línea en blanco, casi que obligaría a uno a contarlas a ver cual es... siendo una posición absoluta basta mirar la línea que se señala.

La mayoría de IDEs enumeran las líneas, en cambio es raro en editores de texto plano, luego en ese caso toca contar.

Lariscal23

Es la descripción del ejercicio que nos ha mandado el profesor, no veo ni una sola pista en internet.
Gracias de antemano.
Larissa Calvo

Lariscal23

[OPCIÓN 2: Cálculo de información asociada a un mensaje de una fuente de
información.
 Se pedirá el nombre del fichero de la fuente de información por
pantalla.
 Si el fichero no existe se mostrará un mensaje de error y no se hará
nada. Si existe:
• Se pedirá la posición del mensaje del que se quiere calcular la
cantidad de información (por ejemplo, si se indica 3, se va a
calcular la cantidad de información asociada al mensaje cuya
probabilidad está en la línea 3)
• Se buscará la linea que se encuentra en la posición dada
o Si existe esa linea se devolverá la cantidad de
información asociada
o Si no existe esa linea se dará un mensaje de error y se
terminará esta opción.]
Esto es lo que nos ha mandado hacer el profesor.
Esto es lo que tengo yo:
read -p "introduce el nombre del fichero"
if [! -a fichero]
echo "el fichero no existe"
else
echo "Introduce la posicion del mensaje"
read posicion
bc -l probabilidad.bc
var $informacion
$informacion = log (1/posicion) / log 2
echo $informacion
for posicion in linea
do echo posicion
done
Muchas gracias y un saludo 

Serapis

#4
Creo que lo que trata de solicitarte es calcular la entropía, de una línea dada de un fichero elegido.
El término 'cantidad de información' es adecuado para referirse a la entropía y pasar de ahí a su cálculo, lo entiendo así cálculo de la entropía. Por eso te preguntaba por el contexto, para confirmar o desestimar, peor tampoco lo has aportado aunque el mensaje es ya lo suficientemente extenso como para interpretarlo en ese sentido.

Se supone que estais estudiando la teoría de la información (la entropía, Claude Shannon, compresión de datos, Huffman)????. Si es así, eso es lo que te pide, que calcules la entropía de la línea de un fichero, como no aclara si el fichero debe ser de texto o no, pero al hablar de líneas se ha de asumir que es un fichero de texto. Considera pués solo los 96 caracteres imprimibles (es decir que los 96 caracteres son equiprobables de aparecer, lógicamente la realidad es distinta, para eso es el cálculo).

Si lo estáis estudiando en estos momentos, lo tendreis fresco, si no puedes repasarlo:
https://es.wikipedia.org/wiki/Entropía_(información)
Por consola no es precisamente la mejor forma de hacer ciertas cosas... pero imagino que como estais empezando, os habrán enseñado lo básico y suficiente para 'ir tirando'.

el pseudocódigo vendría ser esto:


fichero= Solicitar nombredefichero
Si existe el fichero
  lineapedida = solicitar linea
  mientras no se alcance el final del fichero  
       linea = leer siguientelinea de fichero
       numerolinea = numerolinea +1
       Si numerolinea= lineapedida salimos dle bucle
  repetir
  Si numerolinea <> linea pedida
     informar "Se alcanzó el final del fichero y no se llegó a la linea pedida"
  sino
     calcular entropia de linea
     informar dle valor
  fin si
sino
  informar "no se encuentra el fichero indicado."
fin si


El calculo de la entropía se basa en la probabilidad de aparición y las apariciones reales encontradas. Inicialmente como te digo contamos 96 caracteres imprimibles (se spone un fichero de texto), todas con igual probabilidad luego inicialmente lqa probabilidad de aparición de cada carácter es: 1/96, o lo que e slo mismo en un modelo o´ptimo deberían aparecer 96 caracteres, y todos exactamente una vez. Luego la cantidad de caracteres en la línea tiene su valor y... debes recordar lo que has estudiado y supongo que también quieren poner a prueba como programas los contadores, bucles, condiciones, etc...

Lariscal23

Muchas gracias, me has salvado el ejercicio. Me gustaría mucho poder volver a contar contigo en caso de que tenga otra duda de programación.
Muchísimas gracias.
Larissa

Lariscal23

#6
#!/bin/bash
echo "Introduce el nombre del fichero" $fichero
if [test -f "$fichero"] then
echo "Introduce la linea" $line
  while [IFS= read -r $line]
       do
           echo $line;
   bc -l probabilidad.bc
     $informacionAs =$((log($numerolinea) / log 2))
     echo $informacionAs
        done
       if [$line <> IFS] then
         echo "Se alcanzó el final del fichero"
       fi
   done < $fichero
else
  echo "no se encuentra el fichero indicado."
fi
exit

No deja de darme fallos en la linea 14, me dice que quite el fi pero no puedo hacerlo porque es el final de la estructura if ¿que hago?
Muchas gracias de antemano
Larissa calvo

EdePC

mmm... primero recomiendo aprendas las instrucciones que vas a utilizar porque tu código esta muy mal XD, mas o menos siguiendo el pseudocódigo de Serapis y tu código sería algo así:

Código (bash) [Seleccionar]
#!/bin/bash
read -p "Introduce el nombre del fichero: " FICHERO
if [[ -f $FICHERO ]] ; then
  read -p "Introduce la linea: " LINEA_PEDIDA
  while IFS= read -r LINEA ; do
    NUMERO_LINEA=$((NUMERO_LINEA + 1))
    if [[ $NUMERO_LINEA == $LINEA_PEDIDA ]]; then
      break
    fi
  done < $FICHERO
  if [[ $NUMERO_LINEA != $LINEA_PEDIDA ]]; then
    echo "Se alcanzo el final del fichero y no se llego a la linea pedida"
  else
    echo "Calculando entropia con la linea $NUMERO_LINEA = $LINEA"
  fi
else
  echo "El archivo $FICHERO no existe"
fi


Yo de la entropía no tengo ni idea XD, no llevé eso en instituto. Pero en caso de Bash puedes revisar unos manuales para guiarte o sino preguntar:

Sesión Nº4: Variables, Alias y Órdenes de Búsqueda
http://www.ugr.es/~benghazi/practica/Sesion4.pdf

Sesión Nº5: Expresiones con variables y expresiones regulares
http://www.ugr.es/~benghazi/practica/Sesion5.pdf

Sesión Nº6: Programación del shell
http://www.ugr.es/~benghazi/practica/Sesion6.pdf

- Supongo que con esas 3 sesiones deberían bastarte para defenderte en el mínimo de Bash

Lariscal23

Muchas gracias por la ayuda, me estaba liando con la entropía, yo tampoco la dí en el instituto.

informatica123456

Buenas, yo tampoco se hacer este ejercicio por si me podíais ayudar. El enunciado es el siguiente:

o OPCIÓN 1: Crear una archivo de fuente de información
 Se pedirá el nombre de fichero por pantalla
 En el caso de que el archivo exista ya se mandará un mensaje de error
y no se hará nada. Si el archivo no existe se creará de la siguiente
manera:
• Se pedirá el número de mensajes que tiene la fuente de
información
• Se pedirán las probabilidades de cada mensaje de una en una
hasta completar el fichero.
Al finalizar la toma de probabilidades, si la suma de las mismas no es
1 se mostrará un mensaje de error y se borrará el fichero.