Benemérita Universidad Autónoma de Puebla Facultad de Ciencias de la Computación M.C. Miguel Rodríguez Hernández Prácticas de Programación Otoño 2008 Nombre Alumno 1: Nombre Alumno 2: Nombre de la practica: Fecha : Número de Practica: 3 Cadenas de caracteres 3- Noviembre-2008 Objetivo: El alumno aprenderá a declarar, usar y manejar cadenas de caracteres en la programación estructurada utilizando Lenguaje C. Instrucciones: Formar equipos de 2 alumnos y completar las preguntas y ejercicios de la Práctica. Escriba también sus conclusiones y observaciones. Desarrollo: 1.- Escriba la respuesta de las siguientes definiciones: a) Escriba la definición de cadena de caracteres b) ¿Qué es el carácter NULL y para qué se usa?. c) Describa con un diagrama, cómo se declara una cadena en la memoria. d) ¿Puede declara una cadena sin especificar su tamaño?. Si/No. Dé un ejemplo. e) Para leer una cadena puedes usar las funciones: scanf()/printf() o gets()/puts(). Escribe la diferencia entre estas funciones y un ejemplo para leer su nombre, apellido paterno y apellido materno utilizando ambos grupos de funciones. 2.-Funciones predefinidas para manejar cadenas: Escriba su definición Éstas pueden ser accedidas a través del archivo, <string.h> . Algunas son: strcat(string1, string2) strcpy(string1, string2) strlen(string1) strchr(string, ch) strstr (string1, string2) strcmp(string1, string2) strtok(string1, string2) 3.- El siguiente programa ilustra el uso de algunas funciones predefinidas de cadenas. ¿Cuál es la salida? #include <string.h> #include <stdio.h> main() { char s1[81], s2[81]; gets(s1); gets(s2); printf(”longitudes: %d %d\n”, strlen(s1), if (!strcmp(s1, s2)) printf(”Las cadenas son iguales\n”); strcat(s1,s2);// printf(”%s\n”,s1); return 0; strlen(s2)); } 4.-¿Cuál es la salida del siguiente programa?. Ejecútalo y analízalo cuidadosamente. /* Programa que ilustra el almacenamiento y manipulación de cadenas en C */ #include <stdio.h> #include <string.h> int main (void) { char s[10] = "abcdefghi"; char * a; char * b; char c[10]; char * d; char e[25] = "0123456789"; char * f; char * four_in_e; char * e_in_e; char * X_in_e; /* inicialización */ a = s; b = a; strcpy (c, "uvwxyz"); d = c; f = strcat (e, s); resultado */ /* copia "uvwxyz" a c */ /* concatena e con s, dando e [y f] como /* imprime valores iniciales */ printf (" Valores iniciales de variables \n"); printf (" s: %s\n", s); printf (" a: %s\n", a); printf (" b: %s\n", b); printf (" c: %s\n", c); printf (" d: %s\n", d); printf (" e: %s\n", e); printf (" f: %s\n", f); /* modifica posiciones de alguna variables de cadena */ s[3] = 'm'; a[5] = 'p'; b[7] = 'r'; c[1] = 'k'; d[3] = 'q'; e[9] = 'N'; f[8] = 'Z'; /* Impresión después de las modificaciones */ printf ("Valores de las variables después de que alguna cadenas han cambiado printf printf printf printf printf printf printf \n"); (" s: (" a: (" b: (" c: (" d: (" e: (" f: %s\n", %s\n", %s\n", %s\n", %s\n", %s\n", %s\n", s); a); b); c); d); e); f); /* realiza algunas búsquedas */ four_in_e = strstr(e, "4"); e_in_e = strstr(e, e); X_in_e= strstr(e, "X");; /* imprime los resultados de las búsquedas */ printf ("Resultados de búsquedas \n"); printf (" Dirección base de la cadena e es %u \n", (unsigned) e); printf (" Índice de '4' en e es %u \n", (unsigned)four_in_e); printf (" Índice de e en e es %u \n", (unsigned)e_in_e); printf (" Índice de 'X' en e es %u \n", (unsigned)X_in_e); return 0; } 5.-Funciones predefinidas para manipular caracteres: Éstas se pueden acceder mediante la inclusión del encabezado del archivo , <ctype.h> Algunas funciones comunes son: isupper(ch) regresa distinto de cero si ch es mayúscula o cero en otro caso isalpha(ch) regresa un valor distinto de cero si ch es alfabético (mayúscula o minúscula ) o cero en otro isalnum(ch) regresa distinto de cero sic h es un valor alfabético (mayúscula o ,minúscula) o un dígito (0,1,..9), o 0 en otro caso isdigit(ch) regresa distinto de cero si ch es un digito (0, 1, …, 9) o 0 en otro caso tolower(ch) convierte ch a un carácter en minúscula toupper(ch) convierte ch a un carácter en mayúscula Escriba un programa que lea su nombre y apellidos con mayúsculas y minúsculas y escriba la entrada, primero todo en mayúsculas y luego todo en minúscula. 6.-Explique ampliamente, que realiza el siguiente programa: #include <stdio.h> #include <string.h> #include <ctype.h> int isvowel(char ch); // Function Prototype int main( ) { char str[81]; int len, i, nvowel=0, nupper=0, nlower=0; printf("Enter your string >"); gets(str); len=strlen(str); for (i=0; i<len; i++){ if (isvowel(str[i])) nvowel++; } for (i=0; i<len; i++){ if isalpha(str[i]) if (isupper(str[i])) nupper++; else nlower++; } str[0]=toupper(str[0]); for (i=1; i<len; i++) str[i]=tolower(str[i]); printf("Number of vowels = %d\n", nvowel); printf("Number of lower case = %d\n", nlower); printf("Number of upper case = %d\n", nupper); printf("Capitalised string = %s\n", str); return 0; } /* returns true if a given character is a vowel */ int isvowel(char ch) { int vowel; char lower=tolower(ch); vowel=lower=='a' ||lower=='i' ||lower=='o' || lower=='u' ||lower=='e'; return vowel; } 7.-Escriba una función PigLatin(cadena1,cadena2) que reciba dos cadenas, la primera es la cadena fuente y la segunda es la cadena que almacenará la cadena en pig latin. Éste se forma con las reglas siguientes: /* Reglas: * **de * * si la palabra inicia con una vocal, agrega la cadena "way" al final cadena2 sino, busca la primera vocal, muévela al final de la cadena2 y por último agrega la cadena "ay" al final de la cadena2. Escribe un programa principal para probar tu función PigLatin ( ). 8.-Escriba un programa que imprima en pantalla todos los caracteres ASCII’s El siguiente ejemplo muestra que char se considera como un tipo entero, y se puede realizar aritmética entera con sus valores. Ejecutar el ejemplo: #include <stdio.h> int main() { char ch; for (ch = 'A'; ch < 127; ch++) { printf("Character: %c", ch); printf("\t ASCII: %d \n", ch); } return 0; } ¿Hasta que letra imprime? 9.- Ejercicios 1: Escribe una función busa_char( ) que reciba una cadena y un carácter y que regrese el índice del carácter si se encuentra en la cadena o regrese -1 si no se encuentra. La función es similar a la búsqueda de números en arreglos, pero ahora es con caracteres. Escribe un programa principal para probar tu función. 2: El siguiente código es una implementación de la strcmp( ). int strcmp (char s1[], char s2[]) { int i; for (i=0; s1[i]!=’\0’&&s2[i]!=’\0’; i++ ) { if(s1[i]!=s2[i]) return s1[i]-s2[i]; } return s1[i]-s2[i]; } Ejemplo:de su uso. Como se muestra en la segunda corrida, la función strcmp( ) distingue entre mayúsculas y minúsculas. Necesitas modificar la función strcmp() y renómbrala como mi_strcmp() para que NO distinga entre mayúsculas y minúsculas al comparar las cadenas. Escribe un programa principal para probar tu nueva función como se muestra abajo. 3: Escribe una función Burbuja_Sort( ) que recibe una cadena y la ordene usando el método de la burbuja. El ordenamiento debe ser sensible a mayúsculas y minúsculas. Escribe un programa principal para probar tu nueva función como se muestra abajo. 10.- Problema: Escribe una función pluralForm(palabra) que cambie palabras (en ingles) de su forma singular a su forma plural basado en las siguientes reglas de la gramática inglesa. Si la palabra termina en in s, x, z, ch, o sh, agrega es al final de la palabra Si la palabra termina en y y la y es precedida por una constante, cambia la y por ies. En todos los demás casos, agrega s al final de las palabras. Para hacer esto, necesitas determinar si un carácter dado es una consonante. Las funciones de librería de caracteres de C no tiene una función esConsonante(), así que, tal vez quieras escribir una tu mismo. Recuerda que la librería <ctype.h> tiene una función isalpha(ch), la cual regresa TRUE si ch es una letra mayúscula o minúscula o regresa FALSE en otro caso. Debido a que existen 21 consonantes y solo 5 vocales, puede ser más simple verificar si una letra es consonante. Para este problema, suponga que el usuario ingresará palabras que son sustantivos, y que además ingresará la forma singular de éstos. También suponga que los sustantivos serán lo suficientemente cortos que el espacio de memoria necesario para modificarlos no ocasionará ningún problema de falta de ésta. Asegúrate, que esta suposición se cumple, al menos para 80 caracteres. Conclusiones y Observaciones: Forma de entrega: Cada equipo deberá subir a moodle este formato de reporte con el desarrollo de la práctica. Fecha de entrega: Límite: 7/Nov/2008 20:00 horas Calificación: