evaluación permanente 5


             
                                       VECTORES Y MATRICES. 

1. Introducción. 
Los vectores y matrices son uno de los medios principales para el almacenamiento de 
los datos en un programa. En esta práctica veremos todos los conceptos relativos a la 
creación y manejo en C de vectores, matrices y cadenas de caracteres. 

2. Conceptos nuevos. 
Los conceptos nuevos introducidos son: 

1) Definición y manejo de vectores o arrays unidimensionales. 
2) Definición y manejo de matrices o tablas. 
3) Definición y manejo de cadenas de caracteres. 
4) Búsqueda de un elemento dentro de un vector. 
5) Búsqueda de un elemento dentro de una tabla. 


3. Lenguaje C. 
Las nuevas características de C que ha aprendido y que necesita saber para la 
realización de la práctica son: 

1) Definición y funcionamiento de vectores o arrays unidimensionales. 
2) Definición y funcionamiento de matrices o tablas. 
3) Definición y funcionamiento de cadenas de caracteres. 
  
4. Entorno DevC++. 
La única funcionalidad nueva de DevC++ necesaria para esta práctica es saber cómo 
visualizar un vector en la ventana de depuración Watch. 
  
5. Búsqueda en vectores y matrices. 
Como ya hemos comentado inicialmente, los vectores y matrices son uno de los medios 
principales mediante los cuales se almacenan los datos en un programa C. Debido a esta 
causa, existen operaciones fundamentales cuyo tratamiento es imprescindible conocer. 
Estas operaciones esenciales son la búsqueda de elementos y la ordenación. En este 
curso sólo se abordará la primera de ellas. 

Veremos cómo realizar una búsqueda en un vector y cómo realizar una búsqueda en una 
matriz. 

  Fundamentos de Informática 
Primero de Ingeniería Técnica Industrial 
Mecánica, Química, Electricidad y Electrónica 
Departamento de Tecnologías de la Información 
  
5.1. Búsqueda en un vector. 
La búsqueda de un elemento dentro de un vector se basa en ir recorriendo 
secuencialmente el vector, de una posición a la siguiente, comenzando en la primera 
posición del vector y deteniéndose únicamente cuando se encuentra el elemento 
buscado o bien cuando se alcanza el final del vector. 

El pseudocódigo asociado a lo anteriormente expuesto sería el siguiente: 

Inicio 
 encontrado = 0 
 indice = 0 
 mientras (encontrado == 0) y (indice < ultimo) hacer 
 si (Vector[indice] == elemento_buscado) entonces 
 encontrado = 1 
 sino 
 incrementar indice 
 fin_mientras 

 si (encontrado == 1) entonces 
 Escribir “Elemento encontrado en posición” indice 
 sino 
 Escribir “Elemento no encontrado” 
Fin 

Observando el pseudocódigo anterior vemos que se utiliza una variable entera 
encontrado que indica si el elemento se encontró en la búsqueda. La variable 
encontrado se inicializa a 0 (falso) y se activa a 1 (verdadero) cuando se encuentra el 
elemento buscado. Se utiliza un operador and (en C &&), que permite evaluar las dos 
condiciones de terminación de la búsqueda: que el elemento se haya encontrado o que 
no haya más elementos (cuando el índice del vector excede al último valor válido del 
mismo). Cuando el bucle se termina, el elemento o bien se ha encontrado o bien no se 
ha encontrado. Si el elemento se ha encontrado, el valor de la variable encontrado será 1 
y el valor de la variable indice será la posición del vector donde se encuentra el 
elemento buscado. Por el contrario, si el elemento no se ha encontrado el valor de la 
variable encontrado será 0. 
 Fundamentos de Informática 
Primero de Ingeniería Técnica Industrial 
Mecánica, Química, Electricidad y Electrónica 
Departamento de Tecnologías de la Información 
  
5.2. Búsqueda en una matriz. 
Utilizando un razonamiento análogo al expuesto en la sección anterior, la búsqueda de 
un elemento dentro de una matriz se basa en ir recorriendo secuencialmente la matriz. 
La única diferencia con el caso anterior es que ahora hay que recorrer filas y columnas 
comenzando en la primera fila y primera columna del vector y deteniéndose únicamente 
cuando se encuentra el elemento buscado o bien cuando se alcanza la última fila y la 
última columna. 

El pseudocódigo asociado a una búsqueda en una matriz bidimensional, sería el 
siguiente: 

Inicio 
 encontrado = 0 
 indice_fila = 0 
 mientras (encontrado == 0) y (indice_fila < ultima_fila) hacer 
 indice_columna = 0 
 mientras (encontrado == 0) y (indice_columna < ultima_columna) hacer 
 si (Vector[indice_fila, indice_columna] == elemento_buscado) entonces 
 encontrado = 1 
 sino 
 incrementar indice_columna 
 fin_mientras 
 si (encontrado == 0) 
 incrementar indice_fila 
fin_mientras 

 si (encontrado==1) entonces 
 Escribir “Elemento encontrado en posición” indice_fila “,” indice_columna 
 sino 
 Escribir “Elemento no encontrado” 
Fin 

La única diferencia con el código visto en la sección anterior es que en este caso son 
necesarios dos bucles anidados, uno para recorrer las filas y otro para recorrer las 
columnas

Cómo crear nuevos tipos de datos en C++
C++ proporciona la capacidad de crear nuevos tipos definidos por el usuario
mediante el uso de la palabra reservada enum, la palabra reservada struct, la palabra
reservada union y la palabra reservada class.
Por ejemplo, las enumeraciones en C++ son declaradas mediante la palabra
enum y se convierte en un tipo de dato nuevo. Luego, para declarar una variable del
nuevo tipo de dato ya no es necesaria la palabra reservada enum, sino que se utiliza
directamente el nombre del nuevo tipo de dato.
Ejemplo:
enum boolean {FALSE, TRUE};
struct Nombre {char primer [10];char segundo[10];};
(12)Directivas del Preprocesador-> typedef
La palabra reservada typedef proporciona un mecanismo para la creación de
sinónimos o alias para tipos de datos anteriormente definidos. Al crear un nuevo
nombre utilizando typedef no se crea un nuevo tipo; typedef simplemente crea un
nuevo nombre de tipo que puede ser utilizado como un seudónimo para un nombre de
tipo ya existente, lo cual ayuda a autodocumentar el programa.
Ejemplo:
typedef int IntArray10 [10];
La directiva del preprocesador-> #include
La directiva del preprocesador #include permite que se incluya una copia del
archivo especificado. Las dos formas de la directiva son:
#include <filename>
#include “filename”
La diferencia entre estas formas estriba en la localización donde el preprocesador
buscará el archivo a incluirse. Si el nombre del archivo está encerrado entre comillas,
el preprocesador buscará el archivo en el mismo directorio que el archivo que se está
compilando (este método se utiliza normalmente para incluir archivos de cabecera
definidos por el programador). Si el nombre del archivo está encerrado entre corchetes
angulares (< y >) la búsqueda se llevará a cabo en los directorios predesignados (por
ejemplo cuando se incluyen los archivos de cabecera de la biblioteca estándar).
Arreglos unidimensionales (Vectores)
Un vector es un arreglo unidimensional, es decir, sólo utiliza un índice para
referenciar a cada uno de los elementos. Su declaración será:
<tipo> <nombre> [<tamaño>]; //tamaño es una variable por decir “x”
El tipo puede ser cualquiera de los ya conocidos y el tamaño indica el número
de elementos del vector (se debe indicar entre corchetes [ ]). En el ejemplo se puede
observar que la variable i es utilizada como índice, el primer for sirve para rellenar el
vector y el segundo para visualizarlo. Como se aprecia, las posiciones van de 0 a 9
(total 10 elementos).
Ejemplo:
/* Declaración de un arreglo. */
#include <stdio.h>
main()
{
int vector[10],i;
for (i=0;i<10;i++) vector[i]=i;
for (i=0;i<10;i++) printf(" %d", vector[i]);
}
(13)Podemos inicializar (asignarle valores) un vector en el momento de
declararlo(igual que en Java). Si lo hacemos así no es necesario indicar el tamaño. Su
sintaxis es:
<tipo> <nombre> []={<valor_1>,<valor_2>,...}
Ejemplos:
int vector[]={1,2,3,4,5,6,7,8};
char vector[]="programador";
char vector[]={'p','r','o','g','r','a','m','a','d','o','r'};
Una particularidad con los vectores de tipo char (cadena de caracteres), es que
deberemos indicar en que elemento se encuentra el fin de la cadena mediante el
caracter nulo (\0). Esto no lo controla el compilador, y tendremos que ser nosotros los
que insertemos este carácter al final de la cadena.
Por tanto, en un vector de 10 elementos de tipo char podremos rellenar un
máximo de 9, es decir, hasta vector[8]. Si sólo rellenamos los 5 primeros, hasta
vector[4], debemos asignar el caracter nulo a vector[5]. Es muy sencillo:
vector[5]='\0';
Ahora veremos un ejemplo de como se rellena un vector de tipo char.
/* Vector de tipo char. */
#include <stdio.h>
main()
{
char cadena[20];
int i;
for (i=0;i<19 && cadena[i-1]!=13;i++)
cadena[i]=getche( );
if (i==19)
 cadena[i]='\0';
else
 cadena[i-1]='\0';
printf("\n%s",cadena);
}
Podemos ver que en el for se encuentran dos condiciones:
1.- Que no se hayan rellenado todos los elementos (i<19).
2.- Que el usuario no haya pulsado la tecla ENTER, cuyo código ASCII es 13.
También podemos observar una nueva función llamada getche( ), que se
encuentra en conio.h. Esta función permite la entrada de un caracter por teclado.
Después se encuentra un if, que comprueba si se ha rellenado todo el vector. Si es
cierto, coloca el caracter nulo en el elemento 20 (cadena[19]). En caso contrario
tenemos el else, que asigna el caracter nulo al elemento que almacenó el caracter
ENTER.
(14)En resumen: al declarar una cadena deberemos reservar una posición más que
la longitud que queremos que tenga dicha cadena.
Llamadas a funciones con arreglos
Como ya se comentó en el tema anterior, los arreglos únicamente pueden ser
enviados a una función por referencia. Para ello deberemos enviar la dirección de
memoria del primer elemento del arreglo. Por tanto, el argumento de la función deberá
ser un puntero.
Ejemplo:
/* Envío de un arreglo a una función. */
#include <stdio.h>
void visualizar(int []); /* prototipo */
main()
{
 int array[25],i;
 for (i=0;i<25;i++)
 {
 printf("Elemento nº %d",i+1);
 scanf("%d",&array[i]);
 }
 visualizar(&array[0]);
}
void visualizar(int array[]) /* desarrollo */
{
 int i;
 for (i=0;i<25;i++) printf("%d",array[i]);
}
En el ejemplo se puede apreciar la forma de enviar un arreglo por referencia. La
función se podía haber declarado de otra manera, aunque funciona exactamente igual:
· declaración o prototipo
void visualizar(int *);
· desarrollo de la función
void visualizar(int *arreglo)
Arreglos multidimensionales (Matrices)
Una matriz es un arreglo multidimensional. Se definen igual que los vectores
excepto que se requiere un índice por cada dimensión.
(15)Su sintaxis es la siguiente:
 <tipo> <nombre> [<tamaño_1>][<tamaño_2>],...,[<tamaño_n>];
Una matriz bidimensional se podría representar gráficamente como una tabla
con filas y columnas. La matriz tridimensional se utiliza, por ejemplo, para trabajos
gráficos con objetos 3D. En el ejemplo puedes ver como se rellena y visualiza una
matriz bidimensional. Se necesitan dos bucles para cada una de las operaciones. Un
bucle controla las filas y otro las columnas.
Ejemplo:
/* Matriz bidimensional. */
#include <stdio.h>
main()
{
int x, i, numeros[3][4];
/* rellenamos la matriz */
for (x=0;x<3;x++)
for (i=0;i<4;i++)
scanf("%d",&numeros[x][i]);
/* visualizamos la matriz */
for (x=0;x<3;x++)
for (i=0;i<4;i++)
printf("%d",numeros[x][i]);
}
Si al declarar una matriz también queremos inicializarla, habrá que tener en
cuenta el orden en el que los valores son asignados a los elementos de la matriz.
Veamos algunos ejemplos:
int numeros[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
Quedarían asignados de la siguiente manera:
numeros[0][0]=1
numeros[0][1]=2
numeros[0][2]=3
numeros[0][3]=4
numeros[1][0]=5
numeros[1][1]=6
numeros[1][2]=7
numeros[1][3]=8
numeros[2][0]=9
numeros[2][1]=10
numeros[2][2]=11
numeros[2][3]=12 (16)También se pueden inicializar cadenas de texto:
char dias[7][10]={"lunes","martes", … ,"viernes","sábado","domingo"};
Para referirnos a cada palabra bastaría con el primer índice:
printf("%s",dias[i]);












0 comentarios:

Publicar un comentario