Está en la página 1de 11

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA

INTRODUCCION A LA PROGRAMACION

2015

ARREGLOS Y CADENAS: Cuando declaramos una variable estamos apartando en memoria


espacio para guardar sus posibles valores dependiendo del tipo de dato que se trata. Un array
o arreglo son una serie de localidades en memoria consecutivas que estn asignadas a un solo
nombre y un mismo tipo de datos
Declaracin
La forma de declarar un arreglo de cualquier tipo de datos es la siguiente:
tipo nombre [tamao] ;
Por ejemplo, podemos declarar un arreglo de enteros con 12 elementos.
int MiArreglo [12] ;
El compilador se encargar de asignar la memoria requerida para almacenar determinados
valores. Cuando se declara un arreglo de caracteres se trata entonces de una cadena.
char nombre[20] ;
Inicializacin
En la declaracin, podemos asignarle un valor inicial a los elementos de un vector.
int vector[3] = {4, 5, 6};
int matriz[2][3] = { {1,2,3}, {4,5,6} };
El compilador puede deducir las dimensiones del array:
int vector[] = {1, 2, 3, 5, 7};
Manipulacin de vectores y matrices
Las operaciones se realizan componente a componente

No es necesario utilizar todos los elementos del vector, por lo que, en C, al trabajar con ellos,
se suele utilizar una variable entera adicional que nos indique el nmero de datos utilizados.
Ordenacin por seleccin

IRINA NARVAEZ ESPINOSA

CEAD ACACIAS

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA


INTRODUCCION A LA PROGRAMACION

2015
void OrdenarSeleccion (double v[], int N)
{
int i, j, pos_min;
double tmp;
for (i=0; i<N-1; i++) {
// Menor elemento del vector v[i..N-1]
pos_min = i;
for (j=i+1; j<N; j++)
if (v[j]<v[pos_min])
pos_min = j;
// Coloca el mnimo en v[i]
tmp = v[i];
v[i] = v[pos_min];
v[pos_min] = tmp; =

En cada iteracin, se selecciona el menor elemento del subvector no ordenado y se


intercambia con el primer elemento de este subvector.
Ordenacin por insercin

IRINA NARVAEZ ESPINOSA

CEAD ACACIAS

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA


INTRODUCCION A LA PROGRAMACION

2015

void OrdenarInsercion
(double v[], int N)
{
int i, j;
double tmp;
for (i=1; i<N; i++) {
tmp = v[i];
for (j=i; (j>0) && (tmp<v[j-1]); j--)
v[j] = v[j-1];
v[j] = tmp;
}
}

En cada iteracin, se inserta un elemento del subvector no ordenado en la posicin correcta


dentro del subvector ordenado.
Ordenacin por intercambio directo (mtodo de la burbuja)

IRINA NARVAEZ ESPINOSA

CEAD ACACIAS

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA


INTRODUCCION A LA PROGRAMACION

2015

void OrdenarBurbuja
(double v[], int N)
{
int i, j;
double tmp;
for (i=1; i<N; i++)
for (j=N-1; j>i; j--)
if (v[j] < v[j-1]) {
tmp = v[j];
v[j] = v[j-1];
v[j-1] = tmp;
}
}

Ordenacin rpida (QuickSort)


1. Se toma un elemento arbitrario del vector, al que denominaremos pivote (p).
2. Se divide el vector de tal forma que todos los elementos a la izquierda del pivote sean
menores que l, mientras que los que quedan a la derecha son mayores que l.
3. Ordenamos, por separado, las dos zonas delimitadas por el pivote.
void quicksort (double v[], int izda, int dcha)
{
int pivote; // Posicin del pivote
if (izda<dcha) {
pivote = partir (v, izda, dcha);
quicksort (v, izda, pivote-1);
quicksort (v, pivote+1, dcha);
}
}
Obtencin del pivote
Mientras queden elementos mal colocados respecto al pivote:
a. Se recorre el vector, de izquierda a derecha, hasta encontrar un elemento situado en una
posicin i tal que v[i] > p.
b. Se recorre el vector, de derecha a izquierda, hasta encontrar otro elemento situado en una
posicin j tal que v[j] < p.
c. Se intercambian los elementos situados en las casillas i y j (de modo que, ahora, v[i] < p <
v[j]).

IRINA NARVAEZ ESPINOSA

CEAD ACACIAS

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA


INTRODUCCION A LA PROGRAMACION

2015

// Intercambio de dos valores


void swap (double *a, double *b)
{
double tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
// Divisin el vector en dos partes
// - Devuelve la posicin del pivote
int partir (double v[], int primero, int ultimo)
{
double pivote = v[primero]; // Valor del pivote
int izda = primero+1;
int dcha = ultimo;
do { // Pivotear
while ((izda<=dcha) && (v[izda]<=pivote))
izda++;
while ((izda<=dcha) && (v[dcha]>pivote))
dcha--;
if (izda < dcha) {
swap ( &(v[izda]), &(v[dcha]) );
dcha--;

IRINA NARVAEZ ESPINOSA

CEAD ACACIAS

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA


INTRODUCCION A LA PROGRAMACION

2015

izda++;
}
} while (izda <= dcha);
// Colocar el pivote en su sitio
swap (&(v[primero]), &(v[dcha]) );
return dcha; // Posicin del pivote
}
Bsqueda lineal = Bsqueda secuencial
// Bsqueda lineal de un elemento en un vector
// - Devuelve la posicin de dato en el vector
// - Si dato no est en el vector, devuelve -1
int search (double vector[], int N, double dato)
{
int i;
int pos = -1;
for (i=0; i<N; i++)
if (vector[i]==dato)
pos = i;
return pos;
}
Versin mejorada
// Bsqueda lineal de un elemento en un vector
// - Devuelve la posicin de dato en el vector
// - Si dato no est en el vector, devuelve -1
int search (double vector[], int N, double dato)
{
int i;
int pos = -1;
for (i=0; (i<N) && (pos==-1); i++)
if (vector[i]==dato)
pos = i;
return pos;
}
Bsqueda binaria
Precondicin
El vector ha de estar ordenado
Algoritmo
Se compara el dato buscado con el elemento en el centro del vector:
- Si coinciden, hemos encontrado el dato buscado.
- Si el dato es mayor que el elemento central del vector, tenemos que buscar el dato en
segunda mitad del vector.
- Si el dato es menor que el elemento central del vector, tenemos que buscar el dato en la
primera mitad del vector.

IRINA NARVAEZ ESPINOSA

CEAD ACACIAS

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA


INTRODUCCION A LA PROGRAMACION

2015

// Bsqueda binaria de un elemento en un vector


// - Devuelve la posicin de dato en el vector
// - Si dato no est en el vector, devuelve -1
// Implementacin recursiva
// Uso: binSearch (vector, 0, N-1, dato)
int binSearch ( double vector[],
int izq, int der, double buscado)
{
int centro = (izq+der)/2;
if (izq>der)
return -1;
else if (buscado==vector[centro])
return centro;
else if (buscado<vector[centro])
return binSearch(vector, izq, centro-1, buscado);
else
return binSearch(vector, centro+1, der, buscado);
}
// Implementacin iterativa
// Uso: binSearch (vector, N, dato)
int binSearch (double vector[], int N, double buscado)
IRINA NARVAEZ ESPINOSA

CEAD ACACIAS

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA


INTRODUCCION A LA PROGRAMACION

2015

{
int izq = 0;
int der = N-1;
int centro = (izq+der)/2;
while ((izq<=der) && (vector[centro]!=buscado)) {
if (buscado<vector[centro])
der = centro 1;
else
izq = centro + 1;
centro = (izq+der)/2;
}
if (izq>der)
return -1;
else
return centro;
}
Arreglos Multidimensionales

Como sabemos, se pueden crear arreglos de cualquier tipo de datos, ahora veremos
que tambin se pueden crear arreglos de arreglos. La forma de declararlos es con
mltiples subndices, cuantos se quieran tener, nosotros trabajaremos a lo ms con
dobles subndices.
tipoArreglo nombre [subndice1] [subndice2] ;
La forma en que queda estructurado un arreglo de dos dimensiones es ms o menos
como se muestra en la figura.
Arreglo
Arreglo[0] Arreglo[0][0] Arreglo[0][1] Arreglo[0][2]
Arreglo[1] Arreglo[1][0] Arreglo[1][1] Arreglo[1][2]
Arreglo[2] Arreglo[2][0] Arreglo[2][1] Arreglo[2][2]
Arreglo[3] Arreglo[3][0] Arreglo[3][1] Arreglo[3][2]
El nombre del arreglo tiene la direccin del primer elemento (Arreglo[0]), y ste a
Su vez tiene la direccin del otro arreglo (Arreglo[0][0]), as para cada elemento de
arreglo( 0, 1, 2, 3).
Cuando se inicializa un arreglo multidimensional se inicializa entre llaves cada arreglo
o bien, por medio de elemento seguidos:
Array1 [2] [3] = {1, 2, 3, 4, 5, 6};
Array2 [2] [3] = {{2, 4, 6}, {8, 10, 12}};
Ejemplo

#include <iostream>
#include <tr1/array>
using namespace std;
using namespace std::tr1;
// -- Constantes -------

IRINA NARVAEZ ESPINOSA

CEAD ACACIAS

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA


INTRODUCCION A LA PROGRAMACION

2015

const unsigned NFILAS = 3;


const unsigned NCOLUMNAS = 5;
// -- Tipos -----------typedef array<int, NCOLUMNAS> Fila;
typedef array<Fila, NFILAS> Matriz;
// -- Subalgoritmos ---int sumar_fila (const Fila& fil)
{
int suma = 0;
for (unsigned c = 0; c < fil.size(); ++c) {
suma += fil[c];
}
return suma;
}
int sumar_columna (const Matriz& m, unsigned c)
{
int suma = 0;
for (unsigned f = 0; f < m.size(); ++f) {
suma += m[f][c];
}
return suma;
}
void escribir_fila (const Fila& fil)
{
for (unsigned c = 0; c < fil.size(); ++c) {
cout << fil[c] << " ";
}
}
void escribir_matriz_formato (const Matriz& m)
{
for (unsigned f = 0; f < m.size(); ++f) {
escribir_fila(m[f]);
cout << sumar_fila(m[f]);
cout << endl;
}
for (unsigned c = 0; c < m[0].size(); ++c) {
cout << sumar_columna(m, c) << " ";
}
cout << endl;
IRINA NARVAEZ ESPINOSA

CEAD ACACIAS

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA


INTRODUCCION A LA PROGRAMACION

2015

}
void leer_matriz (Matriz& m)
{
cout << "Escribe fila a fila" << endl;
for (unsigned f = 0; f < m.size(); ++f) {
for (unsigned c = 0; c < m[f].size(); ++c) {
cin >> m[f][c];
}
}
}
// -- Principal -------int main ()
{
Matriz m;
leer_matriz(m);
escribir_matriz_formato(m);
}
Busqueda Binaria
//-------------------------------typedef array<int, MAXIMO> Vector;
//-------------------------------// busca la posici_on del primer elemento == x
// si no encontrado, retorna v.size()
//------------unsigned buscar_bin(int x, const Vector& v)
{
unsigned i = 0;
unsigned f = v.size();
unsigned res = v.size();
while (i < f) {
unsigned m = (i + f) / 2;
if (x == v[m]) {
res = i = f = m;
} else if (x < v[m]) {
f = m;
} else {
i = m + 1;
}
}
return res;
}
//---------------------------// busca la posici_on del primer elemento >= x
//------------unsigned buscar_bin_mayig(int x, const Vector& v)
{
unsigned i = 0;
unsigned f = v.size();
while (i < f) {

IRINA NARVAEZ ESPINOSA

CEAD ACACIAS

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA


INTRODUCCION A LA PROGRAMACION

2015

unsigned m = (i + f) / 2;
if (x <= v[m]) {
f = m;
} else {
i = m + 1;
}
}
return i;
}
//---------------------------// busca la posici_on del primer elemento > x
//------------unsigned buscar_bin_may(int x, const Vector& v)
{
unsigned i = 0;
unsigned f = v.size();
while (i < f) {
unsigned m = (i + f) / 2;
if (x < v[m]) {
f = m;
} else {
i = m + 1;
}
}
return i;
}
//--------------------------------

IRINA NARVAEZ ESPINOSA

CEAD ACACIAS

También podría gustarte