Práctica 3 - Facultad de Ciencias de la Computación

Anuncio
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:
Descargar