Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Estructuras 1
Estructuras 1
Bien utilizado hace que el código sea más compacto y eficiente; por el contrario, su uso
descuidado lleva a tener poca claridad y frecuentemente conduce a la pérdida del
control de la corrida, ocasionando un comportamiento indeseable del proceso.
El uso de punteros nos permite acceder al valor de una variable en forma indirecta. Para
esto se utilizan dos operadores:
Declaración
int *px;
Sean además x e y dos variables del tipo entero. Existen dos operadores unarios para
usarlos con punteros:
Inicialización
Antes de poder ser utilizado, un puntero debe ser inicializado (como cualquier otra
variable). Para inicializar un puntero se puede utilizar:
py = &y;
b. el valor de otro puntero ya inicializado.
1
Pasaje de argumentos por referencia
Supongamos que queremos realizar una función que recibe dos argumentos y que debe
retornar como resultado los valores invertidos de las dos variables. Sea por ejemplo la
siguiente implementación de esta función:
Temp = x;
x = y;
y = temp;
}
El efecto de esta función no es el deseado, ya que las variables son pasadas por valor, es
decir que lo que se modifica no son las variables originales, sino copias de ellas. La
forma de hacer esta operación es a través del paso de los argumentos por referencia. En
C esto se implementa haciendo uso de punteros:
Temp = *x;
*x = *y;
*y = Temp;
}
Swap(&a,&b);
2
Estructuras, Typedef, Arreglos de Estructuras
Un buen criterio de uso de estructuras establece que la definición de una estructura debe
ir acompañada por la definición de un conjunto de funciones que se encargan de realizar
la manipulación directa de la nueva entidad creada.
struct Nombre
{
tipo1 Campo1;
tipo2 Campo2;
...
tipoN CampoN;
};
La declaración
Declara una variable del tipo "struct Nombre", esto es, el compilador reserva la cantidad
de memoria suficiente para mantener la estructura íntegra (es decir espacio para
almacenar Campo1, Campo2, ..., CampoN). Cuando se hace referencia a la variable Var,
se esta haciendo referencia a la estructura íntegra.
Inicialización de estructuras
Se puede inicializar una estructura externa o estática añadiendo a su definición la lista
de inicializadores:
struct Fecha
{
int Dia;
char Mes[10];
int Anio;
};
3
struct Fecha Hoy = {8,"Mayo",1991},
VarFecha;
...
VarFecha = Hoy;
Un campo de una estructura se utiliza como una variable más. Para referenciar un
campo de una estructura se emplea el operador "."
Ejemplos:
Hoy.Dia = 24;
Hoy.Anio = 1991;
struct Person
{
char Name [NAMESIZE];
char Adress[ADRSIZE];
long ZipCode;
double Salary;
struct Fecha Nacimiento;
};
4
Arreglos de Estructuras
struct trabajador
{
char nombre[20];
char apellidos[40];
int edad;
};
Así podremos almacenar los datos de 20 trabajadores. Ejemplos sobre como acceder
a los campos y sus elementos: para ver el nombre del cuarto trabajador, fijo[3].nombre;.
Para ver la tercera letra del nombre del cuarto trabajador, fijo[3].nombre[2];. Para
inicializar la variable en el momento de declararla lo haremos de esta manera:
Typedef
El lenguaje 'C' dispone de una declaración llamada typedef que permite la creación
de nuevos tipos de datos. Ejemplos:
struct trabajador
{
char nombre[20];
char apellidos[40];
5
int edad;
};
Otra forma:
typedef struct
{
char nombre[20];
char apellidos[40];
int edad;
}datos;
datos fijo,temporal;
Ejemplos:
1.- Veamos antes que, además de int, char y float, otros tipos de datos simples son las
enumeraciones o tipos enumerados, donde se listan las constantes del tipo. Este tipo se
declara con la palabra reservada enum, como un conjunto de constantes enteras
representadas por identificadores. Por ejemplo:
enum ComunidadUniversitaria
{obrero,administrativo,estudiante, profesor};
enum Deportes
{Futbol=1,Beisbol,Tenis,Basketball,Natación,SoftBall};
Los identificadores en una enumeración deben ser únicos. Los nombres de las
constantes no pueden ser modificados en el programa.
main()
{
enum meses meses;
6
char *mesNombre[] = {"", "Enero", "Febrero", "Marzo",
"Abril", "Mayo", "Junio", "Julio",
"Agosto", "Septiembre", "Octubre",
"Noviembre", "Diciembre"};
getch();
}
2.- Además de los tipos simples, C provee los tipos estructurados los cuales permiten
construir estructuras de datos más complejas. Entre ellos están los arreglos. Los
arreglos ocupan espacio en memoria. En la declaración se especifica el tipo de cada
elemento y el número de elementos requerido por cada arreglo. Para declarar un arreglo
se escribe lo siguiente
<nombre_de_tipo> <identificador>[<tamaño>];
En esta declaración se puede observar que el vector está formado por 100
elementos todos reales. La declaración de la variable sería
Vector v1;
7
obtener el valor de la posición 20 y colocarlo en una variable real, se puede hacer en
algunas formas equivalentes como
Note que en el índice del arreglo (señalado entre corchetes) podemos colocar
una constante, una variable o una expresión, siempre que sean de tipo entero que el
subrango indicado en la definición del arreglo.
3.- Una de propiedades de los tipos estructurados en C es que éstos pueden ser definidos
en función de otros tipos estructurados. Es así como, el tipo de los elementos de un
arreglo podría ser un arreglo. En C se simplifican estas construcciones en lo que se
denominan arreglos bidimensionales los cuales son análogos con las matrices.
m[10][35] = m[10][36]+m[11][35];
4.- Otro tipo estructurado provisto por C son las estructuras o struct. Estos permiten
manipular elementos de tipos diferentes como si formaran un solo objeto. A estos
elementos se les denomina campos de la estructura. Las estructuras se definen usando la
siguiente instrucción:
struct <nombre_del_tipo> {
<tipo> <nombre_campo>;
...
<tipo> <nombre_campo>;
} <lista de identificadores>;
Para usar una estructura debe especificarse todo el camino donde se localiza el
campo. Por ejemplo, dada la definición de un tipo estructura que almacene una fecha
8
jul,ago,sep,oct,nov,dic};
int año;
}Tipo_fecha;
Ejercicios:
Ejemplos de Estructuras:
a. Defina un tipo de datos llamado TFECHA, con los campos adecuados
para almacenar el día, mes y año de las fechas.
typedef struct {
int dia;
int mes;
int año;
} TFECHA;
9
typedef struct {
char Album[15];
char Cantante_Grupo[15];
char Tipo_Musica[15];
TFECHA Fecha_Ad;
} TCD;
strcpy(MisCDs[0].Album,“Romances”);
strcpy(MisCDs[0].Cantante_Grupo,“Luis Miguel”);
strcpy(MisCDs[0].Tipo_Musica,“Bolero”);
MisCDs[0].Fecha_Ad.dia = 30;
MisCDs[0].Fecha_Ad.mes = 10;
MisCDs[0].Fecha_Ad.año = 1996;
Funciones
1. Escriba una función Norma que calcule y retorne la norma de un vector de
dimensión n. La función debe recibir como parámetros el vector (cuyos
componentes deben ser números reales) y un entero n que indique la dimensión
del mismo. Recuerde que la norma de un vector se define como la raíz cuadrada
de la suma de los cuadrados de sus componentes.
10
SumCuad += v[i]*v[i]; // Calculo la suma de los
cuadrados
return(sqrt(SumCuad)); // Calculo y retorno la raiz
cuadrada
}
void main()
{
float vector[3];
int i;
LeerDatos(vector,3);
printf("Norma = %f ",Norma(vector,3));
}
Escriba las instrucciones en C que realicen lo que se les pide, solo las instrucciones y no
el programa completo
2. Vectores y Matrices:
a. Sea Ciudad un arreglo de caracteres que ya ha sido inicializado, escriba
las instrucciones necesarias para:
i. Imprimir el contenido del arreglo Ciudad.
printf(“%s”, Ciudad);
ii. Imprimir el valor del séptimo carácter de Ciudad
11
printf(“%c”, Ciudad[6]);
iii. Asignar la constante Barquito al arreglo Ciudad
strcpy(Ciudad, “Barquito”);
int i;
double sum = 0;
for(i=0; i<1000;i++)
sum += A[i][4];
printf(Promedio = %f, sum/1000.0)
int M[100][200], i, j;
for(i=0; i <10; i++) {
if (i%2 == 0) { // Filas pares comienzan en
cero
for(j=0; j <20; j+=2) {
M[i][j]= 0;
M[i][j+1]= 1;
}
}else { // Filas impares comienzan en uno
for(j=0; j <20; j+=2) {
M[i][j]= 1;
M[i][j+1]= 0;
}
}
}
12