Professional Documents
Culture Documents
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++.
2
Índice del Contenido
I. PREFACIO
02
07-16
UNIDAD DIDÁCTICA II: DISEÑO Y EJECUCION DE DIAGRAMAS DE FLUJO
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.
Algoritmos secuenciales.
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
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.
6
UNIDAD DIDÁCTICA II: DISEÑO Y EJECUCIÓN DE
DIAGRAMAS DE FLUJO
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.
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.
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].
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;
}
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#.
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
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, -, *, =
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
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.
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.
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
.
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).
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.
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.
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.
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.
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
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
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:
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).
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á.
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.
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