int - Cobre 2 Software

Anuncio
Fundamentos de
programación
Punteros y Arrays
Punteros
Un puntero es una variable que puede contener la
dirección de otra variable.
<tipo> * <variable> ;
int a, b, *p;
··· ··· ···
p = &a;
*p = 5;
p = &b;
*p = a + 1 ;
/* p es un puntero a un entero */
/* p contiene la dirección de a */
/* a toma el valor 5 */
/* p contiene ahora la dirección de b */
/* b toma el valor 6 */
Punteros
Errores comunes con punteros
int a, b, *p;
··· ··· ···
p = &17;
p = &(a + 1);
&b = p;
p = 4783 ;
/* p es un puntero a un entero */
/* Las constantes no tienen dirección */
/* Una expresión tampoco tiene dirección */
/* Las direcciones no se pueden cambiar */
/* Tendría que ser p = (int *) 4783 */
Además para imprimir punteros con printf() hay que
usar los formatos %u y %p.
Punteros
No se recomienda realizar asignaciones directas
(sin casting) entre punteros que apuntan a distintos
tipos de variables, excepto el tipo genérico void * .
int * a;
char * b;
void * c;
··· ··· ···
b = a; a = b; /* genera un aviso por tipos diferentes */
b = (char *) a; /* Correcto */
a = c = b;
/* Correcto, se usa c como un comodín */
Aritmética de punteros
No están permitidas las operaciones que no tienen
sentido con direcciones de variables, como multiplicar y/o
dividir, pero sí otras como sumar y restar.
int a, b, *p;
··· ··· ···
a = 10;
p = &a;
/* p toma la dirección de a, &a */
*p = *p + 5; /* a tiene el valor 15 */
*p += 1;
/* Ahora el valor de a es 16 */
(*p)++;
/* a es 17, los paréntesis son necesarios */
++*p;
/* a toma el valor 18 */
b = *p++;
/* b vale 18, pero p ya no contiene &a */
*p-- = 4;
/* p es de nuevo &a */
b = *++p; /* ¿Cuánto vale b y quién es p? */
Declaraciones complicadas con punteros
char **argv
argv: array de punteros a char. Lo mismo que char *argv[ ].
int (*tabladias) [13]
tabladias: puntero a un array de 13 enteros.
int *tabladias [13]
tabladias: array de 13 punteros a entero.
int *fun ( )
fun: función sin parámetros que retorna un puntero a entero.
int (*fun) ( )
fun: puntero a una función que retorna un entero.
char (* (*A( ) ) [ ] ) ( )
A: función que retorna un puntero a un array de punteros a
función, que retornan cada una de ellas un char.
char (* (*A[3] ) ( ) ) [5]
A: array de 3 punteros a funciones que retornan un puntero a
un array de caracteres con 5 componentes.
Declaraciones complicadas con punteros
typedef char (*Pfc) (int);
Pfc p; /* es equivalente a char (*p) (int) */
Pfc denota un puntero a una función que admite un
parámetro entero y retorna un char.
typedef long (*(*(*FPUNT) ( ) ) [3] ) ( );
FPUNT fun;
Se define el identificador FPUNT como un puntero
a función que no recibe argumentos y devuelve un
puntero a un array de 3 punteros a función, que no
reciben ningún parámetro y devuelven long.
Un ejemplo de puntero a función
Modo alternativo de usar sin(x) y cos(x)
#include <stdio.h>
#include <math.h>
const double PI = 3.141592654;
void main(void)
{
double (*pfun) (double);
pfun = sin;
printf(“%lf\n”, (*pfun)(PI/2));
pfun = cos;
printf(“%lf\n”, (*pfun)(PI/2));
}
Arrays - vectores
Un vector o array unidimensional es una colección
finita de elementos, todos del mismo tipo, con las
siguientes características:
¾ El número de elementos del vector es finito y prefijado
de antemano.
¾ El acceso a cada elemento del vector se realiza
mediante un nombre y un índice. El nombre es común a
todos los elementos y el índice indica la posición del un
elemento (componente) dentro de la colección.
¾ Los elementos del vector se almacenan en posiciones
consecutivas de memoria.
Arrays - vectores
<tipo> <nombre> [ <tamaño> ] ;
<tipo>
: Tipo de los elementos del vector.
<nombre> : Identificador para el vector y sus elementos.
<tamaño> : Expresión constante que indica el número de
elementos del vector.
int meses [12];
char letras [26], notas [40];
unsigned long elementos [45];
double medias [NMAX + 1];
Arrays - vectores
Acceso a un vector de 20 componentes
int A [20]; componentes indizadas entre 0 y 19.
A[0]
A[1]
A[2]
··· ··· ··· A[18]
A[19]
A[0] = A[6] = A[18] = 3;
A[1] = 54; A[2] = 4 * A[1];
for(i = 0; i < 20; A[i++] = 5);
for(i = 0; i < 9; A[2 * i] = i++);
for(i = 0; i < 20; i++)
printf(“A[%d] = %d ;”,i,A[i]);
Arrays - vectores
Recordar que:
¾ No se puede comparar un vector con otro, incluso
siendo del mismo tipo, ni tampoco copiar o asignar
un vector a otro directamente. Las operaciones
siempre se efectúan elemento a elemento.
¾ C permite asignar valores fuera de rango a los
subíndices de un array. Debe controlarse esta
circunstancia, debido a que podría producirse una
sobreescritura de datos o código.
Arrays - vectores
Lectura de un vector
#include <stdio.h>
#define MAX 5
void main ()
{
int i, A[MAX];
/* inicializar A */
for (i = 0; i < MAX; i++)
scanf(“%d”, &A[i]);
··· ··· ···
}
Arrays - vectores
Comparar dos vectores
#define LONG_MAX 10
int A[LONG_MAX], B[LONG_MAX];
··· ··· ···
for(i = 0; i < LONG_MAX; i++)
if (A[i] != B[i])
break;
/* A == B si i == LONG_MAX */
Reescribir el código anterior con bucle while sin usar
la sentencia break.
Arrays - vectores
Multiplicar dos polinomios
#include <stdio.h>
#define N 20
typedef int POL[N + 1];
void leerpol(POL p)
{
int ex;
for(ex = 0; ex <= N; p[ex++] = 0);
for(;;)
{
scanf(“%d”, &ex);
if(ex >= 0) scanf(“%d”,&p[ex]);
else return;
}
}
Arrays - vectores
Multiplicar dos polinomios
void escpol(POL p)
{
int i;
if(p[0]) printf(“%d”,p[0]);
for(i = 1; i <= N; i++)
if(p[i])
{
printf(“%c”,p[i] > 0 ? ‘+’ : ‘-’);
if(abs(p[i]) != 1) printf(“%d”,abs(p[i]));
if(i == 1)
printf(“x”);
else printf(“x^%d”,i);
}
printf(“\n”);
}
Arrays - vectores
Multiplicar dos polinomios
void sumapol(POL p, POL q, POL r)
{
int ex;
for(ex = 0; ex <= N; ex++) r[ex] = p[ex] + q[ex];
}
void multmon(int co, int ex, POL p)
{
int i, j;
for(i = 0; i <= N && p[i] == 0; i++);
for(j = N; j >= 0 && p[j] == 0; j--);
while(j >= i)
{
p[j + ex] = co * p[j];
j--;
}
for(j = i; j <= i + ex - 1; p[j++] = 0);
}
Arrays - vectores
Multiplicar dos polinomios
void multpol(POL p, POL q, POL r)
{
POL s;
int i, j;
for(i = 0; i <= N; r[i++] = 0);
for(i = 0; i <= N; i++)
if(p[i])
{
for(j = 0; j <= N; j++)
s[j] = q[j];
multmon(p[i],i,s);
sumapol(r,s,r)
}
}
Arrays - vectores
Multiplicar dos polinomios
void main(void)
{
POL p, q, r; /* grado(p) + grado(q) <= N */
leerpol(p);
printf(“p(x) = ”);
escpol(p);
leerpol(q);
printf(“q(x) = ”);
escpol(q);
multpol(p,q,r);
printf(“p(x) * q(x) = ”);
escpol(r);
}
Arrays - vectores
Un vector es en realidad una dirección
(... y en consecuencia el nombre de un array NO es una variable)
int A[10];
int i, *p;
p = A; p = &A[0]; /* Asignaciones equivalentes */
*p = 2;
/* A[0] = 2 */
A[6] = 72;
*(p + 6) == 72
/* Cierto, *(p + i) == A[i] */
for(i = 0; i < 10; A[i++] = 1);
p = &A[3]; p++;
for(i = 1; i < 5; *(p + i) = i, i += 2);
printf(“%d”, *p); /* ¿Qué imprime esta sentencia? */
printf(“%c”,(char) *++p); /* ¿Y ésta otra? */
Arrays - vectores
Lectura de un vector (versión con puntero)
#include <stdio.h>
#define MAX 5
void main ()
{
int A[MAX];
Leer(A);
··· ··· ···
}
void Leer (int *vector)
{
int i;
for (i = 0; i < MAX; i++)
scanf(“%d”, vector + i);
}
Arrays - vectores
Inicialización de vectores
int contador[3] = {3,4,5};
char vocales[5] = {‘a’,‘e’,‘i’,‘o’,‘u’};
int vect[4] = {0,1,2,3,4}; /* Incorrecto, ¿por qué? */
/* El tamaño se asigna con la inicialización */
char nombre[ ] = {‘J’,‘a’,‘i’,‘m’,‘e’};
unsigned short int marcas[] = {3,5,6,1};
int A[ ];
/* Incorrecto, falta inicializar array */
int lista[100] = {0}; /* Todas las componentes cero */
char *tiempo[3] = {“hora”,“minuto”,“segundo”};
unsigned char R[] = {1,‘\\’,‘\x56’,‘y’};
Arrays - vectores
Búsqueda secuencial en vectores
/*
Devuelve la posición de x dentro del array
en su caso, N si x no ha sido encontrado
*/
int busca (int A[ ], int x) /* N elementos */
{
int i;
for(i = 0; i < N; i++)
if(A[i] == x)
break;
return i; /* return (i < N) ? i : -1; */
}
Arrays - vectores
Búsqueda secuencial: versión con indicador
int busca (int A[ ], int x) /* N elementos */
{
int
i = 0;
char enc = 0; /* enc es el indicador */
while(i < N && !enc)
if(A[i] == x)
enc = 1;
else i++;
return enc ? i : N; /* return i; */
}
Arrays - vectores
Ordenar un vector: método de la burbuja
void burbuja (int A[ ]) /* N elementos */
{
int i, j;
for(i = 0; i < N - 1; i++)
for(j = i + 1; j < N; j++)
if(A[i] > A[j])
intercambia(A,i,j);
}
void intercambia (int A[], int i, int j)
{
int z;
z = A[i]; A[i] = A[j]; A[j] = z;
}
Arrays - vectores
Ordenar un vector: método quicksort
void quicksort(int A[], int inf, int sup)
{
int p;
if(inf < sup) {
p = particion(A,inf,sup);
quicksort(A,inf,p - 1);
quicksort(A,p + 1,sup);
}
}
Arrays - vectores
Ordenar un vector: método quicksort
int particion(int A[], int inf, int sup)
{
int pivot, i, j, temp;
pivot = A[inf]; i = inf; j = sup + 1;
for(;;) {
do ++i; while (A[i] <= pivot && i <= sup);
do --j; while (A[j] > pivot);
if(i >= j) break;
temp = A[i]; A[i] = A[j]; A[j] = temp;
}
temp = A[inf]; A[inf] = A[j]; A[j] = temp;
return j;
}
Arrays - vectores
Búsqueda secuencial en vectores ordenados
A[0] < A[1] < A[2] < ··· < A[N-1]
int busca (int A[ ], int x) /* N elementos */
{
int i;
for(i = 0; i < N; i++)
if(A[i] == x)
break;
else if(A[i] > x)
return N;
return i;
}
Arrays - vectores
Búsqueda secuencial en vectores ordenados (ver. 2)
int busca (int A[ ], int x) /* N elementos */
{
int i = 0, fin = 0;
while(i < N && ! fin)
if(A[i] == x)
fin = 1;
else if(A[i] > x)
{
fin = 1;
i = N;
}
else ++i;
return i; /* return fin ? -1 : i; */
}
Arrays - vectores
Búsqueda binaria (dicotómica, bipartición)
A[0] < A[1] < A[2] < ··· < A[N - 1]
int busca (int A[ ], int x) /* N elementos */
{
int inf = 0, sup = N - 1, med;
while(inf <= sup) {
med = (inf + sup) / 2;
if(x < A[med])
sup = med - 1
else if(x > A[med])
inf = med + 1
else return med;
}
return -1;
}
Arrays - vectores
Búsqueda binaria: versión recursiva
int busca (int A[], int x)
{
return buscabin(A,x,0,N - 1);
}
int buscabin (int A[ ], int x, int inf, int sup)
{
int med;
if(inf <= sup) {
med = (inf + sup) / 2;
if(x == A[med]) return med;
else if(x < A[med])
return buscabin(A,x,inf,med - 1);
else
return buscabin(A,x,med + 1,sup);
}
return -1;
}
Arrays - listas
Listas de elementos
Una lista de elementos es una estructura de datos que está
formada conjuntamente por un vector y un índice. El índice
representa el número de elementos válidos en el vector.
#define MaxElem 40
typedef int TLista [MaxElem];
TLista Mi_lista; /* Mi_lista es un array de 40 enteros */
int NElem;
/* NElem es el número de elementos válidos */
··· ··· ···
#define MaxElem 100
typedef char * TLista [MaxElem];
/* TLista es ahora un array de 100 punteros a char */
Arrays - listas
Operaciones con listas
#define MaxElem 100
/* Por ejemplo */
typedef <Tipo_base> TElem; /* A definir
*/
typedef TElem TLista [MaxElem];
TLista Lista; /* Variable de lista con índice */
··· ··· ···
void inicializar_lista (TLista L, int * NElem)
{
*NElem = 0;
}
int lista_vacia (TLista L, int NElem)
{
return ! NElem; /* Número de elementos nulo */
}
Arrays - listas
Operaciones con listas
int lista_llena (TLista L, int NElem)
{
return NElem == MaxElem;
}
TElem pos_lista (int pos, TLista L, int NElem)
{
/*
posición = 1 , 2 ,...,
NElem
*/
/* Elementos válidos L[0],L[1],...,L[NElem - 1] */
if(pos < 1 || pos > NElem)
return (TElem) -1;
else return L[pos - 1];
}
/* error */
Arrays - listas
Operaciones con listas
void eliminar_lista (TElem x, TLista L, int *NElem)
{
int i;
/* Elementos válidos L[0],L[1],...,L[NElem - 1] */
for(i = 0; i < *NElem; i++)
if(L[i] == x) {
for(i++; i < *NElem; i++)
L[i - 1] = L[i];
--*NElem; /* (*NElem)--, *NElem -= 1 */
break; /* en realidad es innecesario,
al final siempre i >= *NElem */
}
}
Arrays - listas
Operaciones con listas
int insertar_lista (int pos, TElem x,
TLista L, int *NElem)
{
int i;
if(*NElem == MaxElem ||
/* lista llena */
pos < 1 || pos > *NElem + 1) return -1; /* error */
/*
/*
posición = 1 , 2 ,...,
NElem
Elementos válidos L[0],L[1],...,L[NElem - 1]
*/
*/
for(i = *NElem; i >= pos; i--)
L[i] = L[i - 1];
L[pos - 1] = x;
++*NElem;
return 0;
}
/* igual (*NElem)++ , *NElem += 1 */
/* retorno 0, inserción correcta */
Arrays - strings
¾ Un string o cadena de caracteres es una secuencia
de cero o más caracteres que finaliza con ‘\0’.
¾ Un string se considera un string constante o literal si
los caracteres aparecen tal cual entre comillas dobles.
“Hola mundo”
“Esto es un string literal o constante”
“El resultado es %d \n”
“\x31\x32\x33\x34\x35”
“ \“Esto tambien en un literal\” ”
Arrays - strings
Asignación de un string literal
char * saludo = “Hola mundo”;
char * p = “Esto es un string literal”;
char * formato = “El valor buscado es %d\n”;
char numeros[] = “\x31\x32\x33\x34\x35”;
char vacia[] = “”;
/* sólo está ‘\0’ */
char str[6] = {‘e’,‘r’,‘r’,‘o’,‘r’,‘\0’};
char * saltos7 = “\n\n\n\n\n\n\n”;
char * Innecesario = {“string entre llaves”};
char MuyLarga[] = “Esta cadena es larga\
bastante larga, pero que muy larga”;
Arrays - strings
En C no se permite
¾ Comparar strings con ningún tipo de operador.
¾ Copiar directamente un string en otro usando
la sentencia de asignación.
... entonces, ¿cómo lo hago?
Arrays - string.h
C proporciona el header estándar <string.h> que
contiene una colección de funciones básicas para el
manejo de strings y, en general, de cadenas de
caracteres.
Dentro de <string.h> hay dos grupos de funciones, que
se distinguen por el comienzo de sus nombres:
¾ Funciones que comienzan por str : manejan
datos de tipo string, es decir, cadenas de
caracteres que terminan con un nulo ‘\0’.
¾ Funciones que comienzan por mem : manejan
cadenas de caracteres en general, por tanto, no
es necesario que terminen con ‘\0’.
Arrays - string.h
Algunas funciones de uso habitual
char * strcpy (char * s, const char * t)
Copia el string t en el string s, incluyendo el terminador ‘\0’, retorna s.
char * strncpy (char * s, const char * t, size_t n)
Copia como máximo n caracteres del string t en s, retorna s. Si t tiene
menos de n caracteres, se rellena el exceso con ‘\0’.
char * strcat (char * s, const char * t)
Concatena el string t al final del string s, retorna s.
int strcmp (const char * s, const char * t)
Compara el string s con t usando el orden lexicográfico, retorna < 0 si
s < t, 0 si s == t ó > 0 si s > t.
int strncmp (const char * s, const char *t, size_t n)
Compara como máximo n caracteres del string s con t, retorna < 0 si
s < t, 0 si s == t ó > 0 si s > t.
Arrays - string.h
Algunas funciones de uso habitual
size_t strlen (const char * s)
Retorna la longitud del string s.
void * memcpy (void * s, const void * t, size_t n)
Copia n caracteres de la cadena t en la cadena s, retorna s.
void * memset (void * s, int c, size_t n)
Coloca el carácter c en la n primeras posiciones de la cadena s,
retorna s. El entero c se convierte a unsigned char.
int memcmp (const void * s, const void * t, size_t n)
Compara los primeros n caracteres de la cadena s con la cadena t,
retorna < 0 si s < t, 0 si s == t ó > 0 si s > t.
Arrays - string.h
Ejemplos de implementación
char * strcpy (char * s, const char * t)
{
int i;
for(i = 0; s[i] = t[i]; i++);
return s;
}
char * strcpy (char * s, const char * t)
{
char * p = s;
while (*p++ = *t++);
return s;
}
Arrays - string.h
Ejemplos de implementación
size_t strlen (const char * s)
{
int i;
for(i = 0; s[i]; i++);
return (size_t) i;
}
int memcmp (const void * s, const void * t, size_t n)
{
int i;
const char * p = s, * q = t;
for(i = 0; i < n && p[i] == q[i]; i++);
if(i == n) return 0;
return p[i] - q[i];
}
Arrays - string.h
Ejemplos de implementación
void * memcpy (void * s, const void * t, size_t n)
{
int i;
char * p = s;
const char * q = t;
for(i = 0; i < n; i++) p[i] = q[i];
return (void *) p;
}
void * memset (void * s, int c, size_t n)
{
int i;
char * p = s;
for(i = 0; i < n; p[i++] = (unsigned char) c);
return (void *) p;
}
Arrays - matrices
Una matriz o array bidimensional es una colección
finita de elementos, todos del mismo tipo, con las
siguientes características:
¾ El número de elementos de la matriz es finito y prefijado
de antemano. La disposición de los elementos se asemeja a
una tabla organizada por filas y columnas.
¾ El acceso a cada elemento de la matriz se realiza
mediante un nombre y dos índices. El nombre es común a
todos los elementos; el primer y el segundo índice indican
respectivamente la fila y la columna donde se encuentra un
cierto elemento dentro de la colección (es decir su posición
en la matriz).
¾ Los elementos de la matriz se almacenan por filas en
posiciones consecutivas de memoria.
Arrays - matrices
<tipo> <nombre> [ <nº filas> ] [ <nº columnas> ];
<tipo>
: Tipo de los elementos de la matriz.
<nombre> : Identificador para la matriz y sus elementos.
<nº filas> : Expresión constante que indica el número de
filas que tiene la matriz.
<nº columnas> : Expresión constante que indica el número
de columnas que tiene la matriz.
Tamaño de una matriz (memoria ocupada)
nº filas x nº columnas x sizeof(tipo)
Arrays - matrices
Acceso a una matriz de N filas y M columnas
int
A [N][M];
/*
N
x
M
enteros */
A[i][j] denota el elemento en la posición (i,j)
0,0
0,1
0,2
0,3
··· ··· ···
0,M-2
0,M-1
1,0
1,1
1,2
1,3
··· ··· ···
1,M-2
1,M-1
··· ··· ···
··· ··· ···
··· ··· ···
··· ··· ···
··· ··· ···
··· ··· ···
··· ··· ···
N-2,0
N-2,1
N-2,2
N-2,3
··· ··· ···
N-2,M-2 N-2,M-1
N-1,0
N-1,1
N-1,2
N-1,3
··· ··· ···
N-1,M-2 N-1,M-1
Arrays - matrices
Acceso a los elementos de una matriz
Se puede acceder a los elementos de una matriz usando
bucles anidados; el bucle externo se utiliza para el
acceso a las filas y el bucle interno para el acceso a las
columnas.
for(i = 0; i < NFilas; i++)
for(j = 0; j < NColumnas; j++)
{
/* Tratamiento de cada elemento */
procesar(matriz[i][j]);
}
Arrays - matrices
Lectura de una matriz
#include <stdio.h>
#define MAX 20
void main (void)
{
int Mat[MAX][MAX], fil, col, i, j;
printf(“\n Número de filas : ”);
scanf(“%d”, &fil);
/* 0 < fil <= MAX */
printf(“\n Número de columnas : ”);
scanf(“%d”, &col);
/* 0 < col <= MAX */
printf(“Introducir elementos matriz por filas :”);
for(i = 0; i < fil; i++)
for(j = 0; j < col; j++) {
printf(“\n Mat[%d][%d] = ”, i, j);
scanf(“%d”, &Mat[i][j]);
}
··· ··· ···
}
Arrays - matrices
Escritura de una matriz
#include <stdio.h>
#define MAX 20
void main (void)
{
int Mat[MAX][MAX], fil, col, i, j;
/* Lectura de la matriz */
··· ··· ···
/* Escritura de la matriz por filas */
for(i = 0; i < fil; i++) {
for(j = 0; j < col; j++)
printf(“ %5d”, Mat[i][j]);
printf(“\n”); /* salto para siguiente fila */
}
··· ··· ···
}
Arrays - matrices
Producto algebraico de dos matrices
#define N 3
#define M 4
#define P 5
··· ··· ···
int A[N][P], B[P][M], C[N][M];
··· ··· ···
for(i = 0; i < N; i++)
for(j = 0; j < M; j++)
{
C[i][j] = 0;
for(k = 0; k < P; k++)
C[i][j] += A[i][k] * B[k][j];
}
Arrays - matrices
Inicialización de matrices
int tabla[2][4] = {0};
int tabla[2][4] = {1,2,3,4,5,6,7,8}
int tabla[2][4} = {1,2,3,4},
{5,6,7,8}};
int tabla[ ][4] = {{1,2,3,4},
{5,6,7,8}};
/* Incorrecto */
int tabla[2][ ] = {{1,2,3,4},
{5,6,7,8}};
Arrays - matrices
Paso de una matriz como parámetro de una función
Supongamos declarada la matriz
int tabla [2][4];
que deseamos pasar como parámetro de un función fun. Existen varias
posibilidades equivalentes:
/* Usar el array tal y como está declarado */
void fun ( int tabla[2][4] );
/* Ignorar el número de filas */
void fun ( int tabla[ ][4] );
/* Usar un puntero */
void fun ( int (*tabla)[4] );
Los paréntesis en (*tabla) son necesarios para que sea “puntero a
vector de tamaño 4”, es decir, puntero a puntero. Sin los paréntesis sería
“vector de tamaño 4 cuyos elementos son punteros”, por la mayor
prioridad del operador [ ] sobre el operador *.
Arrays - matrices
Punto de silla de una matriz cuadrada
#include <stdio.h>
#include <math.h>
#define N 3
typedef int MATRIZ [N][N];
void LeerMatriz (MATRIZ);
void EscMatriz (const MATRIZ);
int Maximo (int, const MATRIZ);
int HayMin (int, int, const MATRIZ);
int Silla (const MATRIZ, int *, int *);
Arrays - matrices
Punto de silla de una matriz cuadrada
void main (void)
{
MATRIZ A;
int fil, col;
LeerMatriz(A);
EscMatriz(A);
if(Silla(A, &fil, &col))
printf(“Hay punto de silla [%d,%d] = %d\n”,
fil,col,A[fil][col]);
else
printf(“No existe punto de silla\n”);
}
Arrays - matrices
Punto de silla de una matriz cuadrada
void LeerMatriz (MATRIZ A)
{
int i,j;
for(i = 0; i < N; i++)
for(j = 0; j < N; j++) scanf(“%d”, &A[i][j]);
}
void EscMatriz (const MATRIZ B)
{
int i, j;
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
printf(“%d ”, B[i][j]);
printf(“\n”);
}
}
Arrays - matrices
Punto de silla de una matriz cuadrada
int Silla(const MATRIZ A, int *fil, int *col)
{
*fil = 0;
while(*fil < N)
{
*col = Maximo(*fil,A);
if(*col < N && HayMin(*fil,*col,A))
return 1;
*fil += 1;
}
return 0;
}
Arrays - matrices
Punto de silla de una matriz cuadrada
int Maximo (int i, const MATRIZ A)
{
int j, k;
for(j = 0, k = 1; k < N; k++)
if(A[i][j] <= A[i][k])
{
if(A[i][j] == A[i][k])
for(k++; k < N; k++)
if(A[i][k] > A[i][j])
break;
j = k;
}
return j;
}
Arrays - matrices
Punto de silla de una matriz cuadrada
int HayMin (int i, int j, const MATRIZ A)
{
int k;
for(k = 0; k < N; k++)
if(k != i && A[k][j] <= A[i][j])
return 0;
return 1;
}
Arrays - matrices
Algunos tipos de matrices cuadradas
Diagonal
Simétrica
Antisimétrica
Triangular superior
Triangular inferior
Tribanda
A(i,j)
A(i,j)
A(i,j)
A(i,j)
A(i,j)
A(i,j)
=
=
=
=
=
=
0 para i ≠ j
A(j,i)
-A(j,i)
0 para i > j
0 para i < j
0 si |i – j| <= 1
En programación, el valor 0 podría ser cualquier
otro, siempre que su significado sea “el valor que se
repite por defecto”.
Arrays - matrices
Elementos adyacentes a una componente (i,j)
i-1,j-1
i-1,j
i-1,j+1
i,j-1
i,j
i,j+1
i+1,j-1
i+1,j
i+1,j+1
Arrays - matrices
Elementos adyacentes a una componente (i,j)
Condición: componentes (r,s) que verifican
|i - r| <= 1 && |j - s| <= 1
excepto el borde o perímetro de la matriz.
Arrays - matrices
Elementos adyacentes a una componente (i,j)
Comprobar si una componente (i,j) es la suma de sus
componentes adyacentes.
int Matriz[NFil][NCol];
··· ··· ···
suma = 0;
for(r = i - 1; r <= i + 1, r++)
for(s = j - 1; s <= j + 1; s++)
if(r != i || s != j)
suma += Matriz[r][s];
if(Matriz[i][j] == suma)
··· ··· ···
Arrays - matrices
Matrices k-dimensionales
<tipo> <nombre> [ <dim 1> ] ··· [ <dim k> ] ;
char espiral [10][20][5];
short medida [LARGO][ANCHO][ALTO];
float posicion [ejeX][ejeY][ejeZ][TIEMPO];
espiral[i][4][9] = 2;
medida[0][0][1] = 25;
posicion[i][2 * j][6][seg] = 4.73;
Descargar