Make your own free website on Tripod.com

Práctica #9

Arreglos

9.1 Arreglos.

9.1.1 Ejemplo #1.

9.2 Poligonos.

9.2.1 Ejemplo #2.
9.2.2 Ejemplo #3.

9.3 Matrices.

9.3.1 Ejemplo #4.
9.3.2 Ejemplo #5.

9.4 Actividad #1.

9.5 Actividad #2.

9.1 Arreglos.

Un arreglo unidimensional o vector es un grupo de posiciones en memoria relacionados entre sí, por el hecho de que todos tienen el mismo nombre y son del mismo tipo. Para hacer referencia a una posición en particular o elemento dentro del arreglo, se especifican el nombre del arreglo y el número de posición, es decir, su índice.


Sintaxis de la Declaración
int var_arreglo [ Num_datos ] ;


Sintaxis para el Acceso
var_arreglo [ posición ] = valor_entero ;

A los vectores o arreglos se pueden asignar valores al ser declarados.

Sintaxis de la Declaración con Asignación de Datos
int edades [8] = { 20,30,26,21,19,16,56,15};
char materia[13] = {'P','r','o','g','r','a','m','a','c','i','o','n','\x0'};
9.1.1 Ejemplo #1.

void main ( )
{
    int i , lista [ 10 ] , sum = 0 ;
    clrscr();
    cprintf ( " Introduce 10 datos : \n\r " ) ;
    for ( i = 0 ; i < 10 ; i ++ )
    {
        cprintf ( " \n\r Dato %d = " , i + 1 ) ;
        scanf ( " %d " , & lista [ i ] ) ;
        sum = sum + lista [ i ] ;
    }
    cprintf ( " \n\r \n\r Sumaron = % d " , sum ) ;
    getch ( ) ;
}

9.2 Polígonos.

Un polígono es una figura de tres o más lados, la cual podemos definir matemáticamente a partir de valores de coordenadas en un plano. Para declarar un polígono en un lenguaje de programación se declara un conjunto de valores enteros de cada uno de los valores de las coordenadas X y Y.

La función para dibujar el contorno de un polígono es drawpoly, y para dibujar el polígono con relleno es fillpoly.

Sintaxis

drawpoly ( num_lados , var_poligono );
fillpoly ( num_lados , var_poligono );

Declaración

La variable la declaramos como un conjunto de números enteros conocido como vector o arreglo.
int poly [ n ] ;

Asignación

Los valores de las coordenadas se asignan a cada posición del vector, ya sea una coordenada fija o una coordenada variable.

poly[0] = x1 ;
poly[1] = 100 ;

9.2.1 Ejemplo #2.

void triangulo ( )
{
    int tri [ 6 ] ;
    tri [ 0 ] = 100 ;
    tri [ 1 ] = 150 ;
    tri [ 2 ] = 400 ;
    tri [ 3 ] = 250 ;
    tri [ 4 ] = 150 ;
    tri [ 5 ] = 200 ;
    setfillstyle( 1 , LIGHTGRAY ) ;
    fillpoly( 3 , tri ) ;
    getch( );
}

9.2.2 Ejemplo #3.

void box ( int x1 , int y1 , int x2 , int y2 , int relleno , int color )
{
    int poly [ 8 ] ;
    poly [ 0 ] = x1 ;
    poly [ 1 ] = y1 ;
    poly [ 2 ] = x2 ;
    poly [ 3 ] = y1 ;
    poly [ 4 ] = x2 ;
    poly [ 5 ] = y2 ;
    poly [ 6 ] = x1 ;
    poly [ 7 ] = y2 ;
    setfillstyle ( relleno , color ) ;
    fillpoly ( 4 , poly ) ;
}

9.3 Matrices.

Los arreglos pueden tener múltiples subíndices, se les conoce como subíndice o matriz. Una aplicación común de los arreglos con múltiples subíndices es la representación de tablas de valores, donde los datos están organizados en forma de renglones y columnas. Para identificar un elemento particular de la tabla, se deben especificar dos subíndices; el primero identifica el renglón del elemento y el segundo es la columna del elemento.

Sintaxis
tipo_de_dato var_arreglomultidim [ #ren ] [ #col ] ;
9.3.1 Ejemplo #4.

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

Columnas
0 1 2
Renglones 0 1 2 3
1 4 5 6

void imprime ( int matriz [ 2 ] [ 3 ] )
{
    int i , j ;
    for ( i = 0 ; i < 2 ; i + + )
        for ( j = 0 ; j < 3 ; j + + )
        {
            gotoxy (5*i, 5*j );
            cprintf ( "%d",M[ i ] [ j ] ) ;
            getch ( ) ;
        }
}

Este es un arreglo bidimensional llamado matriz definida por un 2 renglones y 3 columnas donde se almacenan datos, y para su manipulación necesitaremos dos contadores para el recorrido de los mismos. Los renglones los relacionamos con el eje Y y las columnas las relacionamos con el eje X .

9.3.2 Ejemplo #5.

Librerías utilizadas :

#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>#include <dos.h>#include <ctype.h>#include <time.h>

Declaración global de la matriz :

int matriz[ 5 ][ 5 ];

Reutilización del procedimiento inicializa y del procedimiento box de prácticas anteriores
void inicializa ( )
{ ….. }
void box(int x1,int y1,int x2,int y2,int relleno,int color)
{ ….. }

//***************** CUADRO MAGICO *****************
// Asignación de 25 números sin repetirse en la matriz, del 0 al 24
void asigna ( )
{
    int listaux[ 25 ];
    int i,j,k,r,bandera;
    for (i=0 ; i<25; i=i+1 )
    listaux[i]=0 ;
    for(i=0 ; i<24; i=i+1 )
    {
        do {
            k= 1+rand()%24 ;
            r=0;
            j=0;
            do {
                if ( k!=listaux[j] )
                    j=j+1;
                else
                    r=1;
            }while( r==0 && j<i );
        } while(r==1);
        listaux[i]=k;
    }
    k=0;
    for(i=0 ; i<5 ; i++ )
        for(j=0 ; j<5 ; j++ )
        {
            matriz[i][j]=listaux[k];
            k=k+1;
        }
}

// despliegue en pantalla de la matriz
void ponM()
{
    int i,j;
    char *cad;
    for(i=0 ; i<5 ; i++ )
        for(j=0 ; j<5 ; j++ )
        {
            box(100+i*50, 100+j*50, 100+(i+1)*50, 100+(j+1)*50 ,9,RED );
            gcvt(matriz[i][j], 2, cad);
            outtextxy(105+i*50, 105+j*50 ,cad);
        }
}

// movimiento de cuadros e intercambio de valores
void mueve()
{
    int i,j,x,y,k;
    char *cad;
    char tecla;
    i=4; j=4; x=4; y=4;
    do {
        box(100+i*50, 100+j*50, 100+(i+1)*50, 100+(j+1)*50 ,9,BLUE );
        gcvt(matriz[i][j], 2, cad);
        outtextxy(105+i*50, 105+j*50 ,cad);
        tecla=getch();
        switch (tecla)
        {
            case '\x0':
                tecla=getch();
                switch (tecla)
                {
                    case '\x48':
                        j=j-1;
                    break;
                    case '\x50':
                        j=j+1;
                    break;
                    case '\x4B':
                        i=i-1;
                    break;
                    case '\x4D':
                        i=i+1;
                    break;
                }
                if (i>4)
                    i=4;
                if (i<0)
                    i=0;
                if (j>4)
                    j=4;
                if (j<0)
                    j=0;
                matriz[x][y]=matriz[i][j];
                box(100+x*50, 100+y*50, 100+(x+1)*50, 100+(y+1)*50 ,9,RED );
                gcvt(matriz[x][y], 2, cad);
                outtextxy(105+x*50, 105+y*50 ,cad);
                matriz[i][j]=0;
                x=i;
                y=j;
            break;
        }
    } while( tecla!='\x1B' );
}

void main()
{
    randomize();
    mueve();
}

9.4 Actividad #1.

Serie de ejercicios a realizar.

  1. Ordenar por medio del algoritmo de ordenamiento "burbuja" un arreglo de 15 números introducidos por la computadora de manera aleatoria. Desplegar la lista de números antes de ordenarlos.

  2. Los datos en el arreglo podrían estar ya en el orden apropiado o en un orden casi apropiado. Modificar el programa para verificar, al final de cada pasada, si se han hecho intercambios, si no se hicieron esto indica que los datos están ya en el orden apropiado y el programa debe de cesar de ordenar.

  3. Crear un programa que calcule la media, la mediana y la moda de un arreglo de datos desordenados. Los números serán introducidos por el usuario y no deberán de ser mayores de 10. El tamaño máximo del arreglo será 25 pero no necesariamente se tendrán que introducir todos los 25 números. Ordenarlos y desplegar dentro del arreglo ordenado la mediana con un color distinto.

  4. Lea 20 números, cada uno de los cuales deberá estar entre 10 y 100. Conforme cada número es leído, imprímalo sólo si no es un número duplicado de un número ya leído.

  5. Un método para determinar si un número es primo es por medio de "la criba de Erastóstenes". El método estipula lo siguiente:
    1. Inicializar un arreglo con todos los elementos en 1. Los elementos del arreglo con subíndices primos se conservaran en 1.
    2. Empezando con el subíndice 2 del arreglo, cada vea que se encuentre un elemento del arreglo cuyo valor sea 1, cicle a través del resto del arreglo y defina como cero a cualquier elemento cuyo subíndice resulte un múltiplo del índice correspondiente al elemento con valor 1.
    3. Cuando haya terminado este proceso los elementos del arreglo que aun estén definidos como 1 indicara que el subíndice es un número primo, entonces esos subíndices serán impresos.
      Crear un programa que utilice un arreglo de máximo 1000 números primos para determinar los números primos entre 1 y 999. Ignorar el elemento 0 del arreglo.

  6. Una empresa desea transmitir datos mediante el teléfono, pero están preocupados de que sus teléfonos pudieran esta intervenidos. Todos sus datos se transmiten como enteros de cuatro dígitos. Le han solicitado a usted que escriba un programa que cifre sus datos, de tal forma de que puedan ser transmitidos con mayor seguridad. Su programa debe leer un entero de cuatro dígitos y cifrarlo como sigue:

    1. " remplazar cada dígito por (la suma del dígito mas 7 módulo 10. A continuación, intercambiar el primer dígito con el tercero, y el segundo con el cuarto. A continuación imprimir el entero cifrado."
    Escriba un programa por separado, que introduzca un entero de cuatro dígitos cifrado, y que lo descifre para formar el número original.

  7. Escribir un programa que convierta un número decimal a binario y desplegar la secuencia binaria.

  8. Si se dispone de una lista de 15 enteros, hacer que la computadora le asigne un número aleatorio a cada elemento de la lista y desplegar los números asignados. Determinar, además, cual es el valor más grande dentro de la tabla y que posición ocupan dentro de ella.

  9. Dentro de una lista se ha almacenado el número total de toneladas de cereales cosechados durante cada mes del año anterior. Se desea la siguiente información:
    1. El promedio anual de toneladas cosechadas.
    2. ¿Cuántos meses tuvieron una cosecha superior al promedio anual?
    3. ¿Cuántos meses tuvieron una cosecha por debajo del promedio anual?

  10. Una pequeña aerolínea necesita un programa para automatización de reservaciones de asientos en cada vuelo del único avión (capacidad 10 asientos). Su programa deberá de mostrar el siguiente menú de alternativas: "Presionar 1 para sección de no fumar, 2 para sección de fumar".
    Si la persona requiere un asiento de fumar asignarle un asiento del 1 al 5 y para la sección de no fumar un asiente del 6 al 10. El programa deberá de imprimir un pase de abordar, indicando el número de asiento de la persona y si esta en la sección de fumar o no fumar del avión. No asignar asientos que ya hayan sido asignados. Cuando este llena la sección de fumar, el programa deberá de solicitar a la persona, si le parece aceptable ser colocada en la sección de no fumar (o viceversa). Si dice que si efectuar la asignación en el asiento apropiado. Si dice que no, imprimir el mensaje "próximo vuelo parte en 3 horas".

9.5 Actividad #2.

Serie de ejercicios a realizar.

  1. Introducir valores a una matriz del tamaño que indique el usuario y calcular el promedio: a) por renglones; b) por columnas; c) de toda la matriz.

  2. Introducir valores a una matriz del tamaño que indique el usuario y desplegar la posición, en la matriz, de todos los números menores que 5.

  3. Determinar si una matriz de n x n es un cuadro mágico. Un cuadro mágico es una matriz cuadrada tal que la suma de cada renglón, columna y diagonal son iguales.

  4. Suponga un arreglo de 3 x 3 que contiene valores X o valores O y posiblemente espacios en blanco representado el "juego del gato". Escribir un programa para poder jugar al gato pidiendo le la posición al jugador x/o coloque su marca en la posición que deseen siempre y cuando no esté ocupada. Determinar e imprima el resultado del juego, por ejemplo "ganó el jugador x".

  5. Escribir un programa que permita jugar BINGO. Primero se le debe pedir al usuario escoger 25 números (del 1 al 100) para su cartón de BINGO de cinco renglones y cinco columnas. Después, la computadora debe generar al azar enteros del 1 al 100. Cada vez que uno de esos enteros aparece en su cartón , se debe marcar la casilla de ese entero. El juego termina cuando tiene marcas en todas las casillas de cualquier renglón, de cualquier columna o a lo largo de un de las dos diagonales. Cuando termine el juego la computadora debe imprimir cuantos números se generaron par completar el cartón y si gano o perdió. Gana si se requieren menos de 50 números aleatorios para completar el cartón.

  6. Crear un programa que reparta dos manos de póker de cinco cartas. Antes de repartir las cartas, barajarlas. Determinar si la mano contiene:
    ( a ) Un par ( b ) Dos pares ( c ) Tres de un tipo ( d ) Cuatro de un tipo ( e ) Todos del mismo tipo ( f ) Flor imperial ( cinco valores nominales consecutivos )
    Y determinar cuál es la mejor mano.