Вы находитесь на странице: 1из 12

BIENVENIDO A LA PRIMERA CLASE DE ARREGLOS UNIDIMENSIONALES EN LENGUAJE C

Los arreglos son estructuras de datos relacionados, del mismo tipo. Un arreglo es un grupo de posiciones de memoria, que tienen el mismo nombre y almacenan datos del mismo tipo.

Introduccin a la Clase
Antes de comenzar con el tema de Arreglos es conveniente revisar algunos conocimientos. Recuerdas que es una variable?

Una variable es una localidad de memoria, donde se guarda un valor para su uso en un programa,
dicho valor puede cambiar durante la ejecucin de un programa. Si se tiene la variable edad cuyo valor es 32. Y se le asigna el valor 45. Qu pasa con el valor 32?

El valor 32 se pierde debido a que una variable solo puede guardar un valor a la vez.
Vamos a asumir que tenemos un programa que calcula la nota definitiva de los estudiantes de un curso. El programa incluye un ciclo donde cada repeticin representa un estudiante y dentro del ciclo se calcula la nota definitiva de cada estudiante y se va acumulando para calcular al final del ciclo la nota promedio del curso. Al finalizar el ciclo de los estudiantes se calcula la nota promedio del curso dividiendo el acumulador de la nota definitiva entre el nmero de estudiantes del curso. Qu tendramos que hacer si quisiramos determinar cules estudiantes obtuvieron nota definitiva superior a la nota promedio del curso?

Slo tenemos que comparar la nota definitiva de cada estudiante con la nota promedio.
Muy bien. Pero resulta que en cada repeticin del ciclo calculamos la nota definitiva del estudiante, la imprimimos, y luego al calcular la nota definitiva del siguiente estudiante, la nota definitiva del estudiante anterior se pierde.

Quiere decir que tendremos que calcular la nota definitiva nuevamente para compararla, pues no
hay forma de guardarla. Para resolver este inconveniente vamos a introducir el tema de Arreglos Unidimensionales o Vectores.

Estructuras Secuenciales

Cuerpo la Clase
Los arreglos son estructuras de datos relacionados, del mismo tipo. Un arreglo corresponde a un grupo de posiciones de memoria, que tienen el mismo nombre y almacenan datos del mismo tipo en forma contigua en la memoria. En esta clase vamos a tratar el tema de los Arreglos

Unidimensionales, conocidos tambin como Vectores. Vamos a imaginar un gavetero. Cmo ser?

Es un mueble con muchas gavetas y en cada gaveta se puede guardar algo diferente.
Muy bien. Un vector es similar a un gavetero y tiene un nombre, ejemplo: nota. Cada gaveta corresponde a una posicin del vector. Grficamente el vector nota se podra representar as:

nota -------> Nombre del vector

Un vector puede tener varias posiciones, y cada posicin a su vez es similar a una variable. Para hacer referencia a cada posicin del vector se utiliza un subndice. Para ello se escribe el nombre del vector y entre corchetes la respectiva posicin, como se muestra a continuacin.

nota[0]

nota[1]

nota[2]

nota[3]

nota[4]

La figura muestra el arreglo llamado nota, que contiene 5 elementos. En el Lenguaje C el primer elemento de cualquier arreglo es el elemento cero. Entonces el primer elemento del arreglo nota se conoce como nota[0], el segundo nota[1] y as sucesivamente. El nmero de posicin que aparece dentro de los corchetes es lo que se conoce como subndice. Ahora, observa el siguiente programa en Lenguaje C.

Elaborado por: .........................................................................................NEREYDA CARRERO MIRANDA

Estructuras Secuenciales

/* Programa No. 1 de Vectores: Programa que lee el vector nota y calcula la nota promedio # include <stdio.h > # define MAX 5 void main( ) { float nota[ MAX] = { 0 }, acum = 0, prom;

*/

for ( i = 0; i < = 4 ; i + +) { printf( \ n Introduzca un Valor: ); scanf( %d, &nota[ i] ); acum += nota[ i]; }

prom = acum / MAX; printf( El promedio de las notas es: %.2f , prom); }

La lnea del programa:


float nota[ MAX] = { 0 }, acum = 0, prom;

Declara la variable acum y la inicializa en cero, declara la variable prom y declara el vector nota con cinco (MAX) posiciones y lo inicializa en cero. Los arreglos ocupan espacio de memoria, por tanto, hay que declararlos a fin de reservar el espacio de memoria adecuado. Para declarar un arreglo entero x de 100 elementos y un arreglo entero y de 20 elementos, se indica: int x[100], y[20]; Los elementos de un arreglo pueden ser inicializados en la declaracin del arreglo, haciendo seguir a la declaracin con el signo igual y una lista de valores separados por comas, encerrada entre llaves, los cuales corresponden a los respectivos valores iniciales. Si el nmero de elementos del arreglo es mayor al nmero de valores inicializadores, los elementos restantes son inicializados a cero de forma automtica.

La lnea del programa:


scanf( %d, &nota[ i] );

Lee un valor ingresado y lo guarda en la direccin del vector nota correspondiente a la posicin i. Ejemplo: Si la variable i vale 0 el valor ledo se guarda en la posicin cero del vector. La lnea:
acum += nota[ i];

Elaborado por: .........................................................................................NEREYDA CARRERO MIRANDA

Estructuras Secuenciales

Toma el valor guardado en la posicin i de vector nota y lo acumula en la variable acum.

De esta manera se acceden los elementos de un arreglo unidimensional, se escribe el nombre del arreglo seguido por el subndice entre corchetes. Para la lectura de un vector, en lugar de incluir una instruccin de lectura para cada elemento, se puede utilizar un ciclo. El contador del ciclo se utiliza como subndice del arreglo, como se muestra en el programa anterior.

Se pide elaborar un programa que lea el nmero de expediente y el sueldo de cada uno de los empleados de una empresa y calcule el porcentaje de empleados que ganan un sueldo superior al sueldo promedio de todos los empleados. El nmero de empleados no se conoce con exactitud pero se sabe que la empresa puede tener como mximo 30 empleados. Hagamos el anlisis: Cul es la variable de salida deseada?

El porcentaje de empleados que ganan un sueldo superior al sueldo promedio


Y cules son las variables correspondientes a los datos de entrada?

El nmero de expediente y el sueldo de cada uno de los empleados.


Sabemos cuntos empleados son?

No. Slo sabemos que como mximo son 30.


Si utilizamos una estructura de repeticin para la lectura de los datos de entrada Cul sera la ms apropiada?

Debe ser una estructura de repeticin condicional: Un ciclo mientras o un ciclo haga mientras.
De acuerdo. Expresndolo con nuestras propias palabras como resolveramos este problema.

Tenemos que leer el nombre y sueldo de cada uno de los empleados. Acumular los sueldos.
Luego dividir el acumulador de los sueldos entre el nmero de empleados para obtener el sueldo promedio. Posteriormente debemos comparar los sueldos ya ledos con el sueldo promedio para determinar cuntos empleados tienen sueldo superior al sueldo promedio. Y por ltimo

calculamos el porcentaje dividiendo el contador de los empleados con sueldo superior al sueldo promedio entre el total de empleados y lo multiplicamos por cien. Bien. Si leemos los sueldos y los acumulamos para obtener el sueldo promedio y luego necesitamos volver sobre los sueldo ledos para compararlos con el sueldo promedio En que tipo de variable deberamos leer los sueldos?

En un vector, para que queden guardados y luego poder volver sobre ellos en cuanto los
necesitemos.

Elaborado por: .........................................................................................NEREYDA CARRERO MIRANDA

Estructuras Secuenciales

De acuerdo. Veamos ahora el programa que resuelve este problema:

/ * Programa No. 2 de Vectores: Programa que utiliza Vectores Paralelos * / # include <stdio.h> # include <conio.h> # define MAX 30 void main( ) { int numexp[ MAX ], k=0 , con=0 ;

float sueldo[ MAX ], acum =0, prom, por; char resp=S;

while ( resp = = S & & k < MAX ) { clrscr( );

printf( Indique el nmero de expediente del empleado: ); scanf ( %d ,&numexp[ k ] ); printf( \ nIngrese el sueldo en Bs.: ); scanf( % f ,&sueldo[ k ] ); acum + = sueldo[ k ]; printf( \ n \ nHay otro Empleadoe?.......S / N : ); resp = getche( ); k++; } prom = acum / k; for( i = 0; i < k; i ++) { if ( sueldo[ i ] > prom) cont ++; } por = con * 100 / k; printf( \ n El porcentaje de empleados con sueldo mayor al sueldo promedio es de %.2f , por); getch( ); }

Analicemos algunas instrucciones de este programa. La instruccin:


La lnea del programa:
# define MAX 30

Define una constante simblica llamada MAX cuyo valor es 30. Esta constante ser usada para definir el mximo de posiciones de los vectores nombre y sueldo.

Las instrucciones utilizadas para declarar los vectores son:


int numexp[ MAX ], k=0 , con=0 ; float sueldo[ MAX ],acum, prom, por;

Elaborado por: .........................................................................................NEREYDA CARRERO MIRANDA

Estructuras Secuenciales

En la primera se declara el vector de nmero de expediente, numexp con MAX posiciones, es decir, 30 posiciones que permitirn almacenar el nmero de expediente de cada empleado como un valor entero. Adems, se declaran las variables k y con, y se inicializan en cero. En la siguiente instruccin se declara el vector sueldo con MAX posiciones para almacenar los sueldos de los 30 posibles empleados como un valor flotante, y se declaran tambin las variables acum, prom y por.

La siguiente lnea del programa:


while ( resp = = S & & k < MAX )

Es la instruccin del ciclo de repeticin dentro del cual se leern los elementos de los vectores. Se trata de un ciclo repita mientras cuya condicin es que la variable resp se igual a S, es decir, mientras haya empleados por ingresar; y que la variable contador k que funciona como subndice de los vectores sea inferior a la capacidad mxima de los vectores (MAX).

La instruccin:
clrscr( ) ;

Limpia la pantalla cada vez que se ejecuta la repeticin del ciclo.

Las instrucciones siguientes permiten realizar la lectura de los datos de los arreglos:
printf( Indique el nmero de expediente del empleado: ); scanf( %d ,&numexp[ k ] ); printf( \ nIngrese el sueldo en Bs.: ); scanf( % f ,&sueldo[ k ] );

Los vectores numexp y sueldo son vectores paralelos, es decir, son vectores que utilizan el mismo subndice y que se caracterizan porque los elementos de un vector estn relacionados con los elementos del otro vector que se encuentran en la misma posicin. Una forma lgica de almacenar esta informacin en los vectores, es hacer que la primera posicin del vector sueldo contenga el sueldo que corresponde al empleado cuyo nmero de expediente se encuentra en la primera posicin del vector numexp, como se muestra a continuacin:

Subndice [0] [1] : [n]

numexp 2015 1050 : 3400

sueldo 700000 800000 : 400000

Elaborado por: .........................................................................................NEREYDA CARRERO MIRANDA

Estructuras Secuenciales

Las siguientes instrucciones del programa:


for( i = 0; i < k; i ++) { if ( sueldo[ i ] > prom) cont ++; }

Permiten volver sobre el vector de los sueldos y comparar cada sueldo con el promedio calculado. El ciclo for se utiliza para el desplazamiento por los elementos del vector. Se utiliza un ciclo automtico, for, porque se sabe con exactitud que hay k sueldos almacenados.

Si ahora se nos pide un programa similar al programa anterior. Se desea un programa que lea el
nmero de expediente y el sueldo de los empleados de una empresa y que una vez finalizada la carga de los datos permita efectuar la bsqueda del sueldo de un empleado cuyo nmero de expediente sea ingresado. Qu tendramos que hacer?

La lectura de los datos de los vectores sera similar a la del programa anterior. Luego el
programa tendra que solicitar el expediente a buscar. Y luego se busca el expediente en el vector del nmero de expediente. Al encontrarlo, en la misma posicin en el vector sueldo, estar el sueldo solicitado, puesto que el nmero de expediente y el sueldo son vectores paralelos.

Bien. El siguiente ser el nuevo programa:

Elaborado por: .........................................................................................NEREYDA CARRERO MIRANDA

Estructuras Secuenciales

/ * Programa No. 3 Vectores: Programa que implementa una bsqueda secuencial en un vector * / # include <stdio.h> # include <conio.h> # define MAX 30

void main( ) { int k=0, numexp[ MAX ] ;

float sueldo[ MAX ]r; char resp=S;

while ( resp = = S & & k < MAX ) { clrscr( );

printf( Indique el nmero de expediente del empleado: ); scanf( %d ,&numexp[ k ] ); printf( \ nIngrese el sueldo en Bs.: ); scanf( % f ,&sueldo[ k ] );

printf( \ n \ nHay otro Empleadoe?.......S / N : ); resp = getche( ); k++; } clrscr( ); printf( \ n INGRESE EL EL No. DEL EXPEDIENTE DEL EMPLEADO A CONSULTAR: ); scanf( %d , & x); i = 0; while ( ( x ! = numexp[ i ] ) && ( i < k ) ) { ++i; }

if ( x = = numexp[ i ] ) printf( \ n \ n El sueldo del empleado %s es: %. 2f , nombre[ i] ,sueldo[ i ] ); else printf(\ n \ n No Existe el expediente buscado );

getch( ); }

Elaborado por: .........................................................................................NEREYDA CARRERO MIRANDA

Estructuras Secuenciales

Con frecuencia se requiere determinar si un vector contiene un valor que coincida con un valor clave buscado. El proceso de encontrar en un vector un elemento particular, se llama Bsqueda. En el programa anterior se desea determinar si un nmero de expediente ingresado se encuentra almacenado en el vector de nmero de expediente numexp.

En el programa se solicita primero el valor a buscar a travs de las siguientes instrucciones:


printf( \ n INGRESE EL EL No. DEL EXPEDIENTE DEL EMPLEADO A CONSULTAR: ); scanf( %d , & x);

Posteriormente se realiza la bsqueda a travs de las siguientes instrucciones:


i = 0; while ( ( x ! = numexp[ i ] ) && ( i < k ) ) { ++i; }

La Bsqueda Secuencial compara cada uno de los elementos del vector con el valor buscado. Dado que el vector no est ordenado, existe la misma probabilidad de que el valor se encuentre, ya sea en el primer elemento como en el ltimo. La manera mas sencilla de buscar una aparicin de un elemento en un vector es comenzar por el extremo con ndice inferior, por eso en el programa anterior el subndice i se inicializa en cero antes de comenzar el ciclo de bsqueda. Se va comparando el valor buscado con los sucesivos componentes del vector a travs del proceso repetitivo. Hay dos situaciones ante las que el ciclo debe terminar: si se encuentra el elemento o si se termina de examinar todo el vector sin haberlo encontrado. En el programa anterior el ciclo finalizar cuando el valor buscado x sea igual al vector numexp en la posicin i, lo que significa que encontr el elemento buscado; o finalizar cuando el subndice i sea igual a k, lo que significa que ya compar todos los elementos del vector.

La instruccin:
if ( x = = numexp[ i ] )

Permite verificar si el valor buscado fue encontrado, en caso contrario se emite el mensaje de que el valor buscado no ha sido encontrado.

Elaborado por: .........................................................................................NEREYDA CARRERO MIRANDA

Estructuras Secuenciales

Cierre de la Clase
Podras mencionar algunas ventajas del uso de los vectores?

Permiten almacenar en forma simultnea conjuntos de datos que estn relacionados entre s y que
pueden ser tratados como una unidad. Por ejemplo: Si se quiere manejar 100 nombres, en vez de manejar 100 variables, se crea un vector de 100 posiciones.

Por otro lado, los vectores paralelos permiten almacenar cantidades de datos que aunque sean
diferentes, estn relacionados entre s. Por ejemplo: Podemos tener un vector con los nombres de los estudiantes y en un vector paralelo la nota de cada estudiante.

El almacenar los datos en vectores, permite que durante la ejecucin del programa se pueda volver
sobre los datos almacenados sin tener que volver a leerlos.

Cada elemento del vector se puede manipular como una variable simple, de forma tal que todos los
conceptos aprendidos anteriormente sobre variables simples, pueden ser aplicados en los vectores.

Los conocimientos adquiridos acerca del manejo de vectores, nos permite incluir el manejo de
vectores en nuestros programas, evitando errores de programacin.

Dado el siguiente problema, elabora un programa en Lenguaje C para resolverlo utilizando vectores. Elabore un programa que permita introducir un conjunto de notas entre 0 y 9. El ingreso de notas debe finalizar cuando se introduzca un nmero menor que 0 o mayor que 9. Se desea que el programa obtenga e imprima la lista de frecuencias, es decir, el nmero de repeticiones de cada una de las notas. Ejemplo: Cuntos 9, cuntos 8,...etc. Luego de elaborar un programa que de solucin al problema planteado, observa el siguiente programa que plantea una posible solucin.

Elaborado por: .........................................................................................NEREYDA CARRERO MIRANDA

10

Estructuras Secuenciales

/* Programa No. 4 de Vectores: Programa que permite obtener frecuencia de calificaciones*/ # include <stdio.h> # include <conio.h> # define MAX 10

void main() { int nota, frecuencia[ MAX ]={ 0 };

printf("INTRODUZCA UNA NOTA: "); scanf("%d",&nota); while (nota >= 0 && nota <= 9) { frecuencia[nota] += 1; printf("INTRODUZCA LA SIGUIENTE NOTA: "); scanf("%d",&nota); } clrscr(); printf("FRECUENCIA DE CALIFICACIONES\n"); printf("Calificacion \ t \ t Frecuencia\n"); for( nota=1; nota < MAX; nota++) printf("\n %d \ t \ t \ t %d", nota, frecuencia[ nota]); getch(); }

Ahora, vamos a tomar conciencia de los pasos seguidos para elaborar el programa en Lenguaje C, que aporta una solucin al problema planteado:

Ante la exigencia de leer varias notas determinamos la necesidad de utilizar un ciclo. Como no sabemos con precisin cuntas notas se van a leer, el ciclo tiene que ser un ciclo
condicional, es decir, puede ser un ciclo repita mientras.

Est bien claro en la definicin que la lectura debe finalizar cuando se introduzca una nota menor
que 0 o mayor que 9, de ah que la condicin del ciclo ser que el ciclo se ejecute mientras la nota leda est entre 0 y 9.

Para contar el nmero de repeticiones de cada nota ingresada utilizamos un vector al que
llamamos frecuencia, cuyo subndice puede variar entre 0 y 9 que sern las posibles notas ingresadas. Por tanto, al leer una nota, el programa incrementa el uno el vector frecuencia en la

posicin nota, que es la instruccin: frecuencia[nota] += 1

Al final se imprime la calificacin y el vector frecuencia resultante.

Elaborado por: .........................................................................................NEREYDA CARRERO MIRANDA

11

Estructuras Secuenciales

Algunos estudiantes incurren en errores al trabajar con vectores en Lenguaje C. frecuentes son:

Algunos errores

Creer que porque se declara un vector con un mximo de posiciones, al cargar el vector todas las
posiciones se tienen que llenar. Esto no es cierto, porque se llena el vector hasta donde sea necesario, utilizando un subndice contador, y luego se manipula el vector utilizando el valor mximo del subndice, como el nmero mximo de elementos. Ejemplo: Un vector se declara con un mximo de 100 elemento. Pero al cargarlo solo se ocuparon k posiciones. Entonces, el ciclo para recorrer el vector cargado ir hasta la posicin k.

Otro error frecuente es rebasar la capacidad mxima del vector. Es decir, si la capacidad mxima
es 100, no se deben cargar ms de 100 elementos en el vector.

Olvidar indicar la posicin del elemento a referenciar dentro del vector.

Por ejemplo: Un

estudiante declara un vector llamado sueldo, y luego cuando va a hacer referencia al vector coloca sueldo como si fuera una variable simple, olvidando colocar los corchetes con el respectivo subndice: sueldo[ i ]

Pretender hacer referencia a un vector completo sin utilizar un ciclo. Por ejemplo: Un estudiante
que desea imprimir el vector frecuencia del programa No. 4, y sencillamente manda a imprimir frecuencia[ i ] sin incluirlo en un ciclo. Solo imprimir un valor, el valor almacenado en la posicin i.

Que tal si mencionan algunas aplicaciones de los conocimientos adquiridos acerca del manejo de vectores.

El conocimiento de los Vectores como estructura de almacenamiento de datos nos provee de una
herramienta de programacin muy til para la elaboracin de programas que requieren el manejo de conjunto de datos sobre los cuales hay que volver reiteradamente. Para finalizar, se sugiere la revisin de los ejercicios planteados en la seccin de Ejercitacin y Prctica referente a manejo de Vectores en Lenguaje C.

Elaborado por: .........................................................................................NEREYDA CARRERO MIRANDA

12

Вам также может понравиться