420 likes | 688 Views
Capitulo 4. Arreglos o Arrays Unidimensionales Bidimensionales Strings Ordenamiento Bubble Sort. Arreglos - Arrays. Supongan que tenemos 10 variables: a; b; c; d; e; f; g; h; i; j Si se desea manipular las variables debemos poner sus nombres cada vez que se requiera.
E N D
Capitulo 4 Arreglos o Arrays Unidimensionales Bidimensionales Strings Ordenamiento Bubble Sort
Arreglos - Arrays • Supongan que tenemos 10 variables: a; b; c; d; e; f; g; h; i; j • Si se desea manipular las variables debemos poner sus nombres cada vez que se requiera. • Un enfoque más general es utilizar las variables con el mismo nombre, pero diferenciándolas con un numero. • Semejante a como los libros de matemáticas utilizan los vectores y las tuplas. a1; a2; a3; a4; a5; a6; a7; a8; a9; a10
Arreglos - Arrays • Ahora sumar las variables, es mucho más fácil:
Arreglos - Arrays • Suponer que se quieren leer 5000 enteros y hacer algún tipo de operación con ellos • Con los contenidos que conocemos(¿?) hasta ahora necesitamos utilizar 5000 variables. • Problemas: • De comprensión en la codificación. • De utilización de memoria. • La solución es utilizar ARREGLOS o ARRAYS.
Arreglos - Arrays • Los arreglos son conjuntos de variables que comparten un mismo nombre, permiten almacenar una colección de datos del mismo tipo. • Pueden ser referenciadas de manera individual con ayuda de uno o más índices. • Los arreglos en C, se almacenan en posiciones contiguas de memoria y tienen un tamaño definido en tiempo de compilación. • Tenemos según su dimensionalidad: • Unidimensionales (Ej. Vector Matemático). • Bidimensionales (Ej. Matriz). • Tridimensional (Ej. Cubo). • Multidimensionales.
Ejemplos UNIDIMENSIONAL BIDIMENSIONAL TRIDIMENSIONAL
Ejemplos // Enteros tamaño 4 int numeros [ ] = { 2, 0, 0, 7 }; //arreglo de caracteres de tamaño 5 char alfabeto [ 5 ] = { 'A', 'B', 'C', 'D', 'E' }; //5 filas y columnas a lo mas de 40 caracteres. char nombres [ ][ 40 ] = { “francisco”, “sebastian", “daniela”,“liliana”, “alfonso” }; //arreglo bidimensional de enteros int coordenadas [ 2 ][ 2 ] = { { 0, 0 }, { 1, 1 } };
Observación • En C los índices de los arreglos comienzan en cero. El primer elemento, es el elemento cero. • Todos los elementos son del mismo tipo. • Se debe conocer el largo del arreglo en tiempo de compilación.
Arreglos Unidimensionales • Es una lista o vector. • Declaración • Tipo_dato nom_arreglo [ tamaño ]; • Tipo_dato: de que tipo serán los elementos. • Recordar que todos los elementos son del mismo tipo • nom_arreglo: nombre para la variable tipo arreglos . • [ ]: nos indica que su dimensionalidad es uno • tamaño: la cantidad de elementos que a los más podrá contener el arreglo.
Accediendo los elementos • Un elemento individual dentro de un arreglo es accedido por el uso de un índice. Un índice describe la posición de un elemento dentro de un arreglo. Recordar en C el primer elemento tiene el índice cero!
Ejemplo #include <stdio.h> int main ( ) { int muestra [ 10 ], t; for ( t = 0; t < 10; t ++ ) muestra [ t ] = t * t; for ( t = 0; t < 10; t ++ ) printf ( "muestra [ %d ] = %d", t, muestra [ t ] ); return ( 0 ); }
Trabajando con Arreglos No se puede asignar un arreglo a otro Lo siguiente es ilegal: int a [ 10 ], b [ 10 ]; a = b; //error ilegal En vez, se debe hacer asignaciones por cada elemento : int i; for ( i = 0; i < 10; i ++ ) a [ i ] = b [ i ]; //mas adelante strcpy
Ejemplos 1.- Realizar un programa en el que se ingresen 10 enteros, y luego muestre la suma de ellos y su promedio. 2.- Encontrar el máximo de una lista de 10 elementos. 3.- Desarrolle un programa que calcule el promedio de las notas de un curso.
Solución 1 #include<stdio.h> int main() { int i, max = 0; int list [ 100 ]; for ( i = 0; i < 100 ; i ++ ) list [ i ] = rand ( ); for ( i = 0 ; i < 100; i ++ ) if ( max < list [ i ] ) max = list [ i ]; printf ( "max = %d", max ); return ( 0 ); }
Solución 2 #include <stdio.h> int main() { int x [ 10 ]; int i, suma; printf ( "\n Ingrese 10 números:\n“ ); for ( i = 0; i < 10; i ++ ) scanf ("%d",&x[ i ] ); //lleva & pq es componente a componente suma = 0; for ( i = 0; i < 10; i ++ ) suma += x [ i ]; printf ("\n El resultado de la suma es = %d ", suma ); printf ("\n El resultado del promedio es = %d ", suma / 10 ); return ( 0 ); }
Arreglos Bidimensionales • Un arreglo bidimensional es una lista de arreglos unidimensional • Para declarar un arreglo bidimensional de enteros int matriz[3][4];
Ejemplo #include<stdio.h> int main ( ) { int fila = 3,col = 4,matriz [ fila ][ col ]; for ( fila = 0; fila < 3; fila ++ ) for ( col = 0; col < 4; col ++ ) matriz [ fila ][ col ] = fila * col; return ( 0 ); }
Arreglos Bidimensionales • Por ejemplo: Cada alumno tiene tres notas, una por cada certamen. • Entonces las notas de un alumno pueden contenerse en un arreglo de tamaño tres. • Ahora si queremos mantener las notas de un curso de 52 alumnos. • Podemos mantener las notas en un arreglo de 52 arreglos de tamaño 3.
Notas del curso #include<stdio.h> #define alumnos 52 #define notas 3 int main ( ) { int curso [ alumnos ][ notas ], fila, col; for ( fila = 0; fila < alumnos; fila ++ ) for ( col = 0; col < notas; col ++ ) scanf ( "%d“, &curso [ fila ][ col ] ); return ( 0 ); } • Con lo cual curso [ 10, 2 ] representa la nota del tercer certamen del onceavo alumno.
Ejemplo • Desarrolle un programa que reciba como entrada las notas de cada pregunta del certamen 1 de programación, para todos los alumnos, y muestre como salida un resumen con las notas finales de todos los alumnos
Multidimensionales • No existe un limite lógico definido para la cantidad de dimensiones que puede tener un arreglo, físico sí, la memoria reservada. • C permite arreglos con mas de dos dimensiones • La forma general de una declaración de arreglo es • tipo nombre_var[tamaño1][tamaño2]…[tamañoN] int a = 3, b = 4, c = 5, i , j , k , arr [ a ][ b ][ c ]; for ( i = 0; i < a; i ++) for ( j = 0; j < b; j ++ ) for ( k = 0; k < c; k ++ ) arr [ i ][ j ][ k ] = i + j + k;
String • El uso más común para un arreglo unidimensional es guardar un arreglo de caracteres. Un string esta definido como un arreglo de caracteres terminado por un símbolo null ('\0'). • Para que un arreglo contenga un string de 10 caracteres, es necesario definirlo de largo 11, ya que 11 hace lugar para el null al final del string.
String • Definición • char cadena[tamaño]; • Asignación carácter a carácter cadena[0]='h'; cadena[1]='o'; cadena[2]='l'; cadena[3]='a'; cadena[4]='\0';
String • Inicialización: Se copia directamente en el array todos los caracteres y se incluye automáticamente el carácter '\0' cadena="hola"; • Para asignar un carácter a un char se utiliza la comilla simple • 'a' carácter con comilla simple • "ab“ una string, arreglo de caracteres
Ejemplo #include <stdio.h> int main ( ) { char str [ 80 ]; printf ( "escribir string“ ); scanf ( "%s", str ); //no lleva & return ( 0 ); } /* Lee un string hasta que encuentra un espacio vacío */
Ejemplo #include <stdio.h> int main ( ) { char str [ 80 ]; printf ( "escribir string“ ); gets ( str ); //con espacios return ( 0 ); }
String • La librería string.h, permite hacer operaciones con string. Los más usados son: • strcpy ( ) : copia caracteres de un string a otro. • strcat ( ) : concatenación de strings. • strlen ( ) : largo del string. • strcmp ( ) : comparación de strings.
Ejemplo • Sean s1 y s2 string de largo fijo: • strcpy ( s1, s2 ) copia s2 en s1 y devuelve s1. • strcat ( s1, s2 ) concatena s2 en s1, retorna s1. • strlen ( s1 ) devuelve el la longitud de s1. • strcmp ( s1, s2 ) compara s1 con s2: • Si son iguales devuelve 0 • si s1>s2 devuelve un nº >0 • si s1<s2 devuelve un nº <0
Ejemplo #include <stdio.h> #include <string.h> int main ( ) { char s [ 10 ], c [ 10 ] = { “iwi131“ }; do { printf ( "ingrese su clave "); scanf ( "%s",s); if ( strcmp ( s, c ) != 0 ) printf ( "clave incorrecta, intente nuevamente\n“ ); } while ( strcmp ( s, c ) != 0 ); printf ( "la clave es correcta\n“ ); return ( 0 ); }
Ejemplo #include <string.h> #include <stdio.h> int main ( void ) { char c1 [ 80 ], c2 [ 80 ]; printf ( “\n Ingrese una cadena de caracteres:“ ); scanf ( "%s", c1 ); printf ( "\n Ingrese una cadena de caracteres:“ ); scanf ( "%s", c2 ); printf ( "\n Longitudes: %d %d ", strlen ( c1 ), strlen ( c2 ) ); if ( ! strcmp ( c1, c2 ) ) printf ( "\nLas cadenas son iguales“ ); strcat ( c1, c2 ); printf ( "\n %s", c1 ); return ( 0 ); }
Ejercicio • Realizar un programa que convierta un string a mayúscula y contar número de dígitos.
Bonus: Cadenas Inmutables • Las cadenas inmutables se declaran como un puntero a un char, representan un string constante y no requieren saber su largo. • Inicializando • char X [ 10 ] = { "hola“ }; • char * Y = "chao"; // En profundidad en Estructura de datos • Asignando • char X [ 10 ]; • char * Y; // En profundidad Est de datos • strcpy ( X, "hola“ ); // X="hola" es un error • Y = "chao“; // En profundidad Est de datos
Ordenamiento Burbuja • Existen numerosos algoritmos para ordenar. A continuación se verá Ordenamiento Burbuja (bublesort). • Idea: vamos comparando elementos adyacentes y empujamos los valores más livianos hacia arriba (los más pesados van quedando abajo). • Idea de la burbuja que asciende, por lo liviana que es.
Ordenamiento Burbuja Código • for ( i = N - 1; i > 0; i -- ) for ( j = 0; j < i; j ++ ) if ( V [ j ] > V [ j + 1 ] ) //lo siguiente se conoce { tmp = *f; //como swap de variables *f = *g; *g = tmp; }
Ordenamiento Burbuja Código #include <stdio.h> #define N 6 void intercambia ( int * f, int * g ) { int tmp; tmp = *f; *f = *g; *g = tmp; } int main ( ) { int i, j, v [ N ] = { 3, 4, 5, 2, 6, 8 }; for ( i = N - 1; i > 1; i -- ) for ( j = 0; j < i; j ++ ) if ( v [ j ] > v [ j + 1 ] ) intercambia ( &v [ j ], &v [ j + 1 ] ); for ( i = 0; i < N; i ++ ) printf ( "%d\n", v [ i ] ); return ( 0 ); }
Fin Preparando la revancha …