Professional Documents
Culture Documents
1. Arrays. 1. Arrays unidimensionales. 2. Arrays multidimensionales. 3. Paso de arrays a funciones. Cadenas. 1. Cadenas como vectores de caracteres. 2. La clase estndar string de C++. Punteros. 1. Operaciones. 2. Punteros a punteros. 3. Arrays y punteros. 4. Punteros a funciones.
2.
3.
1. Arrays (I)
1.1. Arrays unidimensionales.
Declaracin
Sintaxis tipo_base nombre_array [tamao];
Ejemplo int codigos[100];
todos los arrays estn indexados desde cero, el ndice puede ser expresado mediante una constante entera, una variable entera o una expresin entera ms compleja, C++ no comprueba si los ndices de los arrays estn dentro de los rangos definidos
Acceso a un elemento
Sintaxis nombre_array [ndice]
Ejemplo cin>>notas[i];
Declaracin/Inicializacin
Sintaxis tipo_base nombre_array [tamao] = {lista_de_ valores};
Ejemplos int digitos [10] = {0,1,2,3,4,5,6,7,8,9}; int digitos[10]={0, 1};
Arrays indeterminados
Ejemplo int notas[] = {0,1,2,3,4};
1. Arrays (II)
1.2. Arrays multidimensionales (I).
Declaracin
Sintaxis tipo_base nombre_array [tamao_1_dimensin][tamao_2_dimensin];
Ejemplo int matriz[3][5];
Acceso a un elemento
Sintaxis
Ejemplo
nombre_array [fila][columna]
matriz[2][3]
Inicializacin/Declaracin
Sintaxis tipo_base nombre_array [tamao_1_dimensin][tamao_2_dimensin]= {lista_de_ valores};
Ejemplos int notas[2][5]={5,7,3,4,6,1,3,2,8,5}; int notas[2][5]={{5,7,3,4,6}, {1,3,2,8,5}};
1. Arrays (III)
1.2. Arrays multidimensionales (II).
Declaracin
Sintaxis
Ejemplo
Acceso a un elemento
Sintaxis
Ejemplo
Arrays indeterminados
Ejemplos int notas [][2][3]={1,2,3,4,5,6,1,2,3,4,5,6};
Se deben especificar el tamao de todas las dimensiones excepto la situada ms a la izquierda (primera dimensin).
1. Arrays (IV)
1.3. Paso de arrays a funciones.
Todos los arrays se pasan por referencia.
Ejemplo
#include <iostream> using namespace std; void f1(int notas[][4]); void main() { int notas[][4]={1,2,3,4,5,6,7,8}; f1(notas); // Invocar una funcin y pasarle un array } void f1(int notas[][4]) { for(int i(0); i<2; i++) for(int j=0; j<4; j++) cout<<"Valor["<<i<<"]["<<j<<"]: "<<notas[i][j]<<endl; }
// Declarar un array como parmetro de una funcin especificar el tipo de los elementos del array y el tamao de sus dimensiones nombre del array sin ndices ni corchetes
2. Cadenas (I)
2.1. Cadenas como vectores de caracteres (I).
Declaracin char nombre_cadena [tamao_mximo_cadena + 1]; Sintaxis
El carcter nulo (\0) indica el final de la cadena.
2. Cadenas (II)
2.1. Cadenas como vectores de caracteres (II).
Operaciones
strcpy (variable_cadena_destino, cadena_origen)
Copia la cadena contenida en cadena_origen en variable_cadena_destino
Compara las cadenas contenidas en cadena_1 y cadena_2 y devuelve uno de los siguientes valores: 0 si las dos cadenas son iguales; un entero menor que 0 si cadena_1 es menor que cadena_2; y un entero mayor que 0 si cadena_1 es mayor que cadena_2. Ejemplo
char cadena_1[]="esto es una prueba"; if(strcmp(cadena_1, cadena_2)==0) cout<<"Son iguales\n"; else cout<<"Son distintas\n"; char cadena_2[]="no"; // if(!strcmp(cadena_1, cadena_2))
2. Cadenas (III)
2.1. Cadenas como vectores de caracteres (III).
Salida Entrada
1. 2. Mediante el operador de extraccin (>>) donde el espacio en blanco delimita el final de la cadena. Ejemplo char cadena[80]; cin>>cadena; Mediante la funcin miembro getline. El primer parmetro es la variable cadena que recibe la entrada y el segundo es el nmero mximo de caracteres que getline puede leer. Ejemplo char cadena[80]; cin.getline(cadena, 79); Mediante el operador de insercin (<<) cout<<La cadena es : <<cadena<<endl; Ejemplo char cadena[] = Hola;
2. Cadenas (IV)
2.2. La clase estndar string de C++ (I).
Declaracin
Sintaxis string identificador_objeto;
Inicializacin
1.Mediante los argumentos del constructor
Ejemplos Ejemplo string s1(Adios); string s3 = Hola; string s2(4,y);
2. Cadenas (V)
Entrada
1.
2.
Mediante la funcin getline. El primer parmetro es un flujo de entrada, el segundo un objeto string y el tercero (opcional) el carcter con el que se delimita el final de la entrada.
Ejemplos string s1; getline(cin, s1); getline(cin, s1, x);
2. Cadenas (VI)
2.2. La clase estndar string de C++ (III).
Operaciones
1. 2. Longitud
Ejemplo cout<<"Longitud de la cadena es: "<<s1.length();
operador de asignacion =
string s1(hola), s2; s2 = s1;
3.
2. Cadenas (VII)
2.2. La clase estndar string de C++ (IV).
4. Comparacin
Funcin miembro compare operadores lgicos (==, !=, >, <, >=, <=)
string s1, s2; getline(cin, s1); getline(cin, s2); string s1, s2; getline(cin, s1); getline(cin, s2); if(s1 == s2) if((f = s1.compare(s2)) > 0) cout<<"Son iguales"; cout<<"S1 es mayor que S2"; else if(s1 > s2) else if(f < 0) cout<<"S1 es mayor que s2"; cout<<"S2 es mayor que S1"; else cout<<"S2 es mayor que s1"; else cout<<"Son iguales";
5.
6.
Intercambio: funcin miembro swap Ejemplo string s1(hola), s2(adios); s1.swap(s2); cout<<"Intercambio.\n S1 : "<<s1<<endl<<"S2 : "<<s2;
3. Punteros (I)
3.1. Operaciones (I).
Declaracin
Sintaxis tipo_dato_apuntado * nombre_variable_puntero;
Inicializacin: asignarle la direccin de otra variable previamente declarada o haciendo que no apunte a nada.
Ejemplos a) int i, *p = NULL, *q = 0, *r = &i; b) void main() { Las variables puntero deben apuntar siempre al tipo de datos correcto ya int interes=12, cop; que el compilador va a realizar todas float *p; las operaciones que se indiquen sobre p=&interes; ellas en funcin de sus tipos base. cop=*p; }
3. Punteros (II)
3.1. Operaciones (II).
Expresiones con punteros
1. Asignar un puntero a otro puntero a. punteros del mismo tipo:
Ejemplos int i(10), *p = &i, *q = NULL; q = p;
b.
2.
Operaciones aritmticas a. sumar o restar un entero a un puntero (++, --, +, +=, -, -=) b. restar un puntero a otro puntero.
Ejemplo int numeros[10]; int *q = &numeros[9]; int *p = numeros; cout<<"Elemenos: "<<q - p;
La aritmtica de punteros solo tiene sentido si se lleva a cabo sobre los elementos de un array.
3. Punteros (III)
3.1. Operaciones (III).
3. Comparacin de punteros. Mediante los operadores relacionales.
int menu() { int op; do {cout<<"OPERACIONES \n"; cout<<"\t 1. Introducir elemento\n"; cout<<"\t 2. Sacar elemento\n"; cout<<"\t 3. Salir\n"; cout<<"Introducir opcin: "; cin>>op; } while (op<1 || op>3); return op;} void guardar(int e) { p++; if (p==(tope+tam_pila)) error(0); *p=e;} int recuperar() { if(p==tope) error(1); p--; return *(p+1);} void error(int cod) { char *mensajes[] = { "Desbordamiento en la pila", "La pila esta vacia"}; cout<<mensajes[cod]; exit(1);} #include <iostream> using namespace std; const int tam_pila(10); int menu(); void guardar(int e); int recuperar(); void error(int op); int *tope, *p, pila[tam_pila]; void main() { int op,valor; tope=pila; p=pila; do { op=menu(); switch (op) { case 1: cout<<"\nintroducir valor "; cin>>valor; guardar(valor); break; case 2: cout<<"\ntope : "<< recuperar()<<endl; cin.get(); break; case 3:; } } while (op!=3);}
3. Punteros (IV)
3.1. Operaciones (IV).
Arrays de punteros
Sintaxis tipo_dato_apuntado * nombre_array_punteros [tamao_1_dimensin]...[tamao_n_dimensin];
Ejemplo #include <iostream> using namespace std; void main() { // Se almacena en el vector indice las direcciones de los elementos 0, 4 y 8 del vector vector. int vector[12], *indice[3]; for (int i = 0; i < 12; i++) { cout<<"\nintroduce elemento "<<i<<" : "; cin>>vector[i]; if ((i%4) == 0) indice[i/4] = &vector[i]; } for (int j = 0; j < 3; j++) // Listar ndices, contenido y direcciones de memoria cout<<"\nIndice : "<<j<<"\tContenido : "<<*indice[j]<< "\tDireccin : " <<indice[j]<<endl; }
3. Punteros (V)
3.1. Operaciones (V).
Arrays de punteros (paso de array de punteros a funciones)
Ejemplo #include <iostream> using namespace std; void mostrar(int *indice[]); void main() { int vector[12], *indice[3], i; for (int i = 0; i < 12; i++) { cout<<"\nintroduce elemento <<i <<" : "; cin>>vector[i]; if ((i%4) == 0) indice[i/4]=&vector[i];} mostrar(indice); } void mostrar(int *indice[]) { for (int i = 0; i < 3; i++) cout<<"\nIndice : <<i <<"\tContenido : <<*indice[i] <<"\tDireccin : <<indice[i] <<endl;}
3. Punteros (VI)
3.2. Punteros a punteros.
Indireccin simple
direccin (Puntero) valor (Variable)
Indireccin mltiple
direccin (Puntero) direccin (Puntero) valor (Variable)
3. Punteros (VII)
3.3. Arrays y punteros (I).
El nombre del array es un puntero al primer elemento.
Ejemplo int codigos[10]; Direccin del primer elemento: Direccin del segundo elemento: Direccin del elemento i+1: &codigos[0] o codigos &codigos[1] o codigos+1 &codigos[i] o codigos+i
3. Punteros (VIII)
3.3. Arrays y punteros (II).
Generar un puntero al primer elemento de un vector
Ejemplo p=codigos; p=&codigos[0];
Indexar un puntero
Ejemplo #include <iostream> using namespace std; const num=10; void main() { int x[num]={0,1,2,3,4,5,6,7,8,9}; int *p; p=x; for(int i=0; i<=num; i++) { cout<<"Valor del elemento "<<i<<"\tp["<<i<<"] = " <<p[i]<<"\t*(p+"<<i<<") = "<<*(p+i)<<endl; cout<<"Direccin del elemento "<<i<<"\t&p["<<i<<"] = " <<&p[i]<<"\tp+"<<i<<" = "<<p+i<<endl; }}
3. Punteros (IX)
3.4. Punteros a funciones (I).
Un puntero a una funcin contiene la direccin de comienzo de dicha funcin, y se obtiene mediante el nombre de la funcin sin parntesis ni argumentos. Un puntero a una funcin puede ser pasado como argumento a otra funcin. Se denomina funcin husped a la que se pasa como argumento y funcin anfitriona a la que recibe. Especificacin de una variable puntero a una funcin:
Sintaxis a) tipo_huesped (*puntero_funcin_huesped) () b) tipo_huesped (*puntero_funcin_husped) (tipo1, tipo2, , tipon) c) tipo_huesped (*puntero_funcin_husped) (tipo1 arg1,tipo2 arg2, , tipon argn)
3. Punteros (X)
3.4. Punteros a funciones (II).
Invocacin de la funcin husped desde la funcin anfitriona
Sintaxis (*puntero_funcin_husped)(arg1, arg2,, argn);
3. Punteros (XI)
3.4. Punteros a funciones (III).
#include <iostream> using namespace std; const int num=10; void ordenar(int v[], void (*pf)(int &a, int &b)); void ascendente(int &a, int &b); void descendente(int &a, int &b); void main() { int vector[num]; char op; void (*p)(int &, int &); cout<<"Introduce los numeros\n"; for(int i=0; i<num; i++) { cout<<"\nNmero "<<i<<" : "; cin>>vector[i]; } do { cout<<"\nOrdenacin (A, D) :"; cin>>op; }while((op!='A')&&(op!='D')); if(op=='A') p=ascendente; else p=descendente; ordenar(vector, p);} void ordenar(int v[], void (*pf)(int &a, int &b)) { for(int pasos=1; pasos<num; pasos++) for(int c=0; c<num-1; c++) (*pf)(v[c], v[c+1]); cout<<"\Resultado de la ordenacin\n"; for(int j=0; j<num; j++) cout<<"Elemento"<<j<<" :"<<v[j]<<endl; } void ascendente(int &a, int &b) { int t; if(a>b) { t=a; a=b; b=t; } } void descendente(int &a, int &b) { int t; if(a<b) { t=a; } a=b; b=t; }