Académique Documents
Professionnel Documents
Culture Documents
Fundamentos de Programacin
1 Arreglos .....2
2 Vectores......................................... 8
3 Matrices..... 11
3.1 Las matrices son objetos..13
4 Bibliografa.............. 15
Para asignar a todos los elementos del arreglo, un mismo valor, lo mas prctico es usar un lazo for:
for(i = 0; i < 10; i++)
{
arregloEntero[ i ] = 0;
}
0 1 2 3 4 5 6 7 8 9 ArregloEnteros 2 9 1
1.5 Leer e Imprimir un Arreglo
Acabamos de ver un ejemplo para acceder a todos los elementos de una arreglo de una forma
prctica.
Si tenemos 10 elementos en un arreglo, y queremos pedir que los ingresen por teclado, debemos
repetir el ingreso 10 veces:
for(i = 0; i < 10; i++)
{
scanf(%d,&a);
arregloEnteros[i] = a;
}
As mismo, para imprimir todos los elementos de un arreglo, deberamos repetir el proceso de
imprimir, pero diez veces:
for(i = 0; i < 10; i++)
{
printf(Elemento %d:%d , i, ArregloEnteros[i]);
}
1.6 Ejercicio
Programa que permite el ingreso de las notas de un curso de 20 alumnos. Una vez ingresados, debe
mostrarse el promedio de las mismas.
#include <stdio.h>
#define MAX 20
void main(){
double notas[MAX]; double total, promedio;
int i,a; total = 0; for(i = 0; i < MAX; i++)
{ printf("Ingrese Alumno %d:",i+1);
scanf(%d,&a); notas[i]=a;
}
for(i = 0; i < MAX; i++)
{
total = total + notas[i];
}
promedio = (double)total / (double)MAX; printf("Promedio: %.2f",promedio);
getch();
}
El usuario del programa no tiene por qu saber que los ndices van desde 0, se le pueden mostrar
desde 1
En lugar de almacenar valores en los elementos de un arreglo, algunas aplicaciones usan los
arreglos para almacenar ndices, que permiten llevar estadsticas, de un dato en particular.
Por ejemplo:
Se pidi a 40 estudiantes que calificaran la calidad de la comida de la cafetera en una escala del 1
al 10 (1 es terrible y 10 excelente).
Escriba un programa en C que pida las 40 respuestas y luego muestre un resumen del resultado.
Arreglos Para Tabular
Un arreglo en C tambin se puede inicializar de las siguientes formas:
Crear un arreglo de 3 elementos
Inicializando cada elemento:
int A[]={11,2,8};
int A[3]={11,2,8};
Inicializando todos los elementos con el mismo valor:
int A[3]={0};
Inicializacin de un Arreglo
En C, los elementos de un arreglo pueden ser de cualquier tipo
Esto quiere decir que los elementos de un arreglo pueden ser a su vez, arreglos.
Arreglos de arreglos, se conocen como arreglos multidimensionales.
El mas comn de estos, es el de dos dimensiones, conocido tambin como Matriz o Tabla .
Un ejemplo de una matriz, es un tablero de tres en raya.
Este es un arreglo de 3 elementos, donde cada elemento es un arreglo, de tres elementos tambin.
Arreglos Multidimensionales int A[3][3]; A[0] A[1] A[2] 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]
1.7 Inicializacin
Un arreglo multidimensional tambin se puede inicializar
static double MatrizIdentidad[3][3] =
{
{1,0,0},
{0,1,0}
{0,0,1}
};
As podemos inicializar todos los elementos de una matriz desde el inicio, sin necesidad de usar
lazos anidados.
1.8 Bsqueda en un Arreglo
Se refiere al proceso para encontrar un elemento particular en un arreglo.
Una de las estrategias ms comunes y simples para buscar un dato en un arreglo es:
Revisar uno por uno los elementos del mismo, este mtodo se conoce como bsqueda lineal .
Escribir una funcin que determine si un valor dado se encuentra en un arreglo de elementos
enteros, y si es as, indique su posicin1.9 Solucin Dato a buscar:
58 int EncontrarElemento(int valor, int arreglo[ ] ,int n) { for(i=0; i <10; i++) { if (valor = = arreglo [ i ] )
return(i); } return(-1); } 19 12 1 2 58 100 3 4 45 25 A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]
1.10 Operador sizeof
Un char ocupa un byte.
Cuantos bytes ocupa un entero? un real?
una cadena?
Depende de cada mquina
Podemos averiguarlo usando el operador sizeof.
sizeof(int) devuelve el nmero de bytes que necesita un dato de tipo int.
CUIDADO : sizeof es un operador, no una funcin.
1.11 Cmo calcular el tamao de un arreglo?
Si inicializamos una arreglo sin indicar su ancho
Cmo podemos saber el ancho, para futuros usos en el programa?
sizeof(Arreglo) devuelve 32 sizeof(Arreglo[0]) devuelve el desfase:
sizeof(Arreglo)/sizeof(Arreglo[0]) devuelve 4, justo el nmero de elementos del arreglo. 1000 1008
1016 1024 1032 Arreglo[0] Arreglo[1] Arreglo[2] Arreglo[3] Arreglo[4]
2 Vectores
Los vectores son una forma de almacenar datos que permiten contener una serie de valores del
mismo tipo, cada uno de los valores contenidos tiene una posicin asociada que se usar para
accederlos. Est posicin o ndice ser siempre un nmero entero positivo.
En C la cantidad de elementos que podr contener un vector es fijo, y en principio se define cuando
se declara el vector. Los vectores se pueden declarar de la siguiente forma:
tipo_elemento nombre[largo];
Esto declara la variable nombre como un vector de tipo_elementos que podr
contener largo cantidad de elementos, y cada uno de estos elemento podr contener un valor de
tipotipo_elemento.
Por ejemplo:
double valores[128];
En este ejemplo declaramos un vector de 128 elementos del tipo double, los ndices de los
elementos iran entre 0 (para el primer elemento y 127 para el ltimo).
De la misma forma que con las otras declaraciones de variables que hemos visto se le puede
asignar un valor iniciar a los elementos.
O tambin se pueden declarar:
tipo_elemento nombre[largo]={valor_0, valor_1, valor_2};
En caso estamos asignadole valores a los primeros 3 elementos del vector nombre. Notar
que largo debe ser mayor o igual a la cantidad de valores que le estamos asignando al vector, en el
caso de ser la misma cantidad no aporta informacin, por lo que el lenguaje nos permite escribir:
tipo_elemento nombre[]={valor_0, valor_1, valor_2};
Que declarar nombre como el vector de largo 3.
Para acceder a un elemento accederemos a travs de su posicin. Es decir:
tipo_elemento elemento;
...
elemento = nombre[2];
Asumiendo que tenemos el vector anterior definido estaramos guardando valor_2 en elemento.
Veamos algunos ejemplos:
/*
* Ejemplo : El producto escalar de dos vectores
*/
#include <stdio.h>
double producto_escalar(double v1[], double v2[], int d);
int main()
{
const int largo = 3;
double vector_1[] = {5,1,0};
double vector_2[] = {-1,5,3};
double resultado = producto_escalar(vector_1, vector_2, largo);
// imprime el resultado
printf("(%f, %f, %f) . (%f, %f, %f) = %f\n",
vector_1[0], vector_1[1], vector_1[2],
vector_2[0], vector_2[1], vector_2[2],
resultado);
return 0;
}
/* producto escalar entre dos vectores */
double producto_escalar(double v1[], double v2[], int d)
{
double resultado = 0;
int i;
for (i=0; i < d; i++) {
resultado += v1[i] * v2[i];
}
return resultado;
}
En el ejemplo anterior usamos los vectores de C para representar vectores matemticos y calcular el
producto escalar entre ellos. Una peculiaridad que se puede notar es que al recibir un arreglo en una
funcin no se especifica el largo, volveremos a esto en un captulo posterior.
Otra funcin clsica es la bsqueda de un mximo o mnimo, que podemos escribirla de la siguiente
manera:
int buscar_maximo(double valores[], int num_valores)
{
int maximo_pos = 0;
for (int i = 1; i < num_valores; i++) {
if (valores[i] > valores[maximo_pos]) {
maximo_pos = i;
}
}
return maximo_pos;
}
Otro ejemplo sencillo, calcular el promedio de los valores.
double promedio(double valores[], int largo)
{
double suma=0;
for (int i=0;i<largo;i++) {
suma+=valores[i];
}
return suma/largo;
}
Cuando una funcin recibe un vector por parmetro y cambia su contenido y el cambio es
permanente (se ve an fuera de la funcin). Esto puede parecer extrao despus del nfasis que
pusimos en resaltar que todos los parmetros de una funcin se reciben por valor, pero se aclarar
en el siguiente captulo.
Mientras tanto usemos esto para definir una funcin que le aplique otra funcin que recibe por
parmetro a cada elemento del vector, guardando el resultado en el mismo vector y una llamada de
ejemplo a esta.
void cuadrados(double vector[], int largo)
{
for (int i=0;i<largo;i++) {
vector[i]=cuadrado(vector[i]);
}
}
...
double cuadrado(double valor) {
return valor*valor;
}
...
cuadrados(elementos,num_elem);
...
De la misma forma que venimos usando vectores de tipos bsicos, podemos tener vectores de
vectores, estos se declaran de la siguiente forma:
int matriz[3][7];
int tabla[3][4]={ { 1, 2, 3, 4},
{ 5, 6, 7, 8}, /* los espacios y saltos de lneas no son tomados en cuenta */
{ 9,10,11,12} };
double v[2][2][2];
...
printf("tabla[0][1]: %i\n", tabla[0][3]); // Imprime 4
printf("tabla[2][0]: %i\n", tabla[2][0]); // Imprime 9
...
En este ejemplo tabla es un vector de longitud 3, cuyos elementos son vectores de longitud 4 de
elementos de tipo int.
En resumen, suponiendo que v[n] es un vector de cualquier tipo de dato con n cantidad de
posiciones, al vector v se le aplican las siguientes reglas:
1. La primera posicin siempre ser v[0]
2. La ltima posicin es v[n-1]
3. En versiones previas a C99 n es una constante definida antes de la declaracin de v[n]
3 Matrices
En las matrices de C#, los ndices empiezan en cero. Las matrices de C# funcionan de forma similar
a como lo hacen en la mayora de los lenguajes populares; existen, sin embargo, algunas diferencias
que se deben conocer.
Cuando se declara una matriz, los corchetes ([]) deben ir despus del tipo, no despus del
identificador. Colocar los corchetes despus del identificador no es sintcticamente vlido en C#.
int[] table; // not int table[];
Otro detalle es que el tamao de la matriz no forma parte de su tipo, como ocurre en el lenguaje C.
Esto permite declarar una matriz y asignarle cualquier matriz de objetos int, independientemente de
la longitud de la matriz.
Incluso, se pueden combinar matrices rectangulares y escalonadas. Por ejemplo, el siguiente cdigo
declara una matriz unidimensional que contiene matrices tridimensionales de matrices
bidimensionales de tipo int:
int[][,,][,] numbers;
Ejemplo
El siguiente es un programa completo en C# que declara y crea instancias de las matrices
comentadas anteriormente.
// arrays.cs
using System;
class DeclareArraysSample
{
public static void Main()
{
// Single-dimensional array
int[] numbers = new int[5];
// Multidimensional array
string[,] names = new string[5,4];
// Array-of-arrays (jagged array)
byte[][] scores = new byte[5][];
// Create the jagged array
for (int i = 0; i < scores.Length; i++)
{
scores[i] = new byte[i+3];
}
// Print length of each row
for (int i = 0; i < scores.Length; i++)
{
Console.WriteLine("Length of row {0} is {1}", i, scores[i].Length);
}
}
}
Resultado
Length of row 0 is 3
Length of row 1 is 4
Length of row 2 is 5
Length of row 3 is 6
Length of row 4 is 7
int[][] numbers = new int[][] { new int[] {2,3,4}, new int[] {5,6,7,8,9} };
O bien
int[][] numbers = { new int[] {2,3,4}, new int[] {5,6,7,8,9} };
Observe que no existe sintaxis de inicializacin para los elementos de una matriz escalonada.
Acceso a miembros de matrices
El acceso a los miembros de una matriz es sencillo y similar al de los miembros de una matriz de C o
C++. Por ejemplo, el siguiente cdigo crea una matriz denominada numbers y, a continuacin,
asigna un 5 al quinto elemento de la matriz:
int[] numbers = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
numbers[4] = 5;
El siguiente cdigo declara una matriz multidimensional y asigna el valor 5 al miembro ubicado en [1,
1]:
int[,] numbers = { {1, 2}, {3, 4}, {5, 6}, {7, 8}, {9, 10} };
numbers[1, 1] = 5;
La siguiente es una declaracin de una matriz escalonada de una sola dimensin que contiene dos
elementos. El primer elemento es una matriz de dos enteros, mientras que el segundo es una matriz
de tres enteros:
int[][] numbers = new int[][] { new int[] {1, 2}, new int[] {3, 4, 5}
};
La siguiente instruccin asigna 58 al primer elemento de la primera matriz y 667 al segundo
elemento de la segunda matriz:
numbers[0][0] = 58;
numbers[1][1] = 667;
4 Bibliografa
Arreglos
http://es.slideshare.net/javi2401/arreglos-en-c-presentation
Vectores
http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Vectores
Matrices
https://msdn.microsoft.com/es-ec/library/aa288453(v=vs.71).aspx