programación-ing-primer parcial
DESCRIPTION
programación para ingenieros, básicos para programadoresTRANSCRIPT
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.