Apuntes de Informatica Segundo Cuatrimestre
Apuntes de Informatica Segundo Cuatrimestre
BIBLIOGRAFÍA
HISTORIA DE C
1966 BCPL: Basic Combined Programming Language (Lenguaje de Programación Básico
Combinado). Martin Richards. Cambridge.
1969 B: Dennis Ritchie y Ken Thompson. Laboratorios Bell. Rescribir el UNIX que estaba en
ensamblador.
1972 C: Dennis Ritchie y Brian Kernighan
1983 Comité para la estandarización
1999 ANSI-ISO C99
1
ESTRUCTURA DE UN PROGRAMA EN LENGUAJE C
1. /* Comentarios:
Los comentarios de varias líneas se escriben entre /* . . .*/
o con //...... hasta el final de la línea
*/
2. // Directivas al compilador:
#include <....>
3. // Declaraciones globales (funciones)
4. // Función principal
int main (int argc, char *argv [])
{
/* declaraciones locales */
/* sentencias* /
return 0;
}
5. // Definición de las funciones declaradas en el punto 3.-
TIPOS PRIMITIVOS DE DATOS
IDENTIFICADORES
Nombre que se les da a las constantes, variables y/o funciones.
Está formado por una secuencia de caracteres alfanuméricos.
NO puede tener espacios ni símbolos especiales.
DEBE comenzar con un carácter alfabético.
C es sensible al tipo de letra, diferencia entre mayúsculas y minúsculas.
2
Se recomienda usar letras minúsculas para las variables y funciones, y mayúsculas para las
constantes.
IDENTIFICADORES: EJEMPLOS
var Válido
var_1 Válido
Cantidad Válido
VARIABLES: CONCEPTO
Una variable es la representación simbólica de una dirección de memoria del computador. Tienen
un nombre llamado identificador que se escribe en minúsculas.
Las variables contienen valores que pueden ser asignados y/o modificados en cualquier momento
de la ejecución del programa.
En el lenguaje C las variables deben ser declaradas antes de ser usadas.
Donde:
tipo_de_dato: Es el tipo de dato que guardará la variable. Puede ser tipo de dato primitivo o definido
por el usuario.
nomb_var1: Identificador que representa la dirección de memoria de la variable.
Ejemplos:
char var;
int cont, suma;
ASIGNACIÓN
Es la acción mediante la cual una variable o constante (en el momento de la declaración) toma un
valor determinado.
3
Sintaxis:
variable = expresión;
Ejemplos:
var = 'h';
cont = cont + 3;
suma = suma + 20;
promedio = suma / cont;
CONSTANTES: CONCEPTO
Una contante, como las variables, es la representación simbólica de una dirección de memoria del
computador. El identificador se escribe en mayúsculas.
Una constante toma un valor en el momento de la compilación y no puede ser modificado durante
la ejecución del programa.
Deben ser declaradas e inicializadas antes de ser usadas. Las constantes pueden ser:
1. Literales
2. Definidas o simbólicas:
3. Declaradas:
CONSTANTES
4
OPERADORES
Aritméticos
suma resta multiplicación división módulo
+ - * / %
Relacionales
igual que distinto que mayor que mayor o igual menor que menor o igual
que que
== != > >= < <=
Lógicos
NO (not) O (or) Y (and)
! || &&
OPERADORES UNITARIOS
Estos operadores se aplican sólo a un operando
dirección indirección Incremento Decremento unitario
unitario
& * ++ --
OPERADORES DE ASIGNACIÓN
variable = variable OPERADOR expresión
es equivalente a:
5
SALIDA DE RESULTADOS Y/O INFORMACIÓN POR MONITOR
La función estándar más utilizada para mostrar información o resultados por monitor es:
Carácter %c
Entero %d %i
Entero largo %ld
Float %f
Double %lf
Cadena o string %s
\a señal sonora
\b retroceso (backspace)
\n salto de línea
\t tabulación horizontal
\\ barra invertida
\' apóstrofe o comilla simple
\" comillas dobles
\? signo de pregunta
\0 carácter nulo (fin de cadena)
\r retorno de carro
Ejemplos:
printf ("Este es un mensaje");
printf ("Uno es: %d, \t uno punto uno es: %f", 1, 1.1);
6
printf ("Un carácter: %c “, ‘m');
printf ("Una cadena de caracteres: %s", "Una cadena");
int cont = 6;
float prom = 0.0;
char letra = 'T';
printf ("Contador: %i, Promedio: %f", cont, prom);
printf ("Otro carácter es: %c”, letra);
printf ("Suma: %i + %i = %i”, cont, 3, (cont+3));
La función estándar mas utilizada para este fin es: Scanf (“cadena de control”, dirección de
memoria)
Para utilizar esta función, también debe incluirse en la compilación la librería de entrada y salida
estándar stdio.h
Para utilizar esta función, también debe incluirse en la compilación la librería de entrada y salida
estándar stdio.h
7
SECUENCIAL
Las estructuras secuenciales corresponden a las acciones de:
1. Declaración de variables y/o constantes.
2. Llamada a funciones.
3. Asignaciones.
Ejemplo:
int z;
printf("Esto es un comentario");
z = 4 * 5 + 3 / 6;
SELECCIÓN
Ejecución de una de dos instrucciones (o conjunto de instrucciones o bloque de código) según el
resultado booleano de una expresión.
SELECCIÓN SIMPLE
if (expresión)
{
// bloque de código
}
Si el resultado de la expresión es VERDADERO se ejecuta el bloque de código, caso contrario
(resultado FALSO) el programa continúa con la instrucción siguiente.
SELECCIÓN DOBLE
if (expresión)
{
// bloque de código 1
}
else
{
//bloque de código 2
}
Si el resultado de la expresión es VERDADERO se ejecuta el bloque de código 1, caso contrario
(resultado FALSO) se ejecuta el bloque de código 2.
8
SELECCIÓN MÚLTIPLE (SWITCH OR CASE)
Esta estructura permite seleccionar, en función del resultado de una expresión, el conjunto de
instrucciones (o bloque de código) a ejecutar, de los n posibles.
En esta estructura el resultado de la expresión debe ser un tipo de dato ordinal (entero, carácter,
etc.).
Cada bloque de código debe terminar en la instrucción break para indicar la finalización del
bloque. Si esta sentencia no está en el bloque a ejecutar se ejecutarán todos los bloques que se
encuentran a continuación hasta encontrar:
• una instrucción break o
• el final de la estructura switch ... case
switch ( expresion)
{
case valor_1:
//bloque de código 1
break;
case valor_2:
//bloque de código 2
break;
...
case valor_N:
//bloque de código N
break;
default:
//bloque de código default
break;
}
REPETICIÓN
La repetición o iteración consiste en ejecutar reiteradamente un conjunto de instrucciones (o
bloque de código) con el objetivo de alcanzar un resultado. Antes de ingresar al proceso repetitivo
las variables deben tener asignados valores definidos.
9
El resultado de cada repetición se utiliza como punto de partida para la siguiente iteración. La
estructura debe contar con una condición de salida del proceso iterativo. Es por esto que debe
tener, al menos, una instrucción que pueda modificar el valor de la variable de control.
WHILE
while (expresión)
{
// bloque de código
}
DO WHILE
do {
// bloque de código
} while (expresión);
ESTRUCTURA FOR
for( valor_inicial; condición; incremento)
{
//bloque de código
}
SENTENCIAS
break
continue
PUNTEROS
Un puntero es una variable que contiene una dirección de memoria de otra variable.
Declaración:
tipo_de_dato *nombre_del_puntero;
Ejemplo:
int *ptr1, *ptr2;
float *pf1, *pf2;
char *pch;
Operadores:
- dirección: &
- indirección: *
10
UNIDAD 7
FUNCIONES
FUNCIONES: CONCEPTO
• Las funciones están constituidas por un bloque de instrucciones que realizan una tarea
específica.
• A las funciones se las identifican con un nombre. Debe ser un identificador válido de C.
• La función recibe datos a través de sus parámetros.
• Las funciones en lenguaje C devuelven un solo valor o ninguno.
• Las funciones pueden ser estándar y definidas por el usuario.
11
FUNCIONES ESTÁNDAR
Son las funciones de la biblioteca estándar de C. El lenguaje tiene 24 bibliotecas, las más usuales
son:
• ctype.h funciones de caracteres.
• math.h: funciones matemáticas.
• stdio.h: funciones de entrada/salida estándar.
• stdlib.h: funciones especiales.
• string.h: funciones de cadenas de caracteres
• time.h: funciones de tiempo, fecha y hora.
Para utilizar una función estándar hay que incluir en la compilación el archivo cabecera o header
de la biblioteca.
FUNCIONES DEFINIDAS POR EL USUARIO
• Un principio importante para resolver problemas es el de “dividir y vencer”. Separar el
problema en problemas más pequeños, para así enfrentarlos y resolverlos en un tamaño más
accesible y fácil de manejar.
• Este principio se aplica en la programación utilizando el modularidad. Los lenguajes permiten
escribir programas compuestos por módulos, también llamados subprogramas, subrutinas,
procedimientos o funciones. En todos los casos todos permiten separar un programa en partes
más pequeñas y reutilizar los módulos para resolver problemas similares.
Una aplicación en lenguaje C está compuesta por una o más funciones.
Siempre debe existir la función int main (...). En esta función comienza a ejecutarse la aplicación.
Las funciones definidas por el usuario deben:
• declararse (declaración)
• implementarse (definición)
• invocarse (llamada)
DECLARACIÓN DE UNA FUNCIÓN
Se declaran en la zona de declaraciones globales, antes de la función principal.
Sintaxis (cabecera de la función):
tipo_de_dato nombre (lista de parámetros);
tipo_de_dato:
• Es el tipo de dato que devuelve la función. Puede ser cualquier tipo de dato estándar de C o
definido por el usuario, EXCEPTO arreglos.
• Si la función no devuelve ningún valor se usa la palabra reservada void.
12
nombre:
• debe ser un identificador válido de C. Con este nombre se invoca o llama a la función.
lista de parámetros:
• Es una lista de nombres de variables, precedidas por el tipo de dato y separadas por coma. Los
parámetros reciben los valores de los argumentos cuando se llama la función.
• Puede no tener parámetros por lo que la lista estará vacía. Hay que poner los paréntesis aún
con lista vacía.
DEFINICIÓN DE UNA FUNCIÓN
Se definen luego del cierre de la llave de bloque de código de la función principal ( int main(...)).
Sintaxis:
tipo_de_dato nombre (lista de parámetros)
{
// declaraciones locales
// bloque de código
return expresión;
}
• declaraciones locales
declaración de constantes y/o variables. Tienen validez (ámbito) sólo dentro de la función.
• bloque de código
conjunto de instrucciones que realizan la tarea específica de la función.
• return expresión
el valor que devuelve la expresión es el valor que retorna la función. Si la función es void puede
omitirse la sentencia return. Una función puede tener más de un return.
La función termina su ejecución cuando encuentra una sentencia return o la llave de cierre de la
función.
LLAMADA DE UNA FUNCIÓN
• La función puede llamarse o invocarse desde cualquier otra función, excepto desde sí misma.
Para este caso existen las funciones recursivas.
• Se llaman con el nombre y la lista de argumentos.
• Las funciones que devuelven valor deben llamarse dentro de una expresión, a la derecha de
una instrucción de asignación o como parámetro de una función de salida de datos. No es
usual, pero puede llamarse como una sentencia aislada como si fuera una función void.
• Las funciones void se invocan o llaman como una sentencia secuancial sin formar parte de una
expresión.
13
PARÁMETROS DE LAS FUNCIONES
• Los parámetros formales reciben los valores de sus correspondientes argumentos reales
(llamada de la función).
• La transferencia de valores de los argumentos reales a los parámetros formales es
unidireccional.
• Los parámetros y los argumentos deben coincidir en cantidad, posición y tipo de dato.
• Los parámetros se comportan como variables locales de las funciones.
• La lista de parámetros en la cabecera de la función es una declaración implícita de variables de
la función.
EJEMPLO: DEVUELVE VALOR
14
BIBLIOTECA DE FUNCIONES DEL USUSARIO
El usuario puede crear sus propias bibliotecas con las funciones, por él definidas y que utiliza
habitualmente.
Uno de los procedimientos es el siguiente:
1. Declarar, definir y llamar la función que desea guardar.
2. Cuando la ejecución de la función sea correcta, copiar la definición de la función en un archivo
y guardarlo en la carpeta de trabajo con extensión .h (por ejemplo prueba.h).
3. Incluir en la compilación:
#include " prueba.h",
de esta manera se puede utilizar las funciones definidas en la biblioteca prueba.h
Inclusión de archivos cabecera o headers:
a. < prueba.h >
el compilador busca el archivo en el directorio por defecto
a. " prueba.h "
el compilador busca el archivo en el directorio de trabajo
a. "C:/ . . . / prueba.h"
el compilador busca el archivo en la carpeta especificada.
PARÁMETROS DE LAS FUNCIONES
Los parámetros pueden ser:
1. Parámetros por valor: Las modificaciones que se realizan en los valores de estos parámetros
NO modifican los valores de los correspondientes argumentos de la llamada. Hay una copia
unidireccional de los valores de los argumentos a los parámetros.
2. Parámetros por referencia: Las modificaciones que se realizan en los valores de estos
parámetros SI modifican los valores de los argumentos de la llamada. Hay comunicación
bidireccional entre los argumentos y los parámetros.
PARÁMETRO POR VALOR PARÁMETRO POR REFERENCIA
15
ÁMBITOS DE LAS VARIABLES
• Variables globales:
Se declaran en la zona de declaraciones globales. Tienen ámbito global, es decir tienen validez en
todo el programa, incluyendo funciones. Mantienen el valor que se les asigna durante la ejecución
del programa. Se incializan automáticamente en cero. El estándar recomienda NO UTILIZAR
variables globales, pueden producir efectos catastróficos.
• Variables locales:
Se declaran dentro de las funciones. Tienen ámbito local. No se inician automáticamente. Pierden
su valor al finalizar la ejecución de la función donde fueron declaradas.
ALMACENAMIENTO DE LAS VARIABLES
• automáticas (auto): Por defecto todas las variables locales son automáticas. Tienen las
características propias de las variables locales.
• estáticas (static): Estas variables tienen:
a) ámbito local: sólo tienen validez en la función donde fueron declaradas y
b) almacenamiento global: se inicializan en cero y mantienen sus valores hasta la finalización del
programa.
• register: Se almacenan en un registro del microprocesador. No tienen dirección de memoria. La
instrucción &x es inválida si x es una variable con el modificador register. Si los registros están
ocupados, la variable se guarda en la memoria pero no hay notificación.
• volátil (volatile): Indica al compilador que el valor de la variable puede cambiar por otra
instrucción que no sea la de asignación.
• externas (extern): Especifica que la variable está declarada en otro archivo perteneciente al
proyecto.
FUNCIONES RECURSIVAS
Recursividad: es la forma en la cual se especifica un concepto o proceso basado en su propia
definición.
Función recursiva: es aquella función que puede llamarse o invocarse a sí misma.
16
CÁLCULO DE PRODUCTO CON FUNCIÓN RECUSRIVA
ARREGLOS EN LENGUAJE C
DEFINICIÓN:
Dato estructurado estático, compuesto por un conjunto ordenados de valores homogéneos,
referenciados por una única variable, que se alojan en domicilios contiguos de memoria.
• A cada elemento se accede por medio de uno o más índices que indican la posición relativa del
elemento dentro del conjunto.
• Valores homogéneos: mismo tipo de datos.
• Los datos de un arreglo pueden ser tipos de dato estándar o definidos por el usuario.
17
• Unidimensional (vector o lista):
tipo_de_dato nombre[cantidad_de_elementos];
Ejemplos:
int vec [10];
float lista1 [8], lista2 [20];
char vectChar [12];
• Bidimensional (matriz o tabla):
tipo_de_dato nombre[nro_filas][nro_columnas];
Ejemplos:
char matriz1 [4][8]; matriz2 [6][10];
int tabla [6][6];
float mes [5][7];
Características de los arreglos en lenguaje C
1. El subíndice del primer elemento es siempre cero.
2. El nombre del arreglo es una constante puntero que contiene la dirección de memoria
del primer elemento.
vector &vector[0]
El compilador no hace comprobación de límites.
INICIALIZACIÓN DE ARREGLOS EN LA DECLARACIÓN
Ejemplos para arreglos unidimensionales
int vect1[10] = { 1, 3, 5, 7, 9};
float vect2[12] = { 1.1, 7.3, -0.3, -2.9};
int vect3[7] = {};
float lista1[] = {};
char lista2[6], lista3[] ={'a', 'b'};
short int lista4[5];
18
Ejemplos para arreglos bidimensionales
Int matA[5][4] = {{-1, -2, -3, -4},{0, 5, 10}};
float matB[3][4] = {{1.1, -2.2, 3.3},{-1.2, 2.4},{}};
int matC[3][3] = {};
float tablaA[6][5] = {{},{},{},{},{1,2,3}};
char tablaB[4][4];
char tablaC[3][4] ={{'x', 'y'},{'P','Q'},{'A','E','I','O'}};
ASIGNACIÓN DE VALORES A LOS ELEMENTOS DE UN ARREGLO
Ejemplos para arreglos unidimensionales
vect1[1] = 125;
vect1[2] = vect1[1] / 20;
vect2 [11] = 3.3333;
lista2 [0] = 'R', lista2 [1] = 'S', lista2 [2] = 'T';
lista2 [3] = lista2 [2] + 2, lista2 [4] = lista2 [3] ++;
lista2 [5] = lista2 [3] + 3;
Ejemplos para arreglos bidimensionales
matA[0][0]= 3, matA[0][1] = matA[0][0] * 33;
matB[2][3] = 1.33, matB[2][2] = 2.66;
tablaB [0][0] = 'T', tablaB[0][1] = 'a';
tablaB [0][2] = 'b', tablaB[0][3] = 'l';
tablaB [0][4] = 'a', tablaB[1][0] = ':';
tablaB [1][1] = ' ', tablaB[1][2] = '7';
CARGA DE VALORES EN UN CICLO REPETITIVO
Ejemplo para arreglos unidimensionales:
for ( i = 0 ; i < sizeof(vect1)/sizeof(int) ; i++)
scanf("%d", &vect1[i]);
for ( i = 0 ; i < sizeof(vect2)/sizeof(float) ; i++)
scanf("%f", &vect2[i]);
19
for ( i = 0 ; i < sizeof(lista2)/sizeof(char) ; i++)
scanf("%c", &lista2[i]);
ASIGANCIÓN DE VALORES A LOS ELEMENTOS DE UN ARREGLO
Ejemplo para arreglos bidimensionales
for ( i = 0 ; i < nro_filas ; i++)
for ( j = 0 ; j < nro_columnas ; j++)
scanf("%d", &matA[i][j]);
for ( i = 0 ; i < nro_filas ; i++)
for ( j = 0 ; j < nro_columnas ; j++)
scanf("%f", &matB[i][j]);
FUNCIONES PARA CARGAR Y MOSTRAR UN ARREGLO UNIDIMENSIONAL
void cargarVect(int tam, int v[])
{
int i;
for(i=0; i < tam; i++)
scanf("%d", &v[i]);
}
void verVect(int tam, int v[])
{
int i;
for(i=0; i<tam; i++)
printf(" %5d", v[i]);
}
FUNCIONES PARA CARGAR Y MOSTRAR UN ARREGLO BIDIMENSIONAL
void cargarMat(int fil,int col,int m[20][20])
{
int i, j;
for(i=0; i < fil; i++)
20
for(j=0; j < col; j++)
scanf("%d", &m[i][j]);
}
void verMat(int fil,int col, int m[20][20])
{
int i, j;
for(i=0; i<fil; i++)
{
printf("\n");
for(j=0; j < col; j++)
printf(" %5d", m[i][j]);
}
}
ORDENAMIENTO Y BÚSQUEDA
Cuando se dispone de un conjunto de datos las tareas que se realizan, con frecuencia, sobre
ellos son:
Ordenamiento: proceso de reorganizar un conjunto de objetos en una secuencia
determinada dada por una relación de orden.
Búsqueda: es una operación que tiene por objeto la localización de un elemento dentro de
una estructura de datos.
El estudio y análisis de los métodos de búsqueda y ordenamiento no corresponden a esta
asignatura.
Sólo se estudiarán métodos simples a los fines didácticos.
MÉTODO DE LA BURBUJA
Método de la burbuja (uno contra el resto)
El método consiste en tomar cada elemento de referencia
i (con i = 0, 1, ..., n – 2 )
y compararlo con cada uno de los restantes los elementos
j ( con j = i+1, i+2, ..., n).
Si el elemento j < elemento i, se realiza en intercambio (ordenamiento ascendente).
21
La primera comparación es entre el primero y segundo elemento del vector.
La última entre el penúltimo y último elemento del vector
MÉTODOS DE BÚSQUEDA
Los dos métodos más usados para la búsqueda de un elemento en una estructura de datos
son:
1. Búsqueda lineal
2. Búsqueda binaria
Búsqueda lineal o secuencial: se puede realizar sobre un vector ordenado o desordenado.
Comienza desde el primer elemento y recorre el arreglo secuencialmente buscando la
coincidencia entre la clave de búsqueda (elemento a buscar) y algún elemento del vector.
La búsqueda finaliza con la primera ocurrencia o cuando se llega al final del arreglo y el
elemento a buscar no se encuentra.
BÚSQUEDA BINARIA
Este método sólo se puede utilizar cuando el arreglo está ordenado. Toma el elemento
central del arreglo y lo compara con la clave de búsqueda si esta es mayor la búsqueda se
realiza, de la misma manera, en la mitad "derecha" del vector, caso contrario la búsqueda
se realiza en la mitad "izquierda". Así sucesivamente hasta encontrar o no la coincidencia.
La búsqueda finaliza con la primera ocurrencia o cuando no se puede subdividir el arreglo y
el elemento a buscar no se encuentra.
22
DATOS TIPO CHAR
Es un dato simple ordinal. No tiene mucha utilidad como dato aislado pero sí formando
parte de una cadena de caracteres. Tal es así que existe una librería de funciones exclusiva
para caracteres:
ctype.h
En el lenguaje C los valores válidos que puede tomar un dato tipo char son los
correspondientes al conjunto 1 de caracteres ASCII.
Un literal del tipo carácter se indica entre comillas simples. Por ejemplo: 'm' , '5', etc.
DATOS TIPO CHAR: LIBRERÍA CTYPE
23
CADENAS DE STRING: DECLARACIÓN E INICIALIZACIÓN
Sintaxis de la declaración
char nombre_de_la_cadena [tamaño];
Ejemplo:
char cadena1 [10], cadena2[12];
char calle [10];
Inicialización:
char cad1[10] = {'a', 'e', 'i', 'o', 'u'};
char cad2[10] = {};
char cad3[] = {'C', 'u', 'r', 's', 'o'};
char cad4[15] = "Universidad";
char cad5[8] = "clase";
char cad6[] = {};
LONGITUD FÍSICA
Es el espacio de memoria que se reserva en el momento de la declaración de la cadena.
Ejemplo:
char calle [10];
24
LONGITUDES FÍSICAS Y LÓGICAS
Ejemplo:
char calle [10] = "Junin";
En el momento de la asignación la posición de los caracteres es la siguiente:
La inserción del terminador nulo es automática cuando se asigna una cadena, no así cuando
se asignan un conjunto de caracteres.
INGRESO POR TECLADO
Para el ingreso de cadena de caracteres se utilizan, entre otras, las siguientes funciones de la
librería stdio.h:
a) scanf("%s", char *s);
b) fscanf(stdin, "%s", char *s);
stdin: dispositivo estándar de entrada.
c) fgets (char *s, nro_char, stdin);
nro_char: es la cantidad de caracteres que se leerán.
SALIDA POR MONITOR
Para las cadenas de caracteres se utilizan, entre otras, las siguientes funciones de la librería
stdio.h:
- printf("%s", char*);
- fprintf(stdout, "%s", char*);
stdout: dispositivo estándar de salida (monitor)
- fputs (char*, stdout);
25
FUNCIONES STRING. H
STRING – ARREGLOS
Una cadena de caracteres se declara:
char nombre_cadena[long_Fisica];
La sintaxis para declarar un vector de cadenas de caracteres es:
char nombre_vector[nro_de_cadenas][long_Fisica];
Ejemplo:
char vectCad[10][15];
Este vector podrá contener hasta 10 cadenas de caracteres de una longitud lógica máxima de 14
caracteres.
PARÁMETROS DE main ()
La cabecera de la función main() es:
int main(int argc, char *argv[])
{
...
}
El primer prámetro, argc, es un contador de los argumentos que se escriben en la línea de
órdenes, cuando se ejecuta el programa.
El segundo, *argv[], es un arreglo de strings donde se guardan los argumentos de llamada.
26
ORDENAMIENTO Y BÚSQUEDA
Ordenamiento
• Método de la burbuja
Búsqueda:
• búsqueda lineal
búsqueda binaria
27