Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Estructuras
Al estudiar el captulo de funciones, aprendimos la estrategia: Divide y Vencers; ahora aprenderemos la inversa: La unin hace la
esfuerza, la cual se implementa, tambin, en dos pasos:
1) Conocer las componentes (partes) individuales, lo cual ya lo hemos hecho, por ejemplo:
int codigo;
char nombre[25];
int edad;
Estas tres variables pueden referirse, por ejemplo, a un estudiante; pero no lo reflejan, les falta cohesin.
2) Cohesionar las componentes para formar una estructura con un nombre que represente la cohesin.
struct Estudiante { // Define la estructura Estudiante
int codigo;
char nombre[25];
int edad;
};
// Definicin de variables de tipo estructura y asignacin de valores. En modo similar que para variables simples:
int estudx = 0;
struct Estudiante estud1 = {1, Juan Carlos, 25};
Una estructura define a un tipo de dato complejo que agrupa a varios tipos de dato (simples o complejo); suele definirse como
global (antes de todas las funciones) para ser usada en todo el programa; recuerde que se recomend reducir el uso de variables
globales.
Admrate, algrate !!!! Estamos usando magistralmente un principio fundamental de integracin universal que lo usan todas las
ciencias, la gestin y el sentido comn. Practcalo y aplcalo.
Atento: Este procedimiento da el fundamento lgico a la estrategia La unin hace la fuerza. Para aplicarlo a las ciencias sociales; se
debe complementar con los sentimientos: responsabilidad personal, complementariedad, afectos, coraje, etc.
Definicin de variables:
Se puedes definir de dos formas equivalentes:
struct Estudiante {
int codigo;
char nombre[25];
} est1, . ; // forma 1
Ejemplo:
struct {
int codigo;
char nombre[25];
int edad;
} est1, est2, est3; // define las variables est1 y est2 de tipo Estudiante.
Arreglos de estructuras
Se definen arreglos como de costumbre:
struct Estudiante {
.
} est[10]; // forma 1: arreglo de 10 elementos
struct Estudiante est[3] = {{123, "Carlos Rodrguez", 25}, {125, "Mara Mar", 23}}; // no se asign valores a est[2].
PGINA: 2
Lenguaje C
Anidamientos de estructuras
Una estructura puede anidarse dentro de otra, se puede formar una cascada, ejemplo: Defina, lea e imprima datos de una estructura.
// 09_02.c : Definir, asignar valores e imprimir datos de una estructura con anidamiento
#include <stdio.h>
#include <string.h>
void main(void){
struct Nombre { // estructura simple
char nombre[15];
char apellido[15];
};
struct Estudiante { // estructura ms compleja que anida
int codigo;
struct Nombre nombre; // estructura simple anidada
int edad;
} est1 ={123, {"Jos", "Romero"}, 19}, est2; // define dos variables y asigna valores a la primera
printf("Codigo: "); scanf("%d", &est2.codigo);
printf("Nombre: "); scanf("%s", est2.nombre.nombre);
strcpy(est2.nombre.apellido, "100 Fuegos");
printf("Edad: "); scanf("%d", &est2.edad);
printf("\nReporte\n");
printf("Codigo: %d\n", est2.codigo);
printf("Nombre: %s\n", est2.nombre.nombre);
printf("Apellido: %s\n", est2.nombre.apellido);
printf("Edad: %d\n", est2.edad);
}
Salida:
Codigo: 12
Nombre: Carlos
Edad: 15
Reporte
Codigo: 12
Nombre: Carlos
Apellido: 100 Fuegos
Edad: 15
Apuntador a estructura
Apuntador a estructura
Un apuntador puede apuntar a cualquier tipo de variable, en particular a una de tipo estructura. Sea:
struct MiStru {
int campo1; // 4 bytes
char campo2[25]; // 25 bytes
};
struct MiStru miStru, *pmiStru = &miStru; // Atento se usa &, a diferencia de apuntador a arreglo.
Atento, la instruccin:
if( pmiStru == &(miStru.campo1)); // es true, porque son la misma direccin
Pero, compila con warning debido a que pmiStru es un puntero a tipo MiStru y &(miStru .campo1) es puntero de tipo int;
sin embargo. El casting automtico funciona y se ejecuta bien.
PGINA: 3
Lenguaje C
} dato, *pdato = &dato; // define dato y *pdato
(*pdato).campo1 = 123; // asigna valores
strcpy ( pdato->campo2, "hola" );
printf("%d\n", dato.campo1);
printf("%s\n", pdato->campo2);
if(pdato == &dato.campo1) printf("El if() funciona\n");
else printf("El if() no funciona\n");
}
Salida:
123
hola
El if() funciona
/* 90_05a.c : Leer, ordenar y escribir arreglo de estructuras /* 90_05b.c : Leer, ordenar y escribir arreglo de estructuras con
sin funciones funciones
*/ */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 10
#define LONGE 60
struct Alumno{
int codigo;
char nombre[LONGE];
int nota;
};
int leer(struct Alumno *lista, struct Alumno **plista);
void ordenar(struct Alumno *lista, struct Alumno **plista, int n, int k);
void imprimir(struct Alumno **plista, int n);
void main(void){ void main(void){
struct Alumno lista[MAX], *plista[MAX], *pmin; struct Alumno lista[MAX], *plista[MAX];
int n=0, i, j, imin; int n;
printf("Datos cargados");
n = leer(lista, plista);
imprimir(plista, n); // antes de ordenar
printf("\nOrdenar por Nombre");
ordenar (lista, plista, n, 1);
imprimir(plista, n); // despus de ordenar
printf("\nOrdenar por Nota");
ordenar (lista, plista, n, 2);
imprimir(plista, n); // despus de ordenar
}
int leer(struct Alumno *lista, struct Alumno **plista){
int n = 0;
printf ("Teclee Cdigo y Nombre; para finalizar (cdigo = 0):\n");
do {
printf ("Cdigo: "); scanf("%d", &lista[n].codigo);
if(lista[n].codigo == 0) break; if(lista[n].codigo == 0) return n;
printf ("Nombre: "); scanf("%s", lista[n].nombre);
printf ("Nota : "); scanf("%d", &lista[n].nota);
plista[n] = &lista[n];
n++;
} while (n<MAX);
return n;
}
void ordenar(struct Alumno *lista, struct Alumno **plista, int n, int k){
struct Alumno *pmin;
int i, j, imin, ik;
for(i=0; i<n-1; i++){
imin = i;
pmin = plista[i];
for(j=i+1; j< n; j++) for(j=i+1; j< n; j++) {
if(k==1) ik = strcmp(pmin->nombre,plista[j]->nombre);
if(k==2) ik = pmin->nota > plista[j]->nota;
if(strcmp(pmin->nombre,plista[j]->nombre)>0){ if(ik>0){
imin = j; imin = j;
pmin = plista[j]; pmin = plista[j];
} }
}
PGINA: 5
Lenguaje C
if(imin > i){
plista[imin] = plista[i];
plista[i] = pmin;
}
}
}
printf("\nOrdenar por Nombre"); void imprimir(struct Alumno **plista, int n){
int i;
printf ("\nCdigo Nombre Nota");
for (i=0;i<n;i++)
printf("\n%d\t%s\t%d", plista[i]->codigo, plista[i]->nombre, plista[i]->nota);
printf ("\n");
}
}
Salida:
Teclee Cdigo y Nombre; para finalizar (cdigo = 0):
Cdigo : 10
Nombre: Jos
Nota : 15
Cdigo : 20
Nombre: Carlos
Nota : 16
Cdigo : 30
Nombre: Abel
Nota : 14
Cdigo: 0
Cdigo Nombre Nota
10 Jos 15
20 Carlos 16
30 Abel 14
Ordenar por Nombre
Cdigo Nombre Nombre
30 Abel 14
20 Carlos 16
10 Jos 15
Ordenar por Nota
Cdigo Nombre Nota
30 Abel 14
10 Jos 15
20 Carlos 16
PGINA: 6
Lenguaje C
Unin
Hemos estudiado estructuras, por ejemplo:
struct Ahorro {
int campo1[8];
long campo2[6];
};
El propsito de una estructura es contener todos los campos al mismo tiempo durante la ejecucin de un programa. El espacio de una
estructura es la suma de los espacios de todos los campos.
Si en el momento 1 usar el campo2, campo2 no tendra el valor correcto, lo mismo sucede si en el momento 2 usar el campo1. No se
produce error en tiempo de compilacin, es probable que no se produzca error en tiempo de ejecucin; pero los resultados sern
incorrectos. Es responsabilidad del programador que este error lgico (invisible) no suceda.
PGINA: 7