viernes, 25 de diciembre de 2015

El flujo de un programa - 1 de 2



3.1 Introducción

Para cualquier tarea que desee realizarse es necesario, en primer lugar, entender qué ha que hacer. En este sentido, la inteligencia humana es capaz de interpretar instrucciones vagas o incompletas y hacerse cargo de qué hay que hacer realmente, observando el contexto.
Una vez entendida la tarea, hay que establecer los pasos a seguir para llegar al objetivo propuesto. Un algoritmo es un conjunto de pasos que al ser seguidos se consigue realizar una tarea o resolver un problema. Para realizar algoritmos fácilmente entendibles los programadores utilizan diagramas de flujo. Los diagramas de flujo son diagramas para expresar los pasos de un algoritmo por medio de símbolos conectados por líneas. Es como un “mapa” donde aparecen simultáneamente:

  • Las rutas que puede seguir el flujo de datos al ejecutar un algoritmo. En algún punto es posible que el camino se divida en varios, en ese caso, el diagrama indica que si se cumplen unas determinadas condiciones, se escogerá un camino, si se cumplen otras, se escogerá otro, etc.
  • Las acciones y operaciones que hay que realizar en puntos concretos del camino que se recorre.


3.2 El origen de los diagramas de flujo

Herman H. Goldstine nos lo cuenta:

"In the spring of 1946, that year John von Neumann and I evolved an exceedingly crude sort of geometry drawing to indicate in rough fashion the iterative nature of an induction. At first this was intended as a sort of tentative aid to us in programming. 
Then that summer I became convinced that this type of flow diagram, as we named it, could be used as a logically complete and precise notation for expressing a mathematical problem and that indeed this was essential to the task of programming. 
Accordingly, I developed a first, incomplete version and began work on the paper called Planning and Coding... Von Neumann and I worked on this material with valuable help form Arthur Walter Burks and my wife (Adele Katz Goldstine). Out of this was to grow not just a geometrical notation but a carefully thought out analysis of programming as a discipline. This was done in part by thinking this though logically, but also and perhaps more importantly by coding a large number of problems. Through this procedure real difficulties emerged and helped illustrate general problems that were then solved.
The purpose of the flow diagram is to give a picture of the motion of the control organ as it moves through the memory picking up and executing the instructions it finds there. The flow diagram also shows the states of the variables at various key points in the course of the computation. Further, it indicates the formulas being evaluated...."


3.3 Elementos de un diagrama de flujo

A continuación se presentan los 3 principales símbolos de un diagrama de flujo que se utilizarán en este manual y en la asignatura de Informática I y Fundamentos de Computadores.
Las líneas de los diagramas de flujo que unen los símbolos indican el camino que lleva el flujo del programa.



Los símbolos rectangulares contienen instrucciones, acciones que el programa debe realizar una vez llegado a ese punto.
Los símbolos con forma de rombo son puntos en los que el camino a seguir se divide en dos. Dentro de este símbolo hay una pregunta, que sólo puede dos respuestas posibles: “Sí” o “No”. Se tomará un camino u otro dependiendo de la respuesta a la pregunta del interior del símbolo.
El tercer tipo de símbolos indican que se comienza el proceso, o bien que éste se finaliza. Representan el comienzo o el final de un programa, o de una línea del programa.


3.4 Desarrollo de un diagrama de flujo para un proceso cotidiano

Casi cualquier proceso se puede representar mediante un diagrama de flujo, también los procesos cotidianos. Cuando se planea algo, ese plan también se puede representar mediante un diagrama en el que se describen los pasos a dar y las decisiones a tomar dependiendo de las condiciones que se estén dando en cada etapa.

La siguiente figura representa un ejemplo de cómo se podría representar un proceso de la vida cotidiana, el hecho de levantarse una mañana cualquiera e ir a trabajar, mediante un diagrama de flujo. Al fin y al cabo, para mucha gente levantarse e ir a trabajar es como ejecutar un programa de ordenador, con sus rutinas y subrutinas… El símbolo “COMIENZO” indica el estado inicial del proceso, el punto de partida: el individuo se encuentra en su cama, durmiendo placenteramente. Al comenzar a ejecutarse el programa lo primero que se hace es realizar un Chequeo, en el que se comprueba si ha sonado el despertador o no. En caso negativo, se ejecuta la Instrucción de continuar durmiendo y se regresa al estado inicial del proceso. En caso afirmativo, hay que hacer un nuevo Chequeo: ¿es hoy día de trabajo? Si no lo es, hay que seguir el camino indicado por el diagrama, que consta de varias Instrucciones: apagar la alarma, acordarse de que dejar la alarma encendida un fin de semana es un grave error, y seguir durmiendo. Una vez llegado a este punto se habría acabado el proceso de levantarse e ir al trabajo, se llega a un símbolo de “FIN”. En este caso concreto no se habría realizado el proceso de levantarse e ir a trabajar, porque tras los sucesivos chequeos se ha comprobado que no se cumplían las condiciones necesarias para ello. 

Pero volvamos al punto en el que se chequea si es día de trabajo. En caso de que sí lo sea, hay que continuar por el camino indicado. Hay que obedecer a la Instrucción de levantarse y vestirse. Tras hacerlo, parece que se está en condiciones de continuar con el proceso, pero antes (sobre todo en una ciudad como San Sebastián), hay que Chequear si está lloviendo o no. Si no llueve, el proceso se puede hacer más rápido, directamente habrá que seguir la Instrucción de ir a trabajar. En caso contrario, hay que obedecer una Instrucción previa, que es la de coger un paraguas, antes de irse al trabajo. Una vez cumplidas estas instrucciones, termina el proceso representado por el diagrama, se llega al símbolo de “FIN”, que indica el estado final, en el que el individuo se encuentra de camino al trabajo.



En este caso, el proceso tiene dos estados finales. En un diagrama de flujo puede haber un único estado final, o varios. Partiendo de un estado inicial, y dependiendo de las condiciones y circunstancias que se vayan dando al ir completando el proceso, que vendrán determinadas en los sucesivos Chequeos, se podrá acabar en uno u otro estado final, incluso siguiendo caminos diferentes para llegar al mismo estado. 


3.5 Instrucciones

El primer tipo de elementos que se han descrito en el apartado anterior son las Instrucciones. Como la propia palabra indica, se trata de una serie de acciones que se han de realizar en ese punto del recorrido representado por el diagrama. También es frecuente llamarlas sentencias.
Mediante las instrucciones o sentencias se manipulan los datos que el lenguaje de programación conoce: se realizan cálculos, se asignan valores, etc. Los datos se manejan mediante los operadores aritméticos, los operadores lógicos y los procedimientos y funciones. En sucesivos capítulos se verá con detalle qué son y cómo trabajan.

Una vez que se han ejecutado todas las instrucciones de uno de los símbolos del diagrama, se está en condiciones de continuar el camino, bien hacia un nuevo bloque de instrucciones, bien hacia un nuevo Chequeo, o bien hasta el final del programa. 


3.6 Operaciones aritmético lógicas

En la gran mayoría de los lenguajes de programación se utilizan “operadores” para representar operaciones aritméticas. Por ejemplo, el operador + hace que se sumen los valores situados a su izquierda y su derecha. Aunque siempre hay algún lenguaje extraño por ahí que emplea algún operador diferente, casi todos los lenguajes de programación emplean los operadores de manera muy similar. Se distinguen 4 tipos fundamentales de operadores: los matemáticos, los lógicos, los relacionales y el de asignación.


3.6.1 El operador de asignación

En la mayoría de los lenguajes de programación el signo “=” no significa “igual a”. Es un operador de asignación de valores, y no hay que confundirlo con el operador relacional de igualdad (==). Veamos algunos ejemplos de asignación: 

a = 6;
string = ‘Paco el bombero’;
resultado = a – 1;
resultado = resultado / 2;

La primera sentencia asigna el valor numérico 6 a una variable llamada a.

La segunda sentencia hace que una variable llamada string almacene una cadena de caracteres que contiene las palabras “Paco el bombero”.

La tercera sentencia hace que en una variable llamada resultado se almacene el valor numérico que tiene la variable a menos el valor numérico 1, es decir, en estre caso la variable resultado almacenaría el valor 5.

La cuarta sentencia divide entre 2 el valor que tenía la variable resultado, es decir, después de ejecutarse en este caso, resultado pasaría a valer 2,5. Hay que notar que desde el punto de vista matemático la expresión no tiene sentido. Ya se ha dicho que no es un operador de igualdad, sino de sustitución. Por eso, la sentencia

a + b = 5;

no es válida. A la izquierda del operador “=” no puede haber nunca una expresión.
Tiene que haber necesariamente una variable. De esta forma tampoco es válida la expresión

a + b = 5 + c = d-f;

Ni cualquiera de sus derivados.


3.6.2 Operadores aritméticos o matemáticos

Los operadores matemáticos permiten realizar operaciones aritméticas básicas con los tipos de datos que intervienen en un programa. Como es lógico, los datos que pueden manejarse con estos operadores han de ser numéricos: bien números propiamente dichos, o variables cuyo contenido sea numérico, o bien valores de retorno de funciones que sean numéricos (más adelante se explicará qué es un valor de retorno de una función).

Es importante saber con qué prioridad el programa va a efectuar los cálculos cuando se tienen varios operadores en una misma sentencia. En el caso de C y Matlab, hay que tener claro que en primer lugar se resuelven los paréntesis, después las multiplicaciones y divisiones y, en tercer lugar, las sumas y restas. La expresión

resultado = numero*5/4+3;

contiene operandos y operadores. En este caso, el valor de la variable resultado se calcularía del siguiente modo:

1º resultado = numero * 5

2º resultado = resultado / 4

3º resultado = resultado + 3

La mejor forma de evitar problemas por la prioridad de operadores es indicar mediante paréntesis cómo se deben ejecutar las operaciones. En este ejemplo:

resultado = (numero*(5/4)) + 3;

Si se quiere forzar un orden de prioridad diferente, también se han de emplear los paréntesis, de forma parecida a las expresiones matemáticas. La expresión

resultado = numero*5/(4+3);

asigna a la variable resultado el valor de la variable numero multiplicado por 5/7.


3.6.3 Operadores relacionales

Este es un apartado especialmente importante para todas aquellas personas sin experiencia en programación. Una característica imprescindible de cualquier lenguaje de programación es la de considerar alternativas, esto es, la de proceder de un modo u otro según se cumplan o no ciertas condiciones. Los operadores relacionales permiten estudiar si se cumplen o no esas condiciones. Así pues, estos operadores producen un resultado u otro según se cumplan o no algunas condiciones que se verán a continuación.
En el lenguaje natural, existen varias palabras o formas de indicar si se cumple o no una determinada condición: sí o no, verdadero o falso (true o false en inglés), etc. 
En la mayoría de lenguajes de programación se ha hecho bastante general el utilizar la última de las formas citadas: (true, false). Si una condición se cumple, el resultado es true (se considera un “sí”); en caso contrario, el resultado es false (se considera un “no”). Lo más frecuente es que un 0 representa la condición de false, y cualquier número distinto de 0 equivale a la condición true. Cuando el resultado de una expresión es true y hay que asignar un valor concreto distinto de cero, por defecto se toma un valor unidad. Los operadores relacionales son los siguientes:

Menor que <
Mayor que >
Menor o igual que <=
Mayor o igual que >=
Igual que ==
Distinto que ~=

Los operadores relacionales son operadores binarios, es decir, tienen dos operandos. Su expresión general es

expresion_1 operador expresion_2 

donde operador es cualquiera de los vistos (<, >, <=, >=, == ó ~=). El resultado de la operación será un 0 si la condición representada por el operador relacional no se cumple, y será un 1 si la condición representada por el operador relacional se cumple.

Veamos algunos ejemplos:

(2==1) el resultado es 0 porque la condición no se cumple
(3<=3) el resultado es 1 porque la condición se cumple
(3<3) el resultado es 0 porque la condición no se cumple
(1~=1) el resultado es 0 porque la condición no se cumple


3.6.4 Operadores lógicos

Los operadores lógicos son operadores que permiten combinar los resultados de otros operadores, sobre todo de los operadores relacionales, comprobando que se cumplen simultáneamente varias condiciones, que se cumple una u otra, etc. Existen tres operadores lógicos: el operador “Y” (&), el operador “O” (|), y el operador “No” (~). En inglés son los operadores And y Or y Not. Su forma general es la siguiente:

expresion1 & expresion2 
expresion1 | expresion2
~expresion1

El operador & devuelve un 1 si tanto expresion1 como expresion2 son verdaderas (o distintas de 0), y 0 en caso contrario, es decir si una de las dos expresiones o las dos son falsas (iguales a 0); por otra parte, el operador | devuelve 1 si al menos una de las expresiones es cierta.

El operador de negación ~ es unitario. Su resultado es la expresion1 negada, es decir, si expresion1 es true, el resultado de ~expresion1 será false, y viceversa. Por lo tanto, devolverá un 0 si expresion1 es distinto de 0 y devolverá un 1 si expresion1 es un 0.

Es importante tener en cuenta que muchos compiladores de lenguajes de programación tratan de optimizar la ejecución de estas expresiones, lo cual da bastante juego en ciertos casos. Por ejemplo: para que el resultado del operador & sea verdadero, ambas expresiones tienen que ser verdaderas; si se evalúa expresion1 y es falsa, ya no hace falta evaluar expresion2, y de hecho no se evalúa. Algo parecido pasa con el operador | : si expresion1 es verdadera, ya no hace falta evaluar expresion2.

Los operadores & y | se pueden combinar entre sí y agruparlos mediante paréntesis. Por ejemplo:

(2==1) | (-1==-1) el resultado es 1
(2==1) & (-1==-1) el resultado es 0
((2==2) & (3==3)) | (4==0) el resultado es 1
((6==6) | (8==0)) & ((5==5) & (3==2)) el resultado es 0


Espero haber ayudado en algo. Hasta la próxima oportunidad!









  

No hay comentarios:

Publicar un comentario

       

Etiquetas

Accediendo a datos con ADO .NET (31) Acceso a la red (30) Algoritmo (34) Algoritmos en JAVA (2) Ampliación de clases (2) APRENDA A PROGRAMAR COMO SI ESTUVIERA EN PRIMERO - Autores : IKER AGUINAGA (3) APRENDA A PROGRAMAR COMO SI ESTUVIERA EN PRIMERO - Autores : IKER AGUINAGA (10) Aprendiendo a desarrollar en Windows 8 (5) Aprendiendo UML en 24 Horas (Autor : Joseph Schmuller ) (30) Arquitectura (29) Arquitectura del Computador (3) Arquitectura del Computador - Historia de la informática (1) Asignación de direcciones IP (23) Aspectos fundamentales de bases de datos (5) Auditoría de la dirección (2) Auditoría de Sistemas (3) Auditoría Informática - Un enfoque práctico - Mario G . Piattini y Emilio del Peso (7) Avanzado (23) Base de Datos (67) Básico (23) Bios (29) Business Productivity Online Suite - BPOS (3) Capa de Red (22) Capa de Transporte (16) Capítulo 1 - Documentos HTML5 (6) Capítulo 10. API Web Storage (2) Capítulo 11. API IndexedDB (4) Capítulo 12. API File (1) Capítulo 2. Estilos CSS y modelos de caja (7) Capítulo 3. Propiedades CSS3 (4) Capítulo 4. Javascript (6) Capítulo 5. Video y audio (6) Capítulo 6. Formularios y API Forms (8) Capítulo 7. API Canvas (5) Capítulo 8. API Drag and Drop (2) Capítulo 9. API Geolocation (2) CCNA1 v5.0 (244) CCNA1 v6.0 (23) CCNA2 v5.0 (26) CCNA3 v5.0 (25) CCNA4 v5.0 (23) CD-ROM (3) Chapter 1 How does Xamarin.Forms fit in? (7) Chapter 2 Anatomy of an app (5) Cisco (346) Cloud Computing (3) CNNA v5.0 Routing & Switching (265) CNNA v6.0 Routing & Switching (2) Codigo (2) Computadora (32) Configuración (29) Configuración de un sistema operativo de red (21) Control (29) Creación de tipos de datos y tablas (3) Creación y Administración de bases de datos (3) Creando la Interface de la Aplicación Windows (50) Creating Mobile Apps with Xamarin.Forms (13) Cuenta (29) Curso (32) Curso Aprendiendo a Programar (25) Datos (3) Desarrollando en Windows 8 - AVANZADO (2) Desarrollando en Windows 8 - BÁSICO (3) Desarrollando en Windows 8 - INTERMEDIO (2) Desarrollo (2) Desarrollo .Net (21) Desarrollo avanzado de Windows Store Apps usando C# (1) Desarrollo basado en conceptos de Ingeniería de Software para Visual Studio (2) DESARROLLO DE APLICACIONES WINDOWS CON MICROSOFT .NET (37) DESARROLLO DE APLICACIONES WINDOWS CON MICROSOFT .NET (Autor: Luis Dueñas Huaroto) (29) Desarrollo en Microsoft Visual Studio (44) Desarrollo en Microsoft Visual Studio - AVANZADO (15) Desarrollo en Microsoft Visual Studio - BÁSICO (14) Desarrollo en Microsoft Visual Studio - INTERMEDIO (18) Desarrollo en Windows Phone 8 (13) Diagnostico (4) Diagrama (3) Diagramas de actividades (2) Diagramas de colaboraciones (2) Diagramas de secuencias (2) Digital (2) Diplomado (2) Disco (29) Disco Duro (4) Diseño de aplicaciones de Windows 8 en HTML 5 (7) Dispositivos Electrónicos (11) Doctorado (2) Ejemplos de algoritmos (27) El camino hacia el CSS3 (3) El diseño web flexible (6) El elemento de diseño Canvas (3) El enfoque de los sistemas (3) El flujo de un programa (2) El gran libro de HTML5 - CSS3 y Javascript - Autor: Juan Diego Gauchat (55) El principio de organicidad (7) Electrónica (2) Elementos de un sistema (5) Empresas (2) Entrada y salida (4) Entropía y neguentropía (7) Estrategia (2) Estructura de un programa Java (12) Estructuras de almacenamiento (10) Estructuras de control (6) Estructuras de las tablas en SQL Server (2) Estructuras fundamentales de los datos (2) Ethernet (21) Evolución y Familias de los Microprocesadores (15) Exámen (23) Exploración de la red (23) Extensión de clases (4) Facebook (4) Familia Intel (15) Forefront (8) Función (3) Funciones de una red (12) Funciones de una red informática (1) Fundamentos de C# para absolutos principiantes (17) Fundamentos de programación en Java (50) Generaciones de la computadora (5) Gestión (3) Gestión de riesgos - Auditoría de Sistemas (1) GONZALO MARTÍNEZ (1) Grupos Facebook (1) Harvard (29) Historia de las computadoras (11) HTML5 y CSS3 - Autor: Christophe Aubry (99) HTML5 y CSS3 aplicadal texto (7) HTML5 y CSS3 para los formularios (15) Imágenes (2) Implementación de Windows 7 (11) Información (31) Informática (29) Ingeniería (4) Instalar (29) Inteligencia (2) Inteligencia de Negocios con SQL Server (3) Intermedio (23) Internet (29) Internet Explorer 9 (3) Introducción a ASP.NET 5 (8) Introducción a Java (7) Introducción a jQuery (8) Introducción a la Auditoría de Sistemas (2) Introducción a la teoría general de sistemas (Oscar Johansen Bertoglio) (39) Introducción a Networking (2) Introducción a Window Forms (5) Introducción al acceso a datos con ADO .NET (9) Investigación de Operaciones (12) Java (52) Jump Start de consultas en las bases de datos de Microsoft SQL Server 2012 (8) La definición de un Sistema (6) La evolución del HTML y del CSS (3) La nueva sintaxis HTML5 (12) LA QUINTA DISCIPLINA en la práctica (Autor : Peter Senge) (28) Las animaciones en CSS3 (5) Las transformaciones CSS3 (11) Las transiciones con CSS3 (8) Licenciamiento Microsoft (3) Local Area Network (LAN) - Red de Area Local (2) Lógico (2) Los elementos de la estructura en html5 (9) Los elementos multimedia: audio y vídeo (2) Los estilos de caja en CSS3 (13) Los nuevos selectores de CSS3 (6) Maestría (2) Mantenimiento de Mouse y Teclado (2) Manual de Microsoft SQL Server - Full Transact SQL (68) Manual de soporte técnico para escuelas sobre windows 7 (42) Marco Teorico de Investigación de Operaciones (6) Medios de Almacenamiento (11) Medios de Networking (2) Mejorando la Interface de las Aplicaciones Windows (26) Memoria Tipos y Clases (5) Método (2) Metodología (1) Microsoft (324) Microsoft Lync 2010 (7) Microsoft Silverlight 4.0 (2) Microsoft Virtual Academy (356) Modelo (2) Modelo OSI y TCP-IP (2) Modelos con poco grado de dificultad de Programación Lineal - Investigación de Operaciones (13) Modelos con razonable grado de dificultad de Programación Lineal - Investigación de Operaciones (10) Modelos de desafio de Programación Lineal - Investigación de Operaciones (5) Modelos difíciles de Programación Lineal - Investigación de Operaciones (5) Modelos Fáciles de Programación Lineal - Investigación de Operaciones (13) Modelos lineales con solver (3) Modulo (23) Movimiento (2) Mozilla (29) MS SQL Server (77) MS Virtualization para Profesionales VMware - Gestión (3) MS Virtualization para Profesionales VMware- Plataforma (4) MVA (263) Negocio (2) Nivel Avanzado Desarrollo .Net (6) Nivel Básico Desarrollo .Net (11) Nivel Intermedio Desarrollo .Net (8) Normas técnicas peruanas y su evolución - Auditoría de Sistemas (1) Nube Privada - Avanzado (6) Nube Privada - Básico (6) Nube Privada - Intermedio (6) Office 365 (3) Optimización de Escritorio (10) Optimización de Escritorio - Avanzado (4) Optimización de Escritorio - Básico (3) Optimización de Escritorio - Intermedio (3) ORACLE 10g - ADMINISTRACIÓN Y ANÁLISIS (3) Oracle 10g y el Grid Computing (3) Organización aleatoria y secuencial (1) Partes principales de la Mainboard (12) Perceptron (2) Perfil (2) Periféricos de Entrada / Salida (15) Pesi (2) PHP y MySQL - Manual de aprendizaje para crear un sitio web - Autor : Olivier ROLLET (79) Plan (2) Plataforma (29) PMBOK (24) PMBOK - Guía de los fundamentos para la dirección de proyectos (24) PMBOK - INFLUENCIA DE LA ORGANIZACIÓN Y CICLO DE VIDA DEL PROYECTO (6) PMBOK - Introducción (11) PMBOK - PROCESOS DE LA DIRECCIÓN DE PROYECTOS (5) Prevención - Herramientas e Instrumentos de Medida (9) Principios básicos de enrutamiento y switching (218) Proceso (2) Proceso de auditoría de sistemas informáticos (2) Programación en Android - Auor : Salvador Gómez Oliver (46) Programación paso a paso de C# - Autor : Nacho Cabanes (16) Protocolos y comunicaciones de red (17) Proyecto (2) Qué es un sistema (4) Red de Área Local Inalámbrica (WLAN) (4) Redes (30) Redes inalámbricas - WIRELESS - Conocimiento general (15) Redes neuronales (2) Redes y Comunicaciones (45) Reparación de Fuentes - UPS - Estabilizadores (10) Reparación de Impresoras (9) Reparación de Monitores (16) Router (29) Seguridad en la Nube (3) Seminario (23) Server (24) Sharepoint 2010 - Nivel Básico (6) Sharepoint 2010 - Niveles Avanzados (18) Sharepoint 2010 - Niveles Avanzados - Básico (8) Sharepoint 2010 - Niveles Avanzados - Intermedio (9) Sinergia y recursividad (4) Sistema (33) Sistema de Cableado Estructurado (9) Software (30) SOLUCIÓN GRÁFICA DE MODELOS DE PROGRAMACIÓN LINEALES - INVOPE (8) Soporte a Infraestructura (3) SQL (38) SQL Azure - Introducción (3) Subsistemas de control (4) Tablas (4) Tarjeta Principal del Sistema (10) Tarjetas de Interfaces (7) Tecnología (31) Tecnologías LAN (1) TEORÍA GENERAL DE SISTEMAS (1) Tic (2) Tipo (2) TML5 y CSS3 - Autor: Christophe Aubry (12) Trabajando con el Formulario (7) Un diseño HTML5/CSS3: dConstruct 2011 (3) Un diseño HTML5/CSS3: FlipThru (2) Un diseño HTML5/CSS3: The Cat Template (2) Usando Controles Windows Forms (12) Usando Herramientas de Datos de Visual Studio (6) Ventas (2) Virtualización Hyper - V Nivel Básico (5) Virtualización Hyper - V Nivel Intermedio (5) What’s New in Windows 8.1 Security (4) Window (29) Windows 7 Segunda Fase - AVANZADO (4) Windows 7 Segunda Fase - BÁSICO (6) Windows 7 Segunda Fase - INTERMEDIO (4) Windows 8 - Vista Previa (4) Windows 8.1 To Go (2) Windows Azure (3) Windows Phone 7 (2) Windows Server 2008 R2 (3) Windows Server 2012 - Gestión y Automatización (3) Windows Server 2012 R2 Essentials (7) Windows Server 2012: Almacenamiento (5) Windows Server 2012: Identidad y Acceso (4) Windows Server 2012: Revisión Técnica (7) Xamarin (1)

Páginas vistas en total según Google