====== Ejercicios obligatorios del Módulo Práctico 1 - 75.01. Computación - 2.º cuatrimestre 2008 ====== **Cátedra:** Grossi\\ **Cuatrimestre:** 2.º Cuatrimestre 2008\\ ==== Punto I ==== Desarrollar un programa en Lenguaje Pascal que solicite el ingreso por teclado de un ángulo expresado en grados e indique por pantalla si es: * Agudo (menor a 90°) * Cóncavo (mayor que 180° y menor que 360°) * Llano (igual a 180°) * Obtuso (mayor que 90° y menor que 180°) * Recto (igual a 90°) ++++Resolución:| {Secci¢n Declarativa} program Angle; {Dado un ngulo en grados ingresado por teclado, permite determinar si es agudo, recto, obtuso, llano o c¢ncavo} uses Crt; {Subprogramas de manejo de pantalla} repeat {repeat} writeLn('Ingrese el ngulo'); readLn(winkel); {Solicitud de ingreso de datos} {iferr no le preste atenci¢n a esto que est comentareado: es s¢lo un intento de que el programa no se cierre si se ingresa un dato que no es num‚rico then once=FALSE else once=TRUE until once=TRUE; {Hasta que inserte un n£mero}} {Resoluci¢n y Ep¡logo} if winkel<0 then begin neg:=true; writeLn; {rengl¢n en blanco} writeln('El ngulo ingresado es negativo: se lo clasificar seg£n su valor absoluto.'); end else begin neg:=false {el ngulo ingresado es positivo} End; angulo:=abs(winkel); writeLn; {rengl¢n en blanco, antes de dar el resultado} if angulo=0 then writeLn('El ngulo ingresado es nulo.') else if angulo < 90 then writeLn('El ngulo ingresado es agudo.') else if angulo = 90 then writeLn('El ngulo ingresado es recto.') else if angulo < 180 then writeLn('El ngulo ingresado es obtuso.') else if angulo = 180 then writeLn('El ngulo ingresado es llano.') else if angulo < 360 then writeLn('El ngulo ingresado es c¢ncavo.') else writeLn('El ngulo ingresado es mayor o igual a 360ø.'); writeLn; {rengl¢n en blanco} repeat writeLn('¨Desea seguir ingresando ngulos? (S¡/No)'); readLn(nochmal); writeLn; if nochmal='S¡' then twice:=TRUE else if nochmal='No' then twice:=TRUE {Si ingres¢ 'S¡' o 'No', no se vuelve a preguntar.} else twice:=FALSE {Si ingres¢ cualquier cosa, se vuelve a preguntar} until twice=TRUE; {Hasta que responda bien} if nochmal='S¡' then nochmal:='1' {Si ingres¢ 'S¡', volvemos al punto de partida} else nochmal:='0' {Si ingres¢ 'No', termina el programa.} until nochmal='0'; writeLn('Pulse Enter para finalizar'); {Anuncio de finalizaci¢n} readLn; {Pausa} end. ++++ ==== Punto II ==== Desarrollar un programa en Lenguaje Pascal que permita listar por pantalla los números perfectos a través del Método de Euclides: //Sea un número entero positivo Z, expresado como: Z = S x D Donde: S = 1 + 21 + 22 + 23 + 24 +…+2n y D = 2n Si S es un número primo, entonces Z es un Número Perfecto.// El programa deberá listar por pantalla los números perfectos que se encuentren cuando n varía entre 1 y 10. Considerar que un número es primo si es divisible solamente por si mismo y por la unidad. Para asumir que un número es primo basta con comprobar que ningún número lo divide a partir del 2 y hasta el entero siguiente a su raíz cuadrada. **Nota:** se deberán representar los números S y Z como variables de tipo longint. ++++Resolución:| {LA VERSIàN QUE ME ENVIASTE FUNCIONA. EN ESTA ENTRE LLAVES Y EN MAYéSCULA SE ENCUENTRAN LAS OBSERVACIONES Y CAMBIOS. NO ES NECESARIO QUE LO VUELVAS A ENTREGAR.} {(Corrección de Grossi)} {Secci¢n Declarativa} program Perfect_numbers; {Lista por pantalla los n£meros perfectos ---para n variando entre 1 y 10--- obtenidos mediante el m‚todo de Euclides.} uses Crt; {Subprogramas de manejo de pantalla} var {i,} j, k, n, r: integer; {FALTA DESCRIBIR BREVEMENTE FUNCIàN DE CADA RECURSO} S, T, Z: LongInt; Const m=10; {Secci¢n Algor¡tmica} begin {Pr¢logo} ClrScr; {Limpieza de la pantalla} WriteLn('N£meros perfectos ---para n variando entre 1 y 10--- obtenidos mediante el m‚todo de Euclides.'); WriteLn(); {l¡nea en blanco} WriteLn(); {l¡nea en blanco. Le tuve que escribir dos porque aparentemente, cuando la primera oración ocupa dos renglones, no te toma la siguiente l¡nea en blanco.} {Resoluci¢n} n:=1; {inicializo al contador n} S:=1; T:=1; J:=1; repeat {i:=1; S:=1; }{inicializo al contador i y a S} { T:=1; j:=1; } while {i}J <=n do {esta rutina es para sumar los n+1 t‚rminos que componen a S} begin {**T:=1; j:=1;** } {inicializo a T y al contador j} {ESTE CICLO SE PUEDE EVITAR} {repeat}{esta rutina es para elevar 2 a la en‚sima potencia} T:=T*2; {cada pasada multiplico a T por dos} j:=j+1; {** until j>i; } END; S:=S+T; {i:=i+1;} {end;} k:=2; r:=0; repeat {esta rutina es para dividir a S por enteros a partir del dos y hasta el entero siguiente a su ra¡z cuadrada} if (S mod k)<>0 {si la divisi¢n no es exacta} then begin r:=r+1; {incremento r en 1} end; {SI EN EL ELSE NO SE PRODUCEN CAMBIOS SE LO PUEDE OBVIAR} {else begin r:=r;}{caso contrario, no lo incremento} {End; } k:=k+1 {incremento k en 1} until k>1+(Trunc(Sqrt(S))); {hasta que k es mayor que el entero siguiente a la ra¡z cuadrada de S} Z:=S*T; {calculo Z} if r=(Trunc(Sqrt(S))) {si ning£n n£mero divide a S desde el 2 hasta el entero siguiente a su ra¡z cuadrada} then begin WriteLn('Z=',Z,' es un n£mero perfecto.'); end else begin WriteLn(Z,' no es un n£mero perfecto, pues ',S,' no es primo.'); End; WriteLn(); {l¡nea en blanco} n:=n+1; until n>m; {Ep¡logo} WriteLn('Presione Enter para salir.'); ReadLn; {pausa} end. ++++ ==== Punto III ==== Dado un telegrama que termina en punto y que está almacenado en el segundo renglón de un archivo de texto, se desea desarrollar un programa en Lenguaje Pascal que lo lea carácter por carácter y determine la cantidad de palabras que contiene. El resultado se deberá agregar al archivo de texto, dejando previamente un renglón en blanco. **Nota:** * Se debe suponer que las palabras se encuentran separadas por espacios en blanco, comas o punto y coma. * Considerar que puede haber espacios en blanco al comienzo del telegrama y que no se deberán considerar como palabras. ++++Resolución:| {Sección Declarativa} program telegram_sam; uses Crt; {Subprogramas de manejo de pantalla} var p: integer; {es la cantidad de palabras} ask, l, d: byte; {ask, indica si hay que repreguntar o no, l indica si el último carácter es un alfanumérico (1) o no (0), d indica si el último carácter leído es un punto (1) o no (0)} simple: string[2]; tele: text; camino: string[50]; a: string[1]; const path='telegrama.txt'; {Sección algorítmica} {Prólogo} begin Clrscr; writeln('Bienvenido a "telegram sam," un programa que lee un telegrama que termina en punto, cuenta la cantidad de palabras del texto y se las anexa al final del mismo.'); writeln; writeln; repeat writeln('¨El archivo en cuesti¢n se llama "telegrama.txt" y se encuentra en la misma carpeta que este programa?'); writeln; readln(simple); if simple='S¡' then begin ask:=0; assign(tele,path); end else begin if simple='No' then begin ask:=0; writeln; writeln('Por favor, ingrese el camino (path) del archivo de texto en cuesti¢n (si el archivo se encuentra en la misma carpeta que este programa, simplemente ingrese el nombre del archivo)'); writeln; writeln; readln(camino); assign(tele,camino); end else begin ask:=1; {Si responde cualquier cosa, se le vuelve a preguntar} writeln; end end until ask=0; writeln; reset(tele); readln(tele); {leo la línea en blanco del principio del archivo de texto} p:=0; l:=0; d:=0; {inicializo variables} {Resolución} repeat read(tele,a); if l=1 {si el caracter anterior era un alfanumérico} then begin if true=((a=' ') OR (a=',') OR (a=';')) {si el caracter actual es alguno de ésos} then begin p:=p+1; {incremento el contador de palabras en uno} l:=0; {indico que para la próxima vuelta el carácter anterior no va a ser un alfanumérico} end else begin if a='.' then begin p:=p+1; {incremento el contador de palabras en uno} d:=1; {indico que el carácter actual es un punto} end else l:=1; {si no, indico que para la próxima vuelta el carácter anterior también va a ser un alfanumérico} end end else {si el caracter anterior NO era un alfanumérico} begin if true=((a=' ') OR (a=',') OR (a=';')) {si el caracter actual es alguno de ésos} then {no hace nada} else begin if a='.' then d:=1 {indico que el carácter actual es un punto} else l:=1; {si no, indico que para la próxima vuelta el carácter anterior también va a ser un alfanumérico} end end until d=1; {hasta que se termine el telegrama (se supone que con un punto)} append(tele); writeln(tele); writeln(tele); writeln(tele,'La cantidad de palabras del telegrama es ',p,'.'); close(tele); writeln('La cantidad de palabras del telegrama es ',p,', y ‚sta ha sido anexada al archivo de texto.'); writeln; writeln; {Epílogo} writeln('Presione enter para finalizar.'); readln; {pausa} end. ++++ ==== Punto IV ==== En un archivo de texto se encuentra el registro diario a lo largo de un mes, de las lluvias registradas en una localidad. La información que se encuentra en el archivo de texto es: | Número de mes | año | Ej. | 3 | 2007 | | Renglón en blanco | | | | | | Día | cantidad de lluvia caída | | 1 | 50 | | … | … | | | | | Día | cantidad de lluvia caída | | 31 | 0 | La información está ordenada por día. Se desea desarrollar un programa en Lenguaje Pascal que, en el caso en que se haya registrado lluvia algún día, muestre por pantalla: * Día más lluvioso. * Informe si llovió dos días seguidos. * Y, en el caso en que no haya llovido en todo el mes emitir un mensaje por pantalla. Observación: * El programa debe poder aplicarse a cualquier mes (tener en cuenta que el año puede ser bisiesto). Un año es bisiesto si es divisible por 400 o, si es divisible por 4 pero no por 100. **Ejemplo:** * 1999 no es bisiesto porque no es divisible por 4.\\ * 1800 no es bisiesto porque es divisible por 4 y por 100. * 2008 es bisiesto porque es divisible por 400. * Si el mes es febrero, evaluar si es o no bisiesto a través de una condición lógica compuesta. ++++Resolución:| {Secci¢n declarativa} program Rain; uses Crt; {Subprogramas de manejo de pantalla} var simple: string[2]; camino: string[50]; datos: text; lluvia, pluie, agua, lmax: real; dia, mes, anno, dmes, dmax: integer; ask, dd: byte; const path='lluvia.txt'; {Secci¢n algor¡tmica} begin {Pr¢logo} ClrScr; {Limpieza de la pantalla} writeLn('Programa que informa sobre el £ltimo d¡a m s lluvioso del mes, si llovi¢ dos d¡as seguidos y si no llovi¢ en todo el mes'); {T¡tulo} writeLn; {rengl¢n en blanco} writeLn; {rengl¢n en blanco} repeat writeln('¨El archivo en cuesti¢n se llama "lluvia.txt" y se encuentra en la misma carpeta que este programa?'); writeln; readln(simple); if simple='S¡' then begin ask:=0; assign(datos,path); end else begin if simple='No' then begin ask:=0; writeln; writeln('Por favor, ingrese el camino (path) del archivo de texto en cuesti¢n (si el archivo se encuentra en la misma carpeta que este programa, simplemente ingrese el nombre del archivo)'); writeln; writeln; readln(camino); assign(datos,camino); end else begin ask:=1; {Si responde cualquier cosa, se le vuelve a preguntar} writeln; end end until ask=0; writeln; {writeln('Ingrese la direcci¢n (camino y nombre) del archivo de texto a procesar:');} {readln(camino);} {writeln;} {rengl¢n en blanco} {assign(datos,camino);} reset(datos); readln(datos, mes,anno); readln(datos); lluvia:=0; agua:=0; lmax:=0; {Veo si el a¤o es bisiesto para dar un l¡mite al bucle} case mes of 1,3,5,7,8,10,12: dmes:=31; 4,6,9,11: dmes:=30; else begin if 0=anno div 4 then dmes:=28 else begin if 1=anno div 100 then dmes:=28 else dmes:=29 end; end; end; {Resoluci¢n} repeat pluie:=lluvia; read(datos,dia,lluvia); {lluvia:=abs(lluvia);} {Esto era por si el n£mero es negativo, pero tira error} agua:=agua+lluvia; if dd=0 then begin if ((pluie<>0) and (lluvia<>0)) then dd:=1 end; if lluvia>=lmax then begin dmax:=dia; lmax:=lluvia; end; until dia=dmes; if agua=0 then begin writeln('No ha llovido en todo el mes'); writeln; end else begin if dd=1 then begin writeln('Llovi¢ dos d¡as seguidos'); writeln; end; writeln('El £ltimo d¡a m s lluvioso fue el ',dmax); writeln; end; {Ep¡logo} writeLn('Pulse Enter para finalizar'); {Anuncio de finalizaci¢n} close(datos); readLn; {Pausa} end. ++++ ===== Discusión ===== Si ves algo que te parece incorrecto en la resolución y no te animás a cambiarlo, dejá tu comentario acá.