====== Datos importantes para los exámenes de cursada y finales ======
La cursada (NO ES PARA EL AÑO 2014 ! ! !) requiere la realización, entrega y defensa de un trabajo, el mismo lo puede ver
{{:programacionphp2:examenes:tupar_trabajophp.pdf|aquí.}}
El código necesario para generar la tabla es el siguiente:
Pérez, Juan |
Lógica |
4 |
format
Pérez, Juan |
Álgebra |
7 |
Pérez, Juan |
Análisis |
2 |
Para aprobar la cursada debe aprobar el Parcial (con 4 o más) y el Trabajo.
Vamos a dar la alternativa de promoción, para alcanzar la misma deberá aprobar el Trabajo con Promoción y también el Parcial (con nota igual o mayor a siete).
===== A tener en cuenta antes de comenzar a escribir el examen =====
* Escriba con birome, no importa si tiene que tachar.
* Escriba de un solo lado en cada hoja.
* No empiece un nuevo módulo en una página que está escrita si ve que no lo va a terminar en la misma página, comience en una nueva.
===== Preguntas a hacerse antes de entregar el examen =====
* ¿He asumido alguna condición especial que no está claramente expresada en el enunciado? Si es así ¿incorporé un comentario aclarándolo?
* ¿Hice el diagrama de estructura (DE)?
* ¿Le puse todas las cuplas?
* En las funciones ¿le puse la cupla de retorno?
* ¿Las funciones tienen nombre "de función" ?
* ¿Los "procedimientos" tienen nombre de acción?
* ¿Respeté los nombres del DE y los del código? ¿Son los mismos? ¿Sobran? ¿Faltan?
* He identado todo el código?
* Analizo cada módulo (procedimiento o función). ¿Hay alguno que realiza más de una tarea conceptualmente? ¿Es conveniente dividirlo?
* Tengo algún módulo que realice gestión y acciones al mismo tiempo? Sería conveniente dividirlo?
* ¿Las cuplas del DE se corresponden con todos los parámetros? ¿Sobran? ¿Faltan?
* ¿Todas las cuplas de salida del DE están pasadas por referencia (utilizando &) en los módulos? ¿Y viceversa?
* ¿Todas las variables/arreglos tienen nombres representativos?
* ¿Todos los módulos tienen nombres representativos?
* ¿Incorporé comentarios en el código?
* ¿Tengo definida alguna variable o parámetro en alguna función que no uso? ¿Y alguna que uso y no definí?
* Dentro de cada código, programa o módulo, ¿definí e inicialicé todas las variables que uso al principio?
==== Una alternativa de resolución del Prefinal de la cursada 2012 =====
==== Enunciado ====
{{:programacionphp2:examenes:prefinalphp2012.pdf|Enunciado del Prefinal}}
==== Una alternativa de resolución del Recuperatorio de la cursada 2012 =====
==== Enunciado ====
{{programacionphp2:examenes:recuperatoriophp2012.pdf|Enunciado del Recuperatorio}}
0)
$promedio = $suma / $cantidad;
return $promedio;
}
function escribir_promedios($promedios, $nombre_archivo=ARCHIVO_SALIDA){
$archivo = fopen($nombre_archivo,'w+');
if ($archivo){
fputs($archivo,ENCABEZADO_SALIDA);
foreach ($promedios as $estacion => $datos_sensores)
foreach ($datos_sensores as $anio => $datos_anuales)
foreach ($datos_anuales as $mes => $datos_mensuales)
foreach ($datos_mensuales as $tipo => $valores)
fputs($archivo,$estacion . SEPARADOR .$anio. SEPARADOR . $mes . SEPARADOR . $tipo . SEPARADOR . promedio($valores) . "\n");
fclose($archivo);
}
}
escribir_promedios(leer_estructura());
?>
==== Una alternativa de resolución del Parcial de la cursada 2012 =====
==== Enunciado ====
{{programacionphp2:examenes:parcialphp2012.pdf|Enunciado del Parcial}}
array(),'por_infraccion'=>array());
if ($archivo){
fgets($archivo); //Se ignora el encabezado
while (!feof($archivo)){
$reg = explode(SEPARADOR,trim(fgets($archivo)));
$datos_infractores['infractores'][$reg[POS_INFRACTOR]]['nombre']=$reg[POS_APYNO];
$datos_infractores['infractores'][$reg[POS_INFRACTOR]]['infracciones']+=$reg[POS_PUNTOS];
$datos_infractores['por_infraccion'][$reg[POS_COD_INFR]]['total']+=$reg[POS_PUNTOS];
$datos_infractores['por_infraccion'][$reg[POS_COD_INFR]]['cantidad']++;
}
}
return $datos_infractores;
}
function escribir_suspensiones($valores, $nombre_archivo=ARCHIVO_SALIDA_SUSPENSIONES){
$archivo = fopen($nombre_archivo,'w+');
if ($archivo){
fputs($archivo,"Cod. Infractor;Nombre y Apellido; Puntos\n");
foreach ($valores['infractores'] as $infractor => $datos_infractor)
if ($datos_infractor['infracciones']>=CANTIDAD_SUSPENSION)
fputs($archivo,$infractor.SEPARADOR.$datos_infractor['nombre'].SEPARADOR.$datos_infractor['infracciones']."\n");
fclose($archivo);
}
}
function escribir_estadistica($valores, $nombre_archivo=ARCHIVO_SALIDA_ESTADISTICA){
$archivo = fopen($nombre_archivo,'w+');
if ($archivo){
fputs($archivo,"Cod. Infracción;Puntos;Total de Infracciones\n");
foreach ($valores['por_infraccion'] as $infraccion => $datos_infraccion)
fputs($archivo,$infraccion.SEPARADOR.$datos_infraccion['total'].SEPARADOR.$datos_infraccion['cantidad']."\n");
fclose($archivo);
}
}
$datos_infractores = leer_estructura();
escribir_suspensiones($datos_infractores);
escribir_estadistica($datos_infractores);
?>
==== Una alternativa de resolución del Prefinal de la cursada 2010 =====
==== Enunciado ====
{{programacionphp2:examenes:parcialphp2010.pdf|Enunciado del prefinal}}
{{programacionphp2:examenes:ejerciciopractico.odp|Resolución en Formato Libre Office/Open Office}}
$datos_vitales)
foreach ($datos_vitales as $dia => $datos_diarios)
foreach ($datos_diarios as $tipo => $datos){
fputs($archivo,$paciente . SEPARADOR . $dia . SEPARADOR . "$tipo+" . SEPARADOR . max($datos) . "\n"); //función max nativa de PHP
fputs($archivo,$paciente . SEPARADOR . $dia . SEPARADOR . "$tipo-" . SEPARADOR . min($datos) . "\n"); //función min nativa de PHP
}
fclose($archivo);
}
}
escribir_valores(leer_estructura());
?>
{{programacionphp2:examenes:parcialphp2010.pdf|}}
===== Parcial del 2011 =====
==== Enunciado ====
{{programacionphp2:examenes:parcial2011.pdf|Enunciado del parcial}}
==== Una alternativa de Resolución ====
===== Recuperatorio del 2011 =====
==== Una alternativa de Resolución ====
array('dias' =>31,'nombre'=>'Enero'),
2 => array('dias' =>28,'nombre'=>'Febrero'),
3 => array('dias' =>31,'nombre'=>'Marzo'),
4 => array('dias' =>30,'nombre'=>'Abril'),
5 => array('dias' =>31,'nombre'=>'Mayo'),
6 => array('dias' =>30,'nombre'=>'Junio'),
7 => array('dias' =>31,'nombre'=>'Julio'),
8 => array('dias' =>31,'nombre'=>'Agosto'),
9 => array('dias' =>30,'nombre'=>'Septiembre'),
10 => array('dias' =>31,'nombre'=>'Octubre'),
11 => array('dias' =>30,'nombre'=>'Noviembre'),
12 => array('dias' =>31,'nombre'=>'Diciembre')
);
/*
* Esta función se implementa para poder poblar el arreglo inicial y probar el ejercicio
* No es necesario para la resolución
*/
function inicializar_precipitaciones(){
$precipitaciones = array();
for ($i=0; $i0)
$matrizprecipitaciones[$diasmes[$mesactual]['nombre']][$dia-$posactual+1]=$precipitaciones[$dia];
}
$posactual = $posmax;
}
return $matrizprecipitaciones;
}
function promedio($arreglo,$dias){
$total = 0;
foreach($arreglo as $dia=>$precip)
$total += $precip;
return $total / $dias;
}
function armar_promedios($matrizprecipitaciones,$diasmes){
$historicos = array();
for ($mesactual=1; $mesactual<=MESES; $mesactual++)
$historicos[$diasmes[$mesactual]['nombre']] = promedio($matrizprecipitaciones[$diasmes[$mesactual]['nombre']],$diasmes[$mesactual]['dias']);
/*
* Se emplea la función array_multisort de PHP. Se asume el conocimiento de la misma
* En caso de no conocerla y definir el encabezado de la función se consideraba correcto
* No era necesaria su implementación
*/
array_multisort($historicos,SORT_DESC);
return $historicos;
}
function crear_archivo($historicos, $nombre_archivo_salida = ARCHIVO_SALIDA){
$archivo_salida = fopen($nombre_archivo_salida,'a+');
if ($archivo_salida){
foreach($historicos as $mes => $promedio){
fwrite($archivo_salida, "$mes\t$promedio\n");
}
fclose($archivo_salida);
}
}
$precipitaciones = inicializar_precipitaciones();
$matriz_precipitaciones = agrupar_precipitaciones($precipitaciones,$diasmes);
$historicos = armar_promedios($matriz_precipitaciones,$diasmes);
crear_archivo($historicos);
?>
===== Prefinal del 2011 =====
==== Una alternativa de Resolución ====
0){
foreach ($arreglo as $val)
$suma += $val;
$promedio = $suma / $cantidad;
}
return $promedio;
}
function calcular_promedios_por_tipo($datos_climaticos){
$promedios = array();
foreach ($datos_climaticos as $estacion => $datos_sensores)
foreach ($datos_sensores as $dia => $datos)
foreach ($datos as $tipo => $valores)
$promedios[$estacion][$dia][$tipo] = promedio($valores);
return $promedios;
}
function escribir_promedios($promedios, $nombre_archivo=ARCHIVO_SALIDA){
$archivo = fopen($nombre_archivo,'w+');
if ($archivo){
fputs($archivo,ENCABEZADO_SALIDA);
foreach ($promedios as $estacion => $datos_sensores)
foreach ($datos_sensores as $dia => $datos)
foreach ($datos as $tipo => $valor)
fputs($archivo,$estacion . SEPARADOR .$dia . SEPARADOR . $tipo . SEPARADOR . $valor . "\n");
fclose($archivo);
}
}
$datos_climaticos = leer_estructura();
$promedios = calcular_promedios_por_tipo($datos_climaticos);
escribir_promedios($promedios)
?>
===== Estilo de enunciado similar al Parcial que se puede tomar =====
==== Enunciado ====
{{programacionphp2:examenes:parcial.pdf|Enunciado del parcial}}
==== Una alternativa de Resolución ====
$campos[POS_CAMPO_PRECIO],
'final' => $campos[POS_CAMPO_PRECIO]
);
} else {
$precios[$campos[POS_CAMPO_PRODUCTO]]['final'] = $campos[POS_CAMPO_PRECIO];
}
}
}
fclose($archivo_precios);
}
return $precios;
}
/**
* Calcula la diferencia porcentual entre dos valores.
*
* @param float $valor_inicial
* @param float $valor_final
* @return float
*/
function diferencia_porcentual($valor_inicial, $valor_final) {
return (($valor_final / $valor_inicial) - 1) * 100;
}
/**
* Agrega a cada producto en $precios la diferencia porcentual entre el precio inicial y el final.
*
* @param array $precios datos sobre los precios de los productos
*/
function calcular_variaciones_precios(&$precios) {
foreach ($precios as $producto => $datos_producto) {
$precios[$producto]['diferencia'] = diferencia_porcentual($precios[$producto]['inicial'], $precios[$producto]['final']);
}
}
/**
* Devuelve estadísticas sobre los precios dados.
*
* @param array $precios arreglo con los precios de los productos
* @return array un arreglo con las claves:
* - 'maximo': máxima diferencia de precio
* - 'producto_maximo': producto con la máxima diferencia de precio
* - 'minimo': mínima diferencia de precio
* - 'producto_minimo': producto con la mínima diferencia de precio
* - 'promedio': diferencia de precio promedio entre todos los productos
*/
function estadisticas_variacion_precios($precios) {
$estadisticas = array();
$productos = array_keys($precios);
$max = $min = $dif_total = $precios[$productos[0]]['diferencia'];
$prod_max = $prod_min = $productos[0];
for ($i = 1; $i < count($precios); $i++) {
$diferencia = $precios[$productos[$i]]['diferencia'];
if ($diferencia > $max) {
$max = $diferencia;
$prod_max = $productos[$i];
}
if ($diferencia < $min) {
$min = $diferencia;
$prod_min = $productos[$i];
}
$dif_total += $diferencia;
}
$estadisticas['maximo'] = $max;
$estadisticas['producto_maximo'] = $prod_max;
$estadisticas['minimo'] = $min;
$estadisticas['producto_minimo'] = $prod_min;
$estadisticas['promedio'] = $dif_total / count($precios);
return $estadisticas;
}
/**
* Guarda en el archivo de nombre $nombre_salida los datos dados en $variaciones.
*
* @param string $nombre_salida nombre del archivo de salida
* @param array $variaciones datos a guardar, con el formato devuelto por estadisticas_variacion_precios
* @return boolean true si se la operación se completó correctamente; false si hubo algún problema
*/
function guardar_variaciones_precios($nombre_salida, $variaciones) {
$archivo_variaciones = fopen($nombre_salida, 'a');
if ($archivo_variaciones) {
$salida = "Máximo" . SEPARADOR_CAMPOS . $variaciones['producto_maximo'] . SEPARADOR_CAMPOS . $variaciones['maximo'] . "\n";
$salida .= "Mínimo" . SEPARADOR_CAMPOS . $variaciones['producto_minimo'] . SEPARADOR_CAMPOS . $variaciones['minimo'] . "\n";
$salida .= "Promedio" . SEPARADOR_CAMPOS . "Todos" . SEPARADOR_CAMPOS . $variaciones['promedio'] . "\n";
$ok = fwrite($archivo_variaciones, $salida);
$resultado = $ok !== false;
fclose($archivo_variaciones);
} else
$resultado = false;
return $resultado;
}
define('ARCHIVO_PRECIOS', 'precios.txt');
define('ARCHIVO_VARIACIONES', 'variaciones.txt');
$precios = precios_desde_archivo(ARCHIVO_PRECIOS);
if ($precios !== false) { // debe usarse !==, porque también puede retornar un array vacío, que es válido
if (count($precios) > 0) { // si el archivo está vacío, no hay más para hacer
calcular_variaciones_precios($precios);
$estadisticas = estadisticas_variacion_precios($precios);
$ok = guardar_variaciones_precios(ARCHIVO_VARIACIONES, $estadisticas);
if ($ok)
echo "Se guardaron correctamente las variaciones de precios.";
else
echo "Hubo un error al guardar el archivo de variaciones (" . ARCHIVO_VARIACIONES . ").\n";
} else
echo "El archivo " . ARCHIVO_VARIACIONES . " no contiene precios guardados.\n";
} else {
echo "Hubo un error al leer el archivo de precios (" . ARCHIVO_PRECIOS . ").\n";
}
?>