Resumen C++ (5-9)
Resumen C++ (5-9)
Resumen C++ (5-9)
Introducción
Un lenguaje de programación es un conjunto de reglas que definen cómo se debe
describir la solución a un problema (en nuestro caso el algoritmo), para que esta pueda ser
ejecutada por una máquina.
“La programación es el arte de expresar soluciones a problemas de forma tal que una
computadora pueda ejecutar esas soluciones” Bjarne Stroustrup.
Resolución de Problemas
Estrategia
consiste en dividir o descomponer el problema original en una sucesión de problemas
más simples.
“La estrategia nos define QUÉ hacer”
Algoritmo
En esta etapa se plantea en base a la estrategia, el conjunto de acciones que
permitirán resolver el problema, mediante pseudocódigo, diagrama de flujo, etc.
“El algoritmo define CÓMO hacerlo”
Programa
Un algoritmo codificado empleando un lenguaje de programación interpretable por
una computadora constituye un programa.
El Proceso de Interpretación
Analiza cada instrucción del código fuente y realiza las acciones que la misma
representa.
Depuración de Programas
depuración o “debugging“:proceso por el cual se identifican y eliminan los errores
de un programa.
Lenguajes de Programación
Los algoritmos se convierten en programas al ser codificados empleando lenguajes.
Pero las computadoras procesan los programas de acuerdo al tipo de lenguaje. Se los puede
clasificar en 3 tipos: Lenguajes de Máquina, Lenguajes de Bajo Nivel y Lenguajes de alto Nivel.
Lenguajes de Máquina
Pueden ser resueltas directamente por el procesador de la computadora sin
traducciones.
Una computadora solo puede procesar dos estados de señales eléctricas: encendido
y apagado (código binario, usando ceros y unos).
0110 1001 1010 1011
pueden ser ejecutados directamente sin un proceso de traducción previo lo que da
velocidad del proceso óptima. Pero como desventaja el código es complejo de crear, carece
de legibilidad, es muy complejo de depurar ante la presencia de errores, tiene total
dependencia del tipo de procesador.
Lenguajes de Bajo Nivel
pueden ser interpretados con más facilidad por una persona, pero la codificación
continúa siendo una tarea compleja. El lenguaje típico de bajo nivel es el conocido como
“ensamblador” (Assembler Language) formado por sentencias nemotécnicas para
representar instrucciones propias de un lenguaje de máquina.
ADD X, Y, SUMA
(Lee el valor de “X” e “Y”, y lo suma en “SUMA”)
Elaboración de soluciones grandes es muy engorroso. Además, están muy ligados al
juego de instrucciones de la marca y modelo de cada microprocesador. Se limita al control
de dispositivos electrónicos con programas pequeños y sencillos, o partes de otros
programas de computadoras.
Lenguajes de Alto Nivel
su gran ventaja es la portabilidad: los programas son independientes del hardware.
denominación de alto nivel debido a que su sintaxis es similar a la forma en que las personas
se comunican y dan órdenes, conformados por un conjunto de palabras y símbolos que
tienen una relación directa con su significado: while, if, write, else, class, file, float, string,
etc.
Existen numerosos lenguajes de alto nivel que proporcionan diferentes mecanismos
de abstracción (Basic, Pascal, C, C++, C#, Java, Python, Go, etc.).
Unidad 6
Estructura de un Programa C++
A dentro del “if” es tipo carácter, mientras que fuera de esta es tipo entero. B solo
existe dentro del “if”.
Entrada y Salida
Un flujo de Entrada/Salida o I/O stream es una secuencia de caracteres que se
envían (fluyen) desde o hacia un dispositivo, C++ utiliza cout para enviar caracteres a una
salida; y cin para tomar caracteres. También cerr y clog para manejo de errores.
Los flujos cin, cout, cerr y clog se hallan en el archivo iostream como
#include<iostream>(estos archivos son denominados “librerías”, “cabeceras” o “headers”). En
esta librería todas las definiciones del estandar se agrupan en un “espacio de nombres” que
se llama std (std::cout). using namespace std le indica al compilador que debe buscar los
identificadores que utilizemos dentro de ese espacio de nombres automáticamente.
Caracteres especiales y manipuladores para I/O: permiten lograr una salida más
legible y mejorar la interfaz con el usuario
Operadores
Operadores Aritméticos: permiten efectuar cálculos aritméticos. La jerarquía o
precedencia es idéntica en el álgebra de números.
Estructuras de Control
do-while: Las acciones se ejecutan hasta que la expresión lógica arroje o falso. La
condición se evalúa luego de cada iteración.
Sentencia for: Las acciones se ejecutan repetidamente mientras que la exp2 arroje
verdadero; exp1 hace de expresión de inicialización y exp3 se ejecuta al final del grupo de
acciones en cada iteración.
C++ permite en la sentencia for, a través del operador coma ( , ), realizar más de una
instrucción
Tipos de Funciones/Subprogramas
Se los suele denominar funciones, procedimientos, subprocesos o subrutinas,
dependiendo de si el subprograma retorna o no un resultado.
Funciones en C++
Si un programa C++ contiene varias funciones estas pueden definirse en cualquier
lugar del programa (aún en archivos diferentes) pero en forma independiente una de otra
(no incluir la definición de una función dentro de otra).
Suele existir intercambio de información entre el programa o módulo que llama a la
función (desde ahora “cliente”) y la función misma. El programa puede enviarle información
(entradas) a la función al realizar la llamada, y esta puede a su vez retornar un resultado al
programa cliente.
Cuando una función resultada que se envía al programa cliente la función
“devuelve” o “retorna” un valor. Al evaluarse la expresión que invoca a una función, se
evalúa (ejecuta) la función y el resultado de la misma “reemplaza” a la llamada.
Sobrecarga de Funciones
Dos funciones diferentes pueden tener el mismo nombre si el prototipo varía en sus
parámetros (si tienen distinta cantidad de parámetros y/o diferentes tipos de parámetros).
Obsérvese un caso erróneo de aplicación de sobrecarga en funciones:
Recursividad
Una función es recursiva cuando se invoca a sí misma. Cualquier función C++ puede
incluir en su código una invocación a sí misma, a excepción de main().
Ventaja: Permite en algunos casos resolver elegantemente algoritmos complejos.
Desventaja: Son menos eficientes –en términos de velocidad de ejecución, y que la
cantidad de llamadas recursivas que una función puede realizar se encuentra limitada.
Entonces, para implementar una función recursiva debemos identificar dos cosas:
una definición recursiva o recurrente, que plantee la solución a una versión del problema
en términos de otras; y un caso base al cual arriben tarde o temprano todos los demás casos
y pueda resolverse directamente.
Condiciones para que una función sea recursiva
Toda función recursiva debe.
1. Realizar llamadas a sí misma para efectuar versiones reducidas de la misma
tarea.
2. Incluir uno o más casos donde la función realice su tarea sin emplear una llamada
recursiva, permitiendo detener la secuencia de llamadas (condición de
detención o stop)
Unidad 9
Definición de arreglo
Estructura de datos formada por una secuencia de elementos homogéneos donde
cada elemento tiene una posición relativa dentro de la secuencia.
Arreglos lineales
Tipo de dato denominado vector. Se debe incluir la biblioteca #include<vector>. Los
elementos que contiene un vector pueden ser int, float, char, string, o hasta vector
nuevamente. Todos sus elementos serán de un mismo y único tipo. El tipo de elemento se
debe explicitar al definir el arreglo
En C++ se utilizan posiciones “en base 0”. La primera posición válida es la posición 0
y la ultima es N (tamaño del vector) – 1. Sin embargo, C++ no verifica la validez del Índice,
con lo que, si se pide la posición 300 de un vector, el programa va a buscarlo, y al no
encontrarlo podría continuar sin problema, arrojar cualquier resultado o producir un error
de tiempo de ejecución (incluso después del momento de realizarse el error). C++ podemos
realizar dos operaciones adicionales sobre un arreglo previamente definido:
consultar(x.size()) y modificar su tamaño(x.resize()).
Notar que para los contadores de los ciclos se utiliza el tipo unsigned int (o size_t)
en 1 lugar de int cuando se compara con el .size() del vector. Esto se debe a que un índice
no puede ser negativo.
Inicialización de los elementos: Para inicializar un arreglo en el programa podemos
recorrer cada elemento del mismo y asignar los valores correspondientes, como en
pseudocodigo.
Cuando se requiera inicializar todos los elementos de un vector con un mismo valor
este valor se puede ingresar a continuación de la dimensión, separándolo de esta mediante
una coma.
Al cambiar el tamaño con “resize” se puede agregar también un valor con el cual se
llenarán las nuevas posiciones en el caso de que el nuevo tamaño sea mayor que el anterior.
Existe además una sintaxis alternativa que permite definir e inicializar el arreglo con una
secuencia de valores fija. Tambien se pueden declarar el valor de cada espacio de la
siguiente manera.
Arreglos bi/multi-dimensionales
No existe en C++ una forma sencilla de operar con arreglos multidimensionales
dinámicos. Para resolver este problema, se debe recurrir bibliotecas externas. Una
biblioteca llamada “matriz”. Para operar con matrices (arreglos bi-dimensionales) directiva
#include<Matrix>.
(Diferencia entre una biblioteca estándar y una externa, es la primera forma parte
de cualquier entorno de desarrollo C++, y la segunda debe obtenerse por separado).
se declara de una forma muy similar a la que se utilizó previamente para vectores:
Al utilizar .size() para obtener el tamaño de una matriz, se debe explicitar entre los
paréntesis cuál de estos dos tamaños se desea consultar (0 = filas, 1= columnas):
Arreglos y funciones
Es posible utilizar arreglos como parámetros de funciones o como tipos de retorno.
Sin embargo, dado que engeneral un arreglo contendrá muchos elementos, será
recomendable pasarlos por referencia cuando sean argumentos (para evitar copiar tantos
elementos), y utilizar el calificativo const para prevenir las modificaciones involuntarias.
El tipo struct.
Se requiere organizar múltiples datos en una única estructura, pero admitiendo
diferente naturaleza (tipo). Registros. En C y C++ se denomina. Cada variable (denominada
variable miembro, campo, o atributo) debe declararse individualmente con su propio y
único identificador
Luego de esta definición, “ficha” podrá ser considerado como un nuevo tipo de
datos, y usado para declarar variables de ese tipo, como si fuese un int o un float, por
ejemplo.
Se puede utilizar una lista de inicialización de forma similar a la que se presentó para
arreglos, listando los valores para cada campo en el orden en que fueron declarados en el
struct.
Arreglos y structs
Es posible emplear arreglos como miembros de una composición struct y también
definir un arreglo cuyos elementos sean estructuras: