• Viernes 26 de Abril de 2024, 23:49

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - thot_ohm

Páginas: [1]
1
Pascal / Valor De Un Puntero
« en: Jueves 5 de Enero de 2006, 20:19 »
Buenas tardes:

Acá de nuevo yo con mis dudas (existenciales jeje).

Tengo una lista doblemente enlazada la cual inicializo así:

Código: Text
  1.  
  2.   Cab := nil;
  3.   Fin := nil;
  4.  
  5.  

Cab y Fin, son los punteros Cabecera y Final que están declarados como una variable tipo PunteroLista y éste tipo tiene esta estructura:

Código: Text
  1.  
  2.   PunteroLista = ^NodoLista;
  3.   NodoLista = record
  4.     Datos : TipoDatos;
  5.     Sig : PunteroLista;
  6.     Ant : PunteroLista;
  7.   end;
  8.  
  9.  

En un momento del código, necesito consultar un dato, cuyo procedimiento es este:

Código: Text
  1.  
  2. procedure ConsultarDato(Info : TipoDatos; var Encontrado : boolean; var Act, Ant : PunteroLista);
  3.  
  4. begin
  5.   Ant := Cab;
  6.   Act := Ant^.sig;
  7.  
  8.   while not (Act^.Datos.Nombre = Info.Nombre) and (Act <> nil) do
  9.   begin
  10.     Ant := Act;
  11.     Act := Act^.sig;
  12.   end;
  13.  
  14.   if (Act^.Datos.Nombre = Info.Nombre) then
  15.     Encontrado := true
  16.   else
  17.     Encontrado := false;
  18. end;
  19.  
  20.  

TipoDatos es un tipo con diferentes campos.

Ok. Fíjense en las dos primeras líneas de éste procedimiento. Ant := Cab copia la información de Cab en la variable Ant, por lo que en la primera pasada Ant debe ser Nil y apuntar a Nil (¿no?). Le puse un watch a esta variable (Ant) y efectivamente, en la primera pasada toma el valor Nil.

En la segunda línea, Act pasa a ser el valor apuntado por Ant^.sig, que, como Ant apunta a Nil, Act debería valer Nil (¿no?), por lo que, en la primera pasada, el while que viene no se ejecutaría.

Pues no. Le puse un watch a la variable Act y ésta no toma el valor Nil y el while se ejecuta dos veces antes de que Act tome el valor Nil. En la primera pasada del while (desde Act := Ant^.sig), Act toma el valor PTR($FF02,$E07), en la segunda pasada toma el valor PTR($6030,$18FC), terminando la segunda pasada (en la instrucción Act := Act^.sig), toma el valor Nil.

¿Qué estoy haciendo mal?

2
C/C++ / Iniciando En C
« en: Miércoles 4 de Enero de 2006, 15:48 »
Buenos días y feliz año!

Estudio Ingeniería de Sistemas en Venezuela. He hecho algún que otro programa en Pascal, con mayor o menor desenvoltura  :blink: . Dentro de un par de semestres, según el plan de estudios, empezarán a exigirnos a programar en C. Cuando empecé a programar en Pascal tuve que aprender muchas cosas en muy poco tiempo, es por eso que quiero tomar previsiones con C para que no me agarren con los pantalones abajo  :o  :huh:  :D .

Pensé en buscar algún manual en Internet (que los hay a patadas), pero, antes de bajar uno u otro me asaltan varias dudas, a lo mejor estúpidas, pero que más vale resolverlas ahora que no cuando tenga que dar marcha atrás por no preguntar.

1.- ¿Cuales son las diferencias entre C, C++, Builder y todo eso?¿Son versiones actualizadas o es algo así como la diferencia entre FreePascal, Pascal o Borland Turbo Pascal?

2.- ¿Cual de estos compiladores es el más recomendable (para buscar los tutoriales específicos)?

3.- Imagino que compilador e interfaz de usuario (donde escribo el código) forman parte de un mismo paquete ¿Hay algún sitio donde se pueda descargar éste paquete?

4.- Adentrándonos ya en el tema ¿Es posible programar para Windows en C o es como Pascal que se limita a DOS?

5.- ¿C o VisualBasic?

Muchas gracias por la ayuda que le puedan prestar a este novatillo y disculpen si pregunté algo demasiado absurdo  :unsure:  :smartass:

3
Pascal / Ordenación Por Inserción
« en: Viernes 30 de Diciembre de 2005, 15:15 »
Buenas.

Para ordenar una lista de punteros mediante el método de inserción, ¿cual sería la estructura apropiada? ¿lista enlazada o lista doblemente enlazada?

Para implementar el método de ordenación por inserción, debemos ser capaces de recorrer la lista en ambos sentidos, ya que compara un elemento L
  • con el anterior L[x-1].


Sé que la respuesta parece obvia y sería más fácil usar una lista doblemente enlazada, lo que pasa es que ya tengo el programa hecho conuna lista enlazada simple y dos procedimientos de ordenación (selección y burbuja) ya implementados y para usar una lista doblemente enlazada debo replantear casi todo el programa  :comp: .

Gracias por su ayuda.

4
Pascal / Re: Ordenacion Por Selección
« en: Sábado 3 de Diciembre de 2005, 21:06 »
Buenas.

Ante todo, como siempre, gracias al que se tome su tiempo en leer y tratar de ayudarme en ésta duda que paso a explicar.

Tengo una lista enlazada creada con punteros cuya estructura es:
Código: Text
  1.  
  2. type
  3.   TipoNombre = String[15];
  4.         TipoClave = string[3];
  5.   TipoSector = String[2];
  6.   TipoHabitantes = integer;
  7.   PunteroLista = ^NodoLista;
  8.         NodoLista = record
  9.     Nombre : TipoNombre;
  10.                 Clave : TipoClave;
  11.                 Sector : TipoSector;
  12.                 Habitantes : TipoHabitantes;
  13.                 Sig : PunteroLista;
  14.         end;
  15.         TipoListaEnlazada = PunteroLista;
  16.  
  17. var
  18.         Lista : TipoListaEnlazada;
  19.  
  20.  
Sé que los campos de datos del puntero los puedo meter en un solo tipo record, pero quise postearlo así, pues para ver si quedaba más claro.

Ok. Creo mi lista y empiezo a meter datos como un degenerado  :comp: . La muestro en pantalla y perfecto, se muestran en orden inverso en el que yo los introduje ya que el procedimiento de inserción lo hace al principio de la lista (deliberadamente).

Seguidamente, se me pide ordenar la lista generada mediante diferentes métodos (inserción, selección, burbuja...). Ahora estoy con el procedimiento de selección y es acá donde tengo el problema. He revisado el código, y hasta donde me llegan mis conocimientos, parece estar bien, pero cuando imprimo la lista después de haber ejecutado el procedure, ésta sigue estando igual de desordenada. Éste es el procedure:

Código: Text
  1.  
  2. procedure Seleccion (var Lista : TipoListaEnlazada);
  3.  
  4. var
  5.   Ref, Next : PunteroLista;
  6.  
  7. begin
  8.   if not ListaVacia(Lista) then
  9.   begin
  10.     Ref := Lista;
  11.     repeat
  12.       Next := Ref^.Sig;
  13.       while Next <> nil do
  14.       begin
  15.         if Ref^.Nombre > Next^.Nombre then Cambiar(Ref, Next);
  16.         Next := Next^.Sig;
  17.       end;
  18.       Ref := Ref^.Sig;
  19.     until Ref = nil;
  20.   end
  21.   else
  22.   begin
  23.     writeln ('La lista esta vac¡a. No hay elementos para ordenar');
  24.     readln;
  25.   end;
  26. end;
  27.  
  28.  

El procedure Cambiar es este:

Código: Text
  1.  
  2. procedure Cambiar (var Mayor, Menor : PunteroLista);
  3.  
  4. var
  5.   Aux : PunteroLista;
  6. begin
  7.   new(Aux);
  8.   Aux^.Sig := Mayor^.Sig;
  9.   Mayor^.Sig := Menor^.Sig;
  10.   Menor^.Sig := Aux^.Sig;
  11.   dispose(Aux);
  12. end;
  13.  
  14.  

El campo clave para ordenar, como puede verse, es el nombre de la ciudad. Yo estoy haciendo las comparaciones directas ya que leí por ahí que pascal reconoce a>b o luis<diana.

No sé si estoy pasando bien la lista por valor (si es que esto se puede) o es que debo crear una nueva lista con los nuevos valores ordenados (cosa que me parece que carece de valor), o no estoy haciendo correctamente el intercambio de los nodos en el procedimiento Cambiar.

Estoy nuevo en esto de los punteros y estoy bastante enredado. El procedimiento Selección está adaptado de un procedimiento de ordenación por selección creado para arrays unidimensionales y aunque ustedes probablemente lo vean fácil, a mi me costó bastante debido a mi inexperiencia y debido a ella, no me extrañaría que tuviera algo malo  :rolleyes: .

Bueno, creo que eso es. Gracias, de nuevo, a todos por su atención y perdón por el ladrillito.

5
Pascal / Depuración De Código
« en: Martes 8 de Noviembre de 2005, 20:07 »
Buenas.

Tengo un programa ya codificado y casi, totalmente funcional (lo del casi, lo extiendo más tarde). Adjunto el código para que lo consulte quien lo deseé.

En éste programa, hay varios procedmientos (AbreArchivoX, GuardaArchivoX), que hacen prácticamente lo mismo. He intentado poner éstos procedimientos en uno sólo, pero estoy un poco verde en lo que se refiere a pasar variables (o constantes) por valor o por referencia. Intuyo que, por ejemplo, en el caso de AbrirArchivo, podría implementar un único procedimiento en el cual me puedo llevar, cuando lo llamo, la ruta del archivo que necesito abrir como un string, pero a la hora de asignar éste string a la variable tipo file, sí necesito procedimientos separados, a no ser que use una estructura case (o un if anidado), lo que me parece poco eficiente. Sugiéranme una línea de acción para tener menos procedimientos en el programa.

También tengo muchas variables globales. Quisiera usarlas localmente, pero tengo un poco de miedo de hacerlo ya que no manejo muy bien los conceptos de pasar variables por valor o por referencia. Si alguno de ustedes me puede dar una rápida explicación se lo agradecería.

Por último, fíjense en el procedimiento DeterminarCiudad, ya que debo tener algún error que se me escapa, ya que a la hora de que me diga cual es la ciudad elegida para construir el hospital no me escribe nada. Creo que los cálculos hechos en el array de las distancias están correctos, pero como digo, no imprime el nombre de la ciudad. Seguro es una estupidez, pero no termino de verla.

Gracias a todos por tomarse parte de su valioso tiempo en ayudar a este "Perdido en Pascal".

Saludos.

6
Pascal / Ordenación Alfabética De Un Archivo
« en: Lunes 27 de Junio de 2005, 23:34 »
Hola de nuevo:

Enko, amablemente (y eficientemente), me ha ayudado en el desarrollo de éste código. Cuando pensaba que ya no iba a necesitar más ayuda y que ya era todo un experto B)  :comp: , se me presentó otro problema :blink:  :whistling: . Me explico:

El código lee unas entradas por teclado, las guarda en un archivo y luego debe mostrar por pantalla algunos de los registros guardados (en base a ciertos criterios) y ordenarlos alfabéticamente por el nombre.

Ok. La parte de mostrar los que cumplen ciertos criterios está lista, no hay problema en eso. Ahora, lo de ordenar alfabéticamente, me ha enredado la vida. Tuve la idea de vaciar inicialmente el resultado de la lectura en base a ciertos criterios (filtro) en un array bidimensional  :blink:  y luego aplicar un algoritmo de ordenación que encontré posteado en este mismo foro (siempre el bueno de Enko).

Confieso que lo del array bidimensional lo conozco en la teoría, mas no en la práctica. Puedo intuir y creo saber como manejarlo  :unsure: .  Ahora bien, ¿Es ésta la mejor técnica?

Por otro lado me vuelvo un ocho intentando aplicar el algoritmo de Enko a ésta teoría.

Help me please!!

Adjunto el archivo .pas con mi código y el código copiado de éste mismo foro (gracias Enko).

Código: Text
  1.  
  2. program DemoOrd;
  3.  
  4. uses CRT;
  5.  
  6. var
  7.   {Variables para la primera parte del demo}
  8.   PosLetra          : integer;
  9.   {para la segunda parte del demo}
  10.   Palabra1,Palabra2 : string;
  11.   Ord1, Ord2        : integer;
  12.  
  13.  
  14. begin
  15.    ClrScr;
  16.    PosLetra := Ord('a');
  17.    WriteLn(PosLetra);
  18.    PosLetra := Ord('z');
  19.    WriteLn(PosLetra);
  20.    ReadKey;
  21.   ClrScr;
  22.  
  23.   {Fin Primera Parte del Demo}
  24.  
  25.   Write('Ingese una palabra cualquiera: ');
  26.   ReadLn(Palabra1);
  27.   Write('Ingese una palabra cualquiera que empieze con una letra distinta: ');
  28.   ReadLn(Palabra2);
  29.   Ord1 := Ord(Palabra1[1]); {Seria la primera letra de la palabra}
  30.   Ord2 := Ord(Palabra2[1]); {Seria la primera letra de la segunda palabra}
  31.   WriteLn('A continuacion se escribiran las palabras ordenadas alfabeticamente');
  32.   WriteLn('');
  33.   WriteLn('Presione una tecla');
  34.   ClrScr;
  35.  
  36.   if Ord1 &#60; Ord2 then
  37.      begin
  38.         WriteLn(Palabra1);
  39.         WriteLn(Palabra2);
  40.      end
  41.   else if Ord2 &#60; Ord1 then
  42.      begin
  43.         WriteLn(Palabra2);
  44.         WriteLn(Palabra1);
  45.      end
  46.   else if Ord1 = Ord2 then
  47.      begin
  48.         Writeln('Se suponia que tenian que empezar con letras distintas');
  49.      end;
  50.   readkey;
  51. end.
  52.  
  53.  

7
Pascal / Archivos
« en: Jueves 16 de Junio de 2005, 00:18 »
De nuevo yo trancado en éste bendito programa!!!

Ya tengo listas mis rutinas para leer y almacenar datos.

Ahora estoy intentando crear una rutina que me muestre los datos que están en el archivo por pantalla (tengo que hacer que salgan en orden alfabético y que cumplan ciertos parámetros, pero vayamos por partes). Hice esta rutina:

Código: Text
  1.  
  2. procedure mostrararchivo; {Muestra los datos almacenados en el archivo}
  3.   var
  4.     c,l: integer;
  5.  
  6.   begin
  7.   abrearchivo;
  8.   l:= 5;
  9.   with Datos do
  10.     begin
  11.     while not (Eof (Archivo)) do
  12.       begin
  13.       ClrScr;
  14.       read (Archivo,Datos);
  15.       c:= 5;
  16.       gotoxy(c,l);
  17.       write ('Nombre: ');
  18.       write (nombre);
  19.       c:= c + 20;
  20.       gotoxy(c,l);
  21.       write ('Edad: ');
  22.       write (edad);
  23.       c:= c + 8;
  24.       gotoxy(c,l);
  25.       write ('Grado: ');
  26.       write (grado);
  27.       c:= c + 10;
  28.       gotoxy(c,l);
  29.       write ('Promedio: ');
  30.       write (prom :0 :2);
  31.       c:= c + 15;
  32.       l:= l + 1;
  33.       end
  34.     end;
  35.   close (archivo);
  36.   readln;
  37.   end;
  38.  
  39.  

Datos es una variable donde guardo los datos almacenados en el archivo (adjunto el archivo .pas completo para quien le quiera echar un vistazo).

Ahora bien, ésta rutina, aparentemente no hace nada porque no me muestra nada en pantalla.

Las dudas:

Está bien estructurada la rutina?
Será que no estoy guardando adecuadamente en el archivo?

Agradecido de antemano por la ayuda.

8
Pascal / Calcular Promedio
« en: Martes 14 de Junio de 2005, 16:01 »
Hola de nuevo.

Siguiendo con el desarrollo del programa, tengo que calcular el promedio de unas notas. En las especificaciones que me dieron en la Universidad me dicen que se recomienda que no sean mayor a 7 notas. De todas maneras yo quiero hacer que calcule el promedio de n notas (por hacer el programa más flexible).

Para seguir con el planteamiento del problema acá está el código que hice:

Código: Text
  1.  
  2. var
  3.     i: byte;
  4.     key: char;
  5.     Notas: Array[1..10] of real;
  6.     SumNotas: real;
  7.   begin
  8.   i:= 0;
  9.   repeat
  10.     i:= i + 1;
  11.     write ('Intoduzca la nota: ');
  12.     readln (Notas[i]);
  13.     SumNotas:= SumNotas + Notas[i];
  14.     write ('¨Desea introducir otra nota? (s/n): ');
  15.     readln (key);
  16.     if i = 10 then write ('Ya se tienen 10 notas del alumno');
  17.   until (key = 'n') or (key = 'N') or (i = 10);
  18.   Datos.Prom:= SumNotas / i;
  19.   write ('El promedio es ', Datos.Prom);
  20.   readln;
  21.   end;
  22.  
  23.  

Datos.Prom es una variable declarada en la cabecera del programa (este código es nada más el procedimiento en discusión).

Inicialmente, había hecho
Código: Text
  1.  
  2. Notas: Array[1..n] of real;
  3.  
  4.  
Pero cuando compilo me da un error que la variable es demasiado larga (¿?). Le dí una longitud al arreglo de 10 para no estancarme ahí y seguir con el procedimiento.

Yo sé que se puede hacer
Código: Text
  1.  
  2. NOtas: Array[1..MaxNotas] of real;
  3.  
  4.  
Donde MaxNotas es una constante con un valor "x".

Mi pregunta es: ¿Puedo darle al arreglo una longitud declarada por una variable? Es decir ¿Puede el arreglo tener una longitud variable?

Otra cosa: Cuando muestro el promedio por pantalla aparece en notación científica. ¿Como se hace para especificar el número de decimales que queremos que aparezcan?

Gracias por la ayuda.

9
Pascal / Calcular Edad A Partir De Fechas.
« en: Jueves 9 de Junio de 2005, 15:31 »
Hola a todos.

Estoy iniciandome en el mundo de la programación, por lo que espero que no se rían mucho si pregunto algo que ya esté trillado.  :unsure:

En la universidad me pidieron hacer un programa (en Pascal), que entre otras cosas, necesita calcular la edad de una persona a partir de la fecha de nacimiento. Intuitivamente: edad:= fechaactual - fechanacimiento (digo yo...  &lt;_&lt; ). Confieso mi total fracaso a la hora de diseñar una rutina que haga esto. Estoy seguro que debe haber una rutina "estandar" que ejecute esta acción.

Pueden ayudarme a conseguirla??

Por otro lado ¿hay que declarar algún tipo de dato para que el computador lea la fecha adecuadmente?

De antemano gracias por recibir en el grupo a este aprendiz de programador.

Mil gracias!!!

Páginas: [1]