====== 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: format
Pérez, Juan Lógica 4
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"; } ?>