FUNDAMENTOS DE PROGRAMACIÓN PRÁCTICA 24: LENGUAJE C (II) Curso: 2010/11 Versión: 1.0.0 OBJETIVOS Aprender el manejo de cadenas en lenguaje C y repasar algunos conceptos. RECOMENDACIONES Cree una carpeta en la estructura de archivos de su ordenador denominada Practica24, en la que almacenará todo el código de esta práctica. EXPERIMENTOS Cree un proyecto denominado Cadenas que contenga un archivo de código fuente que se llame “principal” y cuya única misión será ir invocando y probando las funciones de los experimentos que se describen más abajo, a medida que los realiza. Cree un fichero de cabeceras llamado “cadenas.h” con lo siguiente: #ifndef CADENAS_H_INCLUDED #define CADENAS_H_INCLUDED #include <stdio.h> #define MAXCAR 256 typedef char Cadena[MAXCAR]; #endif Recuerde que habrá de incluirlo en el principal e ir agregándole los prototipos de las funciones definidas en los experimentos que siguen. EXPERIMENTO 1 – COPIANDO CADENAS Cree un archivo llamado exp1 en el que escriba e intente compilar el siguiente código. Corrija los errores para que funcione correctamente. #include “cadenas.h” (cuidado con las comillas tipográficas) void experimento1(void) { Cadena s1 = "hola", s2 = "adios"; printf ("Experimento1\n"); s1 = s2; if (s1 == s2) printf("\tcadenas iguales\n"); else printf("\tcadenas desiguales\n"); } EXPERIMENTO 2 – RESERVANDO ESPACIO SUFICIENTE Cree un archivo llamado exp2 en el que escriba e intente compilar el siguiente código. Corrija los errores para que funcione correctamente. #include “cadenas.h” (cuidado con las comillas tipográficas) void experimento2(void) { Práctica 24: Lenguaje C (1I) 2 char *s1 = "hola", *s2 = "adios"; printf ("Experimento2\n"); strcat(s1,s2); printf("\t%s %s\n",s1,s2); } EXPERIMENTO 3 – CUIDADO CON EL FIN DE CADENA (‘\0’) Cree un archivo llamado exp3 en el que escriba y compile el siguiente código. #include “cadenas.h” (cuidado con las comillas tipográficas) void experimento3(void){ char cad1[] = "Pepito Grillo"; char cad2[] = "Gepeto"; printf ("Experimento3\n"); printf("\t(1)%s\n", cad1); printf("\t(2)longitud de cad1:%d\n",strlen(cad1)); printf("\t(3)%s\n", cad2); printf("\t(4)longitud de cad2:%d\n",strlen(cad2)); cad1[strlen(cad1)] = '*'; cad2[strlen(cad2)] = '#'; printf("\n\t(5)%s\n", cad1); printf("\t(6)longitud de cad1:%d\n",strlen(cad1)); printf("\t(7)%s\n", cad2); printf("\t(8)longitud de cad2:%d\n",strlen(cad2)); } Mueva un poco la ventana de la consola en la pantalla e intente seguir la traza para comprender lo que ha pasado. En caso necesario, pregunte a su profesor de prácticas. EJERCICIOS EJERCICIO 1– BUSCANDO UN CARÁCTER Cree un proyecto que se denominará CadenaEjer1. Cree un archivo de código denominado “principal” donde estará codificada: a) La función void main(void) que pedirá por teclado una cadena de caracteres y un carácter (se aconseja utilizar las funciones gets(cad) para pedir la cadena y c=getchar() para pedir el carácter, ya que scanf (...) no sabe reconocer un carácter que se teclee después de cualquier otro valor -asume como dato introducido para el carácter el blanco o el retorno de carro con el que se separaría el valor introducido anterior al carácter-). Invocará a la función del apartado b) y visualizará un texto que indique si el carácter estaba o no en la cadena y, en su caso, la primera posición donde aparece, teniendo en cuenta que si aparece en la primera posición debe visualizar un 1. Por si le ayuda una posición nunca es negativa. b) Una función int busca_caracter (Cadena, char); Que recorra la cadena comparando cada elemento con el carácter y devuelva un valor apropiado. No olvide definir los tipos apropiados que necesite. Práctica 24: Lenguaje C (1I) 3 EJERCICIO 2– PALABRA O FRASE CON LA CONDICIÓN DE PALÍNDROMO Se dice que una palabra, frase o secuencia de números es un palíndromo cuando se lee igual de izquierda a derecha como de derecha a izquierda. Cree un proyecto que se denominará CadenaEjer3. Cree un archivo de código denominado “principal” donde estará codificada: a) La función void main(void) que pedirá por teclado una frase, invocará a la función del apartado b) y visualizará un texto que indique si la frase es un palíndromo o no. b) Una función boolean esPalindromo (Cadena); Devolverá falso o cierto según sea la frase que reciba como parámetro. No olvide definir los tipos apropiados que necesite. EJERCICIO 3– CALCULANDO EL DIGITO DE CONTROL DE UN ISBN International Standard Book Number (en español, „número estándar internacional de libro‟), abreviado ISBN, es un identificador único para cualquier libro cuyo uso se prevea de carácter comercial. Cómo se descompone y se calcula el dígito de control que figura como último digito se explica a continuación. Realice con el esquema de los ejercicios anteriores un programa C que pida por teclado el código de grupo, el del editor y el del libro y visualice una cadena con la concatenación de todo el ISBN. El prototipo de la función que calcule el dígito de control es: char digitoControlISBN(Cadena); Esta función debería comprobar si la cadena de entrada tiene 9 caracteres, devolviendo el carácter NULL en caso de ser distinto (defina NULL como el carácter „\0‟, también llamado fin de cadena) El formato de un código ISBN de 10 dígitos (los hay de trece) es el siguiente: • Código de grupo (1 dígito) • Código del editor (4 dígitos) • Código del libro (4 dígitos) • Carácter/dígito de control (1 carácter/dígito) Por ejemplo, el código ISBN para un determinado libro es 0675209935. El carácter o dígito de control (5 en el ejemplo) se obtiene en dos pasos: 1. Se multiplica cada dígito por el índice correspondiente a su posición, y se suman los números resultantes. En el ejemplo: 0 6 7 5 2 0 9 9 3 x1 2 3 4 5 6 7 8 9 -------------------------------------------0 + 12 + 21 + 20 + 10 + 0 + 63 + 72 + 27 = 225 Práctica 24: Lenguaje C (1I) 4 2. Se divide la suma por 11, y se toma el resto como dígito de control, teniendo en cuenta que si el resto es 10, se utiliza el carácter X como carácter de control. En el ejemplo, el resto de la división entera de 225 por 11 es 5, que es el dígito de control. IMPORTANTE: Observe que la función char digitoControlISBN(Cadena) devuelve un tipo char, por lo que necesitará, de un lado, pasar al int los valores char que forman la cadena de entrada y, de otro, una vez calculado el dígito de control pasarlo a char para que se pueda devolver en el return, por ello sepa que: convierte un dato de tipo carácter, que representa un numero entero, en ese número como tipo de dato entero. (char)(entero+'0') convierte un entero entre 0 y 9 en su representación como carácter. (int)(carácter-'0')