CONTROL DE REPASO DE C. (Soluciones) 1.- Dada la definición de variables, indicar cual de las siguientes instrucciones son correctas y cuales erróneas, señalar en este último caso el motivo del error. typedef struct { int codigo; char nombre[20]; int existencias; float precio; } TipoArticulo; TipoArticulo Almacen[100]; TipoArticulo *Producto; int indice; char texto[20]; 1) 2) 3) 4) 5) 6) articulo.nombre = “Martillo” Producto.costo = 2.34; Producto->existencias = 0; Almacen[0] = Producto; strcopy ( Almacen[indice].codigo, “Aro”); prinf(“%d :%d \n”, Almacen[20].codigo, Almacen[20].nombre); 7) Almacen.codigo[14] = 2003; 8) Producto.nombre[20] =’a’; 9) Producto.precio += 10.5; 10) existencias = existencias – 2; 1) Mal, artículo no está definido y nombre no es un puntero a carácter 2) Mal, Producto es un puntero Producto->costo y costo no está definido 3) Bien 4) Mal, Producto es un puntero Almacen[0] = *Producto 5) Mal, el campo código es numérico, Almacen[indice].nombre, y la función es strcpy 6) Mal, el campo nombre es string %s 7) Mal, Almacen[14].codigo 8) Mal, la última posición es la 19 no la 20 9) Mal, Producto es un puntero Producto->precio 10) Mal , existe la variable existencia 2.- Realizar las siguientes funciones que trabajan sobre tablas unidimensionales. a) Función int CuentaVocales ( char cadena [] ) Devuelve el número de vocales que aparece en el parámetro cadena Ej- CuentaVocales ( “Hola Pepe.” )-> Devuelve el valor 4 int CuentaVocales1 ( char cadena [] ) { int nvocales = 0; int i = 0; char letra; while (cadena [i] != '\0' ) { letra = cadena[i]; if ( (letra == 'a') || (letra == 'e') || (letra == 'i' )|| (letra == 'o') || (letra == 'u') || (letra == 'A') || (letra == 'E') || (letra == 'I' )|| (letra == 'O') || (letra == 'U') ) { nvocales++; } i++; } return nvocales; } 1 int CuentaVocales2 (char cadena [] ) { int nvocales = 0; while ( *cadena ) { switch (*cadena) { case 'a': case 'e': case 'i': case 'o': case 'u': case 'A': case 'E': case 'I': case 'O': case 'U':nvocales++; } cadena++; } return nvocales; } int CuentaVocales3 (char cadena [] ) { char Tvocales[10] = {'a','e','i','o','u', 'A','E','I','O','U' }; int nvocales = 0; int i,j; for (i = 0; i< strlen(cadena); i++ ) { for (j=0; j<10 ; j++ ) { if ( cadena[i] == Tvocales[j] ) { nvocales++; } } } return nvocales; } b) Función void UnirCadenas ( char *cadena1, char *cadena2, char *cadenaresu ) Copia en cadenaresu la unión de cadena1 y cadena2 <<char *strcat(char *dest, const char *src)>> Ej- UnirCadenas ( “Monja “, “mon”, resu ),-> resu almacenaría “Monjamon” void UnirCadenas1 ( char *cadena1, char *cadena2, char *cadenaresu ) { int i,j; i= 0; j = 0; while ( cadena1[i] ) { cadenaresu[j] = cadena1[i]; i++; j++; } i= 0; while ( cadena2[i]) { cadenaresu[j] = cadena2[i]; i++; j++; } cadenaresu[j]= '\0'; } void UnirCadenas2 ( char *cadena1, char *cadena2, char *cadenaresu ) { while ( *cadena1 ) { *cadenaresu++ = *cadena1++; } while ( *cadena2 ) { *cadenaresu++ = *cadena2++; } *cadenaresu = '\0'; } 2 c) Función int EstaOrdenada ( int Tabla[], int NumDeElementos) que indique si una tabla está ordenada o no, devuelve 0 si es falso y 1 si es cierto Ej .Si la tabla Vector = { 10,20,21,34 } Entonces EstaOrdenada( Vector, 4 ) Devuelve 1 Si la tabla Cifra = {2,5,1,20,-4} Entonces EstaOrdenada(Cifra,5) Devuelve 0 int EstaOrdenada ( int Tabla[], int NumDeElem ) { int resu = 1; int i; for ( i= 1; i < NumDeElem ; i++ ) { if ( Tabla[i-1] > Tabla[i] ) { resu = 0; break; } } return resu; } 4.- Realizar un programa que lea el fichero Origen.dat y que lo copie en el fichero Destino.dat } /* Copia cualquier fichero */ #include <stdio.h> #define TAMBLOQUE 256 /* Copia ficheros de texto */ int main(void) #include <stdio.h> { int main(void) char buffer [ TAMBLOQUE ]; { FILE *Fent, *Fsal; char letra; int nbytes; FILE *Fent, *Fsal; Fent = fopen("Origen.dat", "r"); Fsal = fopen("Destino.dat", "w"); if ( Fent == NULL || Fsal == NULL ) { fprintf(stderr,"Error al abrir los ficheros."); return 1; } nbytes = fread (buffer,1,TAMBLOQUE,Fent); while (nbytes > 0 ) { fwrite(buffer,1,nbytes,Fsal); nbyte = fread(buffer,1,TAMBLOQUE,Fent); } Fent = fopen("Origen.dat", "rt"); Fsal = fopen("Destino.dat", "wt"); if ( Fent == NULL || Fsal == NULL ) { fprintf(stderr,"Error al abrir los ficheros."); return 1; } letra = fgetc(Fent); while (!feof(Fent)) { fputc (letra, Fsal); letra = fgetc(Fent); } fclose(Fent); fclose(Fsal); return 0; fclose(Fent); fclose(Fsal); 3 return 0; } 3.- Tenemos una lista de elementos creada mediante memoria dinámica según la siguiente declaración: typedef enum {FALSE=0,TRUE=1} boolean; typedef int TipoDato; BaseLista valor struct SEle { TipoDato valor; sig struct SEle *sig; }; Null typedef struct Sele TipoElemento; TipoElemento *BaseLista; /* Puntero al primer elemento de la lista */ Realizar las siguientes funciones a) boolean Vacia () Devuelve si la lista está vacía o tiene algún elemento. b) int NumeroDeElementoEnLista (); Devuelve el número de elementos almacenados c) void AñadirAlPrincipio ( TipoDato Nuevovalor ); Añade al principio de la lista un nuevo elemento. d) void AñadirAlFinal (TipoDato Nuevovalor ); Añadir al final de la lista un nuevo elemento. paux->valor = Nuevovalor; Base = paux; A) } boolean Vacia (void ) { return ( BaseLista == NULL )?TRUE:FALSE; } D) void AniadirAlFinal( TipoDato Nuevovalor) { Elemento *paux1,*paux2; B) int NumeroDeElementosEnLista (void) { Elemento *paux; int contador = 0; if ( Base != NULL ) { paux1 = Base; while ( paux1->sig != NULL ) { paux1 = paux1->sig; } paux2 = malloc( sizeof(Elemento)); paux2->valor = Nuevovalor; paux2->sig = NULL; paux1->sig = paux2; } else { Base = malloc( sizeof (Elemento )); Base->valor = Nuevovalor; Base->sig = NULL; } paux = Base; while ( paux != NULL ) { paux = paux->sig; contador++; } return contador; } C) void AniadirAlPrincipio ( TipoDato Nuevovalor ) { Elemento *paux; paux = malloc( sizeof(Elemento) ); paux->sig = Base; } 4