Está en la página 1de 88

2014

BLOQUE ALGORITMOS Y PROGRAMAS


1
FUNDAMENTOS DE PROGRAMACIÓN

¿Qué es programar?
Consiste en escribir detallada y minuciosamente las instrucciones que debe seguir una computadora para
realizar una tarea. Estas instrucciones se deben escribir en un lenguaje que la computadora pueda
entender, ya sea en forma directa o luego de una traducción realizada por un intérprete o compilador.

Instrucciones a la Computadora
Los diferentes pasos de un algoritmo se expresan en los programas como instrucciones, sentencias, o
proposiciones. Un programa consta de una secuencia de instrucciones, cada una de las cuales especifica
ciertas operaciones que debe ejecutar la computadora.

Un programa se escribe en un lenguaje de programación y las operaciones que conducen a expresar un


algoritmo en forma de programa se denomina programación.

ALGORITMOS

Un programador de computadoras es antes que nada una persona que ayuda a resolver problemas y para
llegar a ser un programador eficaz se necesita aprender a resolver problemas de un modo riguroso y
sistemático.

La resolución de un problema exige el diseño de un algoritmo

¿Qué es?
 Es el conjunto de instrucciones que especifican la secuencia de operaciones a realizar, en orden, para
resolver un sistema específico o clase de problemas.
 Un algoritmo es un método para resolver problemas.
 Es una lista de instrucciones para efectuar paso a paso un proceso.
 Conjunto “FINITO” de pasos o instrucciones, seguidas en un orden lógico, los cuales nos llevan a la
solución de un problema específico.
 Una serie de instrucciones colocadas en cierta secuencia, necesarias para la descripción de las
operaciones que llevan a la solución de un problema.
 Es un procedimiento completo para resolver un problema específico en un número “FINITO” de pasos.
 Es un método para resolver un problema mediante una serie de datos precisos, definidos y finitos.

Características de los Algoritmos:- Las características fundamentales que debe cumplir todo algoritmo
son:

 Un algoritmo debe ser preciso e indicar el orden de realización de cada paso.


 Un algoritmo debe estar definido. Si se sigue un algoritmo dos veces, se debe obtener el mismo como
resultado cada vez.
 Un algoritmo debe ser finito. Si se sigue el algoritmo, se debe terminar en algún momento; o sea,
debe tener un número finito de pasos.

Clasificación de los algoritmos:

Directos: Son aquellos que permiten encontrar la solución al problema de manera instantánea o directa,
en un número determinado de pasos.

1
Ejemplo: 23 = 2*2*2 = 8

Indirecto:
Se ignora el número de pasos.
Son aquellos donde se desconocen el número de pasos para lograr la solución de un problema.
Estos a su vez, se clasifican en:

Finito: El número de pasos a realizar son conocidos así como la factibilidad de solución al problema
planteado, o sea, que va a ver una respuesta al proceso.

Ejemplo: Medir distancia

Quevedo Valencia

Es factible saber la distancia entre la ciudad de Quevedo y Valencia.

Infinito: Se desconoce el número de pasos a realizar, así como la imposibilidad de encontrar la solución al
problema planteado.

Cuando realmente es imposible lograr la solución, por más vueltas que le demos al problema.
Ejemplo: 20 ; +∞

La definición de un algoritmo debe describir tres partes: Entrada, Proceso y Salida.

PASOS PARA PLANTEAR LA SOLUCIÓN DE UN PROBLEMA

Análisis (recopilación de la información)


Algoritmo (secuencia ordenada de instrucciones)
Flujograma (Es una representación visual o gráfica)
Codificación(Es la expresión en un lenguaje de programación de los pasos definidos en el algoritmo)
Ejecución/Depuración (Es la ejecución de programa para corregir las fallas)

Problema N° 1
Verificar si un número es par.

1. Inicio.
2. Leer número
3. Si número es 0 o número es 1; escribir “Número no es par”. Ir paso 6
4. Número lo divido para 2.
5. Si residuo es = 0; escribir “Número si es par”; caso contrario escribir “Número no es par”
6. Fin.

Problema N° 2
Un cliente ejecuta un pago de una letra. El almacén examina en su banco de datos la ficha del cliente, si
el cliente esta con sus pagos al día, entonces el almacén acepta el pago sin ningún recargo adicional; caso
contrario, realizará el cobro pero haciendo el respectivo recargo adicional.

1. Inicio.
2. Leer el pago
3. Examinar la ficha del cliente.
4. Si el cliente está en sus pagos al día pago acepta el pago sin ningún recargo adicional; caso contrario,
realizará el cobro pero haciendo el respectivo recargo adicional.
5. Fin.

2
APLICACIÓN INFORMÁTICA.

Es un programa informático diseñado para facilitar al usuario la realización de un determinado tipo de


trabajo. Posee ciertas características que le diferencia de un sistema operativo (que hace funcionar al
ordenador), de una utilidad (que realiza tareas de mantenimiento o de uso general) y de un lenguaje (con
el cual se crean los programas informáticos). Suele resultar una solución informática para la
automatización de ciertas tareas complicadas como puede ser la contabilidad o la gestión de un almacén.

Ciertas aplicaciones desarrolladas 'a medida' suelen ofrecer una gran potencia ya que están
exclusivamente diseñadas para resolver un problema específico. Otros, llamados paquetes integrados de
software, ofrecen menos potencia pero a cambio incluyen varias aplicaciones, como un programa
procesador de textos, de hoja de cálculo y de base de datos.

Otros ejemplos de programas de aplicación pueden ser: programas de comunicación de datos,


multimedia, presentaciones, diseño gráfico, cálculo, finanzas, correo electrónico, navegador web,
compresión de archivos, presupuestos de obras, gestión de empresas, etc.

CICLO DE VIDA DE UNA APLICACIÓN INFORMÁTICA.

Una aplicación informática se compone de uno o varios programas interrelacionados que tienen por
objeto la realización de una determinada tarea de forma automática mediante el uso de un sistema
informático.

Ciclo de vida de una aplicación informática es el proceso que se sigue desde el planteamiento de un
problema hasta que se tiene una solución instalada en la computadora, y en funcionamiento por los
usuarios finales mientras sea de utilidad el citado proceso.

Se compone de varias fases, agrupadas en dos bloques bien diferenciados:

DISEÑO DEL PROGRAMA

En el diseño de un programa tenemos diferentes pasos:

Análisis del problema. Este paso es fundamental. La correcta resolución de un problema viene
determinada en gran medida por el planteamiento inicial. Un planteamiento correcto nos evitará perder
tiempo en la implementación de algoritmos que posteriormente nos demos cuenta que son incorrectos.
En este paso nos debemos hacer tres preguntas: ¿Qué entradas se nos ofrece?, ¿Qué salida debemos
generar? y ¿Cuál es el método que debemos usar para llegar hacia la solución deseada?

Diseño del algoritmo. Si en el análisis determinamos qué hace el programa aquí determinamos cómo lo
hace. Para ello se divide el problema en varios sub-problemas que se solucionan de forma independiente

3
(divide y vencerás), lo que se denomina diseño modular. En este paso puede ser conveniente la utilización
de diagramas de flujo o pseudocódigo.

Codificación. Es la escritura del código según el algoritmo decidido en las etapas anteriores.
Compilación y ejecución. Una vez escrito el código, se compila. Si el código contiene errores el compilador
nos los mostrará: son los llamados errores de compilación, que suelen estar relacionados con
incoherencias en la sintaxis, conversión incorrecta de tipos, etc. Una vez solucionados estos errores, se
creará el programa ejecutable.

Verificación. Al ejecutar el programa puede ocurrir que realice lo que queríamos o que, por el contrario,
produzca un resultado indeseado. Nos encontramos aquí con dos tipos de errores:
 Errores de ejecución: Se producen cuando el programa llega a un punto en el que el ordenador no
puede realizar la operación que se le solicita: división por cero, desbordamiento, etc.

 Errores del algoritmo: Son los más difíciles de detectar, se producen cuando el algoritmo está mal
implementado. Nos conduce al siguiente paso.

Depuración. Esta es una parte importante. Se utilizan las herramientas de depuración del compilador que
usamos, lo que en gran medida determina si el compilador es mejor o peor. En general, todos los
compiladores incluyen entre sus herramientas de depuración las siguientes:

 Ejecución paso a paso: En lugar de ejecutar todo el programa hasta su finalización, se ejecuta línea a
línea, lo que permite observar el comportamiento del programa en cada momento.
 Watches (inspecciones): permiten seguir el valor de una variable y comprobar que cambia su valor
en su momento y modo deseado.
 Debug Inspector: similar a las watches pero especialmente útil para la visualización de arrays, listas,
etc.
 Breakpoints: si la ejecución es demasiado larga, podemos definir un breakpoint (punto de ruptura)
en una o varias líneas. El programa se ejecutará normalmente hasta que llegue a una de esas líneas.
En ese momento la ejecución se detendrá y podremos consultar valores de variables o ejecutar paso
a paso desde ese punto.
 Evaluar/modificar: permite obtener el valor de una variable en un punto en el que la ejecución del
programa se ha pausado. Se puede modificar el valor de dicha variable para comprobar, por ejemplo,
que si tuviera otro valor el comportamiento también sería el esperado.

ERRORES

Cuando una vez tenemos escrito el código del programa y ordenamos su ejecución, se produce una
“lectura de interpretación” previa llamada compilación. Recordemos que el ordenador no interpreta
directamente las órdenes que le damos sino que necesita una traducción. Si durante esa traducción se
detecta un problema el programa no comienza a ejecutarse. Lo más habitual es que se detecten fallos de
sintaxis, ciertos procesos no válidos e incluso errores lógicos tipo bucle infinito en algunas circunstancias.
Si el programa no compila estamos obligados a realizar las correcciones oportunas antes de poder
ejecutarlo.

CLASIFICACIÓN DE ERRORES.
Los errores en un programa o algoritmo se pueden clasificar en distintos tipos. Atendiendo a los efectos
que ocasionan se podría hablar de errores que impiden la ejecución de un programa y errores que no
impiden la ejecución de un programa. Atendiendo al momento en que se producen podríamos hablar de
errores de compilación y errores de ejecución. Lo vemos en forma de esquemas:

4
Atendiendo a los efectos que ocasionan:

Atendiendo al momento en que se producen:

Durante la ejecución del programa pueden producirse errores previsibles porque se derivan del código o
imprevisibles por ser su origen externo (entradas incorrectas de usuario, problemas con ficheros, etc.).

Un error de ejecución puede ser gestionado (vía detección o vía lógica) pero uno de compilación no.

Hay errores cuya clasificación no es sencilla. Por ejemplo, si al usuario se le pide un número entero durante
la ejecución del programa, pero introduce uno real, se puede producir un error de ejecución por proceso
no válido. Sin embargo, el trasfondo del error es lógico: el programa no está preparado para reaccionar
ante una situación que es posible. A estos errores los llamaremos errores de fondo lógico.

TIPOS DE PROGRAMACIÓN

Los tipos o técnicas de programación son bastante variados, aunque puede que muchos de los lectores
sólo conozcan una metodología para realizar programas. En la mayoría de los casos, las técnicas se centran
en programación modular y programación estructurada, pero existen otros tipos de programación. Los
explicaremos a lo largo del artículo.

1. Programación estructurada (PE)


La programación estructurada está compuesta por un conjunto de técnicas que han ido
evolucionando aumentando considerablemente la productividad del programa reduciendo el tiempo
de depuración y mantenimiento del mismo.

Esta programación estructurada utiliza un número limitado de estructuras de control, reduciendo así
considerablemente los errores.

Esta técnica incorpora:

 Diseño descendente (top-dow): el problema se descompone en etapas o estructuras jerárquicas.

5
 Recursos abstractos (simplicidad): consiste en descompones las acciones complejas en otras más
simples capaces de ser resueltas con mayor facilidad.

 Estructuras básicas: existen tres tipos de estructuras básicas:

 Estructuras secuénciales: cada acción sigue a otra acción secuencialmente. La salida de una
acción es la entrada de otra.

 Estructuras selectivas: en estas estructuras se evalúan las condiciones y en función del resultado
de las mismas se realizan unas acciones u otras. Se utilizan expresiones lógicas.

 Estructuras repetitivas: son secuencias de instrucciones que se repiten un número determinado


de veces.

Las principales ventajas de la programación estructurada son:

 Los programas son más fáciles de entender


 Se reduce la complejidad de las pruebas
 Aumenta la productividad del programador
 Los programas queden mejor documentados internamente.

Un programa está estructurado si posee un único punto de entrada y sólo uno de salida, existen de
"1 a n" caminos desde el principio hasta el fin del programa y por último, que todas las instrucciones
son ejecutables sin que aparezcan bucles infinitos.

2. Programación modular
En la programación modular consta de varias secciones dividas de forma que interactúan a través de
llamadas a procedimientos, que integran el programa en su totalidad.
En la programación modular, el programa principal coordina las llamadas a los módulos secundarios
y pasa los datos necesarios en forma de parámetros.
A su vez cada módulo puede contener sus propios datos y llamar a otros módulos o funciones.

3. Programación orientada a objetos (POO)


 Se trata de una técnica que aumenta considerablemente la velocidad de desarrollo de los
programas gracias a la reutilización de los objetos.
 El elemento principal de la programación orientada a objetos es el objeto.
 El objeto es un conjunto complejo de datos y programas que poseen estructura y forman parte
de una organización.
 Un objeto contiene varios datos bien estructurados y pueden ser visibles o no dependiendo del
programador y las acciones del programa en ese momento.
 El polimorfismo y la herencia son unas de sus principales características y por ello dedicaremos
más adelante un artículo exclusivamente a tratar estos dos términos.
 En Desarrollo Web.com hemos publicado anteriormente una explicación de lo que es la
programación orientada a objetos.

4. Programación concurrente
 Este tipo de programación se utiliza cuando tenemos que realizar varias acciones a la vez.
 Se suele utilizar para controlar los accesos de usuarios y programas a un recurso de forma
simultánea.
 Se trata de una programación más lenta y laboriosa, obteniendo unos resultados lentos en las
acciones.

5. Programación funcional

6
Se caracteriza principalmente por permitir declarar y llamar a funciones dentro de otras funciones.

6. Programación lógica
Se suele utilizar en la inteligencia artificial y pequeños programas infantiles. Se trata de una
programación basada en el cálculo de predicados (una teoría matemática que permite lograr que un
ordenador basándose en hecho y reglas lógicas, pueda dar soluciones inteligentes).

DOCUMENTACIÓN DE LOS PROGRAMAS

Para que el mantenimiento de una aplicación informática sea lo más fácil posible, es conveniente disponer
de toda su documentación, esto es, de todos los documentos que se han ido generando en todas las
etapas anteriores: algoritmos, códigos fuentes, manuales de usuario, etc. A todo este tipo de
documentación se le considera externa. Además, existe otro tipo de documentación llamada interna.

La documentación interna de un programa son los comentarios que el programador puede escribir en el
código fuente de un programa y que el compilador no tendrá en cuenta, ya que, no son instrucciones. Los
comentarios de un programa son explicaciones o aclaraciones que ayudarán al programador en un futuro,
cuando quiera revisar o modificar el código fuente de dicho programa, y todavía serán de más ayuda si la
modificación la tiene que realizar un programador distinto al que escribió el código fuente en un primer
momento.

En la ejecución de un programa se deben de seguir una serie de pasos desde que se plantea el problema
hasta que se dispone del programa o del a aplicación funcionando en el ordenador.

Los pasos son los siguientes:

 Análisis de factibilidad
 Análisis de requerimientos
 Diseño del sistema
 Implementación
 Validación y pruebas
 Explotación
 Mantenimiento

Cada uno de estos pasos debe de llevar asociado un documento. Estos documentos son muy importantes
ya que van a regir las fases del ciclo de vida del software y se recogen los pasos seguidos en cada fase para
su ejecución.

No es viable la solución mostrada por algunos programadores de ir directamente a la implementación sin


antes pararse en las fases 1, 2 y 3. Un trabajo deficiente en estas fases supone una mala definición del
problema y por tanto el sistema no cumplirá seguramente con todos los requisitos. El diseño del sistema
no será efectivo y los errores serán de difícil solución.

NOCIONES SOBRE ESTRUCTURAS DE DATOS

En programación, una estructura de datos es una forma de organizar un conjunto de datos elementales
con el objetivo de facilitar su manipulación. Un dato elemental es la mínima información que se tiene en
un sistema.

Una estructura de datos define la organización e interrelación de estos y un conjunto de operaciones que
se pueden realizar sobre ellos. Las operaciones básicas son:

7
 Alta, adicionar un nuevo valor a la estructura.
 Baja, borrar un valor de la estructura.
 Búsqueda, encontrar un determinado valor en la estructura para realizar una operación con este
valor, en forma secuencial o binario (siempre y cuando los datos estén ordenados).

Otras operaciones que se pueden realizar son:

 Ordenamiento, de los elementos pertenecientes a la estructura.


 Apareo, dadas dos estructuras originar una nueva ordenada y que contenga a las apareadas.
Cada estructura ofrece ventajas y desventajas en relación a la simplicidad y eficiencia para la realización
de cada operación. De esta forma, la elección de la estructura de datos apropiada para cada problema
depende de factores como la frecuencia y el orden en que se realiza cada operación sobre los datos.

ESTRUCTURAS DE DATOS

TIPOS DE DATOS Y OPERACIONES

Dato: Un dato es la expresión general que describe los objetos con los cuales opera una computadora. La
mayoría de las computadoras pueden trabajar con varios tipos o modos de datos. Los algoritmos y los
programas correspondientes operan sobre datos.

TIPOS COMPLEJOS DE DATOS


Una estructura de Datos es una colección de datos que pueden ser caracterizados por su organización y
las operaciones que se definen en ella.

Los tipos de datos más frecuentes utilizados en los diferentes lenguajes de programación son:

Entero (integer)
Real (real)
Estándar Carácter (char)
Datos simples Lógico (Boolean

Definido por el Subrango (subrange)


programador (no Enumerativo (enumerated)
estándar)

8
Arrays (vectores/matrices)
Registros
Simples o estáticos
Ficheros
Conjuntos
Cadenas (string)
Datos estructurados

Compuestos o dinámicos Listas (pilas/colas)


Listas enlazadas
Árboles
grafos

Los tipos de datos simples pueden ser organizados en diferentes estructuras de datos: dinámica y
estáticas.

LAS ESTRUCTURAS DE DATOS DINÁMICAS:


No tienen las limitaciones o restricciones en el tamaño de memoria ocupada que son propias de las
estructuras estáticas.

Mediante el uso de un tipo de datos especifico, denominado puntero, es posible construir estructuras de
datos dinámicas que no son soportadas por la mayoría de los lenguajes, pero que en aquellos que si tienen
estas características ofrecen soluciones eficaces y efectivas en la solución de problemas complejos.

Se caracteriza por el hecho de que con un nombre se hace referencia a un grupo de casillas de memoria.
Es decir un dato estructurado tiene varios componentes.

LAS ESTRUCTURAS DE DATOS ESTÁTICAS:


Son aquellas en las que el tamaño ocupado en memoria se define antes de que el programa se ejecute y
no puede modificarse dicho tamaño durante la ejecución del programa.

Estas estructuras están implementadas en casi todos los lenguajes.

Su principal característica es que ocupan solo una casilla de memoria, por lo tanto una variable simple
hace referencia a un único valor a la vez, dentro de este grupo de datos se encuentra: enteros, reales,
caracteres, boléanos, enumerados y subrangos (los últimos no existen en algunos lenguajes de
programación)

Datos Numéricos: Los tipos de datos numéricos es el conjunto de los valores numéricos. Estos pueden
representarse en dos formas distintas:

Tipo numérico entero


Tipo numérico real

Tipo de Dato Entero: El tipo entero es un subconjunto finito de los números enteros. Los enteros son
números completos, no tienen componentes fraccionarios o decimales y pueden ser negativos o
positivos.

Ejemplos:

6 7
-8 89
14 20
1450 -160

9
Los números enteros máximos y mínimos de una computadora suelen ser –32.768 a +32.767. Los
números enteros fuera de este rango no se suelen representar como enteros, sino como reales, aunque
existen excepciones (enteros largos).

Tipo de Dato Real: El tipo de dato real consiste en un subconjunto de los números reales. Los números
reales siempre tienen un punto decimal y pueden ser positivos o negativos. Un número real consta de
una parte entera y una parte decimal.

Ejemplos:
3769.42
-52.11
-8.25 34.007

En aplicaciones científicas se requiere una representación especial para manejar números muy grandes,
como la masa de Tierra, o muy pequeños como la masa de un electrón.

Tipos de Datos Lógicos (Booleanos)


También denominado booleano, es aquel dato que solo puede tomar uno de dos valores:

Verdadero (true)
Falso (false)

Este tipo de dato se utiliza para representar las alternativas (si/no) a determinadas condiciones. Por
ejemplo cuando se pide si un valor entero es par, la respuesta será verdadera o falsa, según sea par o
impar.

Tipo de Dato Carácter y Tipo de Cadena: Es el conjunto finito y ordenado de caracteres que la
computadora reconoce. Un dato tipo carácter solo contienen un carácter.

Los caracteres que reconocen las diferentes computadoras no son estándar; sin embargo, la mayoría
reconoce los siguientes caracteres alfabéticos y numéricos:

Caracteres alfabéticos (A,B,C,.......,Z)(a,b, c,.......,z).


Caracteres numéricos (1, 2,....9, 0)
Caracteres especiales (+, -, *, /, ¨, <, >, $,.......)

Una cadena de caracteres (también denominada string) es una sucesión de caracteres que se encuentran
delimitados por una comilla (apóstrofo) o dobles comillas, según el tipo de lenguaje de programación. La
longitud de una cadena de caracteres es el número de ellos comprendidos entre los separadores o
limitadores.

CONSTANTES Y VARIABLES.

Constantes: Los programas de computadoras contienen ciertos valores que no deben cambiar durante la
ejecución del programa, a estos valores se les denomina constantes.

Reglas para escribir una constante:- No se permiten escribir comas.

Ejemplos:

1.234 -0.56

Existen constantes tipo carácter o constante de caracteres y tienen un carácter válido encerrado dentro
de apóstrofos. Ejemplo:
‘B’ ‘+’ ‘4’ ‘;’

10
Si se desea incluir el apóstrofo en la cadena, entonces debe aparecer como un par de apóstrofos
encerrados dentro de simples ‘’ ‘’

Una constante tipo cadena es una cadena encerrada entre apóstrofos. Por ejemplo:

‘José Jalón’
‘Corporación Noboa’

Constantes Lógicas
Existen dos constantes lógicas

Verdad y Falso

Variables: Existen otros valores que pueden cambiar durante la ejecución de un programa y es lo que se
conoce con el nombre de variables.

Dependiendo del lenguaje, hay diferentes tipos de variables, tales como enteras, reales, carácter, lógicas
y de cadena.

Variables Tipo cadena: Es una variable cuyo valor es una cadena de caracteres. Las cadenas pueden ser
entradas o salidas desde un terminal.

La longitud de una cadena es el número de caracteres que contiene. La cadena que no contiene ningún
carácter se denomina cadena nula o vacía, y su longitud es cero.
Una cadena formada de espacios en blanco no es una cadena nula. Por ejemplo:
Esta cadena tendrá como longitud la cantidad de espacios en blanco que contenga.

Ejemplo de longitud de cadena:

C E N T R O E D U C T V O I N T E G R A L
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

Esta cadena tiene una longitud de 22 caracteres.

OPERACIONES CON CADENAS

Comparación.- Se pueden comparar cadenas entre sí.


Ejemplo 1
‘A’ > ‘B’ La letra A es mayor que la letra B
‘10’ < ‘15’ El carácter 10 es menor que el carácter 15.

Nota: Estas comparaciones se hacen con su respectivo valor decimal en la tabla de caracteres ASCII.

Igualdad
‘COLEGIO-TÉCNICO’ = ‘COLEGIO-TÉCNICO’ Estas cadenas son iguales
‘COLEGIO-TÉCNICO’ = ‘colegio-técnico’ Estas cadenas no son iguales

Cálculos de longitud
Podemos saber cuál es la longitud de una cadena
‘Mi primera clase de programación’ La longitud de esta cadena es de 32 caracteres
Los nombres de las variables elegidas para el algoritmo o el programa deben ser significativos y tener
relación con el objeto que representan, por ejemplo:

Una variable llamada CARGO puede ser utilizada para representar el cargo de una persona.
CODIGO puede ser utilizada para representar el Código de un artículo, etc.

11
Reglas para nombres de variables: El tamaño variará dependiendo del lenguaje que se esté utilizando.

Existen lenguajes que solo permiten nombres de hasta 8 caracteres, otros permiten más de 8.

EXPRESIONES: Son combinaciones de constantes, variables, símbolos de operación, paréntesis y nombres


de funciones especiales. Ejemplo:

a + (c + 3) * d

Cada expresión toma un valor que se determina tomando los valores de las variables y las constantes
implicadas y la ejecución de las operaciones indicadas.
Una expresión consta de operándoos y operadores.

Las expresiones se clasifican en:

 Expresiones Aritméticas
 Expresiones lógicas
 Expresiones carácter.

Expresiones Aritméticas
Estas expresiones son similares a las fórmulas matemáticas. Las variables que utiliza son numéricas, ya
sea real o entera; y las operaciones son las aritméticas.

Operaciones aritméticas
+ Suma
- Resta
* Multiplicación
/ División
˄ Exponenciación

Operadores Relaciónales
< Menor que
> Mayor que
= Igual que
>= Mayor o igual que
<= Menor o igual que
<> Diferente de

Operadores Lógicos
Not Negación
And Conjunción
OR Disyunción

Operadores DIV Y MOD

DIV: Representa una división entera


Ejemplo:
A DIV B
Si A = 19 y B = 6, el resultado será 3; es decir solo la parte entera.

12
MOD: Dará como resultado el residuo de una división.
Ejemplo:
A mod B
Si A = 19 y B = 6, el resultado de esta operación será 1.

Expresiones lógicas booleanas


El valor de estas expresiones es siempre verdadero o falso. En conclusión una expresión lógica o booleana
es una expresión que solo puede tomar estos dos valores: verdad y falso.

Las expresiones lógicas se forman combinando constantes lógicas, variables lógicas y otras expresiones
lógicas, utilizando los operadores not, and y or y los operadores relacionales.

El valor de una operación con expresiones lógicas puede ser:

1 Verdadero
0 Falso

Resultado de operaciones utilizando AND y OR

AND OR
1 1 1 1 1 1
1 0 0 1 0 1
0 1 0 0 1 1
0 0 0 0 0 0

Operaciones de Asignación: Esta operación sirve para darle valor valores a una variable

La operación de asignación se representa con el símbolo  . La operación de asignación se conoce como


una instrucción o sentencia de asignación cuando nos referimos a un lenguaje de programación.

Ejemplo:

Nombre de la variable  expresión

Si A tiene un valor de 5 y después de realizar la siguiente operación

A  20, tenemos que el valor que tenía anteriormente A (5) se pierde desde el momento en que le
asignamos el nuevo valor (20).
Otros ejemplos

B  10
C2
A8

Asignaciones Aritméticas

Ejemplos:
A3*2 + 5
Multiplicamos 3*2 y luego le sumamos 5
El resultado lo asignamos a la variable A
A tendrá un valor de 11

Residuo  20 MOD 7

13
Dividimos 20 para 7
El residuo lo asignamos a la variable residuo
Residuo tendrá un valor de 6
Si
A3 la variable A toma el valor de 3
B5 la variable B toma el valor de 5

A  A * 4 + B el contenido de A es decir 3 lo multiplicamos por 2 y luego le sumamos el contenido de la


variable B (5) y el resultado, es decir 17, lo asignamos a la variable A. (El nuevo valor de A ya no será 3 sino
17)

Asignaciones Lógicas
La expresión que se evalúa en la operación de asignación es lógica.

Ejemplo:

M  8 < 4 8 no es menor que 4, por lo tanto me dará un valor de falso, es decir 0 y lo asignamos a la
variable M, ahora M tendrá un valor de 0

Nota: Recuerde que el resultado de una asignación lógica solo puede tener 2 valores:
(Falso); 1 (verdadero)

Asignaciones de cadenas de caracteres


La expresión que se evalúa es de tipo cadena

Ejemplo:

COLEGIO - TECNICO ‘Colegio Técnico’


Asignamos a la variable COLEGIO-TÉCNICO una cadena de caracteres.

ESTRUCTURAS EXTERNAS
Ficheros: Es un estructura informática para el almacenamiento de datos en memoria secundaria
gestionado por el sistema operativo. Un fichero es un conjunto de sectores físicos de un dispositivo de
memoria secundaria que guardan información sobre un tema concreto. El Sistema Operativo es el
encargado de gestionar que sectores pertenece a cada fichero, si están ocupado o libres, si tienen fallos,
si el sector está completo, cual es el siguiente sector de un fichero, etc.

La estructura de control que gestiona la información sobre ficheros, sectores, ocupación, etc, se denomina
Sistema de ficheros. Existen distintos sistemas de ficheros según el sistema operativo con el que
trabajemos: FAT16, FAT32, NTFS, EXT2, RAISER, NFS, SySV, OS2... Existen también sistemas de ficheros
estándar, independientes del sistema operativo, como el ISO 9660 que corresponde con el formato
habitual de los CD-ROM de datos. Para poder trabajar con una unidad de almacenamiento, debemos crear
la información sobre sistema de ficheros que reconoce el sistema operativo, a este proceso se le
denomina comúnmente formatear

Todas las estructuras de datos que hemos visto hasta ahora utilizan memoria principal.

Esto tiene dos limitaciones importantes:

1. Los datos desaparecen cuando el programa termina.


2. La cantidad de los datos no puede ser muy grande debido a la limitación de la memoria principal.

Por eso existen también estructuras especiales que utilizan memoria secundaria: los ficheros.

14
El fichero es además una estructura dinámica, en el sentido de que su tamaño puede variar durante la
ejecución del programa dependiendo de la cantidad de datos que tenga.

Un fichero puede contener cualquier tipo de información: instrucciones en C (c, cpp, h), en código
máquina (.exe, com, lib, obj, dll) , imagenes en distintos formatos ( jpg, gif, bmp), documentos de texto
sin formato (txt), con un formato especifico (rtf, doc, html), sonido ( wav, mp3), video (avi,divx), fichas de
los clientes, una lista de alumnos, el registro de windows, etc.

La gran capacidad de la memoria RAM que ofrecen actualmente los ordenadores hace que gran parte del
tratamiento que antes se realizaba en base a ficheros, ahora se realice con estructuras en memoria RAM,
grabando la información a fichero sólo cuando es necesario. Para trabajar con grandes volúmenes de
datos se utiliza, por el contrario, los llamados Sistemas de Gestión de bases de Datos. Los SGBD facilitan
enormemente la labor al programador, ofreciendo un buen rendimiento y velocidad en acceso a los datos.

¿Que debe controlar el sistema operativo de una unidad de almacenamiento?

Hay que tener control de los bloques libres y ocupados por cada fichero, mantener la información sobre
los directorios, manejar los buffers en las operaciones de entrada y salida, controlar que ficheros están
abiertos, porque programas, almacenar los premisos, permitir enlaces, controlar el acceso compartido a
un mismo fichero....

Una unidad de almacenamiento (Disco duro) puede tener varias particiones, cada partición tiene su
propio sistema de ficheros independiente.

Un sistema operativo puede controlar distintas particiones con sistemas de ficheros diferentes. Ej.-
GNU/Linux ( Ext2, ReiserFS, FAT) o Windows 2000 Server ( FAT, NTFS). Generalmente es más seguro tener
varias particiones que una sola muy grande.

TIPOS DE FICHEROS
Ficheros de texto, en los cuales sus componentes o elementos son caracteres dispuestos en líneas.

Ficheros de registros, los más clásicos en informática, en los cuales los componentes son registros, los
cuales son un conjunto de datos llamados campos, pertenecientes a una misma entidad.

Ficheros de objetos, donde los componentes del fichero son objetos de una misma clase.

Según su sistema de organización y método de acceso a sus componentes se clasifican en:

Ficheros Secuenciales, en la que sus componentes se almacenan de forma consecutiva o secuencial, y


que para acceder a un componente hay que procesar a todos los componentes que le preceden en dicho
fichero.
Ficheros Directos/Aleatorios/Relativos, este tipo de ficheros permiten el acceso a un componente en
base a la posición relativa que ocupa dicho componente en el fichero.

Ficheros Indexados, este tipo de ficheros permiten el acceso a sus componentes en base a una clave que
permite diferenciar a cada componente del resto.

Atendiendo a su relación con el programa se clasifican en:

 Ficheros de Entrada o lectura, aportan o envían información al programa.


 Ficheros de Salida o escritura, reciben información desde el programa.
 Ficheros de Entrada /Salida, intercambian información con el programa en ambos sentidos.

15
BLOQUE
2
CONCEPTOS BÁSICOS DE METODOLOGÍA
DE LA PROGRAMACIÓN
HERRAMIENTAS DE PROGRAMACION
Los métodos o herramientas más usuales para la representación de algoritmos son:

 Diagrama de flujo
 Pseudocódigo.

DIAGRAMAS DE FLUJO: Un diagrama de flujo es una representación gráfica de un algoritmo o de una


parte del mismo. Los diagramas de flujo ayudan en la comprensión de la operación de las estructuras de
control.

La ventaja de utilizar un algoritmo es que se lo puede construir independientemente de un lenguaje de


programación, pues al momento de llevarlo a código se lo puede hacer en cualquier lenguaje.

Un diagrama de flujo u organigrama es una representación diagramático que ilustra la secuencia de las
operaciones que se realizan para conseguir la solución de un problema y son usados normalmente para
seguir la secuencia lógicas de las acciones en el diseño de problemas de computadoras y se dibujan
generalmente antes de comenzar a programar el código frente a la computadora y una que se dibuja el
diagrama de flujo, llega hacer fácil escribir el programa en cualquier idioma de alto nivel.

Importancia de los Diagramas de Flujo:

Es importante ya que ayuda a designar cualquier representación gráfica de un procedimiento o parte de


ese, como su nombre lo indica representa el flujo de información de un proceso.

Dichos diagramas se construyen utilizando ciertos símbolos de uso especial como son rectángulos,
diamantes, óvalos, y pequeños círculos, estos símbolos están conectados entre sí por flechas, conocidas
como líneas de flujo.

A continuación se detallarán estos símbolos.

Este se utiliza para representar el inicio o el fin de un algoritmo. También puede


representar una parada o una interrupción programada que sea necesaria realizar en
un programa.

Este se utiliza para un proceso determinado, es el que se utiliza comúnmente para


representar una instrucción, o cualquier tipo de operación que origine un cambio
de valor.

Este símbolo es utilizado para representar una entrada o salida de información, que
sea procesada o registrada por medio de un periférico.

Este es utilizado para la toma de decisiones, ramificaciones, para la indicación de


operaciones lógicas o de comparación entre datos.

Este es utilizado para enlazar dos partes cualesquiera de un diagrama a través de un conector
de salida y un conector de entrada. Esta forma un enlace en la misma página del diagrama.

16
Este es utilizado para enlazar dos partes de un diagrama pero que no se encuentren en la
misma página.

Este es utilizado para indicar la secuencia del diagrama de flujo, es decir, para indicar el
sentido de las operaciones dentro del mismo.

Este es utilizado para representar la salida de información por medio de la impresora.

Este es utilizado para representar la salida o para mostrar la información por medio
del monitor o la pantalla.

REGLAS DE LOS DIAGRAMAS DE FLUJO

 Debe de indicar claramente dónde inicia y dónde termina el diagrama.


 Cualquier camino del diagrama debe de llevarte siempre a la terminal de fin.
 Organizar los símbolos de tal forma que siga visualmente el flujo de arriba hacia abajo y de
izquierda a derecha.
 No usar lenguaje de programación dentro de los símbolos.
 Centrar el diagrama en la página.
 Las líneas deben ser verticales u horizontales, nunca diagonales.

No cruzar las líneas de flujo empleando los conectores adecuados sin hacer uso excesivo de ellos.

No fraccionar el diagrama con el uso excesivo de conectores.


Solo debe llegar una sola línea de flujo a un símbolo. Pero pueden llegar muchas líneas de flujo a otras
líneas.

Las líneas de flujo deben de entrar a un símbolo pro la parte superior y/o izquierda y salir de él por la parte
inferior y/o derecha.

17
Evitar que el diagrama sobrepase una página; de no ser posible, enumerar y emplear los conectores
correspondientes.
Usar lógica positiva, es decir, realizar procesos cuando es verdadera la condición y expresar las
condiciones de manera clara (por ej., "no es a =/= de b" ==> "a=b").
Comentar al margen únicamente cuando sea necesario.

Tipos de Diagramas:

Diagrama de Programa: Representa gráficamente un método propuesto para la solución de un problema


determinado.

Diagrama de Sistema: Representa la integración; interacción lógicas de los elementos dentro de un


sistema propuesto.

Diagrama de Procedimiento: Representa gráficamente una operación o flujo de datos dentro de un


sistema.

Diagrama de flujo sencillo con los pasos a seguir si una lámpara no funciona.

1. Determinar si 2 números son iguales o diferentes, si son diferentes determinar cuál de los 2 es el
mayor.

18
2. Cambiar un Caucho desinflado de un Automóvil.

Ejercicios
Diagrama de Flujo que calcule el 13,5% de cualquier número; lo muestre por impresora.
- Identificación de variables y análisis de proceso.

N= 0
C= 13,5%
R= N * 13,5% ó R= N*C

Inicio Inicio

N=0 Declarar variables


R=0
r
N Leer N

R= N * 13,5%
Proceso / Calcular

R Imprimir Resultado

Fin
Fin

19
Algoritmo y Diagrama de Flujo para calcular la masa de un objeto que se mueve con una fuerza y una
aceleración, donde: F= m.a, Imprimir el resultado con su respectivo mensaje.
- Identificación de variables y análisis de proceso.

F= m*a
m= f/a
Inicio Inicio

m=0 f= 0 Declarar variables


a=0
r

a Leer a
f Leer f

m= f / a
Proceso / Calcular

“La masa es: ” Imprimir Resultado

Fin Fin

Algoritmo y Diagrama de Flujo para calcular el área de un círculo donde: a= π * r2


- Identificación de variables y análisis de proceso.

a= 0
r= 0 Inicio Inicio
π= 3,14
a=0 Pi= 3,14 Declarar variables
r=0
r
r Leer r

a= π * r2 Proceso / Calcular

“El área es: “ Imprimir Resultado

Fin Fin

PSEUDOCÓDIGO
Pseudocódigo es una forma de diagramar un algoritmo para resolver un determinado problema, sin
atenerse a ningún lenguaje de programación en especial.

En vez de escribir el programa directamente en un lenguaje de programación determinado (C, Basic, etc.),
crearemos un borrador entendible para todos, para luego de tener bien en claro lo que se debe hacer,
pasar a la programación propiamente dicha.

20
El pseudocódigo se refiere a crear un código para orientar a los programadores, pero sin la sintaxis ni la
estructura propia de ningún lenguaje.

REQUERIMIENTOS PSEUDOCODIFICACIÓN CODIFICACIÓN

No hay que confundirlo con un diagrama de flujo.

Utilización en la práctica
En el trabajo de un analista de sistemas, una de las partes más trabajosas es la de determinar qué es lo
que necesitan de un sistema los usuarios finales. Se dedican muchas horas a hacer un relevamiento de los
datos que serán necesarios, los tipos de procesamientos, las salidas, etc. Y debe existir una realimentación
entre el diseño y el usuario, para garantizar que el sistema cumpla con los requisitos del usuario.

Supongamos que tenemos un sistema para una empresa que utiliza una interfaz gráfica en Visual Basic,
algunas aplicaciones específicas en C, y páginas PHP para trabajo vía Internet. Seguramente que crear un
diagrama específico para cada lenguaje sería una tarea tediosa.
Gracias a esta herramienta, podemos reunir a todos los programadores, dar las pautas de trabajo, y
mediante el pseudocódigo, cada programador sabrá lo que hace el sistema, y podrá escribir el código
correspondiente.

Incluso dos programadores que dominen el mismo lenguaje pueden tener metodologías de trabajo
distintas. Un problema puede ser resuelto de muchas maneras, cada una más o menos eficiente que la
otra, pero todas cumplen con el objetivo.

El pseudocódigo elimina estas diferencias, dando libertad a los programadores para que puedan ajustarse
a su metodología de trabajo.

Generalmente, este código se escribe con la participación de todos los programadores. Esto representa
la ventaja de que muchas opiniones ayudan a elegir la mejor entre todas, logrando una solución efectiva
y eficaz al problema planteado.

Manejo de condiciones, entradas y salidas

Gran parte de la programación se basa en evaluación de variables, para luego mostrar un resultado, ya
sea por pantalla o por impresora.

Dos o más variables se comparan en base a un patrón predefinido, y en base a ello se ejecuta una u otra
acción. A continuación voy a escribir pseudocódigo que puede utilizarse para representar sentencias
condicionales.

Comenzaremos con la más famosa, la sentencia If - Else - Endif

If (condicion1=valor)
{
ejecutar acción
}
else
{
ejecutar acción
}
endif

21
En esta sentencia tenemos que si se cumple una condición, se ejecutará determinado proceso, en caso
contrario, se ejecutará otro.

Mediante pseudocódigo podemos representarlo como

Si condicion1 =valor Entonces


{
ejecutar algo
}
Si no
{
ejecutar algo
}
Fin si

Otra sentencia condicional es el Select Case, en la cual una variable se compara con varios valores
posibles.

Select Case (variable)

Case valor1:
Ejecutar proceso
Break
Case valor2:
Ejecutar proceso
Break
Case valor3:
Ejecutar proceso
Break
End Select

Como vemos, a cada valor posible corresponde determinada acción.


Mediante pseudocódigo se puede representar como
Seleccionar caso (variable)

En caso de valor1:
Ejecutar algo
Salir
En caso de valor2:
Ejecutar algo
Salir
En caso de valor3:
Ejecutar algo
Salir
Fin Seleccionar

También están las entradas y salidas de datos.


Para leer los datos desde teclado, podemos utilizar la siguiente forma

Imprimir “Ingrese dato por teclado”


Variable=leer teclado

Para presentar resultados en pantalla, podemos tomar el siguiente ejemplo

Procesar datos
Imprimir “Resultado de la operación” resultados

22
Programa 1:
Necesitamos un programa que en base a diez notas de distintos exámenes de un alumno, nos genere
automáticamente el promedio. Y si el promedio es mayor o igual a 7, nos dará un mensaje de aprobación.
En caso contrario, nos avisará que el alumno no aprobó.

Inicio
Luego, debemos ingresar los datos por teclado, en un bucle de 10 ingresos, y guardar en alguna variable
las notas

Desde 1 a 10
{
leer dato
suma_notas=suma_notas + dato
}

Una vez que tengamos todos los datos, debemos utilizar un procedimiento para calcular el promedio
Promedio=suma_notas/10

Ahora debemos utilizar otro procedimiento para calcular si el alumno aprobó o no. Para ello se utilizará
una condición.

Si (promedio=>7) entonces
{
imprimir “El alumno aprobó”
}
Sino
{
imprimir “El alumno no aprobó”
}
Fin si
Finalmente, debemos terminar el programa
Fin

De esta manera tenemos definida la estructura del programa. Como pueden observar, la estructura se
comprende muy fácilmente, y en base a esto cualquier programador puede traducirlo al lenguaje que
domine, para luego compilarlo.

Vamos a ver este programa escrito en los dos lenguajes antes mencionados. A ver si notan las diferencias.

Programa escrito en C

#include <stdio.h> promedio=promedio/10;


viod main()
{ if(promedio>=7)
int numero=0, i=0; {
double promedio=0.00; printf(“\nEl alumno aprobó”);
}
for(i==0;i<10;i++) else
{ {
scanf(“%d”,&numero); printf(“\nEl alumno no aprobó”);
promedio=promedio+numero; }
} }

23
Programa escrito en Basic

DIM numero, i AS INTEGER


DIM promedio AS DOUBLE

FOR i=0 TO 9
INPUT “”, numero
promedio=promedio+numero
NEXT i

promedio=promedio/10

IF (promedio>=7) THEN
PRINT “El alumno aprobó”
ELSE
PRINT “El alumno no aprobó”
ENDIF

END

Los dos programas realizan el mismo trabajo, pero con distinta estructura y sintaxis.
El pseudo código, como podrán deducir, sirve para evitar confusiones entre el analista de sistemas y los
programadores, o entre programadores.

ESTRUCTURA GENERAL DE UN PROGRAMA


Un programa de computadora es un conjunto de instrucciones órdenes dadas a la máquina que
producirán la ejecución de una determinada tarea. En esencia un programa es un medio para conseguir
un fin. El fin será normalmente definido como la información necesaria para solucionar un problema.
Su estructura es la siguiente.

 Encabezados
 Declaraciones
 Identificadores
 Reglas

24
Encabezados: Está delimitada por la Cabecera del programa y por una palabra reservada y en ella se
declaran o se definen todos los elementos habituales de programación (variables, subprogramas, etc.)
que se van a utilizar en el programa y que están disponibles en el lenguaje.

Declaraciones: En todo programa es necesario declarar o definir previamente todo lo que se vaya a utilizar
y que no tenga un significado específico o a priori para el lenguaje de programación. En esta sección se
realizan estas definiciones o declaraciones del programa.

Declaración de variables
Declaraciones de constantes
Declaración de funciones y procedimientos

Identificadores: Un identificador es un nombre de un programa, una variable, una constante, un tipo de


dato, una función, un procedimiento, una etiqueta, una unidad o un campo de una estructura en un
programa.

Reglas: Los lenguajes de programación tienen elementos básicos que se usan como bloques
constructivos, así como reglas, que componen su sintaxis. Solamente las instrucciones sintácticamente
correctas serán reconocidas por la computadora, los programas con errores de sintaxis no serán
ejecutados.

PARTES DE UN PROGRAMA
Dentro del bloque de instrucciones de un programa se pueden diferenciar tres partes fundamentales. En
algunos casos, estas tres partes están perfectamente delimitadas, pero en la mayoría sus instrucciones
quedan entremezcladas a lo largo del programa, si bien mantienen una cierta localización geométrica
impuesta por la propia naturaleza de las mismas.

Entrada de datos: la constituyen todas aquellas instrucciones que toman datos


de un dispositivo externo, almacenándolos en la memoria central para que
puedan ser procesados.

Proceso o algoritmo: está formado por las instrucciones que modifican los
objetos a partir de su estado inicial hasta el estado final, dejando éstos
disponibles en la memoria central.

Salida de resultados: conjunto de instrucciones que toman los datos finales de


la memoria central y los envían a los dispositivos externos.

CLASIFICACIÓN DE LAS INSTRUCCIONES

Una instrucción es lo que le ordenamos a la máquina para que ejecute, por eso se dice que un programa
es un conjunto de instrucciones; ya que cuando ejecutamos un programa, se ejecutan así mismo en su
interior muchas instrucciones que hacen que la maquina realice algo.

Estos son los tipos de instrucciones:

 instrucciones declarativas
 instrucciones de asignación
 instrucciones selectivas
 instrucciones repetitivas
 instrucciones de entrada y salida de datos
 instrucciones de bifurcación

25
INSTRUCCIONES DECLARATIVAS: Sirven para declarar librerías, variables, constantes, arreglos,
punteros, estructuras…

Por ejemplo: En C++

Para librerías:
Las librerias las declaramos porque vamos a usar recursos que contienen ellas.

 #include <iostream.h> ——> cin , cout..


 #include <conio.h> ——> funcion getch()..
 #include <string.h> ——> para manipular cadenas
 #include <math.h> ——> para operaciones numéricas
 #include <time.h> ——> para usar la hora
 #include <stdio.h> ——> para usar alternativas de entrada – salida como printf, scanf

Para variables: Las variables las declaramos con el fin de tener un espacio para almacenar algún dato que
va a cambiar con el tiempo.

 char nombre; ——> Declarando variable tipo carácter


 int a,b,c; ——> Declarando variable tipo entero
 double sueldo ——> Declarando variable tipo decimal
 short contador ——> Declarando variable tipo entero-corto

Consejo: A las únicas variables que se deben dar valores iniciales son a:

 Los contadores
 Los acumuladores

Acumuladores: Se incrementa o decrementa en un valor variable.


Ejemplo: sacar el promedio de un alumno, se suman las notas (que varían) y se divide para el numero de
notas.

Contadores: se incrementa o decrementa en una forma constante.


Ejemplo: va contando de “1 en 1″ ó de “-3 en -3″ , etc…

Para constantes: Las constantes las declaramos con el fin de tener un espacio para almacenar algún
dato que no va a cambiar.
Se las puede declarar de dos formas:

Tomemos como ejemplo la fórmula para hallar el área de un triángulo:

¿ qué es lo que nunca cambia ?

La base puede variar, la altura puede variar. Pero como vemos el “2” es constante, sea cual sea la base o
la altura el 2 se queda ahi. Entonces si queremos declarar al “2” como una constante, podemos hacerlo
de dos maneras:

1. Anteponiéndole ” #define ” al nombre de la constante y luego el valor que le corresponde, así:


#define nomb 2

Nota: al usar éste método no se le pone el delimitador ”; ” al final de la línea.

26
A continuación coloco un ejemplo en código, para que tengan una idea de cómo sería:

#include <iostream.h>
main()
{
#define nomb 2 ——> Declarada la constante de la forma 1.
int base,altura,area;
cout<<”Ingrese base: \n”;
cin >>base;
cout<<”Ingrese altura: \n”;
cin >>altura;
area = ( base * altura )/nomb;
cout<<”El area del triangulo es: “<< area <<endl;
system(“pause”);
}

2. Anteponiéndole ” const ” seguido del tipo de variable que és, después el nombre de la constante y
luego el valor que va a contener, asi:

const int nomb = 2;

Nota: a diferencia del método anterior, éste si lleva el delimitador ” ; ” al final de la línea.

A continuación coloco un ejemplo en código, para que tengan una idea de cómo seria:

#include <iostream.h>
main()
{
const int nomb = 2; ——> Declarada la constante de la forma 2.
int base,altura,area;
cout<<”Ingrese base: \n”;
cin >>base;
cout<<”Ingrese altura: \n”;
cin >>altura;
area = ( base * altura )/nomb;
cout<<”El area del triángulo es: “<< area <<endl;
system(“pause”);
}

Para arreglos: Los arreglos son un conjunto de variables del mismo tipo y nombre, pero indexadas por
una posicion diferente.

float vector [12]; ——> Declarando un arreglo tipo flotante ( decimal )

ése “vector” que se ha declarado arriba, al ser un arreglo quiere decir que hay 12 variables con el mismo
nombre y son del mismo tipo, pero diferenciadas únicamente en su posición, así:

vector[0],vector[1],vector[2],vector[3],vector[4],vector[5],vector[6], ………….. ,vector[10],vector[11].

Nota: los arreglos siempre comienzan en la posición cero ( 0 ) por eso llegan hasta una unidad menos, en
éste caso como declaramos un arreglo de 12 , su tope será de 11; puesto a que desde cero ( 0 ) hasta once
( 11 ) hay doce ( 12 ) variables ;)

Para punteros: Los punteros son variables que almacenan direcciones de memoria y se los reconoce por
llevar un “asterisco” ( * ) delante del nombre de la variable, así:

27
float * ventas ;

Para estructuras: Las estructuras son una agrupación de variables que forman un registro, se las denota
de ésta manera:

struct alumno
{
int cedula;
char nombre;
short edad;
}

INSTRUCCIONES DE ASIGNACION. Sirven para dar valores a las variables, y llevan éste formato:

nombre_variable = expresión ;
Por ejemplo:
a = 15 ;
x=a+5;
z=x/2;

INSTRUCCIONES SELECTIVAS. Son mediante las cuales podemos ejecutar diferentes acciones, como
resultado de una expresion que estemos evaluando en ese momento y pueden ser:

 Las selectivas simples


 Las selectivas dobles
 Las selectivas múltiples

Simples: Las que como resultado de una expresión que se esté evaluando, solo podemos ejecutar una
opción por verdadero; ejemplo:

if ( expresión a evaluar ) ——> Si ésa expresión es verdadera y solo es verdadera, se ejecutarán las acciones.
{
acción_1;
acción_2;
}
Dobles:
Nos permite seleccionar entre dos diferentes acciones:
 Una por verdadero
 Otra por falso

if ( expresion a evaluar ) ——> Si ésa expresión es verdadera, se ejecutarán las acciones 1 y 2.


{
accion_1;
accion_2;
}

else ——> Pero si ésa expresión era falsa, se ejecutarán las acciones 3 y 4.
{
accion_3;
accion_4;
}
Multiples: Podemos ejecutar diferentes acciones como resultado de una expresión que estemos
evaluando; ejemplo:

28
switch ( expresion a evaluar ) ——> Esta es la expresion que vamos a evaluar.
{
case 1 : accion 1 ;
case 2 : accion 2 ;
case 3 : accion 3 ;
}

INSTRUCCIONES REPETITIVAS. Sirven para repetir una condición N veces, siempre y cuando la condición
sea verdadera.

a) Cuando no sabemos cuántas veces tendrá que ejecutarse una acción para que sea verdadera, se usa
el While y el Do – While. Estas dos instrucciones repetitivas son muy parecidas en su función, y llegan
al mismo resultado. Solo cambia la sintaxis:

Para while:

While ( expresión ) ——> Mientras esa expresión sea verdadera hará las acciones 1 y 2.
{
acción 1;
acción 2;
}

Para Do – While:

Do
{
acción 1;
acción 2;
}
While ( expresión ) ——> Mientras esa expresión sea verdadera hará las acciones 1 y 2.

b) Cuando sabemos cuántas veces queremos que se realice una acción, pues usamos la instruccion
repetitiva ” for “, su sintaxis es la siguiente:

for ( expresión inicial ; expresión final ; incremento / decremento )


{
acciónes; ——> Hasta que no llegue a la “expresión final“, se ejecurá la acción una y otra vez.
}

INSTRUCCIONES DE ENTRADA Y SALIDA DE DATOS. El lenguaje C++ no tiene palabras reservadas para
ingresar o mostrar datos, para ello usa recursos que se encuentran en las librerías.

Por ejemplo:
En la libreria <iostream.h> tenemos para la entrada y salida de datos a cin y cout respectivamente.

Uso:
Para la entrada de datos ( pedir )
cin >> nombre_del_usuario ;

Para la salida de datos ( mostrar )


cout << nombre_del_usuario

En la librería <stdio.h> tenemos para la entrada y salida de datos a scanf y printf respectivamente.

29
Uso:
Para la entrada de datos ( pedir )
scanf ( ” %i %s %f ” , &edad apellido &sueldo ) ;

Nota: Los amperson ( & ) van en todo tipo de variable menos en las cadenas de caracteres cuando usamos
el scanf.
Para la salida de datos ( mostrar )
printf ( ” su edad es: %i ” , edad )

INSTRUCCIONES DE BIFURCACIÓN. Interrumpen el flujo normal de un programa, es decir que evitan que
se ejecute alguna instrucción del programa y salta a otra parte del programa.

Por ejemplo: el “ break “


Switch ( expresión que estamos evaluando )
{
case 1 : cout << ” Hola! “ ; break ;
case 2 : cout << ” amig@s “ ;
}

En el ejemplo anterior tenemos, que en caso de que haya sido “1″ pues mostrará “Hola!” y saldrá del
programa dejando a un lado lo demás. Entonces hemos comprobado que interrumpió el flujo normal del
programa.
Pero si tuvieramos algo de ésta manera:

Switch ( expresión que estamos evaluando )


{
case 1 : cout << ” Hola! “ ;
case 2 : cout << ” amig@s ” ;
case 3 : cout << ” bienvenidos a “ ;
case 4 : cout << ” Programando: Paso a Paso “ ; break ;
}
Entonces el flujo normal del programa avanza hasta el caso 4 dónde vemos que está el ” break ” y él pues
interrumpe el flujo normal del programa y ahí acabaría nuestro programa, como resultado nos hubiera
mostrado lo siguiente: ” Hola! amig@s bienvenidos a Programando: Paso a Paso “.

Así mismo, hay otras que cumplen funciones parecidas como por ejemplo:

continue: éste hace que se salte la instrucción en donde está y pase a la siguiente, por ejemplo:

for ( x=1; x<10; x++ )


{
if ( x == 5 ) continue;
cout << x << endl;
}
Como resultado muestra: 1 – 2 – 3 – 4 – 6 – 7 – 8 – 9
No muestra el número 5, porque ahí se encuentra el continue.

goto : éste nos lleva a una línea que indiquemos por medio de etiquetas. Así:

A:
………….
………….
if ( x == 100 ) goto A ;
Y otros como ” return ” que devuelve un valor ( usado en funciones por lo general ), otro es ” exit ” que
obliga a salir.

30
VARIABLES AUXILIARES.

Las variables auxiliares representan pasos en los que se descompone el cálculo de una variable de flujo a
partir de los valores tomados por los niveles y de otras variables.

El propósito del uso de las variables auxiliares está en facilitar la comprensión y definición de las variables
de flujo, aunque no es exclusiva esta tarea, ya que las variables auxiliares suelen representar en sí mismas
conceptos individuales.

CONTADOR: Es un valor que se incrementa o decrementa, según sea el caso, un contador en términos
constante es un valor fijo que se va a ir contando, es decir cumpliendo una función cuantitativa.

Es un campo en memoria, el cual sirve (como su nombre lo indica) para contar, éste incrementa en el
valor de 1 y nos muestra el número de veces que el proceso ha detectado una ocurrencia determinada y
siempre deberemos expresarlo en forma cuantitativa.

C= 0

Ejemplo: C= C+1

C= Variable contador
C + 1= Se incrementa cuantitativamente.

ACUMULADOR: Es un campo de memoria, un valor que se incrementa en forma no definida esto por la
suma de otro valor a dicho campo.

Es un campo en memoria, pero que su incremento no es de 1, sino que viene alterándose por la suma de
un valor a dicho campo.

Ejemplo = TSDO = 0
TSDO = TSDO + SDO
0 + 14000
14000 + 20000
34000 + 2000
36000

Todos los totales implica Acumulador, posiblemente se puede utilizar sumatoria ∑.

SWITCH. Es una instrucción de decisión múltiple, donde el compilador prueba o busca el valor contenido
en una variable contra una lista de constantes ints o chars, cuando el computador encuentra el valor de
igualdad entre variable y constante, entonces ejecuta el grupo de instrucciones asociados a dicha
constante, si no encuentra el valor de igualdad entre variable y constante, entonces ejecuta un grupo de
instrucciones asociados a un default, aunque este último es opcional.

31
BLOQUE
3 C++, UN LENGUAJE ESTRUCTURADO
LENGUAJES DE PROGRAMACIÓN

Para que un programador realice un proceso se le debe suministrar en primer lugar un algoritmo
adecuado. El programador debe ser capaz de interpretar el algoritmo, lo que significa:

Comprender las instrucciones de cada paso,


Realizar las operaciones correspondientes.

Programa Lenguaje de programación Programación Programador

Cuando el procesador es una computadora, el algoritmo se ha de expresar en un formato que se


denomina programa.

SISTEMAS DE PROCESAMIENTO DE LA INFORMACIÓN

Datos:- Se refiere a la representación de algún hecho (palabras escritas números y dibujos)


Información:- Se refiere a datos procesados y organizados.(Suma números)

500 * 10 = 5000

Datos Información
(Números y operadores) (Resultado)

Como concepto final tendríamos que un Sistema de Procesamiento de información es un sistema que
transforma datos brutos en información organizada, significativa y útil.

Entrada = datos Procesador Salida = Información

Pasos para la resolución de un problema

Diseño del Algoritmo que describe la secuencia ordenada de pasos que conducen a la solución de un
problema dado.

Expresar el algoritmo como un programa en un lenguaje de programación adecuado.


Ejecución y validación del programa por la computadora.

Diseño Programa
Problema Del De
Algoritmo computadora

Para llegar a la realización de un programa es necesario el diseño previo de un algoritmo, de modo que
sin algoritmo no puede existir un programa.

32
TIPOS DE LENGUAJES

Los principales lenguajes utilizados en la actualidad son:

 Lenguaje de máquina
 Lenguaje de bajo nivel (ensamblador)
 Lenguajes de alto nivel.

LENGUAJES DE MÁQUINA: Son aquellos que están escritos en lenguajes directamente inteligibles por la
máquina (computadora), ya que sus instrucciones son cadenas binarias (0 y 1).

Todas las instrucciones preparadas en cualquier lenguaje de máquina tienen por lo menos dos partes. La
primera es el comando u operación, que dice a la computadora cuál es la función que va a realizar. Todas
las computadoras tienen un código de operación para cada una de sus funciones. La segunda parte de la
instrucción es el operando, que indica a la computadora dónde hallar o almacenar los datos y otras
instrucciones que se van a manipular; el número de operandos de una instrucción varía en las distintas
computadoras

Las instrucciones en lenguaje de máquina dependen del hardware de la computadora, y por lo tanto
diferirán de una computadora a otra.

Ventajas

 La posibilidad de cargar (transferir un programa a la memoria) sin necesidad de traducción posterior,


lo que supone una velocidad de ejecución superior a cualquier otro lenguaje de programación.

Desventajas

 Dificultad y lentitud en la codificación.


 Poca fiabilidad,
 Dificultad grande de verificar y poner a punto los programas,
 Los programas solo son ejecutables en el mismo procesador (CPU)

SISTEMA DE NUMERACIÓN BINARIO (0 - 1)

El sistema de numeración binario utiliza sólo dos dígitos, el cero (0) y el uno (1).
En una cifra binaria, cada dígito tiene distinto valor dependiendo de la posición que ocupe. El valor de
cada posición es el de una potencia de base 2, elevada a un exponente igual a la posición del dígito menos
uno. Se puede observar que, tal y como ocurría con el sistema decimal, la base de la potencia coincide
con la cantidad de dígitos utilizados (2) para representar los números.

El número de combinaciones que podemos realizar en el sistema de numeración binario viene dado por
la expresión 2n siendo n el número de bits.
Para la medida de cantidades de información representada en binario se utiliza una serie de unidades
múltiples del bit que reciben nombre propio:

Bit: 0 - 1
Nibble o cuarteto: 4 bits
Byte u octeto: 8 bits
Kilobyte (KB): 1024 Bytes
Megabyte (MB): 210 Kb = 10242 Bytes
Gigabyte (GB): 210 MB = 10243 Bytes

33
Terabyte (TB): 210 GB = 10244 Bytes

Ejemplo:
Transformar el número decimal 100 en binario.

Paso de binario a decimal

11011101,11(2)  B(10)

1 · 20 + 0 · 21 + 1 · 22 + 1 · 23 + 0 · 24 + 1 · 25 + 1 · 26 + 1 · 2-1 + 1 · 2-2 = 109,75(10)

Paso de decimal a binario

37,86(10)  B(2)= 101001,1101 37 2


17 18 2
0,86 · 2 = 1,72 1 0 9 2
0,72 · 2 = 1,44 1 4 2
0,44 · 2 = 0,88 0 2 2
0,88 · 2 = 1,76 0 1

Suma de binario

0+0=1
0+1=1
1+0=1
1+1=0

1 1 0 1 1(2)
+ 1 0 1 1 1(2)
1 1 0 0 1 0(2)

Resta de binario

0–0=0
0 – 1 = 1; AC = 1
1–0=1
1–1=0

SISTEMA DE NUMERACIÓN OCTAL

El sistema de numeración octal es un sistema de numeración en base 8, una base que es potencia exacta
de 2 o de la numeración binaria. Esta característica hace que la conversión a binario o viceversa sea
bastante simple.

En el sistema de numeración octal, los números se representan mediante ocho dígitos diferentes: 0, 1, 2,
3, 4, 5, 6 y 7. Cada dígito tiene, naturalmente, un valor distinto dependiendo del lugar que ocupen. El valor
de cada una de las posiciones viene determinado por las potencias de base 8.

34
Por ejemplo, el número octal 12348 tiene un valor que se calcula así:

1*83 +
2*82 + 3*81 + 4*80
1*512 + 2*64 + 7*8 + 4*1 = 66810
12348 = 66810

Para realizar la conversión de binario a octal, realice lo siguiente:

Agrupe la cantidad binaria en grupos de 3 en 3 iniciando por el lado derecho. Si al terminar de agrupar no
completa 3 dígitos, entonces agregue ceros a la izquierda.
Posteriormente vea el valor que corresponde de acuerdo a la tabla:

Número binario 000 001 010 011 100 101 110 111
Octal 0 1 2 3 4 5 6 7

Ejemplos
110 111 (binario) = 67 (octal). Proceso:
111 = 7
110 = 6
Agrupe de izquierda a derecha: 67

11 001 111 (binario) = 317 (octal). Proceso:


111 = 7
001 = 1
11 entonces agregue un cero, con lo que se obtiene 011 = 3
Agrupe de izquierda a derecha: 317

1 000 011 (binario) = 103 (octal). Proceso:


011 = 1
000 = 0
001 = 1

De octal a Decimal.
Para pasar de base 8 a base decimal, solo hay que multiplicar cada cifra por 8 elevado a la posición de la
cifra, y sumar el resultado

Por ejemplo:
407128 es un número en base 8 y representa el número:
4 * 84 = 16 384
0 * 83 = 0
2
7 * 8 = 448
1 * 81 = 8
2 * 80 = 2
16 842
De Decimal a Octal.
Para convertir un número en base decimal a base octal se divide por 8 sucesivamente hasta llegar a
cociente 0, y los restos de las divisiones en orden inverso indican el número en octal.

74 8
2 9 8
1 1

35
El octal es 112
En informática, a veces se utiliza la numeración octal en vez de la hexadecimal. Tiene la ventaja de que no
requiere utilizar otros símbolos diferentes de los dígitos.

Fracciones
La numeración octal es tan buena como la binaria y la hexadecimal para operar con fracciones, puesto
que el único factor primo para sus bases es 2. Todas las fracciones que tengan un denominador distinto
de una potencia de 2 tendrán un desarrollo octal periódico.

Inicie por el lado izquierdo (la primera cifra a la derecha de la coma), cada número multiplíquelo por 2
elevado a la potencia consecutiva a la inversa (comenzando por la potencia -1, 2-1).

Después de realizar cada una de las multiplicaciones, sume todas y el número resultante será el
equivalente al sistema decimal.

Fracción Octal Resultado en octal


½ ½ 0,4
1/3 1/3 0,25252525 periódico
¼ ¼ 0,2
1/5 1/5 0,14631463 periódico
1/6 1/6 0,125252525 periódico
1/7 1/7 0,111111 periódico
1/8 1/10 0,1
1/9 1/11 0,07070707 periódico
1/10 1/12 0,063146314 periódico

SISTEMA DE NUMERACIÓN HEXADECIMAL

El sistema Hexadecimal, a veces abreviado como Hex, es el sistema de numeración de base 16, empleando
por tanto 16 símbolos 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E y F. Se utilizan los caracteres A, B, C, D, E y F
representando las cantidades decimales 10, 11, 12, 13, 14 y 15 respectivamente. Su uso actual está muy
vinculado a la informática y ciencias de la computación, pues los computadores suelen utilizar el byte u
octeto como unidad básica de memoria; y, debido a que un byte representa 28 valores posibles, y esto
puede representarse como, 28 = 24 * 24 = 16* 16 que, según el teorema general de la numeración
posicional, equivale al número en base 16 10016, dos dígitos hexadecimales corresponden exactamente
permiten representar la misma línea de enteros a un byte.

En principio dado que el sistema usual de numeración es de base decimal y, por ello, sólo se dispone de
diez dígitos, se adoptó la convención de usar las seis primeras letras del alfabeto latino para suplir los
dígitos que nos faltan.
Se debe notar que A = 10, B = 11, C = 12, D = 13, E = 14 y F = 15. En ocasiones se emplean letras minúsculas
en lugar de mayúsculas. Como en cualquier sistema de numeración posicional, el valor numérico de cada
dígito es alterado dependiendo de su posición en la cadena de dígitos, quedando multiplicado por una
cierta potencia de la base del sistema, que en este caso es 16.

Por ejemplo:

3E0A16 =

3×163 + E×162 + 0×161 + A×160

36
3×4096 + 14×256 + 0×16 + 10×1 = 15882.

El sistema hexadecimal actual fue introducido en el ámbito de la computación por primera vez por IBM
en 1963. Una representación anterior, con 0–9 y u–z, fue usada en 1956 por la computadora Bendix G-15.

Veamos un ejemplo numérico: 3E0,A (16) = ( 3×162 ) + ( E×16¹ ) + ( 0×160 ) + ( A×16–1 ) = ( 3×256 ) + ( 14×16
) + ( 0×1 ) + ( 10×0,0625 ) = 992,625

2A703 16 es un número en base 16 y representa el número:

{2 * 16^4 + 10 * 16^3 + 7 * 8^2 + 0 * 16^1 + 3 * 16^0 = 2 * 65536 + 10 * 1096 + 7 * 256 + 0 * 16 + 3 * 1 =


16384 + 10960 + 1792 + 0 + 3 = 29139}

Tabla de la suma en base 16:


+ 0 1 2 3 4 5 6 7 8 9 A B C D E F
0 0 1 2 3 4 5 6 7 8 9 A B C D E F
1 1 2 3 4 5 6 7 8 9 A B C D E F 10
2 2 3 4 5 6 7 8 9 A B C D E F 10 11
3 3 4 5 6 7 8 9 A B C D E F 10 11 12
4 4 5 6 7 8 9 A B C D E F 10 11 12 13
5 5 6 7 8 9 A B C D E F 10 11 12 13 14
6 6 7 8 9 A B C D E F 10 11 12 13 14 15
7 7 8 9 A B C D E F 10 11 12 13 14 15 16
8 8 9 A B C D E F 10 11 12 13 14 15 16 17
9 9 A B C D E F 10 11 12 13 14 15 16 17 18
A A B C D E F 10 11 12 13 14 15 16 17 18 19
B B C D E F 10 11 12 13 14 15 16 17 18 19 1A
C C D E F 10 11 12 13 14 15 16 17 18 19 1A 1B
D D E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C
E E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D
F F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E

Tabla de la multiplicación en base 16:


* 2 3 4 5 6 7 8 9 A B C D E F 10
2 4 6 8 A C E 10 12 14 16 18 1A 1C 1E 20
3 6 9 C F 12 15 18 1B 1E 21 24 27 2A 2D 30
4 8 C 10 14 18 1C 20 24 28 2C 30 34 38 3C 40
5 A F 14 19 1E 23 28 2D 32 37 3C 41 46 4B 50
6 C 12 18 1E 24 2ª 30 36 3C 42 48 4E 54 5A 60
7 E 15 1C 23 2A 31 38 3F 46 4D 54 5B 62 69 70
8 10 18 20 28 30 38 40 48 50 58 60 68 70 78 80
9 12 1B 24 2D 36 3F 48 51 5A 63 6C 75 7E 87 90
A 14 1E 28 32 3C 46 50 5A 64 6E 78 82 8C 96 A0
B 16 21 2C 37 42 4D 58 63 6E 79 84 8F 9A A5 B0
C 18 24 30 3C 48 54 60 6C 78 84 90 9C A8 B4 C0
D 1ª 27 34 41 4E 5B 68 75 82 8F 9C A9 B6 C3 D0

37
E 1C 2A 38 46 54 62 70 7E 8C 9A A8 B6 C4 D2 E0
F 1E 2D 3C 4B 5A 69 78 87 96 A5 B4 C3 D2 E1 F0
Tabla de los primeros 16 números

Decimal Binario Octal Hexadecimal


0 0000 0 0
1 0001 1 1
2 0010 2 2
3 0011 3 3
4 0100 4 4
5 0101 5 5
6 0110 6 6
7 0111 7 7
8 1000 10 8
9 1001 11 9
10 1010 12 A
11 1011 13 B
12 1100 14 C
13 1101 15 D
14 1110 16 E
15 1111 17 F

LENGUAJES DE BAJO NIVEL (ENSAMBLADOR): Estos lenguajes son más fáciles de utilizar que los lenguajes
de máquina, pero al igual de ellos dependen de la máquina en particular.

Implementa una representación simbólica de los códigos de máquina binarios y otras constantes
necesarias para programar una arquitectura dada de CPU y constituye la representación más directa del
código máquina específico para cada arquitectura legible por un programador. Esta representación es
usualmente definida por el fabricante de hardware, y está basada en los mnemónicos que simbolizan los
pasos de procesamiento (las instrucciones), los registros del procesador, las posiciones de memoria y
otras características del lenguaje. Un lenguaje ensamblador es por lo tanto específico de cierta
arquitectura de computador física (o virtual).

Ventajas

 Frente a los lenguajes de máquina tienen mayor velocidad de codificación y su velocidad de cálculo.

Desventajas

 Dependencia total de la máquina, lo que impide la transportabilidad de los programas. (posibilidad


de ejecutar un programa en diferentes máquinas).

 La formación de los programadores es más compleja que las correspondientes a los programadores
de alto nivel, ya que no exige no solo las técnicas de programación, sino también el conocimiento del
interior de la máquina.

38
LENGUAJES DE ALTO NIVEL: Son los más utilizados por los programadores (Basic, Pascal, Cobol, Lenguaje
C, C++, Visual Basic, Visual Fox, Gambas, Php, Netbeans, Pitón, entre otros.

Ventajas
 Están diseñados para que las personas escriban y entiendan los programas de un modo mucho más
fácil que los lenguajes de máquina y el ensamblador.
 Un programa escrito en un lenguaje de alto nivel es independiente de la máquina; esto es, las
instrucciones del programa de la computadora no dependen del diseño del hardware o de una
computadora en particular.
 Son portables o transportables lo que significa la posibilidad de ser ejecutados con poca o ninguna
modificación en diferentes tipos de computadoras.
 El tiempo de formación de los programadores es relativamente corto comparado con otros lenguajes.
 La escritura de programas se basa en reglas sintácticas similares a los seres humanos. Nombres de
las instrucciones, tales como READ, WRITE, PRINT, OPEN, etc.
 Las modificaciones y puestas a punto de los programas son más fáciles.

Desventajas
 Incremento del tiempo de puesta a punto, al necesitar diferentes traducciones del programa fuente
para conseguir el programa definitivo.
 No se aprovechan los recursos internos de la máquina, que se explotan mucho mejor en los lenguajes
de máquina y ensambladores.
 Aumento de la ocupación de la memoria.
 El tiempo de ejecución de los programas es mucho mayor

Adicionalmente tenemos los siguientes lenguajes.

LENGUAJES COMPILADOS. Naturalmente, un programa que se escribe en un lenguaje de alto nivel también
tiene que traducirse a un código que pueda utilizar la máquina. Los programas traductores que pueden
realizar esta operación se llaman compiladores. Éstos, como los programas ensambladores avanzados,
pueden generar muchas líneas de código de máquina por cada proposición del programa fuente. Se
requiere una corrida de compilación antes de procesar los datos de un problema.

Los compiladores son aquellos cuya función es traducir un programa escrito en un determinado lenguaje
a un idioma que la computadora entienda (lenguaje máquina con código binario).

Al usar un lenguaje compilado (como lo son los lenguajes del popular Visual Studio de Microsoft), el
programa desarrollado nunca se ejecuta mientras haya errores, sino hasta que luego de haber compilado
el programa, ya no aparecen errores en el código.

LENGUAJES INTERPRETADOS. Se puede también utilizar una alternativa diferente de los compiladores
para traducir lenguajes de alto nivel. En vez de traducir el programa fuente y grabar en forma permanente
el código objeto que se produce durante la corrida de compilación para utilizarlo en una corrida de
producción futura, el programador sólo carga el programa fuente en la computadora junto con los datos
que se van a procesar. A continuación, un programa intérprete, almacenado en el sistema operativo del
disco, o incluido de manera permanente dentro de la máquina, convierte cada proposición del programa
fuente en lenguaje de máquina conforme vaya siendo necesario durante el proceso de los datos. No se
graba el código objeto para utilizarlo posteriormente.

La siguiente vez que se utilice una instrucción, se le debe interpretar otra vez y traducir a lenguaje
máquina. Por ejemplo, durante el procesamiento repetitivo de los pasos de un ciclo, cada instrucción del
ciclo tendrá que volver a ser interpretado cada vez que se ejecute el ciclo, lo cual hace que el programa
sea más lento en tiempo de ejecución (porque se va revisando el código en tiempo de ejecución) pero
más rápido en tiempo de diseño (porque no se tiene que estar compilando a cada momento el código
completo). El intérprete elimina la necesidad de realizar una corrida de compilación después de cada

39
modificación del programa cuando se quiere agregar funciones o corregir errores; pero es obvio que un
programa objeto compilado con antelación deberá ejecutarse con mucha mayor rapidez que uno que se
debe interpretar a cada paso durante una corrida de producción.

LENGUAJES DE PROGRAMACIÓN DECLARATIVOS. Se les conoce como lenguajes declarativos en ciencias


computacionales a aquellos lenguajes de programación en los cuales se le indica a la computadora qué es
lo que se desea obtener o qué es lo que se está buscando, por ejemplo: Obtener los nombres de todos
los empleados que tengan más de 32 años. Eso se puede lograr con un lenguaje declarativo como SQL.

La programación declarativa es una forma de programación que implica la descripción de un problema


dado en lugar de proveer una solución para dicho problema, dejando la interpretación de los pasos
específicos para llegar a dicha solución a un intérprete no especificado. La programación declarativa
adopta, por lo tanto, un enfoque diferente al de la programación imperativa tradicional.

En otras palabras, la programación declarativa provee el “qué”, pero deja el “cómo” liberado a la
implementación particular del intérprete. Por lo tanto se puede ver que la programación declarativa tiene
dos fases bien diferenciadas, la declaración y la interpretación.
Es importante señalar que a pesar de hacer referencia a intérprete, no hay que limitarse a “lenguajes
interpretados” en el sentido habitual del término, sino que también se puede estar trabajando con
“lenguajes compilados”.

TRADUCTORES DE LENGUAJE

Los traductores de lenguaje son programas que traducen a su vez los programas fuente escritos en
lenguaje de alto nivel a código de máquina.
Los traductores se dividen en:

 Compiladores,
 Intérpretes.

Compiladores. Un compilador es un programa que traduce los programas fuente escritos en lenguajes de
alto nivel a lenguaje de máquina

Intérpretes. Toma un programa fuente, lo traduce y a continuación lo ejecuta. Como por ejemplo, Basic,
Qbasic, QuickBasic, aunque ya no se utilizan.

Los programas escritos en lenguaje de alto nivel se llaman programas fuente y el programa traducido se
denomina programa objeto o código objeto. El compilador traduce -sentencia a sentencia- el programa
fuente

La compilación y sus fases


La compilación es el proceso de traducción de programas fuente a programas objeto. El programa objeto
obtenido de la compilación ha sido traducido normalmente a código de máquina.

Programa fuente
Compilador (traductor)
Programa Objeto
Montador
Programa ejecutable
En lenguaje de máquina

40
COMPILADORES FRENTE A INTERPRETE.

COMPILADOR:

Un compilador acepta programas escritos en un lenguaje de alto nivel y los traduce a otro lenguaje,
generando un programa equivalente independiente, que puede ejecutarse tantas veces como se quiera.
En un compilador hay que distinguir tres lenguajes diferentes:

 El de los programas de partida (LA)


 El de los programas equivalentes traducidos (LB), normalmente el lenguaje de máquina
 El lenguaje en que está escrito el propio compilador (LC), que puede ser igual o diferente a uno de los
otros dos.

INTERPRETE:
Un intérprete es un traductor de lenguaje, igual que un compilador, pero difiere de éste en que ejecuta
el programa fuente inmediatamente, en vez de generar un código objeto que se ejecuta después de que
se completa la traducción.

Los programas interpretados suelen ser más lentos que los compilados, pero los intérpretes son más
flexibles como entornos de programación y depuración. Comparando su actuación con la de un ser
humano, un compilador equivale a un traductor profesional que, a partir de un texto, prepara otro
independiente traducido a otra lengua, mientras que un intérprete corresponde al intérprete humano,
que traduce de viva voz las palabras que oye, sin dejar constancia por escrito.

Ventajas de compilar frente a interpretar:

 Se compila una vez, se ejecuta n veces.


 En bucles, la compilación genera código equivalente al bucle, pero interpretándolo se traduce tantas
veces una línea como veces se repite el bucle.
 El compilador tiene una visión global del programa, por lo que la información de mensajes de error es
más detallada. Ventajas del intérprete frente al compilador:
 Un intérprete necesita menos memoria que un compilador. En principio eran más abundantes dado
que los ordenadores tenían poca memoria.
 Permiten una mayor interactividad con el código en tiempo de desarrollo.

Ventajas del intérprete frente al compilador:

• El programa se puede ejecutar de inmediato, sin esperar a ser compilado.


• Puede ser interrumpido con facilidad.
• puede ser rápidamente modificado y ejecutado nuevamente.
• Resultan muy apropiados durante la fase de desarrollo de un programa, ya que la compilación no
permite la ejecución paso a paso del programa y con ello impide la edición seguimiento y
depuración del programa.

Desventajas del intérprete frente al compilador:

41
• La ejecución es más lenta, pues cada instrucción debe ser traducida a código máquina tantas veces
como sea ejecutada.
• No son adecuados en la fase de explotación del programa ya que el proceso de interpretación se ha de
repetir cada vez que se ejecuta el programa, mientras que con la compilación, una vez obtenido el
programa en leguaje máquina éste puede ser ejecutado sin necesidad de compilarlo de nuevo.

TABLA DEL CÓDIGO ASCII

LENGUAJE C ++

Introducción.
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 inicialmente fue creado para la programación de

• Sistemas operativos
• Intérpretes
• Editores
• Ensambladores
• Compiladores
• Administradores de bases de datos.

42
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.
• Permite la separación de un programa en módulos que admiten compilación independiente.

PROCESO PARA LA OBTENCIÓN DE UN PROGRAMA EJECUTABLE

Probablemente este es el lugar más adecuado para explicar cómo se obtiene un fichero ejecutable a partir
de un programa C++.
Para empezar necesitamos un poco de vocabulario técnico. Veremos algunos conceptos que se manejan
frecuentemente en cualquier curso de programación y sobre todo en manuales de C y C++.

Fichero fuente y programa o código fuente:


Los programas C y C++ se escriben con la ayuda de un editor de textos del mismo modo que cualquier
texto corriente. Los ficheros que contiene programas en C o C++ en forma de texto se conocen como
ficheros fuente, y el texto del programa que contiene se conoce como programa fuente. Nosotros siempre
escribiremos programas fuente y los guardaremos en ficheros fuente.

Ficheros objeto, código objeto y compiladores:


Los programas fuente no pueden ejecutarse. Son ficheros de texto, pensados para que los comprendan
los seres humanos, pero incomprensibles para los ordenadores.

Para conseguir un programa ejecutable hay que seguir algunos pasos. El primero es compilar o traducir el
programa fuente a su código objeto equivalente. Este es el trabajo que hacen los compiladores de C y
C++. Consiste en obtener un fichero equivalente a nuestro programa fuente comprensible para el
ordenador, este fichero se conoce como fichero objeto, y su contenido como código objeto.

Los compiladores son programas que leen un fichero de texto que contiene el programa fuente y generan
un fichero que contiene el código objeto.

El código objeto no tiene ningún significado para los seres humanos, al menos no directamente. Además
es diferente para cada ordenador y para cada sistema operativo. Por lo tanto existen diferentes
compiladores para diferentes sistemas operativos y para cada tipo de ordenador.

Librerías:
Junto con los compiladores de C y C++, se incluyen ciertos ficheros llamados librerías. Las librerías
contienen el código objeto de muchos programas que permiten hacer cosas comunes, como leer el
teclado, escribir en la pantalla, manejar números, realizar funciones matemáticas, etc. Las librerías están
clasificadas por el tipo de trabajos que hacen, hay librerías de entrada y salida, matemáticas, de manejo
de memoria, de manejo de textos, etc.

Hay un conjunto de librerías muy especiales, que se incluyen con todos los compiladores de C y de C++.
Son las librerías ANSI o estándar. Pero también hay librerías no estándar, y dentro de estas las hay públicas
y comerciales. En este curso sólo usaremos librerías ANSI.

Ficheros ejecutables y enlazadores:

43
Cuando obtenemos el fichero objeto, aún no hemos terminado el proceso. El fichero objeto, a pesar de
ser comprensible para el ordenador, no puede ser ejecutado. Hay varias razones para eso:

Nuestros programas usaran, en general, funciones que estarán incluidas en librerías externas, ya sean
ANSI o no. Es necesario combinar nuestro fichero objeto con esas librerías para obtener un ejecutable.

Muy a menudo, nuestros programas estarán compuestos por varios ficheros fuente, y de cada uno de
ellos se obtendrá un fichero objeto. Es necesario unir todos los ficheros objeto, más las librerías en un
único fichero ejecutable.

Hay que dar ciertas instrucciones al ordenador para que cargue en memoria el programa y los datos, y
para que organice la memoria de modo que se disponga de una pila de tamaño adecuado, etc. La pila es
una zona de memoria que se usa para que el programa intercambie datos con otros programas o con
otras partes del propio programa. Veremos esto con más detalle durante el curso.

Existe un programa que hace todas estas cosas, se trata del "link", o enlazador. El enlazador toma todos
los ficheros objeto que componen nuestro programa, los combina con los ficheros de librería que sea
necesario y crea un fichero ejecutable.

ESTRUCTURA DE UN PROGRAMA C/C++:

La estructura de un programa en C o C++ quedaría así:

• [directivas del pre-procesador: includes y defines]


• [declaración de variables globales]
• [prototipos de funciones]
• función main
• [definiciones de funciones]

Los programas complejos se escriben normalmente usando varios ficheros fuente.

Estos ficheros se compilan separadamente y se enlazan juntos. Esto es una gran ventaja durante el
desarrollo y depuración de grandes programas, ya que las modificaciones en un fichero fuente sólo nos
obligarán a compilar ese fichero fuente, y no el resto, con el consiguiente ahorro de tiempo.

La definición de las funciones puede hacerse dentro de los ficheros fuente o enlazarse desde librerías
precompiladas. La diferencia entre una declaración y una definición es que la definición posee un cuerpo
de función.

En C++ es obligatorio el uso funciones prototipo, y aunque en C no lo es, resulta altamente recomendable.
Es un comentario. El compilador de Turbo C ignora todo lo que está entre los símbolos de comienzo (/*)
y fin (*/) de un comentario. Los comentarios delimitados por estos símbolos pueden ocupar varias líneas.

DIRECTRICES DEL PREPROCESADOR.

El preprocesador de C es un procesador de texto que manipula el texto de un fichero fuente como parte
de la primera fase de compilación y antes de que esta comience. Las partes de texto manipuladas se
conocen como directrices para el preprocesador.

Una directriz es una instrucción para el preprocesador de C. Las directrices son utilizadas para hacer
programas fáciles de cambiar y fáciles de compilar en diferentes máquinas. Las directrices le indican al
preprocesador qué acciones específicas tiene que ejecutar. Por ejemplo, reemplazar elementos en el

44
texto, insertar el contenido de otros ficheros en el fichero fuente, o suprimir la compilación de partes del
fichero fuente.

Directivas del preprocesador


Los compiladores de C++ proporcionan bibliotecas de funciones.
Cada biblioteca de funciones tiene asociada un archivo de definición que se denomina cabecera.
Para utilizar algo de una biblioteca en un programa, hay que colocar al principio del programa una
directiva de preprocesamiento seguida de la cabecera de la biblioteca entre ángulos. Instrucciones al
compilador antes de que se compile el programa principal
Las directivas más usuales son:

• # include
• # define
• # include <iostream.h> Indica al compilador que lea las directivas antes de compilar la función
principal

LIBRERÍAS

#include <stdio.h>
Le dice a Turbo C que en el proceso de compilación incluya un archivo denominado stdio.h. Este fichero
se suministra como parte del compilador de Turbo C y contiene la información necesaria para el correcto
funcionamiento de la E/S de datos.

La sentencia #include no es una instrucción C. El símbolo # la identifica como una directiva, es decir, una
orden para el preprocesador de C, responsable de realizar ciertas tareas previas a la compilación.

Los archivo *.h se denominan archivos de cabecera. Todos los programas C requieren la inclusión de uno
o varios archivos de este tipo, por lo que normalmente es necesario utilizar varias líneas #include.

#include <conio.h>
La librería <conio.h>, es propiedad de Borland y sólo sus compiladores pueden usarla. Por lo tanto significa
que conio.h, no es una librería estandar.

La librería conio se utiliza más que nada por sus comandos: getch(), clrscr(), gotoxy(), textcolor(), y
textbackground(), los cuales usamos para darle mejor presentación a nuestros programas. Pero
pensandolo bien, ¿en verdad necesitamos que los programas en consola se vean bien? La verdad es que
no, lo que importa es que funcionen.

USO DEL main ()

main() Es el nombre de una función. Un programa C se compone de una o más funciones, pero al menos
una de ellas debe llamarse main(), pues los programas C empiezan a ejecutarse por esta función.
Los paréntesis identifican a main() como una función. Generalmente, dentro de ellos se incluye
información que se envía a la función. En este caso no hay traspaso de información por lo que no hay
nadaescrito en su interior. Aún así son obligatorios.

El cuerpo de una función (conjunto de sentencias que la componen) va enmarcado entre llaves { y }. Ese
es el significado de las llaves que aparecen en el ejemplo.

FUNCIONES DE ENTRADA Y SALIDA BÁSICAS

45
La función printf() pertenece a la biblioteca estándar de C. Las definiciones necesarias para que funcione
correctamente se encuentran en el archivo stdio.h, de ahí que sea necesaria la sentencia #include
<stdio.h>.

Un código de formato comienza por el símbolo % e indica la posición dentro de la cadena en donde se
imprimirá el segundo argumento, en este caso, la variable docena. Más adelante estudiaremos todos los
códigos de formato de Turbo C. En este ejemplo, %d indica que en su lugar se visualizará un número
entero decimal.

Como toda sentencia C acaba con punto y coma.


Un carácter de escape comienza por el símbolo \. Son caracteres que tienen una interpretación especial.
La secuencia \n es el carácter nueva línea y equivale a la secuencia LF+CR (salto de línea + retorno de
cursor).

CÓDIGO DE FORMATO

Código Formato
%d Número entero con signo, en notación decimal
%i Número entero con signo, en notación decimal
%u Número entero sin signo, en notación decimal
%o Número entero sin signo, en notación octal (base 8)
%x Número entero sin signo, en hexadecimal (base 16)
%X Número entero sin signo, en hexadecimal, mayúsculas
%f Número real (coma flotante, con decimales)
%e Número real en notación científica
%g Usa el más corto entre %e y %f
%c Un único carácter
%s Cadena de caracteres
%% Signo de tanto por ciento: %
%p Puntero (dirección de memoria)
%n Se debe indicar la dirección de una variable entera
(como en scanf), y en ella quedará guardado el
número de caracteres impresos hasta ese momento

Además, las órdenes de formato pueden tener modificadores, que se sitúan entre el % y la letra
identificativa del código.
Si el modificador es un número, especifica la anchura mínima en la que se escribe ese argumento.

Si ese número empieza por 0, los espacios sobrantes (si los hay) de la anchura mínima se rellenan con 0.
Si ese número tiene decimales, indica el número de dígitos enteros y decimales si los que se va a escribir
es un número, o la anchura mínima y máxima si se trata de una cadena de caracteres.

Si el número es negativo, la salida se justificará a la izquierda (en caso contrario, es a la derecha -por
defecto-).

Hay otros dos posibles modificadores: la letra l, que indica que se va a escribir un long, y la letra h, que
indica que se trata de un short.

Todo esto es para printf, pero coincide prácticamente en el caso de scanf.

Antes de seguir, vamos a ver un ejemplo con los casos más habituales...

Este es un ejemplo de los formatos más habituales:

46
#include <stdio.h>
int entero = 1234;
int enteroNeg = -1234;
float real = 234.567;
char letra = 'E';
char mensaje[20] = "Un texto";
int contador;
main()
{
printf("El número entero vale %d en notación decimal,\n", entero);
printf(" y %o en notación octal,\n", entero);
printf(" y %x en notación hexadecimal,\n", entero);
printf(" y %X en notación hexadecimal en mayúsculas,\n", entero);
printf(" y %ld si le hacemos que crea que es entero largo,\n", entero);
printf(" y %10d si obligamos a una cierta anchura,\n", entero);
printf(" y %-10d si ajustamos a la izquierda.\n", entero);
printf("El entero negativo vale %d\n", enteroNeg);
printf(" y podemos hacer que crea que es positivo: %u (incorrecto).\n", enteroNeg);
printf("El número real vale %f en notación normal\n", real);
printf(" y %3.2f si limitamos a dos decimales,\n", real);
printf(" y %e en notación científica (exponencial).\n", real);
printf("La letra es %c y el texto %s.\n", letra, mensaje);
printf(" Podemos poner \"tanto por ciento\": 50%%.\n");
printf("Finalmente, podemos escribir direcciones. de memoria: %p.\n", &letra);
printf(" y contar lo escrito hasta aquí%n", &contador);
printf(", que ha sido: %d letras.\n", contador);
}

Función scanf() función de la biblioteca estándar de C (como printf()), que permite leer datos del teclado
y almacenarlos en una variable. En el ejemplo, el primer argumento, %d, le dice a scanf() que tome del
teclado un número entero. El segundo argumento, &pies, indica en qué variable se almacenará el dato
leído. El símbolo & antes del nombre de la variable es necesario para que scanf() funcione correctamente.

Función Gotoxy significa go to (x, y), es decir ir a (x, y), donde (x, y) es una coordenada de nuestra pantalla.
Se suele usar antes de un printf, para poner el texto en una cierta parte de la pantalla.

La pantalla de C++, tiene 24 renglones y 80 columnas, por lo que los valores que le pongamos a nuestro
gotoxy no deberán pasar de esos valores.

La palabra clave return se usa dentro de las funciones para salir de ellas devolviendo un valor. El valor
devuelto mediante return() es el que asume la función. Eso permite tener sentencias como

La mayoría de los compiladores actuales permiten dar todos estos pasos desde un único entorno. Por
ejemplo, Turbo C++ 1.01 (y superiores) incluye un editor con el que escribimos, modificamos, grabamos,
etc. el programa. Desde ese mismo editor pulsamos ciertas teclas (en este caso, Ctrl+F9), y el compilador
se encargará de crear el fichero objeto, enlazarlo con las bibliotecas, crear el fichero ejecutable y ponerlo
a funcionar (a no ser que encuentre algún error, claro).

EDITOR DE TEXTO.

Un editor de texto es un programa que permite crear y modificar archivos digitales compuestos
únicamente por un texto sin formato, conocidos comúnmente como archivos de texto o texto plano. El
programa lee el archivo e interpreta los bytes leídos según el código de caracteres que usa el editor. Hoy
en día es comúnmente de 7- u 8-bits en ASCII o UTF-8, rara vez EBCDIC.

47
Por ejemplo, un editor ASCII de 8 bits que lee el número binario 0110 0001 (decimal 97 o hexadecimal 61)
en el archivo lo representará en la pantalla por la figura a, que el usuario reconoce como la letra "a" y
ofrecerá al usuario las funciones necesarias para cambiar el número binario en el archivo.

Los editores de texto son incluidos en el sistema operativo o en algún paquete de software instalado y se
usan cuando se deben crear o modificar archivos de texto como archivos de configuración, scripts o el
código fuente de algún programa.

Ventana del Editor de C++ 5.02


Como a programar se aprende programando, se va tratar de enfocar este manual al revés de como lo hace
la mayoría de los libros: en vez de dar primero toda la carga teórica y después aplicarlo, voy a ir poniendo
ejemplos, y a continuación la explicación.

Introducción al manejo de variables.

Las variables son algo que no contiene un valor predeterminado, un espacio de memoria al que nosotros
asignamos un nombre y en el que podremos almacenar datos.

En el primer ejemplo nos permitía escribir "Hola", pero normalmente no sabremos de antemano lo que
vamos a escribir, sino que dependerá de una serie de cálculos previos (el total de una serie de números
que hemos leído, por ejemplo).

Por eso necesitaremos usar variables, en las que guardemos los datos con los que vamos a trabajar y
también los resultados temporales.
Vamos a ver primero cómo sumaríamos dos números enteros que fijemos en el programa:

#include <stdio.h>

48
int primerNumero; /* Nuestras variables */
int segundoNumero;
int suma;
main()
{
primerNumero = 234;
segundoNumero = 567;
suma = primerNumero + segundoNumero;
printf("Su suma es %d", suma);
}

Para usar una cierta variable primero hay que declararla: indicar su nombre y el tipo de datos que
querremos guardar.

En este ejemplo vemos como se declaran las variables en C: indicando primero el tipo de datos que puede
almacenar (en este caso "int", números enteros) y a continuación el nombre que les vamos a dar:
int primerNumero;

Esta línea quiere decir que usaremos una variable, cuyo nombre es "primerNumero", y que el valor que
guardará esa variable será un número entero. Posteriormente, con primerNumero = 234; asignamos
un valor a esa variable.

Estos nombres de variable (identificadores) siguen prácticamente las mismas reglas de sintaxis que en
otros lenguajes como Pascal: pueden estar formados por letras, números o el símbolo de subrayado (_) y
deben comenzar por letra o subrayado. No deben tener espacios entre medias, y hay que recordar que
las vocales acentuadas y la eñe son problemáticas, porque no son letras "estándar" en todos los
idiomas. Algunos compiladores permiten otros símbolos, como el $, pero es aconsejable no usarlos, de
modo que el programa sea más portable.

Por eso, no son nombres de variable válidos:

1numero (empieza por número)


un numero (contiene un espacio)
Año1 (tiene una eñe)
MásDatos (tiene una vocal acentuada)

Tampoco podremos usar como identificadores las palabras reservadas de C. Por ejemplo, la palabra "int"
se refiere a que cierta variable guardará un número entero, así que esa palabra "int" no la podremos usar
tampoco como nombre de variable. No voy a incluir una lista de palabras reservadas de C, porque eso
supondría tener que comentar al menos para que sirven, y además nos encontramos con que hay incluso
ciertas palabras que están reservadas en unos compiladores sí y en otros no... La conclusión es que
deberíamos usar nombres de variables que a nosotros nos resulten claros, y que tengan pinta de poder
ser alguna orden de C.
Sigamos... Insisto en que en C las mayúsculas y minúsculas se consideran diferentes, de modo que si
intentamos hacer

PrimerNumero = 0;
primernumero = 0;

o cualquier variación similar, el compilador protestará y nos dirá que no conoce esa variable, porque la
habíamos declarado como

int primerNumero;

El número de letras que puede tener un "identificador" (el nombre de una variable, por ejemplo) depende
del compilador que usemos. Es frecuente que permitan cualquier longitud, pero que realmente sólo se

49
fijen en unas cuantas letras (por ejemplo, en las primeras 8 o en las primeras 32). Eso quiere decir que
puede que algún compilador considerase como iguales las variables NumeroParaAnalizar1 y
NumeroParaAnalizar2, porque tienen las primeras 18 letras iguales. El C estándar (ANSI C) permite
cualquier longitud, pero sólo considera las primeras 31.

Por cierto, como las tres variables van a guardar números enteros, podemos declararlas a la vez,
separadas por comas:

int primerNumero;
int segundoNumero;
int suma;
es lo mismo que
int primerNumero, segundoNumero, suma;
o que
int primerNumero,
segundoNumero,
suma;

Pero en este ejemplo hay más cosas "raras". ¿Por qué ahora en printf aparece ese "%d"? Habíamos
hablado de printf como si escribiera en pantalla lo que nosotros le indicamos entre comillas. Esto no es
del todo cierto:

Eso que le hemos indicado entre comillas es realmente un código de FORMATO. Dentro de ese código
de formato podemos tener caracteres especiales, con los que le indicamos dónde y cómo queremos que
aparezca un número. Esto lo veremos con detalle un poco más adelante, pero de momento anticipo que
cuando el mensaje aparezca en pantalla, ese "%d" se sustituirá por un número entero. Qué número? El
que le indicamos a continuación, separado por una coma (en este caso, "suma").

En C es posible dar un valor a las variables a la vez que se las declara (algo parecido a lo que se puede
hacer Turbo Pascal empleando "constante con tipo"). Así, el programa anterior quedaría:

#include <stdio.h>
int primerNumero = 234; /* Nuestras variables */
int segundoNumero = 567;
int suma;
main()
{
suma = primerNumero + segundoNumero;
printf("Su suma es %d", suma);
}

Al igual que en el caso anterior, como las tres variables son del mismo tipo, podemos declararlas a la vez
haciendo:

int primerNumero=234, segundoNumero=567, suma;

int. Ya comentado: es un número entero (en el DOS, desde -32768 hasta 32767; en otros sistemas
operativos, como UNIX, pueden ser valores distintos hasta unos dos mil millones).

char. Un carácter (una letra, una cifra, un signo de puntuación, etc.). Se indica entre comillas simples:
letra = 'W'

float. Un número real (con decimales).

50
Los que hemos visto son los tipos más sencillos. También podemos crear arrays y registros:

Un array (que algunos autores traduce por "arreglo") es un conjunto de elementos, todos los cuales son
del mismo tipo. Es la estructura que emplearemos normalmente para crear vectores y matrices. Por
ejemplo, para definir un grupo de 5 números enteros y hallar su suma podemos hacer:

#include <stdio.h>
int numero[5]; /* Un array de 5 números enteros */
int suma; /* Un entero que será la suma */
main()
{
numero[0] = 200; /* Les damos valores */
numero[1] = 150;
numero[2] = 100;
numero[3] = -50;
numero[4] = 300;
suma = numero[0] + /* Y hallamos la suma */
numero[1] + numero[2] + numero[3] + numero[4];
printf("Su suma es %d", suma);
/* Nota: esta es la forma más ineficiente e incómoda */
/* Ya lo iremos mejorando */
}

Una primera observación: hemos declarado un array de 5 elementos. Para numerarlos, se empieza en
0, luego tendremos desde "número[0]" hasta "número[4]", como se ve en el ejemplo.

Esto es muy mejorable. La primera mejora evidente (o casi) es no tener que dar los valores uno por uno.

TIPOS DE DATOS

Vamos a recopilar todo esto de los modificadores en una tabla. Los paréntesis indican que una cierta
parte del nombre es el valor "por defecto" (el que se considera, mientras no se indique lo contrario). A la
derecha indico el valor mínimo y el valor máximo que puede tomar una variable de ese tipo:

Nombre Bytes Min Max

(signed) char 1 -128 127


unsigned char 1 0 255
(signed) (short) int 2 -32768 2767
unsigned (short) (int) 2 0 65535
(signed) long (int) 4 -2147483648 2147483647
unsigned long (int) 4 0 4294967295
float 2 3.4E-38 3.4E+38
double 4 1.7E-308 1.7E+308
long double 5 3.4E-4932 1.1E+4932

Con los paréntesis me refiero a que "signed char" es lo mismo que "char", y que "long" es lo mismo que
"long int" y que "signed long int"

¿Y las cadenas de texto? Aquí la cosa se complica un poco. No existe un tipo "string" como tal, sino que
las cadenas de texto se consideran "arrays" de caracteres. Están formadas por una sucesión de caracteres
terminada con un carácter nulo (0), y no serán tan fáciles de manejar como lo son en Pascal y otros
lenguajes. Por ejemplo, no podremos hacer cosas como
Nombre:= 'Don ' + Nombre;

51
CODIGO DE CONTROL (”SECUENCIAS DE ESCAPE”)

Sigamos. Vamos a ver ahora qué era eso de "\n". Las letras que escribamos después de una barra
invertida (en inglés, "backslash") tendrán un significado especial. Se trata simplemente de códigos de
control (llamados también "secuencias de escape") que podemos meter entre medias del texto. En este
caso, ese es el carácter de avance de línea (en inglés "new line"), que hace que se siga escribiendo al
comienzo de la línea siguiente. Veamos en una tablita cuáles podemos usar:

Código Significado
\n nueva línea (new line / line feed)
\r retorno de carro (carriage return)
\b retroceso (backspace)
\f salto de página (form feed)
\t tabulación horizontal
\v tabulación vertical
\" comillas dobles (")
\' apóstrofe o comillas simples (')
\\ barra invertida (\)
\a alerta (un pitido)
\0 carácter nulo
\ddd constante octal (máximo tres dígitos)
\xddd constante hexadecimal (ídem)

Cuando queremos trabajar con cadenas de texto, tenemos otras posibilidades: con "puts" podemos
escribir un texto y con "gets" leer lo que se teclee (esta vez no se para en cuanto lea un espacio en blanco).

Va el ejemplo de turno:

#include <stdio.h>
char texto[80];
main()
{
puts("Teclee una frase.");
gets(texto);
puts("Ha escrito: ");
puts(texto);
}

OPERACIONES MATEMÁTICAS.

Al igual que en Pascal, Basic y otros lenguajes, contamos con una serie de operadores para realizar sumas,
restas, multiplicaciones y otras operaciones no tan habituales. Vamos a empezar por las cuatro
elementales:

Operador Operación
+ Suma
- Resta, negación
* Multiplicación
/ División
% Resto de la div.

¿Qué ocurre en casos como el de 10/3? Si 10 y 3 son números enteros, ¿qué ocurre con su división? El
resultado sería 3, la parte entera de la división. Será 3.3333 cuando ambos números sean reales.

52
#include <stdio.h>
int e1 = 10;
int e2 = 4;
float r1 = 10.0;
float r2 = 4.0;
main()
{
printf("La suma de los enteros es: %d\n", e1+e2);
printf(" Su producto: %d\n", e1*e2);
printf(" Su resta: %d\n", e1-e2);
printf(" Su división: %d\n", e1/e2);
printf(" El resto de la división: %d\n", e1%e2);
printf("La suma de los reales es: %f\n", r1+r2);
printf(" Su producto: %f\n", r1*r2);
printf(" Su resta: %f\n", r1-r2);
printf(" Su división: %f\n", r1/r2);
printf("Un real entre un entero, como real: %f\n", r1/e2);
printf(" Lo mismo como entero: %d (erróneo)\n", r1/e2);
printf(" Un entero entre un real, como real: %f\n", e1/r2);
}

Estos operadores son "binarios". Se llaman así porque trabajan con dos datos: sumamos dos números,
restamos dos números, multiplicamos dos números, etc. Por otro lado, tenemos operadores "unarios"
(o monarios), que sólo afectan a un dato. El ejemplo más claro es el de la negación: -a pero veremos
más adelante otros (++, --, &, ...)

En Turbo Pascal (no en cualquier versión de Pascal), tenemos también formas abreviadas de incrementar
una variable:

inc(a); en vez de a := a+1;

Algo parecido existe en C, aunque con otra notación:

a++; es lo mismo que a = a+1;


a--; es lo mismo que a = a-1;

Pero esto tiene más misterio todavía del que puede parecer en un primer vistazo: podemos distinguir
entre "pre-incremento" y "post-incremento". En C es posible hacer asignaciones como
b = a++;

Así, si "a" valía 2, lo que esta instrucción hace es dar a "b" el valor de "a" y aumentar el valor de "a". Por
tanto, al final tenemos que b=2 y a=3 (post-incremento: se incrementa "a" tras asignar su valor).

En cambio, si escribimos
b = ++a;

y "a" valía 2, primero aumentamos "a" y luego los asignamos a "b" (preincremento), de modo que a=3 y
b=3.

Por supuesto, también tenemos postdecremento (a--) y predecremento (--a).


Y ya que estamos embalados con las asignaciones, hay que comentar que en C es posible hacer
asignaciones múltiples:

a = b = c = 1;

Pero aún hay más. Tenemos incluso formas reducidas de escribir cosas como "a = a+5". Allá van

53
a += b ; es lo mismo que a = a+b;
a -= b ; es lo mismo que a = a-b;
a *= b ; es lo mismo que a = a*b;
a /= b ; es lo mismo que a = a/b;
a %= b ; es lo mismo que a = a%b;
BLOQUE
COMENZANDO A PROGRAMAR EN C++
4

TIPOS DE DATOS SIMPLES.

Es uno de los conceptos fundamentales de cualquier lenguaje de programación.


Estos definen los métodos de almacenamiento disponibles para representar información, junto con la
manera en que dicha información ha de ser interpretada.
Para crear una variable (de un tipo simple) en memoria debe declararse indicando su tipo de variable y su
identificador que la identificará de forma única.

La sintaxis de declaración de variables es la siguiente:

Tipo Simple Identificador1, Identificador2:


Esta sentencia indica al compilador que reserve memoria para dos variables del tipo simple Tipo Simple
con nombres Identificador1 e Identificador2.

• Tipos de datos enteros. Se usan para representar números enteros con signo. Hay cuatro tipos: byte,
short, int y long.

• Tipos de datos en coma flotante. Se usan para representar números con partes fraccionarias. Hay dos
tipos de coma flotante: float y double.

El primero reserva almacenamiento para un número de precisión simple de 4 bytes y el segundo lo


hace para un número de precisión doble de 8 bytes.

• Tipo de datos boolean. Se usa para almacenar variables que presenten dos estados, que serán
representados por los valores true y false.

Representan valores bi-estado, provenientes del denominado álgebra de Boole.

• Tipo de datos carácter. Se usa para almacenar caracteres Unicode simples.

Debido a que el conjunto de caracteres Unicode se compone de valores de 16 bits, el tipo de datos
char se almacena en un entero sin signo de 16 bits

DATOS TIPO TYPEDEF

Typedef es una palabra reservada en el lenguaje de programación C y C++. Su función es asignar un


nombre alternativo a tipos existentes, a menudo cuando su declaración normal es aparatosa,
potencialmente confusa o probablemente variable de una implementación a otra.

#include <stdio.h>

int main()

54
{
typedef int nota_alumno_t;
nota_alumno_t notas;
notas=100;
return -1;
}
PALABRAS CLAVES

Existen una serie de indicadores reservados, con una finalidad determinada, que no podemos utilizar
como identificadores.

A continuación vemos algunas de estas palabras clave:

Int: un tipo de dato entero con signo de 16, 32 ó 64 bits, su rango de valores es de -32763 a 32762.
Short: Un número de 16 bits de rango igual a -32763 a 32762.
Char: Un tipo de dato específico para manejo de caracteres de 8 bits de rango igual a -128 a 127.
Unsigned: Modificador, su efecto es eliminar el signo a el tipo de dato aplicado
Signed: Forza al compilador a utilizar un tipo de dato con signo si antes se declaró como de tipo unsigned.
Volatile: Especifica una variable que almacena datos cuyo contenido puede cambiar en cualquier momento
Const: Especifica una variable cuyo contenido no puede cambiar bajo ninguna circunstancia.
Enum: Especifica un conjunto de variables que toman valores en un orden específico y consecutivo.
Static: Especifica una variable que sólo puede cambiar por efecto del programa.
Typedef: Define un tipo de dato para fácil manejo del programador basado en los datos definidos por el compilador.
Sizeof: Función que devuelve el tamaño en bytes del tipo de dato al que se aplica.
If: Instrucción condicional.
Else: Se utiliza conjuntamente con la instrucción if.
Switch: Estructura condicional.
Case: Define los elementos de una estructura condicional switch
Default: Define las acciones a ejecutar no especificadas por una instrucción case
Break: Obliga a salir de una estructura condicional switch.
For: Bucle que se ejecuta tantas veces como se cumplan las condiciones especificadas
While: Bucle condicional que se ejecuta conforme la condición entre el paréntesis sea cierta
Do: Bucle condicional que se ejecuta en conjunto con la instrucción while.
Continue: Instrucción para suspender un ciclo de un bucle
Goto: Instrucción que ejecuta un salto a otra parte del código
Struct: Define una estructura.
Return: Especifica el dato que devuelve una función.
Union: Un tipo de dato compuesto de otros datos definidos.
Register: Permite almacenar un dato en el registro del sistema.
Extern: Especifica una variable ó función que se encuentra en un archivo fuente diferente.
Void: Especifica que una función no devuelve valor alguno.
Auto: Una de las cuatro clases de almacenamiento de datos
Stream: flujo de datos
Cin: entrada estándar
Cout: salida estándar
Cerr: salida de mensajes de error
Streambuf: operación de I/O a bajo nivel
Istream: operación de I/O a alto nivel
Ostream: operación de I/O a alto nivel
Iostream: operación de I/O a alto nivel
Ios: clase para el manejo de la I/O a alto nivel
Setf(): método de la clase ios para inicializar los indic de formato
Flags(): método de la clase ios para inicializar los indic de formato
Unsetf(): metodo de la clase ios para desactivar los indic de formato
Width(): función declarada en las clases istream, ostream e iostream
Precision(): función declarada en las clases istream, ostream e iostream

55
Fill(): función declarada en las clases istream, ostream e iostream
<< ó >>: operadores de inserción o extracción de flujo
Ifstream : Clase necesaria para la inserción de flujo de datos en fichs.
Ofstream: Clase necesaria para la extracción de flujo de datos en fichs.
Fstream: Clase necesaria para la I/O de flujo de datos en fichs.
Fstream.h : Librería para poder leer o escribi desde ficheros.
dec, hex y oct : establecen base para enteros ws: se saltan los blancos iniciales
Endl: se imprime un ‘n’ y se vacía el buffer de salida
Flush: se vacía el buffer de salida
Setw(int w) : establece la anchura mínima de campo
Left: la salida se alinea a la izquierda
Rigth: la salida se alinea a la derecha
Internal: alinea el signo y los caracteres indicativos de la base por la izq y las cifras por la der
Dec: salida decimal para enteros (defecto)
Oct : salida octal para enteros
Hex: salida hexadecimal al para enteros
Show: base se muestra la base de los valores numéricos
Uppercase: los caracteres de formato aparecen en mayúsculas
Scientific: notación científica para coma flotante
Allocator: Similar a la clase allocator de la STL
BinaryTree: Árbol binario
Bitarray: Arreglo de bits (útil para valores booleanos)
Function: Clase para funciones usadas por la clase expression
String: Tipo para el manejo de cadenas de caracteres
Tree: Árbol con N nodos hijos y M niveles de profundidad

OPERADORES LÓGICOS, COMPARACIONES

En la próxima lección veremos cómo hacer comparaciones del estilo de "si A es mayor que B y B es mayor
que C". Así que vamos a anticipar cuales son los operadores de comparación en C.

Operador Operación
== Igual a
!= No igual a (distinto de)
< Menor que
> Mayor que
<= Menor o igual que
>= Mayor o igual que

Cuidado con el operador de igualdad: el formato será if (a==b) ... Si no nos damos cuenta y escribimos if
(a=b) estamos asignando a "a" el valor de "b" (lo veremos con más detalle en la próxima lección).

Afortunadamente, la mayoría de los compiladores nos avisan con un mensaje parecido a "Possibly
incorrect assignment" (que podríamos traducir por "posiblemente esta asignación es incorrecta") o
"Possibly unintended assignment" (algo así como "es posible que no se pretendiese hacer esta
asignación").

Estas condiciones se puede encadenar con "y", "o", etc., que se indican de la siguiente forma.

Operador Significado
&& Y
|| O
! No

56
Así, una orden que sea mezcla de C y español (porque todavía no sabemos bien cómo comprobar
condiciones) y que compruebe si una variable "x" vale 2 y si otra variable "z" no es mayor de 5, sería

Si (x==2) && !(z>5) entonces ...

SINTAXIS DE LAS SENTENCIAS

Al igual que los lenguajes naturales, los lenguajes computacionales tienen una gramática, es decir, un
conjunto de reglas que describen los elementos que componen el lenguaje y la forma correcta de
utilizarlos, la sintaxis, se ocupa de las reglas para combinar adecuadamente los elementos del lenguaje de
forma que tengan un sentido.

En el caso de los lenguajes naturales, la sintaxis enseña a formar las oraciones y expresar conceptos.. En
el caso de los lenguajes computacionales, enseña a construir sentencias que describan operaciones
correctas de un computador.

Sintaxis de las sentencias C++


Si nos referimos concretamente a la sintaxis, sus reglas pueden ser expresadas en forma de una lista, que
adecuadamente interpretada, describe estas reglas sintácticas. A continuación se expone la sintaxis
permitida en C++ para las sentencias ("Statements"). Junto a una traducción, más o menos afortunada al
español, hemos incluido el original inglés para que no quepa la más mínima ambigüedad al respecto, ya
que el rigor y el "purismo" son imprescindibles al tratar estos aspectos gramaticales del lenguaje.

Aquí tendríamos que interpretar: Una sentencia está compuesta por una sentencia etiquetada, o una
sentencia compuesta, o una sentencia-expresión, Etc.. A su vez, las entradas sucesivas de la lista (en azul),
describen la sintaxis de cada elemento.

Resulta evidente que muchas de estas definiciones son recursivas. . Por ejemplo, vemos que una lista-de-
declaraciones está formada por una declaración o una lista-de-declaraciones seguida de una declaración.
Es decir, una lista-de-declaraciones puede contener a su vez otra lista de declaraciones.

TIPOS DE SENTENCIA

Sentencia etiquetada (labeled-statement)


Sentencia compuesta (compound-statement)
Sentencia-expresión (expression-statement)
Sentencia de selección (selection-statement)
Sentencia de iteración (iteration-statement)
Sentencia de salto (jump-statement)
Sentencia ensamblador (asm-statement)
Declaración simple (declaration)
Bloque-intento (try-block)

Sentencia de selección:

IF -ELSE
Esta proposición sirve para ejecutar ciertas sentencias de programa, si una expresión resulta CIERTA ú
otro grupo de sentencias, si aquella resulta FALSA.

Sintaxis:

if (condición) sentencia;

57
La sentencia solo se ejecuta si se cumple la condición. En caso contrario el programa sigue su curso sin
ejecutar la sentencia.

Otro formato:
if (condición) sentencia1;
else sentencia2;

Si se cumple la condición ejecutará la sentencia1, sinó ejecutará la sentencia2. En cualquier caso, el


programa continuará a partir de la sentencia2.

Ejemplo: Ejemplo

#include <stdio.h> #include <stdio.h>


main() /* Simula una clave de acceso */ main() /* Escribe bebé, niño o adulto */
{ {
int usuario,clave=18276; int edad;
printf("Introduce tu clave: "); printf("Introduce tu edad: ");
scanf("%d",&usuario); scanf("%d",&edad);
if(usuario==clave) if (edad<1)
printf("Acceso permitido"); printf("Lo siento, te has equivocado.");
else else if (edad<3) printf("Eres un bebé");
printf("Acceso denegado"); else if (edad<13) printf("Eres un niño");
} else printf("Eres adulto");
}

Sentencia de iteración

WHILE

Su sintaxis es:

while (condición) sentencia;

Con esta sentencia se controla la condición antes de entrar en el bucle. Si ésta no se cumple, el programa
no entrará en el bucle.
Naturalmente, si en el interior del bucle hay más de una sentencia, éstas deberán ir entre llaves para que
se ejecuten como un bloque.

Ejemplo:

#include <stdio.h>
main() /* Escribe los números del 1 al 10 */
{
int numero=1;
while(numero<=10)
{
printf("%d\n",numero);
numero++;
}
}

DO – WHILE
Su sintaxis es:

do{
sentencia1;

58
sentencia2;
}
while (condición);

Con esta sentencia se controla la condición al final del bucle. Si ésta se cumple, el programa vuelve a
ejecutar las sentencias del bucle.
La única diferencia entre las sentencias while y do...while es que con la segunda el cuerpo del bucle se
ejecutará por lo menos una vez.

Ejemplo:

#include <stdio.h>
main() /* Muestra un menú si no se pulsa 4 */
{
char seleccion;
do{
printf("1.- Comenzar\n");
printf("2.- Abrir\n");
printf("3.- Grabar\n");
printf("4.- Salir\n");
printf("Escoge una opción: ");
seleccion=getchar();
switch(seleccion){
case '1':printf("Opción 1");
break;
case '2':printf("Opción 2");
break;
case '3':printf("Opción 3");
}

}while(seleccion!='4');
}

Sentencia de inicio

FOR
La orden se repite desde que una variable tiene un valor inicial hasta que alcanza otro valor final.
Su sintaxis es:
for (inicialización;condición;incremento){
sentencia1;
sentencia2;
}

La inicialización indica una variable (variable de control) que condiciona la repetición del bucle. Si hay más,
van separadas por comas:

for (a=1,b=100;a!=b;a++,b- -){

El flujo del bucle FOR transcurre de la siguiente forma:

Ejemplo: for (x=0;x<=10;x++){


result=num*x;
#include <stdio.h> printf("\n%d por %d = %d\n",num,x,result);}
main() /* Escribe la tabla de multiplicar */ }
{ Ejemplo:
int num,x,result; #include <stdio.h>
printf("Introduce un número: ");
scanf("%d",&num); int contador;

59
main() printf("%d ", contador);
{ }
for (contador=1; contador<=10; contador++)
{

Sentencias de salto

continue;
Se utiliza dentro de un bucle. Cuando el programa llega a una sentencia CONTINUE no ejecuta las líneas
de código que hay a continuación y salta a la siguiente iteración del bucle.

Y aquí termina el capítulo dedicado a los bucles. Existe otra sentencia, GOTO, que permite al programa
saltar hacia un punto identificado con una etiqueta, pero el buen programador debe prescindir de su
utilización. Es una sentencia muy mal vista en la programación en 'C'.

Ejemplo:

#include <stdio.h>
main() /* Escribe del 1 al 100 menos el 25 */
{
int numero=1;
while(numero<=100)
{
if (numero==25)
{
numero++;
continue;
}
printf("%d\n",numero);
numero++;
}
}

break ;
Esta sentencia se utiliza para terminar la ejecución de un bucle o salir de una sentencia SWITCH.

Ejemplo:
Ejemplo.
#include <stdio.h> #include <stdio.h>
char tecla;
main() void main ()
{ {
printf("Pulse una tecla y luego Intro: "); int n;
tecla = getchar();
switch (tecla) for ( ; ; )
{ {
case ' ': printf("Espacio.\n"); printf ("\nTeclee un número: ");
break; scanf ("%d", &n);
case '1':
case '2': if (!n)
case '0': printf("Dígito.\n"); break;
break; printf ("\nEl cuadrado es %d", n * n);
default: printf("Ni espacio ni dígito.\n"); }} }
}
return

60
La sentencia return tiene dos usos importantes. Primero, fuerza una salida inmediata de la función en que
se encuentra. O sea, hace que la ejecución del programa vuelva al código que llamó a la función. En
segundo lugar, se puede utilizar para devolver un valor.

En lenguaje C, para escribir una instrucción de salto return (volver), se utiliza la sintaxis:

return <expresión>;

La instrucción de salto return es utilizada en lenguaje C para indicar el valor de retorno de una función.
Por tanto, vamos a hacer uso de la instrucción return cuando definamos subprogramas de tipo función,
que estudiaremos más adelante en el apartado Llamadas a subprogramas.

PROGRAMACIÓN MDULAR Y PROGRAMACIÓN ESTRUCTURADA

PROGRAMACIÓN MODULAR. La programación modular está basada en la técnica de diseño descendente,


que como ya vimos consiste en dividir el problema original en diversos sub-problemas que se pueden
resolver por separado, para después recomponer los resultados y obtener la solución al problema

Ejercicios de programación modular.


Escribir la traza y decir que imprime por pantalla cada uno de los siguientes programas:

#include <iostream.h> #include <iostream.h>


int a, b, c; int Funcion (int y, int & x)
void E1(); {
int main() int z;
{
1 a = 11; z = x + 1;
2 b = 12; x += 3;
3 c = 13; y = (z - y) * 2;
4 E1(); return y;
cout << a << b << c; }
return 0; int main(void)
} {
void E1() int x, y, z;
{ x = 1;
int b; y = -2;
5 a = 1; z = Funcion (x, y);
6 b = 2; y = Funcion (x, z);
7 c = 3; cout << x << y << z;
return; return 0;
} }

******************************************************************************
#include <iostream.h> }
#include <stdlib.h> int main()
{
int opera (int a, int b, int & d) int a = 5;
{ int b = 16;
int c = 0; int c, d;
if (a < b)
c = opera (b, a, d); d = opera (a, b, c);
else
{ cout << "a y b: " << a << ", " << b << endl;
while (a > b) cout << "c y d: " << c << ", " << d << endl;
{
a -= b; return 0;
c++; }
}
d = a;
} #include <iostream.h>
return c; #include <stdlib.h>

61
system("PAUSE");
int const BASE = 5; return 0;
}
int main (void); int Examen (int y)
int Examen (int); {
int x;
int main(void) if (y == 0)
{ x = 0;
int x, y; else
{
x = 10; x = Examen (y / BASE);
x = x * 10 + y % BASE;
y = Examen (x); }
return x;
cout << "y = " << y << endl; }

PROGRAMACIÓN ESTRUCTURADA.
La programación estructurada es un paradigma de programación orientado a mejorar la claridad, calidad
y tiempo de desarrollo de un programa de computadora, utilizando únicamente subrutinas y tres
estructuras: secuencia, selección (if y switch) e iteración (bucles for y while), considerando innecesario y
contraproducente el uso de la instrucción de transferencia incondicional (GOTO), que podría conducir a
"código espagueti", que es mucho más difícil de seguir y de mantener, y era la causa de muchos errores
de programación.

Ejercicios de programación estructurada

Mostrar los múltiplos de 3 comprendidos entre los números 1 y 20


Código:
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
int main ()
{
clrscr();
for (int i=1;i<=20;i++)
{
cout<<i;
if (i%3==0) cout<<" Es multiplo de 3" <<endl;
else cout<<" No es multiplo de 3"<<endl;
}
getch();
return 0;
}

Hallar A+B-C+100
Código:
#include <stdio.h>
#include <conio.h.>
int main ()
{
int A, B, C;
printf("Inserte valor para A: "); scanf("%d",&A);
printf("Inserte valor para B: "); scanf("%d",&B);
printf("Inserte valor para C: "); scanf("%d",&C);
printf("\n%d + %d - %d + 100 = %d",A, B, C, (A+B+C-100));
getch();
}

62
FUNCIONES MATEMATICAS

OPERACIONES BÁSICAS
FUNCIÓN PROPOSITO
abs, labs, llabs Recupera el eswiki: valor absoluto de un valor integral. Función sobrecargada.
abs, fabs Recupera el valor absoluto de un valor en punto flotante. Función sobrecargada.
div, ldiv Recupera el cuociente y resto de una división. Función sobrecargada.
Fmod Recupera el resto de una división en punto flotante.
Remainder Recupera el resto con signo de una división. Disponible en C++11.
Remquo This section is incomplete (C++11 feature)
Fma Producto-suma (C++11 feature)
Fmax, fmin Determina el mayor o menor de dos valores en punto flotante (C++11 feature)
Determina la diferencia absoluta entre dos valores en punto flotante (C++11
Fdim
feature)
Nan, nanf, nanl Determina "not-a-number" (NaN) (C++11 feature)
FUNCIONES EXPONENCIALES
exp Calcula e elevado a la potencia dada.
exp2 Calcula 2 elevado a la potencia dada.
expm1 Calcula e elevado a la potencia dada, menos uno. (C++11 feature)
log Calcula el logaritmo natural (base e).
log10 Calcula el logaritmo común (base 10).
log1p Calcula el logaritmo natural de 1+n. (C++11 feature)
ilogb Extrae la potencia binaria del número. (C++11 feature)
logb Extrae la potencia binaria del número. (C++11 feature)
FUNCIONES DE POTENCIAS
sqrt Calcula la raíz cuadrada.
cbrt Calcula la raíz cúbica.
hypot Calcula la raíz cuadrada de la suma de los cuadrados (hipotenusa de los dos catetos).
(C++11 feature)
pow Calcula un número elevado a la potencia del otro.
FUNCIONES TRIGONMÉTRICAS
sin Seno
cos Coseno
tan Tangente
asin Arcoseno
acos Arcocoseno
atan Arcotangente
atan2 arcotangente de dos argumentos, usando el signo para determinar el cuadrante
FUNCIONES HIPERBÓLICAS
sinh seno hiperbólico
cosh coseno hiperbólico
tanh tangente hiperbólica
asinh arcoseno hiperbólico (C++11 feature)
acosh arcocoseno hiperbólico (C++11 feature)
atanh arcotangente hiperbólica (C++11 feature)

63
BLOQUE
5 ESTRUCTURAS ESTÁTICAS

Se denominan estáticas las estructuras de datos simples, o complejas, que una vez definidas dentro de un
programa, permanecen inalteradas durante la ejecución del mismo, sin poder variar, por tanto, su
posición en memoria, ni su longitud en bytes, declarada al especificar el tipo de la misma.
En este sentido, y de menor a mayor complejidad, son estructuras estáticas tradicionales de datos:

 Las variables de carácter


 Las variables numéricas entera
 Las variables numéricas de punto flotante o reales
 Las variables de tipo cadena (string)

ARRAYS O TABLAS:

 Un Array (arreglo) es una colección de datos del mismo tipo, que se almacenan en posiciones
consecutivas de memoria y reciben un nombre común.

 Un Array es un conjunto finito de valores del mismo tipo.

 Un Array es una estructura de datos que almacena bajo el mismo nombre (variable) a una colección
de datos del mismo tipo.

 Un Array es un conjunto de variables del mismo tipo que tienen el mismo nombre y se diferencian en
el índice.

Letras = ‘a’ ‘z’ ‘r’ ‘j’

 A cada dato almacenado se le denomina elemento del array o ítem.


 Cada elemento del array está numerado, y a éste número se le denomina índice.

Un arreglo es una colección finita, homogénea y ordenada de elementos.

Finita:Todo arreglo tiene un límite; es decir, debe determinarse cuál será el número máximo de elementos
que podrán formar parte del arreglo.

Homogénea: Todos los elementos del arreglo deben ser del mismo tipo.

Ordenado: Se puede determinar cuál es el primer elemento, el segundo, el tercero,.... y el n-ésimo


elemento.

CARACTERÍSTICAS DE UN ARRAY
Los elementos del array se numeran consecutivamente comenzando con 0, 1, 2, …

Array de 4 elementos

64
Letras =

0 1 2 3 Índice

 Estos números, los índices, permiten localizar cada elemento del array.
Letras[0] es el elemento que está en la posición 0,
Letras[1] es el elemento que está en la posición 1, etc …

Los elementos almacenados en el array pueden ser de cualquier tipo:

 Tipos simples como: int, char, bool, float ó


 Tipos definidos por el programador como por ejemplo estructuras

Los arreglos se clasifican de acuerdo con el número de dimensiones que tienen. Así se tienen los:

 Unidimensionales (vectores)
 Bidimensionales (tablas o matrices)
 Multidimensionales (tres o más dimensiones)
 Estructuras de datos y arreglos.

Estructuras de datos y arreglos.

DECLARACIÓN DE UN ARRAY

Se declara de forma similar a cualquier otro tipo de datos, solo que hay que indicarle al compilador el número de
elementos que forma el array: tamaño ó longitud del array.

<tipo_de_dato> <nombre_de_variable> [número_de_elementos]; Sintaxis

Tipo de dato Nombre de la variable [ Número de elementos ] ;

Ejemplo:
 char letras[4]; // variable letras de tipo array de 4 elementos de tipo char
 int edades[10]; // variable edades de tipo array de 10 elementos de tipo entero.

65
Si queremos saber el número de bytes que necesitamos para almacenar un array en memoria, podemos utilizar la
función sizeof(). Cabecera stdio.h

En nuestro caso, sizeof (edades) = 20.

int edades[10];

ACCESO A UN ELEMENTO ARRAY

INICIALIZACIÓN DE UN ARRAY

66
ARRAYS MULTIDIMENSIONALES

Los arrays que hemos visto anteriormente se conocen como arrays unidimensionales y se caracterizan
por tener un solo índice. Tambiénse conocen como listas de elementos y se corresponden con el
concepto de vector.

Los arrays multidimensionales son aquellos que tienen más de una dimensión y por tanto tienen más
de un índice. Los más utilizados son los de dos dimensiones, conocidos con el nombre de tablas. Se
corresponden con el concepto de matriz.

C++ permite trabajar con arrays de de tantas dimensiones como requieran las aplicaciones ( 3, 4 ó
más dimensiones).

ARRAYS BIDIMENSIONALES

Un array de dos dimensiones se corresponde con una tabla con varias filas y varias columnas.

0 1 2 3

67
Índice para fila
0 1 2 3 4 Índice para columna
1 4 1 2 3
2 3 2 1 4

Cada elemento almacenado en el array está identificado por dos índices, sus coordenadas, la fila y la
columna en la que se encuentra dicho elemento.
• Ambos índices se numeran consecutivamente comenzando con 0, 1, 2, …

DECLARACIÓN.
Se declara de forma similar al tipo de dato array de una dimensión, solo que hay que indicarle al
compilador el tamaño de cada uno de los índices, es decir, el número de filas y el número de columnas

<tipo_de_dato> <nombre_de_variable> [número_de_filas [Numero de columnas]; Sintaxis

Tipo de dato Nombre de la variable [ N° de filas ] [ N° de columnas ] ;

Ejemplo:
 char tablero[8][8]; // variable llamada tablero de tipo array de dos dimensiones (8 filas y 8
columnas). Alamacena 64 elementos de tipo char.
 int matriz[3][4]; // variable llamada matriz de tipo array de dos dimensiones (3 filas y 4 columnas).
Almacena 12 elementos de tipo entero.

Se puede acceder a los elementos de un array bidimensional de forma similar a como lo hacíamos para
arrays de una dimensión. Hay que poner el nombre y los índices (fila y columna) del elemento al que
queremos acceder ó referenciar

68
INICIALIZACIÓN

EJERCICIOS

69
Que rellene un array con los 100 primeros números 2. Que rellene un array con los 100 primeros números
enteros y los muestre en pantalla en orden enteros y los muestre en pantalla en orden
ascendente. descendente.

#include <stdio.h> #include <stdio.h>


#include <stdlib.h> #include <stdlib.h>

int main(void) int main(void)


{ {
int x,tabla[100]; int x,tabla[100];

for (x=1;x<=100;x++) for (x=1;x<=100;x++)


{ {
tabla[x]=x; tabla[x]=x;
} }

for (x=1;x<=100;x++) for (x=100;x>=1;x--)


{ {
printf("%d\n",tabla[x]); printf("%d\n",tabla[x]);
} }

system("PAUSE"); system("PAUSE");
return 0; return 0;
} }

Leer 10 números por teclado, los almacene en un Mostrar los primeros 100 números de izquierda a
array y muestre la suma, resta, multiplicación y derecha usando un array de dos dimensiones.
división de todos.
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
int main(void)
{ int main(int argc, char *argv[])
int x,tabla[10]; {
int sum,res,mul,div;
int x,y, numeros[10][10];
for (x=0;x<10;x++)
{ for (x=0;x<10;x++)
printf("Introduzca número\n"); {
scanf("%d",&tabla[x]); for (y=0;y<10;y++)
} {
sum=tabla[0]; numeros[x][y]=(x*10)+1+y;
res=tabla[0]; }
mul=tabla[0];
div=tabla[0]; }
for (x=1;x<10;x++) for (x=0;x<10;x++)
{ {
sum=sum+tabla[x]; for (y=0;y<10;y++)
res=res-tabla[x]; {
mul=mul*tabla[x]; printf("%d ",numeros[x][y]);
div=div/tabla[x]; }
} printf("\n");
printf("Suma: %d\n",sum); }
printf("Resta: %d\n",res);
printf("Multiplicación: %d\n",mul); system("PAUSE");
printf("División: %d\n",div); return 0;
system("PAUSE");
return 0; }
}
UNIONES.

La definición de "union" es similar a la de "estructura", La diferencia entre las dos es que en una estructura,
los miembros ocupan diferentes áreas de la memoria, pero en una unión, los miembros ocupan la misma
área de memoria. Entonces como ejemplo:

union {
int i;
double d;
} u;

El programador puede acceder a través de "u.i" o de "u.d", pero no de ambos al mismo tiempo. Como
"u.i" y "u.d" ocupan la misma área de memoria, modificar uno modifica el valor de la otra, alguna vez de
maneras impredecibles.

El tamaño de una unión es el de su miembro de mayor tamaño.

Ejemplo de una unión:

#include <stdio.h>
#include <string.h>

/*Creamos una union*/


union frases
{
char mensajes[50];
char ayudas[50];
char lineas[50];
} palabra;

/*Creamos una estructura*/


struct comparte
{
char mensajes[50];
char ayudas[50];
char lineas[50];
}Sistema;

/*Nótese que la estructura y la union tienen los mismos tipos de datos*/

int main(int argc, char** argv)


{
/*Inicializamos*/
strcpy(palabra.mensajes, "Primer Mensaje");

/*Inicializamos*/
strcpy(palabra.ayudas, "Una Ayuda");

printf("\nFrases en Union: ");

/*Imprimimos mensajes de union*/


printf("\n1- %s", palabra.mensajes);

/*Imprimimos ayudas de union*/


printf("\n2- %s", palabra.ayudas);

/*Inicializamos*/
strcpy(Sistema.mensajes, "Primer Mensaje");

71
/*Inicializamos*/
strcpy(Sistema.ayudas, "Una Ayuda");

/* Podemos notar que aunque inicializamos los valores al imprimir se tiene el mismo valor para cada miembro de la
estructura, esto se debe a que las uniones usan el mismo espacio de memoria para todos los elementos de la unión,
siendo del tamaño de su miembro de mayor tamaño, en este caso 50 bytes. Entonces los tres miembros creados
dentro de la union comparten esos 50 bytes.Entonces el ultimo valor agregado a la unión es el que se tiene. */

printf("\n\nFrases en Struct: ");

/*Imprimimos mensajes de struct*/


printf("\n1- %s", Sistema.mensajes);

/*Imprimimos ayudas de union*/


printf("\n2- %s", Sistema.ayudas);

/* En la estructura comparte, se reservan 150 bytes de memoria para los tres miembros, en este caso cada uno es
independiente en memoria, asi pues se puede inicializar cada uno o usar como un campo independiente.*/

return 0;

PUNTEROS.

Los punteros permiten simular el paso por referencia, crear y manipular estructuras dinámicas de datos,
tales como listas encadenadas, pilas, colas y árboles. Generalmente las variables contienen valores
específicos. Los punteros son variables pero en vez de contener un valor especifico, contienen las
direcciones de las variables a las que apuntan. Para obtener o modificar el valor de la variable a la que
apuntan se utiliza el operador de dirección. Los punteros, al ser variables deben ser declaradas como
punteros antes de ser utilizadas.

Sintaxis
int *ptrID, ID;
ID = 8;
ptrID = &ID; // puntero a ID
ptrID es un puntero a int, mientras que la variable ID es solo una variable del tipo int. Todo puntero debe
ser precedido por un asterisco (*) en la declaración.

Se puede declarar más de un puntero en la misma sentencia. En el ejemplo que sigue se ve la declaración
de dos punteros a int.

int *ptrY, *ptrX;

Operadores
Existen dos operadores a tener en cuenta cuando trabajamos con punteros. El operador de dirección (&)
que devuelve la dirección de memoria de su operando y el operador de indirección (*) que devuelve un
alias para el objeto al cual apunta el operando del puntero.

En el siguiente ejemplo vemos como se inicializa una variable X con el valor 15. Luego se crea un puntero
a int y por último el puntero pasa a apuntar a la variable X. Esto es, ptrX es un puntero a X.

int X = 15;
int *ptrX;
ptrX = &X;

72
Punteros y matrices
Las matrices son punteros constantes. Una matriz sin subíndice es un puntero al primer elemento de la
matriz.

int X[15];
int *ptrX;
ptrX = X; // ptrX recibe la dirección del primer elemento ( 0 ) de X

Así como también podría escribirse

int X[15];
int *ptrX;
ptrX = &X[0]; // ptrX es igual a la dirección del primer elemento de X

Se pueden utilizar distintos elementos de la matriz teniendo en cuenta la sintaxis de punteros.

int X[15], Y, *ptrX;


ptrX = X;
Y = *( ptrX + 7 );

En este caso puede verse que Y toma el valor del elemento 7 de la matriz X, siendo 7 el desplazamiento
dentro de la matriz. El operador de indirección queda fuera del paréntesis porque tiene una prioridad
superior a la del operador +. De no existir los paréntesis, se sumaria 7 al elemento X[0]. Teniendo en
cuenta que las matrices son punteros constantes, el nombre de la matriz puede tratarse como un puntero:

Y = *( X + 7 );

Ejercicios:

Dado un vector de 10 elementos ={1, 2, 3, 4, 4, 7, 8, 9, 5, 4}, escribir un programa en C (haciendo uso de puntero)
que muestre las direcciones de memoria de cada elemento del vector.

#include "stdio.h"
#include <conio.h>
int main(){
int *p, i;
int mat[10] ={1, 2, 3, 4, 4, 7, 8, 9, 5, 4};
p=mat;
for(i=0; i<=3; i++) {
printf("\n mat[%d] = %d ",i, *p);
printf("\tDirecci¢n: %x",p);
p++;
}
getch();
}

Crear un programa que contenga una función llamada copiarArray ) que reciba dos arrays y el tamaño de los mismos
(deben de ser del mismo tamaño) y que consiga copia en el segundo array el contenido del primero

#include <conio.h>
#include <stdio.h>
void copiarArray(int a[], int b[], int tamanio);
void escribirArray(int a[], int tamanio);

int main(){

73
/* Comprobación de la función*/
int uno[]={2,4,5,6,7,8,9,11};
int dos[8];
printf("Array uno:\n");
escribirArray(uno,8);
copiarArray(uno,dos,8);
printf("Array dos:\n");
escribirArray(dos,8);
getch();
}
/* Escribe el contenido de un array de enteros por pantalla */
void escribirArray(int a[], int tamanio){
int i;
for(i=0;i<tamanio;i++)
printf("%d ",a[i]);
printf("\n");
}
/* Copia el contenido del array b en el array a. Se supone que ambos arrays son del mismo tamanio*/
void copiarArray(int a[], int b[], int tamanio){
int i;
for(i=0;i<tamanio;i++){
b[i]=a[i];
} BLOQUE
}
6
ESTRUCTURAS EXTERNAS
ARCHIVOS O FICHEROS.
Desde el punto de vista informático, un fichero es una colección de información que almacenamos en un
soporte magnético para poder manipularla en cualquier momento.

Esta información se almacena como un conjunto de registros.

Fichero

Ana Luis Jose María …


Registros

MANEJO DE FICHEROS

Toda transferencia de datos entre el programa y el fichero en disco se realiza a través del buffer. El buffer
está para dar eficiencia.

Las operaciones de E/S son más eficientes:

 El acceso a la memoria RAM consume menos tiempo que el acceso a un dispositivo físico.
 El buffer hace que el número de accesos al fichero físico sea menor.

ORGANIZACIÓN DE ARCHIVOS.

Archivos de acceso secuencial: los datos se almacenan de forma consecutiva y no es posible leer un registro
directamente, es decir para leer el registro n hay que leer los n-1 registros anteriores.

Archivos de acceso aleatorio: se puede acceder a un registro concreto sin necesidad de leer todos los anteriores.

TIPOS DE ALMACENAMIENTO DE ARCHIVOS.

74
Archivos de texto: Los datos se almacenan usando código ASCII y por tanto, pueden ser procesados por
cualquier editor de texto.

Archivos binarios: Los datos se almacenan en binario.

BIBLIOTECA DE FLUJOS
Para poder manipular archivos, C++ dispone de la biblioteca estándar fstream (file stream) donde se
encuentran todas las funciones necesarias para abrir y cerrar archivos, así como para realizar las
operaciones de lectura y escritura de datos en archivos.

# include <fstream.h>

Operaciones asociadas a archivos

Abrir fichero

Cerrar fichero
Lectura y escritura
Funciones de control
APERTURA DE ARCHIVOS

Al igual que los flujos cin y cout, los flujos de E/S solo pueden transferir datos en una dirección, esto
significa que se tienen que definir flujos diferentes para lectura y escritura de datos.

Abrir el archivo para lectura o entrada


Abrir un archivo para entrada, es definir un flujo de archivo de entrada.

ABRIR ARCHIVOS DEE LECTURA.

Supongamos que queremos abrir un fichero que se llama misdatos.txt que se encuentra en la unidad de
disco a:
#include <fstream.h>
….
ifstream leer_fich (“a:\\misdatos.txt”);
…….
……
Hemos definido el flujo de entrada leer_fich.

APERTURA Y CIERRE DE FICHEROS

Hasta ahora, para obtener y almacenar datos de una estructura de datos bastaba con realizar asignaciones
a la misma. Para utilizar los ficheros el procedimiento es distinto.

75
Antes de usar un fichero es necesario realizar una operación de apertura del mismo; posteriormente, si
se desea almacenar datos en él hay que realizar una operación de escritura y si se quiere obtener datos
de él es necesario hacer una operación de lectura. Cuando ya no se quiera utilizar el fichero se realiza una
operación de cierre del mismo para liberar parte de la memoria principal que pueda estar ocupando
(aunque el fichero en sí está almacenado en memoria secundaria, mientras está abierto ocupa también
memoria principal).

La instrucción más habitual para abrir un fichero es :

FILE * fichero;

fichero = fopen ( nombre-fichero, modo);

La función fopen devuelve un puntero a un fichero que se asigna a una variable de tipo fichero. Si existe
algún tipo de error al realizar la operación, por ejemplo, porque se desee abrir para leerlo y éste no exista,
devuelve el valor NULL.

El nombre-fichero será una cadena de caracteres que contenga el nombre (y en su caso la ruta de acceso)
del fichero tal y como aparece para el sistema operativo.

El modo es una cadena de caracteres que indica el tipo del fichero (texto o binario) y el uso que se va ha
hacer de él lectura, escritura, añadir datos al final, etc.

Los modos disponibles son:

·r abre un fichero para lectura. Si el fichero no existe devuelve error.


·w abre un fichero para escritura. Si el fichero no existe se crea, si el fichero existe se destruye y se
crea uno nuevo.
·a abre un fichero para añadir datos al final del mismo. Si no existe se crea.
·+ símbolo utilizado para abrir el fichero para lectura y escritura.
·b el fichero es de tipo binario.
·t el fichero es de tipo texto. Si no se pone ni b ni t el fichero es de texto. Los modos anteriores se
combinan para conseguir abrir el fichero en el modo adecuado

Por ejemplo, para abrir un fichero binario ya existente para lectura y escritura el modo será "rb+ "; si el
fichero no existe, o aun existiendo se desea crear, el modo será " wb+ ". Si deseamos añadir datos al final
de un fichero de texto bastará con poner "a", etc.

La forma habitual de utilizar la instrucción fopen es dentro de una sentencia condicional que permita
conocer si se ha producido o no error en la apertura, por ejemplo:
FlLE *fich;
if ((fich = fopen("nomfich.dat", "r")) == NULL)
{ /* control del error de apertura * /
printf ( " Error en la apertura. Es posible que el fichero no
exista \n ");
}

El resultado de fopen se almacena en la variable fich y después se compara fich con NULL para saber si se
ha producido algún error. Toda la operación se puede realizar en la misma instrucción, tal y como aparece
en el ejemplo.

Cuando se termine el tratamiento del fichero hay que cerrarlo; si la apertura se hizo con fopen el cierre
se hará con fclose (fich);

76
Para utilizar las instrucciones de manejo de ficheros que veremos en esta unidad es necesario incluir la
librería <stdio.h>.

LECTURA Y ESCRITURA EN FICHEROS

Para almacenar datos en un fichero es necesario realizar una operación de escritura, de igual forma que
para obtener datos hay que efectuar una operación de lectura. En C existen muchas y variadas
operaciones para leer y escribir en un fichero; entre ellas tenemos: fread -fwrite, fgetc -fputc, fgets - fputs,
fscanf -fprintf

Es aconsejable utilizarlas por parejas; es decir, si se escribe con fwrite se debe leer con fread.

Lectura y escritura de bloques ( fread – fwrite )

Para leer y escribir en ficheros que no sean de texto las operaciones que se deben utilizar son fread y
fwrite.

El formato de escritura en bloque es el siguiente:

fwrite (direcc_dato, tamaño_dato, numero_datos, punt_fichero);

Escribe tantos datos como indique número de datos en el fichero, tomando los datos a partir de la
dirección del dato.

Los datos tienen que tener tantos bytes como especifique tamaño. La función fwrite devuelve el número
de elementos escritos, este valor debe coincidir con numero de datos.

Para calcular el tamaño en bytes de un dato o un tipo de dato se suele utilizar la función sizeof (dato) o
sizeof (tipo-de-dato);

Por ejemplo:

int i, v[3]; ® sizeof (i) daría lo mismo que sizeof (int)


® sizeof (v) daría 3 veces el resultado de sizeof (V[1])

Ejemplo : Copiar un fichero de texto en otro.

#include <stdio.h>
main ( )
{ FILE *fin *fout;
char c, x;
if (((fin = fopen(“DATOSIN.DAT", “rt")) == NULL) ||
((fout = fopen(“DATOSOUT.DAT" , “wt")) == NULL))
{ if (fout ! = NULL) fclose (fout) ;
if (fin ! = NULL) fclose (fin) ;
printf (“Error en la apertura de ficheros de salida \n” );
return 1;
}

c = fgetc(fin);
while (c != EOF)
{ x = fputc (c, fout);
if (x! = c) printf ("Error de escritura");

c = fgetc(fin);
}

77
fclose (fin);
fclose (fout);
return 0;
}

Vamos a comenzar por ver cómo leer un fichero de texto. Primero voy a poner un ejemplo que lea y
muestre el AUTOEXEC.BAT, y después lo iré comentando:

/*-------------------------*/
/* Ficheros de texto (1) */
/* */
/*-------------------------*/
#include <stdio.h>
FILE* fichero;
char texto[80];
main()
{
fichero = fopen("c:\\autoexec.bat", "rt");
/* En Linux: fichero = fopen("/proc/cpuinfo", "rt"); */
if (fichero == NULL)
{
printf("No existe el fichero!\n");
exit(1);
}
while (! feof(fichero)) {
fgets(texto, 80, fichero);
printf("%s", texto);
}
fclose(fichero);
}
/*-------------------------*/

Aquí van los comentarios sobre este programa:


FILE es el tipo asociado a un fichero. Realmente se trata de un "puntero a fichero", por eso aparece el
asterisco * a su derecha.

Para abrir el fichero usamos "fopen", que lleva dos parámetros: el nombre del fichero y el modo de
lectura. En el nombre del fichero, la barra \ aparece repetida a propósito, porque (como vimos al hablar
de "printf") es un código de control, de modo que \a sería la señal de alerta (un pitido), que no es lo que
queremos leer.

Por eso, ponemos \\, que se traduce como una sola barra. Lo de "rt" indica que el modo será de lectura
(r) en un fichero de texto (t). Si usamos GCC bajo Linux, no existe "c:\autoexec.bat", así que podemos leer
"/proc/cpuinfo", o "/proc/devices", o ".profile", por ejemplo.

Como "fichero" es un puntero (a fichero), para mirar si ha habido algún problema, comprobamos si ese
puntero sigue siendo nulo después de intentar acceder al fichero.

Después repetimos una parte del programa hasta que se acabe el fichero, de lo que nos informa "feof"
(EOF es la abreviatura de End Of File, fin de fichero).

Con "fgets" leemos una cadena de texto, que podemos limitar en longitud (en este caso, a 80 caracteres),
desde el fichero. Esta cadena de texto conservará los caracteres de avance de línea.

Finalmente, cerramos el fichero con "fclose".

78
Si queremos crear un fichero, los pasos son muy parecidos, sólo que lo abriremos para escritura (w), y
escribiremos con "fputs":
/*-------------------------*/
/* Ficheros de texto (2) */
/*-------------------------*/
#include <stdio.h>
FILE* fichero;
char texto[80];
main()
{
fichero = fopen("basura.dat", "wt");
if (fichero == NULL)
{
printf("No se ha podido crear el fichero!\n");
exit(1);
}
fputs("Esto es una línea\n", fichero);
fputs("Esto es otra", fichero);
fputs(" y esto es continuación de la anterior\n", fichero);
fclose(fichero);
}
/*-------------------------*/

Antes de seguir, vamos a ver las letras que pueden aparecer en el modo de apertura del fichero:
Tipo Significado
r Abrir sólo para lectura.
w Crear para escribir. Sobre-escribe si existiera ya.
a Añade al final si existe, o crea si no existe.
+ Permite modificar. Por ejemplo: r+
t Abrir en modo de texto.
b Abrir en modo binario.

Si queremos leer o escribir sólo una letra, tenemos las órdenes "fgetc" y "fputc", que se usan:

 letra = fgetc( fichero );


 fputc (letra, fichero);

Podemos querer crear un "fichero con tipo", en el que todos los componentes vayan a ser del mismo
tipo. Por ejemplo, podría ser para un agenda, en la que guardemos los datos de cada persona con un
"struct".

En casos como éste, la solución más cómoda puede ser usar "fprintf" y "fscanf", análogos a "printf" y
"scanf", que se emplearían así:

fprintf( fichero, "%40s%5d\n", persona.nombre, persona.numero);


fscanf( fichero, "%40s%5d\n", &persona.nombre, &persona.numero);

Finalmente, podemos crear ficheros "sin tipo", es decir, que la información que contengan no
necesariamente sea sólo texto ni tampoco datos siempre iguales.

En este caso, utilizamos "fread" y "fwrite" (análogos a BlockRead y BlockWrite, para quien venga de
Pascal). Los datos que se leen se van guardando en un buffer (una zona intermedia de memoria). En el
momento en que se lean menos bytes de los que hemos pedido, quiere decir que hemos llegado al final
del fichero.

79
Vamos a ver un ejemplo, que comentaré después:
/* Ficheros sin tipo: */
/* Copiador elemental */
/*-------------------------*/
#include <stdio.h>
FILE *fichOrg, *fichDest; /* Los dos ficheros */
char buffer[2048]; /* El buffer para guardar lo que leo */
char nombreOrg[80], /* Los nombres de los ficheros */
nombreDest[80];
int cantidad; /* El número de bytes leídos */
main()
{
/* Accedo al fichero de origen */
printf("Introduzca el nombre del fichero Origen: ");
scanf("%s",nombreOrg);
if ((fichOrg = fopen(nombreOrg, "rb")) == NULL)
{
printf("No existe el fichero origen!\n");
exit(1);
}
/* Y ahora al de destino */
printf("Introduzca el nombre del fichero Destino: ");
scanf("%s",nombreDest);
if ((fichDest = fopen(nombreDest, "wb")) == NULL)
{
printf("No se ha podido crear el fichero destino!\n");
exit(1);
}
/* Mientras quede algo que leer */
while (! feof(fichOrg) )
{
/* Leo datos: cada uno de 1 byte, todos los que me caben */
cantidad = fread( buffer, 1, sizeof(buffer), fichOrg);
/* Escribo tantos como haya leído */
fwrite(buffer, 1, cantidad, fichDest);
}
/* Cierro los ficheros */
fclose(fichOrg);
fclose(fichDest);
}

Las novedades en este programa son:

Defino un buffer de 2048 bytes (2 K), en el que iré guardando lo que lea.
En la misma línea intento abrir el fichero y compruebo si todo ha sido correcto. Es menos legible, pero
más compacto, y, sobre todo, muy frecuente encontrarlo en "fuentes ajenos" de esos que circulan por
ahí, de modo que he considerado adecuado incluirlo.

A "fread" le digo que quiero leer 2048 datos de 1 byte cada uno, y él me devuelve la cantidad de bytes
que ha leído realmente. Cuando sea menos de 2048 bytes, es que el fichero se ha acabado.

A "fwrite" le indico el número de bytes que quiero que escriba.

Cuando trabajamos con un fichero, es posible que necesitemos acceder directamente a una cierta
posición del mismo. Para ello usamos "fseek", que tiene el formato:

int fseek(FILE *fichero, long posic, int desde);

80
Como siempre, comentemos qué es cada cosa:

Es de tipo "int", lo que quiere decir que nos va a devolver un valor, para que comprobemos si realmente
se ha podido saltar a la dirección que nosotros le hemos pedido: si el valor es 0, todo ha ido bien; si es
otro, indicará un error (normalmente, que no hemos abiertos el fichero).

"fichero" indica el fichero dentro de el que queremos saltar. Este fichero debe estar abierto previamente
(con fopen).

"posic" nos permite decir a qué posición queremos saltar (por ejemplo, a la 5010).

"desde" es para poder afinar más: la dirección que hemos indicado con posic puede estar referida al
comienzo del fichero, a la posición en la que nos encontramos actualmente, o al final del fichero (entonces
posic deberá ser negativo). Para no tener que recordar que un 0 quiere decir que nos referimos al
principio, un 1 a la posición actual y un 2 a la final, tenemos definidas las constantes:

SEEK_SET (0): Principio


SEEK_CUR (1): Actual
SEEK_END (2): Final

Finalmente, si queremos saber en qué posición de un fichero nos encontramos, podemos usar
"ftell(fichero)".

Pues esto es el manejo de ficheros en C. Ahora sólo queda elegir un proyecto en el que aplicarlos, y
ponerse con ello.

CADENA DE TEXTO

El hecho de que este tema se encuentre al final no quiere decir que sea más difícil que los anteriores. De
hecho, es más fácil que los ficheros, y desde luego mucho más fácil que dominar los punteros. Se trata
simplemente de separarlo un poco del resto, porque he visto que mucha gente que viene de programar
en lenguajes como Pascal tiende a hacer cosas como estas:

texto = "Hola";

Es una forma muy legible de dar una valor a una cadena de texto... ¡en otros lenguajes! En C no se puede
hacer así. Por eso he puesto este tema separado: sólo para recalcar que ciertas cosas no se pueden hacer.

Vamos a empezar por lo fundamental, que no se debe olvidar:


Una cadena de texto en C no es más que un array de caracteres. Como a todo array, se le puede reservar
espacio estáticamente o dinámicamente. Ya lo vimos en el tema de punteros, pero insisto: estáticamente
es haciendo cosas como

char texto[80];
y dinámicamente es declarándola como puntero:
char *texto;
y reservando memoria con "malloc" cuando nos haga falta.

En cualquier caso, una cadena de caracteres siempre terminará con un carácter nulo (\0). Por eso, si
necesitamos 7 letras para un teléfono, deberemos hacer char telefono[8]; dado que hay que almacenar
esas 7 y después un “\0”. Si sabemos lo que hacemos, podemos reservar sólo esas 7, pero tendremos que
usar nuestras propias funciones, porque las que nos ofrece el lenguaje C se apoyan todas en que al final
debe existir ese carácter nulo.

81
Ahora vamos ya con lo que es el manejo de las cadenas:

Para copiar el valor de una cadena de texto en otra, no podemos hacer texto1 = texto2; porque
estaríamos igualando dos punteros. A partir de este momento, las dos cadenas se encontrarían en la
misma posición de memoria, y los cambios que hiciéramos en una se reflejarían también en la otra.
En vez de eso, debemos usar una función de biblioteca, "strcpy" (string copy), que se encuentra, como
todas las que veremos, en "string.h":

strcpy (destino, origen);

Es nuestra responsabilidad que en la cadena de destino haya suficiente espacio reservado para copiar lo
que queremos. Si no es así, estaremos sobre-escribiendo direcciones de memoria en las que no sabemos
qué hay.

Si queremos copiar sólo los primeros n bytes de origen, usamos

strncpy (destino, origen, n);

Para añadir una cadena al final de otra (concatenarla), usamos

strcat (origen, destino);

Para comparar dos cadenas alfabéticamente (para ver si son iguales o para poder ordenarlas, por
ejemplo), usamos

strcmp (cad1, cad2);

Esta función devuelve un número entero, que será: - 0 si ambas cadenas son iguales. - negativo, si cad1 <
cad2. - positivo, si cad1 > cad2.

Según el compilador que usemos, tenemos incluso funciones ya preparadas para convertir una cadena a
mayúsculas: strupr (esa línea del siguiente ejemplo funciona en TC y SC, pero no en GCC).

Estas son las principales posibilidades, aunque hay muchas más funciones (quien tenga curiosidad puede
mirar la ayuda sobre "string.h" en su compilador favorito). Vamos a aplicarlas a un ejemplo:
/*-------------------------*/
/* Cadenas de texto */
/* */
/*-------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char texto1[80] = "Hola"; /* Cadena estática */
char *texto2; /* Cadena dinámica */

main()
{ /* Reservo espacio para la cadena dinámica */
texto2 = (char *) malloc (70* sizeof(char));
strcpy(texto2, "Adios"); /* Le doy un valor */
puts(texto1); puts(texto2); /* Escribo las dos */
strncpy(texto1, texto2, 3); /* Copio las 3 primeras letras */
puts(texto1); /* Escribo la primera -> Adia */
strcat(texto1, texto2); /* Añado texto2 al final */
puts(texto1); /* Escribo la primera -> AdiaAdios */
/* Comparo alfabéticamente */
printf("Si las comparamos obtenemos: %d",

82
strcmp(texto1, texto2));
printf(" (Número negativo: texto1 es menor)\n");
/* Longitud */
printf("La longitud de la primera es %d\n", strlen(texto1));
/* Mayúsculas -No en GCC- */
printf("En mayúsculas es %s.\n",
strupr(texto1));
free(texto2); /* Libero lo reservado */
}
/*-------------------------*/

Hay dos posibilidades más de las cadenas de texto que merece la pena comentar. Son las que nos ofrecen
las funciones “sprintf” y “sscanf”:

La funcion “sprintf” crea una cadena de texto a partir de una especificación de formato y unos ciertos
parámetros, al igual que hace “printf”, pero la diferencia está en que “printf” manda su salida a la pantalla,
mientras que “sprintf” la deja guardada en una cadena de texto.

Por ejemplo, si escribimos

printf(”El número %d multiplicado por 2 vale %d\n”, 50, 50*2);

En pantalla aparecerá escrito


El número 50 multiplicado por 2 vale 100

Pues bien, si tenemos una cadena de texto que hayamos definido (por ejemplo) como char cadena[100]
y escribimos sprintf(cadena,”El número %d multiplicado por 2 vale %d\n”, 50, 50*2);

Esta vez en pantalla no aparece nada escrito, sino que “cadena” pasa a contener el texto que antes
habíamos mostrado. Ahora ya podríamos escribir este texto con cualquiera de estas dos órdenes:
puts(cadena);
printf(”%s”, cadena);

Por otra parte “sscanf” es similar a “scanf”, con la diferencia de que los valores para las variables no se
leen desde el teclado, sino desde una cadena de texto

strcpy(cadena, ”20 30”);


sscanf(cadena, ”%d %d”, &primerNum, &segundoNum);

Nota: sscanf devuelve el número de valores que realmente se han detectado, de modo que podemos
comprobar si ha tomado todos los que esperábamos o alguno menos (porque el usuario haya tecleado
menos de los que esperábamos o porque alguno esté tecleado incorrectamente).

Funciones textcolor(), textbackground() y textattr()

La función textcolor() establece el color del texto que se presenta a partir del momento en que se ejecuta la
función.

textcolor (color_de_carácter);

El parámetro color_de_carácter es un número comprendido entre 0 y 15. Cada uno de estos números tiene
asociado un color. Además, en el archivo conio.h se define una macro para cada color. Esto queda reflejado
en la tabla siguiente:

83
VALOR COLOR MACRO
0 Negro BLACK
1 Azul BLUE
2 Verde GREEN
3 Turquesa CYAN
4 Rojo RED
5 Morado MAGENTA
6 Marrón BROWN
7 Blanco LIGHTGRAY
8 Gris DARKGRAY
9 Azul intenso LIGHTBLUE
10 Verde intenso LIGHTGREEN
11 Turquesa intenso LIGHTCYAN
12 Rojo intenso LIGHTRED
13 Morado intenso LIGHTMAGENTA
14 Amarillo YELLOW
15 Blanco intenso WHITE
128 Parpadeo BLINK

Teniendo esto en cuenta, para conseguir que un texto se presente, por ejemplo, en color verde, previamente
a su escritura debe hacerse

textcolor (2);

o bien

textcolor (GREEN);

Sin embargo, esto no tiene efecto si se utilizan las funciones printf(), puts(), gets() y putchar(). En su lugar,
deben utilizarse las funciones cprintf(), cputs(), cgets() y putch(), respectivamente. Sigue siendo válida la
función getche().

Para conseguir el parpadeo del carácter debe hacerse una operación OR entre el color y el valor 128 (BLINK).
Por lo tanto, si queremos presentar un texto en amarillo parpadeante debemos escribir

textcolor (YELLOW | BLINK);

La función textbackground() establece el color de fondo para todo texto que se escriba en pantalla a
continuación.

textbackground (color_de_fondo);

siendo color_de_fondo un valor comprendido entre 0 y 7, correspondiente a la tabla anterior.

La función textattr() establece el byte de atributo completo (color de carácter, color de fondo, parpadeo si/no
e intensidad alta/baja). Se escribe

textattr (atributo);

Donde atributo es un byte cuyo significado se muestra a continuación

84
7 6 5 4 3 2 1 0
P F F F I C C C

Donde CCC son los bits que codifican el color del carácter, I es el bit de intensidad, FFF indican color de fondo,
y P es el bit de parpadeo. La forma más cómoda de usar esta función es la siguiente: se multiplica el número
del color de fondo de la tabla por 16 y se hace una operación OR con el color de carácter. Si además se quiere
que el texto parpadee, debe hacerse una operación OR con el valor 128 (BLINK). Así, para obtener un texto
en amarillo parpadeando sobre fondo azul, debe hacerse:

textattr (YELLOW | BLINK | BLUE * 16);

Función textmode(): Asigna un determinado modo de vídeo a la pantalla de texto:

textmode (modo_de_vídeo);

Los valores permitidos para modo_de_vídeo y las macros asociadas se muestran en la tabla siguiente

MODO DE DESCRIPCIÓN MACRO


VÍDEO
0 Blanco y negro, 40 columnas BW40
1 Color, 40 columnas CO40
2 Blanco y negro, 80 columnas BW80
3 Color, 80 columnas CO80
7 Monocromo MONO
-1 Modo anterior LASTMODE

Al asignar un modo de vídeo se inicializa la pantalla.

85
EJEMPLOS DE PROGRAMAS:
Diseña un programa que realice la suma de dos números, un int y un float, y que muestre el resultado:

# include <stdio.h>
# include <conio.h>
void main ( )
{
clrscr ( );
int n1;
float n2, res;
printf(“Dame el número 1”);
scanf(“%d”, & n1);
printf(“Dame el número 2”);
scanf(“%f”, & n2);
res = n1 + n2;
printf(“Resultado %f”, res);
getch ( );
}

Calcular el área de un circulo si conocemos que es igual a   r 2 . El valor de Pi deberá ser tomado como
constante.

# include <stdio.h>
# include <conio.h>
# include <math.h>
void main ( )
{
clrscr ( );
const float Pi = 3.1416;
int radio;
float res;
printf(“Dame el valor del radio”);
scanf(“%d”, & radio);
res = Pi * (pow (radio, 2));
printf(“El area es: &f”, res);
getch ( );
}

86
Calcular el sueldo neto de un trabajador en función de horas trabajadas y precio por hora. El sueldo bruto
obtenido determina una retención del 8% del seguro de vida, que es en base al sueldo bruto, presente el
sueldo neto y la retención del seguro.

# include <stdio.h>
# include <conio.h>
void main ( )
{
clrscr ( );
int horas, precio,
float ret, sb, sn;
printf(“Horas trabajadas”);
scanf(“%d”, & horas);
printf(“Precio horas”);
scanf(“%d”, & horas);
sb = precio * horas;
ret = sb * 0.08;
sn = sb – ret;
printf(“La retención es:””%f”, ret);
printf(“Su sueldo neto es:””%f”, sn);
getch ( );
}

87

También podría gustarte