cadenas
DESCRIPTION
CadenasTRANSCRIPT
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
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
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
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;
}
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;
}
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á
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;
}
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;
}
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.
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;
}
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;
}
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;
}
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;
}
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;
}
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," ");
}
}
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;
}
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;
}
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.
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;
}
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.
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.
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.
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.
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.
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;
}
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);
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;
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");
}
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
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
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
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
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
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
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
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
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
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
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
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