Introducción a la Programación 5. Arrays (tensor, arreglo...) y Funciones Roberto Marabini — Introduccin a la programacin — ETS – p.1/?? Objetivo de esta clase Vamos a escribir un programa que genere 10 números aleatorios y los ordene. Para ello haremos uso de una nueva variable denominada Array Roberto Marabini — Introduccin a la programacin — ETS – p.2/?? Array Un array nos facilita trabajar con un conjunto de variables del mismo tipo. Si se desea trabajat con cinco enteros unoo puede declararlos directamente: int a, b, c, d, e; En teoría se puede hacer lo mismo si se necesitan 1000 pero es más sencillo hacer lo siguiente: int a[5]; Roberto Marabini — Introduccin a la programacin — ETS – p.3/?? Array Se puede acceder a cualquiera de los elementos de un array usando un índice El indice empieza en 0 Así int a[5] contiene 5 enteros que se acceden como sigue: int a[5]; a[0] a[1] a[2] a[3] a[4] = = = = = 12; 9; 14; 5; 1; Roberto Marabini — Introduccin a la programacin — ETS – p.4/?? Array Una de las ventajas de usar arrays es que se pueden inicializar facilmente usando un bucle. Por ejemplo, para inicializar a[5] a zero: int a[5]; int i; for (i=0; i<5; i++) a[i] = 0; Roberto Marabini — Introduccin a la programacin — ETS – p.5/?? Array El programa siguiente inicializa el array al valor del indice y lo imprime por pantalla (array1.c) #include <stdio.h> int main() { int a[5]; int i; for (i=0; i<5; i++){ a[i] = i; printf("a[%d] = %d\n", i, a[i]); } return 0; } Roberto Marabini — Introduccin a la programacin — ETS – p.6/?? Rand program Un ejemplo un poco más complicado del uso de arrays: #include <stdio.h> #define MAX 10 long a[MAX]; long rand_seed=11; int my_rand(){ rand_seed = rand_seed * 1103515245 +12345; return (unsigned int)(rand_seed / 65536) % 32768; } int main(){ long i,t,x,y; /* fill array */ for (i=0; i < MAX; i++){ a[i]=my_rand(); printf("%d\n",a[i]); } /* more stuff will go here in a minute */ return 0; } Roberto Marabini — Introduccin a la programacin — ETS – p.7/?? Rand program La línea #define declara una constante llamada MAX. Los nombres de constantes se escriben tradicionalmente en Mayúscula (facilita portabilidad y legibilidad) #include <stdio.h> #define MAX 10 long a[MAX]; long rand_seed=11; int my_rand(){ rand_seed = rand_seed * 1103515245 +12345; return (unsigned int)(rand_seed / 65536) % 32768; } int main(){ long i,t,x,y; /* fill array */ for (i=0; i < MAX; i++){ a[i]=my_rand(); printf("%d\n",a[i]); } /* more stuff will go here in a minute */ Roberto Marabini — Introduccin a la programacin — ETS – p.8/?? return 0; Rand program Hay código fuera de main. La línea int my_rand() declara una función. El programa empieza en main y al llegar a la línea a[i]=my_rand() ejecuta int my_rand(){} #include <stdio.h> #define MAX 10 long a[MAX]; long rand_seed=11; int my_rand(){ rand_seed = rand_seed * 1103515245 +12345; return (unsigned int)(rand_seed / 65536) % 32768; } int main(){ long i,t,x,y; /* fill array */ for (i=0; i < MAX; i++){ a[i]=my_rand(); // LLAMA A LA FUNCION MY_RAND printf("%d\n",a[i]); Roberto Marabini — Introduccin a la programacin — ETS – p.9/?? } /* more stuff will go here in a minute */ Rand program La línea a[MAX] declara una variable global. Esto, accesible des cualquiera de las funciones #include <stdio.h> #define MAX 10 long a[MAX]; long rand_seed=11; // use time int my_rand(){ rand_seed = rand_seed * 1103515245 +12345; return (unsigned int)(rand_seed / 65536) % 32768; } int main(){ long i,t,x,y; /* fill array */ for (i=0; i < MAX; i++){ a[i]=my_rand(); // LLAMA A LA FUNCION MY_RAND printf("%d\n",a[i]); } /* more stuff will go here in a minute */ return 0; Roberto Marabini — Introduccin a la programacin — ETS – p.10/?? } Rand program La línea int rand_seed=11 declara otra variable global. rand_seed es inicializado a 11 cada vez que se ejecuta el programa. #include <stdio.h> #define MAX 10 long a[MAX]; long rand_seed=11; // use time int my_rand(){ rand_seed = rand_seed * 1103515245 +12345; return (unsigned int)(rand_seed / 65536) % 32768; } int main(){ long i,t,x,y; /* fill array */ for (i=0; i < MAX; i++){ a[i]=my_rand(); // LLAMA A LA FUNCION MY_RAND printf("%d\n",a[i]); } /* more stuff will go here in a minute */ Roberto Marabini — Introduccin a la programacin — ETS – p.11/?? return 0; Rand program main es bastante normal. Se declaran 4 enteros localmente Se rellena el array a usando un bucle a[0] se refiere al primer entero del array, a[1] al segundo, etc. y como todos recordais /* */ y // son comentarios more stuff goes here in a minute (rand1.c) int main(){ long i,t,x,y; /* fill array */ for (i=0; i < MAX; i++){ a[i]=my_rand(); // LLAMA A LA FUNCION MY_RAND printf("%d\n",a[i]); } /* more stuff will go here in a minute */ return 0; } Roberto Marabini — Introduccin a la programacin — ETS – p.12/?? Rand program Este código ordena los números de menor a mayor. (rand2.c) /* bubble sort the array */ for (x=0; x < MAX-1; x++) for (y=0; y < MAX-x-1; y++) if (a[y] > a[y+1]) { t=a[y]; a[y]=a[y+1]; a[y+1]=t; } /* print sorted array */ printf("--------------------\n"); for (i=0; i < MAX; i++) printf("%d\n",a[i]); Veámoslo en detalle Roberto Marabini — Introduccin a la programacin — ETS – p.13/?? Ejercicio Reescribe el programa de forma que bubble sort the array sea una funcion. poner turboC Pistas: La funcion debe declararse como: void bubble_sort() Copia entre llaves {} el código Añade las variables locales necesarias Roberto Marabini — Introduccin a la programacin — ETS – p.14/?? Erores típicos C no comprueba si el valor del índice es válido. Si el índice es ilegal el programa no funcionará correctamente. array2.c Cuando llames a una función usa “()” incluso aunque no haya que pasar parámetros. C aceptará a[i]=rand; pero no llamara a la función sino que almacenará el valor del puntero a la función en a[i].funcion.c Roberto Marabini — Introduccin a la programacin — ETS – p.15/?? Resumen de Arrays arrayplu.c int a[5]; int a[]={2,3,4,5,6}; a[i], 0<=i<4 ————— punteros reserva dinámica de memoria Roberto Marabini — Introduccin a la programacin — ETS – p.16/??