Bienvenidos a un nuevo curso. Ahora estoy en el ciclo de grado superior: Desarrollo de aplicaciones multiplataforma. Y voy a ser parte del experimento de la formación dual. Estaré haciendo practicas durante un año, y a la vez finalizando la formación.

Deseadme suerte.

Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas
Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas

miércoles, 17 de agosto de 2016

Post request Curl

0

Como enviar un post con un pedido xml con PrestaShop.
Aquí os dejo un ejemplo que me han dejado en las prácticas, muy útil!

<?php
$service_url = 'http://example.com/api/conversations';
$curl = curl_init($service_url);
$input_xml = '    <Pedido>
       <Version> 2.0 </Version>
           <Linea>
           <Producto>
           <Referencia>1245</Referencia>
           <Cantidad>2</Cantidad>
           </Producto>
           <Comentarios>
           <Email>email@blogger.es</Email>
           </Comentarios>
           </Linea>
                </Pedido>';
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $input_xml);
$curl_response = curl_exec($curl);
if ($curl_response === false)
{
    $info = curl_getinfo($curl);
    curl_close($curl);
    die('error occured during curl exec. Additioanl info: ' . var_export($info));
}
curl_close($curl);
$decoded = json_decode($curl_response);
if (isset($decoded->response->status) && $decoded->response->status == 'ERROR')
{
    die('error occured: ' . $decoded->response->errormessage);
}
echo 'response ok!';
var_export($decoded->response);

jueves, 12 de febrero de 2015

Tema 8c 2

0

TADs génericos y algoritmos genéricos
Se puede definir TADs genéricos (o tipos parametrizados) con algunas caracteristicas indefinidas.
Estas caracteristicas pueden ser concretadas posteriormente de diversas formas según las necesidades, obteniendo ejemplares de TADs concretos distintos.
Un algoritmo se denomina genérico si manipula TADs genéricos.
La genericidad facilita la reutilización de algoritmos. Por ejemplo, si se implementa un algoritmo de ordenación de vectores, los tipos de datos de los índices y de los elementos del vector no afectan al algoritmo, siempre y cuando se disponga de una función de orden que diga si un elemeno es mayor que otro.

Módulo de declaración ordenación_g.ads
generic
     type ind is (<>); //cualquier tipo discreto
     type elem is private; //cualquier tipo
     type vector is array (ind range <>) of elem;
     with function ">" (a,b: elem) return boolean;
package ordenacion_g is
     procedure ordena (v: in out vector);
end; //del módulo de declaración

Módulo de implementación ordenacion_g.adb
package body ordenation_g is
     procedure ordena (v: in out vector) is
           i,j:ind, m, t: elem, n:intenger;
      begin
          --inicialización
          i:=v'first;
          j:=v'last;
          n:=ind'pos(i)
          n=n+ind'pos(j);
Ha decidido que no era importante los atributos, si no de entender que puedo jugar con los elementos ¿?

Uso desde un programa de un ejemplar concreto de vector
witch ordenacion_g;
procedure mi_programa is
     type color is (rojo, azul, gris);
     type dia is (lu, ma, mi, ju, vi, sa, do);
     type vect is array (day range <>) of color;
     x:vect(ma..vi):=(gris, azul, rojo, gris);
     package o is new ordenacion_g(dia, color, vect, ">");
begin
     ...
     o.ordena(x);
     ...
end mi_programa;

¿Qué gano además con los TADs y la modularidad?
Pues oculto totalmente cómo se representa la información y cómo se implementan los algoritmos.
Podría cambiar en el futuro ambas cosas, y mientras mantenga la interfaz, el usuario del módulo ni lo notará.
De esta manera, podría hacer una versión rápida que funcionara, y después hacer versiones sucesivas que fueran refinando y mejorando las anteriores, especialmente en cuanto a eficiencia, funcionalidad o capacidades.

ejemplo: una pila
Por ejemplo supongamos que tengo un problema para el que necesito una pila, y me urge tener una pila disponible para hacer pruebas, porque lo importante es probar el problema en sí mismo.
De hecho, el problema lo va a resolver otra persona, a mí me encargan que tenga cuanto antes una pila operativa... Y yo no sé ni lo que es un puntero.

Pila: la interfaz
Lo más importante es que yo tenga claro lo que es una pila, aunque no tenga muy claro cómo implementarla, y que el que la va a usar también lo tenga claro (la implementación a él le da igual completamente, a mí no). Y que lo que él va a usar es exactamente lo mismo que yo voy a implementar.
Es decir, hace falta definir antes de empezar a trabajar cada uno por su lado, qué operaciones va a haber, qué atributos van a tener, de qué tipo, en qué orden y qué hace exactamente cada operacioón y en que condiciones funciona.
Podrían ser las siguientes:
- creaPila: -> pila
- apilar: pila elemento -> pila
- parcial desapilar: pila -> pila
- parcial cima: pila -> elemento
- esVacia: pila -> booleano

Especificación formal
especificación pila
     usa booleanos
     parámetro formal
          genérico elemento
     genérico pila
     operaciones
          creaPila: -> pila
          apilar: pila elemento -> pila
          parcial desapilar: pila -> pila
          parcial cima: pila -> elemento
          esVacia: pila -> booleano
dominios de definición     p:pila, e: elemento
          desapilar(apliar(p,e))
          cima(apilar(p,e))
ecuaciones      p:pila, e:elemento
          desapilar(apilar(p,e))=e
          cima(apliar(p,e))=e
          esVacia(crearPila)=verdad
          esVacia(apilar8p,e))=falso
fin especificación

Implementación estática
Mientras pienso en cómo dar una solución definitiva al problema que tengo entre manos (y mientras me estudio cómo funcionan los punteros en el lenguaje de programación en el que tengo que hacer el desarrollo), lo que voy a hacer en montar algo que funcione, aunque sea una solución de andar por casa, ya que total, nadie sabrá jamás que he hecho eso, y mi jefe estará contento porque el otro programador tendrá en dos horas una pila operativa para poder hacer pruebas sobre ella.
Así que sin más puedo simular  una pila con un vector con espacio para un número max de elementos, y un contador cima que me dice hasta dónde lo he llenado.

Implementación dinámica
Luego con tranquilidad, cuando ya domino los punteros, desarrollo en los días siguientes una pila "de verdad".
Sin más que mantener la interfaz, el otro programador ni se enterará del cambio.
Esta pila por supuesto tendrá sus nodos y sus punteros al nodo siguiente, y todo lo que yo estime necesario.
Si en el futuro quiero mejorar alguna función o procedimiento, hacien do una nueva versión mejorada de la pila, siempre y cuando mantenga la interfaz, podré hacerlo sin ningún problema, sin que el otro programador tenga que modificar ni una línea, y sin que ni siquiera se llegue a enterar del cambio, ya que él no apreciará diferencia algna (salvo posiblemente en capacidad o eficiencia).

miércoles, 11 de febrero de 2015

Tema 8c Tipos abstractos de datos

0

(continuación de EDD con una visión desde Ada)

Concepto de abstracción
El concepto de abstracción en el proceso de compresión de un problema, lleva consigo el destacar los detalles importantes e ignorar los irrelevantes.
La abstracción es usada constantemente a la hora de programar.
Un claro ejemplo de ello es el uso de funciones y procedimientos. Ambos, ocultan los detalles sobre cómo se consigue el resultado que ofrecen y desde fuera son vistos como lo que hacen y no el cómo lo consiguen  hacer.
La abstracción siempre lleva asociada la ocultación de información.
Se separa el QUÉ del CÓMO
O dicho de otro modo, se separa la especificación (el qué) de la implementación (el cómo).

Abstracción de acciones
El uso de procedimientos y funciones nos `permite abstraernos de las instrucciones que realmente se están ejecutando para conseguir los resultados que obtenemos.
Tenemos una acción (en el caso de procedimientos) o valor (en el caso de funciones) virtual parametrizada.
Se está ocultando información: los datos locales y la secuencia de instrucciones del subprograma,
Recordemos, se separa la especificación (el que: hace la función o el procedimiento) de la implementación (el cómo: las instrucciones concretas que lo hacen).

¿Abstracción de datos?
¿Podemos hacer lo mismo que hacemos con las acciones de un programa, pero aplicado a los datos?
Es decir, ¿Podemos separar especificación de implementación?
Claro, jde eso va este tema. Si no, ¿para qué tanto rollo?
Al igual que para acciones tenemos los procedimientos, para expresiones las funciones, para datos tenemos los Tipos Abstractos de Datos.

Tipo Abstracto de Dato (TAD)
Un TAD es una colección de valores y de operaciones definidos mediante una especificación independiente de cualquier representación.
La programación con TADs requiere dos pasos:
- Definición del tipo: Establecer los valores que puede tomar el tipo y las operaciones necesarias para manipular los valores y especificar su interfaz. Esto tiene dos partes:
     * Parte sintáctica: cómo se llama la operación, si es una función o un procedimiento, qué parámetros tiene, en qué orden y de que tipo.
     * Parte semántica: qué hace la operación con los parámetros de entrada, cómo modifica los de salida y qué devuelve (si se trata de una función). En otras palabras, para qué sirve esa operación y cuál es su comportamiento.
- implementación del tipo: Elegir la representación de los valores e implementar las operaciones.

Encapsulación
El concepto fundamental subyacente bajo la programación con TADs es la encapsulación.
La encapsulación consiste básicamente en:
- La privacidad de la representación (el usuario no conoce los detalles del tipo)
- La protección del tipo (el usuario sólo puede utilizar las operaciones previstas).

Diseño modular
La programación en gran escala exige la participación del código en módulos.
Un módulo es una unidad del programa que puede ser desarrollada independientemente del resto.
La descomposición  en módulos debe cumplir unos requisitos:
- Que cada módulo tenga una conexión mínima con el resto: la interfaz.
- Que la mayor parte de los cambios del programa afecten sólo a un número pequeño de módulos.
- Que el tamaño de cada módulo sea adecuado (si es muy grande es dificil hacer cambios, si es muy pequeño es costoso por los trabajos adicionales de especificación, documentación, control de versiones, ...).
Un TAD puede encapsularse en un módulo:
- La interfaz es reducida: El nombre del tipo y los encabezamientos de las operaciones.
- Puede cambiarse la implementación independientemente (para mejorarla por ejemplo), siempre y cuando mantengamos la interfaz.
- El tamaño del módulo suele ser suficientemente grande (implementación de las operaciones).

TADs como base del diseño modular
El uso de procedimientos y funciones (diseño descendente)  facilita la programación a pequeña escala (programas pequeños).
Sin embargo esto es insuficiente para la programación a gran escala. Es necesario utilizar el diseño modular.
programas = datos + algoritmos
programas = datos + (algoritmos de datos + algoritmos de control)
programas = (datos + algoritmos de datos) + algoritmos de control
programas = TADs + algoritmos de control
Hasta ahora conocíamos la forma de abstraer algoritmos (mediante funciones y procedimientos que podemos agrupar en módulos). Ahora conocemos la forma de abstraer datos (mediantes TADs que también pueden constituir módulos).


Punteros Ada

0

Punteros en Ada
type celda;
type enlace is access celda;
type celda is
            record
                        valor:intenger;
                        siguiente:enlace;
            end record;
e:enlace;

e:=new celda;
e.valor:=13;

e:=new celda'(13, null);
e:=new celda'(7,e); (dibujo)

e,f:enlace;

f:=new celda'(13, null);
e:=f;

f:=new celda'(13, null);
e:=new celda;

e.all:=f.all;

Liberación de memoria de datos inaccesibles: suele proporcionarla la implementación.
También puede hacerlo el programador:

witch unchecked_dealloacation;

produce disponer is new
            uncheked_dealocation(celda, enlace);

e:enlace;
...
disponible(e);

Modulo de declaración

conjuntos.ads > expecificación
package conjuntos is
            type conjcar is private;      //limitado
            procedure vacio (A:out conjcar);
            function esVacio (A: in conjcar)
                        return boolean;
            procedure poner (c:in character;
                        A:in out conjcar);
            ...
            private
            type elementos is array .....
            package ....
            ¿?¿? // recordar que os sube el pdf. No he sabido tomar los apuntes correctamente de este apartado.
           
Algoritmos genéricos
Tipos como parámetros
generic
            type item is private;
procedure conjear (x,y:in out item);
produce canjear (x, y:in out item) is
            aux:item;
begin
            aux:=x;
            x:=y;
            y:=aux;
end;

permite reutilizar el software

....

Otras especificaciones de tipos genéricos:
type t is private; > tipo
type t is limited private;


Hoy esta yendo muy rápido para pillar apuntes... :(

jueves, 5 de febrero de 2015

Sintaxis en Ada 2

0

Vectores
Definiciones restringidas
type t1 is array (1..10) of boolean; //tipo t1 es un vector de 10 posiciones de booleanos;
type t2 is array (dia) of t1; //el vector t2 es un vector de las posiciones de lunes a sabado que componen valores contenidos en el t1;
type t3 is array (lunes..jueves, -10..14) of t1; //es como trabajar con una matriz;
x:t1; y:t2; z:t3; // esto es la declaración de las variables después del tipo;

x(i+j)
y (martes)
y(martes)(i+j)
z(martes, i+j)

x(5..8)
y(martes..viernes)

Definiciones no restringidas
type matriz is array (positive range <>, positive range <>) of real;

function "+" (a,b:matriz) return matriz is begin....¿?¿

Atributos relacionados con los índices
function "+" (a, b:matriz) return matriz is suma: matriz (a'range(1), a'range(2));
begin
     for i in a'range(1) loop
          for j in a'range(2) loop
               suma (i, j) := ...¿?¿?

Constantes de tipos vectoriales
m1:=((1..3=>1.0), (1=>2.0, 2=>3.0,3=>4.0));
m2:=mat23' (1=>(1=>1.0, others=>0.0), 2=>(2=>1.0, others=>0.0));

¡Atención 'others' exige límites conocidos!

Tipo no restringido predefinido: string
type string is array (positiverange <>) of character;

x0: string(1..8);
subtype s1 is string (2..8);
subtype linea is string (1..80);
x1:s1;
l: linea;

1(3..10):=x0;
1(2..4=:=x0 (4..6);
1(1..8):=x0 (1..4) & "A" & x1 (2..4);

Las constantes de tipo cadena se escriben entre comillas.
¡Ojo! ¡x0 es una cadena de caracteres de longitud exactamente 8!

Tipos compuestos:Registros
Registros
type nombre_mes is (ene, feb, marm abr, may, jun, jul, ago, sep, oct, nov, dic);

type fecha is record...¿?¿?

Un registro no puede tener campos de tipo vector no restringido
Hay otras formas de definir tipos registro, por ejemplo, incluyendo partes variantes (ver bibliografía)



Lo siento, hoy llegue muy tarde y no pille los apuntes muy bien. Pero ayer subí el pdf con toda la información que tengo de Ada en la documentación de la segunda evaluación. Así que ya sabes, estudia mucho ;)

miércoles, 4 de febrero de 2015

Sintaxis de Ada

0

recuerda:
texto_io > es entrada y salida de caracteres
integer_text_io > es entrada y salida de caracteres numéricos enteros.

Ada tiene 69 palabras reservadas que tu no puedes utilizar para nombrar ninguna variable.

Delimitadores simples:
& >
' >
( >
) >
* >
+ >
- >
. >
: >
; >
< >
= >
> >
| > 

Tipos escalares
pi: constant float:=3.1415; > inicializo una constante pi con valor inicial de 3.1416.
final: constant charactere:='.'; > inicializo una constante final con valor inicial de '.'
i, j, k: integer; > i, j, k son números enteros.

Ada es fuertemente tipado, no se puede asignar valor a una variable de un tipo diferente.
type intenger is-; --predefinido

Subtipos
Sirve para caracterizar un subconjunto de los valores de un tipo.
NO constituye un nuevo tipo (la asignación está permitida)

Tipos definidos por enumeración
Hay dos predefinidos (booleanos y caracteres)
type día is (lunes, martes, miercoles, jueves, viernes, sabado, domingo);
subtype laborable is dia range lunes....viernes;
d1: dia; d2: laborable;

Atributos
dia 'first=lunes // el primero
dia ' last=domingo // el último
dia ' succ (lunes)=martes // el sucesor (siguiente)
dia 'pred(martes)=lunes // el predecesor (anterior)
dia 'pos(lunes)=0 // posición
dia 'val(1)=martes // valor
dia ' image(lunes)="LUNES" //convertir a cadena de texto
dia 'value ("martes")=martes // convertir una cadena de texto al tipo definido

Tipo booleano
type boolean is (false, true);
a, b, c, d:boolean;
((not a) and b) or (c xor d)

or     t     f
t       t     t
f       t     f

xor   t     f
t       f     t
f       t     f

Tipos escalares
Tipos enteros
Hay algunos predefinidos:
type interger is ... ;    //enteros
type short_integer is ...; // enteros cortos
type long_intenger is ...; // enteros largos
subtype natural is intenger range 0.. intenger' last; // desde el 0 adelante
subtype positivo is intenger range 1..intenger 'last; // desde el 1 adelante

¿?¿?

Prioridades:
and, or, xor
not
=, /=, <, <=, >, >=, in, not in
+, -      (binarios)
....

Tipos reales
type mis_reales is digits 7;
No se admite aritmética mixta:
n:integer; x:float;

n+x      //¡incorrecto!

float (n) +x
n+integer (x) // ambos correctos!!

La conversión de real a entero efectúa redondeo.

Estructuras de control
if...then
...
end if;

if...then
...
else
...
end if;

if ....then
....
elsif...then
...
elsif...then
...
else
....
end if;

case...is...    
when .... => .... // 1 opción 
when ....|...|... => ... // varias opciones
when ... . . ... => ... // con rango
when ... => NULL; //nulo
when others => ... //por defecto
end case;

Instrucciones iterativas
while...loop
...
end loop;

for d in dia loop ... end loop;

for d in lunes.. viernes loop
...
end loop;

for d in reverse lunes. . viernes loop
...
end loop;

loop
...
end loop;

loop
...; 
exit;
...;
end loop;

lopp
...
exit when ...;
...
end loop;

Estructuración del control: subalgoritmos (1...)
Procedimientos y funciones
Paso de parámetros:
in (entrada), out(salida), in out(entrada y salida).
Ada por defecto todos sera solo de entrada.

produce toto(x:T1; y: in out T2) is
...
end toto;

toto(e,z);      --llamada normal
toto (y=>z, x=>e);     --llamada nombrada

funciones
function factorial (n:natural) 
     return natural is
begin
     if n in 0..1
         then return 1;
         else return n*factorial (n-1);
     end if;
end factorial;

Existe sobrecarga, puedo llamar a 7 funciones de la misma manera (suma de coches, suma de motos...) el compilador por el contexto de los operandos(enteros, reales, vectores...) que estoy usando me sabrá distinguir a que función me estoy refiriendo. 
Es decir, el significado se distingue por el contexto.
No se pueden modificar la aridad ni la sintaxis de llamada (prefija o infija).

Ada no distingue entre mayúsculas y minúsculas.

En Ada las funciones y podrecimientos deben estar en funciones y procedimientos. En C tenias 3 funciones y el orden de llamada era indistinta. En Ada hay jerarquía, Y el orden importa...

martes, 3 de febrero de 2015

Ada

0

Características generales (1...)
Lenguaje de propósito general
Profesional (complejo: no pensado para aprendices)
Incorporación de puntos clave de la tecnología de programación:
- Legibilidad: Evita notación demasiado concisa (es más costoso el mantenimiento que la producción de software: "un programa se lee más veces de las que se escribe")
- Fuertemente y estáticamente tipado: Gran cantidad para definir datos de tipos diferentes. Cada dato puede usarse solo en operaciones especificas de su tipo. La utilización inadecuada se detecta en tiempo de compilación.
- Diseño a gran escala: Programación modular. Mecanismos de encapsulación. Compilación separada.
- Abstracción de datos: Separación clara entre especificación y representación e implementación.
- Modulos génericos: Creación ¿¿¿
- Programas concurrente: Descripción de procesos que pueden ejecutarse concurrentemente. Definición de operaciones de sincronización entre esos procesos.
Manejo de excepciones: Definición de comportamientos de recuperación ante situaciones de error no previstas.

Bibliografía fundamental
...

Escribir en Ada
El fichero debe terminar en > .abd
';' >  para finalizar una orden.
>> no hay llaves.
'--' > es un comentario.
witch > incluye paquetes.
ada.txt_io > Caracteres
Ada. intengeur ¿¿> Enteros
procedure ...  is > procedimiento principal
use > hace referencia de paquetes
begin >  comienzo del programa
put (" ") > para cadenas de caracteres.
get (" ") > para capturar un caracter.
constant: declaración de variables.
while   loop / end loop > mientras...haz
if then /end if > Sí... entonces
'/=' > distinto de
':=' > asignar
'=' > comparar

Compilar Ada
Para compilarlo debes introducirte en la terminal de ubuntu:
sudo apt-get update
sudo apt-get install gnat-4.6
Una vez instalado
Para crear el documento gedit nombre del documento e '&'
Para compilar gnatmake junto al nombre del documento (sin la extensión)

Para ejecutarlo './' junto al nombre del documento (sin la extensión)

jueves, 29 de enero de 2015

Árboles

0

Introducción a los árboles
Un árbol es una de las EDD más utilizadas para resolver multitud de problemas (y muy utilizada también en juegos).
En una EDD no lineal.
Un árbol se define recursivamente así: o es vacío o consiste en un nodo que contiene datos y punteros hacia otros árboles.

Idea gráfica del concepto de árbol (imagen)
Conceptos asociados:
raíz
Hoja
Ascendiente
Descendiente
Hermano
Padre
Hijo

Un caso concreto: árbol binario
Cada nodo tiene como máximo dos hijos.
Esto hace que la implementación sea más sencilla (cada nodo incluye dos punteros para apuntar a cada uno de los hijos, el izquierdo y el derecho):
struct nodo{
     struct info elemento;
     struct nodo *izq;
     sruct nodo *dcha;
};
struct nodo *arbol;

Implementación de un árbol general
Un árbol en general no tiene limitados el número de hijos que puede tener cada nodo, y por tanto no puedo establecer a priori un número de punteros en la estructura para apuntar a los hijos.
Una posible forma de hacerlo, sería teniendo una lista de punteros a los hijos almacenada en cada nodo, junto con la información que guarda el nodo. Es decir, para implementar un árbol general, haríamos uso de otra EDD.

Operaciones habituales con árboles
Insección
Eliminación
Búsqueda
Recorrido:
- Inorden: primero se recorre el subárbol izquierdo, luego se lee el valor de nodo y finalmente se recorre el subárbol derecho.
- Preorden: primero se lee el valor del nodo y después se recorren los subárboles.
- Postorden: se recorren primero el subárbol izquierdo y el derecho y después se lee el valor del nodo.

Aplicación de los árboles
Se utilizan en problemas que involucran jerarquía (por ejemplo, miembros de una familia), ramificación (como los árboles de juegos, que involucran tomar la mejor decisión de las posibles, tras analizar todas las consecuencias), clasificación y búsqueda eficiente.


miércoles, 21 de enero de 2015

Colas

0

Colas
Tipo especial de lista en la que las eliminaciones se realizan al principio y las insercciones al final.
El concepto es muy similiar al de una cola delante de una ventanilla: quien llega se pone el último y el siguiente a ser atendido es el primero. Cada uno es atendido cuando le llega su turno.
La cola es una estructura FIFO (First In, First Out): el primero en llegar es el primero en salir.

Funcionamiento de una cola (dibujo)

Operaciones sobre una cola
Cuatro operaciones posibles:
- Inicializar
- Comprobar si está vacía
- Meter
- Sacar
- implementación: Como una lista pero restringiendo las operaciones posibles. No obstante, es mejor emplear dos punteros (uno al primcipio y otro al final):

struct cola{
     struct nodo *principio;
     struct nodo *final;
}

Aplicaciones de las colas
Simulaciones: Modelar un sistema real mediante un prograna de ordenador, simplificando las cosas, con el fin de obtener datos acererca de su comportamiento. Por ejemplo, simular una oficina con dos ventanillas para obtener el tiempo de espera en cada ventanilla.
Servicio de impresión: Cuando tenemos una impresora y varios usuarios, lo mejor es poner una cola de impresión para que se vayan recibiendo los trabajos que cada usuario quiere imprimir. Se servirán en orden de llegada.
Procesis en espera para ser ejecutados: Los sistemas operativos también hacen uso de colas para colocar en ellas a los procesos que esperan algo, por ejemplo, su turno para ser ejecutados.
Clientes a los que servir un trozo de fichero de servicios P2P: El emule (y similares) también encola a cada cliente que quiere un fichero de cada una de las máquinas en las que se sirve. Tanto en este caso como en el anterior, en ocasiones se usan prioridades en las colas, que permiten que ciertos elementos avancen más rápido que otros.

Copiar listas (en general)
Está claro que no podemos hacer esto:
     struct nodo *lista;
     struct nodo *otra;
     ...
     otra=lista;
Ya que cualquier cambio que hiciésemos en lista se haría en otra y viceversa.

Si hacemos esto estaríamos sin más copiando un puntero en otro.

Copiar listas: forma correcta
void copiatLista (struct nodo **dst, struct nodo *fnt){
     struct nodo *e, *tmp, *anterior;
     tmp=fnt;
     *dst=(struct nodo *) malloc (sizeof(struct nodo));
     e=*dst;
     anterior=NULL;
     while (tmp!=NULL){
          e->elemento=tmp->elemento;
          e->siguiente=(struct nodo *) malloc (sizeof(struct nodo));
          anterior=e;
          e=e->siguiente;
          tmp=tmp->siguiente;
     }
      free(e);
      if (anterior!=NULL){
          anterior->siguiente=NULL;
      }
       else{
          *dst=NULL;
       }
}

Pilas

0

Particularizaciones de la EDD lista
Hay dos casos especiales de listas que vamos a estudiar con más detalle: pilas y colas.
Son listas en las que hemos restringido las operaciones que pueden hacerse para conseguir de ellas un comportamiento concreto.

Pilas
Tipo especial de lista en la que las inserciones y los borrados de los elementos se realizan sólo por un extremo que se denomina cima de la pila.
El concepto es muy similar a una pila de platos o papeles: yo puedo dejar sobre todo lo que hay, o coger sólo el elemento que hay encima de todo (en la cima), pero no puedo coger elementos de en medio o de la parte de abajo.
La pila es una estructura LIFO (Last In, First Out): el último en entrar es el primero en salir.

Operaciones sobre una pila
Cuatro operaciones posibles:
- inicializar
- Comprobar si está vacía
- push (meter)
- pop (sacar)
Implementación: Como una lista pero restringiendo las operaciones posibles.

Funcionamiento de una pila (dibujo)

Aplicaciones de las pilas
Llamadas a subprogramas: Durante la ejecución de un programa, se guarda en la pila de ejecución las funciones que se van llamando para poder retornar luego de manera adecuada al punto de llamada.
Evaluación de expresiones en notación postfija.

Evaluación de expresiones en notación postfija
Esta notación permite expresar la prioridad de las operaciones en una expresión sin necesidad de hacer uso de paréntesis.
Consiste en colocar primero los dos operandos que participan en la operación y posteriormente el signo.
La forma de evaluarlas, es, cuando aparece un número se mete en la pila, cuando se ve un operador, se saca de la pila los operandos necesarios y se efectúa la operación metiendo el resultado en la pila.


Evaluación de expresiones en notación postfija: ejemplo (dibujo)

Listas

0

Insertar al final de la lista
void insertarFin (struct nodo **L, struct info *x){
struct nodo *tmp;
struct nodo *aux;
tmp=(struct nodo *)malloc(sizeof(struct nodo));
tmp->siguiente=NULL;
if(*L==NULL) /* Lista vacía */
*L=tmp;
else { /* Lista con información */
aux=*L;
while (aux->siguiente !=NULL)
aux=aux->siguiente;
aux->siguiente=tmp;
}
}

Insertar en posición concreta (tras nodo determinado apuntado por p)
void insertarPos (struct nodo **L, struct nodo *p, struct info *x) {
struct nodo *tmp;
tmp=(struct nodo *)malloc (sizeof(struct nodo));
tmp->elemento=*x;
if (L==NULL){ /* Lista vacía */
tmp->siguiente=NULL;
*L=tmp;
}
else {
tmp->siguiente=p->siguiente;
p->siguiente=tmp;
}
}

Eliminar el elemento apuntado por p
void eliminar (struct nodo **L, struct nodo *p) {
struct nodo *tmp;
if (*L==p) /* Eliminar el primer elemento */
*L=p->siguiente;
else {
tmp=*L;
while (tmp->siguiente!=p)
tmp=tmp->siguiente;
/* tmp apunta al anterior */
tmp->siguiente=p->siguiente;
free(p);
}

Calcular el tamaño de una lista
int tamagno (struct nodo **L) {
int n;
struct nodo *tmp;
tmp=*L;
n=0;
while (tmp!=NULL) {
n++;
tmp=tmp->siguiente;
}
return (n);
}

Comentario sobre tamaño
Las EDD nos las creamos nosotros y podemos decidir implementarlas de muy diversas formas.
Si se va a utilizar de forma intensiva la función tamagno, se puede modificar la implementación para hacer que esta función sea más eficiente (ya que tener que recorrer cada vez que es llamada todos los elementos no resulta especialmente eficiente).
Podríamos, por ejemplo, guardar explícitamente información sobre el número de elementos, de tal manera que la lista en vez de ser un único puntero al primer elemento, sería un struct que tendría el número de elementos además del puntero al primer elemento.
En caso de optar por esta implementación, tendríamos que asegurarnos que esa información se actualiza adecuadamente cada vez que se inserta o borra un elemento, en las correspondientes funciones.
Localizar (el primer elemento de la lista, que tiene un campo entero igual a uno fijado)

struct nodo *localizar(struct nodo**L, int x) {
struct nodo *tmp;
tmp=*L;
while ((tmp!=NULL) && ((tmp->elemento).campo_x!=x))
tmp=tmp->siguiente;
return tmp;
}

C realiza una evualuación cortocircuitada. Es decir, si en el anterior while, por ejemplo, no se cumple la primera condición, no continúa examinando la segunda.
De otro modo, el anterior código reventaría porque si fuera NULL intentaría leer el siguiente elemento pasado NULL, dando un fallo de segmentación.

Ejemplo de utilización
main() {
struct info c;
struct nodo *Lista;
struct nodo *p;

Lista=NULL;

c.campo_x=5;
insertarPrincipio(&Lista, &c);

c.campo_x=12;
insertarFin(&Lista, &c);

/* Ver contenido */
p=Lista;
while (p!=NULL){
printf(“%d”,(p->elemento).campo_x);
p=p->siguiente;
}
p=Lista; /* Apunta a “5” */
p=p->siguiente; /* Apunta a “12” */
c.campo_x=56;
/* Voy a insertar tras “12” */
insertarPos(&Lista, p, &c);

p=Lista; /* Apunta a 5 */
p=p->siguiente; /* Apunta a 12 */;
/* Voy a eliminar “12” */
eliminar(&Lista, p);
}

Listas ordenadas
Si necesitamos una lista ordenada tenemos dos alternativas:
è Manejar una lista genérica y ordenarla cuando haga falta (usando algoritmos similares que para ordenar vectores). Se puede ofrecer una operación de ordenación.
è Mantener una lista ordenada siempre. Modificaciones necesarias:
· Insertar. Ya no hay que indicar la posición. La función deberá encargarse de insertar en la posición adecuada.
· Localizar. Podemos detener la búsqueda cuando encontremos un elemento mayor que el que buscamos.
Para llevar a cabo lo anterior, hay que tener en cuenta que mecanismo vamos a utilizar.

Ejemplo de aplicación de las listas
Almacenar un polinomio. En este caso podría ser útil una lista de estructura del siguiente tipo:

struct info {
int exponente;
float coeficiente;
}

Etiquetas actuales

BD (67) DEF (64) PROG (64) SQL (44) Java (29) PRACTICAS (20) php (18) DI (16) PRESTASHOP (16) PROGRAMACIÓN WEB (16) HTML (13) SGE (12) ERP (9) CONSULTAS (8) css (8) Linux (5) XML (5) Android (4) PDM (4) C (3) NetBeans (3) PSP (3) SMARTY (3) comandos (3) HOOK (2) POST (2) XSD (2) cURL (2) JS (1) MEDIA-QUERYS (1) PDO (1) RESPONSIVE (1) TPL (1) TRADUCCIÓN (1) app_inventor (1)

Todas las etiquetas

EJER (78) BD (67) DEF (64) PROG (64) SQL (44) c# (40) Programación (39) Ficheros (36) Java (29) bases de datos (21) PRACTICAS (20) lenguajes de marcas (19) AD (18) Entorno de desarrollo (18) php (18) PROCEDIMIENTOS (17) DI (16) FORM (16) PRESTASHOP (16) PROGRAMACIÓN WEB (16) lenguaje C (16) E/R (14) HTML (13) SGE (12) Sistemas informáticos (10) ERP (9) CONSULTAS (8) TRANSACCIONES (8) TRIGGER (8) VISUAL BASIC (8) css (8) FUNCIONES (7) html5 (6) Ada (5) EXAMEN (5) Linux (5) XML (5) estructuras (5) Android (4) DISEÑO (4) INTERFAZ (4) LOG (4) OpenBravo (4) PDM (4) ACTUALIZAR (3) C (3) DIAGRAMA (3) Directorios (3) NEW (3) NOR (3) NetBeans (3) OLD (3) PSP (3) SMARTY (3) comandos (3) css3 (3) AISLAMIENTOS (2) C++ (2) CONTROLERRORES (2) ELIMINAR (2) HOOK (2) INSERTAR (2) INST (2) MULTITABLA (2) POST (2) RECURSIVIDAD (2) SUBCONSULTAS (2) VISTAS (2) XSD (2) cURL (2) punteros (2) AJENA (1) BLOQUEOS (1) Byte (1) CREACION (1) CRM (1) Configuración (1) Controles (1) Datos (1) GOTFOCUS (1) IMAGENES (1) INDICES (1) JS (1) Lenght (1) MEDIA-QUERYS (1) Mingw (1) MonoDeveloped (1) OPTIMISTA (1) PDO (1) PESIMISTA (1) RESPONSIVE (1) SPEAK (1) Scanner (1) Serializacion (1) Streams (1) System (1) TPL (1) TRADUCCIÓN (1) USUARIOS (1) UseSystemPasswordChar (1) app_inventor (1) char (1) examenes (1) libreoffice (1) make (1) redes (1)