You are on page 1of 12

Tema 4: ARRAYS, CADENAS Y PUNTEROS

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

tipo_base nombre_array [tamao_1_dimensin] [tamao_2_dimensin]...[tamao_n_dimensin];


int matriz[10][3][5];

Acceso a un elemento
Sintaxis
Ejemplo

nombre_array [indice_1_dimensin] [indice_2_dimensin]... [indice_n_dimensin]


matriz[2][3]

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.

Inicializacin: mediante el operador de asignacin y sin necesidad de completar todo el vector.


1. dndole valor a cada elemento del vector: Ejemplo char codigo[11]={H,o,l,a,\0}; 2. asignndole directamente una constante de cadena de caracteres: Ejemplo char codigo[11] = Hola; 3. mediante un array indeterminado: Ejemplo char codigo[] = hola;

Indexar una cadena


char cad[]="esto es una prueba"; // para acceder a cada carcter for(int i=0; cad[i]!=\0; i++) cout<<"Caracter "<<i<<" es: "<<cad[i]<<endl;

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

strcat (variable_cadena_destino, cadena_origen)


Concatena la cadena_origen al final de la cadena que esta en variable_cadena_destino.

strlen (cadena_origen) strcmp (cadena_1, cadena_ 2)

Devuelve la longitud de cadena_origen.

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;

Arrays de cadenas de caracteres: arrays bidimensionales de caracteres


Ejemplos a) char array_cadena[24][80]; array_cadena[3][4] // accede a un carcter b) char array_cadena[24][80]; for(int i=0; i<24;i++) cin.getline(array_cadena[i],80); // indexando el primer ndice se accede a cada cadena de caracteres

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.Mediante el operador de asignacin

Ejemplos con errores


string s1 = y; string s2 = 5; string s3 = (y); string s4(3);

En una sentencia de asignacin si se le puede asignar un solo carcter.


Ejemplo string s1; s1 = n;

2. Cadenas (V)
Entrada
1.

2.2. La clase estndar string de C++ (II).


Mediante el operador de extraccin (>>) donde el espacio en blanco delimita el final de la cadena.
Ejemplo string s1; cin>>s1;

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);

Acceso a caracteres individuales


Sin verificacin del intervalo: operador de subndice []
Ejemplo string s1(hola); cout<<Primer caracter : "<<s1[1]<<endl; cout<<Introduce nuevo carcter: ; cin<<s1[1];

Con verificacin del intervalo: funcin miembro at


Ejemplo string s1(prueba); cout<<s1.at(2); s1.at(2)=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();

Asignacin Funcin miembro assign


1. string s1(hola), s2; s2.assign(s1); 2. string s1(hola), s2; s2.assign(s1, 1, 2);

operador de asignacion =
string s1(hola), s2; s2 = s1;

3.

Concatenacin operador de suma +

Funcin miembro append


1. string s1(prueba); s1.append( final); 2. string s1(carambola), s2; s2.append(s1, 0, 4);

1. string s1(Esto), s2( es una ); cout<<Concatenacin: <<s1+s2; 2. string s3(prueba); s3 += final;

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.

Recuperacin: funcin miembro substr


Ejemplo string s1(hola); cout<<"Dos primeros caracteres: "<<s1.substr(0,2);

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.

punteros de distinto tipo:


Ejemplos int i (10), *p = &i; float *q = NULL; q = static_cast<float *> (p);

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)

Declaracin de un puntero a un puntero


Sintaxis tipo_dato_apuntado ** nombre_variable_puntero_puntero;

Acceso al dato al que apunta un puntero a un puntero


Sintaxis ** nombre_variable_puntero_puntero
Ejemplo #include <iostream> using namespace std; void main() { int x(10), *p, **pp; p = &x; pp = &p;

cout<<"Valor de x a partir de pp : "<< (**pp);}

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

El contenido del i-simo elemento: codigos[i] y *(codigos+i)


Ejemplo #include <iostream> using namespace std; const num=10; void main() { int x[num]={0,1,2,3,4,5,6,7,8,9}; for(int i = 0; i <= num; i++) { cout<<"Valor del elemento "<< i<<"\tx[ <<i<<"] = " <<x[i]<<"\t*(x+"<<i<<") = "<<*(x+i)<<endl; cout<<"Direccin del elemento "<<i<<"\t&x["<<i<<"] = " <<&x[i]<<"\tx+"<<i<<" = "<<x+i<<endl; }}

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);

Declaracin de la funcin anfitriona Sintaxis


a) tipo_anfitriona nombre_funcin_anfitriona (tipo_husped (*) (tipo1, tipo2, , tipon), tipo y nombre del resto de los argumentos de la funcin anfitriona); b) tipo_anfitriona nombre_funcin_anfitriona (tipo_husped (*puntero_funcin_huesped) (tipo1 arg1, tipo2 arg2, , tipon argn), tipo y nombre del resto de los argumentos de la funcin anfitriona);

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; }

You might also like