Componente de C++
·
Directivo
Las directivas de pre procesamiento ofrecen la
capacidad de omitir condicionalmente secciones de los archivos de código
fuente, con el fin de notificar errores y advertencias, así como de delimitar
regiones características del código fuente. El término "directivas de pre
procesamiento" se utiliza por motivos de coherencia con los lenguajes de
programación C y C++. En C#, no existe un paso de pre procesamiento individual;
las directivas de pre procesamiento se procesan como parte de la fase de
análisis léxico.
pp-directive:
pp-declaration
pp-conditional
pp-line
pp-diagnostic
pp-region
pp-conditional
pp-line
pp-diagnostic
pp-region
A continuación se indican las
directivas de pre procesamiento disponibles:
·
#define
y #undef
, que permiten definir y anular respectivamente, la definición
de símbolos de compilación condicional (Sección 2.5.3).#if
,#elif
,#else
y#endif
, para omitir de forma condicional secciones de archivos de código fuente (Sección 2.5.4).#line
, que permite controlar los números de línea de errores y advertencias (Sección 2.5.7).#error
y#warning
, que permiten emitir errores y advertencias respectivamente (Sección 2.5.5).#region
y#endregion
, para marcar de forma explícita secciones del código fuente (Sección 2.5.6).
Una directiva de pre
procesamiento siempre ocupa una línea independiente del código fuente y siempre
empieza por un carácter
#
y un nombre de directiva de pre procesamiento. Puede
haber un espacio en blanco antes del carácter #
y entre éste y el nombre de la directiva.
Una línea del código fuente que
contiene una directiva
#define
, #undef
, #if
, #elif
, #else
, #endif
o #line
puede terminar con un comentario en una línea. Los
comentarios delimitados (el estilo de comentarios /*
*/
) no están permitidos en las líneas de código fuente
que contienen directivas de pre procesamiento.
Las directivas de pre
procesamiento no son símbolos (tokens) y no forman parte de la gramática
sintáctica de C#. No obstante, las directivas de pre procesamiento pueden
utilizarse para incluir o excluir secuencias de símbolos y, de esta forma,
pueden afectar al significado de un programa de C#. Por ejemplo, una vez compilado,
el programa:
#define A
#undef B
class C
{
#if A
void F() {}
#else
void G() {}
#endif
#if B
void H() {}
#else
void I() {}
#endif
}
produce como resultado
exactamente la misma secuencia de símbolos que el programa:
class C
{
void F() {}
void I() {}
}
Por lo tanto, aunque los dos
programas sean muy diferentes léxicamente, sintácticamente son idénticos.
#include <iostream> // una directiva al preprocesador
Uso de directivas del preprocesador
En el programa de ejemplo hay una
directiva para el preprocesador, que se identifica por el símbolo #:
C++ utiliza un preprocesador, al igual que su predecesor, el
lenguaje C. Un preprocesador es un programa que actúa sobre el código fuente
antes que el propio compilador. En la sentencia para el preprocesador #include,
su acción es simple, reemplaza la sentencia por el contenido de los archivos
citados en la sentencia #include. El nombre del archivo está encerrado entre
los símbolos "<" y ">".
En este caso se ha hecho referencia al archivo iostream. Este
archivo posee las definiciones utilizadas por cout para visualizar el mensaje.
Sin esta directiva la compilación no hubiera procesado la sentencia cout ni
hubiera reconocido los símbolos de los operadores de inserción (<<) ni de
extracción (>>). Hay otras sentencias para el preprocesador que se verán
más adelante.
Los compiladores C++ traen consigo muchos archivos de
encabezados (header files) que brindan soporte a distintas ramas de
funcionalidades. En C este tipo de archivos lleva la extensión .h (por header
file), pero en C++ no lleva ninguna extensión en particular. En el ejemplo se
hace referencia al archivo de encabezado <iostream>, un archivo que
brinda soporte a las funciones de entrada y salida.
La versión C de <iostream> es <iostream.h>. Pero en
este caso se ha incluido la versión C++, por eso se debe incluir la directiva
using namespace.
#include <iostream> // una directiva al preprocesador
using namespace std;
namespace es una colección de nombres y de identificadores C++.
El uso de namespace impide la aparición de conflictos entre bibliotecas que
usan un mismo nombre o identificador. Esto significa que la variable cout que
se usa en la función y que está definida en <iostream> se llama en
realidad std::cout. De esta manera se puede hacer referencia a cout sin tener
que codificar siempre el prefijo std.
·
Declaración
Global
El lugar donde sea declarada una
variable afectara el uso que el programa quiera hacer de esa variable.
Las reglas básicas que determinan como
una variable puede ser usada dependen de 3 lugares donde se puede declarar una
variable.
En primer lugar es dentro de cualquier
función o procedimiento a estas se les llama variables locales y solo pueden
ser usadas por instrucciones que estén dentro de esa función o procedimiento.
En segundo lugar es como parámetro de
una función donde después de haber recibido el valor podrá actuar como variable
local en esa función o procedimiento.
En esencia una variable local solo es
conocida por el código de esa función o procedimiento y es desconocida por
otras funciones o procedimientos.
En tercer lugar es fuera de todas los
procedimiento o funciones a este tipo de variables se les llama variables
globales y podrán ser usadas por cualquier función o procedimiento del
programa, sin embargo hay que agregarle la palabra reservada STATIC y a partir
del momento en que se declara, acompañada de dicha palabra reservada static se
considera y puede usarse como variable global.
En programación en serio no es
acostumbrado usar muchas variables globales por varias razones, una de ellas es
que variables globales están vivas todo el tiempo de ejecución del programa y
si una global solo la ocupan unos cuantos procedimientos no tiene caso que este
viva para todo el resto, otra razón es que es peligroso tener variables
globales porque todo el conjunto de procedimiento y funciones que componen un
programa tienen acceso o comparten su valor y se corre el riesgo de que
inadvertidamente alguno de ellos modifique su valor.
prog13.cpp
#include <stdio.h>
#include <conio.h>
#include <string.h>
// Recordar declarar primero proc y funciones
void proc1();
// variables globales
float base, altura, area;
void main() {
clrscr();
//capturando datos
printf("dame base: ");scanf("%f",&base);
printf("dame altura: ");scanf("%f",&altura);
//llamando procedimiento
proc1();
}
void proc1(){
// Área de operaciones
Área = base * altura / 2;
// Área de construcción de página de salida
printf(" area =%0.2f",area);
getchar();getchar();
}
Es muy agradable trabajar sin parámetros
pero recordar la nota de arriba que no es muy bueno usar muchas variables
globales:
Corrida:
TAREAS PROGRAMACION C++
1.- BOLETA DE CALIFICACIONES Y SOLO USAR
DOS VARIABLES GLOBALES
2.- UNA TABLA DE MULTIPLICAR Y SOLO USAR
UNA VARIABLE GLOBAL
·
Función main
En primer lugar, la función nunca debe ser declarada como void.
Ésta es una mala práctica que se suele cometer, sobre todo al comenzar la
andadura con la programación (lo admito, ¡yo también lo hacía al principio!);
si bien algunos compiladores lo aceptan, los más estrictos se quejarán en forma
de warning o error. Así que hay que usar int para declarar el
tipo, o incluso también se puede obviar, porque el compilador le asignará este
tipo por defecto.
void main() // MAL: algunos compiladores se quejarán
{
}
{
}
int main() // CORRECTO: la forma adecuada de hacerlo
{
}
{
}
main() // CORRECTO: no es la mejor, pero los compiladores que sigan el
estándar la darán por buena
{
}
{
}
Bien, ahora atacaremos los valores de retorno. Esto es muy sencillo; como
hemos declarado la función del tipo int, al llegar al final de su
ejecución tendremos que devolver un valor. Normalmente se devuelve 0 para
indicar que el programa ha finalizado correctamente, y cualquier otro valor
para indicar una ejecución anormal. Pero, si queremos ser completamente estrictos
(en algunas plataformas el significado de los valores se invierte, y 0 puede
significar que ha ocurrido un fallo de ejecución), emplearemos las macros EXIT_FAILURE y EXIT_SUCCESS.
Como su nombre bien indica, la primera devuelve una ejecución errónea, y la
segunda indica al proceso padre que todo ha ido como debería. Sus definiciones
se encuentran en stdlib.h para el lenguaje C y cstdlib.h para
C++.
int main()
{
return EXIT_SUCCESS; // El programa terminó la ejecución debidamente
}
{
return EXIT_SUCCESS; // El programa terminó la ejecución debidamente
}
int main()
{
return EXIT_FAILURE; // El programa encontró algún fallo y no pudo finalizar la ejecución correcta
}
{
return EXIT_FAILURE; // El programa encontró algún fallo y no pudo finalizar la ejecución correcta
}
int main()
{
return 5; // Valor de retorno personalizado; de esta manera podemos indicarle al proceso que invoca a nuestro programa que ha ocurrido algo determinado (por ejemplo, que no se ha llamado al programa con determinados parámetros)
}
{
return 5; // Valor de retorno personalizado; de esta manera podemos indicarle al proceso que invoca a nuestro programa que ha ocurrido algo determinado (por ejemplo, que no se ha llamado al programa con determinados parámetros)
}
Y por último, hablaremos de los parámetros de la función. Hasta ahora, la
hemos definido sin ningún tipo de parámetros, porque según el estándar esto
puede hacerse perfectamente; sin embargo, main acepta dos
parámetros que se explicarán a continuación (hay que recordar que siempre es o cero o dos parámetros,
en caso de emplear cualquier otro número el compilador dará warning o error,
dependiendo de lo quisquilloso que sea):
Primer parámetro: tipo int.
Por costumbre se le llama argc, diminutivo de argument
count, pero se le puede llamar como se desee. Como su propio nombre indica,
contiene el número de argumentos que se le pasan al programa. Hay que tener en
cuenta que el primer argumento de un programa siempre será el
nombre de este, de tal manera que si hacemos la siguiente ejecución
:> miprograma param1 param2
Nuestro parámetro argc valdrá 3, y por consiguiente, si
llamamos al programa sin parámetros, argc equivaldrá a 1.
- Segundo parámetro: tipo char**.
Aunque también puede especificarse como char* argv[], lo
importante es indicar que estamos trabajando con un doble puntero a char,
esto es, un vector de vectores de caracteres, o para simplificar, un
vector de cadenas. Como se ha indicado anteriormente, el nombre más común
para llamar a este parámetro es argv, contracción de argument
vector, y al principio puede resultar un poco lioso lidiar con él, más
aún si no se han usado punteros nunca. Así que simplemente hay que
recordar que estamos trabajando con un vector de cadenas, y que cada
posición (recordad, su extensión va desde 0 hasta argc-1)
guarda uno de los argumentos empleados al llamar a nuestro programa. Para
la ejecución de ejemplo del punto anterior, esta sería la traza de
nuestros parámetros:
argc = 3;
argv[0] = “miprograma”;
argv[1] = “param1”;
argv[2] = “param2”;
argv[0] = “miprograma”;
argv[1] = “param1”;
argv[2] = “param2”;
·
Sintaxis para declarar variables
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. Ejemplo:
int recetaDelMes;
O
O
Asignar un valor
Es
posible asignar un valor a una variable al momento de declarar
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;
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;
Reglas para
declarar una variable
1. Tener el mismo nombre que una “palabra reservada” del lenguaje.
Explicación: los
lenguajes de programación tienen “palabras reservadas“, osea que esas palabras
solo pueden ser usadas por el programa, por eso llevan el nombre de “reservadas“,
pues si supongamos el caso de que un lenguaje de programación “X” tiene
sus palabras reservadas... entre las cuales está: “ingresar“, entonces eso
quiere decir que el usuario NO debe declarar una variable con
el nombre “ingresar“, porque va a tener conflictos más adelante.
2. Sólo pueden ser letras, dígitos y el guión bajo o subguión.
Explicación: pues
en los lenguajes de programación hay sintaxis que deben cumplirse al pie de la
letra, entonces dice que las variables solo pueden llevar letras, números y el
subguión, ejemplo:
La siguiente
variable está bien declarada: programando19
La siguiente
variable está mal declarada: %&programando-19
Vemos que
insertó caracteres especiales, además de que uso el guión normal (no
el subguión), por lo tanto puede que el programa entienda que es una resta,
entonces está mal declarado por sintaxis.
3. Deben comenzar por un carácter (letra).
Explicación: por
sintaxis como ya hemos visto, deben cumplir con estas reglas, entonces no se
puede comenzar con un número, ya que se debe comenzar por una letra como dice
la regla, ejemplo:
La siguiente
variable está bien declarada: paso a paso
La siguiente
variable está mal declarada: 89pasos
4. Deben iniciar con un carácter (no número) como vimos en la regla 3, y también
puede comenzar con un guión bajo (_), ejemplo:
La siguiente
variable está bien declarada: _descuento
La siguiente
variable está mal declarada: -descuento
La siguiente
variable está mal declarada: descuento-
5. No se les pueden llevar espacios en blanco.
Explicación: las
variables no pueden llevar espacios en blanco, solo pueden ser separadas por un
signo dedicado a ser usado como un espacio, el cual es el subguión ( _ ),
entonces en una variable cuando vean un subguión, prácticamente están separando
algo ( para que no parezca una enlazadas), ejemplo:
La siguiente
variable está bien declarada: eddy_19
La siguiente
variable está mal declarada: eddy 19
6. No pueden llevar acento (tilde), ejemplo:
La siguiente
variable está bien declarada: numero
La siguiente
variable está mal declarada: número
Ejemplo 1: La declaración de una variable para almacenar la edad de una
persona se escribe:
int edad; |
|
Ejemplo 2: Para declarar varias variables del mismo tipo de dato se puede
escribir:
int edad; int numero_de_hijos; Ejemplo 3: O también, en la misma línea separadas por el carácter coma (,): int edad, numero_de_hijos; |
|
Ejemplo 4: Si se desea declarar una variable para almacenar un número
entero y que, inicialmente, contenga el valor 35, se debe escribir:
int numero = 35; |
|
Ejemplo 5: A continuación, se muestra la declaración de una variable para
almacenar una letra del alfabeto y que, inicialmente, contenga el valor 'Z':
char letra = 'Z'; Ejemplo 6: Para declarar una variable que pueda almacenar el nombre de una persona y que, inicialmente, contenga el valor "Isabel", escribiremos: char nombre[7] = "Isabel"; Un dato de tipo cadena es un dato compuesto (estructurado), debido a que está formado por una agrupación de caracteres. Pues bien, dicha agrupación se define por medio de un array. Un arrayagrupa, bajo el mismo nombre de variable, a una colección de elementos (datos) del mismo tipo. Para declarar un array de caracteres, después del identificador de la variable, se tiene que escribir, entre corchetes "[]", el número de caracteres que se van a almacenar en el array, más uno. Por tanto, en este caso, puesto que "Isabel" tiene seis caracteres, hay que escribir un 7 entre los corchetes. Se tiene que escribir un número más, porque en la memoria se va a reservar espacio para los seis caracteres de la cadena "Isabel", más uno, conocido éste como el carácter nulo, el cual se representa mediante una barra invertida y un cero (\0). El sistema se encarga de "poner" dicho carácter, que indica el fin de la cadena. Por consiguiente, en la memoria se almacenarán siete caracteres consecutivos: |
|
Los
caracteres del array pueden ser referenciados mediante el identificador del
mismo, seguido de un número entre corchetes. A dicho número, de manera
formal, se le llama "índice", y puede oscilar entre el valor 0 y
n-1, siendo n el número de caracteres que pueden ser almacenados en memoria
en el array, en este caso 7.
|
|
|
|
Por
ejemplo, nombre [3] hace referencia al espacio de memoria donde está el carácter
'b'.
Ejemplo 7: Si se declara la variable de tipo cadena: char nombre[7] = "June"; En memoria tendremos: |
|
Fíjese
que, en esta ocasión, el array de caracteres nombre ha sido inicializado con el
valor "June". De manera que, el fin de la cadena se encuentra en nombre[4], y no en el último espacio
de memoria reservado para el array, ya que, "June" tiene, solamente,
cuatro caracteres.
|
·
Biblioteca de Funciones
Librerías Estándar de C++ (Standar Template Library o STL)
A continuación pondré algunas de las librerías de uso más común de C++ y
que forman parte de las librerías estándar de este lenguaje.
·
fstream:
Flujos hacia/desde ficheros. Permite la manipulación de archivos desde el
programar, tanto leer como escribir en ellos.
·
iosfwd:
Contiene declaraciones adelantadas de todas las plantillas de flujos y sus
typedefs estándar. Por ejemplo ostream.
·
iostream:
Parte del a STL que contiene los algoritmos estándar, es quizá la más usada
e importante (aunque no indispensable).
·
La biblioteca list:
Parte de la STL relativa a contenedores tipo list; listas doblemente
enlazadas
·
math:
Contiene los prototipos de las funciones y otras definiciones para el uso y
manipulación de funciones matemáticas.
·
memory:
Utilidades relativas a la gestión de memoria, incluyendo asignadores y punteros
inteligentes (auto_ptr).
"auto_ptr" es una clase que conforma la librería memory y permite
un fácil manejo de punteros y su destrucción automaticamente.
·
Biblioteca new:
Manejo de memoria dinámica
·
numeric:
Parte de la librería numérica de la STL relativa a operaciones numéricas.
·
ostream:
Algoritmos estándar para los flujos de salida.
·
queue:
Parte de la STL relativa a contenedores tipo queue (colas de objetos).
·
Librería stdio:
Contiene los prototipos de las funciones, macros, y tipos para manipular
datos de entrada y salida.
·
Librería stdlib:
Contiene los prototipos de las funciones, macros, y tipos para utilidades
de uso general.
·
string:
Parte de la STL relativa a contenedores tipo string; una generalización de
las cadenas alfanuméricas para albergar cadenas de objetos. Muy útil para el
fácil uso de las cadenas de caracteres, pues elimina muchas d elas dificultades
que generan los char
·
typeinfo:
Mecanismo de identificación de tipos en tiempo de ejecución
·
vector:
Parte de la STL relativa a los contenedores tipo vector; una generalización
de las matrices unidimensionales C/C++
·
forward_list
Esta librería es útil para implementar con gran facilidad listas enlazadas
simples.
·
list
Permite implementar listas doblemente enlzadas (listas enlazadas dobles)
facilmente.
·
iterator
Proporciona un conjunto de clases para iterar elementos.
·
regex
Proporciona fácil acceso al uso de expresiones regulares para la
comparación de patrones.
·
thread
Útil para trabajar programación multihilos y crear múltiples hilos en
nuestra aplicación.
Sintaxis de declaración de variables
#include<stdio.h>
|
#include<conio.h>
|
Main ()
|
{
|
int a,b;
|
Printf (ˆEscribe el primer númeroˆ)
|
Scanf ( ˆ % f , & a );
|
Printf (ˆEscribe el segundo número a sumar);
|
Scanf ( ˆ % f , & b );
|
Printf ˆEl resultado es :ˆ
|
%f, ( a + b ) ;
|
Getch ()
|
}
|