Solución del control de C

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