Documentos de Académico
Documentos de Profesional
Documentos de Cultura
← Iteraciones y Funciones
decisiones →
Contenido
[ocultar]
• 1 Estructuras de datos
o 1.1 Estructuras básicas en C, C++
1.1.1 variables
o 1.2 Matrices
1.2.1 Matrices estáticas
1.2.2 Acceso a los miembros de una arreglo de datos:
1.2.3 Arreglos dinámicos
o 1.3 Estructuras compuestas (struct, union, class)
1.3.1 Acceso a los miembros de una estructura
1.3.2 Estructuras anidadas
1.3.3 Herencia
1.3.4 Estructura de campos de bits
o 1.4 union: Sintaxis general
o 1.5 class: sintaxis
En C,C++ existe una serie de estructuras básicas o tipos primitivos, los cuales pueden ser
usados por el programador para declarar variables, y también son el fundamento sobre el
cual se crean estructuras complejas. El tamaño de los tipos primitivos no es estándar ya que
los mismos dependen de factores tales como:
Nota: en el lenguaje C,C++ existe el operador sizeof(), con el cual se puede obtener el
tamaño (número de bytes) ocupados por un tipo específico. Por ejemplo, sizeof(int) regresa
el número de bytes ocupados por lo datos de tipo int.
[editar] variables
En C, C++ la sintaxis para declarar variables es:
donde, tipo se refiere a uno de los tipos mostrados en la tabla anterior; id1 es el nombre con
el cual se identificará a la variable. Observe que si se quiere declarar más de una variable en
una línea de instrucción, las mismas deben separarse por medio de una coma.
Ejemplos:
char c;
int i;
float f;
int x,y,z;
[editar] Matrices
Una Matriz (en inglés, array) es una estructura usada para agrupar bajo
un mismo nombre
listas de datos de un mismo tipo.
El tipo de matriz puede ser cualquiera, sin embargo cada componente tiene que ser del
mismo tipo. El C estándar solamente da soporte para matrices estáticas, mientras que con
C++ se pueden crear matrices dinámicas a raiz de la librería estándar de plantillas (STL).
Ejemplos:
int intA[5];
long longA[5] = { 1, 2, 3, 4, 5 };
char charA[] = { 'a', 'b', 'c' };
En orden de acceder a los miembros de un arreglo se debe indicar el nombre del arreglo
seguido de dos corchetes, dentro de los cuales se debe especificar el índice del elemento
deseado. Se debe aclarar que los índices son números o expresiones enteras y que en C,C++
estos tienen un rango permitido de 0 a T-1 ( T = tamaño del arreglo ).
• union: una union es similar a una struct, salvo que en una estructura
creada con union los campos o variables comparten una dirección de
almacenamiento común.
Nota: tanto las estructuras como las uniones y las clases pueden ser
anónimas, pero lo más
recomendable es darle a las mismas un nombre. Si una estructura, union o
clase posee
nombre, esta pueden ser empleadas para declarar variables de la misma y,
lo más importante,
puede ser usada para el paso de parámetros a funciones.
De acuerdo con la sintaxis general de la orden struct es posible crear estructuras de datos
anónimas. Solamente hay que tener en cuenta que en una declaración anónima se debe
definir al menos una variable al final de la declaración. Por ejemplo, con el siguiente
fragmento de código:
Por supuesto, en una misma línea de instrucción podemos definir más de una variable.
Ejemplo:
Entonces, para crear nuevos tipos con struct deberemos de modificar la sintaxis mostrada
en los ejemplos anteriores.
Observe que, la sintaxis para declarar estructuras con nombre es bastante parecida a la
sintaxis para declarar estructuras anónimas; salvo que una declaración de estructura con
nombre se debe especificar el nombre deseado para la misma. Además, en una declaración
de estructura con nombre la o las variables definidas al final de la misma son opcionales.
Ejemplos:
Una vez que una estructura con nombre ha sido creada, la misma puede ser usada para
declarar cualquier número de variables. Por ejemplo, en el siguiente fragmento de código se
crea la estructura tiempo compuesta por los miembros hora, minuto y segundo; todos del
tipo int. En el mismo ejemplo, se declaran las variables t1 y t2.
Nota: en C++ puede obviarse la palabra struct a la hora de declarar variables. Así, en C++
la línea de instrución struct tiempo t1, t2; ( del ejemplo anterior) puede escibirse como:
tiempo t1, t2;
[editar] Acceso a los miembros de una estructura
En orden de poder leer o escribir uno de los miembros de una variable estructurada se debe
usar el operador de acceso ( . ), o sea, el nombre de la variable seguida por un punto
seguido por el nombre del miembro o componente deseado de la estructura. Por ejemplo,
para acceder a los miembros de la variable t1 (mostrada arriba) podemos hacerlo de la
siguiente manera:
t1.hora = 12;
t1.minuto = 0;
t1.segundo = 0;
Los miembros de una estructura pueden ser ellos mismos otra estructura previamente
identificada o bien una estructura anónima. Por ejemplo, en el siguiente fragmento de
código se crean las estructuras pareja y pareja2. Observese cómo dentro de los miembros de
pareja2 se declara el miembro X, mismo que es una estructura del tipo pareja. Luego, las
variables declaradas a raiz de la estructura pareja2 poseerán los miembros variables a y b
heredados de pareja, y c.
Ahora bien, para acceder a los miembros de una estructura dentro de otra estructura se
emplea el mismo mecanismo de acceso (el punto). Por ejemplo, para desplegar el miembro
a de la variable P3 declarada en el ejemplo anterior, lo haremos más o menos así:
[editar] Herencia
Por ejemplo, en la definicion de las estructuras pareja y pareja2 del ejemplo anterior, se
dice que pareja2 hereda por composición todos los miembros de pareja. Ahora, en el
siguiente ejemplo se usa la sintaxis para que la estructura pareja2 herede por extensión los
miembros de pareja:
// solo C++
struct pareja { int a, b ; };
struct pareja2 : pareja { int c; } P3;
Antes de ver un ejemplo del uso de struct para crear estructuras de campos de bits
consideremos el caso en donde se tiene una variable del tipo short (16 bits) y que para la
misma se desea que los bits tengan significados especificos. digamos que el primer bit
servirá para controlar alguna condición; los siguientes cuatro bits, o sea del segundo al
quinto bit, controlarán otra condición; el bit 6 tendrá otra funcion; y el resto, o sea del
septimo al decimosexto bit se emplearán para contralar otra condición. De tal manera que si
queremos, por ejemplo, saber si el primer bit de la variable tiene almacenado un 1 o un 0
podemos emplear la siguiente sintaxis:
int X = 123;
int r = X & 1;
la cosa parece sencilla, pero ahora consideremos el caso en el cual deseamos saber cual es
el valor contenido por el grupo de bits ( segundo al quinto ), entonces nos daremos cuenta
que no basta con una prueba mediante AND ( X & 1 ) sino que hay que realizar otros pasos.
struct campo_de_bit {
int bit_1 : 1;
int bits_2_a_5 : 4;
int bit_6 : 1;
int bits_7_a_16 : 10;
} bit_var;
bit_var.bit_1 = 1;
printf("%i\n", bit_var.bit_1 );
Nota: acerca de las estructuras de campos de bits hay que hacer la aclaración que, aunque
cada uno de los campos de la estructura pueden declarse como enteros con signo o enteros
sin signo, la misma no tendrá una longitud mayor a un entero largo.
En el ejemplo anterior se declara la variable u1, la cual es una estructura tipo union. El
espacio de almacenamiento para la variable a es compartido por la variable b, en
consecuencia, al escribir sobre cualquiera de estas dos variables se altera el contenido de
ambas.
En el ejemplo anterior se declara la variable u1, la cual es una estructura tipo union. El
espacio de almacenamiento para la variable a es compartido por la variable b. Es decir, el
compilador reservará espacio en la memoria para la variable de mayor tamaño (que para
éste caso es b ). Ahora bién, suponiendo que en su equipo el tipo long ocupa 32 bits y que
el tipo short ocupa 16 bits, entonces la variable a ocupará solamente los 16 bits menos
significativos, miemtras que la variable b ocupará todo el espacio, o sea los 32 bits;
Observe que en la sintaxis se ha especificado el nombre ux, mismo que puede ser empleado
para declarar cualquier número de variables de la union. Por ejemplo, a continuación se
declaran las variables u2 y u3 del tipo union ux creado en el ejemplo anterior.
Las clases son algo así como "super" estructuras capaces de agrupar no solo datos
miembros sino también funciones miembros. En el lenguaje común a los datos miembros
de una clase se les conoce como atributos; mientras que a las funciones miembros de una
clase se les llama métodos. Normalmente, los métodos se emplean para leer o escribir los
atributos. Es decir, la norma general es no permitir el acceso directo a los atributos de una
clase, con la idea de aumentar la seguridad de los datos.
En seguida se mostrará el código para crear la clase Pareja, misma que poseerá los atributos
a y b, y los métodos setA(), setB(); getA(), getB(), y mostrar();
class Pareja {
int a, b;
public:
void setA(int n) { a = n; }
void setB(int n) { b = n; )
int getA() { return a; }
int getB() { return b; }
void mostrar() {
cout << "a = " << a << "; b = " << b << endl;
}
} p1;
Nota: por omisión, los miembros de una clase son privados, lo cual significa que los
objetos instanciados de dicha clase no tendrán acceso a los mismos. Así, en el ejemplo
anterior se está creando la clase Pareja, y al mismo tiempo el objeto p1. Luego, para leer o
escribir los atributos de p1 se debe hacer a traves de los métodos definidos con tal objetivo.
Por ejemplo, con el siguiente fragmento de código se establecen respectivamente a 100 y a
200 los atributos a y b; y posteriormente se despliegan por medio del método mostrar().
p1.setA(100);
p1.setB(200);
p1.mostrar();
• Los miembros de una struct son públicos por default, mientras que los
miembros de una class son privados por default.
• Los parámetros-argumentos struct se pasan normalmente por copia, los
parámetros-argumentos class se pasan normalmente por referencia.
#include <iostream>
int a, b;
// constructor base
Par() { a = b = 0; }
// destructor base
~Par() { cout << "hecho..." << endl; }
void setA(int n) { a = n; }
void setB(int n) { b = n; }
void mostrar() {
cout << "a = " << a << ", b = " << b << "; suma = " << a+b <<
endl;
}
};
// prueba
void test00() {
ParHijo p1(100, 200); // p1 es instancia de ParHijo
p1.mostrar(); // se envía mensaje al método mostrar() de p1
}
// funcion principal
int main()
{
test00();
cin.get();
return 0;
}
Programación en C++/Funciones
De Wikilibros, la colección de libros de texto de contenido libre.
< Programación en C++
Saltar a navegación, buscar
← Estructuras Streams →
Contenido
[ocultar]
• 1 Funciones
o 1.1 Definiendo una función
o 1.2 Parámetros
o 1.3 Llamar a una función
o 1.4 Funciones void
o 1.5 Funciones anidadas
o 1.6 Funciones de tipo puntero (*)
o 1.7 Variables estáticas y automáticas
o 1.8 Parámetros constantes
o 1.9 Parámetros con valor por defecto
o 1.10 Parámetros de tipo puntero
o 1.11 Parámetros estructurados
o 1.12 Funciones sobrecargadas
[editar] Funciones
[editar] Definiendo una función
Una función es un conjunto de líneas de código que realizan una tarea específica y puede
retornar un valor. Las funciones pueden tomar parámetros que modifiquen su
funcionamiento. Las funciones son utilizadas para descomponer grandes problemas en
tareas simples y para implementar operaciones que son comúnmente utilizadas durante un
programa y de esta manera reducir la cantidad de código. Cuando una función es invocada
se le pasa el control a la misma, una vez que esta finalizó con su tarea el control es devuelto
al punto desde el cual la función fue llamada.
Para comenzar, vamos a considerar el caso en el cual se desea crear la función cuadrado(),
misma que deberá volver el cuadrado de un número real (de punto flotante), es decir,
cuadrado() aceptará números de punto flotante y regresará una respuesta como número
flotante.
Nota: aunque para la función que veremos el tipo de retorno coincide con el tipo de
parámetro pasado, algunas veces las cosas pueden cambiar, es decir, no es obligatorio que
una función reciba un parámetro de un tipo y que tenga que regresar una respuesta de dicho
tipo.
[editar] Parámetros
Normalmente, las funciones operan sobre ciertos valores pasados a las mismas ya sea como
constantes literales o como variables, aunque se pueden definir funciones que no reciban
parámetros. Existen dos formas en C++ de pasar parámetros a una función; por referencia o
por valor. El hecho es que si en una declaración de función se declaran parámetros por
referencia, a los mismos no se les podrá pasar valores literales ya que las referencias
apuntan a objetos (variables o funciones) residentes en la memoria; por otro lado, si un
parámetro es declarado para ser pasado por valor, el mismo puede pasarse como una
constante literal o como una variable. Los parámetros pasados por referencia pueden ser
alterados por la función que los reciba, mientras que los parametros pasados por valor o
copía no pueden ser alterados por la función que los recibe, es decir, la función puede
manipular a su antojo al parámetro, pero ningún cambio hecho sobre este se reflejará en el
parámetro original.
Para mostrar un ejemplo del paso de parámetros por referencia, vamos a retomar el caso de
la función cuadrado, salvo que en esta ocasión cambiaremos ligeramente la sintaxis para
definir la misma. Veamos:
Al poner a prueba las funciones cuadrado() y cuadrado2() se podrá verificar que la primera
de estas no cambia el valor del parámetro original, mientras que la segunda sí lo hace.
Notas: se debe de aclarar que el uso de la palabra void dentro de los parentesis es opcional
al momento de declarar una función. Asi, la función pausa() podría haberse declarado como
void pausa(), y la misma puede invocarse como: pausa();.
Nota: observe que en la sintaxis para declarar funciones tipo puntero se debe de poner el
símbolo * despues del tipo y antes del nombre de la función que se está declarando. Esto se
puede ver en el programa, ya que la función binstr se declara como: char *binstr(unsigned
int);
#include <iostream>
#include <string.h>
// declaración de prototipo
char *binstr(unsigned int);
// punto de prueba
int main()
{
int n = 128;
cout << "decimal = " << n << ", binario = " << binstr(n) << endl;
cin.get();
}
strcpy(buffer, "0");
if (n > 0) {
while (n > 0) {
buffer[i] = ( n & 1 ) + '0';
i++;
n >>= 1;
}
buffer[i] = '\0';
strrev(buffer);
} // fin (n > 0)
return buffer;
}
Ejemplo:
Para ver un ejemplo más, vamos a considerar el caso de la función binstr() del programa
funciones01. Ahora, vamos modificar dicha función, salvo que esta ocasión nos interesa
que la misma sirva para convertir números decimales en cadenas numéricas y cuya base de
conversión sea pasada como parámetro. Es decir, la función de la que estamos hablando
podrá convertir números decimales a: binario, octal, decimal, hexadecimal, etc.; y la única
condición será que la base indicada esté entre el 2 y el 36, inclusive.
#include <iostream>
#include <stdlib.h>
// declaración de prototipo
char *numstr(unsigned int, const int base = 10);
// punto de prueba
int main()
{
int n = 128;
cout << "decimal = " << n << ", binario = " << numstr(n, 2) << endl;
cout << "decimal = " << n << ", octal.. = " << numstr(n, 8) << endl;
cin.get();
}
// definición de función numstr()
// nota: esta funcion requiere de la librería stdlib.h
char *numstr(unsigned int n, const int base)
{
static char buffer[65];
itoa(n, buffer, base);
return buffer;
}
struct empleado {
char nombre[32];
int edad;
char sexo; };
Ahora, pensemos que deseamos escribir una función para imprimir variables del tipo
empleado. Así, la función puede escribirse de las tres maneras siguientes:
Nota: cuando en los programas se hace una llamada a una función sobrecargada, el
compilador determina a cual de las funciones invocar en base al tipo y número de
parámetros pasados a la función.
#include <iostream.h>
#include <stdlib.h>
// divide enteros
int divide(int a, int b)
{
cout << "división entera" << endl;
return ( (b != 0) ? a/b : 0);
}
// divide reales
double divide(double a, double b)
{
cout << "división real" << endl;
return ( (b != 0) ? a/b : 0);
}
// punto de prueba
int main()
{
cout << divide(10, 3) << endl;
cout << divide(10.0, 3.0) << endl;
cin.get();
}
La sintaxis que usaremos para declarar funciones con lista de parámetros variables es:
1) tipo nombrefuncion(...)
2) tipo nombrefuncion(int num, ...)
donde:
En el siguiente programa, por ejemplo, se define una función ( printstr ) que despliega una
lista variable de cadenas de caracteres.
#include <iostream.h>
#include <stdarg.h>
int main()
{
printstr("Hola, ", "Esta es\n", "una prueba\n", NULL);
cin.get();
return 0;
}
En el programa que se listará en seguida, se define la función suma(), misma que operará
sobre listas de números enteros, la función devolverá la suma de dichos números.
#include <iostream>
#include <stdarg.h>
va_end( argptr );
return( total );
}
int main()
{
cout << suma(4, 100, 200, 300, 400) << endl;
cin.get();
return 0;
}