Pascal/Turbo Pascal - PASCAL RECURSIVIDAD

 
Vista:

PASCAL RECURSIVIDAD

Publicado por Rosenrot (1 intervención) el 15/11/2012 00:10:08

Hola, necesito urgentemente para mañana este programa. El caso es que consigo sacar algunas cosillas pero tengo problemas en lo de llamar a otros subprogramas y tal. El enunciado es este :




Múltiplos sinceros: Se denomina “múltiplos sinceros” a "los números que son múltiplos de un número base de una cifra y en los cuales la suma de sus cifras es también este mismo número base".
Por ejemplo, “múltiplos sinceros” del número base 2 son el 2, 20, 110, 200, 1.010, 1.100, 2.000, ...
Ya que el 20 es múltiplo de 2 y además la suma de sus cifras (2+0) da 2.
El 110 también es múltiplo de 2 y además la suma de sus cifras (1+1+0) da 2.
Otro ejemplo: “múltiplos sinceros” del número base 9 son el 9, 18, 27, 36, 45, 54, 63, 72, 81, 90, 108, 117, ...


Cuadrado de los números de 2 cifras acabados en 5:
El cuadrado de los números de dos cifras que terminan en 5 (por ejemplo 15, 25, 35, etc.) se puede hacer de manera muy rápida: "Multiplicando la decena propia por la siguiente y añadiendo un 25 detrás"
Ejemplos:
15²: multiplicamos su decena (1) por la siguiente (2), y obtenemos 1x2= 2 añadimos un 25 detrás y tenemos el 225, que es 15².
55² : 5 x 6 = 30, añadimos el 25 y sale 3.025 = 55²
65² : 6 x 7 = 42, añadimos el 25 y sale 4.225 = 65²

Números colegas:
Un número n es “colega” de una cifra d, si el número n empieza y termina por la cifra d.
Por ejemplo: El número n =101 es colega de la cifra d = 1
El número n = 22 es colega de la cifra 2
El numero n = 3012 NO es colega de la cifra d = 3
El número n = 12341 es colega de la cifra 1.


Dada esta información desarrollar un programa que:
Muestre un menú que permita escoger entre:
a) Múltiplos sinceros
b) Cuadrado de números de 2 cifras acabados en 5
c) Números colegas
f) Terminar
Si el usuario escoge la opción a)
deberá solicitar dos números, correspondientes al número base y al mayor número (límite) que puede aparecer en la secuencia y realizará la llamada a un subprograma que reciba ambos número y muestre por pantalla los “múltiplos sinceros” de dicho número base hasta el límite. Por ejemplo, si introduce como número base el 2 y como límite el 1000 deben aparecer los números: 2, 20, 110, 200 ya que el siguiente “múltiplo sincero” que es 1010 supera el límite 1000.
Si el usuario escoge la opción b)
nuestra aplicación le pedirá un número de dos cifras que termine en 5 (se tendrá que asegurar que cumple esas condiciones) y llamará a un subprograma que recibirá dicho número devolverá el cuadrado calculado según el método dado en la sección de teoría. Posteriormente, el programa mostrará el cuadrado de dicho número.
Si el usuario elige la opción c)
la aplicación le pedirá un número entero positivo (n) y un número de una única cifra (d) –se comprobará que los números cumplen las condiciones- y llamará a un suprograma que devolverá un valor booleano, que será TRUE si son colegas y FALSE en caso contrario. A continuación, el programa escribirá en pantalla si el número n es “colega” de la cifra d.
El programa debe pedir opciones y realizar las tareas asignadas hasta que el usuario escoja la opción f), momento en el cual el programa terminará.



Y lo que llevo hecho es esto:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
PROGRAM Prac7;
VAR
opcion: char;
NumeroBase,NumeroLimite: integer;
NumeroDosCifras,Resto: integer;
Numero,NumeroCifra :integer;
 
PROCEDURE MultiplosSinceros (NumBase,NumLimite:integer);
VAR
aux,suma,unidades,decenas,centenas:integer;
BEGIN
	FOR aux:=NumBase TO NumLimite DO
		BEGIN
			unidades:= aux mod 10;
			decenas:= (aux div 10) mod 10;
			centenas:= aux div 100;
			suma:=0;
			suma:=unidades + decenas + centenas;
			IF (suma=NumBase) AND (aux mod NumeroBase = 0) THEN
				writeln(aux);
	END; {end for}
 
END; {end procedure}
 
FUNCTION CuadradoNumero(NumDosCifras:integer):integer;
VAR
decena,numaux:integer;
BEGIN
	decena:= NumDosCifras div 10;
	numaux:= decena + 1;
	numaux:= numaux * decena;
CuadradoNumero:= numaux;
END;{end function}
 
FUNCTION NumeroColegaUnaCifra(Nume,NumeCifra:integer):boolean;
 
BEGIN
	IF (Nume = NumeCifra)THEN
		NumeroColegaUnaCifra:= TRUE
	ELSE
		NumeroColegaUnaCifra:= FALSE;
END; {end function}
 
FUNCTION NumerosColegas(Num,NumCifra:integer):boolean;
VAR
resto: integer; {decenas}
BEGIN
	IF (Num DIV 10 = 0) THEN
		NumeroColegaUnaCifra(Num,NumCifra)
	ELSE IF (Num DIV 10 <> 0) THEN
		resto:=(Num div 10) mod 10;
		IF (Resto DIV 10 = 0) THEN
			NumeroColegaUnaCifra(Resto,NumCifra);
END;
 
 
BEGIN
 
	REPEAT
		writeln(' ******************** MENU ********************');
		writeln('a) Multiplos sinceros');
		writeln('b) Cuadrado de numeros de 2 cifras acabados en 5');
		writeln('c) Numeros colegas');
		writeln('f) Terminar');
		writeln(' ***********************************************');
		readln(opcion);
		writeln;
		CASE opcion OF
			'a','A': BEGIN
					 	writeln('//////APARTADO A//////');
						writeln;
						REPEAT
							write('Introduzca un numero base: ');
							readln(NumeroBase);
						UNTIL (NumeroBase>=0);
						REPEAT
							write('Introduzca un numero limite: ');
							readln(NumeroLimite);
							writeln;
							MultiplosSinceros(NumeroBase,NumeroLimite);
						UNTIL (NumeroLimite>=0);
					 END; {end begin}
			'b','B': BEGIN
						writeln('//////APARTADO B//////');
						writeln;
						REPEAT
							write('Escriba un numero acabado en 5 de dos cifras: ');
							readln(NumeroDosCifras);
							Resto:= NumeroDosCifras mod 10;
						UNTIL (NumeroDosCifras<100) AND (NumeroDosCifras>=10) AND (Resto=5);
						CuadradoNumero(NumeroDosCifras);
						writeln;
						writeln('El cuadrado es igual a: ',CuadradoNumero(NumeroDosCifras),'25');
						writeln;
					 END; {end begin}
			'c','C': BEGIN
						writeln('//////APARTADO C//////');
						writeln;
						REPEAT
							write('Escriba un numero entero positivo: ');
							readln(Numero);
						UNTIL (numero>=0);
						REPEAT
							write('Escriba un numero de una cifra: ');
							readln(NumeroCifra);
					    UNTIL (NumeroCifra>=0) AND (NumeroCifra<10);
						NumerosColegas(Numero,NumeroCifra);
						writeln;
						IF (NumeroColegaUnaCifra(Numero,NumeroCifra) = TRUE) THEN
							writeln('El numero ',Numero,' SI es colega de ',NumeroCifra)
						ELSE
							writeln('El numero ',Numero,' NO es colega de ',NumeroCifra);
					 END; {end begin}
		END; {end case}
	UNTIL (opcion = 'f' ) OR (opcion = 'F'); {fnalizo el programa}
	writeln('Gracias por usar el programa, pulse enter para salir');
	readln;
END.



tengo problema mas que nada en el a y en el c... en que si paso a unidades de millar ya me lio, y lo de llamar a subprogramas dentro de otro otro lio en el c , no se por donde pillarlo . gracias por la ayuda q podais dar
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

PASCAL RECURSIVIDAD

Publicado por ramon (2158 intervenciones) el 15/11/2012 18:00:36
A ver si es esto


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
PROGRAM Prac7;
uses
  crt;
VAR
opcion: char;
NumeroBase,NumeroLimite: integer;
NumeroDosCifras,Resto: integer;
Numero,NumeroCifra :integer;
 
PROCEDURE MultiplosSinceros (NumBase,NumLimite:integer);
VAR
aux,suma,unidades,decenas,centenas:integer;
BEGIN
	FOR aux:=NumBase TO NumLimite DO
		BEGIN
                        unidades:= aux mod 10;
			decenas:= (aux div 10) mod 10;
			centenas:= aux div 100;
			suma:=0;
			suma:=unidades + decenas + centenas;
			IF (suma=NumBase) AND (aux mod NumeroBase = 0) THEN
				writeln(aux);
	END; {end for}
 
END; {end procedure}
 
FUNCTION CuadradoNumero(NumDosCifras:integer):integer;
VAR
decena,numaux:integer;
BEGIN
	decena:= NumDosCifras div 10;
	numaux:= decena + 1;
	numaux:= numaux * decena;
CuadradoNumero:= numaux;
END;{end function}
 
FUNCTION NumeroColegaUnaCifra(Nume,NumeCifra:integer):boolean;
 
BEGIN
	IF (Nume = NumeCifra)THEN
		NumeroColegaUnaCifra:= TRUE
	ELSE
		NumeroColegaUnaCifra:= FALSE;
END; {end function}
 
FUNCTION NumerosColegas(Num,NumCifra:integer):boolean;
VAR
resto: integer; {decenas}
BEGIN
	IF (Num DIV 10 = 0) THEN
		NumeroColegaUnaCifra(Num,NumCifra)
	ELSE
              IF (Num DIV 10 <> 0) THEN
		resto:=(Num div 10) mod 10;
		IF (Resto DIV 10 = 0) THEN
		NumeroColegaUnaCifra(Resto,NumCifra);
END;
 
 
BEGIN
        clrscr;
	REPEAT
		writeln(' ******************** MENU ********************');
		writeln('a) Multiplos sinceros');
		writeln('b) Cuadrado de numeros de 2 cifras acabados en 5');
		writeln('c) Numeros colegas');
		writeln('f) Terminar');
		writeln(' ***********************************************');
		readln(opcion);
		writeln;
		CASE opcion OF
			'a','A': BEGIN
					 	writeln('//////APARTADO A//////');
						writeln;
						REPEAT
							write('Introduzca un numero base: ');
							readln(NumeroBase);
						UNTIL (NumeroBase>=0);
						REPEAT
							write('Introduzca un numero limite: ');
							readln(NumeroLimite);
						UNTIL (NumeroLimite>=0);
                                                clrscr;
						MultiplosSinceros(NumeroBase,NumeroLimite);
                                                readln;
					 END; {end begin}
			'b','B': BEGIN
						writeln('//////APARTADO B//////');
						writeln;
						REPEAT
							write('Escriba un numero acabado en 5 de dos cifras: ');
							readln(NumeroDosCifras);
							Resto:= NumeroDosCifras mod 10;
						UNTIL (NumeroDosCifras<100) AND (NumeroDosCifras>=10) AND (Resto=5);
						CuadradoNumero(NumeroDosCifras);
						writeln;
						writeln('El cuadrado es igual a: ',CuadradoNumero(NumeroDosCifras),'25');
						writeln;
					 END; {end begin}
			'c','C': BEGIN
                                               clrscr;
						writeln('//////APARTADO C//////');
						writeln;
						REPEAT
							write('Escriba un numero entero positivo: ');
							readln(Numero);
						UNTIL (numero>=0);
						REPEAT
							write('Escriba un numero de una cifra: ');
							readln(NumeroCifra);
					    UNTIL (NumeroCifra>=0) AND (NumeroCifra<10);
						NumerosColegas(Numero,NumeroCifra);
						writeln;
						IF (NumeroColegaUnaCifra(Numero,NumeroCifra) = TRUE) THEN
							writeln('El numero ',Numero,' SI es colega de ',NumeroCifra)
						ELSE
							writeln('El numero ',Numero,' NO es colega de ',NumeroCifra);
                                                        readln;
					 END; {end begin}
		END; {end case}
	UNTIL (opcion = 'f' ) OR (opcion = 'F'); {fnalizo el programa}
	writeln('Gracias por usar el programa, pulse enter para salir');
	readln;
END.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar