====== Examen Parcial - 75.08. Sistemas Operativos ====== **Cátedra:** Osvaldo Clua\\ **Fecha:** Primera Oportunidad - Primer Cuatrimestre 2009\\ **Día:** 03/11/2009\\ **Tema:** 1 Esta página está incompleta; podés ayudar completando el material. ===== Enunciado ===== Leer un archivo de datos llamado "Cultivos" y obtener la sumatoria de las **diferencias** entre la superficie cultivada y la superficie cosechada por cultivo (sin importar el establecimiento) usando una estructura hash (el campo cultivo es el que se emplea como clave) y luego grabar un archivo de salida con los cultivos en donde la diferencia sea negativa. Al invocar el comando se debe pasar como parámetro el nombre del archivo de salida. Solicitar al usuario que ingrese por estándar input un código de zona y procesar sólo los registros que pertenecen a esa zona, el resto ignorarlos. **__Condiciones de Resolución:__**\\ - Que el archivo "cultivos" exista, se pueda leer y no este vacío. - Que el archivo de salida ingresado como parámetro obligatorio en la invocación del comando **no** exista. - Que el código de Zona ingresado por standard input exista en zona.tab - Si se verifican estas tres condiciones, efectuar la sumatoria y grabar la salida. - Si alguna de estas tres condiciones no se verifica, mostrar por pantalla un mensaje descriptivo del error y cancelar el programa. - No usar archivos auxiliares, comandos Unix (bajo ningún concepto) ni expresiones regulares (excepto las expresiones simples de las funciones predefinidas de perl) - Abrir y cerrar adecuadamente los archivos. En todos los archivos (input o output) el separador de registros es el new line. Respetar el separador de campo que se indica en cada estructura. La estructura del archivo de cultivos es: Código de zona:Código de Establecimiento:Cultivo:Superficie cultivada:Rinde Esperado:Superficie cosechada:Rinde Obtenido\\ La estructura del archivo de zonas.tab es: Código de zona;Nombre de Zona\\ La estructura del archivo de salida.es es: Código de zona,Nombre de Zona,Cultivo,**Direferencia** Obtenida,Usuario de Grabación,Fecha de Grabación ===== Resolución ===== #!/usr/bin/perl #~ GonchuB #~ 03-11-2009 #~ Perl my $archivo_cultivos = "Cultivos"; my $separador_cultivos = ":"; my $archivo_zonas = "zonas.tab"; my $separador_zonas = ";"; my $archivo; my $linea; my @lineas; #~ Se valida que el archivo de cultivos se pueda abrir en modo lectura. open(CULTIVOS, "<", $archivo_cultivos) || die "No se puede abrir el archivo de cultivos.\n"; $archivo = join( "", ); @lineas = split( "\n", $archivo ); if( scalar @lineas == 0 ) { die "El archivo de cultivos esta vacio.\n"; } my $archivo_salida; my $separador_salida = ","; #~ Se pasa como parametro el archivo de salida. if( $#ARGV == -1 ){ die "Se debe pasar como parametro el archivo de salida.\n"; } else { $archivo_salida = $ARGV[0]; } #~ El archivo de salida ya existe. if( open(SALIDA, "<", $archivo_salida) ){ close(SALIDA); die "El archivo salida especificado ya existe.\n"; } open(ZONAS, "<", $archivo_zonas) || die "No se puede abrir el archivo de zonas.\n"; my %hash_zonas = (); my $codigo_zona; my $nombre_zona; #~ Lleno el hash codigo_zona : nombre_zona; $archivo = join( "", ); @lineas = split( "\n", $archivo ); foreach $linea (@lineas) { ($codigo_zona, $nombre_zona) = split( $separador_zonas, $linea ); $hash_zonas{$codigo_zona} = $nombre_zona; } #~ Ingreso de codigo de zona por STDIN. my $codigo_zona_input; print "Ingrese el codigo de zona a filtrar: "; $codigo_zona_input = ; #~ Valido que la zona exista en el archivo de zonas. if( ! exists($hash_zonas{$codigo_zona_input}) ){ die "No existe la zona ingresada.\n"; } #~ Variables extraidas del archivo de cultivos. my $codigo_establecimiento; my $cultivo; my $superficie_cultivada; my $rinde_esperado; my $superficie_cosechada; my $rinde_obtenido; my $diferencia; #~ Lectura del archivo de cultivos. my %hash_cultivos = (); $archivo = join( "", ); @lineas = split( "\n", $archivo ); foreach $linea (@lineas) { ($codigo_zona,$codigo_establecimiento,$cultivo,$superficie_cultivada,$rinde_esperado,$superficie_cosechada,$rinde_obtenido) = split( $separador_cultivos, $linea ); $diferencia = $superficie_cultivada - $superficie_cosechada; if( $codigo_zona eq $codigo_zona_input ) { if( exists($hash_cultivos{$cultivo}) ){ $hash_cultivos{$cultivo} += $diferencia; } else { $hash_cultivos{$cultivo} = $diferencia; } } } my $username = getpwuid( $< ); my $time; #~ Itero el hash de cultivos. foreach $clave (keys(%hash_cultivos)) { $diferencia = $hash_cultivos{$clave}; $time = localtime; if( $diferencia < 0 ) { print SALIDA "$codigo_zona_input,$hash_zonas{$codigo_zona_input},$clave,$diferencia,$username,$time\n"; } }