• Jueves 5 de Diciembre de 2019, 20:33

Autor Tema:  Ejercicio con procedimientos.  (Leído 2521 veces)

ultraheroe

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Ejercicio con procedimientos.
« en: Viernes 19 de Noviembre de 2010, 11:20 »
0
Hola, soy nuevo por aqui, pero he visto que sois de los unicos foros que tienen un apartado solo para pascal, y vengo a pediros ayuda, ¿algo nuevo no?
mi ejercicio 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.
Práctica:
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
d) 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 mostrará 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 que termine en 5 y mostrará el cuadrado de dicho número usando el método descrito en el apartado de teoría.
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) y 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 escoge la opción d), momento en el cual el programa terminará.

y el codigo que he escrito es este:

Código: Pascal
  1. PROGRAM PrObli2 (input, output);
  2.  
  3. VAR
  4.    opcion: char;
  5.  
  6. PROCEDURE Menu;
  7.  
  8. BEGIN
  9.      writeln;
  10.      writeln('Introduzca una opcion: ');
  11.      writeln('1. Multiplos sinceros ');
  12.      writeln('2. Cuadrado de numeros de 2 cifras acabados en 5 ');
  13.      writeln('3. Numeros colegas ');
  14.      writeln('4. Terminar ');
  15.      writeln;
  16. END;  {fin menu}
  17.  
  18. PROCEDURE Cuadrado (num1, k: integer);
  19.  
  20. BEGIN
  21.      writeln('Escribe un numero de dos cifras acabado en 5 para calcular su cuadrado');
  22.      readln(num1);
  23.      k:= num1 DIV 10;
  24.      k:= k * (k + 1);
  25.      writeln('El cuadrado es; ', k, '25');
  26. END; {fin cuadrado}
  27.  
  28. PROCEDURE Colegas (num2, d, i, j, n, temp, acumulador, invertidor: integer);
  29.  
  30. BEGIN
  31.      writeln('Introduzca un numero entero positivo');
  32.      readln(num2);
  33.      REPEAT
  34.            writeln('Introduzca un numero de una cifra');
  35.            readln(d);
  36.      UNTIL d < 0;
  37.            readln(d);
  38.      i:= num2 MOD 10;
  39.      temp:=n;
  40.      acumulador:=0;
  41.      WHILE (temp > 0) DO BEGIN
  42.            acumulador:= acumulador * 10 + (temp MOD 10);
  43.            temp:= temp DIV 10;
  44.      END;
  45.      invertidor:= acumulador;
  46.      j:= acumulador;
  47.      IF (i = d) AND (j = d) THEN
  48.         writeln ('Los numeros son colegas');
  49.      END;
  50.  
  51. PROCEDURE Multiplos (suma, h, num3, base, limite, conta: integer);
  52.  
  53. BEGIN
  54.      writeln('Escriba un numero base');
  55.      readln(base);
  56.      writeln('Escriba un numero limite');
  57.      readln(limite);
  58.      writeln('No soy capaz de hacer esta parte...');
  59. END;
  60.  
  61.  
  62.  
  63. BEGIN {programa principal}
  64.       REPEAT
  65.             Menu;
  66.             readln(opcion);
  67.             IF (opcion >= '1') AND (opcion <='4') THEN
  68.             BEGIN
  69.                  CASE opcion OF
  70.                  '1': Multiplos;
  71.                  '2': Cuadrado;
  72.                  '3': Colegas;
  73.                  END; {case}
  74.             END {IF}
  75.             ELSE IF opcion = '4' THEN
  76.                  writeln('finalizando...');
  77.       UNTIL opcion = '4';
  78. END. {programa principal}
  79.  

estoy empezando en esto de los subprogramas con pascal y  a partir de aqui no se seguir porque me da un error de compilacion y seguro que no estoy utilizando bien los subprogramas pero esque de aqui ya no se seguir, a ver si me podeis echar una mano.

Gracias de antemano :comp:
« última modificación: Viernes 19 de Noviembre de 2010, 13:43 por ultraheroe »

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Ejercicio con subprogramas.
« Respuesta #1 en: Viernes 19 de Noviembre de 2010, 13:29 »
0
No son subprogramas, son procedimientos.

Si pudieras indicar qué errores te marca y dónde, me evitarías tener que instalar el entorno de Pascal sólo para ayudarte  :P  ^_^

ultraheroe

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Ejercicio con subprogramas.
« Respuesta #2 en: Viernes 19 de Noviembre de 2010, 13:41 »
0
vale, te pongo el codigo ya corregido, me funcionan todos los procedimientos menos el de los multiplos sinceros, porque directamente ya no se como hacerlo me he tirado 3 dias para esa chorrada que no me sale, lo demas funciona perfectamente, te copio:

Código: Pascal
  1. PROGRAM PrObli2 (input, output);
  2.  
  3. VAR
  4.    opcion: char;
  5.  
  6. PROCEDURE Menu;
  7.  
  8. BEGIN
  9.      writeln;
  10.      writeln('Introduzca una opcion: ');
  11.      writeln('1. Multiplos sinceros ');
  12.      writeln('2. Cuadrado de numeros de 2 cifras acabados en 5 ');
  13.      writeln('3. Numeros colegas ');
  14.      writeln('4. Terminar ');
  15.      writeln;
  16. END;  {fin menu}
  17.  
  18. PROCEDURE Cuadrado;
  19.  
  20. VAR
  21.    num1, k: integer;
  22.  
  23. BEGIN
  24.      writeln('Escribe un numero de dos cifras acabado en 5 para calcular su cuadrado');
  25.      readln(num1);
  26.      k:= num1 DIV 10;
  27.      k:= k * (k + 1);
  28.      writeln('El cuadrado es; ', k, '25');
  29. END; {fin cuadrado}
  30.  
  31. PROCEDURE Colegas;
  32.  
  33. VAR num2, d, i, j, n, temp, acumulador, invertidor: integer;
  34.  
  35. BEGIN
  36.      writeln('Introduzca un numero entero positivo');
  37.      readln(num2);
  38.      REPEAT
  39.            writeln('Introduzca un numero de una cifra');
  40.            readln(d);
  41.      UNTIL d < 10;
  42.      temp:=d;
  43.      acumulador:=0;
  44.      WHILE (temp > 0) DO BEGIN
  45.            acumulador:= acumulador * 10 + (temp MOD 10);
  46.            temp:= temp DIV 10;
  47.      END;
  48.      invertidor:= acumulador;
  49.      i:= num2 MOD 10;
  50.      j:= acumulador;
  51.      IF (i = d) AND (j = d) THEN BEGIN
  52.         writeln ('Los numeros son colegas');
  53.      END
  54.      ELSE
  55.         writeln('Los numeros no son colegas');
  56. END;
  57.  
  58. PROCEDURE Multiplos;
  59.  
  60. VAR
  61.    suma, h, num3, base, limite, conta: integer;
  62.  
  63. BEGIN
  64.      writeln('Escriba un numero base');
  65.      readln(base);
  66.      writeln('Escriba un numero limite');
  67.      readln(limite);
  68.      writeln('No soy capaz de hacer esta parte...');
  69. END;
  70.  
  71.  
  72.  
  73. BEGIN {programa principal}
  74.       REPEAT
  75.             Menu;
  76.             readln(opcion);
  77.             IF (opcion >= '1') AND (opcion <='4') THEN
  78.             BEGIN
  79.                  CASE opcion OF
  80.                  '1': Multiplos;
  81.                  '2': Cuadrado;
  82.                  '3': Colegas;
  83.                  END; {case}
  84.             END {IF}
  85.             ELSE IF opcion = '4' THEN
  86.                  writeln('finalizando...');
  87.       UNTIL opcion = '4';
  88. END. {programa principal}
  89.  

Saludetes :good:

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Ejercicio con procedimientos.
« Respuesta #3 en: Viernes 19 de Noviembre de 2010, 15:38 »
0
¿Puedes poner una definición más formal de "múltiplo sincero"? Jamás en la vida había oído tal definición, lo siento.

ultraheroe

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Ejercicio con procedimientos.
« Respuesta #4 en: Viernes 19 de Noviembre de 2010, 16:34 »
0
Claro que si.

Multiplos sinceros son los que dada una base 2 por ejemplo la suma de sus cifras 110 por ejemplo 1+1+0 es igual a la base dada.
otro ejemplo: base 9, un multiplo sincero seria el 81 ya que 8+1 es igual a 9 y 9 es nuestra base.
El ejercicio pide que se muestren todos los multiplos sinceros desde la base, hasta el ultimo que se encuentre dado un numero limite por el usuario, es decir, que el programa pida la base 2 (por ejemplo) y calcule sus multiplos sinceros hasta un limite que tambien pide al usuario, 1000 (por ejemplo). El 1010 por ejemplo no entraria ahi pusto que si es multiplo sincero de dos pero sobrepasa el limite.
Creo que la implementacion seria utilizando modulos y divisiones de 10 para hacer la suma de las cifras del numero, pero lo que no consigo es que me haga la suma, ni la compare, y pase al siguiente numero... etc.

Espero que mas o menos me hallas entendido.
Saludos de nuevo y mil gracias tambien :rolleyes:

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Ejercicio con procedimientos.
« Respuesta #5 en: Viernes 19 de Noviembre de 2010, 16:42 »
0
¿La base puede ser cualquier número entero positivo?

ultraheroe

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Ejercicio con procedimientos.
« Respuesta #6 en: Viernes 19 de Noviembre de 2010, 16:46 »
0
Cita de: "m0skit0"
¿La base puede ser cualquier número entero positivo?
si, debi decirlo tambien, positivo y mayor o igual que 1

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Ejercicio con procedimientos.
« Respuesta #7 en: Viernes 19 de Noviembre de 2010, 18:57 »
0
Hombre, la solución más inmediata y sencilla es recorrer todos los números hasta el tope marcado comprobando cada número si es múltiplo sincero.

ultraheroe

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Ejercicio con procedimientos.
« Respuesta #8 en: Viernes 26 de Noviembre de 2010, 00:19 »
0
bueno, he tardado algo mas en pasarme, el programa ya esta entregado y a la espera de la nota, al final fue un poco chapuzas pero siendo tan torpe me doy por satisfecho.

Solo dar las gracias por la ayuda prestada.

ultraheroe

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Ejercicio con procedimientos.
« Respuesta #9 en: Viernes 26 de Noviembre de 2010, 00:22 »
0
bueno, he tardado algo mas en pasarme, el programa ya esta entregado y a la espera de la nota, al final fue un poco chapuzas pero siendo tan torpe me doy por satisfecho.

Solo dar las gracias por la ayuda prestada.

ultraheroe

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Ejercicio con procedimientos.
« Respuesta #10 en: Viernes 26 de Noviembre de 2010, 00:25 »
0
bueno, he tardado algo mas en pasarme, el programa ya esta entregado y a la espera de la nota, al final fue un poco chapuzas pero siendo tan torpe me doy por satisfecho.

Solo dar las gracias por la ayuda prestada.