lab07 arreglos 2016

Upload: ben-hernan

Post on 05-Jul-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/15/2019 Lab07 Arreglos 2016

    1/16

    UNIVERSIDAD DE EL SALVADORFACULTAD DE INGENIER ÍA Y ARQUITECTURAESCUELA DE INGENIER ÍA EL ÉCTRICAINTRODUCCI ÓN A LA INFORM ÁTICA

    G U Í A No. 7

    ANSI C: ARREGLOS

    Profesor: Ing. Walter ZelayaInstructores: Brs. Edgardo G álvez, Benjam í n Hern ández y Edgardo Lar í n

    NOTA: Este laboratorio dura 2 semanas. La primera semana es arreglos y la segunda punteros .

    Gu ía No. 7 UES CICLO I – 2016 1/16

  • 8/15/2019 Lab07 Arreglos 2016

    2/16

    Introducci ón.

    La presente gu í a est á dedicada a explotar las virtudes de arreglos, comienza definici ón y declaraci ón de unarreglo. Se ver á como los arreglos pueden ser alimentados desde el teclado o desde un archivo ya sea utilizandolos elementos y el operador de direcci ón “&” o por medio de punteros. Los arreglos son esenciales en aquellasaplicaciones en las cuales se analizar án mucho datos de un mismo fen ómeno. Por ejemplo: al existir un

    terremoto en alguna parte del mundo diferentes sismó

    grafos al rededor del globo hacen miles de lecturas de lascuales se puede extraer informaci ón valiosa como epicentro, hipocentro, aceleraciones, velocidades,desplazamientos entre otros. Las lecturas de estos sensores son almacenadas en archivos para luego seranalizadas por medio de un programa que por lo general utiliza arreglos. De aqu í la obligaci ón de explotar lasvirtudes de los arreglos.

    Objetivo:

    • Utilizar arreglos para la soluci ón de problemas.• Relacionar punteros con arreglos• Alimentar arreglos desde teclado y archivos.

    Referencia te órica

    ¿Qu é es un arreglo?

    La definici ón ser í a algo as í :

    Un arreglo es un conjunto de variables del mismo tipo que tienen el mismo nombre y se diferencian en el í ndice.

    Pero ¿qu é quiere decir esto y para qu é lo queremos?. Pues bien, supongamos que somos un meteor ólogo yqueremos guardar en la computadora la temperatura que ha hecho cada hora del d í a. Para darle cierta utilidad alfinal, calcularemos la media de las temperaturas. Con lo que sabemos hasta ahora ser í a algo as í :

    1. #include 2.3. int main()4. {5. /* Declaramos 24 variables, una para cada hora del d í a */6. int temp1, temp2, temp3, temp4, temp5,7. temp6, temp7, temp8, temp9, temp10,8. temp11, temp12, temp13, temp14, temp15,9. temp16, temp17, temp18, temp19, temp20,

    10. temp21, temp22, temp23, temp0;11. int media;12. /* Ahora tenemos que dar el valor de cada una */13. printf( "Temperatura de las 0: " );14. scanf( "%i", &temp0 );15. printf( "Temperatura de las 1: " );16. scanf( "%i", &temp1 );17. printf( "Temperatura de las 2: " );

    Gu ía No. 7 UES CICLO I – 2016 2/16

  • 8/15/2019 Lab07 Arreglos 2016

    3/16

    18. scanf( "%i", &temp2 );19. printf( "Temperatura de las 23: " );20. scanf( "%i", &temp23 );21. media = ( temp0 + temp1 + temp2 + temp3 + ... + temp23 ) / 24;22. printf( "\nLa temperatura media es %i\n", media );23. return 0;24. }

    NOTA: Los puntos suspensivos los he puesto para no tener que escribir todo y que no ocupe tanto espacio, estosno se pueden usar en un programa.

    Para acortar un poco el programa podr í amos hacer algo as í :

    1. #include 2. int main()3. {4. /* Declaramos 24 variables, una para cada hora del d í a */5. int temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8;

    6. int temp9, temp10, temp11, temp12, temp13, temp14, temp15, temp16;7. int temp17, temp18, temp19, temp20, temp21, temp22, temp23, temp0;8. int media;9. /* Ahora tenemos que dar el valor de cada una */10. printf( "INTRO las temps desde las 0 hasta las 23: " );11. scanf( "%i %i %i ... %i", &temp0, &temp1, &temp2, ... &temp23 );12. media = ( temp0 + temp1 + temp2 + temp3 + ... + temp23 ) / 24;13. printf( "\nLa temperatura media es %i\n", media );14. }

    Y esto con un ejemplo que tiene tan s ólo 24 variables, ¡¡imag í nate si son m ás!! Y precisamente aqu í es dondenos vienen de perlas los arreglos. Vamos a hacer el programa con un arreglo. Usaremos nuestros conocimientosde bucles “for” y de “scanf”.

    1. #include 2. int main()3. {4. int temp[24];5. float media;6. int hora;7. /* Ahora tenemos que dar el valor de cada una */8. for( hora=0; hora

  • 8/15/2019 Lab07 Arreglos 2016

    4/16

    Como ves es un programa m ás r ápido de escribir (y es menos aburrido hacerlo), y m ás c ómodo para el usuarioque el anterior.

    Como ya hemos comentado cuando declaramos una variable lo que estamos haciendo es reservar una zona de lamemoria para ella. Cuando declaramos un arreglo lo que hacemos (en este ejemplo) es reservar espacio enmemoria para 24 variables de tipo int. El tama ño del arreglo (24) lo indicamos entre corchetes al definirlo. Estaes la parte de la definici ón que dice: Un arreglo es un conjunto de variables del mismo tipo que tienen el mismonombre.

    La parte final de la definici ón dice: y se diferencian en el í ndice. En ejemplo recorremos la matriz mediante unbucle for y vamos dando valores a los distintos elementos de la matriz.

    Para indicar a qu é elemento nos referimos usamos un n úmero entre corchetes (en este caso la variable hora), estenúmero es lo que se llama Índice. El primer elemento de la matriz en ANSI C tiene el í ndice 0, El segundo tieneel 1 y as í sucesivamente. De modo que si queremos dar un valor al elemento 4 ( í ndice 3) haremos:

    temp [ 3 ] = 20;

    NOTA: No hay que confundirse. En la declaraci ón del arreglo el n úmero entre corchetes es el n úmero deelementos, en cambio cuando ya usamos la matriz el n úmero entre corchetes es el í ndice.

    Declaraci ón de un arreglo

    La forma general de declarar un arreglo es la siguiente:

    tipo_de_dato nombre_del_arreglo[ dimensi ó n ];

    tipo_de_dato es uno de los tipos de datos conocidos (int, char, float...) o de los definidos por el usuario contypdef. En el ejemplo era int.nombre_del_arreglo es el nombre que damos al arreglo, en el ejemplo era temp.dimensi ón es el n úmero de elementos que tiene el arreglo.

    Como he indicado antes, al declarar un arreglo reservamos en memoria tantas variables del tipo_de_dato comolas indicada en dimensi ón.

    Sobre la dimensi ón de un arreglo

    Hemos visto en el ejemplo que tenemos que indicar en varios sitios el tama ño del arreglo: en la declaraci ón, enel bucle for y al calcular la media. Este es un programa peque ño, en un programa mayor probablemente habr á que escribirlo muchas m ás veces. Si en un momento dado queremos cambiar la dimensi ón del arreglo tendremosque cambiar todos. Si nos equivocamos al escribir el tama ño (ponemos 25 en vez de 24) cometeremos un error ypuede que no nos demos cuenta. Por eso es mejor usar una constante con nombre, por ejemplo ELEMENTOS.

    Gu ía No. 7 UES CICLO I – 2016 4/16

  • 8/15/2019 Lab07 Arreglos 2016

    5/16

    1. #include 2. #define ELEMENTOS 243. int main()4. {5. int temp[ELEMENTOS];6. float media;7. int hora;

    8. /* Ahora tenemos que dar el valor de cada una */9. for( hora=0; hora

  • 8/15/2019 Lab07 Arreglos 2016

    6/16

    Pero a ver qui én es el habilidoso que no se equivoca al meter los datos, no es dif í cil olvidarse alguno. Hemosindicado al compilador que nos reserve memoria para un arreglo de 24 elementos de tipo int. ¿Qu é ocurre simetemos menos de los reservados? Pues no pasa nada, s ólo que los elementos que falten valdr án cero.

    1. #include 2.3. int main()

    4. {5. int hora;6. /* Faltan los tres ú ltimos elementos */7. int temperaturas[24] = { 15, 18, 20, 23, 22, 24, 22, 25,8. 26, 25, 24, 22, 21, 20, 18, 17,9. 16, 17, 15, 14, 14 };10. for (hora=0 ; hora

  • 8/15/2019 Lab07 Arreglos 2016

    7/16

    En los dem ás casos podemos usar un m étodo alternativo, dejar al ordenador que cuente los elementos quehemos metido y nos reserve espacio para ellos:

    1. #include 2. int main()3. {

    4. int hora;5. /* Faltan los tres ú ltimos elementos */6. int temperaturas[ ] = { 15, 18, 20, 23, 22, 24, 22, 25,7. 26, 25, 24, 22, 21, 20, 18, 17,8. 16, 17, 15, 14, 14 };9. for ( hora=0 ; hora

  • 8/15/2019 Lab07 Arreglos 2016

    8/16

    Recorrer un arreglo

    En el apartado anterior ve í amos un ejemplo que mostraba todos los datos de un arreglo. Ve í amos tambi én lo quepasaba si met í amos m ás o menos elementos al inicializar la matriz.Ahora vamos a ver qu é pasa si intentamos imprimir m ás elementos de los que hay en la matriz, en este casointentamos imprimir 28 elementos cuando s ólo hay 24:

    1. #include 2. int main()3. {4. int hora;5. /* Faltan los tres ú ltimos elementos */6. int temperaturas[24] = { 15, 18, 20, 23, 22, 24, 22, 25, 26, 25,7. 24, 22, 21, 20, 18, 17, 16, 17, 15, 14,8. 14, 13, 13, 12 };9. for (hora=0 ; hora

  • 8/15/2019 Lab07 Arreglos 2016

    9/16

    8. {9. printf( "Temperatura de las %i: ", hora );10. scanf( "%i", &temp[hora] );11. media += temp[hora];12. }13. media = media / 24;14. printf( "\nLa temperatura media es %f\n", media );

    15. }

    Lo que sospechaba, lo he probado en mi ordenador y se ha bloqueado. He tenido que apagarlo. El problemaahora es que estamos intentando escribir en el elemento temp[24] que no existe y puede ser un lugarcualquiera de la memoria. Como consecuencia de esto podemos estar cambiando alg ún programa o dato de lamemoria que no debemos y el sistema hace pluf. As í que mucho cuidado con esto.

    Punteros a arreglos 1

    Aqu í tenemos otro de los importantes usos de los punteros, los punteros a arreglos. Estos est án í ntimamenterelacionados. Para que un puntero apunte a un arreglo se puede hacer de dos formas, una es apuntando al primerelemento del arreglo:

    int *puntero;int temperaturas[24];puntero = &temperaturas[0];

    El puntero apunta a la direcci ón del primer elemento. Otra forma equivalente, pero mucho m ás usada es:

    puntero = temperaturas;

    Con esto tambi én apuntamos al primer elemento del arreglo. Fijarse que el puntero tiene que ser del mismo tipoque el arreglo (en este caso int).

    Ahora vamos a ver c ómo acceder al resto de los elementos. Para ello empezamos por c ómo funciona un arreglo:Un arreglo se guarda en posiciones seguidas en memoria, de tal forma que el segundo elemento vainmediatamente despu és del primero en la memoria. En un ordenador en el que el tama ño del tipo int es de 32bits (4 bytes) cada elemento del arreglo ocupar á 4 bytes. Veamos un ejemplo:

    1. #include 2. int main()3. {4. int i;5. int temp[24];6. for( i=0; i

  • 8/15/2019 Lab07 Arreglos 2016

    10/16

    NOTA: Recuerda que %p sirve para imprimir en pantalla la direcci ón de una variable en hexadecimal.El resultado es (depende del ordenador):

    La direcci ó n del elemento 0 es 4c430.La direcci ó n del elemento 1 es 4c434.La direcci ó n del elemento 2 es 4c438.La direcci ó n del elemento 3 es 4c43c.

    ...La direcci ó n del elemento 21 es 4c484.La direcci ó n del elemento 22 es 4c488.La direcci ó n del elemento 23 es 4c48c.

    (Las direcciones est án en hexadecimal). Vemos aqu í que efectivamente ocupan posiciones consecutivas y quecada una ocupa 4 bytes. Si lo representamos en una tabla:

    Direcci ón 4C430 4C434 4C438 4C43CÍndice temp[0] temp[1] temp[2] temp[3]

    Ya hemos visto c ómo funcionas los arreglos por dentro, ahora vamos a verlo con punteros. Voy a poner unejemplo:

    1. #include 2. int main()3. {4. int i;5. int temp[24];6. int *punt;7. punt = temp;8. for( i=0; i

  • 8/15/2019 Lab07 Arreglos 2016

    11/16

    La segunda l í nea importante es punt++ . Con esto incrementamos el valor de punt, pero curiosamente aunqueincrementamos una unidad ( punt++ equivale a punt=punt+1 ) el valor aumenta en 4. Aqu í se muestra unade las caracter í sticas especiales de los punteros.

    Recordemos que en un puntero se guarda una direcci ón. Tambi én sabemos que un puntero apunta a un tipo dedatos determinado (en este caso int). Cuando sumamos 1 a un puntero sumamos el tama ño del tipo al queapunta. En el ejemplo el puntero apunta a una variable de tipo int que es de 4 bytes, entonces al sumar 1 lo quehacemos es sumar 4 bytes. Con esto lo que se consigue es apuntar a la siguiente posici ón int de la memoria, eneste caso es el siguiente elemento de la matriz.

    Cuando hemos acabado estamos en temp[24] que no existe. Si queremos recuperar el elemento1 podemoshacer punt = temp otra vez o restar 24 a punt:

    punt -= 24;

    con esto hemos restado 24 posiciones a punt (24 posiciones int*4 bytes por cada int= 96 posiciones).

    Vamos a ver ahora un ejemplo de c ómo recorrer la matriz entera con punteros y c ómo imprimirla:

    1. #include 2. int main(int argc,char *argv[])3. {4. int temperaturas[24] = { 15, 18, 20, 23, 22, 24, 22, 25,5. 26, 25, 24, 22, 21, 20, 18, 17,6. 16, 17, 15, 14, 14, 13, 12, 12 };7. int *punt;8. int i;9. punt = temperaturas;10. for( i=0 ; i

  • 8/15/2019 Lab07 Arreglos 2016

    12/16

    Cuando acabamos punt apunta a temperaturas[24] , y no al primer elemento, si queremos volver a recorrerla matriz debemos volver como antes al comienzo. Para evitar perder la referencia al primer elemento de lamatriz (temperaturas[0]) se puede usar otra forma de recorrer la matriz con punteros:

    1. #include 2. int main(int argc,char *argv[])3. {4. int temperaturas[24] = { 15, 18, 20, 23, 22, 24, 22, 25, 26, 25, 5. 24,22, 21, 20, 18, 17, 16, 17, 15, 14,6. 14, 13, 12, 12 };7.8. int *punt;9. int i;10. punt = temperaturas;11. for( i=0 ; i

  • 8/15/2019 Lab07 Arreglos 2016

    13/16

  • 8/15/2019 Lab07 Arreglos 2016

    14/16

    Programa B:

    1. int main ( int argc, char * argv[ ] )2. {3. float A [ MAX ];4. int indice = 0, p;5. do if ( indice >= 8 ) break ;

    6. else scanf ( "%f", & A [ indice++ ] );7. while ( getchar ( ) != EOF ) ;8. printf("\nIndice Dato Direccion\n" );9. for ( p = 0 ; p < indice ; p++ )10. printf ( "%4d%14.3g %10x\n", p, A [ p ], & A[ p ] );11. return 0;12. }

    PARTE 2. Lectura desde archivo.

    /* Con este programa se trata de mostrar como asignar datos desde el un archivo a un arreglo. Recordar queJAMAS se debe sobre pasar la capacidad del arreglo y por eso se utiliza el break.*/1. #include 2. #define MAX 20 //Limite del arreglo3. int main ( int argc, char * argv[ ] )4. {5. float A [ MAX ];6. int indice = 0, p;7. FILE *f;8. if ( argc != 2 ) exit ( 1 );

    9. else10. {11. f = fopen( argv[ 1 ], "r" );12. for ( indice = 0; indice < MAX; indice++ )13. fscanf( f, "%f", A + indice );14. printf ( "\n\n\nIndice Dato Direccion\n" );15. for ( p = 0 ; p < indice ; p++ )16. printf ( "%4d%14.3g %10x\n", p, *(A + p), A + p );17. } // fin if - else18. return 0;19. }

    Una soluci ón sin punteros, es cambiando las siguientes l í neas:

    13. fscanf( f, "%f", & A[ indice ] );16. printf ( "%4d%14.3g %10x\n", p, A [ p ], & A[ p ] );

    Gu ía No. 7 UES CICLO I – 2016 14/16

  • 8/15/2019 Lab07 Arreglos 2016

    15/16

    PARTE 3. M étodo de la burbuja.

    /*Este programa ordena un arreglo de mayor a menor utilizando el m é todo de la

    burbuja.*/1. #include 2. #define MAX 50 //Limite del arreglo3. int main ( int argc, char * argv[ ] )4. {5. float A[ MAX ];6. int indice, pasada, temp;7. FILE *f;8. if ( argc != 2 ) exit ( 1 );9. else10. {11. f = fopen ( argv [ 1 ], "r" );12. for ( indice = 0 ; indice < MAX ; indice++ )13. fscanf( f , "%f", A + indice );14. /*En esta secci ó n se imprime el arrego original*/15. printf ("\n\nArreglo original\n\n");16. for ( indice = 0 ; indice < MAX ; indice++ )17. if ( !( indice % 10 ) ) printf ( "\n" );18. else printf( "%8g ", * ( A + indice ) );19. /*En esta seccion se aplica el metodo de la burbuja*/20. for ( pasada = 1 ; pasada < MAX ; pasada++ )21. for ( indice = 0 ; indice < MAX -1 ; indice++ )22. if ( A[ indice ] > A[ indice + 1 ] )23. {24. temp = A[ indice ] ;25. A[ indice ] = A[ indice + 1 ];26. A[ indice + 1 ] = temp;27. }// fin if28. /*En esta seccion se imprime el arrego ordenado*/29. printf ("\n\nArreglo ordenado\n\n");30. for ( indice = 0 ; indice < MAX ; indice++ )31. if ( !( indice % 10 ) ) printf ( "\n" );32. else printf( "%8g ", * ( A + indice ) );33. fclose( f );34. printf("\n");35. } // fin else36. return 0;

    37. } // fin main

    Gu ía No. 7 UES CICLO I – 2016 15/16

  • 8/15/2019 Lab07 Arreglos 2016

    16/16

    Asignaci ón:

    1. Utilizar el m étodo de la burbuja, para ordenar un arreglo de n úmeros reales y que se impriman de mayor amenor.

    2. Guardar en un arreglo los primeros 50 n úmeros primos, y despu és estos datos poder guardarlos en un archivo

    local.

    3. Utilizando arreglos y la regla del trapezoidal encontrar el área bajo la curva. Elegir una funci ón matem ática yleer desde el teclado n, xo, xn.

    4. En un arreglo de 80 elementos asignar los n úmeros de Bernoulli. Es decir que en el primer elemento deber á estar B1 en se segundo elemento B2 y as í sucesivamente. Adem ás se debe imprimir en un archivo en forma detabla.

    5. Por medio de un programa escrito en ANSI C guardar en un arreglo los primeros 100 t érminos de la siguienteserie.

    Gu ía No. 7 UES CICLO I – 2016 16/16