Está en la página 1de 19

Republica Bolivariana de Venezuela

Ministerio del Poder Popular para la educacion


"IUTIRLA"

Arreglos (Programacion)
Estructuras de Datos

Profesor: Alumno:
Rosa Diaferia Jaiker Guzman
C.I. 26745888

Caracas, Noviembre del 2019


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 posición asociada que se usará para
accederlos. Está posición o índice será siempre un número 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 tipo tipo_elemento.

Por ejemplo:

double valores[128];

En este ejemplo declaramos un vector de 128 elementos del tipo


double, los índices de los elementos irían entre 0 (para el primer
elemento y 127 para el último)...O también se pueden declarar:

tipo_elemento nombre[largo]={valor_0, valor_1, valor_2};

Que declarará nombre como el vector de largo 3.

Para acceder a un elemento accederemos a través de su posición.


Es decir:

tipo_elemento elemento;
...

elemento = nombre[2];

Asumiendo que tenemos el vector anterior definido estaríamos


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 matemáticos y calcular el producto escalar entre ellos. Una
peculiaridad que se puede notar es que al recibir un arreglo en una
función no se especifica el largo, volveremos a esto en un capítulo
posterior.

Ejemplo de algoritmos de vectores:


1.- Dados tres arreglos A, B, C de n elementos enteros cada
uno, generar un cuarto arreglo D de tres elementos, donde
el contenido de cada elemento sea la suma de los
elementos de A , B y C, es decir : D[1] = A[1]+ A[2]+
A[3]+…A[n]…..

Diseño del Algoritmo :


Algoritmo Creación de Arreglo

Inicio

Monografias.com

2.- Un vendedor que hizo 20 ventas en el día desea calcular


su comisión total sobre las ventas diarias, sabiendo que le
corresponde un 5% de comisión sobre artículos cuyo precio
es menor de 10000 Bs.y el 10% de comisión por artículos
cuyo precio = 10000 Bs. ó mas.Además,el vendedor desea
saber cuantas ventas hizo menores de 10000 y cuántas de
10000 ó mas.

El algoritmo debe permitir realizar los diferentes procesos


como opciones a escoger por el usuario, como un dato de
entrada.

Diseño del Algoritmo:

Algoritmo Cálculo de comisión


Inicio

entero i,cont_menor, cont_mayor, opción

real precio[20], comisión, comisión_total

caracter respuesta

cont_menor = 0, cont_mayor = 0,comisión_total = 0

respuesta = "s"

Repetir mientras (respuesta == "s")

Mostrar ("Introduzca su opción : 1.- Leer arreglo de


precios

2.- Calcular comisión

3.- Mostrar resultados " )


Leer (opción)

En caso de (opcion)

caso 1 :

Repetir desde ( i= 1; i <=20) ; i=i+1)

Mostrar ( " Introduzca el precio del artículo ", i )

Leer ( precio[i] )

Fin Repetir desde

caso 2 :

Repetir desde ( i= 1; i <=20) ; i=i+1)

Si ( Precio [i]< 10000)

comisión = 0.05*precio[i]
cont_menor = cont_menor + 1

sino

comisión = 0.10*precio[i]

cont_mayor = cont_mayor + 1

Fin Si

comisión_total = comisión_total + comisión

Fin Repetir desde

caso 3 :

Mostrar ( "Artículos vendidos con precio inferior a 10000


:",

cont_menor )
Mostrar ( "Artículos vendidos con precio superior a
10000 :",

cont_mayor )

Mostrar (" Comisión total del vendedor = ",


comisión_total )

Fin En caso de

Mostrar (" Desea continuar : s/n ")

Leer (respuesta )

Fin Repetir mientras

Fin

3.- Un tablero de damas se puede representar con un


arreglo de 8 filas por 8 columnas, donde un 1 representa la
presencia de una ficha roja en el tablero, un 2 representa la
presencia de una ficha negra y un tres representa ausencia
de ficha.

Se requiere calcular y mostrar :


El número de fichas rojas , el número de fichas negras y el
número total de fichas.
4.- Se tiene el monto de cada una de 100 ventas realizadas
por una vendedora de un establecimiento comercial. Por
cada venta calcule : el IVA de 15.5 %, calcule y muestre el
monto a pagar incluyendo el IVA, calcule y muestre el monto
total en ventas y monto total en impuesto por todas las 100
ventas.

Análisis:

EL dato sería un vector VENTAS[100], el cual contiene los


montos de las 100 ventas.
Se debe generar un vector IVA[100],haciendo IVA[I] =
VENTAS[I]*0.155.
El monto a pagar de cada venta se guarda en un vector
MONTO[100]. Este vector se calcula haciendo MONTO[I] =
Ventas[I] + IVA[I].
El monto total en ventas (T_VENTAS) se obtiene sumando
los elementos del vector MONTO[100].
El monto total de impuesto (T_IMP) se obtiene sumando los
elementos del vector IVA[100].

Diseño del algoritmo:


Se requiere calcular el vector IVA para lo cual es necesario
recorrer el vector ventas y multiplicar cada elemento por el
15.5 %.
Dentro del mismo ciclo se puede calcular el vector MONTO.
5.-Llenar un vector de n elementos con los primeros n
valores enteros y primos.

Análisis:
Un número primo es aquel que es divisible únicamente por
el mismo y la unidad. Para chequear si un numero es
divisible por otro se usa la función mod, la cual devuelve el
resto de la división : si (A mod B = 0 ),el número A es
divisible por B.
Para verificar si un número es primo se comprueba la
división del número por todos los valores enteros que están
por debajo de el, excluyendo la unidad y el número mismo.
Los números 1,2 y 3 son primos.
Diseño del algoritmo:
6.-Generar la siguientes matrices:
Análisis:
las matrices se almacenan como se muestra:
La matriz A se recorre por filas y se asigna a cada elemento
un valor que puede ser un contador inicializado en 1.
La matriz B se recorre por columnas y se asigna a cada
elemento un valor que puede ser el contador inicializado en
1.
La matriz C se crea utilizando un criterio (i == j) para
llenarla.

Estructura de Datos:

En ciencias de la computación, una estructura de datos es


una forma particular de organizar datos en una computadora
para que puedan ser utilizados de manera eficiente.
Diferentes tipos de estructuras de datos son adecuados
para diferentes tipos de aplicaciones, y algunos son
altamente especializados para tareas específicas.
Las estructuras de datos son un medio para manejar
grandes cantidades de datos de manera eficiente para usos
tales como grandes bases de datos y servicios de indización
de Internet. Por lo general, las estructuras de datos
eficientes son clave para diseñar algoritmos eficientes.
Algunos métodos formales de diseño y lenguajes de
programación destacan las estructuras de datos, en lugar de
los algoritmos, como el factor clave de organización en el
diseño de software.
Las estructuras de datos se basan generalmente en la
capacidad de un ordenador para recuperar y almacenar
datos en cualquier lugar de su memoria.

Estructura de datos contiguas


Estos tipos de datos básicos se agrupan y dan paso al
nuestro tema principal, los datos estructurados
De acuerdo con la forma en que los datos se organizan, se
clasifican en:
Tipos de datos simples
Tipos de datos estructurados
La principal característica de los tipos de datos simples
consiste en que ocupan sólo una casilla de memoria; por
tanto, una variable simple hace referencia a un único valor a
la vez.
Los tipos de datos estructurados se caracterizan por el
hecho de que con un nombre (identificador de la variable
estructurada) se hace referencia a un grupo de casillas de
memoria. Es decir, un tipo de dato estructurado tiene varios
componentes. Cada uno de éstos puede ser un tipo de dato
simple o estructurado. Sin embargo, los componentes
básicos, los del nivel más bajo, de cualquier tipo de datos
estructurado son siempre tipos de datos simples.
El estudio de las estructuras de datos constituye una de las
principales actividades para llegar al desarrollo de grandes
sistemas de software.
Datos estructurados
Un tipo de dato estructurados es una entidad, con un solo
identificador o nombre, constituida por datos de tipo más
simples o también por datos estructurados.
Por ejemplo: un tipo de dato cadena (string) esta
conformado por una sucesión de tipos de datos caracter
(char), una matriz esta formada por datos simples
organizados en forma de filas y columnas, y un archivo esta
conformado por registros, éstos por campos, que se
componen a su vez, por datos más simples.
Los datos estructurados se identifican con un nombre como
si fuera un objeto individual, esto es posible en la mayoría
todos los lenguajes de programación. Estos lenguajes no
solo permiten identificar y definir la estructura, sino también
la forma en que se puede manipular estas estructuras.
Como los lenguajes permiten “abstraer” la estructura de
datos en un nombre, a partir de ahora los referiremos de la
misma manera que los datos simples.
Datos estructurados contiguos y datos estructurados
enlazados (respecto de su ubicación en memoria).
Las estructuras contiguas o físicas son aquellas que al
representarse en el hardware del ordenador, lo hacen
situando sus datos en áreas adyacentes de la memoria; un
dato en una estructura contigua se localiza directamente
calculando su posición relativa al principio del área de
memoria que contiene la estructura. Los datos se relacionan
por su cercanía o por su posición relativa dentro de la
estructura.
Las estructuras enlazadas son estructuras enlazadas
cuyos datos no tienen por qué situarse de forma contigua en
la memoria; en estas, los datos se relacionan unos con otros
mediante apuntadores (un metadato; es un dato que hace
referencia de donde esta el dato que sigue en la estructura).
La localización de un dato no es inmediata sino que se
produce a través de los apuntadores que relacionan unos
datos con otros.
Datos estructurados estáticos y datos estructurados
dinámicos:
Las estructuras estáticas :son aquellas en las que el
tamaño ocupado en memoria, se define con anterioridad a la
ejecución del programa que los usa, de forma que su
dimensión no puede modificarse durante la misma, aunque
no necesariamente se tenga que utilizar toda la memoria
que se reserva a la hora de declarar la estructura.
Las estructuras dinámicas, : pueden crecer y decrecer en
tamaño, durante la ejecución del programa, dependiendo de
las necesidades de la aplicación, sin que el programador
pueda o deba determinarlo previamente. El único límite de
crecimiento esta relacionado con la memoria disponible en
el equipo donde se ejecute.
Estas dos clasificaciones nos ayudarán a exponer los
distintos tipos de datos estructurados, incidiendo en las
ventajas e inconvenientes para su almacenamiento y
tratamiento, en términos de la eficacia de una determinada
aplicación ya sea de economía espacial (no emplear más
memoria de la necesaria) o temporal (emplear el menor
tiempo posible en las operaciones).

Estructura de datos puntero


Un puntero es una variable que contiene la dirección de memoria de
un dato o de otra variable que contiene al dato en un arreglo. Esto
quiere decir, que el puntero apunta al espacio físico donde está el
dato o la variable. Un puntero puede apuntar a un objeto de cualquier
tipo, como por ejemplo, a una estructura o una función. Los punteros
se pueden utilizar para referencia y manipular estructuras de datos,
para referenciar bloques de memoria asignados dinámicamente y
para proveer el paso de argumentos por referencias en las llamadas
a funciones.

Muchas de las funciones estándares de C, trabajan con punteros,


como es el caso del scanf o strcpy. Estas funciones reciben o
devuelve un valor que es un puntero. Por ejemplo: A scanf se le pasa
la dirección de memoria del dato a leer...

char a;

scanf ("%c",&a);

En este caso se le pasa la dirección de memoria de la variable a, la


cual tiene reservado un espacio en la memoria por el compilador.
Podríamos hacer lo mismo con este código:

char *a = (char*) malloc (sizeof (char));

scanf ("%c", a);

En este código, al scanf le pasamos el puntero en sí. El puntero es


una variable, como bien se ha dicho anteriormente, que contiene una
dirección de memoria, por tanto, no es necesario el uso de & para
pasarle la dirección de memoria a scanf. Anteriormente hemos tenido
que reservar un espacio de memoria con malloc(), que se verá su
uso más adelante.
Este código sería erróneo y daría una violacion de segmento:

char *a;

scanf ("%c", a);

En este caso, no hemos reservado memoria, por lo tanto la función


escribirá en una dirección de memoria que no le pertenece, y por ello
se producirá la susodicha violación de segmento.

Estructura de datos lineales


En este tema se estudia la primera gran familia de TADs, todos ellos
derivados del concepto de secuencia. Primero se definen las
secuencias como conjuntos de elementos entre los que se establece
una relación de predecesor y sucesor. Los diferentes TADs basados
en este concepto se diferenciaran por las operaciones de acceso a
los elementos y manipulación de la estructura. Desde el punto de
vista de la informática, existen tres estructuras lineales
especialmente importantes: las pilas, las colas y las listas. Su
importancia radica en que son muy frecuentes en los esquemas
algorítmicos.

Las operaciones básicas para dichas estructuras son:

crear la secuencia vacía

añadir un elemento a la secuencia

borrar un elemento a la secuencia

consultar un elemento de la secuencia

comprobar si la secuencia está vacía

La diferencia entre las tres estructuras que se estudiarán vendrá


dada por la posición del elemento a añadir, borrar y consultar:

Pilas: las tres operaciones actúan sobre el final de la secuencia


Colas: se añade por el final y se borra y consulta por el principio

Listas: las tres operaciones se realizan sobre una posición


privilegiada de la secuencia, la cual puede desplazarse

Estructura de datos lineales (árboles)


Los Árboles son las estructuras de datos mas utilizadas, pero
también una de las mas complejas, Los Árboles se caracterizan por
almacenar sus nodos en forma jerárquica y no en forma lineal como
las Listas Ligadas, Colas,Pilas,etc., de las cuales ya hemos hablado

Datos importantes de los Árboles

Para comprender mejor que es un árbol comenzaremos explicando


como está estructurado.

Nodos: Se le llama Nodo a cada elemento que contiene un Árbol.

Nodo Raíz: Se refiere al primer nodo de un Árbol, Solo un nodo del


Árbol puede ser la Raíz.

Nodo Padre: Se utiliza este termino para llamar a todos aquellos


nodos que tiene al menos un hijo.

Nodo Hijo: Los hijos son todos aquellos nodos que tiene un padre.

Nodo Hermano: Los nodos hermanos son aquellos nodos que


comparte a un mismo padre en común dentro de la estructura.

Nodo Hoja: Son todos aquellos nodos que no tienen hijos, los cuales
siempre se encuentran en los extremos de la estructura.

Nodo Rama: Estos son todos aquellos nodos que no son la raíz y
que ademas tiene al menos un hijo.

También podría gustarte