UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA UNAD ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA Lógica de Programación - 204022 CADENA DE CARACTERES Una vez se conceptualizó el concepto fundamental de lo que es un vector o arreglo unidimensional, se puede con gran facilidad hablar de cadena de caracteres, pues se comporta como un arreglo de este tipo, a diferencia de otros lenguajes que trae un tipo primitivo para el manejo de este tipo de datos, normalmente se denominan string La declaración es similar a un vector normal ejemplo: char cadena[10]; En este caso hemos abierto un arreglo de 10 espacios para manejar una cadena de 9 caracteres Observación si se debe definir una cadena con un espacio más, puesto que C++ reserva la última posición para identificar el fin de la cadena \0 Una cadena puede almacenar todo tipo de información de tipo alfanumérico como: nombres de personas, mensajes de error, números de teléfono, direcciones entre otras. La asignación directa sólo está permitida cuando se hace junto con la declaración. Por ejemplo: char S[5]; S = "UNAD" O también podemos realizar una asignación uno a uno así: char S [5]; S [0] = 'U'; S [1] = 'N'; S [2] = 'A'; S [3] = 'D'; S [4] = '/000'; 1 UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA UNAD ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA Lógica de Programación - 204022 Los elementos del tipo caracter (tipo char en lenguaje C) se pueden agrupar para formar secuencias que se denominan cadenas de caracteres, o simplemente cadenas. En este texto, y también en el texto de un programa en C, las cadenas se delimitan por dobles comillas. Por ejemplo, “CH?*$A7!” y “soy cadena” son dos cadenas, la primera formada por 8 caracteres y la segunda por 10. En la memoria del computador una cadena se guarda en un arreglo de tipo carácter, de tal manera que cada símbolo de la cadena ocupa una casilla del arreglo. Sin embargo, se utiliza una casilla adicional del arreglo para guardar un carácter especial que se llama terminador de cadena. En C y en el pseudocodigo este carácter especial es ´\0´. Como lo indica su nombre, la función de este carácter especial es indicar que la cadena termina. Las dos cadenas mencionadas arriba, se representan en la memoria del computador como lo indica la siguiente figura: La longitud de una cadena se define como el número de símbolos que la componen, sin contar el terminador de cadena. Es muy importante tener en cuenta que aunque el terminador de cadena no hace parte de la cadena, sí ocupa una casilla de memoria en el arreglo. PROGRAMACION EN FALCON C++ /*Escribir un programa que lea el nombre, la edad y el número de teléfono de un usuario y los muestre en pantalla.*/ #include <conio.h> #include <iostream> using namespace std; char Nombre[30]; // cadena para almacenar el nombre (29 caracteres) 2 UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA UNAD ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA Lógica de Programación - 204022 int Edad; // Un entero para la edad char Telefono[13]; // Y otra cadena para el numero de telefono (12 dígitos) int main() { // Mensaje para el usuario y captura de información cout << "Escriba su nombre : :"; cin>>Nombre; cout<<"\n Ingrese la edad" ; cin>>Edad; cout <<"Digite el numero de telefono "; cin>>Telefono; // Visualización de los datos leídos cout << "Nombre:" << Nombre << endl; // = "\n" cout << "Edad:" << Edad << endl; cout << "Teléfono:" << Telefono << endl; getch(); return 0; } Miremos que el teléfono se hubiese podido leer como un entero, pero es posible que se agreguen caracteres especiales como paréntesis o guiones, lo que lo convierten en alfanumérico Si ya lo sé, no funcionó como se quería, ahora prueba sin escribir espacios en la variable nombre… ahora si funciono verdad. Esto sucede porque la cin>> es un canal básico de entrada, el cual no permite la separación de cadena de caracteres. Afortunadamente C++ incorpora una serie de librerías que ayudan a manipular de manera adecuada este tipo de datos. La librería estándar de C++ iostream, contiene la cantidad de funciones pero las principales podemos decir que son 4: cin, canal de entrada estándar. cout, canal de salida estándar. cerr, canal de salida de errores. clog, canal de salida de diario o anotaciones Dedicaremos un tiempo a la función cin>>, por ser una de las más utilizadas, el objeto cin se pude emplear con: 3 UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA UNAD ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA Lógica de Programación - 204022 cin.getline( ), este llamado a función, puede resolver el problema del ejercicio anterior, cuando únicamente permitía la entrada de una cadena sin espacios, por tanto la función cin.getline permite leer una línea completa incluyendo los espacios, para el ejercicio anterior cin.getline(nombre,30), es necesario especificar la longitud máxima de la cadena a ingresar. cin.get( ): permite ingresar carácter por carácter, normalmente se acompaña de un ciclo condicional como while cin.put( ) Caso contrario del anterior, permite una salida de caracteres, uno a uno. Afortunadamente hay otra serie de librería que permite una manipulación adecuada de los caracteres, entre ellas: Librería string: librería estándar del ANSI C, entre sus principales funciones están: memchr: void *memchr (const void *s, int c, size_t n); Localiza la primera aparición de un carácter para en los primero n caracteres de una cadena Ejemplo #include <iostream.h> #include <stdio.h> #include <string.h> int main() { char cadena[] = "Mundo cruel..."; char *puntero; puntero = (char *)memchr( cadena, 'd', 15 ); cout<< cadena<<endl; cout<< puntero<<endl; return 0; } 4 UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA UNAD ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA Lógica de Programación - 204022 A continuación se presentaré un listado con las funciones de esta librería, esperando que usted profundice más es este aspecto memchr memcpy memset strchr strcoll strcspn strlen memcmp memmove strcat strcmp strcpy strerror strncat strncmp strpbrk strspn strtok strncpy strrchr strstr strxfrm Librería ctype ANSI C Contiene las funciones y macros de clasificación de caracteres tolower: convierte un carácter a minúscula Ejemplo: /* Mediante la utilización de un ciclo podemos convertir toda una cadena que esta en mayúsculas a minúsculas */ #include <stdlib.h> #include <iostream> #include <ctype.h> using namespace std; int main() { char cadena[ ] = "UNIVERSIDAD – UNAD-"; int i; for (i=0; cadena[i]; i++) cadena[i] = tolower(cadena[i]); cout << cadena << endl; system (“pause”); return 0; } toupper: El caso contrario de tolower convierte caracteres a mayúscula También contiene una serie de macros a las que les hago referencia a continuación 5 UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA UNAD ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA Lógica de Programación - 204022 isalnum isdigit ispunct toascii isalpha isgraph isspace isascii islower isupper iscntrl isprint isxdigit Ejemplo de funciones varias para manipular cadenas de caracteres. La mayoría vienen incorporadas en el archivo a incluir string.h Ejercicio: Dada una cadena de caracteres cuenta las palabras de un texto, calcula el porcentaje de vocales e imprime el texto al revés Manos a la obra Para dar solución al ejercicio se plantea realizar tres pasos sencillos los cuales son: defina las variables de entrada, proceso y salida que se van a utilizar para dar solución al enunciado. Para el caso particular se plantea las siguientes variables y cadena Entrada cad[500], Proceso Salida p, contar_vocales, porc, cont, V, aux, i, len El segundo paso es codificar en la herramienta Falcon C++ el programa, utilizando las mismas variables, y arreglo utilizados en el pseudocodigo #include <stdio.h> #include <conio.h> #include <string.h> #include <ctype.h> #include <iostream> using namespace std; int contar_vocales(char *); char cad[500],*p; 6 UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA UNAD ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA Lógica de Programación - 204022 int longi, i, x, P, R, V, longinP, len, NumeroAleatorio; int porc=0; int main(){ cout << "Ingrese un texto: "; gets(cad); longi = strlen(cad); //-------------------------------Contador palabras-----------------------------P=0; for(x=0;x<500;x++){ if(cad[x]==' ' && x!=499 && cad[x+1]!= ' ') P++; } cout << "\nCantidad de Palabras: " << P+1; //--------------------------------Porcentaje-----------------------------------cout << "\nCantidad de Vocales: " << contar_vocales(cad); V = contar_vocales(cad); cout << "\nCantidad de caracteres: " << longi-P; longinP= longi-P; porc= (V*100)/longinP; cout << "\nPorcentaje de vocales: " << porc << "Por ciento"; //---------------------------------- Al reves----------------------------------len = strlen(cad); cout << "\nTexto al reves: "; i=0; for(i=len;i>=0;i--){ cout << " " << cad[i]; } cout << "\n"; //--------------------------------------Piso-----------------------------------p=cad; while(*p!='\0'){ if(*p==' ') *p='_'; 7 UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA UNAD ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA Lógica de Programación - 204022 p++; } cout << "Con piso: \n" <<cad; getch(); }//Main -CuerpoPrincipal//--------------------------------Funcion--------------------------------------int contar_vocales(char *cad){ int cont=0; char *aux=cad; while(*aux){ if(*aux=='a'||*aux=='e'||*aux=='i'||*aux=='o'||*aux=='u') cont++; aux++; }//funcion return cont; }//contar_vocales 8