Vous êtes sur la page 1sur 15

Estudios de Informtica, Multimedia y Telecomunicaciones

Programacin
Prctica 1
Apellidos: Escribe aqu tus apellidos
Nombre: Escribe aqu tu nombre

Ejercicio 1: Trabajo con secuencias generadas [20 %]


Tarea: Crear el modulo (accin o funcin, el ms apropiado) sacarCifra que reciba un
nmero entero y elimine la cifra que se encuentra en la posicin central. Es decir, si el
nmero tiene n cifras, se debe eliminar la cifra que se encuentre en la posicin n div 2.
El mdulo escribir en la salida estndar (SE) el nuevo nmero con la cifra eliminada.
Por ejemplo:
Si el nmero es el 3579, se eliminar la cifra que se encuentra en la posicin
4 div 2 = 2. Es decir, la cifra 7.
Si el nmero es el 2964896, se eliminar la cifra que se encuentra en la
posicin
7 div 2 = 3, es decir, la cifra 8.
Si el nmero tiene 2 o 3 cifras, se eliminar la de las unidades. Del nmero
386, se eliminar el 6.
Si el nmero tiene 1 cifra, el resultado ser 0.
a) Disear en lenguaje natural las acciones fundamentales del algoritmo.
b) Implementar el algoritmo en lenguaje algortmico. El tratamiento debe ser
numrico (operaciones div y mod). No se puede tratar el nmero dado como
cadena ni las cifras como caracteres.
Valoracin
-

Apartado a) 0.5 puntos.


Apartado b)
Determinacin del tipo de mdulo, 0.1; justificacin, 0.2.
Determinacin de variables: 0.2.
Tratamiento de la secuencia: 1.0.

a) Diseo del algoritmo en lenguaje natural:

Paso 1. Contamos las cifras del nmero, n_cifras.


Paso 2. Identificamos la posicin de la cifra a eliminar: n_cifras div
2.
Paso 3. Si el nmero tiene ms de una cifra, calculamos la parte
superior del nmero: todas las cifras que quedan a la izquierda de la
cifra a eliminar y aadimos en la derecha tantos ceros como cifras hay
a la derecha de la cifra eliminada.
Paso 4. Si el nmero tiene ms de tres cifras, calculamos la parte
inferior del nmero: todas las cifras que queden a la derecha de la
cifra a eliminar.
Paso 5. Construimos el nuevo nmero (suma de la parte inferior y la
parte inferior) y la escribimos en la SE.

b) Implementamos el algoritmo en lenguaje algortmico: Como no devuelve nada, ser una


accin.
accion sacarCifra(ent numero: entero)
var

nuevoNumero, numero_aux: entero;


n_cifras, posMedio: entero;
parteSuperior, parteInferior: entero;
cifra, divisor, multiplicador: entero;
fvar
parteSuperior := 0;
parteInferior := 0;
divisor := 1;
{1. Contamos las cifras del nmero.}
numero_aux := numero;
n_cifras := 0;
mientras numero_aux > 0 hacer
numero_aux := numero_aux div 10;
n_cifras := n_cifras + 1;
fmientras
{2. Identificamos la posicin de la cifra a eliminar.}
posMedio := $n_cifras div 2;
{3. Calculamos la parte superior del nmero: todas las cifras que
quedan en la izquierda de la cifra a eliminar.}
si n_cifras > 1 entonces
numero_aux := $numero;
{Calculamos el nmero de cifras que hay que eliminar.}
para i := 0 hasta (posMedio 1) hacer
divisor := divisor * 10;
fpara
{Las eliminamos.}
parteSuperior := numero_aux div divisor;
{Aadimos a la parte superior tantos 0 como cifras hemos
eliminado sin la que corresponde a la cifra a eliminar.}
parteSuperior := parteSuperior + divisor div 10;
fsi
{4. Calculamos la parte inferior del nmero: todas las cifras que
quedan a la derecha de la cifra a eliminar.}
si n_cifras > 3 hacer
numero_aux := numero;
{Obtenemos la cifra de las unidades del nmero.}
parteInferior := numero_aux mod 10;
{La eliminamos del nmero.}
numero_aux := numero div 10;
{Hacemos lo mismo para el resto de cifras hasta llegar a la
anterior a la cifra a eliminar.}
para i = 1 hasta (posMedio 2) hacer
multiplicador := 1;
cifra := numero_aux mod 10;
{Calculamos el nmero de 0 que se deben aadir a la cifra
leda para construir la parte inferior.}
para j = 1 hasta i hacer
multiplicador := multiplicador * 10;
fpara
parteInferior := parteInferior + (cifra * multiplicador);
numero_aux := numero_aux div 10;
fpara
fsi
{5. Construimos el nuevo nmero y lo escribimos en la salida estndar}
nuevoNumero := parteSuperior + parteInferior;
escribirEntero(nuevoNumero);
faccion

Ejercicio 2: Trabajo con secuencias de entrada [20 %]


Tarea: Crear el mdulo desencriptar (accin o funcin, el ms adecuado) que lea del
canal estndar de entrada una secuencia de caracteres y devuelva el mensaje
encriptado que contiene.
La secuencia tiene el formato siguiente:
{factor paso c1 c2 ... cn #}
dnde:
factor: es un entero que indica el nmero que se debe sumar a los caracteres
que forman el mensaje encriptado. El cdigo obtenido debe estar en el rango 0
a 255 (base 255, es decir 256 ser 0, 257 ser 1, etc.).
paso: es un entero que indica el nmero de caracteres que se deben saltar a
partir del carcter c1 para tratar los que contienen el mensaje encriptado.
c1 ... cn: son los caracteres, algunos de los cuales contienen el mensaje
encriptado.
#: es el carcter que indica el final de la secuencia.
Ejemplo: Sea la secuencia
{1 2 g a n g k i ` #}

El nmero que se debe sumar a cada carcter del mensaje encriptado es 1.


El nmero de caracteres que se deben saltar a partir del carcter g es 2.
Los caracteres que contienen el mensaje encriptado son: g, n, k, `
En el cdigo de cada uno se debe sumar el factor 1 y obtenemos el mensaje:
hola que es el que tendremos que devolver (el cdigo del carcter ` es 96, de
forma que si le sumamos 1 obtenemos el cdigo 97 que corresponde a la letra
a).

Valoracin
-

Determinacin del tipo de mdulo, 0.1; justificacin, 0.4.


Determinacin y justificacin de los parmetros: 0.25.
Determinacin de variables: 0.25.
Tratamiento de la secuencia: 1.0.

Dado que tan solo devuelve un nico valor (la cadena con el mensaje desencriptado),
puede ser una funcin y tambin una accin. Mostramos la solucin en la versin funcin.
{No recibe ningn parmetro de entrada porque lee de la entrada estndar (EE).}
funcin desencriptar(): cadena
var
factor, paso: entero;
codigo: entero;
car: carcter;
mensaje: cadena;
i: entero;
fvar
mensaje := ;
{Leemos de la secuencia los parmetros para desencriptar.}
factor := leerEntero();
paso := leerEntero();
{Leemos el primer carcter a desencriptar.}
car := leerCaracter();
mientras no(car = #) hacer
{Desencriptamos el carcter y lo aadimos al mensaje.}
codigo := (caracterACodigo(car) + factor) mod 256;
mensaje := mensaje.codigoACaracter(codigo);
{Saltamos al carcter siguiente del mensaje.}
i := 1;
mientras i < paso y no(car = #)hacer
car := leerCaracter();
i := i + 1;
fmientras
{Leemos el carcter siguiente del mensaje.}
car := leerCaracter();
fmientras
retorna mensaje;
ffuncion

Ejercicio 3: Trabajo con secuencias en PHP [20 %]


Tarea: Crear un programa en PHP que lea una secuencia de caracteres de la entrada
estndar y cuente las palabras con ms de tres letras (palabras largas) y muestre en
pantalla el texto ledo y el recuento de palabras largas. Vase la siguiente imagen:

Indicaciones

El fichero php recibir el nombre prac1_ejer3.php

La llamada al programa ser del tipo


prac1_ejer3.php?filename=nombre_archivo_datos
por lo que se deber emplear la instruccin $filename=$_GET["filename"];
para cargar el nombre del fichero que incorpora la instruccin que asigna valor a
la variable $cadena. Una vez cargado este nombre, se puede incorporar la
instruccin en el programa mediante el comando include($filename)1; ambas
instrucciones ya forman parte de la plantilla y son las primeras del programa
principal.

Las instrucciones para cargar el fichero el nombre del cual se pasa como
parmetro ya forman parte de la plantilla.

Podis comprobar el funcionamiento del programa que se os pide que escribis


con la llamada:
http://prog.uoc.edu/practica1/prac1_ejer3.php?filename=data30
o cambiando los ficheros de datos hasta data34.

Se facilitan varios archivos de datos con los nombres data30 a data32. Son
ficheros de texto y podis abrirlos para comprobar el contenido: una instruccin
php.

http://www.php.net/manual/es/function.include.php

Consejos

Se supone que el texto a analizar est bien escrito. Las frases terminan siempre
con un punto . y se utiliza el espacio o una coma para separar las palabras.

Mdulos a implementar

leerPalabra: recibe la cadena leda y un entero con el valor de la posicin


actual en la cadena y devuelve el nmero de caracteres de la palabra que se
encuentra en dicha posicin y actualiza el valor de sta posicin que tambin
devuelve.
Por ejemplo, si la cadena es Hola mundo y adis. y la posicin actual es 5,
sta funcin devolver 5 cmo nmeros de caracteres de la palabra mundo y
10 como posicin actual. Pensar que en PHP la primera posicin en una
cadena es la 0.

palabraSiguiente: recibe la cadena leda y un entero con el valor de la


posicin actual en la cadena. Desde sta posicin salta todos los espacios en
blanco o comitas o puntos hasta situarse en el primer carcter de la palabra
siguiente de la cadena. Devuelve la posicin dnde se encuentra ste primer
carcter.

muestraResultados: recibe la cadena leda y el nmero de palabras largas y


las muestra en pantalla (vase imagen anterior).

El algoritmo principal implementar la lgica del programa: esquema de


recorrido y llamada a los mdulos pedidos.

Evaluacin
Se valorar especialmente la aplicacin correcta de los esquemas de bsqueda,
recorrido o tratamiento adecuados al problema.
Tambin se tendr en cuenta el diseo y el aprovechamiento adecuado de funciones y
acciones que resulten tiles y que el estudiante quiera desarrollar voluntariamente.
Poner vuestro nombre y apellidos en el cdigo del fichero PHP.
Valoracin
-

Mdulo leerPalabra: 0.5


Mdulo palabraSiguiente: 0.3
Mdulo muestraResultados: 0.2
Algoritmo principal: 1

//Aqu debis poner vuestro cdigo


<?php
/* LAS CONSTANTES */
define('N_CARACTERES', 3);
define('FIN_FRASE', ".");
/* LOS MDULOS */
function LF(){
//line feed
print "<br />";
}
// Identifica en '$cadena' la palabra que se encuentra en la posicin
// '$pos' y cuenta su nmero de caracteres. Actualiza el
// parmetro '$pos' y devuelve el nmero de caracteres en el
// parmetro '$n_car'.
function leerPalabra($cadena, &$pos, &$n_car){
while($cadena[$pos] <> " " && $cadena[$pos] <> "," &&
$cadena[$pos] <> FIN_FRASE){
$n_car++;
$pos++;
}
}
// Salta al primer carcter de la palabra siguiente en '$cadena'.
// Actualiza '$pos' con la posicin del primer carcter.
function palabraSiguiente($cadena, &$pos){
while($cadena[$pos] == " " || $cadena[$pos] == ",")
$pos++;
}
function muestraResultados($cadena, $n_palabras){
LF();
print "La frase: <i>$cadena</i>";
LF();LF();
print "Contiene $n_palabras palabras de ms de ".N_CARACTERES."
letras.";
}

/* ALGORITMO PRINCIPAL */
$filename = $_GET["filename"];
include ($filename);
// Ahora disponemos de la secuencia en la variable $cadena.
// Inicializamos las variables.
$posicion = 0;
// Posicin del cabezal.
$palabras_largas = 0;
// Nmero palabras ms de 3 caracteres.
$fin = false;
// Final frase (punto).
// Hacemos el recorrido por la cadena.
while ($fin == false){
// Leemos la palabra actual.
$n_car_palabra = 0;
leerPalabra($cadena, $posicion, $n_car_palabra);

// Evaluamos si la palabra es larga.


if($n_car_palabra > N_CARACTERES)
$palabras_largas++;
// Nos posicionamos en la palabra siguiente.
if($cadena[$posicion] <> FIN_FRASE)
palabraSiguiente($cadena, $posicion);
else
$fin = true;
}
// Mostramos los resultados.
muestraResultados ($cadena, $palabras_largas);
?>

Ejercicio 4: Trabajo con secuencias en PHP [20 %]


Tarea: Crear un programa que lea de la entrada estndar una secuencia de nmeros
enteros superiores a 0, que estarn separados cada uno del siguiente por una coma y
que finalizar con un 0 que significar el final de la lista.
El programa sumar los elementos de la secuencia en grupos de la forma siguiente: el
primer grupo estar formado por el primer elemento de la secuencia, el segundo grupo
por los dos elementos siguientes, el tercer grupo por los tres elementos siguientes y
as sucesivamente.
La suma de cada grupo se introducir en una nueva secuencia que tambin finalizar
con un 0.
Vase la imagen siguiente:

Fijaros que los elementos de la secuencia se encuentran en la variable cadena de la


entrada estndar (URL). Son: 1, 2, 3, 4, 5, 6, 7, 9, 0
Las sumas son las siguientes:
1=1
2+3=5
4 + 5 + 6 = 15
7 + 9 = 16 (ya no hay ms enteros.)
La secuencia que se deber mostrar es 1,5,15,16,0
Indicaciones preceptivas

El fichero php recibir el nombre prac1_ejer4.php

La llamada al programa ser del tipo


prac1_ejer4.php?cadena=194,954,112,0
Para obtener de la cadena $string uno a uno los nmeros que la forman, dnde
se ha utilizado como separador el carcter $c, podis utilizar consecutivamente:

$var1 = explode ($c, $string);2


$var2 = array_shift($var1);3

http://es2.php.net/manual/es/function.explode.php

Una vez cargada la variable $cadena, se crear la lista de datos a la variable


$secuencia. Estas instrucciones ya forman parte de la plantilla.

Podis comprobar el funcionamiento del programa que se os pide que escribis


con la llamada:
http://prog.uoc.edu/practica1/prac1_ejer4.php?cadena=194,954,112,108,12,0
o cambiando los nmeros que forman el parmetro cadena (atencin!, no pongis
comas antes o despus del =).

Evaluacin
Se valorar especialmente la aplicacin correcta de los esquemas de bsqueda,
recorrido o tratamiento adecuados al problema.
Para leer los datos de la secuencia se debe utilizar nicamente la funcin array_shift
de PHP. Si se utiliza otra diferente, no se puntuar.
Para saber si se ha llegado al final de la secuencia es obligatorio evaluar si el carcter
ledo es el descrito en el enunciado.
Poned vuestro nombre y apellidos en el cdigo del fichero PHP.
Valoracin
-

Inicializacin variables: 0.2


Tratamiento inicial: 0.5
Esquema de recorrido: 1
Concisin en el uso de composiciones y ahorro de variables: 0.3

http://es2.php.net/manual/es/function.array-shift.php

//Aqu debis poner vuestro cdigo


<?php
// DECLARACIN DE CONSTANTES
define('FIN_SEC', 0);
/* ALGORITMO PRINCIPAL */
$cadena = $_GET["cadena"];
$secuencia = explode(",",$cadena);
// Inicializamos variables.
$suma_grupo = 0;
// Suma de los nmeros del grupo actual.
$secuencia_nueva = "0";
// Secuencia con las sumas de los grupos.
$fin_secuencia = false;
// Se ha llegado al final de la secuencia.
// Tratamiento inicial: leemos el primer nmero de la secuencia y
// lo aadimos a la nueva secuencia.
$numero = array_shift($secuencia);
if($numero != FIN_SEC)
$secuencia_nueva = $numero;
else
$fin_secuencia = true;
// Hacemos el recorrido por la secuencia.
$n_grupo = 2;
// Nmero de nmeros a sumar del grupo actual.
while (! $fin_secuencia){
// Construimos el grupo actual y sumamos sus miembros.
$i = 0;
while($i < $n_grupo && ! $fin_secuencia){
$numero = array_shift($secuencia);
if($numero != FIN_SEC){
$suma_grupo += $numero;
$i++;
}
else
$fin_secuencia = true;
}
// Aadimos a la nueva secuencia la suma del grupo actual.
if(! $fin_secuencia)
$secuencia_nueva = $secuencia_nueva.",".$suma_grupo;
elseif($suma_grupo > 0)
$secuencia_nueva = $secuencia_nueva.",".$suma_grupo.",0";
else
$secuencia_nueva = $secuencia_nueva.",0";
// Incrementamos el nmero de elementos del grupo siguiente.
$n_grupo++;
// Inicializamos la suma del nuevo grupo.
$suma_grupo = 0;
}
print $secuencia_nueva;
?>

Ejercicio 5: Trabajo con secuencias heterogneas en la entrada en PHP [20 %]


Un fotgrafo profesional tiene un estudio de edicin y mejora de fotografas. El
programa que se utiliza para el tratamiento fotogrfico genera una secuencia de datos
en la que se recoge el trabajo diario. La longitud de la secuencia es diferente de un da
a otro y no se puede prever. La secuencia es del tipo:
{T1 W1 H1 T2 W2 H2 T3 W3 H3 ... Ti Wi Hi ... Tn Wn Hn F} dnde
Ti es un carcter que indica el tipo de foto ( 'c' para fotos a color y 'm' para fotos
monocromticas) de la fotografa de posicin i en la serie.
Wi es el ancho en pxeles de la fotografa de posicin i en la serie.
Hi es la altura en pxeles de la fotografa de posicin i en la serie.
F es la letra 'f' que indica el final de la secuencia
Tarea: Crear un programa que reciba un fichero con la secuencia diaria con los datos
y muestre en pantalla el nmero de fotografas en color en formato horizontal (ms
pxeles de ancho que de alto).

Indicaciones

El fichero php recibir el nombre prac1_ejer5.php

La llamada al programa ser del tipo


prac1_ejer5.php?filename=nombre_archivo_datos
por lo que se deber emplear la instruccin $filename=$_GET["filename"];
para cargar el nombre del fichero que incorpora la instruccin que asigna valor a
la variable $cadena. Una vez cargado este nombre, se puede incorporar la
instruccin en el programa mediante el comando include($filename)4; ambas
instrucciones ya forman parte de la plantilla y son las primeras del programa
principal.

Una vez cargada la cadena de datos se almacenar la lista de datos a la variable


$data. Estas instrucciones ya formas parte de la plantilla.

http://www.php.net/manual/es/function.include.php

Podis comprobar el funcionamiento del programa que se os pide que escribis


con la llamada:
http://prog.uoc.edu/practica1/prac1_ejer5.php?filename=data50
o cambiando los ficheros de datos hasta data54

Se facilitan varios archivos de datos con los nombres data50 a data54. Son
ficheros de texto y podis abrirlos para comprobar el contenido: una instruccin
php.

Para leer los datos de la secuencia se debe utilizar nicamente la funcin


array_shift de PHP. Si se utiliza otra diferente, no se puntuar.

Para saber si se ha llegado al final de la secuencia es obligatorio evaluar si el


carcter ledo es el descrito en el enunciado.

Poned vuestro nombre y apellidos en el cdigo del fichero PHP.

Valoracin
-

Trabajo con la cadena de texto: 0.5


Tratamiento de la secuencia: 1.2
Concisin en el uso de composiciones y ahorro de variables: 0.3

//Aqu debis poner vuestro cdigo


<?php
/* ALGORITMO PRINCIPAL*/
$filename = $_GET["filename"];
include ($filename);
// Ahora disponemos de $cadena.
$secuencia = explode (" ", $cadena);
// Ahora disponemos de una lista de datos en la variable $secuencia.
// Inicializamos las variables.
$n_fotos = 0;
// Leemos el primer dato (el tipo de fotografa).
$tipo = array_shift($secuencia);
while ($tipo != 'f'){
// Leemos el ancho y la altura de la terna
// actual de la secuencia.
$W = array_shift($secuencia);
$H = array_shift($secuencia);
// Veamos si se cumplen las condiciones para contar
// el nmero de fotos horizontales a color.
if($tipo == "c" && $W > $H)
$n_fotos++;
// Leemos el tipo de fotografa de la terna siguiente.
$tipo = array_shift($secuencia);
}
// Mostremos los resultados.
print "Nmero de fotografas de formato horizontal a color = $n_fotos.";
?>

Vous aimerez peut-être aussi