COMPONENTES

3.Componentes C++

El lenguaje de programación C++ está caracterizado por ser de uso general, con una sintaxis sumamente compacta y de alta portabilidad. Es común leer que se caracteriza como un lenguaje de “alto nivel”, maneja los elementos básicos presentes en todas las computadoras: caracteres, números y direcciones. Esta particularidad, junto con el hecho de no poseer operaciones de entrada salida, manejo de arreglo de caracteres, de asignación de memoria, puede al principio parecer un grave defecto; sin embargo el hecho de que estas operaciones se realicen por medio de llamadas a Funciones contenidas en Librerías externas al lenguaje en sí, es el que confiere al mismo su alto grado de portabilidad, independizandolo del “Hardware” sobre el cual corren los programas
Un programa en C++ está definido por funciones (grupo de instrucciones que pueden o no hacer algún cálculo), donde la función principal debe ser llamada main.
La composición general de un programa en C++ es:
directivas de preprocesamiento.
declaración globales.
función main.
funciones definidas por el usuario.
comentarios para entender el funcionamiento del programas

3.1 Directivas de preprocesamiento
Las directivas de preprocesamiento son definidas para que el compilador realice algo antes de compilar el programa (revisar si la sintaxis es correcta y generar un código ejecutable por la computadora), como el incluir funciones de alguna biblioteca conocida. En particular, en C la directiva para incluir bibliotecas es como las siguientes:
Ejemplos:
#include “iostream.h”  
Esta directiva permitirá utilizar la función de lectura cin y la función de escritura cout propias de C++. 
#include “stdio.h” 
Esta directiva permitirá utilizar las funciones de lectura y escritura propias de C. Estas directivas también funcionan con C++, aunque existen algunos compiladores que no las soportan en cuyo caso es necesario hacer uso de los namespaces. Un namespace es una declaración de región. El propósito de estos es localizar el nombre de identificadores para evitar colisiones.  Para tener compatibilidad, cuando un programa en C++ incluye una libreria de C, haremos uso del namespace.
 Ejemplo:  
En C tenemos                        #include “iostream.h”
Con el respectivo en C++       #include “iostream”
                                               using namespace std; 
3.2 Declaración de variables
Una característica de C++, es la necesidad de declarar las variables que se usarán en un programa. Esto resulta chocante para los que se aproximan al C++ desde otros lenguajes de programación en los que las variables de crean automáticamente la primera vez que se usan. Se trata, es cierto, de una característica de bajo nivel, más cercana al ensamblador que a lenguajes de alto nivel, pero en realidad una característica muy importante y útil de C++, ya que ayuda a conseguir códigos más compactos y eficaces, y contribuye a facilitar la depuración y la detección y corrección de errores y a mantener un estilo de programación elegante.
Uno de los errores más comunes en lenguajes en los que las variables se crean de forma automática se produce al cometer errores ortográficos. Por ejemplo, en un programa usamos una variable llamada prueba, y en un punto determinado le asignamos un nuevo valor, pero nos equivocamos y escribimos prubea. El compilador o interprete no detecta el error, simplemente crea una nueva variable, y continúa como si todo estuviese bien.
En C++ esto no puede pasar, ya que antes de usar cualquier variable es necesario declararla, y si por error usamos una variable que no ha sido declarada, se producirá un error de compilación.
Cómo se declaran las variables
Ya hemos visto la mecánica de la declaración de variables, al mostrar la sintaxis de cada tipo en el capítulo 2.
El sistema es siempre el mismo, primero se especifica el tipo y a continuación una lista de variables y finalmente un punto y coma.
La declaración de variables es uno de los tipos de sentencia de C++. La prueba más clara de esto es que la declaración terminará con un ";". Sintaxis:
<tipo> <lista de variables>;
También es posible inicializar las variables dentro de la misma declaración. Por ejemplo:
int a = 1234;
bool seguir = true, encontrado;
Ámbito de las variables
Dependiendo de dónde se declaren las variables, podrán o no ser accesibles desde distintas partes del programa. Es decir, su ámbito de acceso y temporal dependerá del lugar en que se declaren. Las variables declaradas dentro de un bucle, serán accesibles sólo desde el propio bucle, esto es, tendrán un ámbito local para el bucle. Esto es porque las variables se crean al inciar el bucle y se destruyen cuando termina. Evidentemente, una variable que ha sido destruida no puede ser accedida, por lo tanto, el ámbito de acceso está limitado por el ámbito temporal.
Nota: En compiladores de C++ antiguos, (y en algunos modernos y mal implementados), no existe este ámbito, que sin embargo está descrito en la norma ANSI.
En estos compiladores, las variables declaradas dentro de un bucle tienen el mismo ámbito temporal y de acceso que las variables locales. Es decir, existen y son accesibles desde el punto en que se declaren hasta el final de la función.
Si usamos uno de esos compiladores no será posible, por ejemplo, usar varios bucles con declaraciones de variables locales de bucle con el mismo nombre.

for(int i=0; i < 100; i++) HacerAlgo(i);
for(int i=0; i > -100; i--) DeshacerAlgo(i);

Este código daría un error al intentar redefinir la variable local
 i.
Las variables declaradas dentro de una función, y recuerda que main también es una función, sólo serán accesibles para esa función, desde el punto en que se declaran hasta el final. Esas variables son variables locales o de ámbito local de esa función. Al igual que ocurre con las variables locales de bucle, en las de función, las variables se crean al inciar la función y se destruyen al terminar. Las variables declaradas fuera de las funciones, serán accesibles desde todas las funciones definidas después de la declaración. Diremos que esas variables son globales o de ámbito global. El ámbito temporal de estas variables es también global: se crean junto con el programa, y se destruyen cuando el programa concluye. Las variables globales son las únicas que son inicializadas automáticamente con valor cero cuando se declaran. Esto no sucede con ninguna variable local. En todos los casos descritos, el ámbito temporal coincide con el de acceso: las variables que no pueden ser accedidas es porque no existen todavía o porque han sido destruídas. Más adelante veremos casos en que estos ámbitos no coinciden. Una variable global declarada después de la definición de una función no será accesible desde esa función, por eso, normalmente se declaran las variables globales antes de definir las funciones. Pero esto es hablando de forma general, en realidad, en C++ está mal visto usar variables globales, ya que se consideran poco seguras.
Ejemplo:
int EnteroGlobal; // Declaración de una variable global

int Funcion1(int a); // Declaración de un prototipo

int main() {
   // Declaración de una variable local de main:
   int EnteroLocal;

   // Acceso a una variable local:
   EnteroLocal = Funcion1(10);
   // Acceso a una valiable global:
   EnteroGlobal = Funcion1(EnteroLocal);

   return 0;
}

int Funcion1(int a)
{
   char CaracterLocal; // Variable local de funcion1
   // Desde aquí podemos acceder a EnteroGlobal,
   // y también a CaracterLocal
   // pero no a EnteroLocal
   if(EnteroGlobal != 0)  
      return a/EnteroGlobal;
   return 0;
}
De modo que en cuanto a los ámbitos locales tenemos varios niveles:
<tipo> funcion(parámetros) // (1)
{
   <tipo> var1;             // (2)
   for(<tipo> var2;...)     // (3)
   ...
   <tipo> var3;             // (4)
   ...
   return var;
}
(1) Los parámetros se comportan del mismo modo que variables locales, tienen ámbito local a la función.
(2) Las variables declaradas aquí, también.
(3) Las declaradas en bucles, son de ámbito local en el bucle.
(4) Las variables locales sólo son accesibles a partir del lugar en que se declaren. Esta variable: var3, es de ámbito local para la función, pero no es accesible en el código previo a su declaración.
Es una buena costumbre inicializar las variables locales. Los ámbitos pueden ser alterados mediante ciertos modificadores que veremos en otros capítulos.
Enmascaramiento de variables
^Generalmente no es posible, y no suele ser necesario, declarar dos variables con el mismo nombre, pero hay condiciones bajo las cuales es posible hacerlo. Por ejemplo, podemos declarar una variable global con un nombre determinado, y declarar otra variable (del mismo tipo o de otro diferente) de forma local en una función, usando el mismo nombre. En ese caso decimos que la segunda declaración (la local), enmascara a la primera (la global). Con eso queremos decir que el acceso a la variable global está bloqueado o enmascarado por la local, que es a la única que podemos acceder directamente.
Por ejemplo:
int x;

int main() {
   int x;
  
   x = 10;
   return 0;
}
En este programa, cuando asignamos 10 a x estamos accediendo a la versión local de la variable x. En la función main, la variable global x está enmascarada, y no puede accederse a ella directamente. Del mismo modo, una variable de ámbito de bucle o de ámbito de bloque puede enmascarar a una variable global o local, o a una de un bloque o bucle más externo:
   int x = 10;
   {
      int x = 0;
      for(int x = 0; x < 10; x++) HacerAlgoCon(x);
   }
En este caso la declaración de x dentro del bloque enmascara la declaración anterior, y a su vez, la declaración dentro del bucle for enmascara a la declaración del bloque.                                                       Otra cuestión sería qué utilidad pueda tener esto.
Operador de ámbito
^Existe un método para acceder a una variable global enmascarada por una variable local. Se trata del operador de ámbito, que consiste en dos caracteres de dos puntos seguidos (::).
Veremos este operador con más detalle en el capítulo dedicado a los espacios con nombre, pero veamos ahora cómo lo podemos usar para acceder a una variable global enmascarada:
int x; // Variable global

int main()
{
   int x; // Variable local que enmascara a la global
  
   x = 10; // Accedemos a la variable local
   ::x = 100; // Mediante el operador de ámbito accedemos a la global
   return 0;
}
El operador de ámbito, usado de este modo, permite acceder al espacio de variables global. Pero este no es más que un uso restringido del operador, que tiene muchas más aplicaciones.
3.3 Función Main:
ANATOMIA DE UN PROGRAMA EN C++
Todo programa C++ tiene una función main( ) que es el punto inicial de entrada al programa. Su estructura es:
main( )
{
… bloque de estatutos
}

Los estatutos incluidos entre las llaves {…} se denominan bloque.
Un programa debe tener sólo una función main( ). Si se intenta hacer dos funciones main ( ) se produce un error.
Además de la función main( ), un programa en C++, consta de una colección de funciones.
COMENTARIOS
Los comentarios son mensajes que el programador escribe dentro del codigo, pero que el compilador no los detecta. Se usan para documentar los programas de acuerdo a las necesidades del programador. Existen dos formas de escribir comentarios
// (Doble slash) este par de caracteres genera un comentario de una linea despues de su aparicion. Ejemplo:
 int x=100; // declaración de la variable x inicializada en 100
/* */(Slash asterisco asterisco slash) Este comentario puede abarcar varias lineas de codigo. Todo lo que se encuentre en medio de estas parejas de caracteres es un comentario.
ejemplo:
/* Programa ejemplo1
Desarrollado por: Samuel Padilla
Fecha: Agosto 10 de 2010 */
Ejemplo1: PROGRAMA QUE IMPRIME UNA CADENA DE TEXTO CONSTANTE (para dev C++)
#include “iostream” //libreria o biblioteca
using namespace std;
int main( ){//en dev C++ no se usa void main
cout<<“primer programa en C++”<<endl;
system(“pause”);
}
 La primera línea de código es una directiva y se usa para llamar un archivo llamado iostream que contiene la funcion que nos permite imprimir en la pantalla (leer en este blog la entrada DIRECTIVAS)
El programa es básico, utiliza la funcion cout que esta en la libreria iostream para imprimir en la pantalla lo que el usuario ubique dentro de las comillas.
Todos los programas que desarrollemos en esta primera parte del curso tendran una estructura similar. La diferencia estara en la parte encerrada entre corchetes { } es decir el bloque de codigo
ejemplo 2: PROGRAMA CON VARIABLES DE TIPOS DE DATO SIMPLE INICIALIZADAS (para dev C++)
#include “iostream”
using namespace std;
int main(){
int x=1200;
float nota=4.9;
double largo=0.0000000001;
char miletra=’R’;
string c=”AMO la programacion de computadoras”;
cout<<“La variable entera fue iniciada en “<<x<<endl;
cout<<“La variable flotante fue iniciada en “<<nota<<endl;
cout<<“La variable doble precision fue iniciada en “<<largo<<endl;
cout<<“La variable caracter fue iniciada en “<<miletra<<endl;
cout<<“La variable cadena (string) fue iniciada en “<<c<<endl;
system(“pause”);
}
  En el codigo anterior se declara una variable de cada tipo, se inicializa y se imprime.



3.4 Funciones por el usuario
Creación de funciones definidad por el usuario
Las funciones de usuario son, como su nombre indica, las que el propio usuario declara, de igual manera que declara procedimientos. Las funciones nacen con el propósito de ser subprogramas que siempre tienen que devolver algún valor.
Las dos principales diferencias entre procedimientos y funciones son:
Las funciones siempre devuelven un valor al programa que las invocó.
Para llamar a un procedimiento se escribe su nombre en el cuerpo del programa, y si los necesita, se incluyen los parámetros entre paréntesis. Para invocar una función es necesario hacerlo en una expresión.
Las funciones de usuario vienen definidas por un nombre, seguidas de dos paréntesis () entre los que puede haber o no argumentos. Los argumentos son valores que se le pasan a la función cuando se llama.
Un ejemplo de una función sin argumentos:
#include <stdio.h>
main ()
{
printf (“\nEste mensaje lo muestra la función main()”);
MiFuncion ();
}
/* Definición de la función MiFuncion() */
MiFuncion ()
{
printf (“\nEste otro lo muestra MiFuncion()”);
}
En este ejemplo se utiliza la función MiFuncion() para mostrar en pantalla una frase. Como se ve, MiFuncion() se invoca igual que printf() o scanf(), es decir, simplemente se escribe el nombre de la función y los paréntesis. La definición de MiFuncion() tiene el mismo aspecto que main(): el nombre de la función con los paréntesis y, seguidamente, el cuerpo de la función encerrado entre llaves.
Un ejemplo de una función con argumentos. El programa visualiza el cuadrado de un número entero por medio de una función que recibe dicho número como argumento.
#include <stdio.h>
main ()
{
int num;
printf (“\nTeclee un número entero: “);
scanf (“%d”, &num);
cuadrado (num);
}
/* Definición de la función cuadrado() */
cuadrado (int x)
{
printf (“\nEl cuadrado de %d es %d\n”, x, x * x);
}
Es la declaración de la función cuadrado(). Dentro de los paréntesis se pone la variable que recibirá el valor pasado a cuadrado() y de qué tipo es. Así, si se teclea el valor 6, se almacena en num y al hacer la llamada cuadrado (num), la variable num se copia en la variable x, que es con la que trabaja internamente la función cuadrado().
Es importante mantener claros dos términos:
1. El término Argumento se refiere a la variable usada al llamar la función.
2. El término Parámetro Formal se refiere a la variable de una función que recibe el valor de los argumentos.
También es importante tener claro que la copia de variables se hace sólo en una dirección: del argumento al parámetro formal. Cualquier modificación del parámetro formal realizado dentro de la función no tiene ninguna influencia en el argumento.
Hay que tener en cuenta es que el tipo de argumento que se utiliza para llamar a una función debe ser el mismo que el del parámetro formal que recibe el valor. Así, no debe llamarse a la función cuadrado con un argumento de tipo float.
Un ejemplo que utiliza una función que devuelve un valor. El siguiente programa lee dos números enteros del teclado y muestra su producto en pantalla. Para el cálculo se usa una función que recibe los dos números y devuelve el producto de ambos.
#include <stdio.h>
main ()
{
int a, b, producto;
printf (“\nTeclee dos números enteros: “);
scanf (“%d %d”, &a, &b);
producto = multiplica (a, b);
printf (“\nEl resultado es %d”, producto);
}
/* Definición de la función multiplica() */
multiplica (int x, int y)
{
return (x * y);
}



Comentarios