Autor |
Mensaje |
Dx9
Moderador
Edad: 37
Registrado: 03 Ene 2007
Mensajes: 1552
Carrera: Informática
|
|
Hola, estoy preparandome para rendir el final de algoritmos I, y toman en general ejercicios de punteros en C o en pascal, del estilo "busca el error en el siguiente programa".
Punteros se dio medio a las apresuradas en mi catedra (Guarna). Y no nos dieron nada para poder practicar.
la verdad queria ver si alguien me puede decir lo basico de punteros, aca les dejo un ejercicio de un coloquio:
Seguimiento
Explique con detalle que tarea realiza el siguiente procedimiento. Dar un ejemplo de funcionamiento para un conjunto de parametros p1 y p2 dados.
Código:
|
Procedure incognita(p1,p2:^char);
var p3:^char;
a:char;
begin
p3:=p1+1; {esto no entiendo que hace}
while (p3 MENOR O IGUAL p2) do
begin
if (p1^ MAYOR p3^) then
begin
a := p1^;
p1^ :=p3^;
p3 ^:=a;
end;
inc(p3);
end;
if (p1 <> p2) then
incognita (p1+1,p2);
end;
|
Creo que este problema encapsula muchas de mis preguntas...si alguien lo puede resolver y explicarmelo un poco, seria de gran ayuda. Gracias
|
|
|
|
Última edición por Dx9 el Mie Jul 11, 2007 1:14 pm, editado 2 veces
|
|
|
|
|
Rada
Moderador
Edad: 37
Registrado: 10 Abr 2006
Mensajes: 2728
Ubicación: Caballito
Carrera: Informática
|
|
vos tenes que p3 es un puntero a un char, tal como lo son p1 y p2
Un puntero a un char puede ser entendido como una cadena (string)
Si vos pones p3 := p1+1 estas apuntando el inicio de la cadena p3 a la segunda posicion de p1.
Al pedir p1^ estas pidiendo a lo que apunta p1 en ese momento, el char inicial de la cadena seria.
Lo que no entiendo es la condicion del while, ademas de que dice while then cosa que me confunde mas todavia fiajte si por ahi no tenes algun error, depues la funcion no se lo que hace, fijae bien el enunciado, yo no entendi muy bien.
PD:maldito pascal
|
|
|
|
_________________ [CAMPAÑA] Colaboremos entre todos por un foro más ordenado (click aquí)
[CAMPAÑA] Hacer un tópico por cada curso y con información ¡útil! (click aquí)
Gabba gabba we accept you we accept you one of us
|
|
|
|
|
Rada
Moderador
Edad: 37
Registrado: 10 Abr 2006
Mensajes: 2728
Ubicación: Caballito
Carrera: Informática
|
|
|
|
|
Fhran
Administrador
Edad: 39
Registrado: 25 Ago 2005
Mensajes: 3123
Ubicación: En la rama de un árbol... entre locos.
Carrera: Electrónica y Informática
|
|
**********
Ojo que el foro tiene un bug y si ponés cosas entre > y < se chinga todo.
<testeando>
(en realidad puse testeando algo y el algo no se ve)
***********
|
|
|
|
_________________
El horóscopo del ingeniero es un poco más amplio. Se compone de Amor, Dinero, Salud, Simetría y Linealidad Causa-Efecto.
|
|
|
|
|
Dx9
Moderador
Edad: 37
Registrado: 03 Ene 2007
Mensajes: 1552
Carrera: Informática
|
|
Rada escribió:
|
Lo que no entiendo es la condicion del while, ademas de que dice while then cosa que me confunde mas todavia fiajte si por ahi no tenes algun error, depues la funcion no se lo que hace, fijae bien el enunciado, yo no entendi muy bien.
PD:maldito pascal
|
Gracias rada, no habia pensado que p1 era un array de chars.
En un momento dice while (p3 <= p2) do
que esta comparando ahi? la direccion? tiene sentido?
mmm..si el codigo que aparece es cualquier cosa....los < > no me lo permiten escribir bien (me borraron un if completo y todo). Y tampoco puedo hacer las tabulaciones, porq no me las toma
Ellos me toman en C o en pascal Yo no elijo
|
|
|
|
|
|
|
|
|
Rada
Moderador
Edad: 37
Registrado: 10 Abr 2006
Mensajes: 2728
Ubicación: Caballito
Carrera: Informática
|
|
|
|
|
Rada
Moderador
Edad: 37
Registrado: 10 Abr 2006
Mensajes: 2728
Ubicación: Caballito
Carrera: Informática
|
|
|
|
|
Dx9
Moderador
Edad: 37
Registrado: 03 Ene 2007
Mensajes: 1552
Carrera: Informática
|
|
|
|
|
Sebastian Santisi
Administrador Técnico
Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451
|
|
¿Soy yo o es un ordenamiento por selección esa garompa?
|
|
|
|
_________________
|
|
|
|
|
Dx9
Moderador
Edad: 37
Registrado: 03 Ene 2007
Mensajes: 1552
Carrera: Informática
|
|
Sebastian Santisi escribió:
|
¿Soy yo o es un ordenamiento por selección esa garompa?
|
si, parece un ordenamiento por el swap, pero no entiendo porque compara
while (p3 MENOR O IGUAL p2) do
hasta donde yo entiendo, compara las direcciones. Y no le veo el sentido, si alguien me lo explica. Listo
|
|
|
|
|
|
|
|
|
todoseapormi
Nivel 9
Edad: 36
Registrado: 18 Mar 2006
Mensajes: 2135
Carrera: Sistemas
|
|
no eso recorre las direcciones hasta llegar al final!
la comparacion se hace en la lina del if!
|
|
|
|
_________________ MLI
|
|
|
|
|
Rada
Moderador
Edad: 37
Registrado: 10 Abr 2006
Mensajes: 2728
Ubicación: Caballito
Carrera: Informática
|
|
|
|
|
Sebastian Santisi
Administrador Técnico
Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451
|
|
Dx9 escribió:
|
si, parece un ordenamiento por el swap, pero no entiendo porque compara
while (p3 MENOR O IGUAL p2) do
hasta donde yo entiendo, compara las direcciones. Y no le veo el sentido, si alguien me lo explica. Listo
|
Mientras que la dirección apuntada por p3 sea menor que la dirección apuntada por p2...
Si querés una traducción con notación de subíndices (y en C, please), basicamente:
Código:
|
void incognita(char *p1, size_t p2)
{
size_t p3;
for(p3 = 1; p3 < p2; p3++)
{
if(p1[0] > p1[p3])
{
swap(p1[0], p1[p3]);
}
}
if(p2 > 1)
incognita(p1 + 1, p2 - 1);
|
Cambié los tipos pero preservé los nombres de variables.
En tu ejemplo original, P1 es un puntero que apunta al principio, p2 es un puntero al final, p3 es un puntero al elemento que estás mirando; mientras que p3 sea menor que p2, si lo apuntado por p3 es más chico que lo apuntado por p1 (comienzo del array), hace un swap; así con cada p3. Después incrementa.
Eso claramente es selección; busca el menor elemento en el rango 0..N y lo pone al principio, después el menor en el rango 1..N, 2..N, etc..
|
|
|
|
_________________
|
|
|
|
|
Dx9
Moderador
Edad: 37
Registrado: 03 Ene 2007
Mensajes: 1552
Carrera: Informática
|
|
Sebastian Santisi escribió:
|
En tu ejemplo original, P1 es un puntero que apunta al principio, p2 es un puntero al final, p3 es un puntero al elemento que estás mirando; mientras que p3 sea menor que p2, si lo apuntado por p3 es más chico que lo apuntado por p1 (comienzo del array), hace un swap; así con cada p3. Después incrementa.
Eso claramente es selección; busca el menor elemento en el rango 0..N y lo pone al principio, después el menor en el rango 1..N, 2..N, etc..
|
claro!!! gracias ss!! y gracias rada!! entre los dos lograron hacerme entender ! (cosa dificil ).
|
|
|
|
|
|
|
|
|
|