04 TiposAvanzadosDatos
04 TiposAvanzadosDatos
04 TiposAvanzadosDatos
2 Cadenas de caracteres
3 Matrices
4 Estructuras
5 Enumeraciones
Vectores en C
Definición
Conjunto de valores numéricos del mismo tipo
Código
tipo identificador[dimensión];
tipo Tipo de los elementos del vector (int, float, etc.).
identificador Nombre del vector.
dimensión Número de elementos del vector (literal entero).
int main(){
int miVector[3];
miVector[0] = 10;
miVector[1] = 2 * miVector[0];
miVector[2] = miVector[0] + miVector[1];
return 0;
}
Oscar Perpiñán Lamigueiro Tema 4: Tipos Avanzados de Datos 5 / 65
Acceso a datos de un vector
#include <stdio.h>
int main()
{
float temp[3];
return 0;
}
#include <stdio.h>
int main()
{
float temp[5] = {2.1, 4.9, 0.51, 4.3, 9.01};
int i;
// Es común el uso de bucles for para
// recorrer un vector. Es importante
// recordar que el primer elemento
// tiene índice 0.
for (i = 0; i < 5; i++)
printf("El elemento %d es %f\n",
i + 1, temp[i]);
return 0;
}
#include <stdio.h>
int main(){
int v1[5] = {1, 2, 3, 4, 5}, v2[5];
// Error
v2 = v1;
return 0;
}
return 0;
}
printf("Vector3: ");
for(i = 0; i < 5; i++)
printf(" %f ", v3[i]);
printf("\n");
return 0;
}
Oscar Perpiñán Lamigueiro Tema 4: Tipos Avanzados de Datos 10 / 65
Operaciones con vectores
Multiplicar un vector por una constante
#include <stdio.h>
int main(){
float v1[5] = {1, 34, 32, 45, 34};
float v2[5];
float K = 3.0;
int i;
return 0;
}
Oscar Perpiñán Lamigueiro Tema 4: Tipos Avanzados de Datos 11 / 65
Vectores de dimensión variable
La dimensión de un vector es un valor constante: no puede usarse una variable para
definirla.
int main()
{
int miVector[10];
return 0;
}
# define N 10
int main()
{
// Correcto: el precompilador sustituye N
// por el valor constante 10
int miVector[N];
return 0;
}
Oscar Perpiñán Lamigueiro Tema 4: Tipos Avanzados de Datos 12 / 65
Vectores de dimensión variable
return 0;
}
int main()
{
int v1[3] = {10, 20, 30};
imprime(v1, 3);
return 0;
}
int main()
{
int x[] = {1, 2, 3};
printf("Antes: %d\n", x[0]);
toy(x); // ½Sin asignacion!
printf("Después: %d\n", x[0]);
return 0;
}
void toy(int vector[]){
//Funcion simple que modifica el valor del primer elemento
vector[0] = 100;
}
Otro ejemplo de funciones con vectores
#include <stdio.h>
int main(){
int datos[5]={-1, 3, -5, 7, -9}, i;
fAbs(datos, 5); //½Sin asignacion!
2 Cadenas de caracteres
3 Matrices
4 Estructuras
5 Enumeraciones
Cadenas de caracteres en C
Definición
Conjunto de caracteres individuales (char)
Código
char identificador[dimensión];
tipo char
identificador Nombre de la cadena.
dimensión Número de elementos de la cadena (constante entero) incluyendo el carácter
de cierre (\0).
int main()
{
char cadena[5] = "Hola";
printf(" %c \t %c \t %c \t %c \t %c\n",
cadena[0], cadena[1],
cadena[2], cadena[3],
cadena[4]);
return 0;
}
//Error de compilacion
cadena = "Hola";
Solución provisional
Mejor con strcpy de string.h
char cadena[5];
cadena[0] = 'H';
cadena[1] = 'o';
cadena[2] = 'l';
cadena[3] = 'a';
cadena[4] = '\0';
int main()
{
char texto[31];
int main()
{
char texto[31];
int main()
{
char cadena[5] = "Hola";
int i = 0;
printf("Los caracteres son:\n");
while (cadena[i] != '\0')
{
printf(" %c \t", cadena[i]);
i++;
}
return 0;
}
int main()
{
char cadena[5] = "Hola";
int i;
printf("Los caracteres son:\n");
for(i = 0; cadena[i] != '\0'; i++)
{
printf(" %c \t", cadena[i]);
}
return 0;
}
int main() {
char cadena[5] = "Hola";
// Distancia entre A y a
int inc = 'A' - 'a';
int i = 0;
// Recorremos la cadena
while(cadena[i] != '\0')
{ // Si el caracter es letra minuscula
if (cadena[i] >= 'a' && cadena[i] <= 'z')
//sumamos la distancia para pasar a mayuscula
cadena[i] += inc;
i++;
}
printf(" %s\n", cadena);
return 0;
}
Funciones y cadenas
Una función acepta una cadena como argumento: paso por referencia (igual que un
vector).
#include <stdio.h>
void imprime(char cadena[]);
int main() {
char saludo[]="Hola";
imprime(saludo);
return 0;
}
void imprime(char cadena[]) {
int i=0;
while(cadena[i]!='\0') {
printf(" %c", cadena[i]);
i++;
}
printf("\n");
}
Oscar Perpiñán Lamigueiro Tema 4: Tipos Avanzados de Datos 30 / 65
Librería string.h
int main()
{
char palabra[21];
int longitud;
printf("Introduce una palabra: ");
scanf(" %20s", palabra);
longitud = strlen(palabra);
printf("Esta palabra tiene %d caracteres\n",
longitud);
return 0;
}
La cadena receptora debe tener espacio suficiente: los caracteres sobrantes serán eliminados.
int main() {
char nombre_completo[50];
char nombre[ ] = "Juana";
char apellido[ ] = "de Arco";
// Copiamos por tramos:
// Primero el nombre
strcpy(nombre_completo, nombre);
// A continuacion un espacio
strcat(nombre_completo, " ");
// Finalmente el apellido
strcat(nombre_completo, apellido);
printf("El nombre completo es: %s.\n",
nombre_completo);
return 0;
}
Oscar Perpiñán Lamigueiro Tema 4: Tipos Avanzados de Datos 34 / 65
Comparación de cadenas :: strcmp
Si las dos cadenas son iguales entrega un 0.
#include <stdio.h>
#include <string.h>
int main()
{
char color[] = "negro";
char respuesta[11];
do // El bucle se repite mientras
{// las cadenas *no* coincidan
printf("Adivina un color: ");
scanf (" %10s", respuesta);
} while (strcmp(color, respuesta) != 0);
printf("½Correcto!\n");
return 0;
}
2 Cadenas de caracteres
3 Matrices
4 Estructuras
5 Enumeraciones
Matrices
Una matriz es un conjunto de valores del mismo tipo (int, char, float, etc.), de dos o
más dimensiones
tipo identificador[dimension_1][dimension_2] ... [dimension_n];
Ejemplo
// Crea una matriz de datos enteros, llamada
// tabla, de dos dimensiones y 9 elementos.
int tabla[3][3];
Una matriz siempre se pasa por referencia: no se pasa la matriz completa sino la
dirección del primer elemento.
void funcion (int matriz[3][3], int nFil, int nCol);
//Error de sintaxis
void funcion (int matriz[][], int nFil, int nCol);
int main()
{
int tabla[2][2] = {{1,2}, {3,4}};
imprime_matriz(tabla, 2, 2);
return 0;
}
int main() {
int tabla[2][2] = {{-1,2}, {-3,4}};
printf("Antes: %d\n", tabla[0][0]);
absMatriz(tabla, 2, 2); // ½Sin asignacion!
printf("Después: %d\n", tabla[0][0]);
return 0;
}
2 Cadenas de caracteres
3 Matrices
4 Estructuras
5 Enumeraciones
Estructuras en C
Permiten usar estructuras (u otros tipos) sin necesidad de usar la palabra clave struct.
typedef struct
{
tipo_1 comp_1;
tipo_2 comp_2;
...
tipo_n comp_n;
} identificador;
struct contacto
{
char nombre[30];
int telefono;
int edad;
};
int main()
{
struct contacto person1;
return 0;
}
typedef struct
{
char nombre[30];
int telefono;
int edad;
} contacto;
int main()
{
contacto person1;
return 0;
}
int main ()
{
ficha alumno1 = {"Yo", "Soy Aquel", 1234};
return 0;
}
int main ()
{
ficha alumno1 = {.apellidos = "Soy Aquel",
.matricula = 1234,
.nombre = "Yo"};
return 0;
}
int main () {
date d1, d2, d3;
// Asignacion por componentes
d1.day = 31;
d1.month = 12;
d1.year = 1999;
// Asignacion con el operador cast
d2 = (date) {1, 1, 2000};
// Asignacion por copia
d3 = d1;
return 0;
}
Oscar Perpiñán Lamigueiro Tema 4: Tipos Avanzados de Datos 53 / 65
Asignación de cadenas en estructuras
#include <stdio.h>
#include <string.h>
typedef struct {
char nombre[50];
char apellidos[50];
int matricula;
} ficha;
int main ()
{
ficha alumno1, alumno2, alumno3;
// Para asignar cadenas usamos strcpy
strcpy(alumno1.nombre, "Yo");
strcpy(alumno1.apellidos, "Soy Aquel");
alumno1.matricula = 1234;
return 0;
}
Oscar Perpiñán Lamigueiro Tema 4: Tipos Avanzados de Datos 54 / 65
Acceso a componentes de una estructura
#include <stdio.h>
typedef struct {
char nombre[50];
char apellidos[50];
int matricula;
} ficha;
int main () {
ficha alumno;
printf("Nombre:");
scanf(" %s", alumno.nombre);
printf("Apellidos:");
scanf(" %s", alumno.apellidos);
printf("Numero de matricula:");
scanf(" %d", &alumno.matricula);
return 0;
}
Oscar Perpiñán Lamigueiro Tema 4: Tipos Avanzados de Datos 55 / 65
Estructuras dentro de estructuras
typedef struct
{
char nombre[50];
char apellidos[50];
int matricula;
fecha fNacimiento;
} ficha;
alumno1.fNacimiento.d = 31;
alumno1.fNacimiento.m = 12;
alumno1.fNacimiento.a = 1999;
typedef struct
{
int day;
int month;
int year;
} date;
int main() {
date fechas[3] = {// Vector de 3 fechas
{1, 1, 1999},
{31, 12, 2000},
{15, 5, 1980}
};
return 0;
}
Vector de estructuras
La asignación de valores sigue las mismas reglas que para vectores de tipos simples
(mediante []).
#include <stdio.h>
typedef struct
{
int day;
int month;
int year;
} date;
int main() {
date fechas[3]; // Vector de 3 fechas
fechas[0].day = 1;
fechas[1] = (date) {31, 12, 1999};
fechas[2] = fechas[1];
return 0;
}
Funciones y estructuras
Una función acepta estructuras (paso por valor).
#include <stdio.h>
#include <math.h>
//Definicion de estructura
typedef struct {
float real, imaginaria;
} complejo;
//Funcion que acepta una estructura
float modulo(complejo c);
int main(){
complejo comp={1, 3};
printf("El modulo es: %f\n", modulo(comp));
return 0;
}
//Implementacion de la funcion
float modulo(complejo c){
return sqrt(c.real * c.real + c.imaginaria * c.imaginaria);
}
Funciones y estructuras
Una función puede devolver una estructura
#include <stdio.h>
typedef struct {
float real, imaginaria;
} complejo;
//Funcion que devuelve estructura
complejo conjugado(complejo c);
int main(){
complejo comp1 = {1, 3}, comp2;
comp2 = conjugado(comp1);
printf(" %f", comp2.imaginaria);
return 0;
}
2 Cadenas de caracteres
3 Matrices
4 Estructuras
5 Enumeraciones
Enumeraciones en C
Definición
Con enum se pueden definir tipos de datos enteros que tengan un rango limitado de
valores, y darle un nombre significativo a cada uno de los posibles valores.
Código
enum nombre_enum {lista_de_valores};
Ejemplo
enum dia{ //valores enteros: 0 al 6
lunes, martes, miercoles, jueves, viernes, sabado, domingo
};
#include <stdio.h>
enum dia{ //valores enteros: 0 al 6
lunes, martes, miercoles, jueves, viernes, sabado, domingo
};
int main()
{
enum dia hoy, manana;
hoy = lunes;
manana = hoy + 1;
printf(" %d\n", hoy);
printf(" %d\n", manana);
return 0;
}
#include <stdio.h>
enum dia{ //valores enteros: 1 en adelante
lunes = 1, martes, miercoles, jueves, viernes, sabado, domingo
};
int main()
{
enum dia hoy, manana;
hoy = lunes;
manana = hoy + 1;
printf(" %d\n", hoy);
printf(" %d\n", manana);
return 0;
}