Sei sulla pagina 1di 16

onocimos algunos tipos básicos como por ejemplo los tipos char, int y float.

El lenguaje C++ permite, además, construir estruct


artir de estos tipos básicos.
nstrucciones que podemos definir son los arreglos.

cción ordenada de elementos de un mismo tipo. Ordenada significa que cada elemento tiene una ubicación determinada dentro del
cerla para accederlo.

e un arreglo:

> nombre_variable[longitud];

mos que nombre_variable es un arreglo de longitud elementos del tipo <tipo>. Cabe destacar que longitud debe ser cualquier expresi
yor que cero.

de un arreglo:

e_variable[índice] = expresión del tipo <tipo>

ón asigna el valor asociado de la expresión a la posición índice del arreglo nombre_variable. El índice debe ser una expresión del tipo
ngitud-1]. Cabe destacar que C++ no chequea que el valor de la expresión sea menor a longitud, simplemente asigna el valor a esa po
o si formara parte del arreglo, pisando, de esta manera, otros datos que no forman parte del mismo, con lo que finalmente el prog
ctamente.

ontenido de un arreglo:

nombre_variable[índice] es valor del tipo <tipo> que puede ser asignado a una variable, o pasado como parámetro, imprimirlo, e
la aclaración de que el índice debe estar dentro del rango de definición del arreglo, C++ no chequeará que esto sea cierto y dev
a posición de memoria correspondiente a un arreglo de mayor longitud, el dato obtenido de esta manera es basura.

inición de un arreglo de 5 posiciones

mos el ingreso de 5 números


0; i<4; i++) //No olvidar que los arreglos van de 0 a longitud-1

cout << Ingrese el elemento Nro: << i <<endl;


cin >> a[i];
imprimimos
mir(a,5);

(int b[], int tamano)

0; i<tamano; i++)

cout << Nro: << i <<” “<<b[i]<<endl;

parámetro b de la función imprimir es un arreglo, pero no se indica la longitud del mismo. Esto no es necesario ya que solo especifica
n arreglo sin importar su longitud (en este caso particular su longitud viene indicada en tamano). De esta manera la función imprimir
de cualquier longitud.

s con GOFER:

mos como tipo básico al tipo lista. Este también tipo agrupa de forma ordenada elementos de un mismo tipo, pero existen varias di
Los arreglos en C++ son estáticos, es decir una vez definido su tamaño, este no crece ni decrece. Las listas de Gofer son dinámicas y
variar indefinidamente. En Gofer cuando agregamos un elemento a la lista obtenemos una nueva lista con todos los elementos corr
ente, en los arreglos solo asignamos valores a sus posiciones y cada uno de estos quedan en su posición, una asignación en la posición i
n j si i es distinto de j.

e parámetros

do pasamos parámetros a las funciones lo único que podemos hacer es operar con ellos para generar el resultado de la función, estos par
tados ya que simplemente son expresiones del tipo de la aridad de la función.

n diferentes posibilidades en el pasaje de parámetros, ya que estos pueden ser pasados por Valor o Copia o por Referencia, y cada uno ti
diferentes.

Valor o Copia

parámetro por Valor, cuando la función es invocada, el valor del parámetro es copiado al entorno de la función, creando una nueva var
esta forma la variable puede ser operada (cambiada) sin que esto afecte el valor de la variable en el entorno de la función llamadora. Este
que se asemeja al funcionamiento en Gofer.
a gráfica, quizás se entienda mejor la idea:

ón llamadora Función llamada


se copia al entorno de la función llamada.
Variable A Copia de
Variable A
alor de A dentro de la función sin que afecta a la variable original.
Referencia

parámetro por Referencia, cuando la función es invocada, el parámetro es referenciado por la variable de la función. De esta forma cad
la variable declarada en realidad estamos utilizando la variable de la función llamadora. Esta forma de pasaje de parámetros abre una n
comunicación entre funciones (se puede devolver resultados no solo como el resultado de la función), pero debe ser utilizada con cuida
cil introducir errores en el programa.

ón llamadora Función llamada


a la variable A del entorno de la función llamadora.
Variable A Referencia
a la
l valor de A dentro de la función, seVariable
refleja en A
la variable original.

Referencia constante

es una referencia a la variable de la función llamadora, pero esta variable no puede ser modificada. De esta manera se logra un efecto s
or pero sin necesidad de hacer una copia. La razón de utilizar este tipo de pasaje de parámetros es la eficiencia, es más eficiente referenc
opiarla, siempre y cuando la variable sea de un tamaño considerable, por ejemplo no tiene sentido utilizar este tipo de pasaje de parámet
í para un arreglo de una gran dimensión. Con respecto a esto, cuando se declara una arreglo como parámetro de una función, aunque un
digo, el arreglo es pasado por referencia (como en el ejemplo de la función imprimir un poco más arriba).

guiente programa:

= 10, b = 20, c ;
< a << b ;
ma(a,b)
< “A+B= ” << c;
<” A es “<< a;
e por Valor o Copia

oat a, float b)

+ b;
(a);

ucede cuando ejecutamos el programa:

= 10, b = 20, c ;

c = ¿?

ma(a,b) Entramos a suma

c = ¿?
= 20

+ b;

c = ¿?
= 20

(a); Desaparecen asuma y bsuma

c = 30

en este caso los parámetros no se ven afectados ya que suma realiza copias de a y b

e por Referencia

declaración de suma declarando a a como referencia

oat & a, float b)

ucede cuando ejecutamos el programa:

= 10, b = 20, c ;

c = ¿?

ma(a,b) Entramos a suma

c = ¿?
= 20

+ b;

c = ¿?
= 20

(a); Desaparecen asuma y bsuma


c = 30

en este caso el parámetro a se ve afectado ya que suma utiliza una referencia a a

e por Referencia Constante

declaración de suma declarando a a como referencia constante

nst float & a, float b)

l compilador devolverá un error en la línea

+ b;

intentando modificar una referencia constante.

ara PDA, PNA, GPS, PSP y PC

os

vies

Photoshop

es.org: Carreras y Universidades del mundo

o de enlaces
comendados Si quiere figurar en la sección de enlaces recomendados e intercambiar enlaces con Alipso.com contáctese

© copyright 1999-2009 | alipso.com | todos los derechos reservados


• Contactate con nosotros • Programacion por Efemosse Sistemas • Diseño por Silvana Fano

Newsletter
Principio del formulario
enviar_suscripcio 3

http://w w w .alips http://w w w .alips

93387
usuarios
ya reciben nuestro boletín
informativo.
Suscribite también gratis.

Suscribir Desuscribir
Le damos la bienv

Cerrar Ventana
Final del formulario

Capítulo 18:
Estructuras de datos y arreglos.
• Velas de Sombra Tenshon más alta calidad de tela de
sombra estándar y personalizados de sombra
www.Tenshon.com.mxEnlaces patrocinados
Introducción
Todas las variables que se han considerado hasta ahora son de tipo
simple. Una variable de tipo simple consiste de una sola caja de
memoria y sólo puede contener un valor cada vez. Una variable de
tipo estructurado consiste en toda una colección de casillas de
memoria. Los tipos de datos estudiados: entero, real, alfabético son
considerados como datos de tipo simple, puesto que una variable que
se define con alguno de estos tipos sólo puede almacenar un valor a
la vez, es decir, existe una relación de uno a uno entre la variable y el
número de elementos (valores) que es capaz de almacenar. En
cambio un dato de tipo estructurado, como el arreglo, puede
almacenar más de un elemento (valor) a la vez, con la condición de
que todos los elementos deben ser del mismo tipo, es decir, que se
puede tener un conjunto de datos enteros, reales, etc.
Datos estructurados:
Estructura de Datos es una colección de datos que se caracterizan por
su organización y las operaciones que se definen en ella. Los datos de
tipo estándar pueden ser organizados en diferentes estructuras de
datos: estáticas y dinámicas.
Estructura de Datos estáticas:
Son aquellas en las que el espacio ocupado en memoria se define en
tiempo de compilación y no puede ser modificado durante la ejecución
del programa. Corresponden a este tipo los arrays y registros
Estructuras de Datos Dinámicas:
Son aquellas en las que el espacio ocupado en memoria puede ser
modificado en tiempo de ejecución. Corresponden a este tipo las
listas, árboles y grafos . Estas estructuras no son soportadas en todos
los lenguajes. La elección de la estructura de datos idónea dependerá
de la naturaleza del problema a resolver y, en menor medida, del
lenguaje. Las estructuras de datos tienen en común que un
identificador, nombre, puede representar a múltiples datos
individuales.
Arrays:
Un arreglo (array) es una colección de datos del mismo tipo, que se
almacenan en posiciones consecutivas de memoria y reciben un
nombre común. Para referirse a un determinado elemento de un array
se deberá utilizar un índice, que especifique su posición relativa en el
array. Un arreglo es una colección finita, homogénea y ordenada de
elementos. Finita:Todo arreglo tiene un límite; es decir,debe
determinarse cuál será el número máximo de elementos que podrán
formar parte del arreglo. Homogénea: Todos los elementos del arreglo
deben ser del mismo tipo. Ordenada: Se puede determinar cuál es el
primer elemento, el segundo, el tercero,.... y el n-ésimo elmento.
Los arreglos se clasifican de acuerdo con el número de dimensiones
que tienen. Así se tienen los:
- Unidimensionales (vectores)
- Bidimensionales (tablas o matrices)
- Multidimensionales (tres o más dimensiones)
PROBLEMA.
Suponga que se desea desarrollar un programa para:
1.Leer una lista de calificaciones de un examen
2.Encontrar su media
3.Escribir una lista de las calificaciones mayores que la media
4.Ordenar la lista de las calificaciones en orden ascendente.
Supongamos también que hay 100 calificaciones. Debemos utilizar
100 variables diferentes nota1, nota2, ...., nota100, de ese modo son
100 direcciones diferentes de memoria para almacenar las
calificaciones del examen. Se imagina declarar las 100 variables,
¿cuántas instrucciones involucra?
Var Nota1,nota2,nota3,.........nota100: entero
(En la declaración real de un programa no pueden usarse puntos
suspensivos, por lo tanto serán 100 veces) . En la fase de lectura de
datos, serán también 100 veces las instrucciones para ir leyendo cada
valor. Leer (nota1, nota2,nota3,........., nota100)
Para calcular la media:
Media ¬(nota1+nota2+.......+nota100)/100
Para la lista de calificaciones mayores que la media, deberá también
irse comparando una por una:
Si nota1 > media entonces
escribir (nota1)
Fin_si
Si nota2 > media entonces
escribir (nota2)
Fin_si
Si nota100 > media entonces
escribir (nota100)
Fin_si
Y después de más de 450 líneas de código..... ¡Falta ordenar la lista
de calificaciones en orden ascendente!
Después que aprendas a usar arreglos verás cómo se ahorra
instrucciones porque es fácil recorrer toda la lista de notas con unas
pocas instrucciones. En el caso anterior, cuando el acceso a la
información es secuencial, sólo se puede acceder a un elemento
buscando desde el principio de la lista, y esto es algo lento. Lo que se
necesita es una estructura de acceso directo que permita almacenar y
recuperar los datos directamente especificando su posición en la
estructura, de esa manera se requerirá el mismo tiempo para acceder
al elemento de la posición 100 que el de la posición 5.
También preferiremos que esta estructura se almacene en memoria
principal para que su almacenaje y recuperación sea más rápida. Es
por ello que existen los arreglos, que están organizados en una
secuencia de elementos, todos del mismo tipo y se puede acceder a
cada elemento directamente especificando su posición en esta
secuencia.
Arreglos Unidimensionales:
Están formados por un conjunto de elementos de un mismo tipo de
datos que se almacenan bajo un mismo nombre, y se diferencian por
la posición que tiene cada elemento dentro del arreglo de datos. Al
declarar un arreglo, se debe inicializar sus elementos antes de
utilizarlos. Para declarar un arreglo tiene que indicar su tipo, un
nombre único y la cantidad de elementos que va a contener. Por
ejemplo, las siguientes instrucciones declaran tres arreglos distintos:
Float costo_partes[50];
Para acceder a valores específicos del arreglo, use un valor de índice
que apunte al elemento deseado. Por ejemplo, para acceder al primer
elemento del arreglo calificaciones debe utilizar el valor de índice 0
(calificaciones[0]). Los programas en C++ siempre indizan el primer
elemento de un arreglo con 0 y el último con un valor menor en una
unidad al tamaño del arreglo.
• Velas de Sombra Tenshon más alta calidad de tela de
sombra estándar y personalizados de sombra
www.Tenshon.com.mxEnlaces patrocinados
Inicialización y asignación de valores
Como se decía anteriormente, antes de utilizar un arreglo es necesario
inicializarlo:
Calificaciones[0];
Para inicializar todos los elementos de una vez, se colocan dentro de
una estructura for que va del primer elemento al último que contiene el
arreglo. Para asignar un valor a un elemento del arreglo se hace por
ejemplo:
Calificaciones[0] ¬100;
Cuando se usan arreglos, una operación común es usar una variable
índice para acceder a los elementos de un arreglo. Suponiendo que la
variable índice I contiene el valor 3, la siguiente instrucción asigna el
valor 400 a valores[3]:
valores[I] ¬ 400;
Partes de un arreglo:
Los componentes. Hacen referencia a los elementos que forman el
arreglo, es decir, a los valores que se almacenan en cada una de las
casillas del mismo. Los índices. Permiten hacer referencia a los
componentes del arreglo en forma individual, especifican cuántos
elementos tendrá el arreglo y además, de qué modo podrán accesarse
esos componentes.

Definición de Arreglos:
ident_arreglo = arreglo[liminf .. Limsup] de tipo Operaciones con
Vectores:
Las operaciones que se pueden realizar con vectores durante el
proceso de resolución de un problema son:
· Lectura/ escritura
· Asignación
· Actualización(inserción, eliminación, modificación)
· Recorrido (acceso secuencial)
· Ordenación
· Búsqueda
Ejemplos:
Sea arre un arreglo de 70 elementos enteros con índices enteros. Su
representación nos queda:

Ejemplos:
Sea bool un arreglo de 26 elementos booleanos con índices de tipo
caracter. Su representación nos queda:
Bool = arreglo["a".."z"] de booleanos
Número total de elementos:
NTE= (ord("z")-ord("a")) + 1 = 122-97+1 = 26 elementos
Lectura
El proceso de lectura de un arreglo consiste en leer y asignar un valor
a cada uno de sus elementos. Normalmente se realizan con
estructuras repetitivas, aunque pueden usarse estructuras selectivas.
Usamos los índices para recorrer los elementos del arreglo:
desde i = 1 hasta 70 hacer
leer ( arre[i])
fin_desde
Escritura:
Es similar al caso de lectura, sólo que en vez de leer el componente
del arreglo, lo escribimos.
leer (N)
desde i = 1 hasta N hacer
escribir (arre[i])
fin_desde
Asignación:
No es posible asignar directamente un valor a todo el arreglo; sino que
se debe asignar el valor deseado en cada componente. Con una
estructura repetitiva se puede asignar un valor a todos los elementos
del vector.
Por ejemplo:
arre[1] ¬120 (asignación de un valor constante único a una
casilla del vector)
arre[3] ¬arre[1] / 4 (asignar una operación)
Se puede asignar un valor constante a todos los elementos del
vector:desde i = 1 hasta 5 hacer
arre[i] ¬3
fin_desde
O bien
arre ¬3 (con arre del tipo arreglo)
Inicialización
Para inicializar con cero todos los elementos del arreglo:
desde i = 1 hasta 70 hacer
arre[i] ¬ 0
fin_desde
Acceso Secuencial. (Recorrido)
El acceso a los elementos de un vector puede ser para leer en él o
para escribir (visualizar su contenido). Recorrido del vector es la
acción de efectuar una acción general sobre todos los elementos de
ese vector.
Actualización.
Incluye añadir (insertar), borrar o modificar algunos de los ya
existentes. Se debe tener en cuenta si el arreglo está o no ordenado.
Añadir datos a un vector consiste en agregar un nuevo elemento al
final del vector, siempre que haya espacio en memoria.
Investigue cómo insertar o eliminar elementos en un arreglo:
a) Ordenado
b) No ordenado

5. Arreglos y cadenas
En el siguiente capítulo se presentan los arreglos y las cadenas. Las cadenas se
consideran como un arreglo de tipo char.

5.1 Arreglos unidimensionales y multidimensionales


Los arreglos son una colección de variables del mismo tipo que se referencian
utilizando un nombre común. Un arreglo consta de posiciones de memoria contigua. La
dirección más baja corresponde al primer elemento y la más alta al último. Un arreglo
puede tener una o varias dimensiones. Para acceder a un elemento en particular de un
arreglo se usa un índice.
El formato para declarar un arreglo unidimensional es:
tipo nombre_arr [ tamaño ]
Por ejemplo, para declarar un arreglo de enteros llamado listanum con diez elementos se
hace de la siguiente forma:
int listanum[10];
En C, todos los arreglos usan cero como índice para el primer elemento. Por tanto, el
ejemplo anterior declara un arreglo de enteros con diez elementos desde listanum[0]
hasta listanum[9].
La forma como pueden ser accesados los elementos de un arreglo, es de la siguiente
forma:
listanum[2] = 15; /* Asigna 15 al 3er elemento del arreglo listanum*/
num = listanum[2]; /* Asigna el contenido del 3er elemento a la variable num */
El lenguaje C no realiza comprobación de contornos en los arreglos. En el caso de que
sobrepase el final durante una operación de asignación, entonces se asignarán valores a
otra variable o a un trozo del código, esto es, si se dimensiona un arreglo de tamaño N,
se puede referenciar el arreglo por encima de N sin provocar ningún mensaje de error en
tiempo de compilación o ejecución, incluso aunque probablemente se provoque el fallo
del programa. Como programador se es responsable de asegurar que todos los arreglos
sean lo suficientemente grandes para guardar lo que pondrá en ellos el programa.
C permite arreglos con más de una dimensión , el formato general es:
tipo nombre_arr [ tam1 ][ tam2 ] ... [ tamN];
Por ejemplo un arreglo de enteros bidimensionales se escribirá como:
int tabladenums[50][50];
Observar que para declarar cada dimensión lleva sus propios paréntesis cuadrados.
Para acceder los elementos se procede de forma similar al ejemplo del arreglo
unidimensional, esto es,
tabladenums[2][3] = 15; /* Asigna 15 al elemento de la 3ª fila y la 4ª columna*/
num = tabladenums[25][16];
A continuación se muestra un ejemplo que asigna al primer elemento de un arreglo
bidimensional cero, al siguiente 1, y así sucesivamente.
main()
{
int t,i,num[3][4];

for(t=0; t<3; ++t)


for(i=0; i<4; ++i)
num[t][i]=(t*4)+i*1;

for(t=0; t<3; ++t)


{
for(i=0; i<4; ++i)
printf("num[%d][%d]=%d ", t,i,num[t][i]);
printf("\n");
}

}
En C se permite la inicialización de arreglos, debiendo seguir el siguiente formato:
tipo nombre_arr[ tam1 ][ tam2 ] ... [ tamN] = {lista-valores};
Por ejemplo:
int i[10] = {1,2,3,4,5,6,7,8,9,10};
int num[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};

5.2 Cadenas
A diferencia de otros lenguajes de programación que emplean un tipo denominado
cadena string para manipular un conjunto de simbolos, en C, se debe simular mediante
un arreglo de caracteres, en donde la terminación de la cadena se debe indicar con nulo.
Un nulo se especifica como '\0'. Por lo anterior, cuando se declare un arreglo de
caracteres se debe considerar un carácter adicional a la cadena más larga que se vaya a
guardar. Por ejemplo, si se quiere declarar un arreglo cadena que guarde una cadena de
diez caracteres, se hará como:
char cadena[11];
Se pueden hacer también inicializaciones de arreglos de caracteres en donde
automáticamente C asigna el caracter nulo al final de la cadena, de la siguiente forma:
char nombre_arr[ tam ]="cadena";
Por ejemplo, el siguiente fragmento inicializa cadena con ``hola'':
char cadena[5]="hola";
El código anterior es equivalente a:
char cadena[5]={'h','o','l','a','\0'};
Para asignar la entrada estándar a una cadena se puede usar la función scanf con la
opción %s (observar que no se requiere usar el operador &), de igual forma para
mostrarlo en la salida estándar.
Por ejemplo:
main()
{
char nombre[15], apellidos[30];

printf("Introduce tu nombre: ");


scanf("%s",nombre);
printf("Introduce tus apellidos: ");
scanf("%s",apellidos);
printf("Usted es %s %s\n",nombre,apellidos);
}
El lenguaje C no maneja cadenas de caracteres, como se hace con enteros o flotantes,
por lo que lo siguiente no es válido:
main()
{
char nombre[40], apellidos[40], completo[80];

nombre="José María"; /* Ilegal */


apellidos="Morelos y Pavón"; /* Ilegal */
completo="Gral."+nombre+appellidos; /* Ilegal */
}

5.3 Ejercicios
1. Escribir un programa que lea un arreglo de cualquier tipo (entero,
flotante, char), se podría pedir al usuario que indique el tipo de
arreglo, y también escribir un programa que revise el arreglo para
encontrar un valor en particular.
2. Leer un texto, un caracter a la vez desde la entrada estándar (que es
el teclado), e imprimir cada línea en forma invertida. Leer hasta que
se encuentre un final-de-datos (teclar CONTROL-D para generarlo).
El programa podría probarse tecleando progrev | progrev para
ver si una copia exacta de la entrada original es recreada.
Para leer caracteres hasta el final de datos, se puede usar un ciclo como
el siguiente
char ch;
while( ch=getchar(), ch>=0 ) /* ch < 0 indica fin-de-datos */
o
char ch;
while( scanf( "%c", &ch ) == 1 ) /* se lee un caracter */
3. Escribir un programa para leer un texto hasta el fin-de-datos, y
mostrar una estadística de las longitudes de las palabras, esto es, el
número total de palabras de longitud 1 que hayan ocurrido, el total
de longitud 2 y así sucesivamente.
Define una palabra como una secuencia de caracteres alfabéticos. Se
deberán permitir palabras hasta de una longitud de 25 letras.
Una salida típica podría ser como esta:
longitud 1 : 16 ocurrencias
longitud 2 : 20 ocurrencias
longitud 3 : 5 ocurrencias
longitud 4 : 2 ocurrencias
longitud 5 : 0 ocurrencias

Potrebbero piacerti anche