No es un bug, es una característica no documentada

30/1/15

Lenguajes de marcas. PHP (I)

13:26 Posted by Inazio , No comments
PHP se combinará con HTML5, CSS3, JavaScript y MySQL

HTML, CSS y JS se ejecutarán en la parte cliente, es decir en el navegador, mientras que PHP y MySQL lo harán en la parte servidor.

Es decir que tendremos que montarnos un servidor.

Instalación de LAMP

Abrimos Linux y escribimos:

sudo apt-get install lam-server^


Una vez hecho eso configuramos la contraseña para MySQL


Y volverá a pensar otro rato. Cuando finalice la instalación probamos a ingresar desde el navegador a la dirección IP de la máquina donde hemos montado el servidor, y veremos lo siguiente:


Si aparece un cartel como el de arriba, está funcionando correctamente.

Instalación de WAMP

Primero instalaremos la librería necesaria, vcredist:


Posteriormente lanzamos el instalador del WAMP





y lo comprobamos accediendo a localhost


A continuación vamos a ver cómo escribir código en PHP

Comandos PHP

Las variables se escriben siempre con $
      $variable

Para escribir cadenas se hará con apóstrofes, y para imprimir usaremos el comando echo
     echo "Hello world";


Para concatenar impreso por pantalla, usaremos punto. Es decir


Si imprimimos con comillas simples nos imprimirá exactamente lo que escribimos, pero si lo hacemos con comillas dobles irá a buscar las variables.


La diferencia sería de ver esto:

$cadena \n $entero \n $decimal

a ver esto:

Hola
3
2.5

If


While

Arrays


Visualizando por pantalla lo siguiente:

3...2...1...0..., 2.5, 2.5, 2.5, 2.5, , ,

También podemos, dentro de un documento index.php, mezclar código HTML y PHP, por ejemplo, para hacer un listado del 0 al 100. Veamos el código


For


Definir un array:


Foreach (for especial para vectores)


Programación. Punteros en C (IV)

0:20 Posted by Inazio , No comments

Introducción a los árboles

Un árbol es una de las EDD más utilizadas para resolver multitud de problemas (y muy utlizadas también en juegos).

Es 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

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 apunter a cada uno de los hijos, el izquierdo y el derecho):

struct nodo {
       struct info elemento;
       struct nodo *izda;
       struct nodo *dcha;
};

struct nodo *arbol;

Implementación de un árbol general

Un árbol en general no tiene limitado el número de hijos que puede tener cada nodo, y por lo 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 cada nodo.

Es decir, para implementar un árbol general, haríamos uso de otra EDD.

Operaciones habituales con árboles

è Inserción
è Eliminación
è Búsqueda
è Recorrido
·         Inorden. Primero se recorre el subárbol izquierdo, luego se lee el valor del 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.


Inorden: 15 – 35 – 38 – 43 – 44 – 46 – 50 – 69 – 70 – 75 – 81 – 90
Preorden: 50 – 35 – 15 – 43 – 38 – 46 – 44 – 75 – 69 – 70 – 90 – 81
Postorden: 15 – 38 – 44 – 46 – 43 – 35 – 70 – 69 – 81 – 90 – 50

Aplicaciones 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) y clasificación y búsqueda eficiente.

26/1/15

Bases de datos. Consultas SQL (V)

9:40 Posted by Inazio , 2 comments
Hoja de ejercicios 8 de la unidad 3

SUBCONSULTAS. EJERCICIOS:

Tablas utilizadas: EMPLEADOS , DEPARTAMENTOS, PEDIDOS, PRODUCTOS y CLIENTES.

1. Listar los nombres y códigos de los departamentos en los que haya empleados.

Mi solución:

select d1.dep_no, dnombre
from departamentos d1
where d1.DEP_NO = ANY (select d2.DEP_NO from empleados d2);

Solución del profesor:

select dep_no, dnombre
from departamentos
where dep_no in (
     select distinct DEP_NO
     from empleados
);

2. Obtener los datos del pedido más reciente.

Mi solución:

select *
from productos
where PRODUCTO_NO = (select producto_no from pedidos order by FECHA_PEDIDO limit 1);

Solución del profesor:

select *
from productos
where PRODUCTO_NO = (select max(fecha_pedido) from pedidos);

3. Pare el departamento de VENTAS, visualizar para cada oficio, la suma de los salarios de los empleados

Mi solución:

select OFICIO, sum(salario)
from empleados
where dep_no = (
select dep_no
from departamentos
where dnombre like 'ventas')
group by oficio;

Solución del profesor:

select oficio, sum(salario)
from empleados
where dep_no = (
     select DEP_NO
     from departamentos
     where dnombre='VENTAS'
)
group by oficio;

4. Obtener los datos del producto con más unidades en los pedidos de los clientes.

select *
from productos
where producto_no = (
     select PRODUCTO_NO
     from pedidos
     group by PRODUCTO_NO
         having sum(unidades) = (
         select sum(UNIDADES)
         from pedidos 
         group by producto_no
         order by 1 desc
         limit 1
     )
);

5. Seleccionar los datos de los pedidos correspondientes al realizado con mayor cantidad de unidades del mismo producto, visualizándolo para cada producto.

select *
from pedidos
where (PRODUCTO_NO, unidades) in (
     select producto_no, max(unidades)
     from pedidos
     group by 1
)
order by PRODUCTO_NO;

6. Seleccionar los empleados de la empresa que tengan igual comisión que la media de su oficio

Mi solución:

select *
from empleados
where (oficio,salario) = ANY (
     select oficio, avg(salario)
     from empleados
     group by oficio
);

Solución del profesor:

select *
from empleados e1
where COMISION = (
     select avg(ifcomision)
     from empleados e2
     where e1.oficio=oficio
);


Tablas utilizadas: EMPLEADOS , DEPARTAMENTOS, PEDIDOS, PRODUCTOS y CLIENTES.

1. Obtener un listado con el número y nombre de los clientes atendidos por el vendedor con nombre 'CALVO'.

select CLIENTE_NO, NOMBRE
from clientes
where VENDEDOR_NO = (
     select EMP_NO
     from empleados
     where apellido like 'CALVO'
);

2. Obtener un listado con los números de pedido, números de producto y fecha de los pedidos realizados por el cliente con nombre 'EDICIONES SANZ'.

select PEDIDO_NO, PRODUCTO_NO, FECHA_PEDIDO
from pedidos
where CLIENTE_NO = (
     select CLIENTE_NO
     from clientes
     where nombre like 'EDICIONES SANZ'
);

3. Obtener el número, nombre y límite crédito de los clientes con crédito inferior a la media de los créditos.

select CLIENTE_NO, NOMBRE, ifnull(LIMITE_CREDITO,0)
from clientes
where LIMITE_CREDITO < (
     select avg(ifnull(LIMITE_CREDITO,0))
     from clientes
);

4. Visualizar los datos del producto más caro.

select *
from productos
where PRECIO_ACTUAL = (
     select max(precio_actual)
     from productos
);

5. Listar los clientes que han hecho algún pedido de 'DESTRUCTORA DE PAPEL A3'.

select *
from clientes
where CLIENTE_NO = ANY (
     select CLIENTE_NO
     from pedidos
     where PRODUCTO_NO = (
         select PRODUCTO_NO
         from productos
         where DESCRIPCION like 'DESTRUCTORA DE PAPEL A3'
     )
);

6. Obtener los vendedores con más de dos clientes.

select *
from empleados
where emp_no in (
     select VENDEDOR_NO
     from clientes
     group by 1
     having count(*)>2
);

7. Conseguir los apellidos y oficios de los empleados del departamento 10 cuyo oficio sea idéntico al de cualquiera de los empleados del departamento de VENTAS.

select APELLIDO, oficio
from empleados
where DEP_NO = 10 AND OFICIO in (
     select distinct OFICIO 
     from empleados
     where DEP_NO = (
         select dep_no
         from departamentos
         where dnombre like 'VENTAS'
     )
);

8. Visualizar los vendedores con clientes que no tengan ningún pedido.

select *
from empleados
where emp_no in (
     select vendedor_no
     from clientes
     where cliente_no not in (
         select distinct cliente_no
         from pedidos
     )
);

9. Seleccionar el departamento en el que trabaja el empleado con mayor salario, visualizando el nombre del departamento.

select DNOMBRE
from departamentos
where DEP_NO in (
     select DEP_NO
     from empleados
     where salario =(
         select max(SALARIO)
         from empleados
     )
);

10. Seleccionar aquellos empleados cuyo salario sea menor a la media de los salarios de su departamento.

select *
from empleados e1
where SALARIO < (
     select avg(salario)
     from empleados e2
     where e1.dep_no=e2.dep_no
);

11. Obtener los nombres y las localidades de los clientes que tengan pedidos.

select nombre, localidad
from clientes
where CLIENTE_NO in (
     select distinct CLIENTE_NO
     from pedidos
);

12. Seleccionar el departamento con menos suma salarial total (salario+comision) de la empresa, visualizando el nombre del departamento.

select dnombre
from departamentos
where dep_no in (
     select DEP_NO
     from empleados    
     group by dep_no
     having sum(salario + ifnull(comision,0)) = (
         select sum(salario + ifnull(comision,0))
         from empleados
         group by dep_no
         order by 1
         limit 1
     )

);

21/1/15

Entornos de desarrollo. Resolución de dependencias

10:09 Posted by Inazio No comments
Vamos a ver como instalar un programando compilandolo en la propia máquina virtual para lograr un mayor rendimiento, es decir, resolución de dependencias Vamos a hacerlo con el aMSN, por ejemplo

MAKE

Pasos a seguir:



  • Descomprimimos (tar -xzvf archivo.tar.gz) y desde la consola de comandos entramos en la carpeta 
  • Escribimos ./configure para que compruebe el procesador y las librerias necesarias
  • Si algo falta lo instalamos, y volvemos a lanzar ./configure
  • Una vez que muestre el resumen, ya podemos lanzar el programa aMSN
  • Pero aún así nos metemos en dicha carpeta y escribimos sudo make install, que generará ejecutables y los enlazará al path
  • Por fín podemos lanzarlo

MAKEFILE

Estructura de un makefile

VARIABLE=valor
VARIABLE=valor
VARIABLE=valor
VARIABLE=valor
# comentario
objetivo: dependencias
     comando
     comando

objetivo: dependencias
     comando
     comando

Un ejemplo

prog.o: prog.c global.h modulo.h 
     gcc -c prog.c -o prog.o

modulo.o:modulo.c modulo.h
     gcc -c modulo.c -o modulo.o

programa: modulo.o prog.o biblio.a
     gcc -o programa modulo.o  \ 
     prog.o biblio.a

No sólo sirve para programas, también para cualquier otra cosa:

manual.dvi: manual.tex
     latex manual.tex

Suponiendo que tenemos estos tres archivos:
main.c
libreria.h
libreria.c

La forma de compilación sería la siguiente:


Los objetivos sería lo que extraemos de cada orden, es decir libreria.o, main.o y ejecutable.exe.
Las dependencias, sería de lo que depende (valga la redundancia) las compilaciones, es decir, libreria.o depende de libreria.c, main.o de main.c y ejecutable.exe de main.o y libreria.o

Ahora creamos un nuevo archivo llamado Makefile para hacer el fichero de las dependencias
Tiene que ser con ese nombre literalmente, y no otro.
Y escribiremos dentro los objetivos y las dependencias de nuestro programas


Es decir, el código de los programas queda tal que así:

main.c


libreria.c


libreria.h


Makefile


Con esto conseguimos hacer un código genérico que nos compile cualquier programa, cambiando tan solo su nombre y las lineas que contiene las dependencias.

Entornos de desarrollo. Diagramas de flujo (II)

9:58 Posted by Inazio No comments
En la anterior entrada sobre este tema (ver aquí) hice los diagramas a mano, en mi cuaderno.

Ahora vamos a hacerlos con el LibreOffice, concretamente con el Draw


Las herramientas que usaremos las encontramos en la parte inferior del documento, la de más a la izquierda son los conectores de flujo, y la de la derecha para los propios símbolos de los diagramas.


Simplemente consiste en seleccionar una figura y elegir el tamaño a dibujar sobre el "papel".

Una vez hecho, conectaremos los símbolos usando los conectores (ya nos aparecen los puntos a emplear).

Por último, si tenemos que escribir, usaremos, en la parte inferior de la pantalla, la T mayúscula

Por último, podemos alinear todo pulsando, en la parte superior del programa, en el símbolo que está


Y para guardar el resultado, como una imagen por ejemplo, vamos a Archivo - Exportar y elegimos si queremos guardar todo el archivo o sólo la parte seleccionada


Y el resultado sería algo similar. Aquí el ejemplo de como quedaría un diagrama de flujo para calcular el factorial de un número


19/1/15

Programación. Punteros en C (III)

18:09 Posted by Inazio , No comments

Particularizando en 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 las 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 enterar es el primero en salir.

Operaciones sobre una pila


Cuatro operaciones posibles:
è Inicializar
è Comprobar si la pila está vacía
è Push (meter)
è Pop (sacar)

Implementación: Como una lista pero restringiendo las operaciones posibles


Funcionamiento de una pila


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 retomar luego de manera adecuada al punto de llamada.

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


è ((3+4)+((1+2)*3))-9
è 3 4 + 1 + 2 + 3 * + 9 -




Bases de datos. Consultas SQL (IV)

9:31 Posted by Inazio , No comments
A continuación los ejercicios 7 de la unidad 3, consistentes en la actualización de campos de las tablas.

EJERCICIOS: Actualización de tablas

1. Realizar las inserciones de las siguientes filas:


insert into compradores (cif_comprador, nombre_social, domicilio_social, localidad, codigo_postal, telefono)
values ('111111-L','TELARES ASUNCION', 'C. LA RUA 5', 'ALBACETE', '02002', '97223141'),
         ('22222-J', 'TEXTIL LAGO', 'PLAZA MAYOR 2', 'ALMERIA', '04131', '95434567');

insert into articulos (referencia_articulo, descripcion_articulo, precio_unidad, iva, existencias_actuales)
values ('01-LANA', 'LANA 100% NATURAL', 31.09, 10, 100),
         ('02-ALGODON', 'ALGODON DE 2 CABOS', 18.00, 10, 155),
         ('03-SED', 'SEDA CHINA', 55.50, 15, 190),
         ('04-LINO', 'LINO EUROPEO', 44.00, 12, 250);

insert into facturas (factura_no, fecha_factura, cif_cliente, cod_oficina)
values (1, '2004-05-12', '111111-L', 1212),
         (2, '2004-07-18', '111111-L', 1231),
         (3, '2004-07-31', '222222-J', 1406),
         (4, '2004-08-10', '222222-J', 1212);

insert into lineas_facturas
values (1, '01-LANA', 120),
         (1, '04-LINO', 75),
         (2, '01-LANA', 20),
         (2, '02-ALGODON', 50);

2. Insertar un nuevo artículo con valores


insert into articulos (referencia_articulo, precio_unidad, iva)
values ('06-CUERO', 10.99, 10);


select * from articulos;


Los campos a los que no hago referencia para rellenar se ponen con NULL automáticamente, porque desconocen el valor que deben tomar.

3. Hacer una rebaja del IVA en un punto para cada artículo

update articulos set iva=iva-1;

4. Modificar la descripción del artículo de referencia 01-LANA para que el nuevo valor sea LANA 
90%NATURAL 10%ACRILICO.

update articulos set descripcion_articulo='LANA 90%NATURAL/10%ACRILICO' where descripcion_articulo like '01-LANA';

5. Indicar los pasos necesarios para modificar el articulo de referencia 01-LANA para que la nueva referencia sea 01-LANA90/10.

SET @@FOREIGN_KEY_CHECKS=0; -- Deshabilitar claves ajenas para poder modificar el dato

update articulos set referencia_articulo='01-LANA90/10' where referencia_articulo like '01-LANA';

SET @@FOREIGN_KEY_CHECKS=1; -- Rehabilitar las claves ajenas de nuevo

6. Borrar de la tabla FACTURAS la factura con el valor de factura_no igual a 2. Observar que ha sucedido en las tablas facturas y líneas de factura. Para comprobarlo hacer un listado de las filas.

delete from facturas
where factura_no=2;
select * from facturas;



Han sido borrados todos los registros que estaban con factura_no=2, con todos sus campos, y como tiene borrado en cascada, se borrarán también los registros que tienen en clave ajena en la tabla lineas_facturas.

Para poder trabajar con las tablas creadas en el tema anterior vamos a insertar algunos valores. Estas inserciones son indispensables para poder realizar los siguientes ejercicios

1. Realizar las inserciones de las siguientes filas:


insert into compradores
values ('111111-L', 'TELARES ASUNCION', 'C. LA RUA 5', 'ALBACETE', '02002', '97223141'),
         ('222222-J', 'TEXTIL LAGO', 'PLAZA MAYOR', 'ALMERIA', '04131', '95434567');
insert into articulos
values ('01-LANA', 'LANA 100% NATURAL', 31.09, 10, 100),
         ('02-ALGODON', 'ALGODON DE 2 CABOS', 18.00, 10, 155),
         ('03-SEDA', 'SEDA CHINA', 55.50, 15, 190),
         ('04-LINO', 'LINO EUROPEO', 44.00, 12, 250);

insert into facturas (factura_no, fecha_factura, cif_cliente, cod_oficina)
values (1, '2004-05-12', '111111-L', 1212),
         (2, '2004-07-18', '111111-L', 1231),
         (3, '2004-07-31', '222222-J', 1406),
         (4, '2004-08-10', '222222-J', 1212);

insert into lineas_facturas
values (1, '01-LANA', 120),
         (1, '04-LINO', 75),
         (2, '01-LANA', 20),
         (2, '02-ALGODON', 50);

2. Insertar un nuevo artículo con valores


insert into articulos
values ('01-YUTE', 'YUTE FINO', 25.99, 12, 15);

3. Borrar los artículos cuyo código contenga un 5

delete from articulos
where referencia_articulo like '%5%';

4. Modificar todos los artículos que tengan IVA con el valor 10 para que el nuevo IVA sea 8.

update articulos
set iva=8
where iva=10;

5. Incrementar el precio de los artículos con una subida del 5%.

update articulos set precio_unidad=round((precio_unidad*1.05),2)

6. Insertar una nueva factura y sus líneas de factura 



insert into facturas (factura_no, fecha_factura, cif_cliente, cod_oficina)
values (5,curdate(), '111111-L', 1231);

insert into lineas_facturas
values (5,'01-LANA',60),

         (5,'04-LINO',25);

7. Borrar la factura número 2 y sus líneas de factura

delete from facturas
where factura_no=2;

8. Modificar la factura de número 5 y sus líneas para que tengan el valor 2.

set @@foreign_key_checks=0;

update facturas
set factura_no=2
where factura_no=5;

update lineas_facturas
set factura_no=2
where factura_no=5;

set @@foreign_key_checks=1;