Pascal/Turbo Pascal - verificar orden de numeros en secuencia (ayuda)

 
Vista:
sin imagen de perfil
Val: 5
Ha disminuido su posición en 5 puestos en Pascal/Turbo Pascal (en relación al último mes)
Gráfica de Pascal/Turbo Pascal

verificar orden de numeros en secuencia (ayuda)

Publicado por zeretexe (2 intervenciones) el 14/07/2020 01:55:42
Estoy practicando para un parcial y tengo un problema en un punto.
Me pide que verifique si los digitos de cada uno de los numeros estan ordenados de manera creciente o decreciente.

Mi codigo tiene otro problema mas pequeño; que tambien me verifica el 0, pero no es urguente.

(a) tienen todos sus dígitos en algún orden estrictamente creciente o decreciente

Las variables y funciones que puedo utilizar son las que puse en mi codigo, hay cosas como array, etc. que no las podemos utilizar.

Ej:
Ingresá una secuencia de números terminada en 0:
13 213 123 22 83 0
13 cumple las dos propiedades
213 no cumple ninguna
123 cumple que están en orden
22 cumple que la suma de los dígitos no es múltiplo de 3
83 cumple las dos propiedades

El problema pide mas cosas pero la parte que no puedo descifrar es esa.
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
program programa2;
var
  aux, num:integer;
  condicionVB: boolean;
  condicionVA: boolean;
 
procedure inivar;
begin
num:=0;
aux:=0;
end;
 
{-----------------------------------------}
 
procedure pausa; //enter para continuar
begin
repeat
writeln();
writeln('>> Presione ENTER para continuar <<');
readln();
until eoln;
end;
 
{-----------------------------------------}
 
function multiplos(num2:integer):boolean; //verifica mult3
var
  ultimo_digito, suma:integer;
begin
ultimo_digito:=0;
suma:=0;
repeat
   begin
     ultimo_digito := num2 mod 10;
     num2 := num2 div 10;
     suma := suma + ultimo_digito;
     if suma mod 3 = 0 then
          multiplos := false
       else
          multiplos := true;
   end;
until num2=0;
end;
 
{-----------------------------------------}
 
function ordenes(num3:integer):boolean; //verifica orden de los digitos
var
  ultimo_digito2:integer;
{
Esta parte seria la que no puedo hacer.
}
 
begin
repeat
   begin
     ultimo_digito2 := num3 mod 10;
     num3 := num3 div 10;
     if (ultimo_digito2 = num3+1) then
       ordenes := true
     else
       ordenes := true;
   end;
until num3=0;
end;
 
{=========================================}
 
begin
writeln('Escribe una secuencia de numeros que acabe 0');
inivar;
 
repeat
  read(num); aux:=num;
  condicionVA:=ordenes(aux);
  condicionVB:=multiplos(aux);
  if (condicionVA) and (condicionVB) then
    writeln(num, ' Cumple condicion A y B')
    else if not (condicionVA) and (condicionVB) then
    writeln(num, ' No cumple ninguna condicion')
    else if (condicionVB) and not (condicionVA) then
    writeln(num, ' Cumple solo la condicion B')
    else if (condicionVA) and not (condicionVB) then
    writeln(num, ' Cumple solo la condicion A')
until (num=0);
 
pausa;
end.
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
sin imagen de perfil
Val: 112
Bronce
Ha mantenido su posición en Pascal/Turbo Pascal (en relación al último mes)
Gráfica de Pascal/Turbo Pascal

verificar orden de numeros en secuencia (ayuda)

Publicado por juanba (40 intervenciones) el 14/07/2020 09:15:04
Buenos días.
Tengo que decirte con todo respeto que te explicas como un libro cerrado. Pero algo he he creído comprender.
Te envío unas cuantas preguntas y alguna sugerencia:
¿La propiedad VB es NO SER MULTIPLO DE 3?
¿La propiedad VA es ser simplemente creciente o decreciente? ¿O tener los digitos consecutivos?
Por ejemplo: ¿157 cumple A? o ¿765 cumple A pero 157 no la cumple?
Deduzco de tu post que las condiciones son las dos que he puesto como primera opcion y te comento mi impresion:

- La funcion ordenes es un tanto incomprensible para mi. Veo que se compara el ultimo digito con el resto del numero que queda a su izquierda. Y que luego, independientemente de cual sea el resultado de la comparacion se asigna TRUE al resultado Te voy a escribir lo que yo creo que podría ser:

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
//-----------------------------------------------------------------------------
// funcion ordenes
// Determina si un numero tiene sus digitos en orden creciente o decreciente
// Devuelve true si se cumple uno de los dos casos
// Utiliza dos variables auxiliares orden_cre y orden_decre, asumiendo que
// de entrada se cumplen y va conprobando que los sucecivos digitos mantienen
// o anulan ese supuesto. Si uno de los dos casos queda anulado, los siguientes
// digitos no cambian esta anulacion.
// La funcion devuelve true si uno de los dos casos se mantiene al final de
// las comprobaciones de todos los digitos.
// Si el numero solo tiene un digito (< 10) considera que cumple tanto la
// condicion creciente como decreciente y devuelve TRUE. Se puede cambiar este
// comportamiento con una clausula if (num3 < 10) then ordenes := false;
//-----------------------------------------------------------------------------
 
function ordenes(num3: integer): boolean;
var ultimo, ant_ultimo: integer;
    orden_cre, orden_decre: boolean;
begin
  ordenes := false;
  orden_cre := true;
  orden_decre := true;
  ultimo := num3 mod 10;
  repeat
    num3 := num3 div 10;
    if (num3 > 0) then
    begin
      ant_ultimo  := num3 mod 10;
                                       // ¿Se mantiene el orden creciente?
      orden_cre := orden_cre and (ant_ultimo  < ultimo);
                                       // Se mantiene el orden decreciente?
      orden_decre := orden_decre and (ant_ultimo > ultimo);
      ultimo := ant_ultimo;
    end;
  until num3 = 0;
  ordenes := orden_cre or orden_decre;
end;

Ejecutando una prueba de este codigo con los numeros 1567, 1576, 7651 y 6751 me responde:
1567 y 7651: TRUE
1576 y 6751: FALSE
De hecho, todos los numeros inferiores a 100 excepto los de digitos repetidos (11, 22, 33...) devuelven true. O sea, son crecientes o decrecientes. Si quieres que dos digitos iguales y consecutivos no te rompan el crecimiento o decrecimento, cambia la comparacion "<" por "<=" en el bucle de comparacion.
Espero que esto te solucione el asunto. De todos modos, si mi interpretacion no es correcta hazme un comentario.
Un saludo
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
sin imagen de perfil
Val: 112
Bronce
Ha mantenido su posición en Pascal/Turbo Pascal (en relación al último mes)
Gráfica de Pascal/Turbo Pascal

verificar orden de numeros en secuencia (funcion multiplos)

Publicado por juanba (40 intervenciones) el 14/07/2020 09:49:47
En cuanto a la funcion multiplos tengo la impresion de que la comparacion de la suma deberia estar fuera del bucle Repeat. Lo que tienes no da un resultado erróneo porque al final compara la suma total, pero por el camino vas comnparando las sumas parciales, lo que no tiene mucho sentido.
O sea que podría ser algo asi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function multiplos(num2:integer):boolean; //verifica mult3
var
  ultimo_digito, suma:integer;
begin
ultimo_digito:=0;
suma:=0;
repeat
   begin
     ultimo_digito := num2 mod 10;
     num2 := num2 div 10;
     suma := suma + ultimo_digito;
   end;
until num2=0;
   if suma mod 3 = 0 then
        multiplos := false
     else
        multiplos := true;
end;

Una sugerencia: puedes ahorrar codigo en la funcion multiplos cambiando la comparacion de la suma a:



1
multiplos := (suma mod 3)  <> 0;

Y si no recuerdo mal las reglas matemáticas que me enseñaron cuando era pequeño "un número es divisible por tres cuando la suma de sus digitos es divisible por tres. O sea que puedes sustituir toda la funcion multiplos por:

1
condicionVB := (num mod 3) <> 0;

Espero que esto te solucione el asunto. De todos modos, si mi interpretacion no es correcta hazme un comentario.
Un saludo
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
sin imagen de perfil
Val: 5
Ha disminuido su posición en 5 puestos en Pascal/Turbo Pascal (en relación al último mes)
Gráfica de Pascal/Turbo Pascal

verificar orden de numeros en secuencia (ayuda)

Publicado por roman (2 intervenciones) el 14/07/2020 15:24:16
Buen dia Juanba.
Muchas gracias por responder, es verdad que me explique mal, estaba medio estresado porque venia de practicar 4hrs seguidas y me trababa en cosas asi.
La funcion ordenes del codigo que publique en el post, le di de resultado true de cualquier forma para poder seguir con lo demas que me pedia el punto, ya que me daba problema.
te respondo a las preguntas:

¿La propiedad VB es NO SER MULTIPLO DE 3? ---> exacto
¿La propiedad VA es ser simplemente creciente o decreciente? ¿O tener los digitos consecutivos? ---> simplemente creciente o decreciente, 169 es creciente, 9762 es decreciente.
Osea que la funcion orden no cumple exactamente lo que pide. Aunque me ayudo mucho para comprender mas.

Muchas gracias por dedicarte a responderme.
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