Programación 1

Anuncio
Programación 1
Grado de Ingeniería Robótica
Tema 6: Datos estructurados
●
Índice (sesión 11/11/2015):
–
Arrays estáticos
–
Cadenas de caracteres
–
Funciones de la librería string.h
–
Punteros
●
●
●
Declaración de punteros
Operadores de punteros
Reserva dinámica de memoria
2
Arrays estáticos
●
●
●
●
Hasta ahora hemos utilizado tipos de datos simples: enteros, reales,
caracteres...
Sin embargo, es posible utilizar colecciones de estos tipos de datos, lo
que se conoce como vectores o arrays
Un vector o array contendrá un número determinado de elementos de un
mismo tipo. Cuando el tamaño del array se determina en tiempo de
compilación hablamos de arrays estáticos. Si se determina en tiempo de
ejecución tendremos arrays dinámicos
Así hablaremos de arrays de:
–
Enteros
–
Caracteres
–
Reales (float o double)
–
O de cualquier otro tipo...
3
Definición de arrays estáticos
●
●
Para definir y utilizar un array estático debemos especificar:
–
El tipo base de los elementos que contendrá el array
–
El número de elementos que tendrá
Sintaxis de C: tipo identificadorArray[num elementos]
–
int vectorI[3];
–
float vectorF[10];
–
char vectorC[256];
–
bool vectorB[12];
4
●
●
Array: acceso e inicialización
Para acceder a una posición de un arrray utilizamos el operador [ ]:
–
●
●
●
VectorI[2] = 3; VectorC[0] = 'a'; VectorB[4] = true;
Si nos salimos del tamaño del vector se producirá un fallo de segmentación
y se abortará la ejecución del programa (ojo!)
Al declarar los arrays, estos contienen basura. Hay que inicializarlos antes
de usarlos:
int cont;
for (cont=0;cont<10;cont++)
vectorF[cont] = 0;
Otra forma de inicializar un array directamente:
–
Int array[4] = {0, 1, 2, 3};
5
●
●
●
Arrays multidimensionales
También podemos definir nuestros arrays con varias
dimensiones
Para ello definimos el tamaño de cada dimensión:
–
●
El acceso a los datos se hace indicando el índice de cada
dimensión
–
●
float tablaF[10][10];
printf(“%f\n”, tabla[1][8]);
También hay que inicializar todos los elementos de cada
dimensión:
int fila, col;
for(fila=0;fila<10;fila++)
for(col=0;col<10;col++)
tablaF[fila][col] = 0;
6
●
Arrays: paso de parámetros
7
Cadenas de caracteres
●
●
En C no existe un tipo específico para trabajar con
cadenas de caracteres
Se consideran como arrays de caracteres:
–
●
char cadena[256]; cadena = “Hola mundo”;
Internamente, C utiliza el carácter '\0' para marcar el final
de una cadena
–
Tendremos en cuenta el '\0' en el tamaño del array
–
Las funciones printf y scanf tratan el '\0'
automáticamente con %s
printf(“%s\n”,cadena);
scanf(“%s”, cadena);
scanf(%[^\n], cadena); //lee la entrada estandar hasta encontrar \n, sin detenerse en espacios
8
string.h
●
Para trabajar con cadenas de caracteres, en C tenemos la librería string.h
–
●
#include <string.h>
Algunas de las funciones que incluye son:
–
Strlen: size_t strlen(const char *s);
–
Devuelve el tamaño de la cadena antes de '\0'
Strcpy: char *strcpy(char *dest, const char *src);
–
Copia la cadena origen src en la cadena destino dest.
Strcat: char *strcat(char *dest, const char *src);
–
Concatena la cadena origen src al final de la cadena destino dest
Strcmp: int strcmp(const char *s1, const char *s2);
●
●
●
●
Compara dos cadenas. Devuelve 0 en caso de que sean iguales. <0
si la primera cadena es menor y >0 si la primera cadena es mayor.
Orden lexicográfico.
9
Ejercicios propuestos – Arrays
●
Ejercicio 1: Crea un programa completo que declare e
inicialice un vector de float de un tamaño determinado por
una constante y llame a una función que reciba como
parámetro un vector y devuelva el valor correspondiente a
la suma de los componentes de dicho vector. Finalmente
se mostrará este valor por la salida estándar (pantalla) en
la función principal.
10
Ejercicios propuestos - Cadenas
●
●
●
Ejercicio 2: Realiza una función que reciba una cadena de
caracteres y compruebe si se trata de un palíndromo.
Ejercicio 3: Realiza una función que reciba dos
parámetros: una cadena de caracteres y un carácter. La
función realizará la búsqueda del carácter en la cadena y
nos devolverá la posición de la primera ocurrencia del
carácter en la cadena o -1 en caso de que no lo encuentre.
Ejercicio 4: Se pide implementar una función similar a la
del ejercicio 3 pero que devuelva la posición de la última
ocurrencia del carácter.
11
Punteros
●
●
●
●
Un puntero es una variable que contiene la dirección de memoria de un dato
o de otra variable
Un puntero puede apuntar a una variable de cualquier tipo: tipos básicos, tipos
definidos por el usuario, estructuras de datos, ¡incluso a funciones!
Los punteros se pueden utilizar para referenciar y manipular estructuras de
datos, para referenciar bloques de memoria asignados dinámicamente y para
proveer el paso de parámetros por referencia en llamadas a funciones.
Declaración de punteros – Sintaxis de C:
–
●
Tipo * nombrePuntero;
Ejemplos:
–
int *valor;
–
char *cadena;
–
double *resultado;
12
Operadores de punteros
●
●
●
Existen dos operadores unarios para trabajar con
punteros: * y &
*puntero: nos devuelve el contenido de la dirección de
memoria apuntado por 'puntero'
&variable: nos devuelve la dirección de memoria que
referencia a 'variable'
13
Reserva dinámica de memoria
●
●
●
Librería stdlib.h
Podemos reservar memoria dinámicamente utilizando
punteros
Funciones:
–
malloc
–
calloc
–
realloc
–
free
14
Función malloc
●
●
●
Sintaxis: void *malloc(size_t size);
Devuelve un puntero a una zona de memoria con un
espacio reservado de size bytes
Función sizeof(tipo) nos devuelve el número de bytes que
ocupa el tipo de dato pasado como parámetro
15
Función calloc
●
●
Sintaxis: void *calloc(size_t nmemb, size_t size);
Nos devuelve un puntero a una zona de memoria en la
que se reservan nmemb elementos de size bytes. La
memoria se inicializa a 0
16
Función realloc
●
Sintaxis: void *realloc(void *ptr, size_t size);
●
Cambia el tamaño de memoria reservado para un puntero
17
Función free
●
Sintaxis void free(void *ptr);
●
Libera la memoria reservada para el puntero ptr
●
●
No se ejecuta automáticamente cuando se acaba el
ámbito en el que se definió el puntero
Las llamadas a free han de ser explícitas
18
Arrays dinámicos multidimensionales
●
●
Para definir un array multidimensional de manera
dinámica utilizaremos punteros a punteros.
Se interpreta como un puntero a un tipo que es un puntero
que a su vez es un puntero a un entero (!!!)
19
Punteros: Paso de parámetros
●
●
Paso por valor
Consecuencia: en funcion tienes una referencia a los
elementos del array pero no al array en sí, que es una copia
20
Punteros: Paso de parámetros
●
●
Paso por referencia
Ahora tenemos referencia a los datos y al propio puntero
con lo que podemos modificar la memoria que tiene
reservada
21
Programación 1
Grado de Ingeniería Robótica
Descargar