cap 04 - arreglos

43
 1 Capítulo 4 - Ar regl os Lenguaje de Programación

Upload: max-jara-ortiz

Post on 02-Nov-2015

217 views

Category:

Documents


0 download

DESCRIPTION

MUY DESCRIPTIVO

TRANSCRIPT

  • 1Captulo 4 - ArreglosLenguaje de Programacin

  • 21. Introduccin

    2. Arreglos

    3. Declaracin de arreglos

    4. Ejemplos usando arreglos

    5. Pasando Arreglos a Funciones como argumentos

    6. Ordenando arreglos

    7. Clculo de la media, mediana y la moda usando arreglos

    8. Bsqueda en arreglos: Bsqueda lineal y bsqueda binaria

    9. Arreglos Bidimensionales

    Contenido

  • 3Introduccin (1)

    Suponer que se necesita ingresar datos numricos desde el teclado que deben

    guardarse para uso posterior.

    Ej.: mostrar las notas de un curso de mayor a menor (ordenados

    descendentemente, como en el excel).

  • 4Introduccin (2)

    Otra situacin: Suponer que se necesita hacer clculos matemticos con matrices.

    Ej.: resolver ecuaciones de 2, 3, o N variables de primer grado.

  • 5Introduccin (3)

    Las 2 situaciones descritas anteriormente no se pueden resolver directamente con variables simples.

    Es decir, su solucin sera tan engorrosa de escribir que no valdra la pena resolverlos computacionalmente.

    Para resolver estas situaciones los lenguajes de programacin de alto nivel como el C, tienen una facilidad conocida como ARREGLOS.

  • 6Definiciones

    Un arreglo es una facilidad del lenguaje que permite manejar una gran cantidad de datos del

    mismo tipo bajo un mismo nombre o

    identificador.

    Un vector es un arreglo unidimensional.

    Una matriz es un arreglo bidimensional.

  • 7Definiciones (2)

    El tamao del arreglo est determinado por la cantidad mxima de datos que puede

    almacenar.

    Es una entidad esttica porque el tamao es fijo a lo largo de todo el programa.

    Para hacer arreglos de tamao variable se utilizan punteros (arreglos dinmicos).

  • 8Definiciones (3)

    Cada dato almacenado en el arreglo, se denomina elemento.

    Luego, tamao = nmero mximo de elementos

    Cada elemento es identificado con una posicindentro del arreglo o ndice.

  • 9Arreglos

    Arreglo Es un grupo de posiciones consecutivas

    de memoria.

    Comparten el mismo nombre y tipo.

    Para referirnos a un elemento se debe especificar: Nombre del arreglo.

    Posicin numrica.

    Formato:nombrearreglo[ posicin numrica ]

    El primer elemento est en la posicin 0

    Un arreglo de n elementos llamado c:

    c[ 0 ], c[ 1 ]...c[ n 1 ]

    Nombre del arreglo

    (Notar todos los

    elementos de este

    arreglo tienen el

    mismo nombre, c)

    Posicin numrica

    del elemento en el

    arreglo c

    c[6]

    -45

    6

    0

    72

    1543

    -89

    0

    62

    -3

    1

    6453

    78

    c[0]

    c[1]

    c[2]

    c[3]

    c[11]

    c[10]

    c[9]

    c[8]

    c[7]

    c[5]

    c[4]

  • 10

    Arreglos

    Los elementos de un arreglo se utilizan en las expresiones de C como cualquier otra variable.

    c[ 0 ] = 3;

    printf( "%d", c[ 0 ] );

    Los ndices son nmeros enteros positivos.

    Los ndices pueden ser variables de tipo int.c[ y - 2 ] == c[ 3 ] == c[ x ]

    Para trabajar con los elementos puede ser:

    uno a uno.

    por medio de bucles (for, while, do-while).

  • 11

    Uso de elementos de arreglos (1)

    Ejemplos de uso de arreglos uno a uno son los siguientes:

    a[5] = 0.8;

    a[9] = 30. * a[5];

    a[0] = 3. * a[9] - a[5]/a[9];

    a[3] = (a[0] + a[9])/a[3];

  • 12

    Uso de elementos de arreglos (2)

    Ejemplo de uso de arreglos con bucles es el siguiente:

    a[0] = 1;

    for(i=1;i

  • 13

    Declaracin de Arreglos

    Para declarar arreglos, se debe especificar:

    El nombre.

    El tipo de arreglo.

    El nmero de elementosTipo Nombre_de_Arreglo[Nro_de_Elementos];

    Ejemplos:int c[ 10 ];

    float myArray[ 3284 ];

  • 14

    Inicializacin de arreglos

    Inicializacinint n[ 5 ] = { 1, 2, 3, 4, 5 };

    Si no se colocan todos los inicializadores, los dems a la derecha se ponen en 0

    int n[ 5 ] = { 1 };

    El primer elemento tiene valor 1 y el resto tiene valor 0.

    Si se asignan ms inicializadores que el tamao especificado, se genera un error de sntaxis.

    Si se omite el tamao, el nmero de los inicializadores lo determina

    int n[ ] = { 1, 2, 3, 4, 5 };

    Como hay 5 inicializadores, entonces es un arreglo de 5 elementos

  • 15

    1. Inicializacin

    del arreglo

    2. Lazo

    3. Impresin

    1 /*

    2 Histograma */

    3 #include

    4 #define SIZE 10

    5

    6 int main()

    7 {

    8 int n[ SIZE ] = { 19, 3, 15, 7, 11, 9, 13, 5, 17, 1 };

    9 int i, j;

    10

    11 printf( "%s%13s%17s\n", "Elemento", "Valor", "Histograma" );

    12

    13 for ( i = 0; i

  • 16

    Resultado

    obtenido

    Elemento Valor Histograma

    0 19 *******************

    1 3 ***

    2 15 ***************

    3 7 *******

    4 11 ***********

    5 9 *********

    6 13 *************

    7 5 *****

    8 17 *****************

    9 1 *

  • 17

    Recordar

    Para usar arreglos en los programas:

    Declarar el arreglo.

    Dar valores iniciales, si es necesario.

    Usar los elementos en base al ndice.

  • 18

    Ejemplos de aplicacin

    Suma de vectores.

    Mximo y mnimo de un conjunto de datos.

    Clculo de la varianza de un conjunto de datos.

  • 19

    Arreglos y Funciones

    Un arreglo puede ser pasado como parmetro de una funcin.

    Matemticamente, esto puede expresarse como:

    y = F(X)

    donde X es un vector (x1, x2, , xN)

    Una funcin NO PUEDE DEVOLVER un arreglo como resultado.

  • 20

    Arreglos como argumentos de Funciones

    Para pasar un arreglo como argumento de una funcin, se especifica el nombre del arreglo sin corchetes.

    int myArray[ 24 ];

    myFunction( myArray, 24 );

    Tambin se pasa el tamao del arreglo, porque la computadora no tiene forma de saber cuantos elementos tiene el arreglo.

    El arreglo se pasa con llamadas por referencia. El nombre del arreglo equivale a la direccin del primer

    elemento.

    La funcin sabe en donde est almacenado el arreglo. Modifica la direccin de memoria original.

  • 21

    Arreglos como argumentos de Funciones

    Pasando los elementos del arreglo

    Se pasan con llamada por valor.

    Se pasa el nombre del elemento y su posicin: (myArray[ 3 ]) a la funcin.

  • 22

    Arreglos como argumentos de Funciones

    Prototipo de funcin void modifyArray( int b[], int

    arraySize );

    Los nombres de parmetros son opcionalesint b[] puede ser escrito como int []

    int arraySize puede ser escrito como int

  • 23

    1. Definiciones de Funciones

    2. Pasar arreglo a funcin

    2.1 Pasa elemento de arreglo a la funcin

    3. Muestra

    1 /* Fig. 6.13: fig06_13.c

    2 Passing arrays and individual array elements to functions */

    3 #include

    4 #define SIZE 5

    5

    6 void modifyArray( int [], int ); /* appears strange */

    7 void modifyElement( int );

    8

    9 int main()

    10 {

    11 int a[ SIZE ] = { 0, 1, 2, 3, 4 }, i;

    12

    13 printf( "Effects of passing entire array call "

    14 "by reference:\n\nThe values of the "

    15 "original array are:\n" );

    16

    17 for ( i = 0; i

  • 24

    3.1

    Funciones

    33

    34 void modifyArray( int b[], int size )

    35 {

    36 int j;

    37

    38 for ( j = 0; j

  • 25

    Aplicacin: Ordenando Datos

    Ordenar datos es importante en computacin, porque permite: Encontrar datos ms rpidamente.

    Hacer clculos estadsticos, como la moda.

    Existen mltiples algoritmos de ordenamiento de datos: Burbuja (bubblesort).

    Por seleccin.

    Por insercin.

    Shell.

    Rpido (quicksort).

    Bin-sort.

    Radix-sort.

  • 26

    Mtodo de la Burbuja

    Ordenamiento por Burbuja (sinking sort) Varias pasadas a travs del arreglo.

    Pares sucesivos son comparados. Si el orden es creciente (identicos ), no se cambia.

    Si el orden es decreciente, los elementos se intercambian.

    Se repite el procedimiento.

    Ejemplo:

    original: 3 4 2 6 7

    pasada 1: 3 2 4 6 7

    pasada 2: 2 3 4 6 7

    Los elementos pequeos flotan hacia arriba

  • 27

    Implementacin en C

    void Burbuja(int a[],int tam){

    int pass,j,aux;

    for(pass=1; pass

  • 28

    Clculo de la media, mediana y la moda

    Promedio

    Mediana es el dato en el medio en una lista ordenada

    Conjunto: 1, 1, 2, 3, 4, 5, 5

    3 es la mediana

    Moda es el dato ms frecuente Conjunto: 1, 2, 1, 2, 3, 1, 5, 4

    1 es la moda

  • 29

    Bsqueda en arreglos: Bsqueda lineal

    Buscar un arreglo por un valor clave

    Bsqueda lineal

    Simple

    Compara cada elemento del arreglo con el valor clave

    til para pequeos arreglos sin ordenar

  • 30

    Bsqueda en arreglos: Bsqueda binaria

    Bsqueda binaria Para arreglos ordenados

    Compara el elemento del medio con la clave Si son iguales, se encontr el valora clave

    Si la clave < medio, se busca en la primera mitad del arreglo

    Si la clave > medio, se busca en la otra mitad

    Se repite sucesivamente

    Es muy rpido; mximo en n pasos, donde 2n > nmero de elementos

    30 element array takes at most 5 steps 25 > 30 so at most 5 steps

  • 31

    Otra situacin especial

    Se necesita manipular texto: palabras, frases, oraciones.

    Slo tenemos los datos de tipo char.

    La solucin es utilizar arreglos de caracteres (conocidos como cadenas de

    caracteres).

  • 32

    Arreglos de Caracteres (1)

    La palabra juan se representa como un arreglo esttico de caracteres.

    Los arreglos de caracteres se inicializan :char palabra[] = "juan";

    El caracter Nulo '\0' indica fin de la cadena.

    Luego, palabra[] tiene 5 elementos

    Esto es equivalente achar palabra[] = {'j', 'u', 'a', 'n',

    '\0' };

  • 33

    Arreglos de Caracteres (2)

    Se puede acceder a los caracteres en forma individualpalabra[ 3 ] es el caracter n

    El nombre del arreglo es la direccin del arreglo, as que & no es necesario para scanf

    scanf( "%s", palabra );

    Lee caracteres hasta encontrar un espacio en blanco

    Puede escribir ms del fin del arreglo, por lo que se debe tener cuidado

  • 34

    1. Inicializa

    cadenas

    2. Muestra

    cadenas

    2.1 Define lazo

    2.2 Muestra

    caracteres

    individuales

    2.3 Ingresa

    cadena

    3. Muestra

    cadena

    1 /*

    2 Treating character arrays as strings */

    3 #include

    4

    5 int main()

    6 {

    7 char string1[ 20 ], string2[] = "string literal";

    8 int i;

    9

    10 printf(" Enter a string: ");

    11 scanf( "%s", string1 );

    12 printf( "string1 is: %s\nstring2: is %s\n"

    13 "string1 with spaces between characters is:\n",

    14 string1, string2 );

    15

    16 for ( i = 0; string1[ i ] != '\0'; i++ )

    17 printf( "%c ", string1[ i ] );

    18

    19 printf( "\n" );

    20 return 0;

    21 }

  • 35

    Resultado del ejemplo

    Enter a string: Hello there

    string1 is: Hello

    string2 is: string literal

    string1 with spaces between characters is:

    H e l l o

  • 36

    Arreglos Bidimensionales

    Son como matrices: se especifica la fila y luego la columna.

    Tablas en filas y columnas (arreglo de m por n).

    Por lo tanto, los arreglos tienen dos ndices: uno para la fila y otro para la columna.

  • 37

    Arreglos Bidimensionales

    Fila 0

    Fila 1

    Fila 2

    Columna 0 Columna 1 Columna 2 Columna 3

    a[ 0 ][ 0 ]

    a[ 1 ][ 0 ]

    a[ 2 ][ 0 ]

    a[ 0 ][ 1 ]

    a[ 1 ][ 1 ]

    a[ 2 ][ 1 ]

    a[ 0 ][ 2 ]

    a[ 1 ][ 2 ]

    a[ 2 ][ 2 ]

    a[ 0 ][ 3 ]

    a[ 1 ][ 3 ]

    a[ 2 ][ 3 ]

    Indice de fila

    Nombre de

    Arreglo

    Indice de columna

  • 38

    Arreglos Bidimensionales

    Inicializacin int b[ 2 ][ 2 ] = { { 1, 2 }, { 3, 4 } };

    Inicializadores se agrupan por filas entre llaves

    Elementos no especificados se ponen a ceroint b[ 2 ][ 2 ] = { { 1 }, { 3, 4 } };

    Referenciando elementos Se especifica fila, luego columna

    printf( "%d", b[ 0 ][ 1 ] );

    1 2

    3 4

    1 0

    3 4

  • 39

    1. Inicializa

    variables

    1.1 Declara

    funciones

    1.2 Inicializa studentGrades[

    ][]

    2. Llama funciones minimum,

    maximum, y

    average

    1 /* Fig. 6.22: fig06_22.c

    2 Double-subscripted array example */

    3 #include

    4 #define STUDENTS 3

    5 #define EXAMS 4

    6

    7 int minimum( const int [][ EXAMS ], int, int );

    8 int maximum( const int [][ EXAMS ], int, int );

    9 double average( const int [], int );

    10 void printArray( const int [][ EXAMS ], int, int );

    11

    12 int main()

    13 {

    14 int student;

    15 const int studentGrades[ STUDENTS ][ EXAMS ] =

    16 { { 77, 68, 86, 73 },

    17 { 96, 87, 89, 78 },

    18 { 70, 90, 86, 81 } };

    19

    20 printf( "The array is:\n" );

    21 printArray( studentGrades, STUDENTS, EXAMS );

    22 printf( "\n\nLowest grade: %d\nHighest grade: %d\n",

    23 minimum( studentGrades, STUDENTS, EXAMS ),

    24 maximum( studentGrades, STUDENTS, EXAMS ) );

    25

    26 for ( student = 0; student

  • 40

    3. Define

    funciones

    33

    34 /* Find the minimum grade */

    35 int minimum( const int grades[][ EXAMS ],

    36 int pupils, int tests )

    37 {

    38 int i, j, lowGrade = 100;

    39

    40 for ( i = 0; i

  • 41

    3. Define

    funciones

    65 int i, total = 0;

    66

    67 for ( i = 0; i

  • 42

    Salida del

    programa

    The array is:

    [0] [1] [2] [3]

    studentGrades[0] 77 68 86 73

    studentGrades[1] 96 87 89 78

    studentGrades[2] 70 90 86 81

    Lowest grade: 68

    Highest grade: 96

    The average grade for student 0 is 76.00

    The average grade for student 1 is 87.50

    The average grade for student 2 is 81.75

  • Atencin de Preguntas