c1 y c2 deben ser de tipo numérico (real o entero). p y q del mismo tipo, puntero a real o a entero. Los valores entre paréntesis se refieren a zonas

Documentos relacionados
6. Estructuras básicas de control 1. Pseudocódigo

Apunte Laboratorio ALPI - El lenguaje de programación Pascal

Programación en Pascal

FUNDAMENTOS DE OBJECT PASCAL

Estructura de Datos: Archivos

Módulo. = Asignación = = Comp. de igualdad!= Com. de desigualdad <= Comp. menor o igual >= Comp. mayor o igual AND lógico OR lógica.

Slide 1. ordenación de tres números en forma. creciente.

Manual de turbo pascal

FACULTADE DE INFORMÁTICA Departamento de Computación Estructura de Datos e da Información. Ejercicios de recursividad

FICHEROS EN PASCAL. Ficheros

Universidad de Valladolid. Departamento de informática. Campus de Segovia. Estructura de datos Tema 1: Recursividad. Prof. Montserrat Serrano Montero

Dra. Jessica Andrea Carballido

Introducción al Lenguaje de Programación Ada

Dra. Jessica Andrea Carballido

Estructura de datos (arreglos) Vectores y Matrices

Primer Parcial. Programación 1 Instituto de Computación Año 2011

Primer Parcial. Programación 1 Instituto de Computación Año 2017

1. ESTRUCTURA DE UN PROGRAMA PASCAL Todo programa escrito en lenguaje Pascal, del más simple al más complejo, tiene la siguiente estructura:

Inicio del programa. Entrada de datos. Proceso de datos. Salida de datos. Fin del programa

28/10/2016. Procesamiento de Secuencias. Procesamiento de Secuencias. Procesamiento de Secuencias. Procesamiento de Secuencias

Módulo 8: Primitivas en Pascal

U nidad 6: A rreglos: U nidim ensionales y m ultidim ensionales

Datos en Turbo Pascal

Programación I. Ingeniería Técnica Informática. Ejercicios de los Temas 4, 5, 6 y 7

Estructura de Datos: Archivos. Programacion I Mgter. Vallejos, Oscar A.

UTN FRR Ingeniería en Sistemas de Información Algoritmos y Estructuras de Datos Archivos Directos GUIA DE ESTUDIO: ARCHIVOS DIRECTOS

8.1.- FUNCIONES Y PROCEDIMIENTOS DEFINIDOS POR EL USUARIO EN TURBO PASCAL.

Estructura de Datos y de la Información. Pilas y expresiones aritméticas

Academia técnica de computación A.T.C.

LISTAS DOBLES y multiples

APUNTES DE CÁTEDRA: ARREGLOS MULTIDIMENSIONALES

LABORATORIO DE PROGRAMACIÓN II Problemas HOJA 1 RECURSIVIDAD

EJERCICIO 2 (3 PUNTOS) A) Sea el árbol binario AVL de la figura siguiente: B) Dada la estructura de la figura siguiente:

Departamento de Informática Universidad de Valladolid Campus de Segovia TEMA 1: RECURSIÓN

ALGORITMOS Y ESTRUCTURAS DE DATOS EJERCICIOS RESUELTOS SEGUNDA PARTE

Declaración de Procedimientos

Asumiremos que se dispone de procedimientos para leer y escribir caracteres. Se desarrollan algunas funciones primitivas que nos serán útiles.

Concepto de Recursión. Características de algoritmos recursivos. Ejemplos


6. Estructuras básicas de control 1. Pseudocódigo

Fundamentos de Informática Examen 18 de Septiembre de 2006 Mecánica y Electricidad

RESUMEN GAMBAS. TIPOS DE DATOS Y DECLARAR VARIABLE: DIM nombre_variable AS

Introducción a la Programación Ingenieria en Informática Junio 2008

Ordinales, Enumerados y Conjuntos

ALGORÍTMICA. Dpto. Ingeniería de Sistemas y Automática Facultad de Ciencias Universidad de Valladolid.

FUNDAMENTOS DE PROGRAMACIÓN. 1º ING. INFORMÁTICA (Plan 2000) 2ª Convocatoria. 21 de junio de 2001

ALGORITMOS Y ESTRUCTURAS DE DATOS. Ejercicios Resueltos CUADERNILLO DE PRACTICA

Estructura de datos Tema 2: Tipos Abstractos de Datos (TADs)

Tema 2: Análisis léxico

324 MR Versión 1 1 Prueba Integral 1/6 Lapso UNIVERSIDAD NACIONAL ABIERTA Semana 12 VICERRECTORADO ACADÉMICO ÁREA INGENIERÍA

SUBRANGO ENUMERADOS CONJUNTOS

4.7 Operaciones sobre Objetos en Scheme

Tipos de Datos en C. Palabras reservadas en C

Componentes Básicos. InCo. InCo Componentes Básicos 1 / 28

UTN FRLP Ing. en Sistemas de Información Algoritmos y Estructura de Datos Trabajos Prácticos Curso 2010

Resolución de Problemas y Algoritmos Clase 6: Repetición (continuación)

ARCHIVOS de TEXTO en PASCAL

Calidad del Software. Ejercicios Tema 4 Conceptos de pruebas

B) Contestar Verdadero o Falso a las siguientes preguntas, justificando la respuesta:

Pilas. Uso (I) * 2 = * + Transformación de expresiones aritméticas de notación infija a postfija. Ejemplo:

1.2.4 Listas enlazadas

ARBOLES ARBOLES BINARIOS ORDENADOS. REPRESENTACIÓN Y OPERACIONES

Índice. Definición Objetivos Estructura de una unidad Ejemplo de creación y uso FAQs Opciones de compilación Unidades estándar de TurboPascal

Donde Condicion es una expresión booleana, es decir, que puede tomar el valor verdadero (true) o falso (false).

5. Subprogramas Fundamentos de Informática

Resolución de Problemas y Algoritmos

Tema#2. Tipos de Datos 10

UNIVERSIDAD TECNOLÓGICA NACIONAL INGENIERIA EN SISTEMAS. Cátedra: ALGORITMOS Y ESTRUCTURAS DE DATOS UNIDAD Nº 3 DATOS TIPOS DE DATOS

4. Pilas ESTRUCTURAS DE DATOS 1

Este es un arreglo de números enteros, o sea que guarda una serie de variables de tipo INTEGER, todas agrupadas en una sola estructura.

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Instituto de Computación. Facultad de Ingeniería. Universidad de la República Examen de Programación 2 03 de Agosto de 2006 Generalidades:

TEMA 0 Gestión de Memoria Dinámica

Estructura de Datos y de la Información

Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur 1

Operaciones de E/S en ANSI C

Procesamiento de Lenguajes (PL) Curso 2015/2016. Práctica 5: traductor a código m2r

Curso de Programación 1

Repaso Visual Basic Interfaz Gráfica

Fundamentos de Programación

Programación modular en Pascal

Enunciado de la tercera práctica de programación I

program entrega1; const esp = ' '; {QUE FUNCION CUMPLE??} type longtext = string; texto = string[20]; {lista circular de jugadores}

324 MR Versión 1 Primera Integral 1/5 Lapso 2009/2. ASIGNATURA: Computación II CÓDIGO: 324 MOMENTO: Primera Integral FECHA DE APLICACIÓN: 24/10/09;

Se guardan en archivos con extencion c y los cabezales con extension h

Estructuras de Datos y de la Información Ingeniería Técnica en Informática de Gestión. Curso 2007/2008 Ejercicios del Tema 2

Aprender a programar con Turbo Pascal. Turbo pascal

4. Operadores Operador asignación

PASCAL y TURBO PASCAL

Enteros. Son los números que no contienen componentes fraccionarios y, por tanto, no contienen punto decimal.

7.4. UTILIDADES DE LAS PILAS

PHP: Lenguaje de programación

UNIDAD IV Programación Funcional. Lic. Jesús Germán Andrés PAUTSCH - FCEQyN - UNaM

INTRODUCCIÓN A LA PROGRAMACIÓN Y ALGORITMOS Y ESTRUCTURAS DE DATOS I

Registros. Programación 1. InCo - FING. Programación 1 Registros InCo - FING 1 / 20

Tema 2. El lenguaje JAVA

GUIA No 5. CREACIÓN DE SubVI s

Práctica 2. TAD pila

Archivos en lenguaje C

Transcripción:

1 Cuestión 1 zona estática zona dinámica pantalla c1 c2 pc qc vd1 vd2 vd3 vd4 1???? 2 0 2?? 3 0 2 vd1?? 4 0 2 vd1? 0 5 0 2 vd2? (0)? 6 0 2 vd2? (0) 2 7 0 2 vd2? (0) 2 20 8 0 2 vd2 vd2 (0) 2 9 0 2 vd2 vd2 (0) 0 10 0 2 vd2 vd2 (0) 0 0 2 11 0 2 vd2 vd3 (0) 0? 12 0 2 vd2 vd3 (0) 0 2 13 0 2? vd3 (0) - 2 14 0 2 vd4 vd3 (0) - 2? 15 0 2 vd4 vd3 (0) - 2 0 16 0 2 vd3 vd3 (0) - 2 (0) 17 0 2 vd3 vd3 (0) - 2 (0) : 7 /2 zona estática zona dinámica pantalla c1 c2 pc qc vd1 vd2/4 vd3 1???? 2 0 2?? 3 0 2 vd1?? 4 0 2 vd1? 0 5 0 2 vd2? (0)? 6 0 2 vd2? (0) 2 7 0 2 vd2? (0) 2 20 8 0 2 vd2 vd2 (0) 2 9 0 2 vd2 vd2 (0) 0 10 0 2 vd2 vd2 (0) 0 0 2 11 0 2 vd2 vd3 (0) 0? 12 0 2 vd2 vd3 (0) 0 2 13 0 2? vd3 (0) - 2 14 0 2 vd4 vd3 (0)? 2 15 0 2 vd4 vd3 (0) 0 2 16 0 2 vd3 vd3 (0) (0) 2 17 0 2 vd3 vd3 (0) (0) 2 : 7/ 2 1

c1 y c2 deben ser de tipo numérico (real o entero). p y q del mismo tipo, puntero a real o a entero. Los valores entre paréntesis se refieren a zonas perdidas. Las acciones no recomendables son precisamente las que provocan pérdida de memoria: en las líneas 4 y 15 se pierden las variables apuntadas por pc al hacer un new sin retener la posición de la variable apuntada. 2 Cuestión 2 type Tyele = ini.. fin; Tyconj = set of Tyele; procedure quitaextremos (var c: Tyconj); (* Entrada-salida: c Obj: elimina el valor máximo y el mínimo de c function mayor (c:tyconj): Tyele; (* Valor devuelto: mayor elemento del conjunto c Pre: c no es vacío var e : Tyele; e := fin; while not e in c do e := pred(e); mayor := e function menor (c: Tyconj): Tyele; (* Valor devuelto: menor elemento del conjunto c Pre: c no es vacío var e, min: Tyele; min := fin: for e := ini to fin do if (e in conj) and (e < min) then min := e; menor := min if c <> [] then c := c - [mayor(c)] - [menor(c)] 2

3 Cuestión 3 3.1 ffl Procedimiento. ffl Entrada: 6 enteros h1, m1, s1 (primer tiempo) h2, m2, s2 (segundo tiempo). ffl Salida: 3enteros h3, m3, s3 (resultado de la suma). ffl Precondición: 0» m1;m2» 59 y 0» s1;s2» 59 y h1 + h2» MAXINT ffl Cabecera: procedure sumartiempos (h1, m1, s1, h2, m2, s2: integer; var h3, m3, s3 : integer); ffl Llamada: dado var p, q, r, t, a, b, c : integer;: sumartiempos (p, q+r, t, 1, 10, 59, a, b, c); 3.2 ffl Función o procedimiento ffl Entrada: inf, sup: caracteres extremos del rango ffl Salida (si procedimiento): opción elegida, carácter ffl Valor devuelto (si función): opción elegida, carácter ffl Precondición: inf» sup ffl Cabecera: function OpcionLeida (inf, sup: char): char) ó procedure LeerOpcion (inf, sup: char; var opcion: char); ffl Llamada: Dado var op: char: op := OpcionLeida('a', 'h'); o LeerOpcion ('a', 'h', op) 3

3.3 ffl Procedimiento ffl Entrada: linea: cadena de caracteres (string) fichero en el que se escribe (text) ancho: anchura de la línea, entero ffl Salida: fichero modificado ffl Precondición: fichero preparado para escritura y a ancho>=length(linea) ffl Cabecera procedure escribeajustado (var t : text; linea: string; ancho: integer); ffl Llamada: dado var t : text y t := output) escribeajustado (t, 'Soy Ernesto', 15); 4 Cuestión 4 4.1 Registro: type tpaciente = record edad : integer; peso, altura : real; actividad : 0.. 5; ingesta : integer 4.2 Matriz de registros, con un campo para el número y otro para el tachado: const NLIN =... ; NCOl =... ; type tcasilla = record numero : integer; tachado : boolean tcarton = array [1.. NLIN, 1.. NCOL] of tcasilla; 4

4.3 Fichero de resgistros. Supuesta la definición del apartado 1: tficha = record ident : integer; (* identificador de paciente nombre : string; datos : tpaciente tfichero = file of tficha; 5 Cuestión 5 function producto (a, b: integer): integer; (* Obj: producto recursivo Pre: b >= 0 Post : producto = a*b if b = 0 then producto := 0 else if b=1 then producto := a else producto := a * producto(a, b-1) La función termina porque, si b es 0 ó 1, no hay más llamadas (casos básicos) y si no (b>0) la sucesión de llamadas se hace sobre una sucesión de enteros positivos decreciente (de 1 en 1), que forzosamente acabará en b=1, que es un caso básico. 5

6 Problema 1 Entrada: Vector de monedas en pesetas Vector de monedas en euros Salida: Objetivo: Obtiene el mínimo número de monedas de euros correspondiente a la cantidad que se obtiene de las monedas de pesetas. Variables: CantidadP: entero para la cantidad de entrada CantidadE: real, para la cantidad en euros Subprogramas: función ValorP (vector-monedas-peseta): devuelve el valor correspondiente aunvector de número de monedas de pesetas, según el valor de cada una de ellas. función real aeuros (entero cantidad-pesetas): devuelve la cantidad-pesetas en euros, redondeando a 2 decimales procedimiento DistribuyeE(entrada real cantidad-en-euros, salida vector-monedas-euro): Distribuye la cantidad-en-euros en el mínimo número de monedas de euro procedure PesAEuros (vp: TVectorPesetas; var ve : TVectorEuros); (* posición de las funciones y el procedimiento que se definen más adelante const CAMBIO=166.386; var CantidadP: integer; CantidadE: real; CantidadP := Valor(vp); CantidadE := aeuros (CantidadP); DistribuyeE (CantidadE, ve) 6

función ValorP Entrada: vector de tipo TVectorPesetas Valor devuelto: entero Objetivo: devuelve el valor correspondiente a un vector de número de monedas de pesetas, según el valor de cada una de ellas. Variables: provisional: entero, acumulador del valor a obtener indice: de recorrido a lo largo de las monedas ValorMoneda: vector con el valor de cada moneda Subprogramas: procedimiento que asigna el valor de las monedas function ValorP (m: TVectorPesetas): integer; (* posición para el procedimiento AsignaValoresPesetas var provisional: integer; indice: TIndicePesetas; ValorMoneda: TVectorPesetas; (* valor de cada moneda AsignaValoresPesetas (ValorMoneda); provisional := 0; for indice := p1 to p500 do provisional := provisional + m[indice]*valormoneda[indice]; ValorP := provisional procedure AsignaValoresPesetas (var ValorMoneda: TVectorPesetas); var i: TIndicePesetas; ValorMoneda[p1]:=1; ValorMoneda[p5]:=5; ValorMoneda[p10]:=10; ValorMoneda[p25]:=25; ValorMoneda[p50]:=50; ValorMoneda[p100]:=100; ValorMoneda[p200]:=200; ValorMoneda[p500]:=500; 7

función aeuros Entrada: cantidad en pesetas, entera Valor devuelto: cantidad correspondiente en Euros, redondeada a dos decimales Constantes: CAMBIO: 166'386 (ptas por euro) Variables: centimos, entera function aeuros (p: integer): real; const CAMBIO=166.386; var centimos : integer; centimos := round( p/cambio*100 ); aeuros := centimos/100 procedimiento DistribuyeE Entrada: Cantidad en euros, real Salida: vector de monedas, con la cantidad de entrada distribuida en el mínimo número de monedas Subprogramas: procedimiento que signa el valor a las monedas Variables: ValorMoneda: vector con el valor de cada moneda, en céntimos centimos: cantidad de entrada en céntimos índice de recorrido del vector de monedas procedure DistribuyeE(e: integer; var ve: TVectorEuros); (* posición para el procedimiento AsignaValoresCEuros var ValorMoneda: TVectorEuros; i: TIndiceEuros; AsignaValoresCEuros (ValorMoneda); centimos := e * 100; for i := e2 downto c1 do ve[i] := e DIV ValorMoneda[i]; centimos := centimos MOD ValorMoneda[i] procedure AsignaValoresCEuros (var ValorMoneda: TVectorEuros); var i: TIndicePesetas; 8

PtsAEuros vp valorpesetas valorpesetas valoreuros valoreuros ve Valor aeuros DistribuyeE ValorMoneda AsgMonPst AsgMonEur ValorMoneda[c1]:=1; ValorMoneda[c2]:=2; ValorMoneda[c5]:=5; ValorMoneda[c10]:=10; ValorMoneda[c20]:=20; ValorMoneda[c50]:=50; ValorMoneda[e1]:=100; ValorMoneda[e2]:=200; Puede haber muchas otras alternativas. Una más eficiente si la transformación se va a usar varias veces iniciaría los valores de monedas una sola vez, de forma que la transformación requeriría dichos valores, según el siguiente diagrama: ValorMonPst ValMonEur vp ValorMonPst ValMonEur ve AsgMonPst AsgMonEur PtsAEuros vp ValMonPst valorpesetas valorpesetas valoreuros valoreuros ValMonEur ve Valor aeuros DistribuyeE 9

7 Problema 2 7.1 Solución 1: por palabras La idea es: mientras no ff(entrada) hacer si línea no vacía entonces repetir leer palabra; reflejar palabra; escribir palabra; leer y copiar posibles blancos hasta fin de línea fin si leer y escribir fin de línea fin mientras Pero el problema es que, para leer una palabra completa, es necesario leer el carácter siguiente (blanco) o que se haya terminado la línea. Es decir, un procedimiento que leyera una palabra, dejaría leído el primer carácter del bloque de blancos. Por lo tanto, el procedimiento de copia de blancos partiría de haber leído ya el primer blanco y terminaría al leer el primer carácter de la siguiente palabra o al alcanzar el fin de línea. De la misma forma, el procedimiento de completar una palabra debería ser invocado cuando ya se ha leído el primer carácter de la misma. Los procedimientos de obtención de palabra y de copia de blancos deben devolver, entonces, el carácter del siguiente bloque (grupo de blancos o palabra), caso de que lo haya yun indicador que determine si efectivamente lo hay. Replanteando la solución con estos condicionantes: mientras no ff(entrada) hacer (* línea si línea no vacía entonces leer carácter en palabra (se sabe que no empieza con b) repetir si hay más completar palabra; reflejar palabra; escribir palabra (* leído el primer b o en fin de línea copiar blancos si hay (* leído el primer carácter de la palabra o en f. de línea hasta que no haya más en la línea fin si leer y escribir fin de línea fin mientras 10

Se necesita una variable de tipo string para la palabra, otra de tipo char para el carácter que siempre se tiene leído de forma adelantada y además, se usará una variable lógica para determinar si efectivamente hay tal carácter leído o no lo hay (porque se ha alcanzado ya el fin de línea) program ReflejaPalabras (f, g); (* Entrada : texto: 'entrada.txt' (f) Salida : texto en el que cada palabra está reflejada: 'salida.txt' (g) Pre : Las líneas no vacías no comienzan con blancos var f, g : text; palabra : string; c : char; haymas : boolean; Begin assign (f, 'entrada.txt'); reset (f); assign (g, 'salida.txt'); rewrite (g); while not eof (f) do (* línea if not eoln (f) then read (f, c); (* no blanco repeat palabra := c; if not eoln(f) then completarp (f, palabra, haymas); reflejarp (palabra); write (g, palabra); if haymas then copiarb (f, g, c, haymas) until not haymas; readln (f); writeln (g) close (f); close (g) End. 11

Módulos módulo E S otros obj -fichero - HayMas avanza en f - completa palabra completarp -palabra - palabra no está en eoln - leído el primer de long. 1 b. del sgte bloque - haymas indica si hay tal b -fich E - c (primer avanza en f - copia blancos copiarb -fich S c. sgte. no está en eoln - devuelve el primer si lo hay) c. del sgte bloque - HayMas - haymas indica si lo hay - escribe un b ya leído reflejarp -palabra - palabra refleja el parámetro procedure completarp (var f: text; var pal: string; var haymas: boolean); (* Entrada f: texto Entrada-salida : pal: entra con un sólo carácter y sale con la palabra completa Salida : haymas: indica si hay blancos tras la palabra Obj : dada pal, compuesta de un carácter, completa la palabra que está en f, hasta un blanco Pre : f no está sobre el fin de línea Post : si tras a palabra hay un b. ya está leído var c : char; c := pal[1]; while not eoln (f) and c <> ' ' do read (f, c); if c <> ' ' then pal := pal + c if c=' ' then haymas := TRUE else haymas := FALSE 12

ReflejaPalabras completarp reflejarp copiarb procedure copiarb (var f, g : text; var c : char; var haymas: boolean); (* Entrada : fichero f, en determinada posición Salida : fichero g, en determinada posición c: primer carácter de la palabra siguiente, si la hay haymas: indica si hay palabra siguiente Obj: copia blancos de f a g en c: el primer carácter no blanco a partir de la posición inicial de f write (g, ' '); c := ' '; while (not eoln(f)) and (c= ' ') do read (f, c); if c=' ' then write (g, ' '); if c<>' ' then haymas := TRUE else haymas := FALSE procedure reflejarp (var pal: string); (* Entrada-Salida: pal (sale reflejada) var i : integer; aux : char; for i := 1 to lenght(pal) div 2 do aux := pal[i] ; pal[i] := pal[length(pal)+1-i] ; pal[length(pal)+1-i]i := aux ; end 13

procedure reflejarp (var pal: string); (* Entrada-Salida: pal (sale reflejada) (* Recursivo var subp : string; if length(pal)>1 then subp := copy (pal,2, length(pal)-1); reflejarp (subp); pal := subp + pal[1] end 7.2 Solución 2: por líneas La idea es: mientras no ff(entrada) hacer leer línea de f transformar línea escribir línea en g fin mientras program ReflejaPalabras (f, g); (* Entrada : texto: 'entrada.txt' (f) Salida : texto en el que cada palabra está reflejada: 'salida.txt' (g) Pre : Las líneas no vacías no comienzan con blancos var f, g : text; linea : string; Begin assign (f, 'entrada.txt'); reset (f); assign (g, 'salida.txt'); rewrite (g); while not eof (f) do (* línea readln (f, linea); transformarl (linea); writeln (g, linea); 14

ReflejaPalabras Transformar leerpalabra reflejar sustituir saltarblancos End. Subprogramas módulo E S otros obj transformarl - linea -linea - refleja cada palabra - linea - palabra - lee palabra de linea leerpalabra - inicial -siguiente a partir de inicial - siguiente=posición de la sgte palabra - linea sobre un b. - salta blancos saltarblancos - posicion - posicion - obtiene posición del sgte no blanco o supera la longitud de la línea reflejarp - palabra - palabra refleja el parámetro - línea -línea - sustituye en línea sustituir - inicial el contenido a partir de - palabra incial por palabra reflejarp está descrito en la solución anterior. 15

procedure transformarl (var linea: string); (* Obj: refleja cada palabra de la línea. Una palabra es una sucesión de símbolos separados por blancos E-S : linea var palabra: string; inicial, (* posición de comienzo de palabra siguiente : (* posición de comienzo de palabra sgte integer; if length(linea)>0 then inicial:= 1; repeat leerpalabra (linea, inicial, palabra, siguiente); reflejarp (palabra); sustituir (linea, inicial, palabra); inicial := siguiente until inicial > length(linea) end procedure sustituir (var linea: string; inicial : integer; palabra: string); (* Obj: coloca la palabra a partir de la posición inicial en la línea en sustitución de lo que haya en tales posiciones Pre: la palabra cabe en la línea a partir de la posición especificada (es decir: inicial+length(palabra)-1 <= length(linea)) E: linea, inicial, palabra S: linea (modificada) var i : integer; for i := 1 to length(palabra) do linea [ inicial+i-1 ] := palabra[i] 16

procedure leerpalabra (linea: string; inicial: integer; var palabra: string; var siguiente: integer); (* Obj: lee la palabra que comienza en la posición 'inicial' de la línea obtiene en 'siguiente' la posición de comienzo de la siguiente palabra si no hay más palabras, 'siguiente' tendrá un valor mayor que la longitud de línea Pre: inicial <= longitud (línea) E: linea, inicial S: palabra, siguiente var i : integer; palabra := ''; i:= inicial; while (i < length(linea) and (linea[i]<>' ') do palabra := palabra + linea[i]; i := i+1 (* i >= length(linea) or i<length(linea) and linea[i]=' ' (* linea[i] no se ha comprobado if i = length(linea) then if linea[i]<>' ' then palabra := palabra + linea[i]; i := i+1 (* i señala el primer carácter posterior a la palabra posiblemente fuera de ella if i<= length(linea) then saltarblancos (linea, i); siguiente := i procedure saltarblancos (linea: string; var posición: integer); (* Obj: dada un posición en la línea, avanza ésta hasta la primera posición en que no hay un blanco, o devuelve longitud(linea) +1 Pre: linea[posicion] = blanco i<length(linea) 17

var i : integer; i := posicion; while (i<length(linea)) and (linea[i]=' ') do i := i+1; if i = length(linea) then if linea[i]=' ' then i := i+1; posicion := i 7.3 Solución 3: por líneas, de otra manera program ReflejaPalabras (f, g); (* Entrada : texto: 'entrada.txt' (f) Salida : texto en el que cada palabra está reflejada: 'salida.txt' (g) Pre : Las líneas no vacías no comienzan con blancos var f, g : text; linea : string; Begin assign (f, 'entrada.txt'); reset (f); assign (g, 'salida.txt'); rewrite (g); while not eof (f) do (* línea readln (f, linea); transferirl (linea, g); writeln (g, linea); End. procedure transferirl (linea: string, var g: text); (* Obj: Copia la reflejada de cada palabra de la línea en g. Una palabra es una sucesión de símbolos separados por blancos. Copia los blancos según aparecen. Vacía la línea según va transfiriendo a g E : linea S : g 18

var palabra: string; posb : integer; (* posición del primer blanco if length(linea)>0 then repeat posb := pos(' ', linea); if posb = 0 then palabra := copy (linea, 1, length(linea)) else palabra := copy (linea, 1, posb-1); reflejarp (palabra); write (g, palabra); delete (linea, 1, length(palabra)); (* copiar blancos iniciales while (length(linea)>1) and (linea[1]=' ') do write (g, ' '); delete (linea, 1, 1) (* length(linea)=1 or >1 y linea[1] <> ' ' if linea[1] = ' ' then write (g, ' '); delete (linea, 1, 1) end until length(linea)=0; reflejarp está descrito en la solución 1. 7.4 Solución 4: por caracteres El fichero se lee carácter a carácter. Cada vez que la lectura cambia de no blancos a blancos, se ha terminado una palabra. Cada vez que la lectura cambia de blancos anoblancos, comienza una palabra: program ReflejaPalabras (f, g); (* Entrada : texto: 'entrada.txt' (f) Salida : texto en el que cada palabra está reflejada: 'salida.txt' (g) 19

Pre : Las líneas no vacías no comienzan con blancos var f, g : text; palabra : string; c : char; EnPalabra : boolean; Begin assign (f, 'entrada.txt'); reset (f); assign (g, 'salida.txt'); rewrite (g); while not eof (f) do (* línea EnPalabra := TRUE; palabra := ''; (* ver Pre while not eoln(f) do read (f, c); (* tratar c: ver a continuación readln(f); writeln(g) close (f); close(g) End. Refinamiento de tratar c if EnPalabra then if c<>' ' then palabra := palabra + c else (* palabra completada reflejarp (palabra); write (g, palabra); enpalabra := FALSE; palabra := '' end else (* fuera de palabra if c=' ' then write (g, c) else (* comienza palabra palabra := c; enpalabra := TRUE end reflejarp está descrito en la solución 1. 20