Professional Documents
Culture Documents
http://creativecommons.org/licenses/by-nc-sa/2.5/es/legalcode.es
(3)
(unidad 6)
Estructuras estáticas
(6.1) esquema de la unidad
(6.1) esquema de la unidad _____________________________________________________________ 5
(6.2) introducción ______________________________________________________________________ 6
(6.3) arrays ____________________________________________________________________________ 6
(6.3.1) introducción 6
(6.3.2) declaración de arrays 7
(6.3.3) utilización de arrays 8
(6.3.4) pasar un array como parámetro de una función 10
(6.3.5) algoritmos de búsqueda y ordenación en arrays 13
(6.3.6) arrays multidimensionales 18
(6.4) punteros _________________________________________________________________________ 19
(6.4.1) introducción 19
(6.4.2) declaración de punteros 20
(6.4.3) operaciones con punteros 20
(6.4.4) punteros como parámetros de funciones 21
(6.4.5) funciones que devuelven punteros 22
(6.4.6) aritmética de punteros 23
(6.4.7) punteros y arrays 23
(6.5) cadenas de caracteres ____________________________________________________________ 24
(6.5.1) introducción 24
(6.5.2) declarar cadenas 25
(6.5.3) leer y escribir cadenas 26
(6.5.4) comparar cadenas 26
(6.5.5) funciones y cadenas 27
(6.5.6) arrays de cadenas 27
(6.5.7) funciones de uso con cadenas 28
(6.6) estructuras_______________________________________________________________________ 31
(6.6.1) definición 31
(6.6.2) typedef 31
(6.6.3) acceso a los miembros de una estructura 32
(6.6.4) estructuras dentro de estructuras 32
(6.6.5) operaciones con estructuras 33
(6.6.6) arrays y punteros a estructuras 34
(6.6.7) estructuras y funciones 35
(6.7) uniones __________________________________________________________________________ 36
(6.8) campos de bits ___________________________________________________________________ 37
(6.9) enumeraciones ___________________________________________________________________ 37
(5)
fundamentos de programación
(Unidad 6) estructuras estáticas
(6.2) introducción
En programación se llaman estructuras estáticas a datos compuestos de datos
simples (enteros, reales, caracteres,...) que se manejan como si fueran un único
dato y que ocupan un espacio concreto en memoria.
Las estructuras estáticas son:
♦ Arrays. También llamadas listas estáticas, matrices y arreglos (aunque quizá
lo más apropiado es no traducir la palabra array). Son una colección de datos
del mismo tipo.
♦ Cadenas. También llamadas strings. Se trata de un conjunto de caracteres
que es tratado como un texto completo.
♦ Punteros. Permiten definir variables que contienen posiciones de memoria;
son variables que se utilizan para apuntar a otras variables
♦ Estructuras. Llamadas también registros. Son datos compuestos de datos
de distinto tipo. Una estructura podría estar compuesta de un entero, un
carácter y un array por ejemplo.
(6.3) arrays
(6.3.1) introducción
Imaginemos que deseamos leer las notas de una clase de 25 alumnos.
Desearemos por tanto almacenarlas y para ello con lo que conocemos hasta
ahora no habrá más remedio que declarar 25 variables.
Eso es tremendamente pesado de programar. Manejar esas notas significaría
estar continuamente manejando 25 variables. Por ello en C (como en casi todos
los lenguajes) se pueden agrupar una serie de variables del mismo tipo en una
misma estructura. Esa estructura permite referirnos a todos los elementos, pero
también nos permite acceder individualmente a cada elemento.
Los arrays son una colección de datos del mismo tipo al que se le pone un
nombre (por ejemplo nota). Para acceder a un dato individual de la colección hay
que utilizar su posición. La posición es un número entero, normalmente se le
llama índice (por ejemplo nota[4] es el nombre que recibe el cuarto elemento de
la sucesión de notas).
Hay que tener en cuenta que en los arrays el primer elemento tiene como
índice el número cero. El segundo el uno y así sucesivamente; es decir nota[4] en
realidad es el quinto elemento del array.
(6)
1er curso de administración de sistemas informáticos
autor: Jorge Sánchez – www.jorgesanchez.net
int a[7];
(7)
fundamentos de programación
(Unidad 6) estructuras estáticas
a[2]=17;
printf(“%d”,a[2]);
/* Array de 21 elementos */
int nota[21];
/* Contador para recorrer el array */
int i;
for(i=0;i<21;i++) {
printf(“Escriba la nota %d:”,i);
scanf(“%d”,¬a[i]);
}
Al final del bucle anterior, las notas estarán rellenadas. Por ejemplo con estos
valores:
Tanto para escribir como para leer no se puede utilizar el nombre completo del
array. Es decir:
scanf(“%d”,nota);
no lee todas las notas (de hecho sólo lee la primera), no tiene sentido ese uso.
Tampoco se puede:
printf(“%d”,nota);
(8)
1er curso de administración de sistemas informáticos
autor: Jorge Sánchez – www.jorgesanchez.net
double factorial[21];
int i;
factorial[0]=1;
for(i=1;i<21;i++){
factorial[i]=i*factorial[i-1];
}
/*Mostrar el resultado*/
for(i=0;i<21;i++){
printf("El factorial de %d es .0lf\n",i,factorial[i]);
}
iniciar arrays en la declaración
C posee otra manera de asignar valores iniciales al array. Consiste en poner los
valores del array entre llaves en la declaración del mismo. Ejemplo:
int nota[10]={3,5,6,7,3,2,1,7,4,5};
int nota[10]={3,5};
int i=0;
for(i=0;i<10;i++) printf("%3d",nota[i]);
El resultado es:
5 0 0 0 0 0 0 0 0
int a[2]={3,5,4,3,7};
(9)
fundamentos de programación
(Unidad 6) estructuras estáticas
int a[4];
a[4]=13;
No hay elemento a[4] (el último es a[3]), por lo que ese código no tiene sentido.
Sin embargo en C no se nos advierte del fallo, de hecho el uso de a[4] permite
almacenar el número 13 en la posición del que sería el quinto elemento del array.
Por lo tanto lo que ocurre es que el programa escribe fuera del array (en lo que
puede ser el área ocupada por otra variable), lo que provocaría que el programa
no funcione correctamente y actúe de manera imprevisible.
Hay que tener mucho cuidado con este tipo de errores, conocidos como
errores de desbordamiento de índice de array. Ya que hace que manipulemos
la memoria sin control alguno. Los programas fallan en su ejecución, pero será
muy difícil detectar por qué.
uso de la directiva #define
Una buena práctica de programación consiste en utilizar constantes en lugar de
números para indicar el tamaño del array. En el ejemplo anterior de las notas,
ocurre que en lugar de 21 notas, ahora queremos 30, tendremos que cambiar
todos los 21 por 30 a lo largo del código. En su lugar es más conveniente:
#define TAMANIO 20
int nota[TAMANIO];
/* Contador para recorrer el array */
int i;
for(i=0;i<TAMANIO;i++) {
printf(“Escriba la nota %d:”,i);
scanf(“%d”,¬a[i]);
}
int nota[8]={4,6,7,6,8,9,8,4};
printf(“%d\n”,¬a[0]); /* Escribe una dirección de memoria */
printf(“%d\n”,nota); /* Escribe la misma dirección */
printf(“%d\n”,¬a); /* De nuevo escribe la misma dirección */
En el ejemplo anterior, la tercera línea que escribe ¬a, denota que ¬a y
nota es la misma cosa.
De esta forma hay que tener en cuenta que cuando se utiliza un array como
parámetro de una función, lo que ésta recibe es una referencia al primer
elemento. Por ejemplo, supongamos que queremos calcular la media aritmética
de un array de enteros. Crearemos entonces la función media que recibe dos
parámetros: un array de enteros y el tamaño de dicho array. El tamaño es
necesario ya que desde la función no sabremos cuál será dicho tamaño.
El código será:
(11)
fundamentos de programación
(Unidad 6) estructuras estáticas
Hay que tener en cuenta que si en una función se cambia el valor de un elemento
del array, ese cambio de valor afecta al array original. Esto se debe al hecho de
que el array se pase por referencia y no por valor. Si una función utiliza un
parámetro de tipo int y se cambia su valor en la función, eso no significa que se
cambie el valor original. Es decir en el ejemplo:
#include <stdio.h>
void prueba(int x);
int main(){
int a=12;
prueba(a); /*Se llama a la función prueba con el valor
a */
printf(“%d”,a); /* escribirá el valor 12 */
}
void prueba(int x){
x=3;
}
#include <stdio.h>
void prueba(int[] x);
int main(){
int a[4];
a[0]=12;
prueba(a); /*Se llama a la función prueba con el valor
a */
printf(“%d”,a[0]); /* escribirá el valor 3 */
}
aquí el valor del elemento a[0] sí que cambia por que en la función prueba, x no
es una copa de a; x y a son la misma cosa, la dirección del mismo array.
El modificador const permite restringir la escritura de un array cuando es
utilizado como parámetro. Si se modifica el array ocurrirá un error en la ejecución.
(12)
1er curso de administración de sistemas informáticos
autor: Jorge Sánchez – www.jorgesanchez.net
Ejemplo:
/* parámetros:
vector: Array que contiene todos los valores
tamanio: Tamaño del mismo
valor: valor a buscar
*/
int busquedaLineal(int vector[], int tamanio, int valor){
int i=0;
int enc=0; /* Indica si se ha encontrado el valor */
while (enc==0 && i< tamanio){
if(vector[i]==valor) enc=1;
else i++;
}
if(enc==1) return i;
else return -1;
}
(13)
fundamentos de programación
(Unidad 6) estructuras estáticas
búsqueda binaria
Se basa en que el array que contiene los valores está ordenado. En ese caso la
búsqueda anterior es excesivamente lenta.
Este algoritmo consiste en comparar el valor que buscamos con el valor que
está en el centro del array; si ese valor es menor que el que buscamos, ahora
buscaremos en la mitad derecha; si es mayor buscaremos en la mitad derecha. Y
así hasta que lo encontremos.
Una variable (en el código es la variable central) se encarga de controlar el
centro del array que nos queda por examinar, las variables bajo y alto controlan
los límites (inferior y superior respectivamente) que nos quedan por examinar.
En caso de que el valor no se encuentre, entonces los límites bajo y alto se
cruzan. Entonces el algoritmo devuelve -1 para indicar que el valor no se
encontró. Esta búsqueda es rapidísima ya que elimina muchas comparaciones al
ir quitando la mitad de lo que nos queda por examinar.
Código de búsqueda binaria:
/* parámetros:
vector: Array que contiene todos los valores
tamanio: Tamaño del array
valor: valor a buscar
*/
int busquedaBinaria(int array[], int tamanio, int valor){
int central,bajo=0,alto=tamanio-1;
int encontrado=0;
(14)
1er curso de administración de sistemas informáticos
autor: Jorge Sánchez – www.jorgesanchez.net
ordenación de arrays
Se trata de una de las operaciones más típicas de la programación. Un array
contiene datos sin ordenar, y tenemos que ordenarle.
método por inserción directa
Consiste en que el array está en todo momento ordenado y cada vez que se
añade un elemento al array, éste se coloca en la posición que corresponda.
Para ello habrá que desplazar elementos. Si el array es:
1 2 3 5 6 7
1 2 3 4 5 6 7
se han tenido que desplazar los valores 5,6 y 7 para hacer hueco al 4 en su sitio.
Para un array de enteros la función que inserta un nuevo valor en dicho array
sería:
/* Parámetros de la función:
array: Array que contiene los datos ya ordenados
tamanio: Tamaño actual del array, es el tamaño de los
datos ordenados. cero significa que aún no se ha
insertado ningún valor
valor: El nuevo valor a insertar en el array
*/
void insercion(int array[], int tamanio, int valor){
/* valor es el valor que se inserta */
int i,pos=0;
int enc=0; /* indica si hemos encontrado la posicion
del elemento a insertar*/
(15)
fundamentos de programación
(Unidad 6) estructuras estáticas
Código:
(16)
1er curso de administración de sistemas informáticos
autor: Jorge Sánchez – www.jorgesanchez.net
/* Parámetros de la función:
a: Array que contiene los datos ya
izda: Posición inicial desde la que se ordena el array
dcha: Posición final hastala que se ordena el array
*/
void quicksort(int a[], int izda, int dcha)
{
/* Función auxiliar que sirve para intercambiar dos
elementos dentro del array*/
void swap(int a[],int i,int j){
int aux;
aux=a[i];
a[i]=a[j];
a[j]=aux;
}
int i,j,v,aux;
if(dcha > izda)
{
v = a[dcha]; i = izda-1; j = dcha;
for(;;){
while(a[++i] < v && i < dcha);
while(a[--j] > v && j > izda);
if(i >= j)
break;
swap(a,i,j);
}
swap(a,i,dcha);
quicksort(a,izda,i-1);
quicksort(a,i+1,dcha);}
}
int a[3][6];
a es un array de tres filas y seis columnas. Otra forma de declarar es inicializar los
valores:
int a[][]={{2,3,4},{4,5,2},{8,3,4},{3,5,4}};
int a[6][20][6];
a[3][4][2]=8;
(18)
1er curso de administración de sistemas informáticos
autor: Jorge Sánchez – www.jorgesanchez.net
saber cuántas columnas forman parte del array, es imposible determinar esa
posición. Lo correcto es:
(6.4) punteros
(6.4.1) introducción
Se trata de una de las herramientas más importantes de C. Se trata de una
variable cuyo contenido es la dirección de otra variable. Por ello se dice que la
variable-puntero señala a la otra variable. A estas variables se las llama también
apuntadores y pointers (aunque es mucho más utilizado el nombre de puntero).
Supongamos que tenemos una variable x a la que le hemos dado el valor 15;
supongamos también que el valor de x se almacena en la dirección 160000 de
memoria. Finalmente si p es un puntero cuyo valor es el número160000, entonces
p señala a x.
x p
(en la dirección 16000 de memoria) (variable puntero)
15 160000
x
15 p
(19)
fundamentos de programación
(Unidad 6) estructuras estáticas
tipo *nombrePuntero;
int *ptrSuma;
Eso significa que ptrSuma es un puntero que podrá señalar a variables o valores
de tipo int (enteras).
char *ptr2;
int **ptr3;
(20)
1er curso de administración de sistemas informáticos
autor: Jorge Sánchez – www.jorgesanchez.net
Ese mismo operador se utiliza para cambiar el valor de la variable a la que apunta
el puntero.
Ejemplo:
Y en este código:
double x=8;
double y=cubo(x)
(21)
fundamentos de programación
(Unidad 6) estructuras estáticas
double y=8.0;
cubo(&y);
en esta llamada y pasa su dirección a la función cubo. De esta forma cubo tiene
un puntero a y con el que modifica su contenido. Este es un buen ejemplo de
variable pasada por referencia.
(22)
1er curso de administración de sistemas informáticos
autor: Jorge Sánchez – www.jorgesanchez.net
int *p;
p=180000; /* p apunta a la dirección 18000 de memoria */
printf("%d\n",p); /* Escribe 18000 */
printf("%d",p+2); /* Escribe 18008 */
Es toda una sorpresa la última línea: lo esperable sería que p+2 sumara dos a la
dirección que contiene p. Pero le suma 8 (aunque en muchos compiladores
sumaría 4, debido a las diferencias del tamaño de los tipos estándar). De hecho lo
que suma son dos veces el tamaño de los enteros (se puede saber esta cifra
usando sizeof(int) ).
Es decir si p apunta a un entero, p+1 apunta al siguiente entero de la memoria.
De hecho, la expresión p++ hace que se incremente p para que apunte al
siguiente entero en memoria. Lo mismo vale para punteros de cualquier tipo de
datos que no sean enteros.
También se pueden restar punteros. El resultado es el número de bytes que
separan aun puntero de otro. Por ejemplo:
int A[]={2,3,4,5,6,7,8};
int ptr;
ptr=A;
Esa última instrucción hace que el puntero señale al primer elemento del array
(observar que no se ha utilizado el &). La instrucción última es equivalente a:
ptr=&A[0];
(23)
fundamentos de programación
(Unidad 6) estructuras estáticas
Desde ese momento se pueden utilizar los índices del array o la aritmética de
punteros para señalar a determinadas posiciones del array. Es decir: es lo mismo
A[3] que ptr+3. De esta forma también son equivalentes estas instrucciones:
x=A[3]; x=*(ptr+3);
Pero la analogía entre punteros y arrays es tal, que incluso se pueden utilizar
índices en el puntero:
x=ptr[3];
También sería válido (con lo cual se observa ya la gran equivalencia entre arrays
y punteros):
x=*(A+3);
Es decir, son absolutamente equivalentes los arrays y los punteros. Una de las
grandes utilidades de esta capacidad es utilizar esta equivalencia para pasar
punteros que señalan a arrays en las funciones (en ligar de utilizar realmente
arrays).
Aunque A se parece mucho a un puntero, se ha definido como array. Por ello,
no se permite hacer:
A++
Ya que eso dejaría sin referencia al array. Las variables de array no se pueden
modificar.
(24)
1er curso de administración de sistemas informáticos
autor: Jorge Sánchez – www.jorgesanchez.net
char nombre1[]={‘J’,’u’,’á’,’n’,’\0’};
char nombre2[]=”Juán”;
char *nombre3=”Juán”;
char cadena[80];
while (*p!=0){
printf("%c\n",*p); /*Escribe cada carácter en una
línea*/
p++;
}
(25)
fundamentos de programación
(Unidad 6) estructuras estáticas
printf(“%s”,nombre1);
También es posible utilizar el método puts al que se le pasa una cadena. Este
método escribe el texto de la cadena y el cambio de línea. Ejemplo:
puts(s);
scanf(“%s” ,nombre1);
Mejor aún se puede utilizar la función gets que sirve exclusivamente para leer
cadenas (es más aconsejable). Ejemplo:
gets(s);
No hace falta utilizar el signo &, ya que toda cadena es un array de caracteres y
por lo tanto s es la dirección inicial del texto.
(26)
1er curso de administración de sistemas informáticos
autor: Jorge Sánchez – www.jorgesanchez.net
La palabra const sirve para indicar al compilador que la cadena2 no puede ser
modificada en el interior de la función. Es importante poner el delimitador cero al
final de la primera cadena (tras haber copia el texto, es la instrucción
*cadena1=0).
La llamada a esa función podría ser:
Una función puede devolver un puntero que señale a un carácter (una función que
devuelve char *), pero si una función crea una cadena, al salir de la función, esta
cadena se elimina. Esto significa que una función no debe devolver la
dirección de una cadena creada dentro de la función.
char *s[10];
char *s[4]={"Ana","Pablo","Julián","Roberto"};
puts(s[2]); /* Escribe Julián */
(27)
fundamentos de programación
(Unidad 6) estructuras estáticas
char s[4][50]={"Ana","Pablo","Julián","Roberto"};
puts(s[2]); /* Escribe Julián */
char *p=s[2];
puts(p); /*También escribe Julián */
(28)
1er curso de administración de sistemas informáticos
autor: Jorge Sánchez – www.jorgesanchez.net
(29)
fundamentos de programación
(Unidad 6) estructuras estáticas
(30)
1er curso de administración de sistemas informáticos
autor: Jorge Sánchez – www.jorgesanchez.net
(6.6) estructuras
Son colecciones de variables de distinto tipo agrupadas bajo un mismo nombre.
Son equivalentes a los registros de otros lenguajes. Representan fichas de datos
referidas a la misma cosa.
(6.6.1) definición
Se trata de un tipo de datos formado por medio de variables de otros tipos. Por
ejemplo:
struct persona{
char nombre[25];
char apellidos[50];
char dni[10];
int edad;
};
(6.6.2) typedef
Una forma mucho más interesante de utilizar estructuras, consiste en declararlas
como definición de tipos. El ejemplo anterior podría utilizarse de esta forma:
struct persona{
char nombre[25];
char apellidos[50];
char dni[10];
int edad;
};
typedef struct persona Persona;
Con esa instrucción acabamos de definir el tipo Persona (a los nombres de tipo se
les suele poner la primera letra en mayúsculas). Ese tipo se puede utilizar igual
que los propios de C. Es decir:
(31)
fundamentos de programación
(Unidad 6) estructuras estáticas
pepe es una variable de tipo Persona. Se puede hacer todo lo anterior de esta
forma (definiendo la estructura y creando el tipo a la vez).
Ejemplo:
typedef struct{
char nombre[25];
char apellidos[50];
char dni[10];
int edad;
}Persona;
Persona pepe;
strcpy(pepe.nombre,”Pepe”);
strcpy(pepe.apellidos,"Villegas Varas”);
pepe.edad=12;
typedef struct{
char tipoVia;
char nombre[50];
int numero;
int piso;
char puerta[10];
} Direccion;
(32)
1er curso de administración de sistemas informáticos
autor: Jorge Sánchez – www.jorgesanchez.net
typedef struct{
char nombre[25];
char apellidos[50];
int edad;
Direccion direccion;
} Alumno;
typedef struct{
char nombre[25];
char apellidos[50];
int edad;
struct{
char tipoVia;
char nombre[50];
int numero;
int piso;
char puerta[10];
} direccion;
} Alumno;
Alumno pedro;
pedro.direccion.numero=7;
Persona pepe,jaime;
strcpy(pepe.nombre,”Pepe”);
strcpy(pepe.apellidos,"Villegas Varas”);
pepe.edad=12;
(33)
fundamentos de programación
(Unidad 6) estructuras estáticas
jaime=pepe;
typedef struct{
char nombre[25];
char apellidos[50];
char dni[10];
int edad;
}Persona;
(34)
1er curso de administración de sistemas informáticos
autor: Jorge Sánchez – www.jorgesanchez.net
Tras crear dicho tipo, podemos crear un array de Personas de esta forma:
Persona amigos[15];
Persona amigos[10];
amigos[0].nombre="Alfonso";
amigos[0].edad=25;
amigos[1].nombre="Ana";
amigos[1].edad=31;
puts(amigos[1].nombre);
punteros a estructuras
Ejemplo:
Persona ana;
Persona *ptr1=&ana;
ptr1 es un puntero que señala a variables de tipo Persona. En este ejemplo, ese
puntero señala a ana ya que toma su dirección. Para acceder a los valores a los
que señala el puntero, no se utiliza la expresión *ptr1 a la que estábamos
acostumbrados, sino que se utiliza el operador ->. De esta forma:
strcpy(ptr1->nombre,"Ana");
strcpy(ptr1->apellidos,"Fernandez Castro");
ptr1->edad=19;
printf("%s %s",ptr1->nombre,ptr1->apellidos);
Persona pedro;
strcpy(pedro.nombre,"Pedro");
strcpy(pedro.apellidos,"Herrera Quijano");
strcpy(pedro.dni,"12345678W");
pedro.edad=23;
En el código se observa que Pedro tiene 23 años. Supongamos que creamos una
función para subir la edad de una persona a un año.
(35)
fundamentos de programación
(Unidad 6) estructuras estáticas
La función sería:
Pero en la llamada:
subirEdad1(pedro);
printf("%d",pedro.edad);
Y la llamada se haría:
subirEdad2(&pedro);
printf("%d",pedro.edad); /* Sale 24, un año más */
(6.7) uniones
Es un tipo de dato muy parecido a las estructuras. En este caso los miembros
comparten el mismo espacio de almacenamiento. El gasto en bytes de las
uniones será el correspondiente al miembro que gasta más espacio.
El caso típico de unión sería:
union numero{
int x;
double y;
};
Lo que ganamos es que podemos asignar a esa variable valores tanto enteros
como de tipo double. Ejemplo:
(36)
1er curso de administración de sistemas informáticos
autor: Jorge Sánchez – www.jorgesanchez.net
struct color{
unsigned rojo:2;
unsigned verde:2;
unsigned azul:2;
unsigned transpar:3;
};
typedef{
unsigned rojo:2;
unsigned verde:2;
unsigned azul:2;
unsigned transpar:3;
} Color;
Color c1;
c1.rojo=3;
c1.verde=0;
c1.azul=0;
c1.transpar=5;
(6.9) enumeraciones
Las enumeraciones son otro tipo definido por el usuario que sirve para definir un
conjunto entero de constantes de enumeración. Las constantes de enumeración
son identificadores (que se suelen poner en mayúsculas) asociados a números
enteros.
Gracias a las enumeraciones se pueden utilizar tipos de datos que aportan una
mayor claridad en el código.
(37)
fundamentos de programación
(Unidad 6) estructuras estáticas
Ejemplo:
enum meses{
ENE, FEB, MAR, ABR, MAY, JUN, JUL, AGO, SEP, OCT, NOV,
DIC
};
También se puede utilizar typedef, para definir un tipo propio. De hecho se suele
utilizar más:
typedef enum {
ENE=1, FEB, MAR, ABR, MAY, JUN, JUL, AGO,SEP, OCT,
NOV, DIC
}Meses;
...
Meses m1;
(38)
1er curso de administración de sistemas informáticos
autor: Jorge Sánchez – www.jorgesanchez.net
typedef enum{
ESO1, ESO2, ESO3, ESO4, FP1, FP2, BACH1, BACH2, PREU
}Clases;
int main(){
Clases c1;
char *nombreClases[]={ "Primero de ESO",
"Segundo de ESO",
“Tercero de ESO",
"Cuarto de ESO",
"Formación profesional 1",
"Formación profesional 2",
"Bachiller 1",
"Bachiller 2",
"Preuniversitario"
};
int i;
for(i=ESO1;i<=PREU;i++){
puts(nombreClases[i]);
}
}
Ese bucle, muestra los nombres de todas las clases. Ese listado se podía hacer
sin enumeraciones, pero el código es así mucho más claro.
(39)