Sei sulla pagina 1di 30

Ing.

Informática Programación I Bloque 5-I

Bloque 5
Tipos de datos compuestos estáticos:
arrays, strings y structs

Parte I: Arrays
Ing. Informática Programación I Bloque 5-I

Hasta ahora...

ƒ Tipos de datos simples:


ƒ Caracteres: char
ƒ Números: int, float, double (y
modificadores)
ƒ Problema: calcular la temperatura
media anual a partir de los valores
mensuales
ƒ Y diarios?
Ing. Informática Programación I Bloque 5-I

Tipos de datos compuestos

ƒ Permiten agrupar en una única variable


varios elementos de tipos simples
ƒ Arrays (arreglo, tabla): todos los elementos
del mismo tipo (temperaturas)
ƒ Unidimensionales: vectores
ƒ Multidimensionales: matrices
ƒ Strings: una cadena de varios caracteres
ƒ Estructura: cada elemento puede ser de un
tipo diferente
ƒ En este tema: sólo datos estáticos
(dinámicos en tema 7)
Ing. Informática Programación I Bloque 5-I

Arrays unidimensionales

ƒ Ejemplo de las temperaturas por meses


0 1 2 3 4 5 6 7 8 9 10 11
Nº de mes

12.8 13.7 14.9 15.5 16.0 17.1 19.3 20.1 19.0 17.2 15.4 13.1 Valor

ƒ Declaración del array temperaturas


ƒ float temperaturas[12];
De 0 al 11
ƒ En general
ƒ tipo nombre[numero_de_elementos];

De 0 a numero_de_elementos-1
Ing. Informática Programación I Bloque 5-I

Arrays unidimensionales
ƒ Para acceder a una cierta posición:
ƒ temperaturas[5]
ƒ Por ejemplo:
ƒ temperaturas[5] = 18.2;
0 1 2 3 4 5 6 7 8 9 10 11

12.8 13.7 14.9 15.5 16.0 18.2 19.3 20.1 19.0 17.2 15.4 13.1

ƒ Siempre se accede por posiciones excepto en


la declaración inicial donde se puede asignar
valores a todas las posiciones a la vez:
ƒ int array[3] = {1, 2, 3};
Ing. Informática Programación I Bloque 5-I

Arrays unidimensionales.
Ejemplo 1: llenar un array
#include <stdio.h>

Declaración de la variable temperaturas


main()
{ Normalmente necesitaremos una variable
float temperaturas[12]; para recorrer el array, posición a posición
int indice; (índice)

indice=0; Normalmente necesitaremos un bucle que


while (indice<12) recorra el array posición a posición
{ (de 0 a 11)
printf(“Introduce la temperatura del mes %d\n", indice);
scanf(“%f”, &temperaturas[indice]);
indice++;
}
}
Ing. Informática Programación I Bloque 5-I

Arrays unidimensionales.
Ejemplo 1: llenar un array (2)
#include <stdio.h>

main()
El array va del 0 al 11
{
float temperaturas[12];
int indice;
Al usuario le mostramos el resultado del
indice=0; 1 al 12
while (indice<12)
{
printf(“Introduce la temperatura del mes %d\n", indice+1);
scanf(“%f”, &temperaturas[indice]);
indice++;
}
}
Ing. Informática Programación I Bloque 5-I

Arrays unidimensionales.
Ejemplo 1: llenar un array (3)
#include <stdio.h>
#define N 24
main() Así es más fácil hacer cambios (por ejemplo
{ guardar 24 meses, o una temperatura al día)
float temperaturas[N];
int indice;

indice=0;
while (indice<N)
{
printf(“Introduce la temperatura del mes %d\n", indice+1);
scanf(“%f”, &temperaturas[indice]);
indice++;
}
}
Ing. Informática Programación I Bloque 5-I

Arrays unidimensionales. Ejemplo 2:


escribir el contenido de un array
#include <stdio.h>
#define N 12
main()
{
float temperaturas[N];
int indice;

/* aquí iría la parte de llenar el array */

for (indice=0; indice < N; indice++)


printf("%f\n",temperaturas[indice]);
}
Ing. Informática Programación I Bloque 5-I

Arrays unidimensionales. Ejemplo 3:


calcular la temperatura media
#include <stdio.h>
#define N 12
main()
{
float temperaturas[N];
int indice;
float suma;

/* aquí iría la parte de llenar el array */

indice=0;
suma=0;
while (indice<N)
{
suma=suma+temperaturas[indice];
indice++;
}
suma=suma/N; //dividimos por el número de meses
printf("La temperatura media es %f",suma);
}
Ing. Informática Programación I Bloque 5-I

Arrays unidimensionales. Ejemplo 4:


calcular la temperatura máxima
#include <stdio.h>
#define N 12
main()
{
float temperaturas[N];
int indice;
float maxima;

/* aquí iría la parte de llenar el array */

indice=0;
maxima=0;
while (indice<N)
{
if (maxima<temperaturas[indice])
maxima=temperaturas[indice];
indice++;
}
printf("La maxima anual es %f",maxima);
}
Ing. Informática Programación I Bloque 5-I

Arrays unidimensionales. Ejemplo 4b:


calcular la temperatura mínima
#include <stdio.h>
#define N 12
main()
{
float temperaturas[N];
int indice;
float minima;

/* aquí iría la parte de llenar el array */

indice=0;
minima=0;
while (indice<N)
{
if (minima>temperaturas[indice])
minima=temperaturas[indice];
indice++;
}
printf("La minima anual es %f", minima);
}
Ing. Informática Programación I Bloque 5-I

Arrays unidimensionales. Ejemplo 4b:


calcular la temperatura mínima (2)
#include <stdio.h>
#define N 12
main()
{
float temperaturas[N];
int indice;
float minima;

/* aquí iría la parte de llenar el array */

indice=0; Si inicializamos minima a 0,


minima=0; si todas las temperaturas son positivas,
while (indice<N) el valor final es 0: ERROR!
{
if (minima>temperaturas[indice])
minima=temperaturas[indice];
indice++;
}
printf("La minima anual es %f", minima);
}
Ing. Informática Programación I Bloque 5-I

Arrays unidimensionales. Ejemplo 4b: calcular la


temperatura mínima (3), 2 soluciones
#include <stdio.h> #include <stdio.h>
#define N 12 #define N 12
main() main()
{ {
float temperaturas[N]; float temperaturas[N];
int indice; int indice;
float minima; float minima;

/* aquí iría la parte de llenar el /* aquí iría la parte de llenar el


array */ array */

indice=0; minima=temperaturas[0];
minima=1000; indice=1;
while (indice<N) while (indice<N)
{ {
if (minima>temperaturas[indice]) if (minima>temperaturas[indice])
minima=temperaturas[indice]; minima=temperaturas[indice];
indice++; indice++;
} }
printf("La minima anual es %f", printf("La minima anual es %f",
minima); minima);
} }
Ing. Informática Programación I Bloque 5-I

Arrays unidimensionales. Ejemplo 4c:


calcular la temperatura máxima y su mes
#include <stdio.h>
#define N 12
main() La variable mes contiene el nº del mes
{ con la temperatura máxima (del 0 al 11)
float temperaturas[N];
int indice,mes;
float maxima;

/* aquí iría la parte de llenar el array */

maxima=temperaturas[0]; Le sumamos uno para que el usuario vea


mes=0; el resultado del 1 al 12
indice=0;
while (indice<N)
{
if (maxima<temperaturas[indice])
{
maxima=temperaturas[indice];
mes=indice;
}
indice++;
}
printf("La maxima anual es %f, del mes %d",maxima,mes+1);
}
Ing. Informática Programación I Bloque 5-I

Arrays unidimensionales. Ejemplo 5:


buscar una temperatura concreta
#include <stdio.h>
#define N 12
main() La variable encontrado nos indica si ya
{ hemos encontrado el valor buscado (1) o
float temperaturas[N]; no (0)
int indice,encontrado;
float valor_buscado;
/* aquí iría la parte de llenar el array */

indice=0;
encontrado=0;
printf("Introdueix el valor que vols cercar: ");
scanf("%f",&valor_buscado);

while ( (indice<N) && (encontrado==0) )


{
if (temperaturas[indice]==valor_buscado)
encontrado=1;
indice++;
}
if (encontrado==0)
printf("El valor buscado no se ha encontrado");
else
printf("El valor buscado se ha encontrado");
}
Ing. Informática Programación I Bloque 5-I

Arrays unidimensionales. Ejemplo 5:


buscar una temperatura concreta (2)
#include <stdio.h>
#define N 12
main()
{
float temperaturas[N];
int indice,encontrado;
float valor_buscado;
/* aquí iría la parte de llenar el array */

indice=0;
encontrado=0;
printf("Introdueix el valor que vols cercar: ");
scanf("%f",&valor_buscado);

while ( (indice<N) && (encontrado==0) )


{
if (temperaturas[indice]==valor_buscado)
encontrado=1;
indice++; indice-1+1
}
if (encontrado==0)
printf("El valor buscado no se ha encontrado");
else
printf("El valor buscado está en el mes %d",indice);
}
Ing. Informática Programación I Bloque 5-I

Arrays unidimensionales. Ejemplo 6:


contar cuántas veces aparece un valor
#include <stdio.h>
#define N 12
main()
{
float temperaturas[N];
int indice,veces;
float valor_buscado;
/* aquí iría la parte de llenar el array */

indice=0;
veces=0;
printf("Introdueix el valor que vols cercar: ");
scanf("%f",&valor_buscado);

while (indice<N)
{
if (temperaturas[indice]==valor_buscado)
veces++;
indice++;
}
printf("El valor %f se a encontrado %d veces\n", valor_buscado,veces);
}
Ing. Informática Programación I Bloque 5-I

Arrays multidimensionales
(matrices)
ƒ Permiten más de una dimensión
ƒ Ejemplo: matriz 2x3 de enteros:
ƒ int matriz[2][3];

ƒ matriz[0][1] = 2; 2
ƒ matriz[1][2] = 3;
3
Ing. Informática Programación I Bloque 5-I

Matrices. Ejemplo 1: imprimir


#include <stdio.h>
matriz
main()
{ Normalmente necesitaremos dos variables
int m[3][4]; índice, una para las filas (i), otra para las
int i,j; columnas (j)

/* aquí iría la parte de llenar la matriz */


Normalmente necesitaremos un doble bucle
for (i=0;i<3;i++) para recorrer la matriz posición a posición
for (j=0;j<4;j++)
printf(" - %d - ",m[i][j]);
}

ƒ Resultado: por filas


- M[0][0] - M[0][1] - M[0][2] - M[0][3]
- M[1][0] - M[1][1] - M[1][2] - M[1][3]
- M[2][0] - M[2][1] - M[2][2] - M[2][3]
Ing. Informática Programación I Bloque 5-I

Matrices. Ejemplo 1: imprimir


#include <stdio.h>
matriz (2)
main()
{
int m[3][4];
int i,j;

/* aquí iría la parte de llenar la matriz */

for (j=0;j<4;j++)
for (i=0;i<3;i++)
printf(" - %d - ",m[i][j]);
}

ƒ Resultado: por columnas


- M[0][0] - M[1][0] - M[2][0]
- M[0][1] - M[1][1] - M[2][1]
- M[0][2] - M[1][2] - M[2][2]
- M[0][3] - M[1][3] - M[2][3]
Ing. Informática Programación I Bloque 5-I

Matrices. Ejemplo 2: sumar dos


matrices
#include <stdio.h>

main()
{
int a[3][4],b[3][4],c[3][4];
int i,j;

/* aquí iría la parte de llenar las matrices a y b */

for (i=0;i<3;i++)
for (j=0;j<4;j++)
c[i][j]=a[i][j]+b[i][j];
}
Ing. Informática Programación I Bloque 5-I

Matrices. Ejemplo 3: multiplicar


#include <stdio.h>
dos matrices
#define M 2
#define N 3
#define P 4
main()
{
int a[M][P],b[P][N],c[M][N];
int i,j,k;

/* aquí iría la parte de llenar las matrices a y b */

for (i=0;i<M;i++)
for (j=0;j<N;j++)
c[i][j]=0; //llenamos C con ceros

for (i=0;i<M;i++)
for (j=0;j<N;j++)
for (k=0;k<P;k++)
c[i][j]=c[i][j]+a[i][k]*b[k][j];
}
Ing. Informática Programación I Bloque 5-I

Matrices. Ejemplo 3: multiplicar


dos
#include <stdio.h>
matrices (2)
#define M 2
#define N 3
#define P 4
main()
{
int a[M][P],b[P][N],c[M][N];
int i,j,k;

/* aquí iría la parte de llenar las matrices a y b */

for (i=0;i<M;i++)
for (j=0;j<N;j++)
{
c[i][j]=0; //llenamos C con ceros
for (k=0;k<P;k++)
c[i][j]=c[i][j]+a[i][k]*b[k][j];
}
}
Ing. Informática Programación I Bloque 5-I

Matrices. Ejemplo: calcular la


traspuesta de una matriz v1
#include <stdio.h>
#define N 3
main()
{
int a[N][N],b[N][N];
int i,j;
/* aquí iría la parte de llenar la matriz a */

for (i=0;i<N;i++)
for (j=0;j<N;j++)
b[i][j]=a[j][i];
}
Ing. Informática Programación I Bloque 5-I

Matrices. Ejemplo: calcular la


traspuesta de una matriz v2
#include <stdio.h>
#define N 3
main()
{
int a[N][N];
int i,j;
/* aquí iría la parte de llenar la matriz a */

for (i=0;i<N;i++)
for (j=0;j<N;j++)
a[i][j]=a[j][i];
}
Ing. Informática Programación I Bloque 5-I

Matrices. Ejemplo: calcular la


traspuesta de una matriz v2
#include <stdio.h>
#define N 3
main()
{
int a[N][N];
int i,j;
/* aquí iría la parte de llenar la matriz a */

for (i=0;i<N;i++)
for (j=0;j<N;j++)
a[i][j]=a[j][i];
}
ERROR!!
Ing. Informática Programación I Bloque 5-I

Matrices. Ejemplo: calcular la


traspuesta de una matriz v3
#include <stdio.h>
#define N 3
main()
{
int a[N][N];
int i,j,aux;
/* aquí iría la parte de llenar la matriz a */

for (i=0;i<N;i++)
for (j=0;j<N;j++)
{
aux=a[i][j];
a[i][j]=a[j][i];
a[j][i]=aux;
}
}
Ing. Informática Programación I Bloque 5-I

Matrices. Ejemplo: calcular la


traspuesta de una matriz v3
#include <stdio.h>
#define N 3
main()
{
int a[N][N];
int i,j,aux;
/* aquí iría la parte de llenar la matriz a */

for (i=0;i<N;i++)
for (j=0;j<N;j++)
{ ERROR: la matriz queda igual
aux=a[i][j]; que estaba!!
a[i][j]=a[j][i];
a[j][i]=aux;
}
}
Ing. Informática Programación I Bloque 5-I

Matrices. Ejemplo: calcular la


traspuesta de una matriz v4
#include <stdio.h>
#define N 3
main()
{
int a[N][N];
int i,j,aux;
/* aquí iría la parte de llenar la matriz a */

for (i=0;i<N-1;i++)
for (j=i+1;j<N;j++)
{ CORRECTO!!
aux=a[i][j];
a[i][j]=a[j][i];
a[j][i]=aux;
}
}

Potrebbero piacerti anche