Cátedra: Grossi
Cuatrimestre: 2.º Cuatrimestre 2008
Desarrollar un programa en Lenguaje Pascal que solicite el ingreso por teclado de un ángulo expresado en grados e indique por pantalla si es:
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.
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.
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.
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:
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.
Si ves algo que te parece incorrecto en la resolución y no te animás a cambiarlo, dejá tu comentario acá.