Professional Documents
Culture Documents
1
struct complejo
{
float x,y;
};
struct racional
{
int numerador;
int denominador;
};
struct fecha
{
unsigned int mes, dia, anyo;
};
struct tiempo
{
unsigned int horas, minutos;
};
struct direccion
{
char calle[40];
int num;
int codpost;
char ciudad [20];
}
struct entrada
{
char nombre[50];
struct direccion dir;
char telefonos [5][15];
};
struct entrada pepe;
printf (La calle donde vive es: %s\n, pepe.dir.calle);
Ejemplo 11.2
union arg
{
int v;
char c[2];
} n;
printf (Introduzca un nmero entero:);
Ejemplo 11.4
Uso de typedef para declarar un nuevo nombre, Longitud, de tipo de dato double.
typedef double Longitud;
Ejemplo 11.6
struct entrada
{
char nombre[50];
struct direccion dir;
char telefonos [5][15];
int edad;
int sexo:1; /* H: 1 M: 0 */
int departamento:3; /* codigo <8 */
int contrato:3;
};
PROBLEMAS RESUELTOS
11.1.
Es necesario conservar la palabra struct en la declaraciones de variables, a no ser que se
aada una sentencia de tipo typedef como la siguiente:
11.2
enum estaciones {PRIMAVERA =1, VERANO=2, INVIERNO=3, OTONO=4};
11.3
enum estaciones leerEstacion ( )
{
int e;
printf(Introduzca el nmero de la estacin del ao:
printf( 1 Primavera\n);
printf( 2 Verano\n);
printf( 3 Otoo\n);
printf( 4 Invierno\n);
scanf(%d, &e);
switch (e)
{
case 1: return (PRIMAVERA); break;
case 2: return (VERANO); break;
case 3: return (OTOO); break;
case 4: return (INVIERNO); break;
default: printf (Entrada errnea \n); return;
}
}
11.4
enum meses {ENERO=1, FEBRERO=2, MARZO=3, ABRIL=4, MAYO=5,
JUNIO=6, JULIO=7, AGOSTO=8, SEPTIEMBRE=9,
OCTUBRE=10, NOVIEMBRE=11, DICIEMBRE=12};
11.5
La incializacin de una estructura puede hacerse solamente cuando es
esttica o global. No se puede definir un array de caracteres sin especificar
el tamao. La mayor parte de los compiladores tampoco permite inicializar
las estructuras de la manera que aparece en el ejemplo fuera de la
inicializacin de variables globales. Para estar seguros habra que inicializar
la estructura fecha miembro a miembro.
11.6
La sentencia no aade ningn tipo de datos nuevo a los ya definidos en el lenguaje C.
Simplemente permite renombrar un tipo ya existente, incluso aunque sea un nuevo nombre para
un tipo de datos bsico del lenguaje como int o char.
11.7
struct alumno
{
char nombre [40];
int curso;
int edad;
char direccion[40];
int notas[10];
};
struct profesor {
char nombre [40];
char direccion[40];
char asignaturas[10][20];
};
union univ {
struct alumno al;
struct profesor prof;
};
11.8
struct alumno a;
struct profesor p;
union univ un;
11.9
struct alumno leerAlumno( )
{
struct alumno aa;
int i;
printf( Introduzca el nombre \n);
scanf(%s, aa.nombre);
printf( Introduzca la edad \n);
scanf(%d, &aa.edad);
printf( Introduzca su curso \n);
scanf(%d, &aa.curso);
printf( Introduzca la direccin\n);
scanf(%s, aa.direccion);
for (i=1; i<10; i++)
{
printf( Introduzca la nota de la asignatura %d \n, i);
scanf(%d, &aa.notas[i]);
}
return aa;
}
11.10
leerAlumno(struct alumno *aa)
{
int i;
printf( Introduzca el nombre \n);
scanf(%s, aa->nombre);
printf( Introduzca la edad \n);
scanf(%d, &aa->edad);
11.11
mostrarAlumno(struct alumno *aa)
{
int i;
printf( Nombre: %s\n, aa->nombre );
printf( Edad: %d \n, aa->edad);
printf( Curso: %d\n, aa->curso);
printf( Direccin: %s\n, aa->direccion);
for (i=1; i<10; i++)
printf( Nota de la asignatura %d: %d \n, i, aa->notas[i]);
}
11.12
struct cliente
{
char nombre[100];
int numUnidades;
float precio;
char estado;
};
main( )
{
struct cliente listado [100];
for (i=0; i<100; i++)
{
printf(Introduzca nombre del cliente: );
scanf(%s,listado[i].nombre);
printf(\n Introduzca el nmero de unidades solicitadas: );
scanf(%d,listado[i].numUnidades);
printf(\n Introduzca el precio de cada unidad:);
scanf(%f,listado[i].precio);
printf(\n Introduzca el estado del cliente (m\a\p));
scanf(%c,listado[i].estado);
}
}
11.13
for (i=0; i<100; i++)
{
if (listado[i].estado == m)
printf (%s\n,listado[i].nombre);
}
for (i=0; i<100; i++)
{
if (listado[i].estado == p)
if (listado[i].precio * listado[i].numUnidades > maximo)
printf (%s\n,listado[i].nombre);
}
11.14
struct complejo
{
float r;
float i;
};
struct complejo suma (struct complejo a, struct complejo b)
{
struct complejo c;
c.r = a.r + b.r;
c.i = a.i + b.i;
return c;
}
struct complejo resta (struct complejo a, struct complejo b)
{
struct complejo c;
11.15
struct racional
{
float num;
float denom;
};
main( )
{
struct racional a,b,c;
printf ("Introduzca dos nmeros racionales con el formato
x/y.\n");
11.16
struct baloncesto
{
char nombre[20];
int victorias;
int derrotas;
int perdidas;
int rebotes;
char mejorTriples [40];
int triples;
};
struct futbol
{
char nombre[20];
int victorias;
int derrotas;
int empates;
};
int golesAFavor;
int golesContra;
int golesGoleador;
char goleador[40];
main( )
{
struct baloncesto equiposB [10];
struct futbol equiposF [10];
int i;
for (i=0, i<10; i++) leerEquipoBaloncesto (&equiposB[i]);
for (i=0, i<10; i++) leerEquipoFutbol (&equiposF[i]);
}
void leerEquipoBaloncesto ( struct baloncesto *bal)
{
printf ("\n\tItroducir nombre del equipo :");
scanf("%s",bal->nombre);
printf ("\n\tItroducir el nmero de victorias conseguidas :");
scanf ("%d", &bal->victorias);
printf ("\n\tItroducir el nmero de derrotas :");
scanf ("%d", &bal->derrotas);
printf ("\n\tItroducir el nmero de prdidas de baln :");
scanf ("%d", &bal->perdidas);
printf ("\n\tItroducir el nmero de rebotes cogidos :");
scanf ("%d", &bal->rebotes);
printf ("\n\tItroducir nombre del mejor triplista :");
scanf("%s", bal->mejorTriples);
printf ("\n\tItroducir el nmero de rebotes cogidos :");
scanf ("%d", &bal->triples);
}
void leerEquipoFutbol ( struct baloncesto *fut)
{
printf ("\n\tItroducir nombre del equipo :");
scanf("%s", fut->nombre);
printf ("\n\tItroducir el nmero de victorias conseguidas :");
scanf ("%d", &fut->victorias);
printf ("\n\tItroducir el nmero de derrotas :");
scanf ("%d", &fut->derrotas);
printf ("\n\tItroducir el nmero de empates :");
scanf ("%d", &fut->empates);
printf ("\n\tItroducir el nmero de goles a favor :");
scanf ("%d", &fut->golesAFavor);
printf ("\n\tItroducir el nmero de goles en contra :");
scanf ("%d", &fut->golesContra);
printf ("\n\tItroducir nombre del mejor goleador :");
scanf("%s", fut->goleador);
printf ("\n\tItroducir el nmero de goles del goleador :");
scanf ("%d", &fut->golesGoleador);
}
11.17
mejoresTriplistas ( struct baloncesto *listado)
{
int i;
11.18
struct punto
{
float x;
float y;
};
main( )
{
struct punto p, q, r;
printf ("Introduzca las coordenadas de dos puntos. \n");
printf ("Primer punto. Coordenada x:");
scanf ("%f", &p.x);
printf ("\n Primer punto. Coordenada y:");
scanf ("%f", &p.y);
printf ("\n Segundo punto. Coordenada x:");
scanf ("%f", &q.x);
printf ("\n Segundo punto. Coordenada y:");
scanf ("%f", &q.y);
printf ("\n La distancia entre ambos puntos es de %f.\n,
distancia (p, q));
medio (p,q, &r);
printf (El punto medio de la recta que une ambos puntos es: (%f,
%f). \n", r.x, r.y);
}
float distancia (struct punto p1, struct punto p2)
{
return (sqrt( sqr( p1.x-p2.y), sqr( p1.x-p2.y)));
}
medio (struct punto p1, struct punto p2, struct punto * p3)
{
p3->x = (p1->x + p2->x) /2 ;
p3->y = (p1->y + p2->y) /2 ;
}
11.19
#include
#include
#include
#include
<stdio.h>
<stdlib.h>
<string.h>
<ctype.h>
/* patrn a buscar
/* longitud de patrn
*/
*/
if (2 > argc)
/* no hay fichero */
return 1;
if (3 > argc)
/* faltan argumentos */
return 2;
if (NULL == (fp = fopen(argv[1], "r+b")))
return 3;
/* error de apertura de fichero */
if (NULL == (buf = getbuf( )))
return 4;
/* no hay memoria para el buffer */
patrons = argc - 2;
/* argumentos a procesar */
for (i = 2; i < argc; ++i)
{
if (NULL != (ptr = strtok(argv[i], ",")))
{
p = busqueda[i - 2].patron;
do
{
busqueda[i - 2].numbytes++;
if (1 == strlen(ptr))
{
*p++ = *ptr;
continue;
}
switch (toupper(ULTIMO_CAR(ptr)))
{
case 'D': ULTIMO_CAR (ptr) = '\0';
*p++ = (char)atoi(ptr);
break;
case 'H': ULTIMO_CAR (ptr) = '\0';
if (Error_ == hex2char(ptr, p++))
return 5;
break;
default: return 5;
}
} while (NULL != (ptr = strtok(NULL, ",")));
*p = '\0';
max_bytes = max(max_bytes, bsqueda[i - 2].numbytes);
}
else return 5;
}
fgetpos(fp, &rpos);/* guardar la posicin en que estamos */
while (1)
{
if (max_bytes > (bytes = (int)fread(buf, 1, bufsize, fp)))
{
if (0 == bytes && !feof(fp))
return 6;
/* algo no marcha!
*/
else break;
/* hecho!
*/
}
for (n = 0, modificado = Falso_; n < patrones; ++n)
{
/* comprobar cada patron */
for (i = 0; i < (bytes - max_bytes + 1); ++i)
{
if (buf[i] != *(busqueda[n].patron))
continue;
if (Exito_ != strncmp(&buf[i],
busqueda[n].patron, busqueda[n].numbytes))
continue;
for (j = 0; j < busqueda[n].numbytes; ++j, ++i)
buf[i] = '\0';
modificado = Verdadero_;
}
}
if (modificado) /* escribir los cambios, si hay*/
{
wpos = rpos;
fsetpos(fp, &wpos);
if (bytes != (int)fwrite(buf, 1, bytes, fp))
return 7;
fsetpos(fp, &rpos);
}
rpos += bytes - max_bytes + 1;
fsetpos(fp, &rpos);
}
fclose(fp);
return Exito_;
char *getbuf(void)
{
register char *buffer;
for (buftam = 0x4000; bufsize >= 128; bufsize >>= 1)
{
if (NULL != (buffer = (char *) malloc(bufsize)))
return buffer;
}
return NULL;
11.20.
char *inet_l2a (long int d)
{
union
{
long int l;
char bytes[4];
} u;
char dir = (char*) malloc (16);
u.l = d;
sprintf (dir, "%i.%i.%i.%i", u.bytes[0], u.bytes[1],
u.bytes[2],u.bytes[3], );
return dir;
}