Fandom

Scratchpad

PLE:Unidad5

216,067pages on
this wiki
Add New Page
Discuss this page0 Share

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.

Arrays

Un array es una estructura de datos formada por una serie de elementos de un mismo tipo y que se almacenan en direcciones de memoria contiguas. Los elementos de un array se referencian mediante índices.

Para declarar una array debemos indicar el tipo de datos, el identificador y el número de elemntos que lo forman, como se muestra a continuación:

int num[5];
float nota[5];
char nombre[20];

EL tipo puede ser cualquier tipo válido (int, float, double,...) y el número de elementos debe ser un número entero.

Inicialización de arrays

En la declaración de un array se puede incluir la inicialización del mismo. Para ello se especifican los valores de cada elemento separados por comas y encerrados entre llaves "{}".

int nota[5] = { 5, 6, 4, 3, 5 }; 

El numero de valores que aparecen encerrados entre llaves no puede ser superior al de elementos declarados en el array.

En el caso de array con valores iniciales, es posible no declarar el tamaño del array. En este caso el tamaño del array se coresponderá con el número de elementos indicados entre llaves.

int nota[] = { 1, 5, 7, 8, 2 };

Acceso a los elementos de un array

El acceso a los elementos de una array se lleva a cabo especificando entre corchetes la posición del elemento al que queremos acceder. Debemos tener en cuenta que el primer elemento se encentra en la posición 0.

nota[0]

Podemos acceder a los elementos de un array tanto para leer el valor como para escribir sobre dicho elemento.

Para almacenar en el segundo elemento del array nota, el valor 7:

nota[1] = 7;

Para leer el valor del tercer elemento del array nota y almacenarlo en un variable:

a = nota[2];


Debemos tener en cuenta que cada uno de los elementos del array nota, es un entero y podemos acceder en las mismas condiciones que una variable de tipo entero. Podemos mostrar el valor en pantalla, asignarlo a una variable o utilizarlo en un expresión:

int nota[3] = { 1, 3, 5 };
nota[0] = 9;
cout << "La primera nota es " << nota[0];
cout << "La media es = " << (nota[0] + nota[1] + nota[3])/3.0 ;

Debemos ser cuidadosos a la hora de acceder a los elementos de un array, pues el compilador no nos previene de accesos fuera de rango. En el caso de acceder a elementos inexistentes el resultado se´ra imprevisible.

Arrays multidimensionales

Hasta el momento hemos trabajado con arrays unidimensionales, en los que disponemos de una serie de elementos a los que accedemos mediante un único índice. Sin embargo es posible declarar arrays con dos o más dimensiones. Veamos un ejemplo:

int notas[3][5];

En este caso declaramos un array de dos dimensiones que se puede representar gráficamente como una tabla.

notas
     0   1   2   3   4
    ___________________
 0 |   |   |   |   |   |
   |___|___|___|___|___|
 1 |   |   |   |   |   |
   |___|___|___|___|___|
 2 |   |   |   |   |   |
   |___|___|___|___|___|

En este caso los elementos se acceden mediante dos índices, que se especifican utilizando corchetes como se muestra a continuación:

notas[1][2];

Inicialización de arrays mutidimensionales

Al igual que con los arrays unidimensionales, se especifican los elementos separados por comas y delimitados por llaves, pero en este caso se utiliza llaves anidadas para representar las diferentes dimensiones.

int tabla [5][3] = {{1,1,1},{2,2,2},{3,3,3},{4,4,4},{5,5,5}};

Acceso a los elementos

Los elementos son accedidos mediante índices, pero en este caso empleamos tantos indices como dimensiones tenga el array. Para hacer un recorrido del array se utilizan bucles anidados.

for(i=0; i < 3; i++)
{
	for(j = 0; j < 5; j++)
	{
		cout << notas[i][j];
	}
}

Arrays como parámetros

Para pasar como parámetro un array basta con declarar un parámetro de tipo array. El paso de arrays se lleva a cabo por referencia, ya que un array como veremos en más adelante es un puntero que almacena una dirección de memoria en la que se almacenan los elementos que lo componen. Para especificar que una función recibe como parámetro un array no es necesario especificar el numero de elementos de dicho array.

void funcion(int n[]);

Para hacer la llamada a la función y pasarle el array tenemos que declarar un array:

int array[40];

Y a continuación llamamos a la función:

funcion(array);

Veamos un ejemplo completo:

#include <iostream>
using namespace std;

void printarray(int arr[], int lon) 
{
	for (int n = 0; n < lon; n++)
		cout << arr[n] << " ";
	cout << "\n";
}

void main()
{
	int num[] = {5, 10, 15};
	printarray(num,3);
}

En el ejemplo anterior declaramos como parámetro un array sin especificar la longitud del mismo. Para indicar el tamaño del array le pasamos un segundo parámetro. En el caso de utilizar arrays multidimensionales si debemos especificar el tamaño de las dimensiones excepto la primera:

void funcion(int array[][3][4])

Cadenas

Una cadena es un array de caracteres finalizada por un caracter nulo '\0'. Al igual que un array de cualquier otro tipo debemos especificar el número de elementos. El número especificada índica el tamaño máximo de la cadena incluido el caracter nulo.

char nombre[20];

Es posible almacenar cadenas con un tamaño menor al especificado, ya que el terminador nulo indica el final de la misma.

Inicialización de cadenas

Para inicializar cadenas podemos emplear la siguiente sintaxis:

char nombre[] = {'J', 'u', 'a', 'n', '\0'};

O bien:

char nombre[] = "Juan";

En este último caso el compilador se encargará de agregar el terminador nulo.

Funciones de cadenas

Existen varias funciones de cadenas que nos pueden ser de utilidad. Vamos a ver algunas

Función strlen

Nos indica la longitud de una cadena.

prototipo: size_t strlen(const char *s);

parámetros: s = cadena a medir

retorno: Número de caracteres de la cadena.

Ejemplo:

char cadena[20];
cout << “Introduzca una cadena: “;
cin >> cadena;
cout << “La longitud de la cadena es : “ << strlen(cadena)

Función strcpy

Copia una cadena sobre otra cadena.

prototipo: char *strcpy(char *dest, const char *src);

parámetros: dest = cadena destino de la copia src = cadena fuente de la copia

retorno: Puntero a la cadena destino

Ejemplo:

char cad1[10]= “Hola”;
char cad2[10];
strcpy(cad2,cad1); // cad2 = “Hola” 

Funcion strcat

Permite realizar la concatenación de dos cadenas(unir).

prototipo: char *strcat(char *dest, const char *src);

parámetros: dest = cadena destinataria de la concatenación src = cadena a concatenar a la cadena “dest”

retorno: Puntero a la cadena destino

Ejemplo;

char cad1[20] = “Hola “;
char cad2[20] = “a todos”;
strcat(cad1,cad2); // cad1 = “Hola a todos” 

Función strcmp

Compara dos cadenas

prototipo: int strcmp(const char *s1, const char *s2);

parámetros: s1: 1º cadena a comparar s2: 2º cadena a comparar

retorno: < 0: s1 < s2 ==0: s1 == s1 > 0: s1 > s2

Ejemplo:

char cad1[10], cad2[10];
int cmp;
cout << “Introduzca cadena 1: “; cin >> cad1;
cout << “Introduzca cadena 2: “; cin >> cad2;
cmp = strcmp(cad1,cad2);

Búsqueda secuencial

Es el método más sencillo de búsqueda y consiste en recorrer el array secuencialmente hasta encontrar el elemento buscado, o hasta finalizar el recorrido.


int busca(int array[], int num)
{
	int i=0,pos = -1;
	while (i < TAMANO && pos==-1)
	{
		if(array[i]==num) 
			pos = i;
		i++;
	}
	return pos;
}

Búsqueda dicotómica

Es un método de busqueda mas eficaz que el anterior, pero solo es Válido unicamente para arrays ordenados. Iniciamos la búsqueda a partir del elemento central, y si no es igual al valor buscado se reduce el intervalo de búsqueda a la mitad derecha o izquierda. El algoritmo termina si se encuentra el valor buscado o si el tamaño del intervalo de búsqueda queda anulado.

izq = 0; der = TAMANO-1; cen = (izq + der)/2;
while (array[cen]!=num && izq < der)
{
	if (array[cen] > num)	
		der=cen-1;
	else 
		izq = cen+1;
	cen = (izq+der)/2;
}//fin mientras
if (array[cen] == num)
	cout << “Elemento encontrado en posición: “ << cen;
else 
	cout << “Elemento no encontrado en posición";

Ordenación

Existen diversos mátodos de ordenación. En esta sección nos limitaremos a exponer solo algunos y estudiaremos los algoritmos utilizados por estos.

Intercambio directo (Burbuja)

Consiste en el intercambio de elementos adyacentes de array, aplicando varias pasadas. En la primera pasada se coloca el elemento mayor (menor) en la última posición. La siguiente coloca el elemento mayor (menor) en la penúltima posición, así sucesivamente...

for(i=0; i < TAMANO-1; i++)
{
	for(j = 1 ;j < TAMANO; j++)
	{
		if(array[j-1] > array[j])
		{
			aux = array[j];
			array[j] = array[j-1];
			array[j-1] = aux;
		}
	}
}

Selección directa

En este método seleccionamos el elemento menor (o mayor) y lo intercambiamos con el primero del array. A continuación buscamos el segundo más pequeño de la lista y se intercambia con el segundo elemento de la lista. El proceso se repite hasta ordenar el array completo.

for (i = 0; i < TAMANO-1; i++)
{
	k = i;
	aux = array[i];
	for (j = i+1; j <= TAMANO-1; j++)
	{
		if (array[j] < aux)
		{
			k = j;
			aux = array[j];
		}
	}
	array[k] = array[i];
	array[i] = aux;
}

Inserción directa (baraja)

En este método recuerda al utilizado por un jugador de cartas. En primer logar se toma la primera y se coloca en la primera posición. El segundo elemento es comparado con el primero y se desplaza para colocarlo en su posición que le corresponde. Con la tercera se actua de igual manera, desplazando los elementos ya ordenados hasta hacerle el hueco en la posición que le corresponda.

for (i=1; i <= TAMANO-1; i++)
{
	aux = array[i];
	j = i-1;
	while (array[j] > aux && j >= 0)
	{
		array[j+1] = array[j];
		j = j-1;
	}
	array[j+1]= aux;
}

Estructuras de datos

Las estructuras son un tipo de dato compuesto por varios elementos bajo un nombre común. Los elementos de una estrctura de datos se conocen como miembros y pueden ser dediferente tipo. La sintaxis empleada para declarar estructuras es la mostrada a continuación:

struct nombre_estructura {
	tipo1 nombre1;
	tipo2 nombre2;
	tipo3 nombre3;
	.
	.
	tipo3 nombreN;
} variable1,variable2,.., variableN;

El nombre de la estructura se especifica tras la palabra reservada "struct", y a continuación se detallan cada uno de los miembros que componen dicha estructura, indicando el tipo y el nombre. La declaración de una estrctura define un nuevo tipo de datos que puede ser utilizado pra definir variables de ese nuevo tipo. En la misma declaración de la estructura se pueden declarar variables.

Declaración de variables de tipo estructura

Las variables pueden ser declaradas junto con la estructura, como se muestra a continuación:

struct punto
{
	int x;
	int y;
} p1, p2, p3;

Tambien podemos declarar la estructura y las variables de forma separada;

struct punto
{
	int x;
	int y;
};

...
punto p1, p2, p3;


Inicialización de variables de tipo estructura

Tal como ocurre con los arrays, tambien podemos inicialiar una variable de tipo estructura usando la siguiente sintaxis:

punto p1 = { 10, 20 };

Los valores especificados entre llaves se corresponden con cada uno de los miembros de la estructura en tipo y orden. En este caso asignamos el valor 10 al miembro "X", y 20 al miembro "y".


Acceso a los miembros de una estructura

Para acceder a cada uno de los miembros de una estructura empleamos el operador punto seguido del nombre del miembro a acceder.

p1.x = 30;
p1.y = 40;

Definición de tipos de datos (typedef)

EL lenguaj de programación permite la definición de nuevos tipos de datos mediante el uso de la palabra reservada "typedef". La sintaxis empleadeada es la siguiente:

typedef tipo_dato_existente tipo _dato_nuevo;

Donde "tipo_dato_existente" es un tipo de dato aceptado por c++ y "tipo _dato_nuevo" es el nombre nuevo asignado a dicho tipo de dato. Veamos algunos ejemplos:

typedef char caracter;
typedef int entero;
typedef char* cadena;

Esto nos permite definir variables cuyos tipo de datos se correspondan con algunos de los tipos nuevos definidos con anterioridad.

carater c;
entero e1, e2;
cadena nombre;

En realidad con typedef no estamos creando tipos de datos nuevos, sino sinónimos de tipos ya existentes. En cualquier caso puede resultar útil cuando definimos tipos de datos que en futuras revisiones de nuestro programa puedan cambiar de tipo, o simplemente porque nos resulta más comodo el uso de un sinónimo que emplear el nombre del tipo original.

Uniones

La declaración y la sintaxis de las uniones es similar a la de las estructuras, pero existe una diferencia fundamental, y es que todos los campos de la unón se ubican en la misma dirección de memoria. Esto nos permite considerar dicha porción de memoria como una dato de diferente tipo en función de como accedamos al mismo. La sintaxis de una unión es:

union nombre_union {
  tipo1 nombre_miembro1;
  tipo2 nombre_miembro2;
  tipo3 nombre_miembro3;
  .
  .
} lista_variables;


Todos los elementos declarados en la unión comparte la misma dirección física de memoria. En la práctica, el compilador asignará como tamaño de la unión el tamaño del tipo mayor.

union Union_tipos {
  char c;
  int i;
  float f;
} tipos;

Defines tres elementos:

tipos.c
tipos.i
tipos.f


Enumerados

Un tipo de dato enumerado es un tipo de dato que puede tomar una serie de valores especificados de forma esplícita:

enum nombre_enumerado {  valor1,  valor2,  valor3,  .  .} nombre_variable;

Como ejemplo podemos crear un tipo enumerado que nos permita represertar los días de la semana:

enum dias_t {lunes, martes, miercoles, jueves, viernes, sabado, domingo}; 

Una vez declarado el tipo enumerado podemos escribir expresiones como:

dias_t d;
 ...
d = martes;
if (dia == miercoles) dia = jueves; 

Los tipos enumerados son representados internamente mediante numeros enteros, de forma que el primer elemento toma el valor 0, el segundo 1, etc... Podemos de todas maneras asignar valores distintos a los elementos. Si no se especifica el valor de un elemento, tomará el valor del anterior más 1.

enum meses_t { enero=1, febrero, marzo, abril, mayo, junio, julio, agosto, septiembre, octubre, noviembre, diciembre};

Ejercicios

  1. Crea un programa que lea diez valores enteros en un array desde el teclado y calcule y muestre: la suma, el valor promedio, el mayor y el menor. Solución.
  2. Crea un programa que coloque el último elemento de un vector de 10 enteros en el primer lugar, el penúltimo en el segundo y así sucesivamente. Solución.
  3. Codificar un programa para simular el lanzamiento de un dado. Lo lanzaremos 6000 veces y mostraremos por pantalla el número de veces que ha salido cada valor.
  4. Dado un vector de enteros introducidos por teclado(10), declarar dos funciones (Max y Min) que encuentren el máximo y el mínimo de los elementos del vector, las posiciones que ocupan y cuántas veces se repiten ambos. Solución.
  5. Crea un programa quinielistico que asigne el valor 1 x 2 con las probablidades 0.5 0.3 y 0.2 respectivamente.
  6. Almacena en un array multidimensional las notas de una clase de 30 alumnos, correspondiente a 5 asignaturas. Calcula y muestra la media de cada alumno y cada asignatura. Solución.
  7. Crea un programa que lea una cadena de caracteres y muestro el número de caracteres que la componen.
  8. Lee una cadena e indica el número de vocales que contiene. Solución.
  9. Lee una cadena y la muestras al revés. Solución.
  10. Lee una cadena e indica el número de vocales, consonantes y espacios en blanco que contiene. Solución.
  11. Crea una función que indique si una cadena es palíndromo.
  12. Lee el nombre y apellidos de un alumno y muestralos por separado.
  13. Juego del ahorcado.
  14. Juego conecta 4.
  15. Lee un array y busca elementos mediante busqueda secuencial.
  16. Lee un array, ordenalo y busca elementos mediante busqueda dicotómica. Solución.
  17. Ordenación mediante el método de la burbuja. Solución.
  18. Ordenación mediante el método de selección directa. Solución.
  19. Ordenación mediante el método de inserción directa. Solución.
  20. Ordenación mediante el método de rápido (quicksort). Solución.
  21. Comparativa de métodos de ordenación. Solución.
  22. Estructura Fecha. Crea una estructura para almacenar datos de tipo fecha y funciones para trabajar con dicho tipo de dato. Las funciones permitirán: leer, escribir comparar fechas, calcular una nueva fecha sumándole un número de días. Solución.
  23. Estructura Alumno. Solución.
  24. Agenda electrónica. Solución.
  25. Leer por teclado varias lineas de texto y extraer las letras del mismo.Almacenar las letras y numero de ocurrencias en un array de estructuras.
  26. Leer por teclado varias lineas de texto y extraer las palabras del mismo.Almacenar las palabras y numero de ocurrencias en un array de estructuras.
  27. Crea un programa que lea una fecha del año 2007 y nos devuelva el día de la semana.

Ejercicios adicionales con cadenas

  • Crea una función que extraiga los n primeros caracteres de una cadena empezando por la izquierda
  • Crea una función que extraiga los n primeros caracteres de una cadena empezando por la derecha
  • Crea una función que extraiga una subcadena de una cadena
  • Crea una función que sustituya un caracter dentro de una cadena por otro especificado
  • Crea una función que elimine un caracter especificado de una cadena
  • Crea una función que invierta el contenido de una cadena
  • Crea una función que ajuste el contenido de una cadena a un tamaño especificado rellenando con blancos es espacio sobrante por el final de la cadena
  • Crea una función que ajuste el contenido de una cadena a un tamaño especificado rellenando con blancos es espacio sobrante por el principio de la cadena
  • Crea una función que ajuste el contenido de una cadena a un tamaño especificado rellenando con blancos es espacio sobrante de modo que esta quede centrada
  • Crea una función que convierta una cadena numerica en un número entero
  • Crea una función que cuente las ocurrencias de un caracter
  • Crea una función que extraiga una palabra de una cadena
  • Crea un programa que permita almacenar 20 cadenas de caracteres
  • Crea una programa un editor de textos almacenando el contenido en un array de cadenas

Also on Fandom

Random wikia