Programación General > Pascal
Practica necesito ....
(1/1)
fjmc22:
Bueno mi problema es que al compilar mi programa me pone fatal: Unexpected end of file, y no se porque. Os voy a poner lo que me pide la practica y lo que tengo hecho, y por favor me la podeis mirar haber en que fallo, o algo que tenga mal, muchas gracias.
Lo que pide:
Un número entero está formado por secuencias de dígitos en un determinado orden. Si analizamos esas secuencias de dígitos podremos observar como, cada número, está formado por una cantidad de otros dígitos más pequeños que
denominaremos patrones. Por ejemplo:
Dado el patrón 13
Podemos deducir que entre 1 y 100 solo hay un número que lo contiene, esto es, el 13.
Sin embargo, entre 100 y 1000 hay 19 que lo contienen. Así, por ejemplo, el 131 y el 213.
Entre 1000 y 10000 hay 279 números que contienen el patrón 13.
Entre 10.000 y 100.000 encontramos 3671 números que repiten el patrón.
Hay que tener en cuenta que solo contabilizamos el patrón si se encuentra unido, es decir, 103 no contiene el patrón 13 sin embargo, 133 si contiene dicho patrón.
Práctica:
Dada esta información, se pide que desarrolléis un programa, que utilizará los subprogramas que creáis necesarios, que permita:
- Determinar cuántos enteros en un rango dado contienen un determinado patrón
- Mostrar los enteros comprendidos en ese rango dado que contienen dicho patrón
- Mostrar, en caso de que los haya, los dos números mayores, dentro del rango dado, que contienen dicho patrón. En caso de que solo exista un número que contenga el patrón, el primero tendrá un valor negativo (-1) y
el segundo contendrá dicho número. En caso de que no exista ningún número, ambos mostrarán un número negativo (-1).
Para ello el programa solicitará que el usuario elija la opción que desea ejecutar
y, a continuación, pedirá:
- Un entero positivo n que indicará el patrón y que puede tener desde 1 a 5
cifras y
- Dos enteros a y b (cuyos valores oscilarán entre 1 y MAXINT y siendo a menor que b).
A modo de ayuda, se presentan varios ejemplos de ejecución del programa (en negrita los mensajes mostrados por el programa y en cursiva los datos
introducidos por el usuario).
Codigo:
--- Código: Text --- PROGRAM Pobligatoria; VARinicio,fin,patron,opcion:integer; FUNCTION comprobar(x:integer):boolean;VAR aux1,aux2,aux3,aux4,aux5,aux6,aux7,aux8,aux9:integer;BEGIN CASE x OF 1..9:BEGIN IF x=patron THEN comprobar:=true; END; 10..99:BEGIN IF patron<10 THEN aux1:= x div 10; aux2:= aux1 mod 10; IF (x=aux1) OR (x=aux2) THEN comprobar:=true; END;{IF} END;{IF} IF (patron>9) AND (x=patron) THEN comprobar:=true; END;{IF} { END;{CASE 10..99} 100..999:BEGIN IF patron<10 THEN aux1:= x div 10; aux2:= aux1 mod 10;{el valor ultimo} aux3:= aux1 div 10;{el primer valor} aux4:= aux3 mod 10;{el valor central} IF (x=aux2) OR (x=aux3) OR (x=aux4) THEN comprobar:=true; END;{IF} END;_{IF patron<10} IF (patron>=10) AND (patron<=99) THEN aux1:= x div 10; {parte izquierda} aux2:= x div 100; aux3:= aux2 mod 100; {parte derecha} IF (x=aux1) OR (x=aux3) THEN comprobar:=true; END; {IF} END;{IF patron entre 10 hasta 99} IF (patron>99) AND (patron<1000) AND (patron=x) THEN comprobar:=true; END; 1000..9999:BEGIN IF patron<10 THEN aux1:= x div 1000; {el primer valor} aux2:= x div 10; aux3:= aux2 mod 10; {el cuarto valor} aux4:= aux2 div 10; aux5:= aux4 mod 10; {el tercer valor} aux6:= aux4 div 10; aux7:= aux4 mod 10; {el segundo valor} IF (x=aux1) OR (x=aux7) OR (x=aux5) OR (x=aux3) THEN comprobar:=true; END; END; {if del patron menor de 10} IF (patron>=10) AND (patron<=99) THEN aux1:= x div 100;{2 primeros numeros} aux2:= aux1 mod 100; {2 ultimos numeros} aux3:= x div 10; aux4:= aux3 div 100; aux5:= aux4 mod 100; {2 numeros del centro} IF (x=aux1) OR (x=aux2) OR (x=aux5) THEN comprobar:=true; END; END;{if de patron 10..99} IF (patron>=100) AND (patron<1000) THEN aux1:= x div 10; {los 3 primeros numeros} aux2:= x div 1000; aux3:= aux2 mod 1000; {los 3 ultimos numeros} IF (x=aux1) OR (x=aux3) THEN comprobar:=true; END; END; {if de patron 100..999} IF (patron>=1000) AND (patron<=9999) THEN IF patron=x THEN comprobar:=true; END; END; 10000..32767:BEGIN IF (patron>=0) AND (patron<=9) THEN aux1:= x div 10; aux2:= aux1 mod 10; {quinto numero} aux3:= aux1 div 10; aux4:= aux3 mod 10; {cuarto numero} aux5:= aux3 div 10; aux6:= aux5 mod 10; {tercer numero} aux7:= aux5 div 10; aux8:= aux7 mod 10; {segundo numero} aux9:= aux7 div 10; {primer numero} IF (x=aux2) OR (x=aux4) OR (x=aux6) OR (x=aux8) OR (x=aux9) THEN comprobar:=true; END; END; IF (patron>=10) AND (patron<=99) THEN aux1:= x div 100; aux2:= aux1 mod 100; {2 ultimos numeros} aux3:= x div 1000; {2 primeros numeros} aux4:= x div 10; aux5:= aux4 div 100; aux6:= aux5 mod 100; {2 penultimos} aux7:= aux1 div 100; aux8:= aux7 mod 100; {el 2 y 3} IF (x=aux2) OR (x=aux3) OR (x=aux6) OR (x=aux8) THEN comprobar:=true; END; END; IF (patron>=100) AND (patron<=999) THEN aux1:= x div 100; {numeros 123} aux2:= x div 1000; aux3:= aux2 mod 1000; {numeros 345} aux4:= x div 10; aux5:= aux4 div 1000; aux6:= aux5 mod 1000; {numeros 234} IF (x=aux1) OR (x=aux3) OR (x=aux6) THEN comprobar:=true; END; END; {if de entre 100 y 999} IF (patron>=1000) AND (patron<=9999) THEN aux1:= x div 10; {numeros 1234} aux2:= x div 10000; aux3:= aux2 mod 10000; {numeros 2345} IF (x=aux1) OR (x=aux3) THEN comprobar:=true; END; END; {if de patron 1000..9999} IF (patron>=10000) AND (patron<=32767) THEN IF x=patron THEN comprobar:=true; END; END; END; PROCEDURE MostrarNumEnteros(ini,f,p:integer);VAR BEGIN cont:=0; FOR i:=ini TO f DO BEGIN comprobar(i); IF comprobar=true THEN cont:=cont+1; END;{IF} END;{FOR} writeln('Existen ',cont,' numeros entre ',ini,' y ',f,' que tienen patron ',p); END; PROCEDURE EscribirEnteros(inicio,fin,patron:integer);VARBEGIN FOR i:=ini TO f DO BEGIN comprobar(i); IF comprobar=true THEN writeln('El numero: ',i,' contiene el patron: ',p); END;{IF} END;{FOR}END; PROCEDURE Dosultimos(ini,f,p:integer);VARBEGIN cont:=0; REPEAT FOR i:=f DONWTO ini TO comprobar(i); IF comprobar:=true THEN cont:=cont+1; IF cont=1 THEN aux1:=i; IF cont=2 THEN aux2:=i; END; END; END; UNTIL (cont=2) OR (i<ini); IF cont=0 THEN writeln('Los 2 numeros mayores comprendidos entre: ',ini,' y ',f,' son -1 y -1'); END; IF cont=1 THEN writeln('Los 2 numeros mayores comprendidos entre: ',ini,' y ',f,' son -1 y ',aux1); END; IF cont=2 THEN writeln('Los 2 numeros mayores comprendidos entre: ',ini,' y ',f,' son ',aux1,' y ',aux2); END; END; PROCEDURE salir;BEGIN writeln('Ha decidido salir del programa.');END; BEGIN REPEAT writeln('a.- Mostrar cu ntos enteros en un rango dado contiene un patr¢n: '); writeln('b.- Mostrar los enteros en un rango dado que contiene un patr¢n: '); writeln('c.- Mostrar los dos mayores n£meros que contiene un patr¢n en un rango dado: '); writeln('d.- Finalizar'); readlln(opcion); CASE opcion OF 'a':BEGIN write('¨Patr¢n?: '); readln(patron) write('Valor inferior del rango: '); readln(inicio); write('Valor superior del rango: '); readln(fin); MostrarNumEnteros(inicio,fin,patron); END; 'b':BEGIN write('¨Patr¢n?: '); readln(patron) write('Valor inferior del rango: '); readln(inicio); write('Valor superior del rango: '); readln(fin); EscribirEnteros(inicio,fin,patron); END; 'c':BEGIN write('¨Patr¢n?: '); readln(patron) write('Valor inferior del rango: '); readln(inicio); write('Valor superior del rango: '); readln(fin); Dosultimos(inicio,fin,patron); 'd':salir; UNTIL (opc='d') OR (opcion='D');END.
eternity:
a simple vista creo que no tienes mucha idea de la sintaxis de un IF en este lenguaje...
usas cosas como estas que estan totalmente fuera de lugar:
--- Código: Pascal --- 10..99:BEGIN IF patron<10 THEN aux1:= x div 10; aux2:= aux1 mod 10; IF (x=aux1) OR (x=aux2) THEN comprobar:=true; END;{IF} {end IF????? } END;{IF} { end IF????? } IF (patron>9) AND (x=patron) THEN comprobar:=true; END;{IF}{end IF????? otro mas!} { END;{CASE 10..99}{si tiene que estar el END; porque es el que cierra el BEGIN de arriba} repasemos:
1) Para un if con una sola sentencia se utiliza:
--- Código: Pascal ---if <condición> then <sentencia>; 2) para un if con varias sentecias se utilizas:
--- Código: Pascal ---if <condición> then begin <sentencia 1>; <sentencia 2>; <sentencia 3>; ... <sentencia N>; end;
revisa tu codigo y repasa como se programa en este lenguaje!
:beer:
italiana:
Yo hace poco tuve q hacer una practica igual y creo q no te falta ni sobra ningun end, mira bien el lenguaje por si has metido algo de mas.
Creo q mas bien te sobran llaves, ejemplo:
10..99:BEGIN
IF patron<10 THEN
aux1:= x div 10;
aux2:= aux1 mod 10;
IF (x=aux1) OR (x=aux2) THEN
comprobar:=true;
END;{IF}
END;{IF}
IF (patron>9) AND (x=patron) THEN
comprobar:=true;
END;{IF}
{ END;{CASE 10..99}
Esa llave creo q no pinta nada ahi.
Espero servirte de ayuda.
eternity:
lo que se me ocurre es que trato de pasar un algoritmo en C a pascal y se le trastocaron los break del switch... esperemos que responda para saber que le paso ^_^
Navegación
Ir a la versión completa