You are on page 1of 32

1

Prefacio:
El curso de lógica de la programación, es
naturaleza teórico - práctica. Los conceptos y
las prácticas han sido pensadas para que el
alumno pueda desarrollar las diferentes
técnicas de programación, resolviendo
algoritmos y convirtiéndolos en programas
utilizando el lenguaje C++ Propone
desarrollar en el estudiante las competencias
para comprender el fundamento del lenguaje de programación de alto nivel C++.

COMPETENCIA
Diseñar, efectuar y negociar el uso de las diferentes tecnologías de Información y
Comunicación de una Institución, a partir del análisis de sus requerimientos, teniendo
en cuenta los criterios de calidad, seguridad y ética profesional propiciando el trabajo en
equipo.
Tecnificar los diferentes métodos en el diseño de los diagramas de flujo y la aplicación
básica de sistema planteado utilizando el lenguaje de alto nivel C++.

Comprende cuatro Unidades de Aprendizaje:

Unidad Didáctica I: Elaboración de algoritmos

Unidad Didáctica II: Diseño y ejecución de diagramas de Flujo

Unidad Didáctica III: Aplicación de algoritmos procedimental

Unidad Didáctica IV: Diseño de aplicaciones

2
Índice del Contenido
I. PREFACIO
02

II. DESARROLLO DE LOS CONTENIDOS


03 - 27

UNIDAD DIDÁCTICA I:ELABORACION DE ALGORITMOS 04-06

07-16
UNIDAD DIDÁCTICA II: DISEÑO Y EJECUCION DE DIAGRAMAS DE FLUJO

UNIDAD DIDÁCTICA III: APLICACIÓN DE ALGORITMOS PROCEDIMENTALES


17-23

UNIDAD DIDÁCTICA IV: DISEÑO DE APLICACIONES


24-32

32
TRABAJO DE INVESTIGACION

32
FUENTES DE INFORMACIÓN

3
UNIDAD DIDÁCTICA I: ELABORACIÓN DE
ALGORITMOS
Concepto básico de algoritmo
Algoritmo s. m. En aritmética y programación informática,
conjunto ordenado de instrucciones sistemáticas que permite
hallar la solución de un problema específico: el algoritmo que
se emplea para hallar las raíces cuadradas; un programa
informático es un conjunto de secuencias de instrucciones
elementales en forma de algoritmo La palabra algoritmo se
deriva de la traducción al latín de la palabra árabe
Alkhowarizmi, nombre de un matemático y astrónomo árabe
que escribió un tratado sobre la manipulación de números y ecuaciones en el siglo IX.
Son un conjunto de operaciones que se utilizan para resolver problemas específicos. En
estas instrucciones se indica la secuencia de operaciones que se deben realizar para
que partiendo de los datos de entada se pueda obtener el resultado buscado.

Los algoritmos son utilizados en el mundo de la ciencia para la resolución metódica de


problemas. Los algoritmos no siempre están escritos de una forma que conduce al
programa más efectivo en términos de requisitos de tiempo o almacenamiento.
Las principales características que debe tener un buen algoritmo son:
Debe tener un punto particular de inicio.
Debe ser completamente definido y no debe permitir dobles interpretaciones.
Debe ser general, es decir, soportar la mayoría de las variantes que se puedan
presentar en la definición del problema.
Debe ser finito en tamaño y tiempo de ejecución.
Debe ser legible, claro y fácil de interpretar y entender.

Algoritmos secuenciales.

Es aquélla en la que una acción


(instrucción) sigue a otra en
secuencia. Las tareas se suceden de
tal modo que la salida de una es la
entrada de la siguiente y así
sucesivamente hasta el fin del
proceso. La estructura secuencial
tiene una entrada y una salida. Su
representación gráfica es la siguiente:

4
Algoritmos condicionales
En los lenguajes de programación es común el uso de
condicionales que sirven para denotar diferentes
alternativas que pueden llevarse a cabo dado el valor de
una expresión lógica, el cual siempre será verdadero o
falso. La forma general que tiene un condicional (una
pregunta) es la siguiente: SI (expresión lógica verdadera)
instrucciones que se realizan si la expresión lógica es
verdadera EN CASO CONTRARIO instrucciones que se
realizan si la expresión lógica es falsa
Algoritmos repetitivos finitos
Otro paso en la elaboración de un algoritmo es el de
la iteración de una o mas instrucciones involucradas
en la solución de un requerimiento, por tanto existen
dos esquemas el cualitativo y el cuantitativo en los
cuales el programador o desarrollador debe tener
agilidad y destreza para su selección; estos a su vez
se componen de las siguientes estructuras
(mientras, haga mientras que y para). Los algoritmos
finitos debe tener un número finito de pasos, por lo
que debe estar limitado tanto en tiempo de
realización como por el número de pasos que realiza

Algoritmos repetitivos infinitos


El bucle de la siguiente
figura es infinito, ya
que las instrucciones
(1), (2) y (3) se ejecutan
indefinidamente, pues
no existe salida del
bucle, al no cumplirse
una determinada
condición

TIPOS DE ALGORITMOS
Cualitativos: son aquellos en los que se describen los pasos utilizando
palabras. Son todos aquellos pasos o instrucciones descritos por medio
de palabras que sirven para llegar a la obtención de una respuesta o
solución de un problema cualquier
Cuantitativos: son aquellos en los que se utilizan cálculos numéricos
para definir los pasos del proceso. Son aquellos pasos o instrucciones
que involucran cálculos numéricos para llegar a un resultado satisfactorio

5
TIPOS DE ALGORITMOS DE RAZONAMIENTO:
Algoritmos Estáticos: son los que funcionan siempre igual,
independientemente del tipo de problema tratado.
Algoritmos Adaptativos: algoritmos con cierta capacidad de
aprendizaje.
Algoritmos Probabilísticos: son algoritmos que no utilizan
valores de verdad booleanos sino continuos. Existen varios tipos de algoritmos
probabilísticos dependiendo de su funcionamiento, pudiéndose distinguir:
Algoritmos numéricos: que proporcionan una solución aproximada del problema.
Algoritmos de Montecarlo: que pueden dar la respuesta correcta o respuesta erróneas
(con probabilidad baja).
Algoritmos de Las Vegas: que nunca dan una respuesta incorrecta: o bien dan la
respuesta correcta o informan del fallo.
Algoritmo Cotidiano: es la serie de pasos que realizamos en nuestra vida diaria para
realizar las diferentes tareas y actividades comunes, desde los pasos al levantarnos, así
como ir de compras, etc.
Algoritmo Voraz: un algoritmo voraz es aquel que, para resolver un determinado
problema, sigue una meta heurística consistente en elegir la opción óptima en cada paso
local con la esperanza de llegar a una solución general óptima.
Algoritmo Determinista: es un algoritmo que, en términos informales, es
completamente predictivo si se conocen sus entradas.

Algoritmo Heurístico: es un algoritmo que abandona uno o ambos objetivos; por


ejemplo, normalmente encuentran buenas soluciones, aunque no hay pruebas de que
la solución no pueda ser arbitrariamente errónea en algunos casos; o se ejecuta
razonablemente rápido, aunque no existe tampoco prueba de que siempre será así. Las
heurísticas generalmente son usadas cuando no existe una solución óptima bajo las
restricciones dadas (tiempo, espacio), o cuando no existe del todo.
Algoritmo de escalada: la idea básica consiste en comenzar con una mala solución a
un determinado problema y, repetidamente, aplicar optimizaciones a la misma hasta que
esta sea óptima o satisfaga algún otro requisito.
Ciencias en que se apoya la algoritmia para producir soluciones ingeniosas!
· Ciencias de la Computación. · Ciencias Sociales.
· Matemáticas. · Ciencias Políticas.

¿Cómo podemos determinar la complejidad de un


algoritmo?
No existe receta que siempre funcione para calcular la
complejidad de un algoritmo, si es posible tratar
sistemáticamente una gran cantidad de ellos, basándonos en
que suelen estar bien estructurados y siguen pautas uniformes.
Loa algoritmos bien estructurados combinan las sentencias de alguna de las siguientes
formas:
· Sentencias sencillas · Bucles
· Secuencia (;) · Llamadas a procedimiento.
· Decisión (if)

6
UNIDAD DIDÁCTICA II: DISEÑO Y EJECUCIÓN DE
DIAGRAMAS DE FLUJO

Algoritmo con arreglos


Un arreglo es una estructura de datos, o más
técnicamente, un espacio de memoria que permite
almacenar una colección de elementos, todos del
mismo tipo. Conviene imaginar un arreglo como una
secuencia contigua de celdas (espacios de memoria),
o casillas, en cada una de las cuales se puede guardar
un elemento de la colección.
También se define como un grupo de celdas de
memoria relacionadas entre sí ya que todos tienen el
mismo nombre y almacenan el mismo tipo de datos
para referirse a una celda en particular algún elemento
dentro del arreglo y entre corchetes [] el número de
posición del elemento dentro del arreglo. El primer elemento se almacena en la posición 0 del
arreglo, es decir el primer elemento del arreglo se conoce como a[0], el segundo como a[1], el
séptimo como a[6] y en general el elemento de orden i del arreglo a se conoce como a[i-1].
El número de posición que aparece dentro de los corchetes se conoce como índice y debe ser un
número entero o una expresión entera.

Diagrama de flujo.
Un diagrama de flujo es una representación gráfica de un proceso. Cada paso del proceso es
representado por un símbolo diferente que contiene una breve descripción de la etapa de proceso.
Los símbolos gráficos del flujo del proceso están unidos entre sí con flechas que indican la
dirección de flujo del proceso.

El diagrama de flujo ofrece una descripción


visual de las actividades implicadas en un
proceso mostrando la relación secuencial
ente ellas, facilitando la rápida
comprensión de cada actividad y su
relación con las demás, el flujo de la
información y los materiales, las ramas en
el proceso, la existencia de bucles
repetitivos, el número de pasos del
proceso, las operaciones de
interdepartamentales… Facilita también la
selección de indicadores de proceso

7
Beneficios del Diagrama de Flujo
En primer lugar, facilita la obtención de una
visión transparente del proceso, mejorando
su comprensión. El conjunto de actividades,
relaciones e incidencias de un proceso no
es fácilmente discernible a priori. La
diagramación hace posible aprehender ese
conjunto e ir más allá, centrándose en
aspectos específicos del mismo,
apreciando las interrelaciones que forman
parte del proceso así como las que se dan
con otros procesos y subprocesos.
Permiten definir los límites de un proceso. A
veces estos límites no son tan evidentes, no estando definidos los distintos proveedores y
clientes (internos y externos) involucrados.
El diagrama de flujo facilita la identificación de los clientes, es más sencillo determinar sus
necesidades y ajustar el proceso hacia la satisfacción de sus necesidades y expectativas.
Estimula el pensamiento analítico en el momento de estudiar un proceso, haciendo más
factible generar alternativas útiles.

Un Diagrama de Flujo, su correcta construcción es sumamente importante porque, a partir del


mismo se escribe un programa en algún Lenguaje de Programación.
Si el Diagrama de Flujo está completo y correcto, el paso del mismo a un Lenguaje de
Programación es relativamente simple y directo. Es importante resaltar que el Diagrama de Flujo
muestra el sistema como una red de procesos funcionales conectados entre sí por " Tuberías " y
"Depósitos" de datos que permite describir el movimiento de los datos a través del Sistema. Este
describirá : Lugares de Origen y Destino de los datos , Transformaciones a las que son sometidos
los datos, Lugares en los que se almacenan los datos dentro del sistema , Los canales por donde
circulan los datos. Además de esto podemos decir que este es una representación reticular de un
Sistema, el cual lo contempla en términos de sus componentes indicando el enlace entre los
mismos.

Arreglos
La manipulación de datos es una de las principales actividades
que realizan los programas, por tal motivo se han creado varias
estructuras que permiten manejar los datos de diferentes
maneras, pero siempre buscando la optimización en su
manejo. Una de las primeras estructuras de datos que se
estudia son los arreglos. La característica que define al algoritmo propuesto es la utilización de la
sentencia FOR y cuyo objetivo es tomar cinco veces por teclado (leer) los nombres, apellidos y
presentarlos en pantalla, de esta manera se evita la definición de cinco variables para nombres
(n1, n2, n3,…) y cinco variables para los apellidos (a1, a2, a3,…) lo que implica un ahorro de
espacio en memoria. Pero, ¿que implicó que solo se defina una variable no para los nombres y
una variable ape para los apellidos?

8
Pues bien, el problema principal es que los valores anteriores de las variables en cada repetición
del FOR serán sobrescritos por los nuevos valores ingresados, en otras palabras, si se desea
ingresar una lista de 1000 nombres, con el algoritmo anterior y luego proceder a presentar los 100
primeros nombres resultaría imposible realizarlo mediante el procedimiento anterior, ya que no se
ha guardado más que el último valor que se ingresó. Para resolver problemas que trabajan con un
conjunto de variables del mismo tipo se utiliza arreglos que en si son estructuras de datos que
pueden contener información de un mismo tipo. Los arreglos permiten manejar grandes conjuntos
de datos solamente con una sola variable y mediante la utilización de índices.
En nuestro ejemplo bastaría con declarar nom[1000] y ape[1000].

Algoritmo ALUMNOS FOR CON ARREGLOS


Clase Alumnos For
1. Método principal
a. Declaraciones
Variables
nom[1000], ape[1000]: Cadena
i : Entero
b. FOR i = 1; i <= 1000; i ++
1. Solicitar Nombre y apellido del alumno i
2. Leer nom[ i ], ape[ i ]
c. ENDFOR
d. FOR i = 1; i <= 100; i ++
1. Presentar nom[ i ], ape[ i ]
e. ENDFOR
f. Fin Método principal
Fin Clase AlumnosFor
Fin

Declaraciones
La declaración de objetos en C tiene como finalidad dar a conocer
el tipo y propiedades de los identificadores. En general la forma de
una declaración es: (durabilidad) tipo identificador (=expresión de
inicialización);
Por ejemplo, static int n=10;
Todos las variables deben ser declaradas. En las declaraciones es
obligado especificar el tipo. De cada objeto en un programa C se puede establecer tres
propiedades que le afectan en su relación: el alcance, la visibilidad y la durabilidad.
Alcance.- El alcance sirve para saber en qué región del código una declaración de un objeto está
activa, es decir, el objeto existe. Si la declaración es realizada en un bloque de código entre llaves,
el alcance es la región que va entre las llaves. Si se declara en la parte de arriba del fichero
(normalmente) o en una parte que no va entre llaves, el alcance se establece en todo el fichero.
Los identificadores establecidos con la sentencia #define tienen alcance durante todo el fichero o
hasta que lo elimina la sentencia #undef.
Visibilidad.- La visibilidad nos indica en qué región del
código un objeto está activo. La diferencia con el alcance
es que en una misma región pueden estar dos objetos con
el mismo identificador, ocultando un objeto a otro.

9
Durabilidad.- La durabilidad es el tiempo de ejecución del programa donde el objeto existe en la
memoria. La durabilidad puede ser:
 Estática: El objeto perdura desde la compilación hasta el final. Esta durabilidad la tienen todas
las funciones declaradas, las variables no declaradas en ningún cuerpo de función (incluido
main) y las variables declaradas con static.
 Local: El objeto es creado en la entrada de un bloque y es borrado a la salida. Esta durabilidad
la tienen los argumentos formales y las variables declaradas con auto (es la declaración por
defecto y no se suele poner). Las variables declaradas en un bloque son (a menos que se
especifique) variables locales.
Existen otros dos tipos de durabilidad:
 extern: los objetos especificados tienen durabilidad
static e informa al enlazador de programas para que
realice las unificaciones pertinentes entre ficheros.
Es decir, convierten su alcance al total del
programa. La declaración del mismo objeto en otros
ficheros se toma como referencia y debe tener
obligatoriamente el especificador extern.
Si se pone un valor de inicialización, se debe
inicializar en la declaración de la variable que no lleva extern.
 Register: se puede utilizar para variables locales y argumentos de funciones. Establece una
durabilidad local pero informa de un uso intensivo de memoria, haciendo que el compilador le
asocie un acceso de memoria rápido

Creación de clases
Una clase es la estructura de un objeto, es decir, la definición de todos los elementos de que está
hecho un objeto. Un objeto es, por lo tanto, el
"resultado" de una clase. En realidad, un objeto
es una instancia de una clase, por lo que se
pueden intercambiar los términos objeto o
instancia (o incluso evento). Una clase se
compone de dos partes:
 Atributos (denominados, por lo general,
datos miembros): esto es, los datos que se
refieren al estado del objeto
 Métodos (denominados, por lo general,
funciones miembros): son funciones que
pueden aplicarse a objetos

Si tenemos una clase llamada auto, los objetos Peugeot y Renault serán instancias de esa clase.
También puede haber otros objetos Peugeot 406, diferenciados por su número de modelo.
Asimismo, dos instancias de una clase pueden tener los mismos atributos, pero considerarse
objetos distintos independientes. En un contexto real: dos camisas pueden ser idénticas, pero no
obstante, también ser diferentes de alguna manera. Sin embargo, si las mezclamos es imposible
distinguir una de la otra.

10
La base del encapsulamiento es la clase, a partir de ellas se le dan las características y
comportamiento a los objetos. Lo primero es crear la clase y después en la función Main que sigue
siendo la principal crearemos los objetos de cada una de las clases. Las variables y funciones de
una clase pueden ser públicas, privadas o protegidas. Estos modificadores nos indican en que
partes de un programa podemos utilizar las funciones y variables.
 prívate: Solo tendrán acceso los de la misma clase donde estén definidos.
 public: Se pude hacer referencia desde cualquier parte del programa.
 protected: Se puede hacer referencia desde la misma clase y las subclases.
Creación de una clase:
class nomb_clase{
funciones y variables privadas;
public:
funciones y variables públicas;
}

Creación del objeto:


nomb_clase nombre_objeto1;
nomb_clase nombre_objeto2;
Llamadas a las funciones de una clase:
nombre_objeto.nomb_funcion (parámetros);
Desarrollo de funciones miembro:
val devuelto nomb_clase::nomb_funcion
(parámetros){
Cuerpo;
}
Declaramos una clase con una variable privada y dos funciones públicas. La clase recibe el
nombre de miclase.
class miclase{
int a;
public:
void funcion1(int num);
int funcion2();
}

Operaciones.
C++ es un lenguaje de programación de propósito
general que ofrece economía sintáctica, control de
flujo y estructuras sencillas y un buen conjunto de
operadores. Es un lenguaje de muy alto nivel, sencillo
y no está especializado en ningún tipo de aplicación.
Esto lo hace un lenguaje potente, con un campo de
aplicación ilimitado y sobre todo, se aprende
rápidamente. En poco tiempo, un programador puede
utilizar la totalidad del lenguaje.

11
C++ trabaja con tipos de datos que son directamente tratables
por el hardware de la mayoría de computadoras actuales, como
son los caracteres, números y direcciones. Estos tipos de datos
pueden ser manipulados por las operaciones aritméticas que
proporcionan las computadoras. No proporciona mecanismos
para tratar tipos de datos que no sean los básicos, debiendo
ser el programador el que los desarrolle. Esto permite que el
código generado sea muy eficiente y de ahí el éxito que ha
tenido como lenguaje de desarrollo de sistemas. No
proporciona otros mecanismos de almacenamiento de datos
que no sea el estático y no proporciona mecanismos de entrada
ni salida. Ello permite que el lenguaje sea reducido y los
compiladores de fácil implementación en distintos sistemas. Por contra, estas carencias se
compensan mediante la inclusión de funciones de librería para realizar todas estas tareas, que
normalmente dependen del sistema operativo.
En C#, un operador es un elemento de programa que se aplica a uno o varios operandos en una
expresión o instrucción. Los operadores que requieren un operando, como el operador de
incremento (++) o new, se conocen como operadores unarios. Los operadores que requieren dos
operandos, como los operadores aritméticos (+,-,*,/) se conocen como operadores binarios. Un
operador, el operador condicional (?:), utiliza tres operandos y es el único operador ternario de
C#.

La instrucción de C# siguiente contiene un solo operador unario y un solo operando. El operador


de incremento, ++, modifica el valor del operando y.
C#
y++;
La instrucción de C# siguiente contiene dos operadores binarios, cada uno con dos operandos. El
operador de asignación, =, tiene la variable de tipo entero (y), la expresión 2 + 3 como
operandos. La expresión 2 + 3 en sí se compone del operador de suma y dos operandos, 2 y 3.
C#
y = 2 + 3;
Un operando puede ser una expresión válida de cualquier tamaño y puede estar compuesto por
una cantidad cualquiera de otras expresiones. En una expresión que contiene varios operadores,
el orden de aplicación de estos viene determinado por la prioridad de operador, la asociatividad y
los paréntesis.

Cada operador tiene una prioridad definida. En una expresión que contiene varios operadores
con distintos niveles de prioridad, la prioridad de los operadores determina el orden en que estos
se evalúan. Por ejemplo, la instrucción siguiente asigna 3 a n1.
n1 = 11 - 2 * 4;
La multiplicación se ejecuta en primer lugar porque tiene prioridad sobre la resta.
La tabla siguiente separa los operadores en categorías basadas en el tipo de operación que
realizan. Las categorías se muestran en orden de prioridad.

12
Operadores principales
Expresión Descripción
x.y Acceso a miembros
f(x) Invocación de método y delegado
a[x] Acceso a matriz e indizador
x++ Incremento postfijo
x-- Decremento postfijo
new T(...) Creación de objeto y delegado
new T(...){...} Creación de objetos con inicializador.
new {...} Inicializador de objeto anónimo
new T[...] Creación de matrices
typeof(T) Obtener el objeto System.Type para T
checked(x) Evaluar expresión en contexto comprobado
unchecked(x) Evaluar expresión en contexto no comprobado
default (T) Obtener valor predeterminado de tipo T
delegate {} Función anónima (método anónimo)

Operadores unarios
Expresión Descripción
+x Identidad
-x Negación
!x Negación lógica
~x Negación bit a bit
++x Incremento prefijo
--x Decremento prefijo
(T)x Convertir explícitamente x al tipo T
Operadores de multiplicación
Expresión Descripción
* Multiplicación
/ División
% Resto

Operadores aditivos
Expresión Descripción
x+y Suma, concatenación de cadenas, combinación de delegados
x-y Resta, eliminación de delegados
Operadores de desplazamiento
Expresión Descripción
x << y Desplazamiento a la izquierda
x >> y Desplazamiento a la derecha
Operadores relacionales y de tipo
Expresión Descripción
x<y Menor que
x>y Mayor que
x <= y Menor o igual que
x >= y Mayor o igual que
x is T Devuelve true si x es T, de lo contrario devuelve false
x as T Devuelve x escrito como T, o null si x no es T

13
Operadores de igualdad
Expresión Descripción
x == y Igual
x != y No igual
Operadores lógicos, condicionales y null
Categoría Expresión Descripción
AND lógico x&y AND bit a bit entero, AND lógico booleano
XOR lógico x^y XOR bit a bit entero, XOR lógico booleano
OR lógico x|y OR bit a bit entero, OR lógico booleano
AND condicional x && y Sólo evalúa y si x es true
OR condicional x || y Sólo evalúa y si x es false
Uso combinado de x ?? y Se evalúa como y si x es null, de lo contrario se evalúa
Null como x
Condicional x ?: y : z Se evalúa como y si x es true, como z si x es false

Operadores de asignación y anónimos


Expresión Descripción
= Asignación
x op= y Asignación compuesta. Admite estos operadores: +=, -
=, *=, /=, %=, &=, |=, !=, <<=, >>=
(T x) => y Función anónima (expresión lambda)
Cuando dos o más operadores con la misma prioridad están presentes en una expresión, se
evalúan según su asociatividad. Los operadores que son asociativos por la izquierda se evalúan
en orden de izquierda a derecha. Por ejemplo, x * y / z se evalúa como (x * y) / z. Los operadores
que son asociativos por la derecha se evalúan en orden de derecha a izquierda. Por ejemplo, el
operador de asignación es asociativo por la derecha. De lo contrario, produciría un error.
C#
int a, b, c;
c = 1;
// Las siguientes dos líneas son equivalentes.
a = b = c;
a = (b = c);
// La siguiente línea, obliga asociatividad por la izquierda, produce un error.
//(a = b) = c;

Los operadores de asignación y el operador ternario (?:) son asociativos por la derecha. Todos los
demás operadores binarios son asociativos por la izquierda.
Independientemente de que los operadores de una expresión sean asociativos por la izquierda o
por la derecha, los operandos de cada expresión se evalúan primero, de izquierda a derecha. Los
siguientes ejemplos muestran el orden de evaluación de los operadores y los operandos.
Instrucción Orden de evaluación
a = b a, b, =
a = b + c a, b, c, +, =
a = b + c * d a, b, c, d, *, +, =
a = b * c + d a, b, c, *, d, +, =
a = b - c + d a, b, c, -, d, +, =
a += b -= c a, b, c, -=, +=

14
Puede cambiar el orden impuesto por la prioridad de los operadores y la asociatividad mediante el
uso de paréntesis. Por ejemplo, 2 + 3 * 2 se evalúa como 8, porque los operadores de
multiplicación tienen prioridad sobre los operadores de adición. Sin embargo, si escribe la
expresión como (2 + 3) * 2, la adición se evalúa antes de la multiplicación, y el resultado es 10. Los
siguientes ejemplos muestran el orden de evaluación en las expresiones entre paréntesis. Como
en ejemplos anteriores, se evalúan los operandos antes de aplicar el operador.
Instrucción Orden de evaluación
a = (b + c) * d a, b, c, +, d, *, =
a = b - (c + d) a, b, c, d, +, -, =
a = (b + c) * (d - e) a, b, c, +, d, e, -, *, =

Diagrama de flujo de algoritmos


procedimentales
El diseño procedimental, el cual es la especificación mediante
herramientas de programación (algoritmos, diagramas de
flujo, diagramas) del funcionamiento interno de cada uno de
los módulos que compone el sistema. Ya que sabemos que
hacer en el diseño procedimental, debemos ver de forma muy
general las funciones que debe incorporar cada tipo de
modulo. En los algoritmos que se presentaran no se hace uso
de lenguaje algorítmico, están elaborados de forma simple con lenguaje común con la idea de que
sean fácilmente entendibles.

Planteamiento
Este es el módulo de captura de datos, a través de este ingresamos a la base de datos la
información que el sistema administrara, lo principal prioridad de este módulo será evitar el ingreso
de información duplicada o errónea.
Antes de comenzar a diseñar este módulo debemos
establecer la forma en cómo se ingresara el campo llave,
principalmente podemos tener dos escenarios en este
caso:
 El usuario ingresara el valor del campo llave
 El sistema generara el valor de este campo, esto
ocurre principalmente si el valor de este campo se
da como un numero secuencial.
Así que el algoritmo básico de este módulo, para el primer escenario seria:
 Inicio
 Solicitar el valor del campo llave
 Verificar que dicho valor no este registrado.
 Si está registrado entonces
 mostrar aviso de error
 sino
 solicitar y validar los demás valores de los campos
 Almacenar campo llave y demás valores en la base de datos

15
 verificar el correcto almacenamiento
 si se almaceno entonces
 Mostrar aviso de almacenamiento exitoso
 sino
 mostrar aviso de error
 fin-si
 fin-si
 fin

Para el segundo escenario seria:


 Inicio
 Buscar el valor máximo del campo llave en la base de datos.
 El campo llave se obtiene agregando uno al valor máximo
encontrado
 solicitar y validar los demás valores de los campos
 Almacenar campo llave y demás valores en la base de datos
 verificar el correcto almacenamiento
 si se almaceno correctamente entonces
 Mostrar aviso de almacenamiento exitoso
 sino
 mostrar aviso de error
 fin-si
 fin

16
UNIDAD DIDÁCTICA II:
APLICACIÓN DE ALGORITMOS PROCEDIMENTALES

Lenguaje C++.
El lenguaje C fue desarrollado por Dennis Ritchie en los
Laboratorios Bell en 1972 e implementado sobre un DEC PDP-11
utilizando el sistema operativo UNIX. La idea inicial era crear un
lenguaje de propósito general que facilitara la programación y la
realización de muchas de las tareas anteriormente reservadas al lenguaje ensamblador. En 1980
el Dr. Bjarne Stroustrup de los laboratorios ATT Bell comienza el desarrollo del denominado en
aquella época “C con clases” , apareciendo en 1986 como resultado de dicho trabajo el lenguaje
de programación C++ que surge como acoplamiento al C de muchas de las características de la
denominada POO (programación orientada a objetos). C++ es un lenguaje muy potente, flexible y
eficaz frente al resto de los lenguajes orientados a objetos, características que han hecho que se
le considere como lenguaje estándar dentro de la programación orientada a objetos. El lenguaje
C ha sido utilizado para el desarrollo de infinidad de herramientas de trabajo (sistemas operativos,
compiladores, procesadores de texto, bases de datos, etc). El C se caracteriza por no tener
ninguna connotación sectorial; dicho de otra forma es un lenguaje de propósito general. La ventaja
más destacable es la transportabilidad o portabilidad, es decir, la posibilidad de utilizarlo tanto en
macro computadoras como en mini y micro computadoras.

Ventajas del lenguaje C:


Es un lenguaje muy flexible
Muy apropiado para controlar rutinas hechas en ensamblador
Permite general programas de fácil modificación
Lenguaje predominante bajo cualquier máquina UNIX
Muy veloz y potente, lo que permite un software efectivo
Posibilita una programación estructurada o modular
Produce programas de código compacto y eficiente
Características de Alto nivel que conserva características de bajo nivel, por lo que se puede
clasificar como lenguaje de bajo-medio nivel.
Es un lenguaje compilado
El código fuente se escribe mayoritariamente en minúsculas

Algunas desventajas:
No dispone de editor propio
Se requiere más tiempo en conseguir el ejecutable, porque cada vez compila todo el fichero.
La modularidad en C tiende a incrementar el tiempo de compilación
Poco legible y eminentemente críptico
Algoritmo, codificación ejecución en C++.
En C los comentarios empiezan por los caracteres /* y terminan con los caracteres */. Pueden
comprender varias líneas y estar distribuidos de cualquier forma, pero todo aquello que está entre
el /* (inicio del comentario) y el */ (fin del comentario) es simplemente ignorado por el compilador.

Nuestro primer programa: Programa hola.cc

17
# include <iostream >
using namespace std ;
int main () {
cout << " Hola mundo !" << endl ;
}
El comando cout sirve para escribir cosas por pantalla. Programa calculos1.cc
# include <iostream >
using namespace std ;
int main () {
cout << " Unos calculos :" << endl ;
cout << " 2+8*(3+1)= ";
cout << " 2+8*" << 3+1 << "=";
cout << "2+" << 8*(3+1) << "=";
cout << 2+8*(3+1) << endl;
}
Todas las instrucciones de nuestros programas acaban con un punto-y-coma (;). Podemos escribir
varias cosas usando un único cout, siempre que las separemos convenientemente por símbolos.
Podemos escribir cadenas de texto (también llamadas strings) rodeadas por comillas (), que
aparecen en pantalla de modo literal; expresiones, como 8*(3+1), que se calculan antes de
aparecer por pantalla; y endl, que quiere decir salto-de-línea
.

# include <iostream >


using namespace std ;
int main () {
int x =317;
cout << "El numero ’x’ es " << x << "." << endl ;
cout << "Su cuadrado y su cubo son " << x*x << " y "
<< x*x*x << " respectivamente." << endl ;
cout << "El polinomio 25x ^3+12 x^2-8 x+2 evaluado a ’x’ da "
<< 25* x*x*x+12* x*x -8* x+2 << endl;
}

Podemos romper líneas y añadir espacios en nuestro programa para que resulte más sencillo de
leer, siempre que indiquemos el final de las instrucciones con el símbolo ;. Los espacios sí importan
dentro de las cadenas de texto, como por ejemplo en "i”. En este programa, x es una variable. Una
variable es un trozo de memoria donde el ordenador almacena datos. La línea (int x=317;) pide
que se reserve un trozo de memoria, llamado a partir de ahora x, con suficiente capacidad para
almacenar números enteros (int, del inglés integer ), y que contiene inicialmente el número 317.
De este punto en adelante, siempre que en el programa aparezca x, se consulta el trozo de
memoria correspondiente para saber qué entero contiene x.
# include <iostream >
using namespace std ;
int main () {
cout << " Elige un numero ’n ’." << endl ;
int n=74;
cout << " [ elijo el " << n << "]" << endl;
cout << " Dóblalo ." << endl ;
n=2* n;
cout << " [me da " << n << "]" << endl;
cout << " Súmale 6." << endl;

18
n=n+6;
cout << " [ obtengo " << n << "]" << endl ;
cout << " Divídelo entre 2 y réstale 3." << endl ;
n=n/2 -3;
cout << " [ sorpresa ! obtengo el numero inicial , " << n << "]." << endl;
}
La primera vez que aparece una variable, como n en el programa anterior, es necesario declararla,
como se hace en la línea int n=74;. Declarar una variable quiere decir elegir cuál es su tipo (en
este caso, int, o sea, entero) y darle nombre, para poder hacer referencia a ella más adelante. El
valor almacenado en el trozo de memoria de una variable puede cambiar durante la ejecución del
programa. Al principio la variable n vale 74, pero después vale 2 multiplicado por aquello que valía
n (o sea, 2·74 = 148), después vale 6 más aquello que valía n (6+148 =154), y por ´ultimo la mitad
de n menos 3 (154/2 − 3 = 74).

# include <iostream >


# include <string >
using namespace std ;
int main () {
cout << "Hola , cómo te llamas ?" << endl;
string nombre ;
cin >> nombre ;
cout << "Hola , " << nombre << ". Cuando naciste ?" << endl;
int nac ;
cin >> nac ;
cout << "Si estamos en el 2007 , tu edad es " << 2013 - nac -1
<< " o " << 2013 - nac << "." << endl;
}

Tenemos dos variables, nombre y nac. Las variables de tipo string guardan cadenas de texto.
Fijaos que al principio de todo hemos añadido una nueva línea, #include <string>. Siempre que
utilicemos variables de tipo string es conveniente añadir esta línea. El #include <iostream> sirve
para indicar que queremos usar, entre otras cosas, el cout o el cin (en nuestro caso, siempre los
usaremos). La línea using namespace std; también debe escribirse siempre.
En el ejemplo se definen las variables sin inicializarlas a ningún valor, porque se leerán a
continuación con cin. El comando cin funciona de modo parecido a cout, excepto que utilizamos
>> en vez de << ya que cin pone datos en una variable, en vez de sacarlos.
Por lo tanto, cout << espera recibir valores para mostrarlos (por ejemplo, 2013-nac-1, mientras que
cin >> espera recibir variables donde guardar los datos leídos.
# include <iostream >
using namespace std ;
int main () {
cout << " Suma de series aritméticas "
<< " a_0 +a_1 +...+ a_k , on a_i =a+i*c." << endl;
cout << "Da los valores de:" << endl;
cout << "a? ";
double a;
cin >> a;
cout << "c? ";

19
double c;
cin >> c;
cout << "k? ";
int k;
cin >> k;
double resultado =a+(a+k*c); // primero + ultimo
resultado = resultado *(k +1)/2; //(k +1) sumandos
cout << " Resultado : " << resultado << endl;
}

El tipo doublé sirve para almacenar números reales1. Se pueden hacer cálculos mezclando int y
doublé. Por ejemplo, k es un int, pero c es un doublé, de modo que la expresión k*c es como si
fuera de tipo doublé. Todo aquello que venga a continuación de los símbolos // en una línea es
ignorado. De este modo podemos escribir comentarios que ayuden a otras personas (o a nosotros
mismos) a entender el código escrito. Un programa con pocos comentarios es difícil de entender;
un programa con muchos comentarios es pesado de leer.

# include <iostream >


# include <string >
# include <cstdlib >
# include <ctime >
using namespace std ;
int main () {
srand ( time (0));
bool continua = true;
while ( continua ) {
int x= rand () %100+1;
cout << " Adivina el número (1 -100) que estoy pensando ." << endl;
int num =-1;
int intentos =0;
while ( num !=x) {
cout << "Di:";
cin >> num ;
++ intentos ;
if (num >x) cout << " Demasiado grande !" << endl;
else if (num <x) cout << " Demasiado pequeño !" << endl;
else cout << " Correcto ! Has tardado " << intentos << " intentos." << endl;
}
string resp="";
while ( resp !="si" and resp !="no") {
cout << endl << " Quieres seguir jugando ? (si/no)" << endl ;
cin >> resp;
}
if ( resp =="no") continua =false ;
}
}

20
Aparecen varios comandos nuevos. El tipo bool es un nuevo tipo de datos,
como int, string o double. Es un tipo muy sencillo: una variable bool sólo puede
almacenar dos valores: el valor false y el valor true. En nuestro ejemplo
usamos la variable continua en la instrucción while (continua) para que se
vayan jugando partidas mientras el usuario quiera continuar. En este juego
necesitamos obtener nombres aleatorios. El comando rand() nos devuelve un
natural aleatorio más grande o igual que 0. El valor máximo que puede
devolver rand() depende del ordenador y del compilador3. La operación % sirve para calcular el
residuo de una división. Por lo tanto, rand() %100+1 quiere decir: genera un número aleatorio;
divídelo por 100 pero quédate con el residuo (un número aleatorio entre 0 y 99); súmale 1. Siempre
que queramos utilizar rand() tenemos que añadir el comando srand(time(0)) al principio del
programa (sirve para inicializar el generador de números aleatorios) e incluir <cstdlib> y <ctime>.
Las otras novedades son que el símbolo 6= se escribe !=, que podemos escribir condiciones
compuestas en los while y en los if, utilizando las palabras and y or, y que ++intentos incrementa
intentos en 1 unidad (es equivalente a escribir intents=intents+1). Finalmente, podemos prescindir
de poner las llaves {} en un if (o en un while) si el bloque de código que queremos ejecutar, caso
de cumplirse la condición, es de una sola instrucción, como ocurre en todos los ifs que aparecen
en el programa. El objetivo es conseguir un programa más compacto y fácil de leer.

// Dibuja la función y = x ^3.


# include <iostream >
using namespace std ;
int main () {
double xmin =-1, xmax =1;
double ymin =-1, ymax =1;
int xres =40, yres =20;
char c=’X’;
for (int iy =0; iy <yres ;++ iy) {
for (int ix =0; ix < xres ;++ ix) {
double x=xmin+ix *(xmax -xmin )/( xres -1);
double y=ymax -iy *(ymax -ymin )/( yres -1);
if (y>x*x*x) cout << ’ ’; else cout << c;
}
cout << endl;
}
}

En este programa aparece la instrucción for Es costumbre utilizar el for cuando queremos un while
que itere por un cierto rango de números. Por ejemplo, si quisiéramos repetir un código 10 veces,
podríamos escribir for(int i=0;i<10;++i) {...}, y el código de dentro de las llaves se ejecutaría una
vez por cada posible valor de i, desde 0 hasta 9. Aquí aparece un nuevo tipo de datos, char, que
sirve para almacenar caracteres. La diferencia entre char y string es que un char siempre contiene
una única letra o símbolo, mientras que un string contiene una secuencia de 0, 1 o más caracteres.
Para distinguir entre ellos escribimos los strings con los símbolos, y los caracteres con los símbolos
’’.Como se puede ver en este ejemplo, es conveniente poner los números importantes de un
programa en variables declaradas al inicio.

21
De este modo no es necesario rebuscar dentro el código si nunca queremos cambiar estos valores
(por ejemplo, la parte de la función que queremos dibujar —el recuadro definido por (−1,−1) y (1,
1), o la resolución del dibujo—40 caracteres de ancho por 20 caracteres de alto).
En cuanto a los nombres de las variables, una buena regla es utilizar los nombres más cortos que
dejen claro el significado. Por ejemplo, las variables i, j, tal y como ocurre en matemáticas, se
suelen usar para índices; está claro, pues, que ix, iy son dos índices para recorrer las posiciones
(x, y) del dibujo. Pensad, sin embargo, que aquí estamos escribiendo programas cortos –en
general, los programas largos y complejos tienen muchas variables, y se hace necesario usar
nombres más descriptivos.

Los objetos en C++.


La Programación Orientada a Objetos (POO) permite realizar grandes programas mediante la
unión de elementos más simples, que pueden ser diseñados y
comprobados de manera independiente del programa que va a usarlos.
Muchos de estos elementos podrán ser reutilizados en otros programas.
A estas “piezas”, “módulos” o "componentes", que interactúan entre sí
cuando se ejecuta un programa, se les denomina objetos. Estos objetos
contienen tanto datos como las funciones que actúan sobre esos datos.
De ordinario, cada uno de estos objetos corresponde a algún elemento que debe utilizar el
programa. Algunos de estos elementos representan entidades del mundo real (matrices, personas,
cuentas de banco, elementos mecánicos o eléctricos, ...) y otros pueden ser componentes de la
computadora (tanto de software como de hardware: otro programa, un fichero de disco, una
impresora conectada en una puerta serie, una ventana abierta en la pantalla, ...). También pueden
ser estructuras de datos: colas, pilas.

Durante la ejecución del programa, los objetos interactúan


pasándose mensajes y respuestas.
Es fundamental darse cuenta de que un objeto no necesita
conocer el funcionamiento interno de los demás objetos para
poder interactuar con ellos (igual que el hombre no necesita
conocer cómo funciona por dentro un televisor o una
computadora para poder utilizarlos), sino que le es suficiente
con saber la forma en que debe enviarle sus mensajes y cómo
va a recibir la respuesta.
La definición genérica de estos objetos análogos se realizar mediante la clase. Así, una clase
contiene una completa y detallada descripción de la información y las funciones que contendrá
cada objeto de esa clase. Las clases de C++ se pueden ver como una generalización de las
estructuras de C. Por ejemplo, en el siguiente código:
struct Alumno {
long nmat;
char nombre[41];
};
Alumno alu1={76986, "Luis Perez"}, alu2 = { 67549, "Mikel Lasa"};
Se definen las variables miembro que va a tener la estructura Alumno y luego se crean dos
variables alu1 y alu2 de esa estructura.

22
En C++ los objetos son las variables concretas que se crean de una determinada clase. A veces
se llaman también instances o data objects. Las clases de C++ son como una generalización de
las estructuras de C. En C++ las clases son verdaderos tipos de datos definidos por el usuario y
pueden ser utilizados de igual manera que los tipos de datos propios del C++, tales como int o
float. Los objetos son a las clases como las variables a los tipos de variables. Un objeto tiene su
propio conjunto de datos o variables miembro, aunque no de funciones, que aunque se aplican a
un objeto concreto son propias de la clase a la que pertenece el objeto.

Ciclo de vida de los objetos en C++


En los lenguajes orientados a objetos existe un mecanismo especial para inicializar los objetos.
Son subrutinas denominadas constructores. Se ejecutan automáticamente a tiempo de
elaboración del objeto. No reservan espacio, sólo lo
inicializan. En algunos lenguajes es necesario contar con un
sistema similar para finalizar los objetos. Son subrutinas
denominadas destructores. Se ejecutan automáticamente a
tiempo de finalización del objeto. Generalmente sirven para
liberar espacio.En el lenguaje C++, los objetos que se crean
con new se han de eliminar con delete. new reserva
espacio en memoria para el objeto y delete libera dicha
memoria. Crear objetos dinámicamente en un espacio de
memoria llamado montículo (heap). En este enfoque no se
sabe hasta el momento de la ejecución cuántos objetos se
necesitan, cuál será su ciclo de vida, o su tipo exacto. Estas decisiones se toman de improviso
mientras el programa está en ejecución. Si necesita un nuevo objeto, simplemente créelo en el
montículo cuando lo necesite, usando la palabra reservada new. Cuando ya no necesite ese
espacio de almacenamiento, debe liberarlo usando la palabra reservada delete
.

int main() {
char *c;
int *i = NULL;
float **f;
int n; // Cadena de 122 más el nulo:
c = new char[123]; // Array de 10 punteros a float:
f = new float *[10]; (1)
// Cada elemento del array es un array de 10 float
for(n = 0; n < 10; n++) f[n] = new float[10]; (2)
// f es un array de 10*10
f[0][0] = 10.32;
f[9][9] = 21.39;
c[0] = 'a';
c[1] = 0;
// liberar memoria dinámica
for(n = 0; n < 10; n++) delete[] f[n];
delete[] f;
delete[] c;
delete i;
return 0;
}

23
UNIDAD DIDÁCTICA IV: DISEÑO DE
APLICACIONES

DISEÑO DE CLASES PARA ABSTRAER OBJETOS.


La primera palabra que aparece es lógicamente class que sirve para definir una clase y para
declarar objetos de esa clase.
class <identificador de clase> [<:lista de clases base>] {
<lista de miembros>
} [<lista de identificadores de objetos>];

La lista de miembros será en general una lista de funciones y


datos. Los datos se declaran del mismo modo en que lo
hacíamos hasta ahora, salvo que no pueden ser inicializados,
recuerda que estamos hablando de declaraciones de clases y
no de definiciones de objetos. Las funciones pueden ser
simplemente declaraciones de prototipos, que se deben definir
aparte de la clase pueden ser también definiciones. Cuando se
definen fuera de la clase se debe usar el operador de ámbito
"::".

Lo veremos mucho mejor con un ejemplo.


#include <iostream>
using namespace std;
class pareja {
private:
// Datos miembro de la clase "pareja"
int a, b;
public: // Funciones miembro de la clase "pareja"
void Lee(int &a2, int &b2);
void Guarda(int a2, int b2) {
a = a2;
b = b2;
}
};
void pareja::Lee(int &a2, int &b2) {
a2 = a;
b2 = b;
}
int main() {
pareja par1;
int x, y;
par1.Guarda(12, 32);
par1.Lee(x, y);
cout << "Valor de par1.a: " << x << endl;
cout << "Valor de par1.b: " << y << endl;
return 0;
}

24
Nuestra clase "pareja" tiene dos miembros de tipo de datos: a y b, y dos funciones, una para leer
esos valores y otra para modificarlos. En el caso de la función "Lee" la hemos declarado en el
interior de la clase y definido fuera, observa que en el exterior de la declaración de la clase tenemos
que usar la expresión:
void pareja::Lee(int &a2, int &b2)
Para que quede claro que nos referimos a la función "Lee" de la clase "pareja". Ten en cuenta que
pueden existir otras clases que tengan
funciones con el mismo nombre, y también
que si no especificamos que estamos
definiendo una función de la clase "pareja",
en realidad estaremos definiendo una
función corriente. En el caso de la función
"Guarda" la hemos definido en el interior de
la propia clase. Esto lo haremos sólo cuando
la definición sea muy simple, ya que dificulta
la lectura y comprensión del programa.
Además, las funciones definidas de este
modo serán tratadas como inline, y esto sólo es recomendable para funciones cortas, en estas
funciones se inserta el código cada vez que son llamadas.

Especificadores de acceso
Dentro de la lista de miembros, cada miembro puede tener diferentes niveles de acceso.
En nuestro ejemplo hemos usado dos de esos niveles, el privado y el público, aunque hay más.
class <identificador de clase> {
public:
<lista de miembros>
private:
<lista de miembros>
protected:
<lista de miembros>
};

Acceso privado, prívate.- Los miembros privados de una clase sólo son accesibles por los
propios miembros de la clase y en general por objetos de la misma clase, pero no desde funciones
externas o desde funciones de clases derivadas.
Acceso público, public.- Cualquier miembro público de una
clase es accesible desde cualquier parte donde sea accesible
el propio objeto.
Acceso protegido, protected.- Con respecto a las funciones
externas, es equivalente al acceso privado, pero con respecto
a las clases derivadas se comporta como público. Cada una de
éstas palabras, seguidas de ":", da comienzo a una sección,
que terminará cuando se inicie la sección siguiente o cuando termine la declaración de la clase.
Es posible tener varias secciones de cada tipo dentro de una clase. Si no se especifica nada, por
defecto, los miembros de una clase son privados.

25
Tipos de datos, Tipo primitivo, Clase String.
Los tipos de datos en C++ se clasifican en primitivos y derivados.
Los tipos de datos primitivos son los que están definidos dentro del lenguaje.
Los tipos de datos derivados se forman a partir de los tipos primitivos.
Los tipos de datos primitivos en C++ son: numéricos enteros, numéricos reales, tipo lógico y tipo
carácter ampliado.
Tipos de datos C++ numéricos enteros
El tipo de dato numérico entero es un subconjunto finito de los números enteros del mundo real.
Pueden ser positivos o negativos.
En C++ los tipos de datos numéricos enteros son los siguientes:
Número de bytes
Tipo de Dato Descripción Rango
típico
short Entero corto 2 -32768 a 32767
int Entero 4 -2147483648 a +2147483647
long Entero largo 4 -2147483648 a +2147483647
char Carácter 1 -128 a 127

Con los tipos enteros pueden utilizarse los calificadores signed y unsigned. Estos calificadores
indican si el número tiene signo o no. Si se usan solos, sin indicar el tipo de dato se asume int.
Por ejemplo, las siguientes declaraciones son equivalentes:
unsigned int x; equivale a: unsigned x;
Usando estos calificadores podemos tener los siguientes tipos enteros:
Número de
Tipo de Dato Descripción Rango
bytes típico
signed short Entero corto 2 -32768 a 32767
unsigned short Entero corto sin signo 2 0 a 65535
signed int Entero 4 -2147483648 a +2147483647
unsigned int Entero sin signo 4 0 a 4294967295
signed long Entero largo 4 -2147483648 a +2147483647
unsigned long Entero largo sin signo 4 0 a 4294967295
signed char Carácter 1 -128 a 127
unsigned char Carácter sin signo 1 0 a 255

Podemos ver que los datos enteros de tipo signed son equivalentes a los enteros sin utilizar el
calificador:
signed int a; es equivalente a escribir int a;
Tipos de datos numéricos reales
El tipo de dato numérico real es un subconjunto finito de los números reales. Pueden ser positivos
o negativos.

26
En C++ los tipos de datos numéricos reales son los siguientes:
Tipo de Número de
Descripción Rango
Dato bytes típico
Real (Número en coma Positivos: 3.4E-38 a 3.4E38
float 4
flotante) Negativos: -3.4E-38 a -3.4E38
Real doble(Número en
Positivos: 1.7E-308 a 1.7E308
double coma flotante de doble 8
Negativos: -1.7E-308 a -1.7E308
precisión)
Positivos: 3.4E-4932 a 1.1E4932
long
Real doble largo 10 Negativos: -3.4E-4932 a -1.1E4932
double
Tipo lógico
Los datos de este tipo sólo pueden contener dos valores: true ó false (verdadero ó falso).
Si se muestran como enteros, el valor true toma el valor 1 y false el valor 0.
Tipo de Número de
Descripción Rango
Dato bytes típico
bool Dato de tipo lógico 1 0, 1
Tipo carácter extendido
Este tipo se utiliza para representar caracteres UNICODE. Utiliza 2 bytes a diferencia del tipo char
que solo utiliza 1.
Tipo de Número de
Descripción Rango
Dato bytes típico
wchar_t Carácter Unicode 2 0 a 65535

TIPOS DE DATOS DERIVADOS


Ninguno de los tipos de datos base proporcionar u para almacenar más de 1 valor [Eg: int, char,
float etc.] una matriz no es nada, pero una forma extendida del tipo de base de datos, artículos del
tipo de base de datos de N de la tenencia. Así, debido a esto, la matriz se denomina el tipo de
datos derivados. Dicho en otras palabras: C++ permite al usuario construir otros tipos a partir de
los básicos. De estos "nuevos" tipos, los de nivel de abstracción más alto son las clases,
incluyendo sus formas particulares (estructuras y uniones); también pueden crearse campos de
bits; matrices y una familia de tipos muy importante: los punteros. Hay punteros a cada uno de
los demás tipos: a carácter, a entero, a estructura, a función, a puntero, etc.
Los tipos derivados se construyen con palabras clave: class, struct, unión u operadores especiales
como los siguientes:
* puntero a
*const puntero constante a
& referencia a
[] array[1] de
() retorno de función

Ejemplos: suponiendo que tipoX un tipo básico o variante, pueden declararse tipos derivados tal
como se muestra:
tipoX t; // t es un objeto de tipo tipoX
tipoX arr[10]; // arr es una matriz de diez elementos tipoX

27
tipoX *ptr; // ptr es un puntero a tipoX
tipoX &ref=t; // ref es una referencia a tipoX
tipoX func(void); // func devuelve un valor tipoX (no acepta parámetros)
void func(tipoX t); // func1 acepta un parámetro t tipoX (no devuelve nada)
struct st {tipoX t1; tipoX t2}; // la estructura st alberga dos tipoX
Nota: Las expresiones: tipo& var, tipo &var y tipo & var son equivalentes.
Una clase String.- Se muestra el esquema de una clase String pensada para manejar matrices
de caracteres, que también puede manejar matrices C. Se desea dotarla de un álgebra capaz de
realizar las siguientes operaciones:

String s1 = "Matriz-C"; // L1: creación desde matriz-C


String s1 = 'X'; // L2: cración desde carácter
String s1; // L3: Strin vacío de tamaño inicial por defecto
String s1(size); // L4: String vacío de tamaño inicial determinado
String s1 = s2; // L5: constructor-copia
s1 = s2; // L6: asignación
s1 = 'X'; // L7: asignar carácter
s1 = "AEIOU"; // L8: asignar matriz-C
s1 = s2 + s3; // L9: suma
s1 = s2 + "AEIOU"; // L10: suma con matriz-C
s1 = s2 + 'X'; // L11: suma con carácter
char c = s2[n]; // L12: obtener elemento enésimo
s1 = s2.substr(m,n); // L13: obtener substring
s1 == s2 // L14: igualdad
s1 != s2 // L15: desigualdad
s1 < s2 // L16: menor que
s1 <= s2 // L17: menor o igual
s1 > s2 // L18: mayor que
s1 >= s2 // L19: mayor o igual

La clase String almacena los datos en el montón (1.3.2) y para evitar en lo posible los problemas
de fragmentación de memoria, el String será capaz de albergar un cierto número de caracteres
antes de necesitar una reubicación. Cada vez que sea necesaria una nueva asignación, se
duplicará el espacio actual en una secuencia 16, 32, 64, 128, 256, 512, 1024 etc. caracteres. El
tamaño inicial por defecto es de 16 caracteres, aunque este valor puede ser modificado fácilmente.
Para evitar problemas de desbordamiento, también se ha limitado el tamaño máximo superior del
String que puede crearse inicialmente, o que resulte de una composición (operación de suma).

Declaración de atributos, expresiones, asignación.


Los objetos son entidades que tienen un determinado estado, comportamiento (método) e
identidad: El estado está compuesto de datos o informaciones; serán uno o varios atributos a los
que se habrán asignado unos valores concretos (datos). El comportamiento está definido por los
métodos o mensajes a los que sabe responder dicho objeto, es decir, qué operaciones se pueden
realizar con él.

28
La identidad es una propiedad de un objeto que lo diferencia del resto; dicho
con otras palabras, es su identificador (concepto análogo al de identificador de
una variable o una constante). Un objeto contiene toda la información que
permite definirlo e identificarlo frente a otros objetos pertenecientes a otras
clases e incluso frente a objetos de una misma clase, al poder tener valores
bien diferenciados en sus atributos. A su vez, los objetos disponen de
mecanismos de interacción llamados métodos, que favorecen la comunicación
entre ellos. Esta comunicación favorece a su vez el cambio de estado en los
propios objetos. Esta característica lleva a tratarlos como unidades indivisibles,
en las que no se separa el estado y el comportamiento .Los métodos (comportamiento) y atributos
(estado) están estrechamente relacionados por la propiedad de conjunto. Esta propiedad destaca
que una clase requiere de métodos para poder tratar los atributos con los que cuenta. El
programador debe pensar indistintamente en ambos conceptos, sin separar ni darle mayor
importancia a alguno de ellos. Hacerlo podría producir el hábito erróneo de crear clases
contenedoras de información por un lado y clases con métodos que manejen a las primeras por el
otro. De esta manera se estaría realizando una programación estructurada camuflada en un
lenguaje de programación orientado a objetos.

Una expresión es cualquier sentencia del programa que puede ser evaluada y devuelve un valor.
Cuando necesitemos añadir atributos o métodos a una clase definimos una subclase. Los atributos
deben ser siempre privados, y deberemos proporcionar métodos para acceder a ellos desde el
exterior. Todo lo que se pueda hacer con un objeto debe ser un método. Cuando en la declaración
de una clase ponemos atributos (datos) estáticos, queremos indicar que ese atributo es compartido
por todos los objetos de la clase. Para declararlo estático sólo hay que escribir la palabra static
antes de su declaración:
class empleado {
...
static long num_total_empleados;
...
};

Con esto conseguimos que el atributo tenga características de variable global para los miembros
de la clase, pero que permanezca en el ámbito de la misma. Hay que tener presente que los
atributos estáticos ocupan memoria aunque no declaremos ningún objeto.
Si un atributo se declara público para acceder a él desde el exterior de la clase debemos
identificarlo con el operador de campo:
empleado::num_total_empleados = 1000;
El acceso desde los miembros de la clase es igual que siempre. Los atributos estáticos se deben
definir fuera del ámbito de la clase, aunque al hacerlo no se debe poner la palabra static (podrían
producirse conflictos con el empleo de static para variables y funciones globales). Si no se
inicializan en su definición toman valor 0:
long empleado::num_total_empleados; // definición, toma valor 0
El uso de atributos estáticos es más recomendable que el de las variables globales.

29
Métodos, declaración de variable para paso de parámetros
La POO difiere de la programación estructurada tradicional, en la que los datos y los
procedimientos están separados y sin relación, ya que lo único que se busca es el procesamiento
de unos datos de entrada para obtener otros de salida. La programación estructurada anima al
programador a pensar sobre todo en términos de procedimientos o funciones, y en segundo lugar
en las estructuras de datos que esos procedimientos manejan. En la programación estructurada
solo se escriben funciones que procesan datos. Los programadores que emplean Programación
Orientada a Objetos, en cambio, primero definen objetos para luego enviarles mensajes
solicitándoles que realicen sus métodos por sí mismos
Normalmente, las funciones operan sobre ciertos valores pasados a las mismas ya sea como
constantes literales o como variables, aunque se pueden definir funciones que no reciban
parámetros. Existen dos formas en C++ de pasar parámetros a una función; por referencia o por
valor.

El hecho es que si en una declaración de función se declaran parámetros por referencia, a los
mismos no se les podrá pasar valores literales ya que las referencias apuntan a objetos (variables
o funciones) residentes en la memoria; por otro lado, si un parámetro es declarado para ser pasado
por valor, el mismo puede pasarse como una constante literal o como una variable. Los parámetros
pasados por referencia pueden ser alterados por la función que los reciba, mientras que los
parámetros pasados por valor o copia no pueden ser alterados por la función que los recibe, es
decir, la función puede manipular a su antojo al parámetro, pero ningún cambio hecho sobre este
se reflejará en el parámetro original. Existen varios tipos de variables, y cada uno corresponde a
un tamaño máximo de un número, un carácter o incluso una verdad. Cuanto mayor sea el número
que pueda admitir, más espacio en memoria ocupará.

bool Por lo general utiliza 1 byte de memoria, valores: true o false


char Utiliza generalmente 1 byte de memoria, permite almacenar un carácter,
valores; 256 caracteres
unsigned short int Utiliza generalmente 2 bytes de memoria, valores: de 0 a 65 535
short int Utiliza generalmente 2 bytes de memoria, valores: de -32768 a 32767
unsigned long int Utiliza generalmente 4 bytes de memoria, valores: de 0 a 4 294 967 295.
long int Utiliza generalmente 4 bytes de memoria, valores: de -2 147 483 648 a 2
147 483 647.
int (16 bits) Utiliza generalmente 2 bytes de memoria, valores: de -32 768 a 32 767.
int (32 bits) Utiliza generalmente 4 bytes de memoria, valores: de -2 147 483 648 a 2
147 483 647.
unsigned int (16 bits) Utiliza generalmente 2 bytes de memoria, valores: de 0 a 65 535.
unsigned int (32 bits) Utiliza generalmente 2 bytes de memoria, valores: de 0 a 4 294 967 295.
double Utiliza generalmente 8 bytes de memoria, valores: de 2.2e-308 a 3.4e-38.
float Utiliza generalmente 4 bytes de memoria, valores: de 1.2e-308 a 3.4e-38.
Atención! El tamaño de las variables en memoria puede variar de un PC a otro.

Para declarar una variable, basta con indicar su tipo y su nombre. Existen ciertas convenciones
en cuanto al nombre de las variables. Algunos prefieren separar las partes de un nombre con '_',
otros prefieren escribir una mayúscula para separarlas.
int recetaDelMes;
int receta_del_mes;

30
Lo importante es que utilices siempre la misma convención para tus programas.
Es posible asignar un valor a una variable al momento de declararla:
int recetaDelMes = 12301;
También es posible declarar varias variables en una misma línea, pero en este caso, todas las
variables de la línea tendrán el mismo tipo.

int recetaDelMes = 12301, recetaDelAño = 45644545;


Error al definir un tipo de variable (Enteros con signo)
¿Qué pasa si el tipo que hemos elegido es muy pequeño? Si el número es mayor
al máximo admitido por el tipo, entonces el valor de la variable será el valor
mínimo admitido por este tipo.
unsigned short int numero = 65535;
cout << numero << endl;
numero++;
cout << numero << endl;

Si ejecutamos este código, la segunda línea no escribirá 65536, sino 0.


Esto es idéntico para todos los tipos.
Error al definir un tipo de variable(Enteros sin signo)
Para enteros sin signo, sucede lo mismo, una vez que el tipo alcanza su tamaño máximo, pasa a
su valor mínimo.
short int numero = 32767;
cout << numero << endl;
numero++;
cout << numero << endl;

Si ejecutamos este código, la segunda línea no escribirá 32768, sino -32768.


Normalmente los prototipos de funciones declaran un número fijo de parámetros (que puede ser
ninguno). Para las funciones que pueden aceptar un número variable de parámetros (tales como
printf), el prototipo puede terminar en puntos suspensivos (...). Esta elipsis indica que la función
puede ser invocada con diferentes tipos de argumentos en diferentes ocasiones. Los puntos
pueden colocarse al final de una sub lista de parámetros conocidos.
Por ejemplo:
func(int *count, long total, ...);
Por supuesto esta forma de prototipo reduce la comprobación que puede efectuar el compilador;
los parámetros fijos son comprobados en tiempo de compilación, y los variables son pasados sin
comprobación

31
Trabajo de Investigación
1. Realizar un sistema informático que calcule el promedio de notas de los alumnos del tercer
ciclo en NetBeans.

Fuentes de Información
http://definicion.de/algoritmo/
http://geneura.ugr.es/~gustavo/csharp/
http://arco.esi.uclm.es/~david.villa/pensar_en_C++/vol1/vol1.html
http://html.rincondelvago.com/poo_7.html
http://c.conclase.net/curso/
http://www.zator.com/Cpp/
http://www.uv.es/~sto/cursos/c++/curso95.pdf
http://www.slideshare.net/edgarmunoz/ejercicios-de-programacion-concurrente-9819291
https://netbeans.org/community/releases/60/cpp-setup-instructions_es.html
http://joplin.cienciasbasicas.cl/~hjara/files/docencia/ANEXO_1.pdf
http://modmymobile.com/forums/387-basico/562291-tutorial-qt-basico-netbeans-soporte-c-
c.html
http://www.algoritmia.net/

32

You might also like