Examen Parcial - 75.08. Sistemas Operativos

Cátedra: Osvaldo Clua
Fecha: Primera Oportunidad - Primer Cuatrimestre 2005
Día: 24/05/2005
Tema: PERL

Esta página está incompleta; podés ayudar completando el material.

Enunciado

Desarrollar un comando PERL denominado “saca_saldo.pl” que obtiene el saldo final en cuenta corriente (positivo o negativo) de los clientes luego de procesar facturas y pagos. Los registros de facturas tienen su monto sin signo, los registros de pagos tienen su monto con signo negativo. Para invocar este comando, el usuario especificará los siguientes parámetros.

  1. Parámetro 1: Ubicación del campo monto
  2. Parámetro 2: Ubicación del campo cliente
  3. Parámetro 3: Nombre del archivo de ENTRADA
  4. Parámetro 4: Nombre del archivo de SALIDA

El comando debe procesar el archivo de ENTRADA cuyo nombre es pasado como parámetro y dejar el resultado en el archivo de SALIDA cuyo nombre tambien es pasado como parámetro.

El separador de campos del archivo de ENTRADA es la coma.

El separador de campos del archivo de SALIDA debe ser el punto y coma, y su formato : cliente;saldo

Ademas se pasan como parámetro: ubicación del campo cliente y ubicación del campo monto dentro del archivo de entrada.

Es obligatorio el uso de una estructura de hash para efectuar la suma de los montros por cliente. El campo cliente es el que se debe emplear como clave y el campo monto es el que se debe acumular.

Salida: Se debe grabar en un archivo de salida con todos los clientes y su correspondiente saldo.

Validaciones a efectuar:

  1. Que sean 4 parámetros, si se pasan menos o más, mostrar por pantalla un mensaje descriptivo del error y terminar el proceso con algún codigo de error.
  2. Que el archivo de entrada exista y tenga permisos de lectura. Si no existe mostrar por pantalla un mensaje del error.
  3. Que “ubicación del campo cliente” se un numero >=1 y ⇐ cantidad total de cmapos del registro de entrada.
  4. Que “ubicación del campo monto” sea un numero >=1 y ⇐ cantidad total de campos del registro de entrada
  5. Que “ubicación del campo cliente” sea distinto a “ubicación del campo monto”
  6. Que el archivo de salida no exista. Si existe, preguntar al usuario si desea sobre-escribirlo. Si indica “SI” o “si”, entonces sobre-escribirlo, si indica “NO” o “no” , entonces cancelar el script mostrando mensaje de error.

Ejemplo

Archivo input (usando las 2da y 4ta columna):
<tex>\begin{array}{|c|c|c|c|c|}\hline & 1200 & & \mbox{Raul Perez} &\\\hline & -222.55 & & \mbox{Jose Gomez}& \\\hline & -100.1 & & \mbox{Raul Perez}& \\\hline\end{array}</tex>

Resolución

#!/usr/bin/perl -w
 
################################################################################################################
# Autor: Maximiliano Milicich (maximiliano.milicich@gmail.com)
################################################################################################################
 
# Deben ser 4 argumentos:
$cant_param = @ARGV;
if ($cant_param != 4) {
	print "Error - Debe informar 4 parametros: pos_campo_MONTO pos_campo_CLIENTE arch_IN arch_OUT".$/;
	exit 1;
}
 
$pos_campo_monto = $ARGV[0];
$pos_campo_cliente = $ARGV[1];
$arch_in = $ARGV[2];
$arch_out = $ARGV[3];
 
# Validaciones de argumentos:
if ($pos_campo_monto < 1 || $pos_campo_cliente < 1) {
	print "Los argumentos de posicion de campo deben ser iguales o mayores a 1.".$/;
	exit 1;
}
if ($pos_campo_monto == $pos_campo_cliente) {
	print "Los argumentos de posicion de campo MONTO - CLIENTE no pueden ser iguales".$/;
	exit 1;
}
 
# Existe el archivo de salida ? lo sobreescribimos ?
while (open(TEST_EXISTS, "< $arch_out")) {
	close(TEST_EXISTS);
	print "El archivo $arch_out ya existe. Desea sobreescribirlo? : ";
	$rta = <STDIN>;
	chomp($rta);	
	if ($rta =~ /^\s*SI\s*$/i) {
		last;
	}
	elsif ($rta =~ /^\s*NO\s*$/i) {
		print "Proceso cancelado.".$/;		
		exit 1;
	}
	else {
		next;
	}
}
 
 
# Este es el hash para almacenar el saldo x cliente:
%saldo_x_cliente = ();
 
 
# Procesamos el archivo de entrada, linea a linea:
open(ARCH_IN, "< $arch_in") || die "No se pudo abrir el archivo de entrada $arch_in";
 
while ($linea = <ARCH_IN>) {
	chomp($linea);
	@campos = split(/,/, $linea);
	$cant_campos = @campos;
	# si no hay campos en este registro (un renglon en blanco) seguimos con el proximo registro:
	if ($cant_campos == 0) {
		next;
	}
	# Aca validamos q las posiciones recibidas como argumento sean validas en el registro:
	if ($pos_campo_cliente > $cant_campos || $pos_campo_monto > $cant_campos) {
		close(ARCH_IN);
		$pos_err = $pos_campo_cliente;
		$pos_err = $pos_campo_monto if $pos_campo_monto > $pos_campo_cliente;
		print "Error - La posicion de campo $pos_err es mayor a la cantidad de campos del registro : $cant_campos".$/;
		exit 1
	}
 
	# La magia de los Hash de PERL =) :
	$saldo_x_cliente{$campos[$pos_campo_cliente - 1]} += $campos[$pos_campo_monto - 1];
}
 
close(ARCH_IN);
 
 
# Grabamos en archivo de salida el resultado (saldo x cliente): 
open(ARCH_OUT, "> $arch_out") || die "No se pudo abrir el archivo de salida $arch_out";
 
while (($cliente, $saldo) = each(%saldo_x_cliente)) {
	print ARCH_OUT "$cliente;$saldo".$/;
}
 
close(ARCH_OUT);
 
# Mostramos el resultado por pantalla:
system("cat $arch_out");
materias/75/08/parcial_20050524_1.txt · Última modificación: 2009/06/09 03:32 por mmilicich
 
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