40
ALGORITMOS Y ESTRUCTURAS DE DATOS 1 CADENAS Una cadena de caracteres es un array unidimensional en el cual todos sus elementos son tipo char. Ejem.: char Obs[]=“Aprobado”; char color[]={‘g’,’r’,’i’,’s’,’\0’}; 0 1 2 3 4 5 6 7 8 \0’, es el carácter nulo en el cual c++ finaliza todas las cadenas de caracteres. char Obs[3]=“Descontado”; //Error porque el tamaño de la cadena es menor que lo declarado. Cuando declare una variable tipo cadena, debe tener en consideración al carácter nulo (‘\0’) en la longitud máxima de la cadena. char cadena[30]; // Declara cadena de 30 caracteres A p r o b a d o \0

Cadenas

Embed Size (px)

DESCRIPTION

Cadenas

Citation preview

Page 1: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 1

CADENAS

Una cadena de caracteres es un array unidimensional en el cual todos sus elementos son tipo char.

Ejem.: char Obs[]=“Aprobado”; char color[]={‘g’,’r’,’i’,’s’,’\0’}; 0 1 2 3 4 5 6 7 8

‘\0’, es el carácter nulo en el cual c++ finaliza todas las cadenas de caracteres.

char Obs[3]=“Descontado”; //Error porque el tamaño de la cadena es menor que lo declarado.

Cuando declare una variable tipo cadena, debe tener en

consideración al carácter nulo (‘\0’) en la longitud máxima de la

cadena.

char cadena[30]; // Declara cadena de 30 caracteres

A p r o b a d o \0

Page 2: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 2

La declaración anterior de la cadena se

muestra esquemáticamente así.

char producto[25]; // Declara cadena de 25 caracteres

0 1 2 3 ………………………………… 29

CADENAS

0 1 2 3 ………………………………… 24

Page 3: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 3

FUNCIONES DE CADENAS

El c++ nos proporcionan muchas funciones

estándares de cadena que nos permite hacer

operaciones con cadenas.

Las siguientes funciones requieren de la librería

string.h

Función strcpy()

strcpy(c1,c2);

Permite copiar la cadena c2 en c1, lo cual implica

que el contenido original de c1 se pierde.

char c1[]=“Programa”;char c2[]=“Algoritmos”;

strcpy(c1,c2); // el contenido de c1 será Algoritmos

Page 4: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 4

FUNCIONES DE CADENAS

#include<iostream>

#include<string.h>

using namespace std;

// Funcion principal

int main()

{ char c1[]="Fundamentos";

char c2[]="Teoricos";

cout<<"\nc1="<<c1<<endl;

strcpy(c1,c2);

cout<<"c1="<<c1<<endl;

}

Page 5: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 5

FUNCIONES DE CADENAS

• Función strncpy() strncpy(c1,c2,n);

Permite copiar los n primeros caracteres de la

cadena c2 en c1. Si n es mayor que la longitud de

c1, ocurre un error. #include<iostream>

#include<string.h>

using namespace std;

// Funcion principal

int main()

{ char c1[]="Fundamentos de programacion";

char c2[]="Teoria de grafos";

cout<<"\nc1="<<c1<<endl;

strncpy(c1,c2,6); cout<<"c1="<<c1<<endl;

}

Page 6: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 6

FUNCIONES DE CADENAS

• Función strcat() strcat(c1,c2);

Permite concatenar la cadena c2 en c1, es decir

la longitud de la cadena c1 aumentara.

char c1[]=“Programa”;strcat(c1,“Algoritmos”);

// el contenido de c1 será

Page 7: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 7

FUNCIONES DE CADENAS

• Función strncat() strncat(c1,c2,n);

Permite concatenar los n primeros caracteres de

la cadena c2 en c1, lo cual implica que el

contenido original de c1 aumenta. #include<iostream>

#include<string.h>

using namespace std;

// Funcion principal

int main()

{ char c1[]="Fundamentos de programacion";

char c2[]="Teoria de grafos";

cout<<"\nc1="<<c1<<endl;

strncat(c1,c2,6); cout<<"c1="<<c1<<endl;

}

Page 8: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 8

FUNCIONES DE CADENAS

• Función strcmp() strcmp(c1,c2);

Permite comparar la cadena c1 y c2, la función

puede devolver 0, si la cadena c1 es igual a c2, 1

si la cadena c1 es mayor que c2 o -1 si la cadena

c1 es menor que c2. #include<iostream>

#include<string.h>

using namespace std;

// Funcion principal

int main()

{ char c2[]="Fundamentos de programacion";

char c1[]="Teoria de grafos"; cout<<endl;

if(strcmp(c1,c2)==0)

cout<<c1<<" es igual a "<<c2<<endl;

else if(strcmp(c1,c2)>0)

cout<<c1<<" es mayor que "<<c2<<endl;

else

cout<<c1<<" es menor que "<<c2<<endl;

}

Page 9: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 9

FUNCIONES DE CADENAS

• Función strncmp() strncmp(c1,c2,n);

Permite comparar hasta n caracteres de c1 con la

cadena c2, la función puede devolver 0, si la

porción de cadena c1 es igual a c2, 1 si la porción

de la cadena c1 es mayor que c2 o -1 si la

porción de la cadena c1 es menor que c2.

• Función strupr() strupr(c);

Permite convertir la cadena c a mayúsculas.

• Función strlwr() strlwr(c);

Permite convertir la cadena c a minúsculas.

Page 10: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 10

FUNCIONES DE CADENAS

• Función strset() strset(c1,c);

Permite sustituir todos los caracteres de c1 por el

carácter c, excepto el carácter ‘\0’.

#include<iostream>

#include<string.h>

using namespace std;

// Funcion principal

int main()

{ char c1[]="Fundamentos de programacion";

strset(c1,'P');

cout<<"\nc1="<<c1<<endl;

}

Page 11: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 11

FUNCIONES DE CADENAS • Función strchr()

strchr(c,c1);

Esta función devuelve un puntero de la primera

ocurrencia del caracter c1 en la cadena c, o un valor

NULL si el carácter no es encontrado. #include<iostream>

#include<string.h>

using namespace std;

// Funcion principal

int main()

{ char d[40], c1[]="Fundamentos de programacion";

strcpy(d,strchr(c1,'m'));

cout<<"\nc1="<<c1<<endl;

cout<<"d="<<d<<endl;

}

Page 12: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 12

FUNCIONES DE CADENAS

• Función strrchr() strrchr(c,c1);

Esta función devuelve un puntero de la ultima

ocurrencia del carácter c1 en la cadena c, o un valor

NULL si el carácter no es encontrado. #include<iostream>

#include<string.h>

using namespace std;

// Funcion principal

int main()

{ char d[40], c1[]="Fundamentos de programacion";

strcpy(d,strrchr(c1,'m')); cout<<"\nc1="<<c1<<endl;

cout<<"d="<<d<<endl;

}

Page 13: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 13

FUNCIONES DE CADENAS

• Función strnset() strnset(c1,c,n);

Permite reemplazar los n primeros caracteres de c1

por el carácter c. #include<iostream>

#include<string.h>

using namespace std;

// Funcion principal

int main()

{ char c1[]="Fundamentos de programacion";

strnset(c1,'r',5); cout<<"\nc1="<<c1<<endl;

}

Page 14: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 14

FUNCIONES DE CADENAS

• Función strlen() strlen(c);

Esta función devuelve la longitud de la cadena c.

#include<iostream>

#include<string.h>

using namespace std;

// Funcion principal

int main()

{ char c1[]="Fundamentos de programacion";

int n;

n=strlen(c1);

cout<<"\nLa longitud de c1="<<n<<endl;

}

Page 15: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 15

FUNCIONES DE CADENAS

• Función strtok() strtok(c1,c);

Esta función divide la cadena c1 en una serie de tokens. Un

tokens es una secuencia de caracteres separados por

delimitadores, c es el carácter delimitador. #include <iostream>

#include <string.h>

using namespace std;

int main ()

{ char c[]="Me gusta programar en c++";

char *p;

p=strtok (c," ");

while (p!= NULL)

{ cout<<p<<endl;

p=strtok (NULL," ");

}

}

Page 16: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 16

FUNCIONES DE CADENAS

• Función strcmpi() strcmpi(c1,c2);

Permite comparar la cadena c1 y c2, la función puede devolver 0,

si la cadena c1 es igual a c2, 1 si la cadena c1 es mayor que c2 o

-1 si la cadena c1 es menor que c2. No hace distinción entre

mayúsculas y minúsculas. #include<iostream>

#include<string.h>

using namespace std;

// Funcion principal

int main()

{ char c2[]="Fundamentos";

char c1[]="FUNDAMENTOS"; cout<<endl;

if(strcmpi(c1,c2)==0)

cout<<c1<<" es igual a "<<c2<<endl;

else if(strcmp(c1,c2)>0)

cout<<c1<<" es mayor que "<<c2<<endl;

else

cout<<c1<<" es menor que "<<c2<<endl;

}

Page 17: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 17

FUNCIONES DE CADENAS

• Función strstr() strstr(c1,c2);

Esta función devuelve un puntero de la primera

ocurrencia de la cadena c2 dentro de la cadena c1, o

NULL si c2 no se encuentra en la cadena c1. #include<iostream>

#include<string.h>

using namespace std;

// Funcion principal

int main()

{ char c1[]="Fundamentos de programacion";

char c2[]="tos";

char *c3;

c3=strstr(c1,c2);

cout<<"C3="<<c3<<endl;

}

Page 18: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 18

FUNCIONES DE CADENAS • Las siguientes funciones requieren de la librería

stdlib.h

• Función atoi()

atoi(c);

Convertir una cadena numérica a un numero entero.

• Función atol()

atol(c);

Convertir una cadena numérica a un numero entero

largo.

• Función atof()

atof(c);

Convertir una cadena numérica a un numero flotante.

Page 19: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 19

FUNCIONES DE CADENAS #include<iostream>

#include<stdlib.h>

using namespace std;

// Funcion principal

int main()

{ char c1[]="2456"; int n1;

char c2[]="21475836"; long int n2;

char c3[]="16859.5"; float n3;

n1=atoi(c1); n2=atol(c2);n3=atof(c3);

cout<<"n1="<<n1<<endl;

cout<<"n2="<<n2<<endl;

cout<<"n3="<<n3<<endl;

}

Page 20: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 20

FUNCIONES DE CADENAS • Las siguientes funciones requieren de la librería stdio.h y

iostream.h

• Función gets()

gets(c);

Lee una cadena y lo almacena en la variable c.

• Función puts()

puts(c);

Permite escribir la cadena c, automáticamente hace el

cambio de línea.

• Función cin.getline()

cin.getline(c,n,’\n’);

Lee una cadena de n caracteres o hasta que se pulse

la tecla enter y lo almacena en la variable c.

Page 21: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 21

FUNCIONES DE CARACTER

• Para usar estas funciones se requiere la

librería ctype.h

• Función isalpha() isalpha(c);

Verifica si c es un carácter alfabético que esta

comprendido entre ‘A’..’Z’ o ‘a’..’z’, de ser así

devuelve verdadero, caso contrario falso.

• Función isdigit() isdigit(c);

Verifica si c es un digito (‘0’…’9’) si es verdad

devuelve verdadero, caso contrario retorna falso.

Page 22: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 22

FUNCIONES DE CARACTER

• Función isupper() isupper(c);

Verifica si c es un carácter alfabético que esta

comprendido entre ‘A’..’Z’, de ser así devuelve

verdadero, caso contrario falso.

• Función islower() islower(c);

Verifica si c es un carácter alfabético que esta

comprendido entre ‘a’…’z’, si es verdad devuelve

verdadero, caso contrario retorna falso.

• Función tolower() tolower(c);

Convierte el carácter c de mayúsculas a minúsculas.

Page 23: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 23

FUNCIONES DE CARACTER • Función toupper()

toupper(c);

Convierte el carácter c de minúsculas a mayúsculas.

• Función toascii()

toascii(c);

Devuelve el código Ascii del carácter c.

• Función ispunct()

ispunct(c);

Devuelve verdadero si carácter es un carácter de

puntuacion.

• Función isalnum()

isalnum(c);

Devuelve verdadero si c es un carácter alfanumérico.

Page 24: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 24

FUNCIONES DE CARACTER

• Requieren de la librería stdio.h y iostream.h

• Función getchar()

variable=getchar();

Captura un carácter, el carácter ingresado se

muestra en pantalla, no es necesario presionar la

tecla enter.

• Función putchar()

putchar(c);

Escribe el carácter c.

• Función cin.get()

cin.get(c);

Permite leer un carácter cualquiera.

Page 25: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 25

FUNCIONES DE CARACTER

• Funcion getch() //Requieren de la librería conio.h

variable=getch();

Captura un carácter, el carácter ingresado no se muestra en

pantalla, no e necesario presionar la tecla enter. #include<iostream>

#include<stdio.h>

#include<conio.h>

using namespace std;

// Funcion principal

int main()

{ char car,car1; cout<<"Uso del getcha():";

car=getchar();

while(car!='\n')

car=getchar();

cout<<endl<<"Uso del getch():"; car1=getch();

while(car1!=13)

{cout<<car1; car1=getch();

}

cout<<endl;

}

Page 26: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 26

FUNCIONES DE CADENAS

#include <iostream>

#include <string.h>

using namespace std;

int main()

{ char c[]="Relaciones entre los objetos en una jerarquía de herencia";

char *d, p, cad[20], c1[10],c2[10];

int n;

cout<<c<<endl;

cout<<"Caracter:";

cin>>p;

cout<<"Cadena:";fflush(stdin);gets(cad);

cout<<"Ingrese cadena 1:";gets(c1);

cout<<"Ingrese cadena2:";gets(c2);

n=strcmp(c1,c2);

Page 27: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 27

FUNCIONES DE CADENAS

if(n==0)

cout<<"Las cadenas son exactamente iguales"<<endl;

else if(n>0)

cout<<"\""<<c1<<"\" es mayor que "<<"\""<<c2<<"\""<<endl;

else

cout<<"\""<<c1<<"\" es menor que "<<"\""<<c2<<"\""<<endl;

for(d=strtok(c," ");d!=NULL;)

{ cout<<d<<endl;

d=strtok(NULL," ");

}

cout<<endl;

cout<<strnset(c,'*',3)<<endl;

Page 28: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 28

FUNCIONES DE CADENAS

if(isalnum(p))

cout<<p<<" es un caracter alfanumerico"<<endl;

if(isalpha(p))

cout<<p<<" es un caracter entre A..Z, o a...z"<<endl;

else if(isdigit(p))

cout<<p<<" Es un digito que esta entre 0..9"<<endl;

else if(ispunct(p))

cout<<p<<" Es un caracter de puntuacion"<<endl;

cout<<cad<<" como numero entero es "<<atoi(cad)<<endl;

cout<<endl;

system("pause");

}

Page 29: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 29

FUNCIONES DE CADENAS

Page 30: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 30

// Programa que usa las funciones strchr, strrchr,strstr y strcmpi

#include <string.h>

#include <iostream>

using namespace std;

int main()

{

char string[15], cad[15];

char *p,*q,*r, c;

cout<<"Ingrese cadena:";gets(string);

cout<<"Ingrese caracter a buscar:";cin>>c;

p = strchr(string, c);

PROBLEMAS CON CADENAS

Page 31: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 31

if(p==NULL)

cout<<"El caracter \""<<c<<"\" no se encuentra en \""<<string<<"\"\n\n";

else

{ cout<<"\nLa cadena al cual apunta es:"<<p<<endl;

cout<<"\nLa cadena original es:"<<string<<endl;

cout<<"\nEl caracter "<<c<<" se encuentra en la posicion "<<p-

string<<endl;

}

cout<<"\nIngrese caracter a buscar:";cin>>c;

q = strrchr(string, c);

PROBLEMAS CON CADENAS

Page 32: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 32

if(q==NULL)

cout<<"El caracter \""<<c<<"\" no se encuentra en \""<<string<<"\"\n\n";

else

{ cout<<"\nLa cadena al cual apunta es:"<<q<<endl;

cout<<"\nLa cadena original es:"<<string<<endl;

cout<<"\nEl caracter "<<c<<" se encuentra en la posicion "<<q-string<<endl;

cout<<endl;

}

cout<<"\nIngrese cadena:";

fflush(stdin);gets(cad);

PROBLEMAS CON CADENAS

Page 33: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 33

if(strcmpi(string,cad)==0)

cout<<"\""<<string<<"\" es igual a \""<<cad<<"\""<<endl;

else if(strcmpi(string,cad)>0)

cout<<"\""<<string<<"\" es mayor que \""<<cad<<"\""<<endl;

else

cout<<"\""<<string<<"\" es menor que \""<<cad<<"\""<<endl;

r = strstr(string,cad);

if(r==NULL)

cout<<"La cadena \""<<cad<<"\" no se encuentra en \""<<string<<"\"\n\n";

else

{ cout<<"\nLa cadena al cual apunta es:"<<r<<endl;

cout<<"\nLa cadena original es:"<<string<<endl;

cout<<"\nLa cadena "<<cad<<" se encuentra en la posicion "<<r-string<<endl;

}

PROBLEMAS CON CADENAS

Page 34: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 34

strset(cad,'&');

cout<<"\nAhora la cadena es:"<<"\""<<cad<<"\""<<endl<<endl;

strnset(string,'*',5);

cout<<"\nAhora la cadena es:"<<"\""<<string<<"\""<<endl<<endl;

}

PROBLEMAS CON CADENAS

Page 35: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 35

Es posible también declarar vector de cadenas, para ello

se agrega una dimensión mas.

char v[30][15];La declaración anterior del vector de

cadena se mostraría así. longitud de 15

0

1

2

...

29

VECTOR DE CADENAS

Page 36: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 36

Es posible también declarar una matriz de cadenas, para

ello se agrega dos dimensiones mas.

char q[30][4][20];La declaración anterior de la matriz de

cadena se mostraría así. longitud de 20

0

1

2

...

29

MATRIZ DE CADENAS

0 1 2 3

Page 37: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 37

/* Implementar la siguiente funcion:

int GeneraVectorCadena( char c[],char nC[N][M], char car)

donde C es la cadena original, nC es el vector de cadenas a generar

y car es un caracter alfabetico cualquiera. Implementar la funcion

que genere el vector cuyo contenido sean las palabras que

empiezan con el caracter car y que devuelva la cantidad de

elementos de dicho vector. */

#include <iostream>

#include <string.h>

const int N=254,M=254;

using namespace std;

int GeneraVectorCadena( char c[],char nC[N][M], char car)

{ int i=0,x,p=0,j=0;

char k[254]; strcat(c," ");

PROBLEMAS CON CADENAS

Page 38: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 38

while((c[i]!=' ') && (c[i]!='\0'))

{ x=c[i];

if(x==car)

{ while(c[i]!=' ')

{ k[j]=c[i]; j++;i++;

}

k[j] ='\0'; strcpy(nC[p],k);k[0] ='\0'; j=0; p++;

}

else

while(c[i]!=' ')

i++;

i++;

}

return p;

}

PROBLEMAS CON CADENAS

Page 39: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 39

// Funcion que muestra el vector de cadena

void VerVector(char nC[N][M],int m)

{ int i;

for(i=0;i<m;i++)

cout<<"nC["<<i<<"]="<<nC[i]<<endl;

}

PROBLEMAS CON CADENAS

Page 40: Cadenas

A L G O R I T M O S Y E S T R U C T U R A S D E D A T O S 40

//programa principal

int main()

{ int n;

char cadena[N],nuevaC[N][M],letra;

cout<<"Cual es la cadena....? :"<<endl;

cin.getline(cadena,N);

cout<<"Ingrese el caracter..? :";cin>>letra;

n=GeneraVectorCadena( cadena,nuevaC,letra);

if(n!=0)

{VerVector(nuevaC,n);cout<<endl<<"Tiene "<<n<<" elementos"<<endl;}

else

cout<<"\a\nVector no generado..."<<endl;

}

PROBLEMAS CON CADENAS