Mostrando entradas con la etiqueta biblioteca. Mostrar todas las entradas
Mostrando entradas con la etiqueta biblioteca. Mostrar todas las entradas

viernes, 8 de julio de 2011

Proyecto biblioteca (en Linux bash)


Para aprovechar algún tiempo que me sobró durante la realización del proyecto de la biblioteca, decidí realizar el mismo proyecto sobre la consola de un sistema Linux utilizando bash. Esto me ha permitido recordar un poco la sintaxis de este lenguaje de scripting, del que ya tenía algo de conocimientos. Además, hay que decir que la potencia de los lenguajes de script en la consola de Linux son mucho más potentes que la de MS-DOS.
Para ahorrar tiempo he tratado de traducir directamente los scripts de un lenguaje a otro. En algunos casos la semejanza entre los dos códigos es evidente pero en otros es completamente inexistente. Sin embargo, la lógica es la misma en los dos casos y por tanto los diagramas serían aplicables en los dos casos.


COMPROBAR EXISTENCIA DE DIRECTORIOS
#!/bin/bash
if [ ! -d "LIBROS" ]
then
mkdir LIBROS
fi
if [ ! -d "PRESTAMOS" ]
then
mkdir PRESTAMOS
fi
if [ ! -d "LISTADOS" ]
then
mkdir LISTADOS
fi

MENÚ
#!/bin/bash
./ComprobarDirs.sh

while [ false ]; do

clear
echo "1) Añadir libro"
echo "2) Prestar libro"
echo "3) Listar todos (ordenados por signatura)"
echo "4) Listar todos (ordenados alfabéticamente)"
echo "5) Listar prestados"
echo "6) Listar amigos con préstamos"
echo "7) Devolver libros"
echo "8) Buscar libro"
echo "9) Salir"

echo -e "Elija una opción: \c"
read opcion
echo "La opción elegida es: $opcion"

if [ $opcion -eq 1 ]; then
./AnadirLibro.sh
fi
if [ $opcion -eq 2 ]; then
./PrestarLibro.sh
fi
if [ $opcion -eq 3 ]; then
./ListarLibSig.sh
fi
if [ $opcion -eq 4 ]; then
./ListarLibAlf.sh
fi
if [ $opcion -eq 5 ]; then
./ListarLibPrest.sh
fi
if [ $opcion -eq 6 ]; then
./ListarAmigosPrest.sh
fi
if [ $opcion -eq 7 ]; then
./DevolverLibros.sh
fi
if [ $opcion -eq 8 ]; then
./BuscarLibro.sh
fi
if [ $opcion -eq 9 ]; then
exit
fi

done

AÑADIR LIBROS
#!/bin/bash

echo -e "\nIntroduzca la signatura del libro: "
read signatura
echo -e "\nIntroduzca el título: "
read titulo
echo -e "\nIntroduzca el nombre del autor: "
read autor

fichero="$signatura.lib"
echo -e "$titulo - $autor" > "LIBROS/$fichero"
echo -e "El libro ha sido incluido en la biblioteca"

read -p "Pulse para continuar..."


PRESTAR LIBROS
#!/bin/bash
echo -e "Introduzca el título del libro: "
read titulo
echo -e "Introduzca el nombre del autor: "
read nombreAutor
echo -e "Introduzca el nombre de su amigo: "
read nombreAmigo

fecha=`date +"%m/%d/%Y"`
echo -e "$titulo - $nombreAutor $fecha" > "PRESTAMOS/$nombreAmigo.pre"
echo -e "\nEl préstamo ha sido guardado"

read -p "Pulse para continuar..."

LISTAR LIBROS POR SIGNATURA
#!/bin/bash
if [ -f LISTADOS/ListadoLibrosSig.txt ]; then
rm LISTADOS/ListadoLibrosSig.txt
fi
for f in $( ls LIBROS/*.lib | sort ); do
# nombreLargo=${f%.*}
# nombre=${nombreLargo##*/}
lineaFichero=`cat $f`
titulo=${lineaFichero%-*}
#echo -e "$titulo"
echo -e "$titulo" >> LISTADOS/ListadoLibrosSig.txt
done

echo -e "\n******************************************"
echo -e "+++ LISTADO LIBROS POR SIGNATURA +++"
echo -e "******************************************"
cat LISTADOS/ListadoLibrosSig.txt

read -p "Pulse para continuar..."

LISTAR LIBROS ALFABÉTICAMENTE
#!/bin/bash
if [ -f LISTADOS/ListadoLibAlf.txt ]; then
rm LISTADOS/ListadoLibAlf.txt
fi

echo -e "************************************************"
echo -e "+++ LISTADO LIBROS ORDENADOS ALFABÉTICAMENTE +++"
echo -e "************************************************"
for f in $( ls LIBROS/*.lib ); do
lineaFichero=`cat $f`
titulo=${lineaFichero%-*}
echo -e "$titulo" >> LISTADOS/ListadoLibAlf.txt
done
cat LISTADOS/ListadoLibAlf.txt | sort > kk.tmp
mv kk.tmp LISTADOS/ListadoLibAlf.txt
cat LISTADOS/ListadoLibAlf.txt

read -p "Pulse para continuar..."

LISTAR AMIGOS CON PRÉSTAMOS
#!/bin/bash
if [ -f LISTADOS/ListadoAmigosPrest.txt ]; then
rm LISTADOS/ListadoAmigosPrest.txt
fi

for f in $( ls PRESTAMOS/*.pre | sort ); do
ruta=${f##*/}
nombreAmigo=${ruta%.*}
echo -e "$nombreAmigo" >> LISTADOS/ListadoAmigosPrest.txt
done

echo -e "\n**************************************************"
echo -e "+++ LISTADO ALFABÉTICO DE AMIGOS CON PRÉSTAMOS +++"
echo -e "**************************************************"

cat LISTADOS/ListadoAmigosPrest.txt

read -p "Pulse para continuar..."

DEVOLVER LIBROS
#!/bin/bash
#Obtenemos el nombre del amigo que devuelve los libros y eliminamos del
#directorio PRESTAMOS el archivo cuyo nombre se corresponede con el de
#dicho amigo
echo -e "Introduzca el nombre del amigo: "
read amigo

if [ -f "PRESTAMOS/$amigo.pre" ]; then
rm "PRESTAMOS/$amigo.pre"
echo -e "Los libros han sido devueltos"
else
echo -e "El amigo no existe o no tiene libros prestados\n"
fi
read -p "Pulse para continuar..."

BUSCAR LIBROS
#!/bin/bash
echo -e "Introduzca el título a buscar: "
read tituloBuscado

cat LIBROS/*.lib |grep "$tituloBuscado" >temp.tmp
encontrado=`stat -c%s "temp.tmp"`

if [ $encontrado -eq 0 ]; then
echo -e "No se ha encontrado el libro indicado\n"
else
echo -e "El libro se encuentra en la biblioteca\n"
fi
rm temp.tmp
read -p "Pulse para continuar..."

jueves, 7 de julio de 2011

Proyecto biblioteca (en MS-DOS)


En las últimas clases hemos tenido que crear un pequeño proyecto para poner en práctica el primer módulo del curso. Para ello hemos hecho un programa para la consola de comandos de MS-DOS que gestione una biblioteca.
El primer paso fue realizar un diagrama con la funcionalidad del programa para facilitar posteriormente la etapa de codificación. Para realizar esta tarea descubrí una herramienta online muy interesante (http://www.gliffy.com/). A continuación muestro los diagramas más genéricos realizados sobre la aplicación.


Una vez finalizada la etapa de planificación, era el momento de empezar a programar.
El primer paso es comprobar si existe la estructura de directorios, y si no es así crearla:

COMPROBAR EXISTENCIA DE DIRECTORIOS
@echo off
REM Comprobar la existencia de los directorios LIBROS, PRESTAMOS y LISTADOS
REM y, en caso de no existir, crearlos
echo ComprobarDirs 1
if not exist LIBROS md LIBROS
if not exist PRESTAMOS md PRESTAMOS
if not exist LISTADOS md LISTADOS
echo ComprobarDirs 2

Después se crea el menú principal mostrando las opciones que ofrece el programa y esperando por la elección del usuario:

MENÚ
@echo off
:inicio
call ComprobarDirs.bat
cls
echo 1) Anadir libro
echo 2) Prestar libro
echo 3) Listar todos (ordenados por signatura)
echo 4) Listar todos (ordenados alfabeticamente)
echo 5) Listar prestados
echo 6) Listar amigos con prestamos
echo 7) Devolver libros
echo 8) Buscar libro
echo 9) Salir

set /p opcion=Elija una opcion:
echo.

REM Opcion 1 (añadir libro)
if %opcion%==1 call AnadirLibro.bat
REM Opcion 2 (prestar libro)
if %opcion%==2 call PrestarLibro.bat
REM Opcion 3 (listar libros por signatura)
if %opcion%==3 call ListarLibSig.bat
REM Opcion 4 (listar libros alfabeticamente)
if %opcion%==4 call ListarLibAlf.bat
REM Opcion 5 (listar libros prestados)
if %opcion%==5 call ListarLibPrest.bat
REM Opcion 6 (listar amigos con prestados)
if %opcion%==6 call ListarAmigosPrest.bat
REM Opcion 7 (devolver libros)
if %opcion%==7 call DevolverLibros.bat
REM Opcion 8 (buscar libro)
if %opcion%==8 call BuscarLibro.bat
REM Opcion 9 (salir del programa)
if %opcion%==9 goto salir

goto inicio
:salir
echo Saliendo del programa...

A continuación se crean cada uno de los archivos .bat para realizar cada una de las tareas:

AÑADIR LIBROS
@echo off
REM Obtener signatura, título y autor del libro
set /p signatura=Introduzca la signatura del libro:
set /p titulo=Introduzca el titulo:
set /p autor=Introduzca el nombre del autor:

REM Crear un fichero "signatura.lib" y guardar en el
REM título - nombre autor
echo %titulo% - %autor% > .\LIBROS\%signatura%.lib
echo El libro ha sido incluido en la biblioteca
pause

PRESTAR LIBROS
@echo off
REM Obtenemos los parámetros titulo, nombreAmigo y fecha actual
set /p titulo=Introduzca titulo del libro:
set /p nombreAutor=Introducir nombreAutor:
set /p nombreAmigo=Introduzca el nombre de su amigo:
for %%A in (%Date%) do set fecha=%%A

REM Creamos el fichero "NombreAmigo.pre" y guardamos en el los
REM valores Título, nombreAmigo y fecha
echo %titulo% - %nombreAutor% - %fecha% > .\PRESTAMOS\%nombreAmigo%.pre
echo El prestamo ha sido guardado
pause

LISTAR LIBROS POR SIGNATURA
@echo off
REM Obtenemos todos los archivos de la carpeta libros
if exist .\LISTADOS\listadoLibrosAlf.txt del .\LISTADOS\listadoLibrosAlf.txt

SETLOCAL EnableDelayedExpansion
cd
for /f "tokens=1" %%G in ('dir /b LIBROS\*.lib') do (
set k=LIBROS/%%G
for /f "tokens=1 delims=-" %%A in (!k!) do echo a: %%A
echo %%H >> .\LISTADOS\listadoLibrosAlf.txt
)
echo.
echo El listado solicitado ha sido realizado y guardado en disco
echo.
pause

LISTAR LIBROS ALFABÉTICAMENTE

@echo off
REM Obtenemos todos los archivos de la carpeta libros
if exist .\LISTADOS\listadoLibrosAlf.txt del .\LISTADOS\listadoLibrosAlf.txt
for %%G in (.\LIBROS\*.lib) do (
for /f "tokens=1 delims=-" %%H in (%%G) do echo %%H >> .\LISTADOS\listadoLibrosAlf.txt
)
sort .\LISTADOS\listadoLibrosAlf.txt > temp.txt
move temp.txt .\LISTADOS\listadoLibrosAlf.txt
type .\LISTADOS\listadoLibrosAlf.txt
echo.
echo El listado solicitado ha sido realizado y guardado en disco
echo.
pause

LISTAR AMIGOS CON PRESTAMOS
@echo off
REM Obtener archivos de la carpeta prestamos y mostrar el nombre del archivo sin
REM extensión
if exist .\LISTADOS\listadoAmigosPrest.txt del .\LISTADOS\listadoAmigosPrest.txt
for /f "tokens=1 delims=." %%G in ('dir /b PRESTAMOS\*.pre') do echo %%G >> .\LISTADOS\listadoAmigosPrest.txt
type .\LISTADOS\listadoAmigosPrest.txt
pause

DEVOLVER LIBROS
@echo off
REM Obtener el nombre del amigo que devuelve los libros
set /p amigo=Introduzca el nombre del amigo:
REM Eliminar de la carpeta PRESTAMOS el archivo correspondiente al amigo indicado
del .\PRESTAMOS\%amigo%.pre 2> nul
echo Los prestamos indicados han sido eliminados
pause

BUSCAR LIBROS

@echo off
REM Buscar en el directorio LIBROS si alguno de los ficheros contiene el título seleccionado
REM Obtenemos el título a consultar
set /p titulo=Introduzca el titulo a buscar:
for /f %%G in ('dir /b .\LIBROS\*.lib') do (
for /f "tokens=2 delims=:" %%H in ('find /c ^"%titulo%^" .\LIBROS\%%G') do (
if %%H gtr 0 (
goto hayLibros
)
)
)
goto noHayLibros
:hayLibros
echo.
echo En la biblioteca existe algun libro con ese titulo
echo.
goto salir
:noHayLibros
echo En la biblioteca no existe ningun libro con ese titulo
:salir
pause