300 likes | 560 Views
Ejemplo de Programa C++. #include <iostream> using namespace std; int main(void) { cout << "Hola"; /* escribe hola en pantalla */ system("pause"); }. Edición, Compilación y Ejecución.
E N D
Ejemplo de Programa C++ #include <iostream> using namespace std; int main(void) { cout << "Hola"; /* escribe hola en pantalla */ system("pause"); }
Edición, Compilación y Ejecución 1. Escribir el programa en un archivo con extensión (.c, .C, .cpp) mediante un editor de textos. Este archivo se denomina código fuente. 2. Compilar el código fuente. Esto es, traducirlo a un lenguaje comprensible por el ordenador. Los archivos resultantes de este proceso se denominan archivos objeto y suelen identificarse mediante la extensión .o u .obj 3. Un programa puede estar repartido entre distintos archivos, cada uno de los cuales se habrá compilado independientemente. Por ello, antes de ejecutar el programa, es necesario unir o ligar los archivos objeto (.o u .obj) que lo componen. Esto se hace con un enlazador (en inglés linker). El resultado final es el programa ejecutable, cuya extensión suele ser .exe
Bibliotecas Las funciones son conjuntos de instrucciones que utilizan los datos contenidos en las variables para resolver problemas. Las bibliotecas (en inglés library) son colecciones de funciones proporcionadas por el entorno de programa-ción o creadas por el programador. Si queremos utilizar las funciones de una biblioteca en un programa debemos incluir en el programa la instrucción #include <biblio_1>
El compilador sustituye las instrucciones de la forma #include <biblio_1> por el contenido del archivo biblio_1. Al encerrar el nombre del archivo entre < y >, se informa al compilador de que debe buscar biblio_1 en un grupo estándar de bibliotecas. Si en lugar de la instrucción anterior escribiéramos la siguiente: #include "biblio_1" el compilador buscaría el archivo biblio_1 en el mismo directorio donde se encuentra el archivo con el código fuente.
Función principal: main Todo programa debe contener una función llamada main. La función main dirige la ejecución del programa pasando datos a otras funciones y ejecutándolas. La línea int main (void) indica que main devuelve un valor de tipo entero y que acepta una lista de argumentos vacía, es decir, que no acepta argumentos. Cuando se define una función, las instrucciones que se ejecutarán al invocarla se escriben a continuación de la lista de argumentos, entre llaves. En el ejemplo, main contiene dos instrucciones: cout << "Hola"; /* Escribe hola en pantalla */ system("pause");
cout << "Hola"; /* Escribe hola en pantalla */ Indica que la cadena de caracteres "Hola" ha de ser enviada al flujo de salida estándar (cout), asociado con la pantalla del ordenador. C++ resuelve la entrada y salida de información mediante bibliotecas de la biblioteca estándar de C++. El nombre cout está definido en la biblioteca iostream, por tanto es necesario incluir el archivo de cabecera iostream. #include <iostream> El texto entre /* y */ es un comentario. Aunque el compilador ignora los comentarios, su presencia es muy importante, pues mejoran sensiblemente la legibilidad del código.
system("pause"); Indica que se ha de enviar el texto "Presione una tecla para continuar ..." al flujo de salida estándar, y se ha de esperar a que el usuario presione una tecla para terminar la ejecución del programa. Los componentes de la biblioteca estándar de C++ se definen en el espacio de nombresstd. Incluso después de incluir una cabecera como <iostream>, es necesario referirse al flujo de salida estándar como std::cout. using namespace std; Es una instrucción que da acceso a todos los nombres del espacio std dentro del espacio de nombres global. Esto es, permite el acceso a las componentes estándar sin necesidad de utilizar el operador de resolución de alcance::
Otro programa C++ #include <iostream> using namespace std; #define pi 3.1416 int main(void) { double radio; cout << "Este programa calcula el area de un circulo." << endl; cout << "Por favor, introduzca el radio: "; cin >> radio; cout << "El area del circulo es " << pi*radio*radio << endl; system("pause"); }
Variables y Constantes Una variable es el nombre de una colección de bits o unidades de información. La colección es el valor de la variable. En C y C++ es preciso declarar todas las variables, es decir, indicar cómo se han de interpretar los bits (como un número entero o fraccionario, como un carácter o como un valor booleano). La siguiente instrucción declara la variable radio como una variable capaz de almacenar un número fraccionario. double radio; La siguiente instrucción permite definir una constantepi cuyo valor es 3.1416. Indica al preprocesador que debe sustituir todas las apariciones de la constante pi por su valor. #define pi 3.1416
Declaración de una variable Una declaración asocia un identificador con un tipo de datos y con un tipo de almacenamiento. Los tipos de datos determinan cómo se interpretan los bits de memoria reservados para cada variable. Los tipos de datos atómicos más comunes son: int (número entero) double (número fraccionario) char (carácter) bool (valor lógico o booleano, cuyo dominio es {true, false}). El tipo bool es exclusivo de C++. En general la declaración de una variable es de la forma: tipo nombre [= valor]; double x; char letra = 'a';
Una misma declaración puede contener varios nombres de variables separados por comas: int n=10, m, p=-7; Los tipos atómicos son los tipos de datos más sencillos, a partir de los cuales se pueden construir otros datos más complejos. Una definición de un nombre especifica la porción de memoria o código asociados a ese nombre. Toda definición constituye una declaración, pero no al revés. La forma general de una Instrucción de Asignación variable = expresión; El operador de asignación = asigna a la variable el resultado de evaluar la expresión. Una expresión es una variable, una constante o una combinación de variables, constantes y funciones. n = p * (n / 2); // asigna a la variable n el valor -35
Funciones / Operadores de Expresiones Aritméticos: +, - (cambio de signo), - (resta), *, / , % (resto módulo) Relacionales: == (igualdad), != (desigualdad), <, >, <=, >= (compar) Lógicos: && (conjunción), || (disyunción), ! (negación) Cambio de tipo: (tipo), donde (tipo) puede ser int, double o char (double) n // convierte el valor de n al tipo double Prioridad de evaluación: operadores ordenados de mayor a menor. Operadores unarios: - (cambio de signo), !, (tipo) Operadores multiplicativos: *, /, % Operadores aditivos: +, - (resta) Operadores de comparación: <, <=, >, >= Operadores de igualdad: ==, != Conjunción: && Disyunción: || A igual prioridad la regla asociativa se aplica de izquierda a derecha.
Constantes Las constantes son objetos que se pueden utilizar en un programa sin declarar su tipo. Las constantes literales forman parte del lenguaje de programación y pueden ser de distintos tipos: entero (-26, 7) carácter ('a', '\n') fraccionario (1.23, -5.43) booleano (true, false) Además de estas constantes existen tablas de caracteres constantes o, simplemente, cadenas de caracteres ("esto es una cadena"). Las constantes definidas por el programador se introducen con la directiva define del preprocesador (e.g., #define pi 3.1416).
Entrada y Salida en C++ Para ser útil, un programa debe comunicarse con su entorno, lo que significa aceptar datos externos al programa (entrada de infor-mación) o enviar los resultados a algún sitio (salida de informa-ción). Se llama flujo de datos (en inglés stream) a todo dispositivo que pueda servir de fuente o destino de datos. El teclado, la pantalla y los archivos son flujos de datos. Los flujos estándar son tres objetos declarados en la biblioteca iostream de C++: 1. cin es el flujo de entrada estándar asociado al teclado. 2. cout es el flujo de salida estándar asociado a la pantalla del ordenador. 3. cerr es el flujo de error estándar asociado a la pantalla del ordenador.
A los flujos de datos se les asocian funciones y operadores que per-miten obtener datos del flujo, si es de entrada (como el teclado o un archivo) o escribir datos en el flujo, si es de salida (como la pantalla o un archivo). C++ utiliza los operadores de inserción<< en un flujo de salida y de extracción>> desde un flujo de entrada. cout << "Por favor, introduzca el radio: "; cin >> radio; La primera instrucción escribe la frase en la pantalla del ordenador y la segunda guarda en la variable radio el número que se introduzca a través del teclado. No es preciso especificar formatos, pues el operador >> sabe convertir los caracteres obtenidos del flujo de entrada en función del tipo de datos de la variable que se coloca a su derecha.
Los operadores de inserción y extracción se pueden concatenar: cout << "El area del circulo es " << pi*radio*radio << endl; equivale a las tres instrucciones siguientes: cout << "El area del circulo es "; cout << pi*radio*radio; cout << endl; Tanto en C como en C++ se pueden declarar flujos adicionalesy asociarlos con archivos. De esta manera se puede leer y escribir información en archivos.
Programas y algoritmos PROGRAMA LISP EQUIVALENTE AL PROGRAMA C++ (defun area_circulo ( ) (setf pi4 3.1416) (format t "Este programa calcula el area de un circulo ~%.") (format t "Por favor, introduzca el radio: ") (setf radio (read)) (format t "El area del circulo es ~d ~%" (* pi4 radio radio)) )
Programas y algoritmos ALGORITMO EQUIVALENTE A AMBOS PROGRAMAS Algoritmo área círculo const pi: real = 3.1416 fconst var radio: realfvar escribe("Este programa calcula el area de un circulo"); escribe("Por favor, introduzca el radio: "); lee(radio); escribe("El area del circulo es "); escribe(pi * radio * radio); falgoritmo
Conversiones de tipo Las conversiones de tipos de datos pueden ser implícitas o explícitas. Las conversiones implícitas tienen lugar en las expresiones cuyos operadores mezclan variables y constantes de tipos diferentes. Por ejemplo, en las instrucciones siguientes: int x; double y; double z = x+y; el operador + convierte el valor de x de int a double antes de sumar. Estas conversiones se llevan a cabo automáticamente de acuerdo con ciertas reglas. Para proteger la información, en general sólo se permiten conversiones de los tipos menos ricos a los más ricos. Sin embargo también son legales algunas conversiones que pueden dar lugar a pérdidas de información.
Las asignaciones también pueden dar lugar a conversiones. El valor de la expresión del lado derecho se convierte al tipo de la variable del lado izquierdo. Las llamadas a función pueden dar lugar también a conversiones im-plícitas. Por esta razón es importante disponer de la declaración de una función. De lo contrario, el compilador no conoce el tipo de los argumentos y por tanto carece de la información necesaria para llevar a cabo las conversiones. Todas estas conversiones pueden ser forzadas por el programador mediante la utilización de operadores de conversión (en inglés cast). La sintaxis de una conversión explícita es (tipo) expresión donde tipo es el tipo de datos al que se quiere convertir el resultado de evaluar la expresión. int i; double x = (double) i;
Instrucciones de Control Un bloque de instrucciones es un conjunto de instrucciones consecu-tivas, separadas por el operador de secuenciación ; y colocadas entre llaves { ... } Instrucciones Condicionales Una instrucción if ejecuta un bloque de instrucciones u otro depen-diendo del valor de una condición lógica. Si condición es cierta, se ejecuta instruccion_1. En caso contrario, se ejecuta instruccion_2, si está presente.
Instrucciones Condicionales La instrucción switch ejecuta una u otra instrucción dependiendo del resultado de la comparación de una expresión con una serie de constantes. La sintaxis es la siguiente: switch (expresion) { case constante_1: instrucciones_1; break; ... case constante_n: instrucciones_n; break; default: instrucciones_0; break; }
Si algunaconstante, por ejemplo la constante_n, coincide con el valor deexpresión, se ejecutarán las instrucciones a partir de los dos puntos correspondientes, i.e., instrucciones_n. Si ninguna constante coincide con el valor de expresión, se ejecuta-rán las instrucciones del caso default, i.e., instrucciones_0. La cláusula default es opcional. La instrucción break al final de cada caso es importante: permite salir de la instrucción switch e impide que se ejecuten las instruccio-nes asociadas a los casos siguientes. En determinadas circunstancias puede interesar justo lo contrario, es decir, que varios casos compartan el mismo código. La instrucción break no es necesaria cuando la última instrucción de un caso es return.
Instrucciones Iterativas El bucle for ejecuta repetidamente un bloque de instrucciones (el cuerpo del for) cierto número de veces, hasta que deje de cum-plirse una condición. Su sintaxis es la siguiente: for (inicial; condición; final) { // cuerpo del bucle } Las instrucciones se ejecutan de la siguiente forma: 1. Se ejecuta la instrucción inicial. 2. Se evalúa la expresión condición. 3. Si es cierta, se ejecutan las instrucciones del cuerpo del bucle, se ejecuta la instrucción final y se vuelve al punto 2. 4. Si es falsa, se abandona la ejecución del bucle.
Normalmente la ejecución de la instrucción final altera el valor de la condición, de tal forma que en algún momento deje de cumplirse la condición y termine el bucle. Si se ejecuta la instrucción continue dentro de un bucle, el control del programa pasa a la siguiente iteración del bucle. En el caso del bucle for, esto significa que 1. se incrementa la variable de control y, 2. si no se ha alcanzado la condición de terminación, comienza a ejecutarse el cuerpo del bucle por su primera instrucción. Se evita así que se ejecuten las instrucciones que siguen a continue dentro del bucle. Esta instrucción suele situarse dentro de una instrucción condicional. for (var = valor_inicial ; var <= valor_final ; var = var + incremento) { instrucciones }
Instrucciones Iterativas El bucle while permite ejecutar un bloque de instrucciones mientras se cumpla una condición lógica. La sintaxis de while es la siguiente: while (condición) { // cuerpo del bucle } Las instrucciones se ejecutan de la forma siguiente: 1. Se evalúa la expresión condición. 2. Si es cierta, se ejecutan las instrucciones del cuerpo del bucle y se vuelve al punto 1. 3. Si es falsa, se abandona la ejecución del bucle.
Todo bucle for de la forma for (inicial; condición; final) { // cuerpo del bucle } equivale a un bucle while como el siguiente: inicial; while (condición) { // cuerpo del bucle final; }
Instrucciones Iterativas La sintaxis del bucle do es la siguiente: do { // cuerpo del bucle } while (condición); El proceso es el siguiente: 1. Se ejecuta el cuerpo del bucle. 2. Se evalúa la expresión condición. 3. Si es falsa, se abandona el bucle. 4. Si es cierta, se vuelve al punto 1. Lo que distingue a este bucle del resto es que el cuerpo del bucle se ejecuta al menos una vez, pues condición se evalúa a posteriori. El cuerpo de un bucle for o while puede que nunca llegue a ejecutar-se. Esto ocurre si la condición es falsa inicialmente.