programación-ing-primer parcial

65
Programación para Ingenieros PRIMER PARCIAL Integrantes: 1. Adriana Carolina Lobato Jesús 2. David Gustavo Silván Acosta 3. Domingo Alejandro Niño Fierro 4. Fabiola Fernanda Salinas Villegas 5. Irving Alberto Olán Olguín 6. José Miguel Frías Fraire 7. María Fernanda Lastra Ledezma 8. María José Lule Velásquez 9. Roselem Karina Vera Collado 10.Rufino Antonio Bahena Lino 11.Sergio Francisco Pérez Gallegos Profesor: Ing. Gerardo Antonio Alipi Mena

Upload: alfredo-gonzalez

Post on 06-Dec-2015

241 views

Category:

Documents


0 download

DESCRIPTION

programación para ingenieros, básicos para programadores

TRANSCRIPT

Programación para Ingenieros PRIMER  PARCIAL  

Integrantes:     1. Adriana Carolina Lobato Jesús

2. David Gustavo Silván Acosta 3. Domingo Alejandro Niño Fierro 4. Fabiola Fernanda Salinas Villegas 5. Irving Alberto Olán Olguín 6. José Miguel Frías Fraire 7. María Fernanda Lastra Ledezma 8. María José Lule Velásquez 9. Roselem Karina Vera Collado 10.Rufino Antonio Bahena Lino 11.Sergio Francisco Pérez Gallegos

Profesor: Ing. Gerardo Antonio Alipi Mena

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

PRIMER PARCIAL

1. Introducción

La programación informática, acortada como programación, es el proceso de

diseñar, codificar, depurar y mantener el código fuente de programas computacionales.

El código fuente es escrito en un lenguaje de programación. El propósito de la

programación es crear programas que exhiban un comportamiento deseado. El proceso

de escribir código requiere frecuentemente conocimientos en varias áreas distintas,

además del dominio del lenguaje a utilizar, algoritmos especializados y lógica formal.

Programar no involucra necesariamente otras tareas tales como el análisis y diseño de

la aplicación (pero sí el diseño del código), aunque sí suelen estar fusionadas en el

desarrollo de pequeñas aplicaciones.

Del proceso de programación surge lo que comúnmente se conoce

como software (conjunto de programas), aunque estrictamente este último abarca

mucho más que solo la programación.

1.1 Arquitectura de una Computadora.

La arquitectura de computadoras es el diseño conceptual y la estructura

operacional fundamental de un sistema de computadoras. Es decir, es un modelo y una

descripción funcional de los requerimientos y las implementaciones de diseño para

varias partes de una computadora, con especial interés en la forma en que la unidad

central de proceso (CPU) trabaja internamente y accede a las direcciones de memoria.

También suele definirse como la forma de seleccionar e interconectar componentes

de hardware, para crear computadoras según los requerimientos de funcionalidad,

rendimiento y costo.

La computadora recibe y envía la información a través de los periféricos, por medio de

los canales. La CPU es la encargada de procesar la información que le llega a la

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

computadora. El intercambio de información se tiene que hacer con los periféricos y la

CPU. Puede considerarse que todas aquellas unidades de un sistema, exceptuando la

CPU, se denomina periférico, por lo que la computadora tiene dos partes bien

diferenciadas, que son:

1. la CPU (encargada de ejecutar programas y que también se considera

compuesta por la memoria principal, la unidad aritmético lógica y la unidad de

control), y

2. los periféricos (que pueden ser de entrada, salida, entrada/salida,

almacenamiento y comunicaciones).

Diagrama de una computadora

El concepto de arquitectura en el entorno informático proporciona una descripción de

la construcción y distribución física de los componentes de la computadora.

La arquitectura de una computadora explica la situación de sus componentes y permite

determinar las posibilidades de que un sistema informático, con una determinada

configuración, pueda realizar las operaciones para las que se va a utilizar.

Los sistemas informáticos se dividen físicamente en la unidad central del sistema y

los periféricos que permiten conectarlo al mundo exterior.

La Unidad Central del Sistema es un habitáculo en forma de caja donde se sitúa el

«cerebro» de la computadora, esto es, la unidad central de proceso (CPU), así como

los distintos componentes que van a ayudar al sistema informático en sus operaciones

habituales (bus, memorias, fuentes de alimentación eléctrica, etcétera).

Unidad Central del Sistema La Unidad Central del Sistema (System Unit en inglés) es el centro de

operaciones de cualquier computadora existente en el mercado actual. En la unidad

central del sistema se alojan los componentes y circuitería que van a realizar las tareas

fundamentales de la computadora.

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

Unidad Central de Proceso La Unidad Central de Proceso es el lugar donde se realizan las operaciones de

cálculo y control de los componentes que forman la totalidad del conjunto del sistema

informático.

Las CPU de las actuales computadoras son microprocesadores construidos sobre un

cristal de silicio semiconductor donde se crean todos los elementos que forman un

circuito electrónico (transistores, etc.) y las conexiones necesarias para formarlo.

El microcircuito se encapsula en una pastilla de plástico con una serie de conexiones

hacia el exterior, en forma de patillas metálicas, que forman su nexo de unión al resto

del sistema informático. Estas pastillas de plástico, con una multitud de patillas de

conexión metálicas, reciben el nombre de chips.

El microprocesador central de una computadora se divide en:

• Unidad de Control (Control Unit o CU en inglés).

• Unidad Aritmético-Lógica (Aritmethic Control Unit o ALU en inglés).

• Registros.

La Unidad de Control maneja y coordina todas las operaciones del sistema informático,

dando prioridades y solicitando los servicios de los diferentes componentes para dar

soporte a la unidad aritmético-lógica en sus operaciones elementales.

La Unidad Aritmético-Lógica realiza los diferentes cálculos matemáticos y lógicos que

van a ser necesarios para la operatividad de la computadora; debe recordarse que todo

el funcionamiento del sistema de una computadora se realiza sobre la base de una

serie de operaciones matemáticas en código binario.

Los Registros son una pequeña memoria interna existente en la CPU que permiten a la

ALU el manejo de las instrucciones y los datos precisos para realizar las diferentes

operaciones elementales.

Unidad de Control (CU)

Es la parte de la unidad central de proceso que actúa como coordinadora de

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

todas las tareas que ha de realizar la computadora. Asimismo, se encarga de manejar

todas las órdenes que la computadora necesita para realizar la ejecución de las

operaciones requeridas por los programas de aplicación.

Sus funciones Básicas son:

1. Manejar todas las operaciones de acceso, lectura y escritura a cada una de las

posiciones de la memoria principal donde se almacenan las instrucciones necesarias

para realizar un proceso.

2. Interpretar la instrucción en proceso.

3. Realizar las tareas que se indican en la instrucción.

Unidad Aritmética y Lógica (ALU)

Su misión es realizar las operaciones con los datos que recibe, siguiendo las

indicaciones dadas por la unidad de control.

El nombre de unidad aritmética y lógica se debe a que puede realizar operaciones tanto

aritméticas como lógicas con los datos transferidos por la unidad de control.

La unidad de control maneja las instrucciones y la aritmética y lógica procesa los datos.

Para que la unidad de control sepa si la información que recibe es una instrucción o

dato, es obligatorio que la primera palabra que reciba sea una instrucción, indicando

la naturaleza del resto de la información a tratar.

Para que la unidad aritmética y lógica sea capaz de realizar una operación aritmética,

se le deben proporcionar, de alguna manera, los siguientes datos:

1. El código que indique la operación a efectuar.

2. La dirección de la celda donde está almacenado el primer sumando.

3. La dirección del segundo sumando implicado en la operación.

4. La dirección de la celda de memoria donde se almacenará el resultado.

Registros

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

Los Registros son un medio de ayuda a las operaciones realizadas por la unidad

de control y la unidad aritmética y lógica. Permiten almacenar información,

temporalmente, para facilitar la manipulación de los datos por parte de la CPU.

Realizando una similitud con el resto del sistema informático, los registros son a la CPU

como la memoria principal es a la computadora.

Los registros se dividen en tres grupos principales:

• Registros de Propósito General.

• Registros de Segmento de Memoria.

• Registros de Instrucciones.

Memoria Principal La Memoria Principal es la zona de la unidad central de sistema que almacena la

información, en forma de programas y datos, que se va a procesar seguidamente o va a

servir de apoyo a las diferentes operaciones que se van a efectuar por la computadora.

La posibilidad del proceso inmediato de la información que almacena la memoria

principal es su característica fundamental, ya que, mientras que los datos existentes en

la memoria principal pueden ser procesados de inmediato por la unidad central de

proceso, la información contenida en la memoria auxiliar (discos, cintas, etc.) no puede

ser procesada directamente por la unidad central de proceso.

La memoria principal está conectada directamente a los buses, que son su medio

de comunicación con la unidad central de proceso del sistema informático. La cantidad

de memoria existente en una computadora se verá limitada por la capacidad de

direccionamiento del bus; esto forma el Mapa de Memoria.

La memoria principal está compuesta lógicamente por una serie de celdas de bits que

permiten almacenar en cada una de ellas un bit de información en código binario (0, 1)

que será parte de un dato o una instrucción.

Para poder identificar cada una de las celdas de la memoria, éstas se numeran; a este

número se le llama dirección y es el medio a través del cual la unidad de control puede

manejar la información.

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

Las direcciones de la memoria se localizan a través del mapa de memoria. La dirección

de cada celda de la memoria se establece por una matriz en la que los parámetros son

el número total de direcciones y la longitud de palabra que maneja el sistema

informático. Esto supone una limitación, ya que la computadora sólo puede manejar un

número limitado de bits de dirección en sus operaciones de direccionamiento.

La Palabra representa la cantidad de bits de información manejada en paralelo por la

computadora. Tamaños típicos de palabras son 8 bits, 16 bits, 32 bits, etc.

Una vez localizada la dirección de la celda de memoria se podrán realizar dos

operaciones: leer la información existente en ella o bien escribir nueva información para

poder ser almacenada y posteriormente procesada.

Para poder determinar si el sistema informático va a leer o escribir se utiliza el registro

de datos. El registro de datos es un bit que, según el valor de la información que

contenga (0,1) indica a la unidad de control si se va a leer o escribir en el acceso a la

memoria que se esté realizando en ese momento. En ambos casos, esta operación se

realiza a través del bus de datos.

Cuando la unidad de control lee de la celda de memoria, necesita que se le proporcione

una dirección a la cual ir a leer. La información existente en la celda no se destruye.

Cuando la unidad de control escribe en la celda de memoria, debe recibir dos

informaciones: la dirección de la memoria donde escribir y la información que se debe

escribir propiamente dicha. La información existente en la celda de memoria

previamente se destruye, ya que lo que había escrito se sustituye por una nueva

información.

La memoria principal se divide fundamentalmente en dos partes: Volátil y No Volátil.

La Memoria Volátil pierde la información almacenada en su interior si el sistema

informático que la soporta es apagado. Esta parte de la memoria principal se conoce

como RAM (Memoria de Acceso Aleatorio o Random Access Memory).

La parte de la Memoria principal que No es Volátil es la ROM (Memoria de Sólo Lectura

o Read Only Memory). Esta memoria es de sólo lectura y la computadora no puede

escribir sobre ella. Su función principal es el arranque del sistema informático.

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

Las Memorias Volátiles pueden ser estáticas, también llamadas RAM (Memorias de

Acceso Aleatorio o Random Access Memory), o dinámicas, denominadas en este caso

DRAM (Memorias Dinámicas de Acceso Aleatorio o Dinamic Random Access Memory).

Más adelante se verán más detenidamente.

Las Memorias No Volátiles se dividen en memorias de Sólo Lectura (ROM) y en otras

que permiten la Manipulación de la Información que contienen por

diversos medios especiales que se verán más adelante.

Generalmente, la memoria que posee una computadora recién adquirida no es la

máxima que el bus puede direccionar, por lo que la memoria principal puede ampliarse

incrementando el número de unidades de memoria conectadas. Conviene recordar que

las placas de memoria son un factor fundamental en el costo total de adquisición del

sistema informático.

La memoria se divide en varias capas o niveles con una estructura cuya forma puede

recordarnos a una estructura piramidal.

Nombre Tamaño Máximo Tiempo de Acceso

Registros Hasta 200 Bytes Menos de 10 Nanosegundos

Memoria Caché Hasta 512 Bbytes Entre 10 y 30 Nanosegundos

Memoria Principal Más de 1 Gigabyte Entre 30 y 100 Nanosegundos

Memoria de Acceso Aleatorio (RAM) Las Memorias de Acceso Aleatorio (RAM: Random Access Memory) son

memorias construidas sobre semiconductores donde la información se almacena en

celdas de memoria que pueden adquirir uno cualquiera de los dos valores del código

binario.

Las memorias de acceso aleatorio son memorias en la que se puede leer y escribir

información. Permite el acceso a cualquier información que contenga con la

misma velocidad. Esto significa que se puede acceder aleatoriamente a cualquier

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

información almacenada sin que se afecte la eficiencia del acceso. Contrasta con las

memorias secuenciales, por ejemplo una cinta magnética, donde la facilidad de acceso

a una información depende del lugar de la cinta donde esté almacenada.

Las tecnologías de memorias RAM se basan en Celdas de Memoria. La memoria RAM

es volátil, esto es, cuando se corta la alimentación eléctrica se pierde toda la

información que estuviera almacenada en este tipo de memoria. La comunicación de la

RAM con la CPU se realiza a través del Bus de Direcciones y el Bus de Datos.

La memoria RAM se utiliza tanto para almacenar temporalmente programas y datos

como para guardar los resultados intermedios que se están manipulando durante un

proceso.

Una celda de memoria concreta de la RAM se puede referenciar con una dirección de

Segmento de Memoria y un valor determinado dentro de ese segmento llamado

«desplazamiento».

La RAM está dividida en segmentos de memoria para facilitar su manejo por la unidad

de control. Los segmentos de memoria tienen un tamaño múltiplo de 16, de 0 a F en

Hexadecimal. El rango total varía desde 0000 hasta un valor Hexadecimal que depende

de la cantidad de semiconductores de memoria RAM con la que se haya configurado el

sistema de la computadora.

Los segmentos de memoria se agrupan en diferentes Áreas de Trabajo que permiten

delimitar las diversas funciones que se realizan en la memoria.

Las áreas de la memoria son:

• Memoria Convencional se Divide en:

ü Memoria Baja.

ü Memoria Alta.

• Memoria Extendida.

Existen dos tipos de memorias RAM:

• RAM Estáticas.

• RAM Dinámicas (DRAM).

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

Memoria ROM La ROM (Read Only Memory) es una «Memoria Sólo de Lectura». En ella sólo se

puede leer la información que contiene, no es posible modificarla. En este tipo de

memoria se acostumbra a guardar las instrucciones de arranque y el funcionamiento

coordinado de la computadora.

Físicamente, las memorias ROM son cápsulas de cristales de silicio. La información

que contienen se graba de una forma especial por sus fabricantes o empresas muy

especializadas.

Las memorias de este tipo, al contrario que las RAM, no son volátiles, pero se pueden

deteriorar a causa de campos magnéticos demasiado potentes.

La comunicación con el procesador se realiza, al igual que en las memorias RAM, a

través de los buses de direcciones y datos.

Al existir sólo la posibilidad de lectura, la señal de control, que en la RAM se utilizaba

para indicar si se iba a leer o escribir, sólo va a intervenir para autorizar la utilización de

la memoria ROM.

Además de las ROM, en las que sólo puede grabar información el fabricante de la

memoria, existen otros tipos de memorias no volátiles que se pueden modificar de

diversas formas y son de una flexibilidad y potencia de uso mayor que las simples

ROM. La utilización de este tipo de memorias permite a los usuarios configurar

computadoras dedicadas a tareas concretas, modificando simplemente

la programación de los bancos de memoria del sistema informático. Estas memorias

son:

• PROM (Programable Read Only Memory o Memoria Programable Sólo de Lectura).

• EPROM (Erasable-Programable Read Only Memory o Memoria Borrable y

Programable Sólo de Lectura).

• EEPROM (Electrically Erasable-Programable Read Only Memory o Memoria Borrable

y Programable Eléctricamente Sólo de Lectura).

Memoria Caché

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

La Memoria Caché es una zona especial de la memoria principal que se

construye con una tecnología de acceso mucho más rápida que la memoria RAM

convencional. La velocidad de la caché con respecto a la memoria RAM convencional

es del orden de 5 a 10 veces superior.

A medida que los microprocesadores fueron haciéndose más y más rápidos comenzó a

producirse una disfunción con la velocidad de acceso a la memoria de trabajo que se

conectaba a ellos en el sistema informático.

Cada vez que el microprocesador del sistema informático accede a la memoria RAM

para leer o escribir información tiene que esperar hasta que la memoria RAM está lista

para recibir o enviar los datos. Para realizar estas operaciones de lectura y escritura

más rápidamente se utiliza un subsistema de memoria intermedia entre el

microprocesador y la memoria RAM convencional que es la denominada memoria

caché.

El funcionamiento de la memoria caché se basa en que al cargar una información en la

memoria principal (sean instrucciones o datos) ésta se carga en zonas adyacentes de la

memoria. El controlador especial situado dentro del subsistema de la memoria caché

será el que determine dinámicamente qué posiciones de la memoria RAM convencional

pueden ser utilizadas con más frecuencia por la aplicación que está ejecutándose en

ese momento y traslada la información almacenada en ellas a la memoria caché.

La siguiente vez que el microprocesador necesite acceder a la memoria RAM

convencional existirá una gran probabilidad de que la información que necesita

encontrar se encuentre en las direcciones de memoria adyacentes a las ya utilizadas.

Como estas direcciones de memorias adyacentes ya se encuentran almacenadas en la

memoria caché, el tiempo de acceso a la información disminuye en gran medida.

La utilización de algoritmos estadísticos de acceso a los datos permiten

una gestión mucho más racional del manejo de la memoria RAM convencional,

disminuyendo los tiempos de acceso a la memoria convencional y acercando ese

tiempo de acceso al de la propia caché.

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

La memoria caché carga en su área de memoria propia el segmento de la memoria

principal contiguo al que se está procesando. Debido a que, estadísticamente, existe

una gran probabilidad de que la siguiente área de memoria que necesite la aplicación

que está corriendo en ese momento sea la que se encuentra en el área de la caché, se

optimiza el tiempo de acceso a la memoria, ya que debe recordarse que el acceso a la

memoria caché es mucho más rápido que el acceso a la memoria RAM convencional.

El tamaño de las memorias caché más habituales oscila entre los 8 y los 64 kbytes.

Buses El Bus es la vía a través de la que se van a transmitir y recibir todas las

comunicaciones, tanto internas como externas, del sistema informático.

El bus es solamente un Dispositivo de Transferencia de Información entre los

componentes conectados a él, no almacena información alguna en ningún momento.

Los datos, en forma de señal eléctrica, sólo permanecen en el bus el tiempo que

necesitan en recorrer la distancia entre los dos componentes implicados en la

transferencia.

En una unidad central de sistema típica el bus se subdivide en tres buses o grupos de

líneas.

• Bus de Direcciones.

• Bus de Datos.

• Bus de Control.

Arquitecturas de Bus

Dependiendo del diseño y la tecnología que se utilice para construir el bus de una

microcomputadora se pueden distinguir tres arquitecturas diferentes:

• La Arquitectura ISA (Industry Standard Architecture en inglés) es la arquitectura

con que se construyó el bus de los microcomputadores AT de IBM.

• La Arquitectura MCA (MicroChannel Architecture en inglés) tuvo su origen en

una línea de microcomputadoras fabricadas por IBM, las PS/2 (PS significa

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

Personal System).

• La Arquitectura EISA (Extended Industry Standard Architecture en inglés)

Reloj El reloj de una computadora se utiliza para dos funciones principales:

1. Para sincronizar las diversas operaciones que realizan los diferentes

subcomponentes del sistema informático.

2. Para saber la hora.

El reloj físicamente es un circuito integrado que emite una cantidad de pulsos por

segundo, de manera constante. Al número de pulsos que emite el reloj cada segundo

se llama Frecuencia del Reloj.

La frecuencia del reloj se mide en Ciclos por Segundo, también llamados Hertzios,

siendo cada ciclo un pulso del reloj. Como la frecuencia del reloj es de varios millones

de pulsos por segundo se expresa habitualmente en Megaherzios.

El reloj marca la velocidad de proceso de la computadora generando una señal

periódica que es utilizada por todos los componentes del sistema informático para

sincronizar y coordinar las actividades operativas, evitando el que un componente

maneje unos datos incorrectamente o que la velocidad de transmisión de datos entre

dos componentes sea distinta.

Tarjetas De Expansión Interna Las Tarjetas de Expansión están diseñadas y dedicadas a actividades

específicas, como pueden ser las de controlar la salida de vídeo de la

computadora, gráficas, comunicaciones, etc.

Las tarjetas de expansión no forman parte de la unidad central de proceso, pero están

conectadas directamente a ésta a través del bus, generalmente dentro de la propia caja

de la unidad central del sistema, y controladas por la CPU en todas sus operaciones.

Las tarjetas de expansión complementan y ayudan a la placa base y, por tanto, al

microprocesador central descargándole de tareas que retardarían los procesos de la

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

CPU, añadiendo al mismo tiempo una serie de posibilidades operativas que no estaban

previstas en los primeros modelos de computadoras.

Tarjetas Controladoras de Periféricos Las Tarjetas de Expansión Controladoras de Periféricos son placas que

contienen circuitos lógicos y que se conectan al bus de datos para recibir la información

que la CPU envía hacia los periféricos almacenándola en Buffers, esto es, una serie de

Memorias Intermedias que actúan como amortiguadoras de los flujos de datos que se

transmiten en el interior del sistema informático y descargan al procesador principal del

control del tráfico de señales y datos entre el procesador y los periféricos exteriores.

Las tarjetas de expansión controladoras de periféricos más importantes son:

• Las Tarjetas de Expansión Controladoras del Modo de Vídeo.

• Las Tarjetas de Expansión Controladoras de Entrada/Salida de Datos.

• Las Tarjetas de Expansión Controladoras de Comunicaciones.

Tarjetas de Expansión Controladoras del Modo de Video Este tipo de tarjetas de expansión son también llamadas Tarjetas Gráficas. Las

tarjetas gráficas van a proporcionar diferentes clases de calidad en la información que

el sistema informático va a poder mostrar en su pantalla.

La información que la computadora va a representar en su pantalla se encuentra en una

zona de la memoria RAM que alimenta periódicamente al cañón de electrones, a través

de la tarjeta controladora del modo gráfico, de los datos necesarios para representar la

información almacenada en la pantalla del sistema informático.

La pantalla de la computadora se refresca, esto es, modifica el dibujo que aparece en

ella con una periodicidad de entre 50 y 80 veces por segundo. El dibujo que aparece en

la pantalla del sistema informático es el almacenado en la memoria de vídeo de la

computadora y que la tarjeta gráfica recibe para manejar los datos y enviarlos hacia la

pantalla del sistema informático.

Cuando la tarjeta de vídeo envía la información almacenada en la memoria hacia la

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

pantalla de la computadora, estos datos pasan por un convertidor digital/analógico para

convertirse en una señal eléctrica compatible con la necesaria para que el componente

de generación de imágenes de la pantalla del sistema informático (cañón de rayos,

LCD, etc.) forme la imagen en la pantalla de la computadora.

Tipos de tarjetas gráficas más conocidas:

• La tarjeta Gráfica Hércules (diseñadas por Hercules Corp)

• La tarjeta gráfica CGA (Color Graphics Adapter-Adaptador de Gráficos Color)

• La tarjeta gráfica EGA (Enhanced Graphics Adapter-Adaptador Mejorado de

Gráficos)

• La tarjeta Gráfica MCGA (Microchannel Graphics Adapter - Adaptador Gráfico

Microchannel)

• La Tarjeta Gráfica VGA (Video Graphics Adapter - Adaptador Vídeo de Gráficos)

• La tarjeta gráfica SVGA (Super Video Graphics Adapte - Super Adaptador Vídeo

de Gráficos)

• Las tarjetas Controladoras de Entrada y Salida de Datos

Tarjetas Controladoras de Comunicaciones Las Tarjetas Controladoras de comunicaciones son unidades que permiten la

conexión de una computadora central, denominada sistema central o servidor, con una

serie de computadoras menos potentes que utilizan parte de los recursos del servidor

para aumentar su operatividad.

La conexión se produce a través de una serie de Enlaces que unen todas las

computadoras entre sí formando una Red de Comunicaciones.

Si los sistemas informáticos que constituyen esta red de comunicaciones se encuentran

en una zona no muy extensa, no mayor que un edificio, la red se denomina Red de

Área Local (LAN - Local Area Network).

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

Si la red de comunicaciones tiene una extensión mayor y se utilizan los servicios de las

compañías telefónicas para enlazar las diferentes computadoras que componen la red,

ésta se denomina Red de Área Extensa (WAN-Wide Area Network).

Las tarjetas controladoras de comunicaciones más comunes son las tarjetas de

conexión a redes de área local. Este tipo de tarjetas de comunicaciones se estudiarán

más adelante en un apartado específico dedicado a ella; sin embargo, se puede

adelantar aquí que las tarjetas controladoras de comunicaciones se dividen en dos

grupos principales:

• Tarjetas de conexión a redes locales (LAN).

• Tarjetas de expansión módem (para redes de comunicaciones extensas).

1.1.1.Progrma = CODIGO + DATOS

El programa tiene un formato ejecutable que la computadora puede utilizar

directamente para ejecutar las instrucciones. El mismo programa en su formato de

código fuente legible para humanos, del cual se derivan los programas ejecutables (por

ejemplo, compilados), le permite a un programador estudiar y desarrollar sus

algoritmos. Una colección de programas de computadora y datos relacionados se

conoce como software.

Generalmente, el código fuente lo escriben profesionales conocidos como

programadores de computadora.3 Este código se escribe en un lenguaje de

programación que sigue uno de los siguientes dos paradigmas: imperativo o

declarativo, y que posteriormente puede ser convertido en un archivo ejecutable

(usualmente llamado un programa ejecutable o un binario) por un compilador y más

tarde ejecutado por una unidad central de procesamiento. Por otra parte, los programas

de computadora se pueden ejecutar con la ayuda de un intérprete, o pueden ser

empotrados directamente en hardware.

De acuerdo a sus funciones, los programas informáticos se clasifican en software de

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

sistema y software de aplicación. En las computadoras actuales, al hecho de ejecutar

varios programas de forma simultánea y eficiente, se le conoce como multitarea.

1.1.1.1. Clasificaciones

Los lenguajes de programación se pueden clasificar de acuerdo con diversos

criterios. El criterio más simple que se puede considerar hace referencia a la proximidad

del lenguaje con la máquina o con el lenguaje natural. De acuerdo con este criterio,

existen tres niveles:

• Lenguajes de bajo nivel: Lenguajes máquina.

• Lenguajes de nivel medio: Lenguajes ensambladores y macroensambladores.

• Lenguajes de alto nivel: El resto de los lenguajes, a los que ya hemos hecho

referencia.

Dado que los lenguajes de programación, en cierto modo, han tenido un desarrollo

paralelo a la evolución de los ordenadores, se pueden clasificar atendiendo a su

desarrollo histórico. Esta clasificación distingue cinco generaciones de lenguajes:

• Primera generación: Lenguajes máquina.

• Segunda generación: Ayudas a la programación, como los ensambladores.

• Tercera generación: Lenguajes de alto nivel imperativos, que siguen vigentes

en la actualidad, como Pascal, Modula• 2, Fortran, Cobol, C y Ada.

• Cuarta generación: Lenguajes o entornos de programación orientados

básicamente a aplicaciones de gestión y bases de datos, como SQL, Natural, etc.

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

• Quinta generación: Lenguajes orientados a aplicaciones en Inteligencia

Artificial, como Lisp y Prolog.

1.1.1.1.1. Software de Aplicaciones y de Sistemas

El software es la parte lógica de computadora, que permite el manejo de los

recursos y la realización de tareas especificas, también denominados programas.

Se clasifica en 2 partes:

1. SOFTWARE DE SISTEMAS: Son aquellos programas que permiten la administración

de la parte física o los recursos de la computadora, es la que interactúa entre el usuario

y los componentes hardware del ordenador. Se clasifican el Sistemas Operativos

Monousuarios y Multiusuarios.

2. SOFWARE DE APLICACIÓN: Son aquellos programas que nos ayudan a tareas

especificas como edición de textos, imágenes, cálculos, etc. también conocidos como

aplicaciones.

1.1.1.1.2. Niveles de los Lenguajes

Los lenguajes de programación se clasifican por su nivel de abstracción

del procesador, en este caso la abstracción es un principio por el cual se aísla toda

aquella información que no es resulta relevante a un determinado nivel

de conocimiento.

Lenguaje de bajo nivel: es el que proporciona poca o ninguna abstracción

del microprocesador de un ordenador. Consecuentemente es fácilmente trasladado a

lenguaje de máquina.

En general se utiliza este tipo de lenguaje para programar controladores (drivers).

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

Ventajas

Mayor adaptación al equipo.

Posibilidad de obtener la máxima velocidad con mínimo uso de memoria.

Inconvenientes

Imposibilidad de escribir código independiente de la máquina.

Mayor dificultad en la programación y en la comprensión de los programas.

El programador debe conocer más de un centenar de instrucciones.

Es necesario conocer en detalle la arquitectura de la máquina.

Características

Se trabaja a nivel de instrucciones, es decir, su programación es al más fino detalle.

Está orientado a la máquina.

Lenguaje de medio nivel: es un lenguaje de programación informática como

el lenguaje C, que se encuentran entre los lenguajes de alto nivel y los lenguajes de

bajo nivel.

Suelen ser clasificados muchas veces de alto nivel, pero permiten ciertos manejos de

bajo nivel. Son precisos para ciertas aplicaciones como la creación de sistemas

operativos, ya que permiten un manejo abstracto (independiente de la máquina, a

diferencia del ensamblador), pero sin perder mucho del poder y eficiencia que tienen los

lenguajes de bajo nivel.

Una característica distintiva, por ejemplo, que convierte a C en un lenguaje de medio

nivel y al Pascal en un lenguaje de alto nivel es que en el primero es posible manejar

las letras como si fueran números (en Pascal no), y por el contrario en Pascal es

posible concatenar las cadenas de caracteres con el operador suma y copiarlas con la

asignación (en C es el usuario el responsable de llamar a

las funciones correspondientes).

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

Una de las características más peculiares del lenguaje de programación C; es el uso de

"apuntadores", los cuales son muy útiles en la implementación de algoritmos como

Listas ligadas, Tablas Hash y algoritmos de búsqueda y ordenamiento que para otros

lenguajes de programación (como Java por ejemplo) les suele ser un poco más

complicado implementar

Los lenguajes de alto nivel: se caracterizan por expresar los algoritmos de una

manera adecuada a la capacidad cognitiva humana, en lugar de a la capacidad

ejecutora de las máquinas.

En los primeros lenguajes de alto nivel la limitación era que se orientaban a un área

específica y sus instrucciones requerían de una sintaxis predefinida. Se clasifican como

lenguajes procedimentales.

Otra limitación de los lenguajes de alto nivel es que se requiere de ciertos

conocimientos de programación para realizar las secuencias de instrucciones lógicas.

Los lenguajes de muy alto nivel se crearon para que el usuario común pudiese

solucionar tal problema de procesamiento de datos de una manera más fácil y rápida.

1.1.1.1.3. Generaciones de los Lenguajes

Con la programación de los ordenadores que se realiza en lenguajes que suelen

clasificarse en cinco generaciones, de las que las tres primeras son evidentes, mientras

no todo el mundo está de acuerdo en las otras dos.

• Primera generación: Los primeros ordenadores se programaban directamente

en código binario, cada máquina tiene su lenguaje.

• Segunda generación: Los lenguajes simbólicos, asimismo propios de la máquina,

simplifican la escritura de las instrucciones y las hacen más legibles.

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

• Tercera generación: Los lenguajes de alto nivel sustituyen las instrucciones

simbólicas por códigos independientes de la máquina, parecidas al lenguaje

humano o al de las Matemáticas.

• Cuarta generación: Programación Orientada a objetos

• Quinta generación: Inteligencia artificial

1.1.1.1.4. Paradigmas de Programación

Los paradigmas de programación son las formas, que determinan los métodos y

las herramientas que un programador usara en la construcción de un software.

Mayormente los lenguajes de programación están basados en uno o mas paradigmas,

ha esto se le puede llamar multiparadigmas.

También menciona los diferentes tipos de paradigmas que se conocen; pero solamente

se hacen referencia a los mas importante, ya que suelen haber muchos mas que no se

mencionaran en esta investigación.

Un lenguaje de programación puede soportar distintos paradigmas de programación

con el objetivo de que un programador utilice el mas conveniente a la hora de resolver

un problema.

Ni un paradigma es capaz de resolver todos los problemas de forma sencilla y eficiente,

por lo tanto es útil poder elegir entre distintos “estilos” de programación dependiendo

del tipo de problema. También hay lenguajes que permiten mezclar los paradigmas que,

en principio, parecieran irreconciliables. Se debe aclarar que hay subparadigmas que se

incluyen en paradigmas más generales, pero hay otros que se utilizan métodos de

programación totalmente distintos entre si e igualmente hay lenguajes que lo combinan.

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

Paradigma imperativo. Es un paradigma de programación que describe la programación en términos del

estado del programa y sentencias que cambian dicho estado.

Los programas imperativos son un conjunto de instrucciones que le indican al

computador como realizar una tarea.

La implementación del hardware de la mayoría de computadores es imperativa;

prácticamente todo el hardware de los computadores esta diseñado para ejecutar

código de máquina, que es negativa al computador, escrito en una forma imperativa.

Esto se debe que el hardware de los computadores implementa el paradigma de las

máquinas de Turing. Desde esta perspectiva de bajo nivel, el estilo de programación

está definido por los contenidos de la memoria y las sentencias son instrucciones en el

lenguaje de maquina nativo del computador como lo es el lenguaje ensamblador. Los

lenguajes imperativos de alto nivel usan variables y sentencias más complejas, pero a

un siguen el mismo paradigma. Las recetas y las listas de revisión de procesos, a pesar

de no ser programas de computadoras, son también conceptos familiar similares en

estilo a la programación imperativa; cada paso es un instrucción, y el mundo físico

guarda el estado.

Paradigma lógico Se definen reglas lógicas que luego atreves de un motor de inferencias lógicas, resolver

problemas planteados por el Sistema. Algunos programas que utilizan el paradigma

lógico: prologa.

Hay muchos mas paradigmas de programación y cada uno de ellos posee sus ventajas

y desventajas, sin embargo sea el paradigma que elijamos podremos resolver todos los

problemas por caminos diferentes a los demás.

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

Paradigmas orientados a objetos. Este tipo de programación posee como idea principal encapsular estado y operaciones

en objeto. Estos objetos pueden comunicarse entre si, poseen clases y herencia se

puede destacar como ventaja la facilidad de reutilización de código.

Paradigma estructurado. Básicamente el código se divide en bloques, estructuras, que pueden o comunicarse

entre si. Este software se controla con secuencia, selección e integración. Otorga una

mejor compresión del código y permite su reutilización de una forma mas fácil.

Paradigma de programación guiada por eventos. Es un paradigma de programación en el que tanto la escritura como la ejecución de los

programas van determinados por los sucesos que ocurran en el Sistema o que ellos

mismos provoquen.

Mientras que en la programación secuencial es el programador el que define cual va

hacer el flujo del programa, en la programación dirigida por eventos será el propio

usuario, o lo que sea que este accionando el programa, el que dirija el flujo del

programa.

Al comenzar la ejecución del programa se llevara acabo las inicializaciones

correspondiente y a continuación el programa quedara bloqueado hasta que se

produzca un evento.

Cuando alguno de estos eventos tenga lugar, el programa pasara a ejecutar el código

de l correspondiente manejador de evento.

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

1.1.1.2. El primer Programa de Lenguaje

El lenguaje de programación C fue creado por Brian Kernighan y Dennis Ritchie

a mediados de los años 70. La primera implementación del mismo la realizó Dennis

Ritchie sobre un computador DEC PDP-11 con sistema operativo UNIX. C es el

resultado de un proceso de desarrollo que comenzó con un lenguaje anterior, el BCPL,

el cual influyó en el desarrollo por parte de Ken Thompson de un lenguaje llamado B, el

cual es el antecedente directo del lenguaje C. El lenguaje C es un lenguaje para

programadores en el sentido de que proporciona una gran flexibilidad de programación

y una muy baja comprobación de incorrecciones, de forma que el lenguaje deja bajo la

responsabilidad del programador acciones que otros lenguajes realizan por si mismos.

Así, por ejemplo, C no comprueba que el índice de referencia de un vector (llamado

array en la literatura informática) no sobrepase el tamaño del mismo; que no se escriba

en zonas de memoria que no pertenecen al área de datos del programa, etc.

El lenguaje C es un lenguaje estructurado, en el mismo sentido que lo son otros

lenguajes de programación tales como el lenguaje Pascal, el Ada o el Modula-2, pero

no es estructurado por bloques, o sea, no es posible declarar subrutinas (pequeños

trozos de programa) dentro de otras subrutinas, a diferencia de como sucede con otros

lenguajes estructurados tales como el Pascal. Además, el lenguaje C no es rígido en la

comprobación de tipos de datos, permitiendo fácilmente la conversión entre diferentes

tipos de datos y la asignación entre tipos de datos diferentes, por ejemplo la expresión

siguiente es válida en C:

float a; /*Declaro una variable para numeros reales*/ int b; /*Declaro otra variable para

numero enteros*/ b=a; /*Asigno a la variable para entera el numero real*/

Todo programa de C consta, básicamente, de un conjunto de funciones, y una función

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

llamada main, la cual es la primera que se ejecuta al comenzar el programa,

llamándose desde ella al resto de funciones que compongan nuestro programa.

Desde su creación, surgieron distintas versiones de C, que incluían unas u otras

características, palabras reservadas, etc. Este hecho provoco la necesidad de unificar

el lenguaje C, y es por ello que surgió un standard de C, llamado ANSI-C, que declara

una serie de características, etc., que debe cumplir todo lenguaje C. Por ello, y dado

que todo programa que se desarrolle siguiendo el standard ANSI de C será fácilmente

portable de un modelo de ordenador a otro modelo de ordenador, y de igual forma de

un modelo de compilador a otro, en estos apuntes explicaremos un C basado en el

standard ANSI-C.

El lenguaje C posee un número reducido de palabras reservadas (tan solo 32) que define el standard ANSI-C. Estas palabras reservadas pueden verse en la tabla siguiente:

auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static static struct switch typedef union unsigned void volatile while

Tabla 1.1: Palabras reservadas del lenguaje C.

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

1.1.1.3. El Proceso de Compilación

1. Cuando un código es leído por un compilador este entra al análisis léxico donde se

verifica dónde empieza y termina cada instrucción, esto se hace tomando como

referencia los espacios en blanco.

2. Una vez hecho esto el analizador sintáctico llama de manera repetida al analizador

léxico para que este le envié cada línea de código para ser verificada si está bien

escrita en el lenguaje. Para realizar esta verificación se realiza por medio de un

estructura llamada Árbol gramatical.

Ejemplo:

1. Después entra en la etapa del analizador semántico, esta se encarga de la

construcción de las instrucciones del lenguaje, revisando que sean iguales a las

definidas.

2. Luego entramos al proceso de síntesis, donde se generas el código intermedio, este

para ser utilizado en la memoria de forma temporal.

3. Ahora este código generado pasa por el optimizador para ser ejecutado de forma

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

más rápida.

4. En esta última etapa se genera un código que sea entendible por la máquina para ser

ejecutado por la computadora.

Otros conceptos

Tabla de símbolos: es una lista o tabla en la memoria que se utiliza para almacenar

variables definidas por el código fuente. Su objetivo es facilitar la consulta de

información referente a las variables, para evitar la regresión en el código.

Detección e información de errores: durante la compilación, la detección de errores es

una tarea que se realiza en cada fase, esto con el fin de buscar el mayor número de

errores existentes en el código antes de que termine la compilación.

Grafico procesos y fases de un compilador

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

1.1.1.4. Elementos de un Programa Los lenguajes de programación –como los restantes lenguajes- tienen elementos

básicos que se utilizan como bloques constructivos, así como reglas para las que esos

elementos se combinan. Estas reglas se denominan sintaxis del lenguaje. Solamente

las instrucciones sintácticamente correctas pueden ser interpretadas por la

computadora y los programas que contengan errores de sintaxis con rechazados por la

máquina.

• Los elementos básicos constitutivos de un programa o algoritmo son:

• Palabras reservadas (inicio, fin, si –entonces..., etc),

• Identificadores (nombres de variables esencialmente)

• Caracteres especiales (coma, apóstrofo, etc.)

• Constantes

• Variables,

• Expresiones,

• Instrucciones.

Además de estos elementos básicos, existen otros elementos que forman parte de los

programas, cuya comprensión y funcionamiento será vital para el correcto diseño de un

algoritmo y naturalmente la codificación del programa.

Estos elementos son:

• bucles

• contadores

• acumuladores

• interruptores

• estructuras:

Secuenciales

Selectivas,

Repetitivas.

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

2. El Lenguaje de Programación C El Lenguaje C fue creado en 1972 por Dennis Ritchie en un PDP-11 de Digital

Equipment Corporation bajo el sistema operativo UNIX. Fue el resultado final de un

proyecto que comenzó con un lenguaje llamado BCPL (Basic Combined Programming

Language) diseñado por Martin Richards en 1967, que a su vez estaba influenciado por

el lenguaje CPL (Combined Programming Language) desarrollado por las universidades

de Cambridge y Londres. A partir del BCPL, Ken Thompson creó un lenguaje llamado

B, que fue el que condujo al desarrollo del Lenguaje C.

Durante muchos años el estándar para C fue el que se suministraba con la versión 5 de

UNIX. Pero con la creciente popularidad de los microordenadores aparecieron muchas

implementaciones diferentes (Quick C de Microsoft, Turbo C de Borland, etc.) que,

aunque eran altamente compatibles entre sí, tenían algunas diferencias. Por ello, en

1983 se creó un comité que elaboró el documento que define el estándar ANSI de C.

El Lenguaje C es un lenguaje de nivel medio, es decir, sin ser un lenguaje de alto nivel

como COBOL, BASIC o Pascal, tampoco es un Lenguaje Ensamblador.

Las principales características del Lenguaje C son:

• Tiene un conjunto completo de instrucciones de control.

• Permite la agrupación de instrucciones.

• Incluye el concepto de puntero (variable que contiene la dirección de otra

variable).

• Los argumentos de las funciones se transfieren por su valor. Por ello, cualquier

cambio en el valor de un parámetro dentro de una función no afecta al valor de la

variable fuera de ella.

• La E/S no forma parte del lenguaje, sino que se proporciona a través de una

biblioteca de funciones.

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

• Permite la separación de un programa en módulos que admiten compilación

independiente.

Originalmente el Lenguaje C estuvo muy ligado al sistema operativo UNIX que, en su

mayor parte, está escrito en C. Más adelante se comenzó a utilizar en otros sistemas

operativos para programar editores, compiladores, etc. Aunque se le conoce como un

lenguaje de programación de sistemas, no se adapta mal al resto de aplicaciones. De

hecho, hoy en día un alto porcentaje de software para ordenadores personales está

escrito en Lenguaje C. Por ejemplo, el sistema operativo MS-DOS.

En este capítulo realizaremos un rápido recorrido por algunas de las características del

lenguaje a través de unos ejemplos muy sencillos. En los siguientes capítulos

estudiaremos con mucho más detalle la mayor parte de los aspectos del Lenguaje C.

Este estudio lo basaremos en la implementación de Borland: el Turbo C. Estos

programas pueden ejecutarse desde el entorno integrado de Turbo C o compilándolos y

enlazándolos desde la línea de órdenes del DOS

2.1 Lenguaje C en sus Inicios

El lenguaje C es fruto de un lenguaje de programación anterior, el lenguaje B,

desarrollado por Ken Thompson, en los Laboratorios Bell en 1970, con la idea de

recodificar el sistema operativo UNIX que, hasta esa fecha, se programaba

directamente en ensamblador, con el inconveniente de estar vinculado a máquinas

concretas (según el juego de instrucciones de cada máquina). Por tanto, se hacía

necesario un lenguaje que permitiese al programador abstraerse de la capa hardware y

conseguir una mayor portabilidad del código, algo que se realizó en B (basándose en el

BCPL de Martin Richard de 1967).

Poco más tarde, también en los Laboratorios Bell, Dennis Ritchie se pone a trabajar en

el diseño de un nuevo lenguaje de programación basado en el lenguaje B de Ken

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

Thompson y al que aportó tipos y estructuras de datos que consiguiesen clarificar la

programación y obtener un lenguaje mucho más eficiente, así nació el lenguaje de

programación C. Ritchie diseñó, desde 1970 a 1972 junto a Brian Kernighan, un

lenguaje que permitía realizar una programación estructurada en la que se podían

economizar las expresiones a usar y con el que los desarrolladores podrían contar con

un buen conjunto de operadores y tipos de datos para programar tanto en alto como en

bajo nivel de manera simultánea. Ente sus características:

Núcleo de lenguaje simple que incluye funciones matemáticas y de manejo de archivos

proporcionadas por bibliotecas

Lenguaje flexible que permitía programar de manera estructurada y no estructurada

Inclusión de un sistema de tipos que impedía la realización de operaciones sin sentido

Acceso a memoria de bajo nivel mediante el uso de punteros

Conjunto reducido de palabras reservadas

Paso de parámetros a funciones por valor

Tipos de datos agregados (struct) que permitían combinar, bajo un mismo tipo, datos de

tipos distintos y manejarlos como uno solo.

El lenguaje C ofrecía diversos tipos de datos: "CHAR" (carácter), "INT" (enteros),

"FLOAT" (números reales en precisión simple), y "DOUBLE" (números reales en

precisión doble) a los que posteriormente se añadieron los tipos "SHORT" (números

enteros de tamaño menor a un INT), "LONG" (números enteros de tamaño mayor a un

INT), "UNSIGNED" (Enteros sin signo), y "ENUMERACIONES" que junto a las

estructuras, las uniones y las tablas y matrices componían un variado juego de tipos de

datos con los que abordar múltiples problemas.

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

En 1978 Kernighan y Ritchie publican la descripción del lenguaje C en el libroThe C

Programming Language, un libro de cabecera que describe todas las posibilidades de

este nuevo lenguaje que y que aún se utiliza como manual de referencia.

El lenguaje C se hizo muy popular en los años 80 puesto que comenzó a desplazar a

BASIC, los compiladores se hicieron muy populares y, además, de empezarse a usar

en los IBM PC. En paralelo, Bjarne Stroustrup (que también trabajaba en los

Laboratorios Bell) desarrolla C++, complementando C con clases y funciones virtuales,

tipos genéricos y expresiones de ADA y un motor de objetos que permitía combinar la

programación imperativa de C con la programación orientada a objetos.

En 1983, el Instituto Nacional Estadounidense de Estándares (ANSI) organizó un

comité, X3j11, para establecer una especificación estándar de C que, tras un proceso

largo, completó el estándar en 1989 (ANSI X3.159-1989), el C89. En 1990, la

Organización Internacional para la Estandarización (ISO) tomó el C89 en el estándar

ISO/IEC 9899:1990, conocido por C90. El lenguaje C permaneció estable, mientras que

C++ siguió evolucionando, hasta que en 1999 volvió a revisarse con la ISO 9899:1999.

2.1.1. Origen y Evolución del Lenguaje

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

El Lenguaje C es uno de los lenguajes de programación más populares en la

actualidad. Permite realizar una programación estructurada sin límite a la creatividad del

programador y además los compiladores de C tienen la ventaja de producir programas

reducidos y muy rápidos en ejecución. Por ello, muchos paquetes de software están

escritos en C. El lenguaje C, está hecho para ser altamente transportable y para

programar lo improgramable, por lo que el Lenguaje C ha demostrado ser un lenguaje

extremadamente eficaz y expresivo.

Historia del Lenguaje C.

El desarrollo inicial de C se llevó a cabo en los Laboratorios Bell de AT&T entre

1969 y 1973; según Ritchie, el periodo más creativo tuvo lugar en 1972. Se le dio el

nombre "C" porque muchas de sus características fueron tomadas de un lenguaje

anterior llamado "B".

Hay muchas leyendas acerca del origen de C y el sistema operativo con el que está

íntimamente relacionado, Unix. Algunas de ellas son:

El desarrollo de C fue el resultado del deseo de los programadores de jugar con Space

Travel. Habían estado jugando en el mainframe de su compañía, pero debido a su poca

capacidad de proceso y al tener que soportar 100 usuarios, Thompson y Ritchie no

tenían suficiente control sobre la nave para evitar colisiones con los asteroides.

Por ese motivo decidieron portar el juego a un PDP-7 de la oficina que no se utilizaba;

pero esa máquina no tenía sistema operativo, así que decidieron escribir uno.

Finalmente decidieron portar el sistema operativo del PDP-11 que había en su oficina,

pero era muy costoso, pues todo el código estaba escrito en lenguaje ensamblador.

Entonces decidieron usar un lenguaje de alto nivel y portátil para que el sistema

operativo se pudiera portar fácilmente de un ordenador a otro. Consideraron usar B,

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

pero carecía de las funcionalidades necesarias para aprovechar algunas características

avanzadas del PDP-11. Entonces empezaron a crear un nuevo lenguaje, C.

La justificación para obtener el ordenador original que se usó para desarrollar Unix fue

crear un sistema que automatizase el archivo de patentes. La versión original de Unix

se desarrolló en lenguaje ensamblador. Más tarde, el lenguaje C se desarrolló para

poder reescribir el sistema operativo.

En 1973, el lenguaje C se había vuelto tan potente que la mayor parte del kernel Unix,

originalmente escrito en el lenguaje ensamblador PDP-11/20, fue reescrita en C. Éste

fue uno de los primeros núcleos de sistema operativo implementados en un lenguaje

distinto al ensamblador. (Algunos casos anteriores son el sistema Multics, escrito en

PL/I, y Master Control Program para el B5000 de Burroughs, escrito en ALGOL en

1961).

El C de Kernighan y Ritchie

En 1978, Ritchie y Brian Kernighan publicaron la primera edición de El lenguaje de

programación C, también conocido como La biblia de C. Este libro fue durante años la

especificación informal del lenguaje. El lenguaje descrito en este libro recibe

habitualmente el nombre de "el C de Kernighan y Ritchie" o simplemente "K&R C" (La

segunda edición del libro cubre el estándar ANSI C, descrito más abajo.)

Kernighan y Ritchie introdujeron las siguientes características al lenguaje:

• El tipo de datos struct.

• El tipo de datos long int.

• El tipo de datos unsigned int.

• Los operadores (=+ y =-) fueron sustituidos por (+= y -=) para eliminar la

ambigüedad sintáctica de expresiones como (i=-10), que se podría interpretar

bien como (i =- 10) o bien como (i = -10).

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

El C de Kernighan y Ritchie es el subconjunto más básico del lenguaje que un

compilador debe de soportar. Durante muchos años, incluso tras la introducción del

ANSI C, fue considerado "el mínimo común denominador" en el que los programadores

debían programar cuando deseaban que sus programas fueran transportables, pues no

todos los compiladores soportaban completamente ANSI, y el código razonablemente

bien escrito en K&R C es también código ANSI C válido.

En estas primeras versiones de C, las únicas funciones que necesitaban ser declaradas

si se usaban antes de la definición de la función eran las que retornaban valores no

enteros. Es decir, se presuponía que una función que se usaba sin declaración previa

(prototipo) devolvería un entero.

Evolución del Lenguaje C. Este Lenguaje ha evolucionado paralelamente con el UNIX, que a su vez ha

pasado por diversas versiones entre las que destaca Microsoft con su XENIX para

micros de 16 bits.

Uno de los objetivos de diseño del lenguaje C es que sólo sean necesarias unas pocas

instrucciones en lenguaje máquina para traducir cada elemento del lenguaje, sin que

haga falta un soporte intenso en tiempo de ejecución. Es muy posible escribir C a bajo

nivel de abstracción; de hecho, C se usó como intermediario entre diferentes lenguajes.

En parte a causa de ser de relativamente bajo nivel y de tener un modesto conjunto de

características, se pueden desarrollar compiladores de C fácilmente. En consecuencia,

el lenguaje C está disponible en un amplio abanico de plataformas (seguramente más

que cualquier otro lenguaje). Además, a pesar de su naturaleza de bajo nivel, el

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

lenguaje se desarrolló para incentivar la programación independiente de la máquina. Un

programa escrito cumpliendo los estándares e intentando que sea portátil puede

compilarse en muchos computadores.

C se desarrolló originalmente (conjuntamente con el sistema operativo Unix, con el que

ha estado asociado mucho tiempo) por programadores para programadores. Sin

embargo, ha alcanzado una popularidad enorme, y se ha usado en contextos muy

alejados de la programación de sistemas, para la que se diseñó originalmente.

Variantes:

Desde el inicio del lenguaje han surgido varias ramas de evolución que han

generado varios lenguajes:

• Objective-C es un primer intento de proporcionar soporte para la programación

orientada a objetos en C, de escasa difusión, pero actualmente usado en Mac OS X y

GNUstep.

• C++ (pronunciado C Plus Plus) diseñado por Bjarne Stroustrup fue el segundo

intento de proporcionar orientación a objetos a C y es la variante más difundida y

aceptada. Esta versión combina la flexibilidad y el acceso de bajo nivel de C con las

características de la programación orientada a objetos como abstracción, encapsulación

y ocultación.

También se han creado numerosos lenguajes inspirados en la sintaxis de C, pero que

no son compatibles con él:

• Java, que une una sintaxis inspirada en la del C++ con una orientación a objetos

más similar a la de Smalltalk y Objective C.

• JavaScript, un lenguaje de scripting creado en Netscape e inspirado en la

sintaxis de Java diseñado para dar a las páginas web mayor interactividad. A la versión

estandarizada se la conoce como ECMAScript.

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

• C# (pronunciado C Sharp) es un lenguaje desarrollado por Microsoft derivado de

C/C++ y Java.

Cronología:

FECHA LENGUAJE ACONTECIMIENTO

1953 FORTRAN Job Backus propone el desarrollo de un nuevo lenguaje

1954 FORTRAN Un equipo de IBM comienza a trabajar en el FORTRAN

1957 FORTRAN IBM desarrolla la primera versión

1959 LISP

El profesor John McCarthy y sus alumnos desarrolla el

LISP

1960 ALGOL

Se reúnen representantes europeos y de EEUU para la

creación de un nuevo lenguaje

1960 COBOL Fue creado COBOL

1962 APL

Se publica el libro de Kenneth Iverson “A Programming

Language

Mediado de

los 60 APL

El APL es implantado por IBM en una versión conocida

como APL/360

1965 BASIC Aparece BASIC

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

1966 FORTRAN Aparece el FORTRA IV

1968 ALGOL Se implemento una nueva versión multipropósito

Finales de

los 60 APL Está disponible para el mercado en general

1970 PASCAL Niklaus Wirth diseña PASCAL

1972 PROLOG

Se desarrolla en la Universidad de Aix-Marsailles en

Francia.

1972 C Dennis Ritchie crea el lenguaje C.

1977 FORTRAN Aparece el FORTRAN 77

Finales de

los 70 MODULA-2 Niklaus Wirth dirige el desarrollo de MODULA-2

Principio de

los 80 C++ Se desarrolla el lenguaje C++

1985 CLIPPER Se crea CLIPPER

1986 CLIPPER Aparece CLIPPER AUTUMN'86

1987 CLIPPER CLIPPER SUMMER'87

1990 FORTRAN Aparece el FORTRAN 90

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

Principios

90 JAVA

James Gosling y su equipo comienzan a desarrollar

JAVA

1993 Visual C++ Se desarrolla el lenguaje Visual C++

1994 DELPHI Aparece la primera versión

1995 JAVA Se lanza al mercado JAVA

1999 DELPHI Aparece Delphi 5.0 para windows 98 NT/2000

2.2. El Espíritu de C

Código El término código tiene diferentes usos y acepciones. Puede tratarse de una

combinación de símbolos que, en el marco de un sistema ya establecido, cuente con un

cierto valor. Por ejemplo: “El programador tendrá que modificar el código del software

para que funcione de manera correcta”, “¿Cuál es el código de acceso para ingresar al

depósito?”, “Tengo que cambiar el código de mi caja fuerte”.

En el caso de la informática, se conoce como código fuente al texto desarrollado en un

lenguaje de programación y que debe ser compilado o interpretado para poder

ejecutarse en un ordenador, también llamado computadora.

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

Siempre en el ámbito informático, el código ASCII (sigla que comúnmente se pronuncia

“asqui” y que significa American Standard Code for Information Interchange, o bien

Código Estándar Norteamericano para Intercambio de Información) es una

representación de los caracteres alfanuméricos que facilita la comunicación entre

distintos dispositivos digitales. Las letras, los números, los símbolos y los acentos

tienen su correspondiente número ASCII, de manera que programas desarrollados por

diferentes personas y equipos fabricados por una u otra compañía pueden entender el

texto de la misma forma.

Dato Un dato es una representación simbólica (numérica, alfabética, algorítmica, espacial,

etc.) de un atributo o variable cuantitativa o cualitativa. Los datos describen hechos

empíricos, sucesos y entidades. Es un valor o referente que recibe el computador por

diferentes medios, los datos representan la información que el programador manipula

en la construcción de una solución o en el desarrollo de un algoritmo.

Los datos aisladamente pueden no contener información humanamente relevante. Sólo

cuando un conjunto de datos se examina conjuntamente a la luz de un enfoque,

hipótesis o teoría se puede apreciar la información contenida en dichos datos. Los

datos pueden consistir en números, estadísticas o proposiciones descriptivas. Los datos

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

convenientemente agrupados, estructurados e interpretados se consideran que son la

base de la información humanamente relevante que se pueden utilizar en la toma de

decisiones, la reducción de la incertidumbre o la realización de cálculos. Es de empleo

muy común en el ámbito informático y, en general, prácticamente en cualquier

investigación científica.

En programación, un dato es la expresión general que describe las características de

las entidades sobre las cuales opera un algoritmo.

En Estructura de datos, es la parte mínima de la información.

2.2.1. El Lenguaje y sus Atributos

Nombre del Atributo

Elementos Descripción

accept <form>, <input> Lista de tipos aceptados por el

servidor, usualmente un tipo de

archivo.

accept-charset <form> Lista de juegos de caracteres

soportados.

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

accesskey Global attribute Define una "tecla", que activa o

agrega un "foco", al elemento

action <form> La URL del programa que procesa

la información, enviado en el

formulario

align <applet>, <caption>, <col>,

<colgroup>, <hr>, <iframe>,

<img>, <table>,

<tbody>, <td>, <tfoot> , <th>,

<thead>, <tr>

Especifica el alineamiento horizontal

del elemento

alt <applet>, <area>, <img>,

<input>

Texto alternativo en caso de que la

imagen no se pueda mostrar.

async <script> Indica que el script debería

ejecutarse asincrónicamente.

autocomplete <form>, <input> Indica si los controles en este

formulario pueden tener por defecto

sus valores completados

automáticamente por el navegador.

autofocus <button>, <input>, <keygen>,

<select>, <textarea>

El elemento debería recibir foco

automáticamente después de

haberse cargado la página.

autoplay <audio>, <video> El audio o video debería empezar lo

antes posible.

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

bgcolor <body>, <col>, <colgroup>,

<marquee>, <table>, <tbody>,

<tfoot>, <td>, <th>, <tr>

Color de fondo del elemento.

Nota: Este es un atributo por

legado. Por favorm usa CSS

background-color property instead.

border <img>, <object>, <table> El ancho del borde.

Nota: Este atributo se mantiene

como referencia. Se recomienda

usar la propiedad de CSS border.

buffered <audio>, <video> Contiene un rango de tiempo de

multimedios ya almacenados en el

buffer.

challenge <keygen> Una cadena de desafío que se

envía junto con la clave pública.

charset <meta>, <script> Declara la codificación de

caracteres de la página o del script.

checked <command>, <input> Indica que el elemento debería estar

verificado al cargar la página.

cite <blockquote>, <del>, <ins>,

<q>

Contiene una URI que apunta a la

fuente de la cita o cambio.

class Global attribute Usualmente empleado con CSS

para aplicar estilos a elementos con

propiedades en comun.

code <applet> Especifica la URL del archivo de

tipo applet a ser cargado y

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

ejecutado.

codebase <applet> Este atributo contiene la URL base

del directorio donde los archivos de

applets (.class) referenciados en el

codigo se encuentran almacenados.

color <basefont>, <font>, <hr> Este atributo configura el color de

texto usando un nombre de color o

en formato hexadecimal #RRGGBB.

Nota: Este atributo se mantiene

como referencia. Se recomienda

usar la propiedad de CSS color.

cols <textarea> Define el numero de columnas en

un textarea.

colspan <td>, <th> Define el numero de columnas que

una celda debe contener.

content <meta> Un valor asociado con http-equiv

o name dependiendo del contexto.

contenteditable Global attribute Indica si el contenido del elemento

es editable.

contextmenu Global attribute Define el ID de un elemento

<menu> que servira como menu de

contexto para el elemento.

controls <audio>, <video> Indica si el explorador debe mostrar

controles de reproduccion al

usuario.

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

coords <area> Un conjunto de valores que

especifican las coordenadas del

area.

data <object> Especifica la URL del recurso.

data-* Global attribute Permite asociar atributos

presonalizados a un elemento

HTML.

datetime <del>, <ins>, <time> Indica la fecha y hora asociadas con

el elemento.

default <track> Indica que la pista debe estar

habilitada a menos que las

preferencias del usuario indiquen

algo diferente.

defer <script> Indica que el codigo debe ser

ejecutado despues de que la pagina

este cargada.

dir Global attribute Define la direccion del texto. Los

valores permitidos son ltr (Izquierda-

a-Derecha) o rtl (Derecha-a-Left).

dirname <input>, <textarea> Indica la direccion del texto

asociada con el elemento al

momento de enviar el formulario.

disabled <button>, <command>,

<fieldset>, <input>, <keygen>,

<optgroup>, <option>,

<select>, <textarea>

Infica si el usuario puede interactuar

con el elemento.

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

download <a>, <area> Indica que el hypervinculo es

utilizado para descargar un recurso.

draggable Global attribute Define si el elemento puede ser

arrastrado.

dropzone Global attribute Indica que el elemento acepta

contenido soltado en el mismo.

enctype <form> Define el tipo de contenido del

formulario cuando el metodo del

mismo es POST.

for <label>, <output> Indica el elemento al que describen

y pertenecen.

form <button>, <fieldset>, <input>,

<keygen>, <label>, <meter>,

<object>, <output>,

<progress>, <select>,

<textarea>

Indica el formulario al que pertenece

el elemento.

headers <td>, <th> IDs de los elementos <th> que

aplican a este elemento.

height <canvas>, <embed>,

<iframe>, <img>, <input>,

<object>, <video>

Nota: En algunos casos, como los

<div>, este es un atributo de

referencia, en donde se debe usar

la propiedad de css height. En otros

casos como <canvas>, la altura

debe ser especificada en este

atributo.

hidden Global attribute Indica la visibilidad del elemento.

high <meter> Indica el menor valor del rango alto.

href <a>, <area>, <base>, <link> La URL de un recurso asociado.

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

hreflang <a>, <area>, <link> Especifica el lenguaje del recurso

asociado.

http-equiv <meta> Indica una directiva que puede

alterar el comportamiento de la

pagina y como es leida por los

exploradores.

icon <command> Especifica una imagen relacionada

con el comando.

Nota: el elemento <command> es

obsoleto y no se recomienda su

uso.

id Global attribute Identificador el elemento para

acceder al mismo desde CSS o

Javascript, este indicador debe ser

unico para cada elemento.

ismap <img> Indica que la imagen es parte de un

mapa de imagen del servidor.

itemprop Global attribute Indica que el elemento contiene el

valor de la propiedad especificada

de un conjunto.

keytype <keygen> Especificar el tipo de clave se.

Nota: RSA es el valor por defecto.

kind <track> Especifica el tipo de pista.

label <track> Especifica el titulo de la pista con un

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

formato legible por el usuario.

lang Global attribute Define el lenguaje utilizado en el

elemento.

language <script> Define el lenguage (de

programación) utilizado en el

elemento.

list <input> Identifica una serie de valores

predefinidos para ser sugeridos al

usuario.

loop <audio>, <bgsound>,

<marquee>, <video>

Indica si el medio debe ser

reproducido desde el principio al

llegar al final.

low <meter> Indica el valor mas alto del rango

bajo.

manifest <html> Especifica la URL del manifiesto de

cache para el documento.

max <input>, <meter>, <progress> Indica el maximo valor aceptado.

maxlength <input>, <textarea> Define el mayor numero de

caracteres aceptados.

media <a>, <area>, <link>,

<source>, <style>

Da un indicio del tipo de medio para

el cual el recurso vinculado fue

creado.

method <form> Define el metodo a emplear para

enviar el formulario. Puede ser GET

el valor predeterminado es POST.

min <input>, <meter> Indica el valor minimo aceptado.

multiple <input>, <select> Indica si multiples valores pueden

ser ingresados.

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

name <button>, <form>, <fieldset>,

<iframe>, <input>, <keygen>,

<object>, <output>, <select>,

<textarea>, <map>, <meta>,

<param>

Nombre del elemento. Por ejemplo

utilizado por el servidor para

identificar los campos en el envio de

formularios.

novalidate <form> Este atributo indica que el formulario

no debe ser validado antes de

enviarlo.

open <details> Indica si los detalles de la pagina

seran mostrados cuando cargue la

misma.

optimum <meter> Indica el valor numerico optimo.

pattern <input> Define una expresion regular con la

cual el valor del elemento debe ser

validado.

ping <a>, <area> Indica si se enviara un ping o

notificacion a la URL del recurso

cuando el usuario utlize el vinculo.

placeholder <input>, <textarea> Da un indicio al usuario de que debe

ingresar en el elemento.

poster <video> Una URL que indica un cuadro a

mostrar hasta que el usuario

reproduzca o navegue en el video.

preload <audio>, <video> Indica si el recurso o partes del

mismo deben ser precargadas.

pubdate <time> Indica si esta fecha y tiempo

concuerda con la fecha y tiempo del

<article> mas cercano (ancestro).

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

radiogroup <command> Indica los nombres de los comandos

de tipo radio, que seran alternados

si el comando en si es alternado.

Este atributo debe ser omitido si el

tipo de comando no es radio.

Nota: el elemento <command> es

obsoleto y no se recomienda su

uso.

readonly <input>, <textarea> Indica si el elemento puede ser

editado por el usuario.

rel <a>, <area>, <link> Especifica la relación que hay entre

el objeto destino y aquél donde está

el vínculo.

required <input>, <select>, <textarea> Indica si el elemento debe ser

llenado o no.

reversed <ol> Indica si la lista debe ser mostrada

en orden descendente en vez de

ascendente.

rows <textarea> Define el numero de filas del

textarea.

rowspan <td>, <th> Define el numero de filas que una

celda de una tabla debe abarcar.

sandbox <iframe> Lista de restricciones a ser

desactivadas en el iframe.

spellcheck Global attribute Indica si la correccion ortografica

esta abilitada para el elemento.

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

scope <th> Define las celdas que la cabecera

definio en este elemento.

scoped <style> Indica si el estilo sera aplicado solo

al elemento inmediato superior

(padre). de no ser definido el estilo

se aplicara de forma global.

seamless <iframe> Indica si el iframe debe ser cargado

como parte del mismo documento.

selected <option> Define el valor que sera

seleccionado dentro del select al

cagar la pagina.

shape <a>, <area> Define una región seleccionable

para hacer hipervínculos asociados

con una forma asociada a una figura

para crear un mapa. Los valores

para este atributo son: circle, defaul,

plygon y rect.

size <input>, <select> Define el largo del elemento (en

pixeles). Si el type es text

o password entonces es el numero

de caracteres.

sizes <link> Define los tamaños en los que el

icono puede ser cargado.

span <col>, <colgroup> Indica el número de columnas que

se agrupan.

src <audio>, <embed>, <iframe>,

<img>, <input>, <script>,

<source>, <track>, <video>

La URL del contenido integrable.

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

srcdoc <iframe> Especifica el contenido de la pagina

incluida.

srclang <track> Especifica el lenguaje del contenido

de la pista.

start <ol> Define el numero inicial de la lista (si

es diferente a 1).

step <input> Indica el valor del incremento para

un valor numerico o de fecha.

style Global attribute Define los estilos CSS que

sobreescribiran los estilos

previamente definidos para el

elemento.

summary <table> Contiene una descripcion del

contenido de la tabla.

Nota: Este atributo ha sido

desaprovado, se recomienda incluir

un elemento <caption> en la tabla.

tabindex Global attribute Sobrescribe el orden de tabulacion

del navegador y usa el especificado.

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

target <a>, <area>, <base>, <form> Especifica el marco destino en un

vínculo.

Valores especiales: "_blank" indica

una nueva ventana, "_parent" indica

el marco padre del marco que

contiene el código fuente, "_self"

indica el marco donde está el código

fuente y "_top" indica la ventana

completa del navegador.

title Global attribute Texto a ser mostrado cuando el

cursor este sobre el elemento.

type <button>, <input>,

<command>, <embed>,

<object>, <script>, <source>,

<style>, <menu>

Define el tipo de elemento.

usemap <img>, <input>, <object> Indica la URL parcial de un image

map asociado con el elemento.

Nota: este atributo no puede ser

usado si el elemento <img>

deciende de un <button> o <a>

value <button>, <option>, <input>,

<li>, <meter>, <progress>,

<param>

Define el valor predeterminado a ser

mostrado al cargar la pagina.

width <canvas>, <embed>,

<iframe>, <img>, <input>,

Nota: En algunos casos, como los

<div>, este es un atributo de

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

<object>, <video> referencia, en donde se debe usar

la propiedad de css height. En otros

casos como <canvas>, la altura

debe ser especificada en este

atributo.

2.2.2. El Lado Obscuro de “C”

Al igual que otros lenguajes tiene sus inconvenientes como:

* Recolección de basura nativa, sin embargo se encuentran a tal efecto bibliotecas

como la "libgc" desarrollada por Sun Microsystems, o el Recolector de basura de

Boehm.

* Soporte para programación orientada a objetos, aunque la implementación original de

C++ fue un preprocesador que traducía código fuente de C++ a C.

* Encapsulación.

* Polimorfismo en tiempo de código en forma de sobrecarga, sobrecarga de operadores

y sólo dispone de un soporte rudimentario para la programación genérica.

* Soporte nativo para programación multihilo y redes de computadores.

* Carece de instrucciones de entrada/salida, de instrucciones para manejo de cadenas

de caracteres, con lo que este trabajo queda para la librería de rutinas, con la

consiguiente pérdida de transportabilidad.

2.2.3. Programas y Funciones

Un algoritmo es una secuencia no ambigua, finita y ordenada de instrucciones

que han de seguirse para resolver un problema. Un programa normalmente implementa

(traduce a un lenguaje de programación concreto) uno o más algoritmos. Un algoritmo

puede expresarse de distintas maneras: en forma gráfica, como un diagrama de flujo,

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

en forma de código como en pseudocódigo o un lenguaje de programación, en forma

explicativa, etc.

Los programas suelen subdividirse en partes menores, llamadas módulos, de modo que

la complejidad algorítmica de cada una de las partes sea menor que la del programa

completo, lo cual ayuda al desarrollo del programa. Esta es una práctica muy utilizada y

se conoce como "refino progresivo".

Según Niklaus Wirth, un programa está formado por los algoritmos y la estructura de

datos.

Se han propuesto diversas técnicas de programación cuyo objetivo es mejorar tanto el

proceso de creación de software como su mantenimiento. Entre ellas, se pueden

mencionar las siguientes:

• programación declarativa

• programación estructurada

• programación modular

• programación orientada a objetos

2.2.3.1. Identificadores

En los lenguajes informáticos, los identificadores son elementos textuales

(también llamados símbolos) que nombran entidades del lenguaje. Algunas de las de

entidades que un identificador puede denotar son las variables, las constantes, los tipos

de dato, las etiquetas.

En muchos lenguajes algunas secuencias tienen la forma léxica de un identificador pero

son conocidos como palabras clave (o palabras reservadas)

2.2.3.2. La Función Main “()”

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

Cada programa de C tiene una función principal que se debe llamar main. Si su

código sigue el modelo de programación Unicode, puede utilizar la versión de carácter

ancho de main, wmain. La función main sirve como punto de partida para la ejecución

del programa. Normalmente, controla la ejecución del programa dirigiendo las llamadas

a otras funciones del programa. Un programa deja de ejecutarse normalmente al final

de main, aunque puede finalizar en otros puntos del programa por distintos motivos. A

veces, quizás cuando se detecta un error, puede resultar conveniente forzar la

finalización de un programa. Para ello, utilice la función exit.

Las funciones incluidas en el programa de origen realizan una o más tareas concretas.

La función main puede llamar a estas funciones para que realicen sus respectivas

tareas. Cuando main llama a otra función, pasa el control de la ejecución a la función,

de modo que la ejecución comienza en la primera instrucción de la función. Una función

devuelve el control a main cuando se ejecuta una instrucción return o cuando se llega al

final de la función.

Puede declarar cualquier función, incluida main, para que tenga parámetros. El término

“parámetro” o “parámetro formal” hace referencia al identificador que recibe un valor

pasado a una función. Cuando una función llama a otra, la función a la que se llama

recibe los valores de sus parámetros de la función que realiza la llamada. Estos valores

se denominan “argumentos”. Puede declarar parámetros formales para main para que

pueda recibir argumentos de la línea de comandos con este formato:

Si desea pasar información a la función main, los parámetros se denominan

tradicionalmente argc y argv, aunque el compilador de C no obliga a usar estos

nombres. Los tipos de argc y argv los define el lenguaje C. Tradicionalmente, si se pasa

un tercer parámetro a main, ese parámetro se denomina envp.

La función main es imprencindible en cualquier programa C/C++ representa el punto de

inicio de su ejecución. Por lo general, su declaración adopta la forma: int main();

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

aunque en realidad, el módulo de inicio la invoca con dos parámetros (recibidos a su

vez del SO), denominados tradicionalmente argc y argv, contracciones de "argument

count" y "argument vector" respectivamente. El primero es un entero que representa el

número de comandos que se pasan; el segundo es un puntero a una matriz de cadenas

literales de distintas longitudes (es decir: puntero a matriz de punteros); cada una de

estas cadenas representa en último extremo los comandos iniciales que se quieren

pasar al programa, generalmente para controlar aspectos de su comportamiento. Así

pues, la declaración más genérica de main es del tipo: int main(int argc, char* argv[]);

El estándar establece que el complicador debe aceptar para main cualquiera de las dos

formas anteriores. Por convención, argv[0] es el nombre con que se ha llamado al

programa (normalmente será el nombre del fichero ejecutable incluyendo su dirección

completa -path-). Este dato es proporcionado automáticamente por el SO; así pues, el

valor mínimo para argc es 1. Después seguirán los que introduzcamos en la línea de

comandos, separados por espacios.

La función main adolece de ciertas limitaciones que la diferencian del resto de

funciones C++:

No puede ser invocada explícitamente a lo largo del programa, es invocada de forma

automática por el módulo de inicio .

No puede obtenerse su dirección, por lo tanto no pueden declararse punteros a ella: int

(* pmain)() = &main; // Error!!

No puede ser sobrecargada

No puede ser declarada como inline

main debe estar en el espacio global de una de las unidades de compilación del

programa, lo que significa que no puede pertenecer a una clase.

En muchos sistemas operativos el valor devuelto por la función main es utilizado como

control de estado para el entorno desde el que se ha ejecutado el programa este valor

es considerado el estado de retorno del programa. En UNIX, MS-DOS y MS Windows,

los 8 bits más bajos del valor devuelto son pasados al programa invocante o al

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

intérprete de comandos. Este "estado de retorno" se utiliza en ocasiones para cambiar

el curso de un programa, un proceso por lotes o un guión para el ejecutor de comandos.

Algunos compiladores pueden generar un aviso de error si se intenta compilar un

programa cuya función main no devuelva un int. Por contra, algunas plataformas

pueden provocar fallos cuando estos programas arrancan o a su terminación, ya que

esperan un int de retorno.

En los programas C++ no es necesario devolver nada desde la función main, aunque

en realidad la definición de esta sea int main (). La razón es que el Estándar garantiza

que si main llega a su final alcanzando el corchete de cierre "}" sin haber encontrado

una sentencia return, el compilador debe devolver automáticamente un 0 indicando un

final correcto, de forma que en ausencia de ningún retorno el compilador proporciona

automáticamente un return 0;[2]

No obstante lo anterior, el comportamiento concreto varía de un compilador a otro, un

programa en el que se alcanza el corchete de cierre de la función main sin ninguna

sentencia de retorno compila sin dificultad ni aviso de ningún tipo en Borland C++ 5.5,

mientras que MS Visual C++ 6.0 avisa: warning C4508: ¨main¨: function should return a

value; ¨void¨: retrun type assumed

En cualquier caso, es práctica de buena programación incluir un valor de retorno para la

función main. Tradicionalmente 0 significa una terminación correcta del programa,

cualquier otro valor es señal de terminación anormal (error o excepción).

Si el programa termina por una invocación a la función exit, el valor devuelto por main

es el argumento pasado a exit.

2.2.3.3. Convenciones

• ActionScript Las convenciones y las mejores prácticas de codificación de Adobe sugieren

estándares de nomenclatura para ActionScript que en su mayoría son consistentes con

los de ECMAScript. El estilo de identificadores es similar a la de Java.

• Ada

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

En Ada, el único estilo recomendado de identificadores es

Mixed_Case_With_Underscores.

• C y C++ En C y C++, las palabras clave e identificadores de la biblioteca estándar son en su

mayoría en minúsculas. En la biblioteca estándar de C, los nombres abreviados son los

más comunes (por ejemplo isalnum para una prueba de la función si un carácter es

alfanumérico), mientras que la biblioteca estándar C++ menudo utiliza un guión como

separador de palabra (por ejemplo out_of_range ). Identificadores representan macros

son, por convención, escrito usando sólo letras mayúsculas y guiones bajos (esto está

relacionado con la convención en muchos lenguajes de programación de la utilización

de todo mayúsculas identificadores de constantes). Nombres que contienen doble guión

o que comienzan con un guión bajo y una letra mayúscula se reservan para la

implementación (compilador, biblioteca estándar) y no deben ser usados (por ejemplo

reserved__ o _Reserved ). Esto es superficialmente similar a afilar, pero la semántica

difiere: los subrayados son parte del valor del identificador, en lugar de ser carácter

delimitador (como se afila): el valor de __foo es __foo (que está reservado), no foo

(pero en un espacio de nombres diferente).

• Java

En Java, las convenciones de nombres para los identificadores se han establecido y

propuesto por varias comunidades de Java como Sun

Microsystems,Netscape,AmbySoft, etc Una muestra de las convenciones de

nomenclatura establecidas por Sun Microsystems se enumeran a continuación, donde

un nombre en "CamelCase" es un compuesto de un número de palabras unidas sin

espacios, con letra inicial de cada palabra en mayúsculas - por ejemplo "CamelCase".

Compiladores Java no hacen cumplir estas reglas, pero no seguir las mismas pueden

dar lugar a confusión y código erróneo. Por ejemplo, widget.expand() y Widget.expand()

implica significativamente diferentes comportamientos: widget.expand() implica una

invocación al método expand() en una instancia con nombre widget, mientras que

Widget.expand() implica una invocación al método estático expand() en la clase Widget.

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

Un estilo de programación Java ampliamente utilizado dicta que UpperCamelCase ser

utilizado para clases y lowerCamelCase utilizarse para instancias y

métodos.Reconociendo este uso, algunos IDE como Eclipse, implementar atajos

basados en CamelCase. Por ejemplo, en el contenido de Eclipse función de asistencia,

escribiendo únicamente las letras mayúsculas de una palabra CamelCase sugerirá

ningún nombre de la clase a juego o método (por ejemplo, al escribir "NPE" y activando

ayuda de contenido podría sugerir NullPointerException).

Siglas de tres o más letras se camelCase en lugar de mayúsculas (por ejemplo,

parseDbmXmlFromIPAddress lugar de parseDBMXMLFromIPAddress ). También se

puede establecer el límite en dos o más letras (por ejemplo

parseDbmXmlFromIpAddress ).

• JavaScript Las bibliotecas incorporadas de JavaScript utilizan las mismas convenciones de

nomenclatura como Java. Las clases utilizan camel case superior (RegExp, TypeError,

XMLHttpRequest, DOMObject) y métodos utilizar lower camel case (getElementById,

getElementsByTagNameNS, createCDATASection). Con el fin de ser consistentes

desarrolladores más de JavaScript siguen estas convenciones.

Lisp La práctica común en la mayoría de los dialectos de Lisp es utilizar guiones para

separar las palabras en los identificadores, como en with-open-file y make-hash-table.

Nombres de variables globales convencionalmente comienzan y terminan con

asteriscos: *map-walls*. Nombres Constantes están marcadas por signos de suma:

+map-size+.

• .NET

Microsoft NET recomienda UpperCamelCase para la mayoría de los identificadores.

(LowerCamelCase se recomienda para los parámetros y variables) y es una convención

común para los lenguajes.NET. Microsoft recomienda también que no se utilicen pistas

de tipo prefijo (también conocido como notación húngara). En lugar de utilizar la

notación húngara se recomienda terminar el identificador con el nombre de la clase

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

base; LoginButton en lugar de BtnLogin.

• Objective-C Objective-C tiene un estilo común de codificación que tiene sus raíces en Apple ejemplo

de código.

Entidades de primer nivel, incluyendo clases, protocolos, categorías, así como

construcciones de C que se utilizan en los programas de Objective-C como variables y

funciones globales, están en UpperCamelCase con una breve mayúsculas-espacio de

nombres que denota prefijo, como NSString, UIAppDelegate, NSApp o CGRectMake.

Las constantes pueden ser opcionalmente precedidos por una letra minúscula "k" como

kCFBooleanTrue.

variables de instancia de un uso objeto lowerCamelCase precedidos por un guión,

como _delegate y _tableView.

Nombres de los métodos utilizan múltiples partes lowerCamelCase separados por dos

puntos que delimitan argumentos, como: aplicación: didFinishLaunchingWithOptions:,

stringWithFormat: y IsRunning.

• Perl Perl toma algunas señales de su patrimonio C para convenciones. A nivel local ambito

de variables y nombres de subrutinas son minúsculas con guiones bajos infijos.

Subrutinas y variables con la intención de ser tratado como privado están prefijadas con

un guión bajo. Las variables del paquete son título entubado. Constantes declaradas

son mayúsculas.

Los nombres de paquetes son camel case-exceptuando prágmata por ejemplo, strict y

mro -que son minúsculas.

• Python y Ruby Python y Ruby tanto recomiendan UpperCamelCase para nombres de clases,

CAPITALIZED_WITH_UNDERSCORES para las constantes y

lowercase_separated_by_underscores para otros nombres. En Python, si un nombre

está destinado a ser "privado", que está precedido de u.

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

2.2.3.4. El Compilador Un compilador es un programa informático que traduce un programa escrito en

un lenguaje de programación a otro lenguaje de programación.1 Usualmente el segundo

lenguaje es lenguaje de máquina, pero también puede ser un código intermedio

(bytecode), o simplemente texto. Este proceso de traducción se conoce

como compilación.2

¿Qué es un compilador (en informática)?

Para traducir las instrucciones de un programa escrito en un lenguaje de alto

nivel a instrucciones de un lenguaje máquina, hay que utilizar un programa

llamado compilador. Así pues, el compilador es un programa que recibe

como datos de entrada el código fuente de un programa escrito por un

programador, y genera como salida un conjunto de instrucciones escritas en el

lenguaje binario de la computadora donde se van a ejecutar.

2.2.3.4.1. Errores de Compilación

• ‘variable’ undeclared (first use in this function)

C es un lenguaje tipiado. Esto significa que hay que declarar las variables antes de

usarlas. C es sensible a mayúsculas, por lo que las variables pepe y Pepe son distintas.

• No such file or directory

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

El usuario ha pedido a c que compile un fichero que no existe. El compilador gcc espera

que los ficheros fuente tengan la extensión .c.

• Parse error before ‘string’

El compilador ha encontrado algo que no entiende. Las sentencias de un programa C

empiezan normalmente con una palabra reservada, un nombre de variable o un nombre

de función. Este error se genera normalmente cuando no se reconoce la primera

palabra de una línea de código, otras posibles causas pueden ser: falta un paréntesis ’)’

o una llave de cierre ’}’ en los alrededores de la línea indicada hay más llaves de la

cuenta falta un punto y coma (;) en la línea anterior hay una expresión mal construida la

condición de un if o de un while no va entre paréntesis

2.4. missing terminating " character

No se encuentra el carácter de terminación de la definición de una cadena. Este

mensaje suele venir acompañado por un mensaje que indica la posición donde el

compilador cree que puede haberse producido el fallo. Dicho mensaje es “possible start

of unterminated stringliteral”.

• undefined reference to ‘funcion’

El mensaje de error completo es parecido al siguiente:

c ha encontrado lo que parece una llamada a una función, pero no encuentra el código

de dicha función. Todos los programas C deben definir una función main, porque es la

función que se invoca al ejecutar el programa.

Estos errores aparecen principalmente debido a:

1. Errores tipográficos. Se ha escrito mal el nombre de la función

2. La función esta en otro fichero.

3. Si la función que falta es de la librería matemática (sqrt, sin, tan. . . ), el error

indica que no se ha enlazado la librería matemática. Para ello, compilar con la

opción -lm:

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

• unterminated string or character constant

Hay una cadena que abre comillas, pero no las cierra. Normalmente la línea indicada no

es la que contiene el fallo. Hay que comprobar desde la línea de error hacia atras que

todas las cadenas tienen las comillas de apertura y de cierre.

• parse error at end of input

Se ha producido un error al final del código fuente. Posiblemente falta una llave de

cierre en algún lugar del programa. El compilador no puede decir donde, así que

deberás recorrer todo el programa. También puede ser que algún comentario no tenga

el código de cierre, es decir, que haya un /* que no acabe con un */.

2.9. invalid macro name

Nombre de macro no valido. Los nombres de macro deben seguir las mismas reglas

que los nombres de variable.

2.2.3.5. Una Función de Utilería El header < stdlib.h> declara funciones para conversión numérica, asignación de

memoria y tareas semejantes. double atof(const char *s) atof convierte s a double; es

equivalente a strtod(s, ( char**)NULL).

int atoi(const char *s) convierte s a int; es equivalente a (int) strtol (s, (char**)NULL, 10). long atol(const char *s) convierte s a long; es equivalente a strtol(s, (char**)NULL, 10) double strtod(const char *s, char **endp)

strtod conviene el prefijo de s a double, ignorando el espacio en blanco inicial;

almacena en *endp un apuntador a cualquier sufijo no cubierto salvo cuando endpes

NULL. Si la respuesta se desborda, regresa HUGE_VAL con el signo apropiado; si el

resultado fuera tan pequeño que no se pueda representar (underflow), se regresa cero.

En cualquier caso errno toma el valor ERANGE.

[PROGRAMACIÓN PARA INGENIEROS]

AGOSTO

2015

GRUPO A PRIMER PARCIAL

long strtol(const char *s, char **endp, int base) strtol

convierte el prefijo de s a long, ignorando los espacios en blanco iniciales; almacena un

apuntador en *endp a cualquier sufijo no cubierto a menos de que endpsea NULL. Si

base está entre 2 y 36, la conversión se realiza suponiendo que la entrada es escrita en

esa base. Si [base| es cero, la base es 8, 10, o 16; los 0 iniciales implican octal,

mientras queOx y OX, hexadecimal. Las letras, ya sean mayúsculas o minúsculas,

representan dígitos desde 10 hasta base—1; en base 16 se permite iniciar con Oxo OX.

Si el resultado se desborda, se regresa LONG_MAX o LONG_MIN, dependiendo del

signo del resultado, y errno se hace ERANGE.