Bloque 5

Anuncio
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
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?
ƒ
Bloque 5-I
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
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
ƒ
ƒ
Nº de mes
float temperaturas[12];
En general
ƒ
De 0 al 11
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:
ƒ
ƒ
Por ejemplo:
ƒ
ƒ
temperaturas[5]
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>
main()
{
float temperaturas[12];
int indice;
Declaración de la variable temperaturas
Normalmente necesitaremos una variable
para recorrer el array, posición a posición
(í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()
{
float temperaturas[12];
int indice;
El array va del 0 al 11
Al usuario le mostramos el resultado del
1 al 12
indice=0;
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()
{
float temperaturas[N];
int indice;
Así es más fácil hacer cambios (por ejemplo
guardar 24 meses, o una temperatura al día)
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 */
Si inicializamos minima a 0,
indice=0;
si todas las temperaturas son positivas,
minima=0;
el valor final es 0: ERROR!
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 (3), 2 soluciones
#include <stdio.h>
#define N 12
main()
{
float temperaturas[N];
int indice;
float minima;
}
#include <stdio.h>
#define N 12
main()
{
float temperaturas[N];
int indice;
float minima;
/* aquí iría la parte de llenar el
array */
/* aquí iría la parte de llenar el
array */
indice=0;
minima=1000;
while (indice<N)
{
if (minima>temperaturas[indice])
minima=temperaturas[indice];
indice++;
}
printf("La
minima
anual
es
%f",
minima);
minima=temperaturas[0];
indice=1;
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 4c:
calcular la temperatura máxima y su mes
#include <stdio.h>
#define N 12
main()
{
float temperaturas[N];
int indice,mes;
float maxima;
La variable mes contiene el nº del mes
con la temperatura máxima (del 0 al 11)
/* 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
La variable encontrado nos indica si ya
main()
hemos encontrado el valor buscado (1) o
{
no (0)
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++;
}
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-1+1
indice++;
}
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;
matriz[1][2] = 3;
ƒ
2
3
Ing. Informática
Programación I
Matrices. Ejemplo 1: imprimir
matriz
#include <stdio.h>
main()
{
int m[3][4];
int i,j;
Bloque 5-I
Normalmente necesitaremos dos variables
índice, una para las filas (i), otra para las
columnas (j)
/* aquí iría la parte de llenar la matriz */
Normalmente necesitaremos un doble bucle
para recorrer la matriz posición a posición
for (i=0;i<3;i++)
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
Matrices. Ejemplo 1: imprimir
matriz (2)
#include <stdio.h>
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[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]
Bloque 5-I
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
dos
matrices
#include <stdio.h>
#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
matrices
(2)
#include <stdio.h>
#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
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];
}
Bloque 5-I
Ing. Informática
Programación 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];
}
Bloque 5-I
Ing. Informática
Programación 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!!
Bloque 5-I
Ing. Informática
Programación 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;
}
}
Bloque 5-I
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;
}
}
ERROR: la matriz queda igual
que estaba!!
Ing. Informática
Programación 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++)
{
aux=a[i][j];
a[i][j]=a[j][i];
a[j][i]=aux;
}
}
CORRECTO!!
Bloque 5-I
Descargar