Vous êtes sur la page 1sur 9

Arreglos y cadenas

En el siguiente captulo se presentan los arreglos y las cadenas. Las


cadenas se consideran como un arreglo de tipo char.

Arreglos unidimensionales y
multidimensionales
Los arreglos son una coleccin de variables del mismo tipo que se
referencian utilizando un nombre comn. Un arreglo consta de
posiciones de memoria contigua. La direccin ms baja corresponde al
primer elemento y la ms 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 [ tamao ]
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 comprobacin de contornos en los arreglos. En
el caso de que sobrepase el final durante una operacin de asignacin,
entonces se asignarn valores a otra variable o a un trozo del cdigo,
esto es, si se dimensiona un arreglo de tamao N, se puede referenciar
el arreglo por encima de N sin provocar ningn mensaje de error en
tiempo de compilacin o ejecucin, 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 ms de una dimensin , 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 dimensin lleva sus propios parntesis
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 continuacin 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 inicializacin 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};
El lenguaje C++ permite, adems, construir estructuras ms complejas a partir de estos
tipos bsicos.
Una de las construcciones que podemos definir son los ARREGLOS.

Arreglo: Coleccin ordenada de elementos de un mismo tipo. Ordenada significa que cada
elemento tiene una ubicacin determinada dentro del arreglo y debemos conocerla para
accederlo.

Sintaxis:

Definicin de un arreglo:

<tipo> nombre_variable[longitud];

Con esto diremos que nombre_variable es un arreglo de longitud elementos del tipo
<tipo>. Cabe destacar que longitud debe ser cualquier expresin entera constante mayor
que cero.

Asignacin de un arreglo:

nombre_variable[ndice] = expresin del tipo <tipo>

Esta instruccin asigna el valor asociado de la expresin a la posicin ndice del arreglo
nombre_variable. El ndice debe ser una expresin del tipo entero en el rango [0, longitud-
1]. Cabe destacar que C++ no chequea que el valor de la expresin sea menor a longitud,
simplemente asigna el valor a esa posicin de memoria como si formara parte del arreglo,
pisando, de esta manera, otros datos que no forman parte del mismo, con lo que finalmente
el programa no funciona correctamente.

Acceso al contenido de un arreglo:

nombre_variable[ndice] es valor del tipo <tipo> que puede ser asignado a


una variable, o pasado como parmetro, imprimirlo, etc. Aqu tambin vale la aclaracin de
que el ndice debe estar dentro del rango de definicin del arreglo, C++ no chequear que
esto sea cierto y devolver lo contenido en la posicin de memoria correspondiente a un
arreglo de mayor longitud, el dato obtenido de esta manera es basura.
Ejemplo:

int a[5]; // Definicin de un arreglo de 5 posiciones

void main()
{
int i;
// Pedimos el ingreso de 5 nmeros
for(i=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];
}
// Los imprimimos
imprimir(a,5);
}

void imprimir(int b[], int tamano)


{
int i;

for(i=0; i<tamano; i++)


{
cout << Nro: << i << <<b[i]<<endl;
}

Notar que el parmetro b de la funcin imprimir es un arreglo, pero no se indica la longitud


del mismo. Esto no es necesario ya que solo especificamos que recibiremos un arreglo sin
importar su longitud (en este caso particular su longitud viene indicada en tamano). De esta
manera la funcin imprimir funciona para arreglos de cualquier longitud.

Pasaje de parmetros
En Gofer cuando pasamos parmetros a las funciones lo nico que podemos hacer es operar
con ellos para generar el resultado de la funcin, estos parmetros no se ven afectados ya
que simplemente son expresiones del tipo de la aridad de la funcin.
En C++ existen diferentes posibilidades en el pasaje de parmetros, ya que estos pueden ser
pasados por Valor o Copia o por Referencia, y cada uno tiene caractersticas diferentes.

Pasaje por Valor o Copia

Al declarar un parmetro por Valor, cuando la funcin es invocada, el valor del parmetro
es copiado al entorno de la funcin, creando una nueva variable en el mismo. De esta
forma la variable puede ser operada (cambiada) sin que esto afecte el valor de la variable en
el entorno de la funcin llamadora. Este es el procedimiento que se asemeja al
funcionamiento en Gofer.
De una manera grfica, quizs se entienda mejor la idea:

Funcin llamadora Funcin llamada


Variable A

Copia de
Variable A

La variable A se
copia al entorno
de la funcin
llamada.

Se cambia el valor de
A dentro de la funcin
sin que afecta a la
variable original.

Pasaje por Referencia

Al declarar un parmetro por Referencia, cuando la funcin es invocada, el parmetro es


referenciado por la variable de la funcin. De esta forma cada vez que utilizamos la
variable declarada en realidad estamos utilizando la variable de la funcin llamadora. Esta
forma de pasaje de parmetros abre una nueva posibilidad de comunicacin entre funciones
(se puede devolver resultados no solo como el resultado de la funcin), pero debe ser
utilizada con cuidado, ya que es muy fcil introducir errores en el programa.
Funcin llamadora Funcin llamada
Variable A

Referencia a
la Variable A

Se referencia a la
variable A del entorno
de la funcin
llamadora.

Si se cambia el valor
de A dentro de la
funcin, se refleja en
la variable original.

Pasaje por Referencia constante

El parmetro es una referencia a la variable de la funcin llamadora, pero esta variable no


puede ser modificada. De esta manera se logra un efecto similar al pasaje por Valor pero
sin necesidad de hacer una copia. La razn de utilizar este tipo de pasaje de parmetros es
la eficiencia, es ms eficiente referenciar una variable que copiarla, siempre y cuando la
variable sea de un tamao considerable, por ejemplo no tiene sentido utilizar este tipo de
pasaje de parmetros para enteros, pero s para un arreglo de una gran dimensin. Con
respecto a esto, cuando se declara una arreglo como parmetro de una funcin, aunque uno
no aclare en el cdigo, el arreglo es pasado por referencia (como en el ejemplo de la
funcin imprimir un poco ms arriba).

Cadenas
A diferencia de otros lenguajes de programacin 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 terminacin 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
carcter adicional a la cadena ms 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 tambin inicializaciones de arreglos de caracteres en donde
automticamente 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 cdigo anterior es equivalente a:
char cadena[5]={'h','o','l','a','\0'};
Para asignar la entrada estndar a una cadena se puede usar la funcin scanf
con la opcin %s (observar que no se requiere usar el operador &), de igual
forma para mostrarlo en la salida estndar.
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 vlido:
main()
{
char nombre[40], apellidos[40], completo[80];

nombre="Jos Mara"; /* Ilegal */


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

Problemas Prcticos
Que estructura de control debe aplicarse para la resolucin de cada uno de los siguientes
problemas, confeccione el programa que resuelva el mismo:

1. Calcular la suma de los n primeros nmeros enteros.


2. Disear un algoritmo que imprima los nmeros impares menores o iguales que n
3. Se necesita conocer una serie de datos de una empresa con 50 empleados:
a. cuntos empleados ganan ms de 800 balboas al mes? Salarios altos.
b. Entre 500 y 800 balboas? Salarios medios.
c. Menos de 500 balboas? (Salarios bajos y empleados a tiempo parcial)
4. Leer las edades (iguales o mayores de 1 ao) de los alumnos de una clase y calcular su
media.
5. En un comercio se realiza descuento en las compras en funcin del importe total de dichas
compras. Se desean calcular el importe a cobrar al cliente en funcin de las siguientes
premisas:
a. Para importes menores de 100 balboas, no hay descuentos
b. Para importes comprendidos entre 100 y 600 balboas, descuento del 10%
c. Para importes superiores de 600 balboas, descuentos de 15%.
6. Ingresar n temperaturas a un vector y calcular su media, y que muestre adems las
temperaturas ms altas y ms bajas.
7. Determinar la cantidad de elementos negativos, positivos y cero de un vector dado.
8. Escriba un algoritmo que permita invertir un arreglo de n elementos enteros.
9. Rellenar una matriz de 4 x 4 con los nmeros consecutivos 1, 2, 3, 4, 5, 6, 7,.
10. Construya un algoritmo que permita buscar un nmero en una matriz recorriendo una por
una las posiciones de la matriz. El algoritmo debe indicar si se encontr o no el elemento
11. Realizar un algoritmo que permita multiplicar matrices, considerando las condiciones para
que se pueda realizar la operacin.
12. Realizar un algoritmo en el que se ingresen 25 cantidades, de las cuales se pedir
posteriormente que:
- Generar un arreglo que almacene el incremento en un 10% de loa
primeras 10, el aumento del 15 % de las 10 siguientes y la disminucin de las
restantes en un 8 %.
- Mostrar el promedio de las primeras cantidades y el de las modificadas.
13. Se ingresa una lista al azar de nmeros, en total 20. Indicar el mayor de los
nmeros, el menor y ordenar la lista de mayor a menor (mostrar)
14. . Realice un algoritmo que calcula el determinante de una matriz de orden 3X3
ingresada desde el teclado.
15. Realizar un algoritmo que sea capas de mostrar la traspuesta de una matriz. (A t).
16. Ingresar en una matriz de 10X10 los 100 primeros nmeros impares, empezando
desde el 1.
17. Dada una matriz de orden 6X5, realizar un algoritmo que calcule la suma de todos
los elementos de las filas pares.