Вы находитесь на странице: 1из 61

Lenguaje de Programacin ARREGLOS & CADENAS DE CARACTERES

UNSA - 2012

Mgter. Karim Guevara Puente de la Vega

Agenda

Arrays. Matrices Cadena de caracteres

Array

Generalizacin del concepto de variable.


Variable - Puede tener como mximo un valor. Cada variable es referenciada por un nombre. Arreglo - Representa un conjunto de valores (caracteres, enteros, reales, etc.) donde todos comparten el mismo nombre.

Cada valor es referenciado utilizando uno o mas subndices (nmero entero).

Tipos de arreglos: Los arreglos se clasifican segn el nmero dimensiones que almacenan.

Array (arreglos unidimensionales - 1D), un subndice Matriz (arreglos bidimensionales - 2D), dos subndices Multidimensional (tres - 3D- o mas dimensiones), 3 o mas subndices

Array unidimensional
Generalizacin del concepto de variable

Variable: Almacenar cuatro nmeros enteros

int num1, num2, num3, num4

Array: Almacenar cuatro nmeros enteros int num[4];

23

Array unidimensional

Grupo de localidades consecutivas de memoria relacionadas por el hecho que tienen el mismo nombre y tipo. Esto implica que cada celda tenga exactamente el mismo tamao. Cada localidad (o grupo de localidades) almacena un elemento del array.
Nombre del array

int arreglo_notas 12
Tipo de cada elemento

15

12

18

11

14

Array unidimensional

Cada elemento del array es accedido mediante el nombre del array y un subndice que representa la posicin numrica (entero no negativo) de dicho elemento dentro del array.

Declaracin de un array unidimensional


tipo_dato nombre_array [tamao]

Ejemplo:
int A[12]: char cdn[8]; float b[100];

Tambin podemos tener declaraciones mltiples:


int array1[13], array2[201]; float x[43], y[56], z[87]; char linea[80, texto[2000];

Acceso a los elementos


nombre_array [subindice]

El valor del subndice o posicin numrica de un elemento dentro del array debe ser un entero y puede expresarse como:

Constante entera o valor literal (por ejemplo 3) Variable entera (por ejemplo x) Expresin entera (por ejemplo x + y 1)

El valor del subndice puede variar de 0 a n-1, donde n es el nmero de elementos del array.
En general, para tener acceso al i-simo elemento del array se escribe nombre_array[i-1].

Acceso a los elementos

Primer elemento: altura_personas[0]=1.39 Segundo elemento: altura_personas[1]=1.57 Tercer elemento: altura_personas[2]=1.56 ... Sexto y ltimo elemento: altura_personas[5]=1.66

Array: instrucciones vlidas


A[1] = 3; X = A[4]; cin >> A[6]; cout << A[10]; A[1] = A[b+2]; Y = Suma (A[i], b, c); b = A[6] / 2;

Note que cada elemento de un vector puede usarse como una variable cualquiera.

Inicializacin de un Array: ejemplo 1


Inicializar con valores constantes P.e. inicializar los elementos de un vector de N elementos enteros en cero.
#define N 100 //Declaracin del vector y del subndice int vector[N], i;

for (i = 0; i < N; i++) vector[i] = 0; // Inicializacin de cada // elemento del vector en 0

Inicializacin de un Array: ejemplo 2


Inicializar usando variables P.e. inicializar los elementos de un vector de 10 elementos enteros con valores del 1 al 10.
int v1[10], i;
// Declaracin del vector y del subndice for (i = 0; i < 10; i++)

v1[i] = i + 1;

// Inicializacin de cada
// elemento del vector

Inicializacin de un Array: ejemplo 3


Inicializar mediante lectura P.e. inicializar los elementos de un vector de 30 elementos de tipo carcter con valores introducidos por el usuario
char frase[30]; // Declaracin del vector int indice; // Declaracin del subndice char car; cout<<Introduzca una frase\n; for (indice = 0; indice < 30; indice++) { cin>>car; frase[indice] = car; }

Inicializacin de un Array

Existen varias formas de predefinir los valores que puede contener un vector:
int a[8] = {0}; a[0]=a[1]=a[2]=a[3]=a[4]=a[5]=a[6]=a[7]=0 float n[5] = {0.25, 0.50, 0.75, 1.00, 1.25}; n[0]=0.25 n[1]=0.50 n[2]=0.75 n[3]=1.00 n[4]=1.25 char cdn[8] = {S, I, , a, l, l, i, ,}; cdn[0]=S cdn[1]=I cdn[2]= cdn[3]=a cdn[4]=l cdn[5]=l cdn[6]=I cdn[7]=,

Todos los elementos del vector no tienen asignado valores iniciales:


int a[8] = {1, 2, 3}; a[0]=1 a[1]=2 a[2]=3 a[3]=0a[4]=0 a[5]=0 a[6]=0 a[7]=0 float n[5] = {0.25, 0.00, 0.30}; n[0]=0.25 n[1]=0.00 n[2]=0.30 n[3]=0.00 n[4]=0.00 char cadena[11]=Una Cadena;

Ejercicio

Calcular la suma de los elementos de un vector


void main(){ int a[8] = {1, 3, 5, 4, 7, 2, 99, 16},

i, total = 0;
for (i = 0; i < 8; i++)

total += a[i];
cout<<la suma de los elementos es: <<total; }

Array multidimensional

Notacin Algortmica de los Arreglos multidimensionales


tipo_dato nombre[dim1][dim2]...[dimn]

Las matrices (arreglos de dos dimensiones) son un caso particular de los arreglos multidimensionales.
tipo_dato nombre[dim1][dim2]

Array bidimensional: Matriz

Grupo de localidades consecutivas de memoria relacionadas por el hecho que tienen el mismo nombre y tipo (matrices de enteros, matrices de reales, matrices de caracteres, etc.). Cada localidad (o grupo de localidades) representa un elemento de la matriz. Cada elemento de la matriz es accedido mediante el nombre de la matriz y dos subndices (fila, columna), uno que representa la posicin numrica (entero no negativo) de dicho elemento dentro de una fila y el otro que representa la posicin numrica (entero no negativo) de dicho elemento dentro de una columna.
nombre_matriz[fila][columna]

Matriz: representacin grfica

M3x4: Matriz de tres (3) filas y cuatro (4) columnas cuyo nombre es M

Declaracin de una matriz


int A[12][4]; char cdn[8][2]; float b[100][100], x[27][27]; int matrix[3][6] = {{16, 21, 8, 3, -7, 9}, {-3, 11, 0, 5, 9, 7}, {13, 7, -64, 19, 14, 2}}

matrix

Acceso a una matriz

Cada elemento de la matriz es accedido mediante el nombre de la matriz y la posicin numrica de dicho elemento dentro de la matriz (subndices).
nombre_matriz[fila][columna]

P.e.
matrix

matrix[0][0]=16 matrix[0][1]=21 matrix[0][2]=8 matrix[0][3]=3 matrix[1][0]=-3 matrix[1][1]=11 matrix[1][2]=0 matrix[1][3]=5 matrix[2][0]=13 matrix[2][1]=7 matrix[2][2]=-64 matrix[2][3]=19

Ejercicios

Matriz simtrica
void main() { int matriz[3][3]; int fil, col, ok; cout<<ingreso de datos:; for(fil =0; fil<3; fil++) for(col =0; col<3; col++) cin>>matriz[fil][col]; ok = 1; for(fil =0; fil<3; fil++) for(col =0; col<3; col++) if(matriz[fil][col] != matriz[col][fil]) ok = 0; if(ok) cout<<Si es simtrica; else cout<<No es simtrica; }

Ejercicios

Suma de filas, columnas y diagonales


//Suma de Diagonal Principal for(fil =0; fil<3; fil++) sumaDiag + = matriz[fil][fil]; cout<<Suma de Diagonal <<SumaDiag;
//Suma de Diagonal Inversa for(fil=0,col=2; fil<3,col>=0; fil++,col--) SumaInv += matriz[fil][col]; cout<<Suma de Diagonal Inversa<<SumaInv; }

void main() { int matriz[3][3], sumafila; int sumaDiag; inr fil, col; cout<<ingreso de datos:; for(fil =0; fil<3; fil++) for(col =0; col<3; col++) cin>>matriz[fil][col]; //Suma de filas for (fil =0; fil<3; fil++){ sumafila = 0; for(col =0; col<3; col++) sumafila+= matriz[fil][col]; cout<<Suma de fila <<fil <<sumafila; }

Cadenas de caracteres

Generalmente hablamos, que un string es una secuencia de caracteres. P.e.: hello, high school, H2O. Las operaciones que son tipicamente deseables en las cadenas de caracteres son:
Concatenacin: high+school=highschool Comparaciones: high<school // alfabeticamente Encontrar/recuperar/modificar/eliminar/insertar subcadenas en una cadena determinada.

Cadenas de caracteres en C
24

En C, una cadena de caracteres puede ser definida como un array de caracteres o un puntero a caracteres

Un array de caracteres, tal como char str[ ]=high; Un puntero a caracteres, tal como char *p = high;

En un arreglo de caracteres, el ultimo elemento del arreglo debe ser igual a \0, el mismo que representa el final de la cadena. P.e., el arreglo str[] es realmente de longitud 5:
str[0]=h str[1]=i str[2]=g str[3]=h str[4]=\0

Por lo que el arreglo debe ser declarado como :


char str[5] = {h,i, g,h,\0};

Si de declara como char str[4]={h,i,g,h}; entonces str es un arreglo de caracteres pero no una cadena. En char *p=high; el sistema ubica 5 espacios de memoria del tamao de un caracter, y almacena high en los primeros 4, y \0 en el 5to lugar.
CS 103

Cadenas de caracteres en C

Declaracin:
char nombre[dim];

donde dim = nro. de caracteres de la cadena + 1 P.e.:


#define MAXCAR 256 // Numero mx.de caracteres es 256 char palabra[MAXCAR];

Se puede inicializar la cadena de caracteres al declararla:


char palabra[MAXCAR]={H, o, l, a, \0}; char palabra[MAXCAR]=Hola; char palabra[]=Hola; // Longitud max. de la cadena es 5 (4 caracteres + \0)

Cadenas de caracteres

Acceso

Para tener acceso a los elementos de una cadena se utiliza un subndice .


palabra[0] = H; palabra[1] = o; palabra[2] = l; palabra[3] = a; palabra[4] = \0;

P.e.

Funciones gets()

Lee una cadena de caracteres formada por varias palabras separadas por espacios en blanco. Es un puntero a la cadena de caracteres, reemplaza el \n por \0. Normalmente trabaja junto con el printf();

Ejercicio

Funcin que devuelve la longitud de cadena.


void main() { char linea[80]; int longitud; printf(Introduzca texto: ); longitud = 0 gets(linea); while(linea[longitud++]!= \0); cout<<linea; cout<<\nLa longitud de la linea es: <<longitud; }

Ejercicio

Escribir un programa en C que lea una secuencia de caracteres ASCII y escriba una secuencia de caracteres codificados. Si el carcter es una letra o dgito, ser reemplazado por el siguiente carcter en el conjunto de caracteres, excepto Z que ser reemplazado por A, z por a y 9 por 0. Por tanto, 1 se transforma en 2, C en D, p en q, etc. Cualquier carcter que no sea letra o dgito ser reemplazado por un punto (.). #define MAXCAR 80 void main() { char linea[MAXCAR]; int cont; gets(linea); for (cont=0; linea[cont]!=\0; cont++) if(((linea[cont]>=0) && (linea[cont]<9))|| ((linea[cont]>=A) && (linea[cont]<Z))|| ((linea[cont]>=a) && (linea[cont]<z)) putchar(linea[cont] + 1); else if (linea[cont]==9) putchar(0); else if (linea[cont]==Z) putchar(A); else if (linea[cont]==z) putchar(a); else putchar(.) }

Librera en C <strings.h> para operaciones con cadenas

strcat(cadena1, cadena2) Aade la cadena2 a la cadena1. strchr(cadena, car) Devuelve un puntero a la primera ocurrencia de car en cadena. strcmp(cadena1, cadena2) Compara cadena1 con cadena2 y de vuelve un valor: <0, =0, >0.

Ejercicio

void main() { char esp[3][6]={ayer,casa,hola}; char ing[3][10]={yesterday,house, hi}; char palabra[10]; printf(Ingrese palabra: ); gets(palabra); for(int i=0;i<3;i++) if(strcmp(palabra,esp[i])==0) cout<<esp[i]<<traducido <<ing[i]; }

Librera en C <string.h> para operaciones con cadenas

strcpy(cadena1, cadena2) Copia cadena2 en cadena1. strcspn(cadena1, cadena2) Devuelve el nmero de caracteres ledos de la cadena1 hasta que halla alguno de los caracteres de cadena2. strtok(cadena1, cadena2) Rompe cadena1 en segmentos o tkens, esto depende de la secuencia de caracteres de cadena2 (delimitadores).

Ejercicios

#include <iostream.h> #include <string.h> int main() { char s1[13]="Hola a todos"; char s2[5]="abcd"; cout<<"s1= <<s1<<endl; cout<<"s2= <<s2<<endl; cout<<"strcspn(s1,s2)=<<strcspn(s1,s2) <<endl; return 0; }

Ejercicios
#include <iostream.h> #include <string.h> int main() { char s1[49]="Esto es un ejemplo para usar la funcion strtok()"; char s2[4] = \n\t"; char *ptr; cout<<"s1 = "<<s1<<endl; ptr=strtok(s1,s2); // Primera llamada => // Primer token cout<<ptr<<endl; while((ptr=strtok(NULL,s2))!=NULL ) //posteriores //llamadas cout<<ptr<<endl; return 0;
}

Librera en C <strings.h> para operaciones con cadenas


strlwr(cadena) strupr(cadena) strset(cadena, car) Funciones de Conversin:


atof(cadena) atoi(cadena) atol(cadena) itoa(valor, cadena, base)

Ejercicios

void main() { char cadena[20]; int num; cout<<ingrese numero: ; cin>>num; itoa(num,cadena,2); cout<<cadena; }

Funciones miembro de entrada en C++

Los programas de C++ usan el cin y el operador de extraccin para realizar operaciones de entrada. Para programas mas complejos se utilizar las funciones miembro de entrada como:
getline: Captura una lnea de texto. gcount: Extrae el nmero de caracteres ingresados. get: Captura carcter por carcter. peek: Lee caracteres hasta un carcter especfico.

Ejercicios
#include <iostream.h> void main() { char text[64]; cout<<Digite una lnea de texto y pulse Enter: ; cin.getline(text,sizeof(text)); cout<<Usted digito: <<text<< que tiene <<cin.gcount<<caracteres; }

Ejercicios
#include <iostream.h> #include <ctype.h> void main(void) { char letra; cout<<"Digite una S o una N: "; do{ letra = cin.get(); letra = toupper(letra); }while((letra != 'S') && (letra != 'N')); cout<<endl<<"Usted digito: <<letra<<endl; }

Ejercicios

Si la entrada es:

Joel Juarez 555-1212 Juan Alvarez 222-2323 BeatrizJardon 333-3343

Y deseamos imprimir solo


Joel Juarez Juan Alvarez BeatrizJardon

Ejemplo
void main(void) { char letra, cadena[128]; int i=0, done=0; cout<<"Digite una cadena que termine en un carcter numerico"; do{ letra=cin.peek(); if(!isdigit(letra)) cadena[i++]=cin.get(); else done=1; }while((!done) && (i<sizeof(cadena))); cadena[i]=NULL; cout<<"Cadena digitada: <<cadena<<endl; }

La clase string en C++


42

C++ tiene una libreria <string> Cuando requieras utilizarla en tus programas debes de colocar : #include <string> En esta libreria se define e implementa la clase string Es conveniente su uso y facil de procesar las cadenas de caracteres en C.

Declaracin de strings
43

Las siguientes instrucciones son equivalentes En ellas se declara x como un objeto de tipo string, al cual se le asigna la cadena high school :

string x(high school);


string x=high school;

string x; x=high school;

Operaciones con strings


44

Concatenacin Dados x y y dos strings Para concatenar x y y, escribimos : x+y


string x= high; string y= school; string z; z=x+y; cout<<z=<<z<<endl; z =z+ was fun; cout<<z=<<z<<endl;

Salida: z=highschool z= highschool was fun

Concatenacin con estilos diferentes de cadenas


45

En s=u+v+w donde s es de tipo string,

u puede ser
Un

objeto string, o Un cadena al estilo C (un array de caracteres o un puntero a caracteres), Una cadena en comillas dobles.

Igualmente v y w. Pero por lo menos u, v o w deben ser un objeto string

Ejercicio
46

string x=high; char y[]=school; char z[]={w,a,s,\0}; char *p=good; string s=x+y+ +z+ very+ +p+!; cout<<s=<<s<<endl; cout<<s=+s<<endl;

Salida: s=highschool was very good! s=highschool was very good!

Concatenacin con operador +=


47

Dado x que es un objeto string. La instruccin


x += y;

es equivalente a
x=x+y;

donde y puede ser un objeto string, una variable al estilo de C, una variable char o una cadena en comillas dobles.

Operadores de comparacin para objetos string


48

Para comparar dos strings x y y utilizar los operadores: ==, !=, <, <=, >, >= La comparacin es alfabtica La respuesta de cada comparacin es: true o false La comparacin funciona siempre y cuando al menos X o Y sea un objeto string. La otra cadena puede ser un objeto string, una variable de cadena tipo C, o una cadena entre comillas dobles.

Ejercicio
49

string x= high; char y[]= school; char *p = good; if (x<y) cout<<x<y<<endl; If (x<tree) cout<<x<tree<,endl; If (low!=x) cout<<low != x<<endl; if (p>x) cout<<p>x<<endl; else cout<<p<=x<<endl;

Salida: x<y x<tree low != x p>x

El operador de ndice []
50

Si x es un objeto string, y se quiere obtener el valor de la k-simo caracter de la cadena, usamos tambien: x[k];
string x= high; char c=x[0]; // c es h c=x[1]; // c es i c=x[2]; // c es g

Esta caracteristicas hace que los objetos string sean igual que los arreglos de chars.

Obtener la longitud de un objeto string y verificar si est vaco


51

Para obtener la longitus de un objeto string x, invocaremos al mtodo length() o al mtodo size():
int len=x.length( ); --o-int len=x.size( );

Para verificar si x esta vaco, es decir, no tiene caracteres:


bool x.empty();

Obtener subcadenas de objetos strings


52

Si x es un objeto string, y queremos obtener a subcadena que empieza en la posicin pos y tiene len caracteres (donde pos y len son de tipo int), escribimos:
string y = x.substr(pos,len);

El valor por defecto para len es x.length( ) El valor por defecto para pos es 0
string y = x.substr(pos);//x[pos..end-1]

Insertando una cadena dentro de otra


53

Suponga que x es un objeto string, y y es otra cadena que sera insertada en la posicin pos de la cadena x Para insertar y, hacemos:
x.insert(pos,y);

El argumento y puede ser: un objeto string, una variable cadena al estilo C, o una cadena en comillas dobles.

Remplazando una subcadena por otra


54

Dado x un objeto string, y supongamos que deseamos reemplazar los caracteres de x que se encuentran en el rango [pos,pos+len) por una cadena y. Para esto, escribimos:
x.replace(pos,len,y);

El argumento y puede ser: un objeto string, una variable cadena al estilo C, o una cadena en comillas dobles.

Eliminando una subcadena de un objeto string


55

Suponga x un objeto string, y que desea eliminar los caracteres en el rango [pos,pos+len) en x. Para esto escribimos:
x.erase(pos,len);

El valor por defecto para len es x.length( )


x.erase(pos); // erases x[pos..end-1]

El valor por defecto para pos es 0 Para eliminar todo la cadena x: x.clear( );

Buscando patrones en cadenas


56

Suponga x un objeto string, y deseamos buscar una cadena y en x. Escribimos:


int startLoc = x.find(y);

Este mtodo retorna el indice donde empieza la ocurrencia de ms a la izquierda de y en x, si no hay ocurrencias de y en x, devuelve la longitud de x. Para que la bsqueda empiece en la posicin pos, hacer:
int startLoc = x.find(y, pos);

Buscando patrones en cadenas


57

Para buscar la ocurrencia de y en x de ms a la derecha, hacemos:


startLoc = x.rfind(y); // or startLoc = x.rfind(y, pos);

En todas las versiones de find y rfind, el argumento y puede ser un objeto string, una variable cadena al estilo C, una cadena en comillas dobles, una variable de tipo char, o un caracter en comillas simples.

Ejercicios
58

string x=FROM:ayoussef@gwu.edu; int colonPos=x.find(:); string prefix=x.substr(0,colonPos); //=FROM string suffix = x. substr(colonPos+1); cout<<-This message is from <<suffix<<endl;

Salida: -This message is from ayoussef@gwu.edu

Ejercicio
59

este codigo lee lneas de cadenas desde un archivo y las agrega a un objeto string llamado body. Esto lo hace hasta que encuentra una lnea igual a ##########

#include <fstream> ifstream in(inputFileName.txt); string body; char line[1000]; while(in.getline(line,1000)){ string lineString(line); if (lineString != "##########") body += lineString +'\n; else break; // exits the while loop }
CS 103

Recorte de espacios iniciales y finales


60

void main (){ string x; cin>>x; int k = 0; while(k<x.size() &&(x[k]==' ' || x[k]=='\t' || x[k]=='\n')) k++; x.erase(0,k); int s=x.size(); while(s>0 &&(x[s-1]==' ' || x[s-1]=='\t' || x[s-1]=='\n')) s--; x.erase(s); }

Correspondencia entre la librera C y la clase string de C++


61

Funciones de la Librera C

Mtodos/operadores de la clase string en C++

Strcpy

= (the assignment operator)

Strcat strcmp strchr, strstr strrchr strlen

+= (assign+concat operator) = =, !=, <, >, <=, >= .find( ) method .rfind( ) method .size( ) or .length( ) methods

Вам также может понравиться