Informática II Vectores y Matrices

Anuncio
Informática II -
UTN - FRT
UTN – Facultad Regional Tucumán
Informática II
Vectores y Matrices
Arreglos unidimensionales y
multidimensionales en C
Prof. Ing. Oscar Gálvez
A.T.P. Ing. César Ovejero
UTN - FRT
VECTORES Y MATRICES
Arreglos unidimensionales y multidimensionales en C
Un tipo de dato en C
Informática II -
• Tipo de dato Arreglo en C
• Uso del for con arreglos
• Arreglos de caracteres
• Uso del %s en printf y scanf
UTN - FRT
VECTORES Y MATRICES
Arreglos unidimensionales y multidimensionales en C
Un tipo de dato en C
Informática II -
• Colección de variables del mismo tipo que se referencian
utilizando un nombre común.
• Un arreglo consta de posiciones de memoria contigua.
• La dirección más baja corresponde al primer elemento y la
más alta al último.
• Un arreglo puede tener una o varias dimensiones.
• Para acceder a un elemento en particular de un arreglo se
usa un índice.
Informática II -
VECTORES
Arreglos unidimensionales en C
Ejemplo: Vector
UTN - FRT
Memoria:
índice
Vector x = (3,2,4)
x
Declarar un arreglo
unidimensional en C:
tipo
int
nombre-arreglo[dimension];
x[3];
3
x(0)
2
x(1)
4
x(2)
“En C todos los arreglos
usan cero como índice
para el primer elemento”
“el elemento i-esimo
esta en la posición i-1”
x[0] = 3;
x[1] = 2;
x[2] = 4;
printf(“El segundo elemento del vector x es %d “,x[1]);
Informática II -
VECTORES
Arreglos unidimensionales en C
UTN - FRT
Ejemplo, declarar un arreglo de enteros llamado listanum con diez
elementos
#define N 10
…
int listanum[N];
/* arreglo de enteros con diez elementos
desde listanum[0] hasta listanum[9]. */
Usamos la estructura ‘for’ para acceder los elementos del arreglo
int i, k=1;
for( i=0; i<N; i++)
{ listanum[ i ] = k; k++; }
for( i=0; i<N; i++)
printf(“ elemento %d del arreglo vale %d \n”, i+1, listanum[ i ]);
Informática II -
VECTORES
Arreglos unidimensionales en C
UTN - FRT
La inicialización de un arreglo puede realizarse a través de una lista, si la lista es
mas corta que el número de elementos en el arreglo, el resto se inicializa a cero.
float a[5] = {0.1, 1.2, 2.3, 3.4, 4.5 };
double b[100] = { 1.0 }; /* los 99 elementos restantes serán 0.0 */
int a[] = { 2, 3, -5, 7 };
/* equivale a a[4] = { 2, 3, -5, 7 } */
#include <stdio.h>
EJEMPLO
main()
{
int x;
int vec[10]={9,3,4,8,1,6,2,0,7,5};
for( x=0; x<10; x++)
{
if ( vec[x] == 5)
printf(“encontre un cinco\n”);
else printf(“ vec[ %d ] vale: %d \n”, x, vec[x] );
}
}
Informática II -
VECTORES
Arreglos unidimensionales en C
UTN - FRT
Problema: Escriba un programa que lea un vector de longitud máxima MAX, y
determine si el vector es simétrico.
Un vector de n datos es simétrico si el contenido de la posición i_ésima coincide
con el que ocupa la posición n-i_ésima, ej: v=(2,4,7,8,7,4,2) es simétrico.
#include <stdio.h>
#define MAX 7
main()
{
/* declaración de variables */
int i;
int vec[MAX];
/* lectura de elementos del vector */
for( i=0; i<MAX; i++)
{
printf(“Dame dato del vector que ocupa posicion i = %d\n”, i+1);
scanf(“ %d”, &vec[i] );
}
…
Informática II -
VECTORES
Arreglos unidimensionales en C
UTN - FRT
Problema: continuación ….
/* imprime los elementos del vector */
printf(“ Elementos del vector: \n”);
for( i=0; i<MAX; i++)
printf(“ %3d ”, vec[i] );
/* determina si el vector es simétrico */
sime =1; /* asume que es simétrico,
no lo será si encuentra al menos un caso que lo niegue */
for( i=0; i<= MAX/2; i++)
if ( ! (vec[i]==vec[MAX-1-i]) )
sime =0;
/* imprime el resultado */
if (sime) printf(“ El vector es simétrico \n”);
else printf(“ El vector no es simétrico \n”);
}
Informática II -
MATRICES
Arreglos bi-dimensionales en C
UTN - FRT
Ejemplo:
_
_
|123|
Matriz M(3,3) = | 4 5 6 |
|789|
En C:
int M[3][3];
Índice filas
M
1
M(0,0)
2
M(0,1)
3
M(0,2)
4
M[0][0] = 1;
5
M[0][1] = 2;
6
M[0][2] = 3;
7
M[1][0] = 4;
M[1][1] = 5;
8
M[1][2] = 6;
9
M[2][0] = 7;
M[2][1] = 8;
M[2][2] = 9;
printf(“El elemento 2x2 de M es %d “,M[1][1]);
M(1,1)
M(2,1)
Índice columnnas
Informática II -
MATRICES
Arreglos bi-dimensionales en C
UTN - FRT
Usamos la estructura ‘for’ para acceder los elementos de la matriz
#define DIM1 3
#define DIM2 3
…
int i, j, k;
int M[DIM1][DIM2] = { 1,2,3,4,5,6,7,8,9}; /*inicializa la matriz M */
k=1;
for( i=0; i<DIM1; i++)
for( j=0; j<DIM2; j++)
{
M[ i ][ j ] = k;
k ++;
}
/* se inicializa la matriz M con for’s anidados*/
for( i=0; i<DIM1; i++)
/* se imprime la matriz M */
for( j=0; j<DIM2; j++)
printf(“ elemento M(%2d,%2d) vale %d \n”, i+1, j+1, M[ i ][ j ]);
Informática II -
MATRICES
Arreglos bi-dimensionales en C
UTN - FRT
Problema: Escriba un programa que lea una matriz cuadrada, la
presente en pantalla, y nos escriba la suma de todos los números que
no están en la diagonal
#include <stdio.h>
#define FILAS 3
#define COLUM 3
void main()
{
/* Declaracion de variables */
int M[FILAS][COLUM] /* ENTRADA se guarda en arreglo de 2 dimensiones */
int i, j, suma;
/* lectura por filas, la matriz es cuadrada */
for( i=0; i<FILAS; i++)
for( j=0; j<COLUM; j++)
scanf(“%d”,M[ i ][ j ] );
Informática II -
MATRICES
Arreglos bi-dimensionales en C
UTN - FRT
Problema: continuación …
/* escritura por filas, la matriz es cuadrada */
for( i=0; i<FILAS; i++)
{
for( j=0; j<COLUM; j++)
printf(“%5d”,M[ i ][ j ] );
printf(“\n”);
}
/* calculo de la suma */
suma = 0;
for( i=0; i<FILAS; i++)
/* se imprime la matriz M */
for( j=0; j<COLUM; j++)
if( ! (i==j))
suma += M[i][j];
/* imprime suma */
printf(“La suma es: %5d”, suma );
}
Informática II -
UTN - FRT
MATRICES
Arreglos multi-dimensionales en C
Declarar un arreglo multidimensional en C:
tipo
nombre-arreglo[dim-1][dim-2]…[dim-n];
Uso del for para acceder a sus elementos:
int nombre-arreglo[dim-1][dim-2]…[dim-n];
for( i=0; i<dim-1; i++)
for( j=0; j<dim-2; j++)
.
.
.
for( n=0; n<dim-n; n++)
nombre-arreglo[i][j]…[n] = 0;
Informática II -
UTN - FRT
CADENAS,
como arreglos de caracteres
A diferencia de otros lenguajes de programación que emplean un tipo
denominado cadena string para manipular un conjunto de símbolos, en
C, se debe simular mediante un arreglo de caracteres, en donde la
terminación de la cadena se debe indicar con nulo.
Un nulo se especifica como '\0'. Por lo anterior, cuando se declare un
arreglo de caracteres se debe considerar un carácter adicional a la
cadena más larga que se vaya a guardar.
char cadena[5];
cadena
H
o
cadena[1] = ‘H’;
cadena[2] = ‘o’;
cadena[3] = ‘l’;
cadena[4] = ‘a’;
cadena[5] = ‘\0’;
l
a
\0
Informática II -
CADENAS,
como arreglos de caracteres
UTN - FRT
Al inicializar arreglos de caracteres al momento de declararlos
C automáticamente asigna el carácter nulo al final de la cadena
char nombre_arr[ 7 ] = "cadena"; char ejemplo[7];
Es equivalente a:
nombre_arr[ 0 ] = ‘c’;
nombre_arr[ 1 ] = ‘a’;
nombre_arr[ 2 ] = ‘d’;
nombre_arr[ 3 ] = ‘e’;
nombre_arr[ 4 ] = ‘n’;
nombre_arr[ 5 ] = ‘a’;
nombre_arr[ 6 ] = ‘\0’;
Sin embargo, NO SE PUEDE ASIGNAR una cadena a un arreglo
nombre-arr = “ABCD_E”; /* ERROR */
ejemplo = nombre-arr;
/* ERROR */
if (opcion == “si”)
/* ERROR */
Informática II -
CADENAS,
como arreglos de caracteres
UTN - FRT
El Lenguaje C no tiene operaciones con cadenas, se
usan funciones de la librería ‘string.h’ y se incluye como
archivo cabecera con:
#include <string.h>
Estas funciones son:
- strcpy(s1,s2)
s1 = s2;
- strcat(s1,s2);
s1 = s1+ s2;
- strcmp(s1,s2)
compara s1 con s2
- strlen(s)
longitud de s
Informática II -
CADENAS,
como arreglos de caracteres
UTN - FRT
strcpy(string_destino, string_original);
Se utiliza para copiar el contenido de un string original en un string de destino.
Ejemplo:
char nombre[30] = “nombre”;
char copia[30];
strcpy(copia,nombre);
strcpy(nombre,"pato");
strcat(string1, string2);
Encadena o agrega al final de la string1 la string2.
Ejemplo:
char nombre[30], copia[30];
strcpy(nombre,"pepe");
strcat(nombre,"lopez");
Informática II -
CADENAS,
como arreglos de caracteres
UTN - FRT
strcmp(string1, string2);
Se utiliza para comparar 2 strings, esta función regresa cero si ambas strings
son iguales, regresa un número mayor que cero si string 1 es mayor que string
2 y regresa un número menor que cero si string 1 es menor alfabeticamente
que string 2.
Ejemplo:
char opcion[3];
if ( strcmp(opcion,"si") == 0 ) printf(“la opcion es si”);
strlen(string);
Esta función regresa la cantidad de caracteres que tiene la string.
Ejemplo:
char nombre[30];
strcpy(nombre,"juan");
printf(“La cantidad de caracteres de nombre es %d”, strlen(nombre));
/* 4 */
Informática II -
CADENAS,
como arreglos de caracteres
UTN - FRT
Para asignar a un arreglo de caracteres una cadena de la
‘entrada estándar’ se puede usar la función scanf con la
opción %s
Nota: que no se requiere usar el operador &
De igual forma para mostrarlo en la ‘salida estándar’. ..
Ejemplo:
main()
{
char nombre[15], apellidos[30];
printf("Introduce tu nombre: ");
scanf("%s",nombre);
printf("Introduce tus apellidos: ");
scanf("%s",apellidos);
printf("Usted es %s %s\n",nombre,apellidos);
}
Informática II -
EJEMPLO
Usando la
Librería
string.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CERO 0
UTN - FRT
void main()
{
char a[6]="Hola ";
char b[6]="Mundo";
char c[20];
char d[11]="Hola ";
printf("strcmp de %s y %s devuelve %d\n",a,b,strcmp(a,b));
printf(" a es %s\n",a);
printf(" d es %s\n",d);
if ( strcmp(a,d) == CERO )
printf("a y d son iguales\n");
else printf("a y d son diferentes\n");
strcpy(c,a);
printf("c es %s\n",c);
strcat(c,b);
printf("c es %s\n",c);
printf("la longitud de a es %d\n",strlen(a));
system("PAUSE");
}
Descargar