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:

  1. Que el archivo “cultivos” exista, se pueda leer y no este vacío.
  2. Que el archivo de salida ingresado como parámetro obligatorio en la invocación del comando no exista.
  3. Que el código de Zona ingresado por standard input exista en zona.tab
  4. Si se verifican estas tres condiciones, efectuar la sumatoria y grabar la salida.
  5. Si alguna de estas tres condiciones no se verifica, mostrar por pantalla un mensaje descriptivo del error y cancelar el programa.
  6. No usar archivos auxiliares, comandos Unix (bajo ningún concepto) ni expresiones regulares (excepto las expresiones simples de las funciones predefinidas de perl)
  7. 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( "", <CULTIVOS> );
@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( "", <ZONAS> );
@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 = <STDIN>;
 
#~ 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( "", <CULTIVOS> );
@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";
	}
 
}
materias/75/08/parcial_20091103_perl_t1.txt · Última modificación: 2013/05/20 23:00 por Gonchub
 
Excepto donde se indique lo contrario, el contenido de esta wiki se autoriza bajo la siguiente licencia: CC Attribution-Noncommercial-Share Alike 3.0 Unported


Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki