1. 4.- Bucles.
1.1. 4.1.- while
1.1.1. Si se desea que una sección de un programa se repita mientras se cumpla una cierta condición, se deberá emplear while en lugar de if.
1.2. 4.2.- do-while
1.2.1. Una alternativa a while es comprobar la condición tras dar una primera pasada. Para ello, se emplea la construcción do-while.
1.3. 4.3.- contadores
1.3.1. Se puede usar un while para crear un contador, esto es, una variable que aumenta de un valor a otro para descubrir cuántas veces ha ocurrido algo.
1.4. 4.4.- for
1.4.1. cuando se desa crear un contador, existe otra orden que agrupa los tres pasos (valor inicial, incremento y comprobación de finalización) y que, por ello, puede resultar más ilegible. Se trata de la orden for.
1.5. 4.5.- Incremento y decremento
1.5.1. La operación "incrementar una variable" (numero =numero+1) es tan habitual en programación que algunos lenguajes, como C++, tienen una notación especial para indicarla de forma abreviada (numero ++), como se puede observar en este ejemplo.
1.6. 4.6.- Otras operaciones aritméticas abreviadas
1.6.1. También es frecuente aumentar o disminuir el valor de una variable en varias unidades. Nuevamente, existe una notación abreviada numero = numero+5 como forma alternativa de escribir numero +=5. Esta misma forma compacta existe para el resto de operaciones aritméticas.
1.7. 4.7.- Declarar una variable dentro de for
1.7.1. C++ permite declarar una variable en distintos puntos del programa, no solo al principio. Un lugar especialmente frecuente para ello es el primer bloque de un for, de modo que la variable se destruye automáticamente al terminar el for, con lo que se evita reutilizarla por error.
1.8. 4.8.- Bucles sin fin
1.8.1. En ocasiones, ya sea por error o intencionadamente, se puede provocar que un bucle no tena salida, bien porque se plantee mal la condición de salida, bien porque sea incorrecto el incremento de la variable que lo controla.
1.9. 4.9.- Interrumpir un bucle
1.9.1. Para salir de un bucle antes de tiempo se tiene que emplear la orden break.
1.9.2. La orden continue tiene un comportamiento parecido, pero no abandona por completo el bucle, sino que solo salta la iteración actual.
1.10. 4.10.- Bucles anidados
1.10.1. Los bucles pueden anidar, es decir, incluir uno dentor de otro. De este modo, por ejemplo, es posible escribir las tablas de multiplicar del 1 al 5
2. 5.- Estructuras básicas de datos.
2.1. 5.1. Contacto con los arrays
2.1.1. un array o tabla es un conjunto de elementos del mismo tipo. Estos elementos tendrán todos el mismo nombre y ocuparán un espacio contiguo en la memoria.
2.2. 5.2. un array para almacenar
2.2.1. Es muy habitual emplear un array para guardar datos que debe introducir el usuario y que, posteriormente, deberán ser manipulados.
2.3. 5.3. Arrays y física: vectores
2.3.1. Muchas magnitudes físicas se expresan mediante vectores. Por ejemplo, al analizar una fuerza, no solo es importante cuán intensa es, sino, también , la dirección y el sentido en el que dicha fuerza se aplica.
2.3.2. Estos vectores también se suelen expresar como arrays.
2.4. 5.4. Arrays bidimensionales
2.4.1. Es posible declarar arrays de dos o más dimensiones. Por ejemplo, si se desea medir tiempos en pruebas deportivas y guardar datos en dos grupos de ocho deportistas cada uno, existen dos opciones:
2.4.1.1. Usar "double" tiempos [16] y recordar que los ocho primeros datos corresponden realmente a un grupo de alumnos y los ocho siguientes, a otro grupo.
2.4.1.2. Emplear "double" tiempos [2] [8], de modo que los datos de la forma tiempos [0][i] sean los del primer grupo y los de la forma tiempos [1][i], del segundo.
2.5. 5.5. Arrays y matemáticas: matrices
2.5.1. Los arrays bidimensionales también se emplean para guardar matrices cuando es necesario resolver problemas matemáticos más complejos. Por ejemplo, un programa que pida los datos de dos matrices de 3x3 que muestre su suma.
2.6. 5.6. Valores iniciales de arrays.
2.6.1. No se debe dar por sentado que los datos de un array tengan valor inicial 0, ya que pueden contener "basura" (es decir, lo que hubiera en cada posición de memoria anteriormente), y lo mismo ocurrirá con las variables simples.
2.7. 5.7. Arrays sobredimensionados
2.7.1. En ocasiones, no se sabrá la cantidad de datos que se van a almacenar. Una primera aproximación sencilla puede ser emplear un array de gran tamaño y llevar un contador de la cantidad de datos que realmente contiene.
3. 6.- Ficheros.
3.1. 6.1. Escritura en un fichero de texto
3.1.1. El manejo de ficheros de texto recuerda mucho al de la consola de texto. Para guardar datos, se usa una sintaxis muy parecida a la de cout, pero se vuelcan los datos a dar datos, se usa una sintaxis muy parecida a la de cout, pero se vuelcan los datos a un ofstream que se debe crear inicialmente y cerrar al final.
3.2. 6.2. Lectura de un fichero de texto
3.2.1. A la hora de leer un fichero, los pasos son muy parecidos, excepto por el hecho de que el fichero será un ifstream y la lectura se realizará con >>, similar a cin.
3.3. 6.3. Leer toda una línea, incluyendo espacios
3.3.1. El formato habitual de cin se detiene cuando encuentra el primer espacio. Si se desea leer toda una línea, incluyendo espacios, se puede usar getline (fichero, texto).
3.4. 6.4. Lectura hasta el final del fichero
3.4.1. No obstante, lo más frecuente no será leer solo una frase de un fichero, sino procesar todo su contenido. Para ello, se deberá comprobar si se ha alcanzado su .eof().
3.4.2. Esta será la estructura básica de casi cualquier programa que deba leer un fichero completo, de principio a fin: abrir, procesar todos los datos con while y cerrar. Por ejemplo, se podrían mostrar y numerar así las líneas de un fichero.
3.5. 6.5. Pedir el nombre al usuario
3.5.1. No es necesario que el nombre del fichero esté prefijado en el programa.
3.6. 6.6. Errores en el acceso a ficheros
3.6.1. Para comprobar si ha existido algún error en el acceso al fichero (por ejemplo, si se ha intentado abrir un fichero que no existe), se puede utilizar su .fail(), que será verdadero en caso de que exista algún problema.
3.7. 6.7. contacto con los ficheros binarios
3.7.1. Los ficheros de texto son fáciles de crear y de leer, pero también se pueden manejar ficheros con información de cualquier tipo. A estos archivos se los conoce como "ficheros binarios". Algunas consideraciones a tener en cuenta sobre los mismos son:
3.7.1.1. Acceder a un fichero binario es prácticamente igual de sencillo que acceder a uno de texto; basta añadir, ifstream::binary cuando se abre, así: ifstream fichero(nombre.c_str(), ifstream::binary);.
3.7.1.2. Se puede leer un byte usando .get() así: char dato = fichero.get();
3.7.1.3. Si el dato no está en la siguiente posición del fichero, es posible saltar a cualquier posición con .seekg(posicion,origen), así: fichero.seekg(0,fichero.beg).
4. 1.- Lenguajes, compiladores e intérpretes
4.1. 1.1.- Lenguaje de bajo nivel y de alto nivel.
4.1.1. Un programa consiste en una secuencia de instrucciones para un ordenador.
4.1.2. "el código", es muy diferente a los idiomas humanos. Es difícil de aprender y fácil de cometer errores.
4.1.3. un concepto relacionado con el de programa es el "algoritmo". Se conoce como algoritmo a toda secuencia de pasos necesaria para resolver un problema. Se trata de una expresión que no se utiliza solo en informática, sino también en otras ciencias
4.2. 1.2.- Compiladores e intérpretes.
4.2.1. Las herramientas encargadas de convertir nuestro programa escrito en lenguaje de alto nivel, (programa fuente) a código máquina, a través de lo cual se obtiene un "programa ejecutable"
4.2.2. Un interprete es un tipo de traductor. La diferencia es que en los intérpretes no se crea ningún "programa ejecutable"
4.3. 1.3.- Pseudocódigo.
4.3.1. A pesar de que los lenguajes de alto nivel se asemejan al lenguaje natural que los seres humanos empleamos para hablar, es habitual no usar ningún lenguaje de programación concreto cuando queremos plantear inicialmente los pasos necesarios para resolver un problema.
4.4. 1.4.- Lenguajes más extendidos.
4.4.1. Existen multitud de lenguajes de programación. Muchos de ellos son de propósito general (sirven para crear programas de cualquier tipo), mientras que otros están especialmente diseñados para ciertas tareas.
4.4.1.1. Leguajes de programación
4.4.1.1.1. C, C++, c#, java, JavaScript, PHP, Python.
4.5. 1.5.- Hola, mundo
4.5.1. El primer programa que se suele crear al comenzar a trabajar con un lenguaje de programación consiste en escribir algo en pantalla. Con frecuencia, ese texto que escribe el programa es un saludo al mundo que le rodea, un "Hola, mundo".
4.6. 1.6.- Estructura de un programa en C++
4.6.1. Las siguientes órdenes son las que conforman este primer programa en C++, en la mayoría de las cuales se irá profundizando más adelante:
4.6.1.1. Primer programa de ejemplo en c++
4.6.1.1.1. Es un comentario, por lo que no afecta en absoluto al comportamiento del programa
4.6.1.2. #include <iostream>
4.6.1.2.1. debe aparecer al principio de cualquier programa que escriba algo en pantalla o lea algo desde el teclado (es decir, deberá aparecer en prácticamente todos los programas)
4.6.1.3. int main
4.6.1.3.1. indica que lo que paarece a continuación corresponde al cuerpo del programa. También deberá aparecer prácticamente siempre.
4.6.1.4. { y }
4.6.1.4.1. son las llaves, e indican el principio y el final de un bloque , en ese caso, el principio y el final del cuerpo del programa. Deberán aparecer siempre.
4.6.1.5. std::cout << "hola, mundo";
4.6.1.5.1. es la única orden real que tiene el programa hasta el momento. Su función es la de escribir en pantalla lo que se indica entre comillas dobles.
4.6.1.6. return 0
4.6.1.6.1. Sirve para indicar que el programa ha terminado sin errores.
4.7. 1.7.- Probar un programa en Lliurex
4.7.1. Existen editores de texto preinstalados en el sistema, y también compiladores de algunos de los lenguajes más extendidos.
4.8. 1.8.- Probar un programa en windows
4.8.1. No incluye ningún editor avanzado ni ningún compilador de C++.
4.8.2. Existen desde entornos profesionales (pero menos respetuosos con los estándares) como Visual Studio, que es gratis en su edición Community, hasta entornos más sencillos basados en el compilador GCC de linux, como Code::Blocks, CodeLite o Dev-C++
5. 2.- Un programa que calcula.
5.1. 2.1.- Realizar operaciones prefijadas
5.1.1. Realizar operaciones matemáticas en C++ es fácil: basta con indicar la operación sin encerrarla entre comillas dobles.
5.1.2. Las operaciones de suma, resta multiplicación y división son sencillas. Sin embargo una operación muy habitual es programación , pero que suele resultar más difícil de comprender, es el resto o módulo.
5.2. 2.2.- Escribir varios textos
5.2.1. Es posible escribir varios mensajes con una única orden cout. Para ello, solo es necesario que cada texto se preceda por dos símbolos de "menor que" (<<).
5.3. 2.3.- Escribir en varias líneas
5.3.1. Para que un texto aparezca en una línea y otro, en la línea siguiente será necesario enviar a cout un símbolo especial denominado std::endl (abreviatura de end of linea, "final de linea").
5.4. 2.4.- Pedir datos al usuario.
5.4.1. Los datos son introducidos por el usuario o se lean desde un fichero, una base de datos o una red de ordenadores.
5.4.2. Lo habitual es que un programa emplee varias variables, tanto si se van a solicitar varios datos al usuario como si se van a realizar cálculos intermedios.
5.5. 2.5.- evitar escribir std::
5.5.1. En un programa muy extenso puede resultar engorroso escribir std:: delante de cada cout y de cada cin, por lo que existe una sencilla alternativa: añadir using namespace std; al principio del programa.
5.6. 2.6.- Números con decimales
5.6.1. Cuando se realizan operaciones con número enteros en C++, el resultado tambien es un número entero. Esto resulta desconcertante en el caso de las divisiones, ya que 5/2 te da de resultado 2.
5.7. 2.7.- Funciones matemáticas
5.7.1. Existen muchas funciones matemáticas incorporadas en C++ como por ejemplo:
5.7.1.1. Raíz cuadrada:sqrt (x)
5.7.1.2. x elevado a y: pow (X,y)
5.7.1.3. coseno: cos (x)
5.7.1.4. seno: sin(x)
5.7.1.5. Tangente: tan(x)
5.7.1.6. Exponencial de x (e elevado a x): exp(x)
5.7.1.7. Logaritmo natural (o neperiano) en base e: log(x)
5.7.1.8. logaritmo en base 10: log10(x)
6. 3.- Toma de decisiones.
6.1. 3.1.- if
6.1.1. Para comprobar si se cumple una determinada condición e indicar qué pasos se deben dar en dicho caso, se emplea if (condición) sentencia.
6.2. 3.2.- Operadores relacionales:
6.2.1. <
6.2.1.1. Menor que
6.2.2. >
6.2.2.1. Mayor que
6.2.3. <=
6.2.3.1. Menor o igual que
6.2.4. >=
6.2.4.1. Mayor o igual que
6.2.5. !=
6.2.5.1. No igual a (distinto de)
6.3. 3.3.- El caso contrario: else
6.3.1. También es habitual indicar lo que debe hacer el programa si no se cumple una determinada condición, para lo que se añade la cláusula else:
6.4. 3.4.- Sentencias compuestas
6.4.1. La orden if permite ejecutar una única sentencia en caso de que se cumpla una condición.
6.5. 3.5.- Encadenar condiciones
6.5.1. Las condiciones se pueden encadenar con "y", "o", "no", etc.
6.6. 3.6.- Operador condicional: ?
6.6.1. Existe otra forma de asignar un valor a una variable en función de si se cumple una condición o no.
6.7. 3.7.- swich
6.7.1. Para analizar varios valores posibles de una misma variable, se puede emplear la orden switch.
6.7.2. También se puede indicar qué hacer si no se da ninguno de los casos preestablecidos usando un bloque default opcional.
7. 7. Funciones
7.1. 7.1. Los problemas de un código repetitivo
7.1.1. Es habitual que algunas tareas deban repetirse varias veces en distintos puntos de un programa. en tales casos, volver a teclear varias veces el mosmo fragmento de código no suele ser la solución óptima, ya que:
7.1.1.1. La escritura del programa llevará más tiempo.
7.1.1.2. El código fuente final resultará menos legible.
7.1.1.3. La posibilidad de cometer algún error será más elevada cuando se vuelva a teclear uno de ellos, se olvide incluirla en el resto.
7.1.2. Por ello, conviene evitar que un programa contenga código repetitivo. Una manera de lograrlo es descomponerlo en bloques, los cuales reciben el nombre de "funciones"
7.1.3. El código anterior funciona, pero es muy mejorable. Es posible hacerlo algo más elegante con la creación de un bloque subrayar que dé esos pasos repetitivos, de modo que el cuerpo del programa principal quede de al siguiente manera (en el próximo apartado se estudiarán los detalles.
7.2. 7.2. Una primera función
7.2.1. Crear un bloque con nombre es sencillo. Para ello, habrá que elegir un nombre, precederlo de void y detallar entre llaves los pasos que debe dar dicho bloque.
7.2.2. El termino void, que aparece al principio , indica que no se trata de una función matemática que devuelva un resultado numérico, sino de un "procedimiento" o "subrutina" que realiza ciertos pasos pero no devuelve ningún resultado.
7.3. 7.3. Parámetros de una función
7.3.1. Habitualmente, resultará práctico indicar a la función ciertos datos con los que se desea que esta trabaje. Por ejemplo, es posible mejorar la función subrayar para que no escriba siempre veinte guiones, sino la cantidad exacta que se indique.
7.3.2. Como se puede observar, los parámetros se indican con un formato muy parecido al de la declaración de una variable: primero, el tipo; Luego el nombre e la variable. La diferencia con la declaración de variables es que no hay un putno y coma al final y que si se necesitan varios parámetros, habrá que indicar tanto el tipo de datos como el nombre para todos ellos.
7.4. 7.4. Valor devuelto por una función
7.4.1. Con frecuencia es deseable que una función realice una serie de cálculos y devuelva el resultado de esos cálculos con el fin de poder usarlo desde cualquier parte del programa. Por ejemplo, se puede crear una función para elevar un número al cuadrado.
7.5. 7.5. Modificar el valor de un parámetro
7.5.1. En caso de que se intente modificar el valor de un dato que una función reciba como parámetro, los cambios no se conservan cuando se sale dicha función.