[ Foro de Pascal ]
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.
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.
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.
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.
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.
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!!!
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!
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!!!
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!
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.)