[ Foro de Pascal ]

Duda con una función

09-Dec-2010 19:54
Emanuel Bazan
9 Respuestas

Hola gracias por tener una pagina tan buena, con excelentes apuntes!!!

Tengo la siguiente función:

function  comparar(
x:  tiporenglon;  nx:  integer;
y:  tiporenglon;  ny:  integer):  integer;
var  nmax,  i:  integer;
begin
if  (nx  <  ny)  then  nmax  :=  nx  else  nmax  :=  ny;
(*  se  supone  que  nmax  >  0  *)
i  :=  1;
while  ((i  <  nmax)  and  (x[i]  =  y[i]))  do  i  :=  i  +  1;
(*  i  es  la  primer  posicion  donde  difieren  o  i  =  nmax  *)
if  (ord(x[i])  <  ord(y[i]))  then  comparar  :=  -1
else  if  (ord(x[i])  >  ord(y[i]))  then  comparar  :=  1
(*  a  partir  de  aca  tenemos  x[i]  =  y[i]  *)
else  if  (nx  <  ny)  then  comparar  :=  -1
else  if  (nx  >  ny)  then  comparar  :=  1
else  comparar  :=  0
end;

que compara alfabéticamente   —según el orden en Pascal— los renglones x y y  del tipo tiporenglon array[1..MAXC] of char, y de longitudes nx  y ny respectivamente.
DEBO contestar las siguientes preguntas y estoy realmente perdido.
a)  ¿Cuál es el uso de nmax?
b)  Encontrar el valor retornado por la función cuando
i) x = ‘ mi  mama ’, y = ‘ me  mima ’.
ii) x = ‘ mi  mama ’, y = ‘ mi  mama  me ’.
c)  Dar un ejemplo donde el valor retornado es 0.
d)  Cambiar el lazo while por uno repeat equivalente.
e)  Hacer un programa para leer dos renglones, y usando la función comparar,
escriba primero el que viene adelante alfabéticamente, y luego el otro. Dar un ejemplo donde el valor retornado es 0.
d)  Cambiar el lazo while por uno repeat equivalente.
e)  Hacer un programa para leer dos renglones, y usando la función comparar,
escriba primero el que viene adelante alfabéticamente, y luego el otro.

Por último como debería crear un programa para insertar esta función.

Muchisimas gracias, estoy haciendo una licenciatura en Matematicas en la modalidad libre y cualquier ayuda de ustedes es excelentemente recibida. Saludos.


09-Dec-2010 23:26
Antonio P.G.

Hola Emanuel.

Sinceramente, te daré dos respuestas. Si:

a) Has hecho parte del ejercicio, súbelo al foro, y así te podremos ayudar mejor. El programa no se lee muy bien, si lo puedes estructurar mejor, con sus sangrías, te lo agradeceríamos.

b) Si vienes en plan "Planto el ejercicio en el foro éste que he pillado y que me lo resuelvan"... mal vamos, porque (y eso que no soy el profesor aquí...) te indicaré que pone "Foro para dudas y novedades", no "Foro para que resuelvan ejercicios".

Espero que tu persona se corresponda con el apartado "a", al igual que espero entiendas mi punto de vista (no se muestra ni un solo atisbo de haber intentado resolverlo por tu parte).

Ciao.


09-Dec-2010 23:51
Emanuel Bazan

Hola, la verdad es que estoy a una semana de rendir...y los temas que no entiendo espero que alguien me ayude, estoy dando manotazos de ahogado, pero si es mucho trabajo entender el ejercicio tal ves no valga la pena para compartirlo y aprender de el. Te cuento algo que capaz no te interese pero la estaba llevando bien a la materia, hasta que hace un mes me "enferme" de una parálisis facial periférica que me impedía sentarme frente a la computadora y comer, entre otras cosas...ahora gracias a Dios estoy mejor, recuperado en un 90%, sigo realizando rehabilitación pero puedo sentarme a practicar el pascal, se que va a ser muy difícil que apruebe pero lo intentaré gracias de todos modos.


10-Dec-2010 00:12
Nacho Cabanes (+30)

Una semana es tiempo suficiente... si ya has estudiado antes.

Por ejemplo, el apartado (a) es trivial a partir de esta línea:

if  (nx  <  ny)  then  nmax  :=  nx  else  nmax  :=  ny;

Si entiendes esa frase, sabrás qué hace nmax.

De igual modo, el apartado (b) es cuestión simplemente de paciencia... o de teclearlo y probarlo.

El apartado (c) nuevamente se entiende apenas con mirar este fragmento:

if  (nx  <  ny)  then  comparar  :=  -1
else  if  (nx  >  ny)  then  comparar  :=  1
else  comparar  :=  0

Dedícale un poco de tiempo y, como te ha dicho Antonio, si esperas ayuda... plantea dudas concretas, no esperes que nadie lo resuelva completo por ti.


10-Dec-2010 00:21
Emanuel Bazan

Muchas Gracias, Nacho y espero que entiendas que tus apuntes son de gran ayuda, ya que el manual que me entregaron es muy práctico, casi sin teoría tengo que aprender por descubrimiento y eso lleva mucho tiempo...
Lo que veo es que a nmax se le asigna la longitud del renglón más corto.
Con respecto a lo que dices de teclearlo no se como hacerlo andar que tengo que poner??
Si me imagino que sale un arrays de 0 ó 1 ó  -1.
Muchas Gracias a los dos, espero me sepan entender y disculpar.
Saludos.


10-Dec-2010 01:02
Emanuel Bazan

Pongo lo que entiendo, con la salvedad que no se hacerlo funcionar para verificar que es lo que sale...
Ingresamos dos reglones los leemos, luego nmax indicara la longitud donde debemos comparar los dos reglones.

asignandole a i el valor 1, con el lazo mientras (while) el valor de i sea menor a la longitud de la cadena de caracteres a comparar, es decir, la longitud del renglon mas corto y ademas el valor de los caracteres sean iguales, comienza a incrementarse el contador...cuando pare es la posición donde difieren o i = nmax, e.g.: x: mi mama e y: mi mama me, entonces nmax=nx=i=7....

en el caso de no ser coincidentes tendremos un valor de i < nmax, a partir de ese valor nos fijamos el orden de los caracteres a traves de la función de pascal "ord()" y si el orden del primer caracter distinto es -1 significaria que la letra del primer renglon tiene un orden menor que la del segundo , si es 1 significara que el caracter del primer renglon distinto al segundo es mayor o algo así (acá me hago un nudo!!!).

Para cambiar el lazo while por uno repeat es sencillo:



  i:=1;

  repeat
  i:= i + 1
  until (((i< nmax) or ( x[i] <> y[i]))


GRACIAS!!!


10-Dec-2010 17:02
Antonio P.G.

Hola Emanuel.

Espero que entendieses mi primer mensaje. Algunas personas entran aquí con el objeto de aprobar la asignatura sin haber hecho nada de nada, y eso no me parece correcto.

Con respecto al último bucle que pusiste, es incorrecto. Si lo observas, la primera vez que se chequeen las condiciones, "i" será igual a 2. Para eso, haz que empiece en 0 y no en 1.

Por cierto, pongo aquí la función, con algunos comentarios y más estructurada (es a lo que me refería en mi primer mensaje). Así creo que se comprenderá su funcionamiento mucho mejor.

function  comparar(x:  tiporenglon;  nx:  integer;y:  tiporenglon;  ny:  integer):  integer;
 { Precondición: nx > 0, ny > 0. }
   var  
     nmax,            { Longitud máxima de comparación o Recorrido. }
     i:  integer;     { Contador. }
 begin
   { Se asigna la longitud máxima de comparación: }
   if  (nx  <  ny)  then   { Si longitud de reglón "x"< longitud de renglón "y"... }
     nmax  :=  nx  
   else    { Si no... }
     nmax  :=  ny;
  i:=  1;  
  while  ((i < nmax)  and  (x[i] = y[i]))  do  
    Inc (i);  { Se suma 1 a la variable "i". }
  { Aquí "i" es la primera posición donde difieren o es igual a "nmax" si }
  { son iguales durante el recorrido.                                     }
  { Ahora se compara la última posición en la que paró el bucle. }
  if  (ord(x[i])  <  ord(y[i]))  then  { Si va antes la de "x"... }
    comparar  :=  -1
  else  
    if  (ord(x[i])  >  ord(y[i]))  then  { Si va antes la de "y"... }
      comparar  :=  1
    else   { Si x[i] = y[i]... }
      if  (nx  <  ny)  then  { Si es más corto "x"... }
        comparar  :=  -1
      else  
        if  (nx  >  ny)  then { Si es más corto "y"... }  
          comparar  :=  1
        else  { Si son igual de largos... }
          comparar  :=  0
 end;

A lo mejor eso te ayuda un poco.

Por cierto, para leer renglones, crea un procedimiento que los lea, cuyo parámetro sea un renglón.

¡Hasta luego!


10-Dec-2010 19:12
Emanuel Bazan

Muchas Gracias Antonio!!!
Te cuento que la función no la hice yo, ya estaba en mis apuntes era un ejercicio y lo entendía menos que mas...

Yo soy profesor de Matemáticas y participo generalmente en foros ayudando con las respuesta, por ello entiendo lo que pusiste en el primer mensaje...
Un abrazo y nuevamente, Muchas Gracias!!!


11-Dec-2010 18:47
Antonio P.G.

Hola Emanuel.

Por cierto, se me olvidaba: para poder hacer el programa que te piden, tienen que definirte cómo es el tipo "renglón". Si no, no puedes.

En cualquier caso, el programa no sería muy complicado. Los pasos serían:

- Declarar dos variables de tipo renglón.
- Leer la primera.
- Leer la segunda.
- Compararlas.
- Si la primera va antes: escribir la primera variable y luego la segunda. Si no, escribir la segunda primero y después la primera.

Para leer y escribir lo mejor sería crear un par de procedimientos: "LeerRenglon" y "EscribirRenglon", por ejemplo.

¡Ciao!


12-Dec-2010 15:38
Emanuel Bazan

Gracias estimado Antonio!!!
Muy buena su ayuda, ya tengo los procedimientos. Ahora vamos mucho mejor. Saludos.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)