Departamento de Informática Universidad Técnica Federico Santa María Tipos de Datos Estructurados Programación de Computadores IWI-131-p1 Prof.: Teddy Alfaro Olave Arreglos (array) El arreglo es un tipo estructurado de dato, el cual es capaz de almacenar una colección de datos del mismo tipo. Es la estructura de datos más utilizada por los programadores Es la forma más simple de agrupar componentes de un mismo tipo y asociarles un número de orden de cada componente llamado índice. Los arreglos en C, se almacenan en posiciones contiguas de memoria Posee un tamaño 1
Dimensionalidad El arreglo es una estructura multidimensional En una dimensión puede ser visto como un vector, necesita de un índice (la posición) para recorrer sus elementos Un arreglo de dos dimensiones puede representarse como una matriz, necesita de dos índices (fila y columna) para acceder a uno de sus elementos Dimensionalidad Un arreglo de 3 dimensiones podemos tomarlo como un espacio. Ejemplo: el cubo de rubik Contiene 4*4*4 cubos, para acceder a uno de ellos necesito altura, posición horizontal, y profundidad (3 índices) En general un arreglo puede ser n- dimensional, y requerirá de n índices para recorrer o acceder a sus elementos. 2
Unidimensional int a[20]; Ejemplos Tridimensional float a[7][7][4]; Bidimensional Int a[6][7]; Ejemplos int numeros[]={1,3,34,54; //su tamaño es 4 char alfabeto[5]={ A, B, C, D, E ; //arreglo de caracteres de tamaño 5 Char nombres[][40]={ pedro, pablo, luis, karina, lisa ; //5 filas y columnas a lo mas de 40 caracteres. int Coordenadas[2][2]={ {0,0,{1,1; //arreglo bidimensional de enteros 3
Observaciones Los índices de los arreglos comienzan en cero, es decir, el primer elemento, es el elemento cero. Si un arreglo es declarado en la función principal main() tendra las dimensiones incluidas. Cuando se pasa un arreglo a una función, esta ultima no necesita saber el tamaño. 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 todo 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. 4
Accesando a 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. En C/C++ el primer elemento tiene el índice cero! int V[5]; V 13 34 7 61 1 Posición 0 1 2 3 4 V[2] contiene el 7 V[4] contiene el 1 V[0] contiene el 13 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]); 5
Mapeo de un Arreglo en Memoria En C, un arreglo es mapeado a localizaciones de memoria continua Todos los elementos de memoria residen uno al lado del otro La dirección más baja corresponde al primer elemento, y la más alta al último elemento La cantidad de bytes del arreglo de tamaño n está dada por sizeof(tipo_dato)*n Arreglo y punteros de memoria #include <stdio.h> int main( ){ int lista[20],i,*list; for (i=0;i<10;i++) lista[i]=i*i; list = &lista[10]; for(i=0;i<10;i++) *(list+i)=-i*i; for(i=0;i<20;i++) { printf("lista[%d]=%d\n",i,lista[i]); Lleno los 10 primeros elementos Pasamos la dirección del elemento 10 al puntero list Lleno los siguientes 10 elementos usando el puntero list Muestra los 20 elementos del arreglo lista 6
Asignando arreglos No se puede asignar un arreglo a otro Lo siguiente es ilegal: int a[10], b[10]; //hacer algo 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]; 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 7
Ejemplo 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); #include <stdio.h> int main(){ int x[10]; int i,suma; Ejemplo 2 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); 8
Paso de Arreglos unidimensionales a funciones Forma 1: Arreglo delimitado #include <stdio.h> func1(int x[10]){ /*Arreglo delimitado*/... int main(){ int a[10];.. func1(a);... Se debe especificar el tamaño del arreglo Se pasa la dirección del primer elemento del arreglo a la función Paso de Arreglos unidimensionales a funciones Forma 1: Arreglo no delimitado #include <stdio.h> func1(int x[]){ /*Arreglo no delimitado*/... int main(){ int a[10];.. func1(a);... No se especifica el tamaño del arreglo 9
Paso de Arreglos unidimensionales a funciones Nota: Al llamar una función pasándole un arreglo como parámetro, como se le entrega la dirección del primer elemento, entonces si los valores del arreglo son modificados dentro de la función, también son modificados en la función que llama. Hacia un arreglo dinámico Los arreglos de tamaño dinámico no exiten, pero C permite reservar memoria en tiempo de ejecución para determinar el tamaño de un arreglo. Para ello se necesita la librería stdlib.h Las funciones son malloc, calloc, free y realloc. 10
Hacia un arreglo dinámico int main() { int *p,*k,num,i; printf("ingrese el tamaño del arreglo "); scanf("%d",&num); printf("malloc\n"); p= (int *)malloc(sizeof(int)*num); for(i=0;i<num;i++) p[i]=rand()%13; for(i=0;i<num;i++) printf(" p[%d]=%d\n",i,p[i]); free(p); printf("calloc\n"); k = (int *)calloc(num,sizeof(int)); for(i=0;i<num;i++) k[i]=rand()%13; for(i=0;i<num;i++) printf(" k[%d]=%d\n",i,k[i]); k = (int *)realloc(k,sizeof(int)*num*2); for(i=0;i<num*2;i++) k[i]=rand()%13; for(i=0;i<num*2;i++) printf(" k[%d]=%d\n",i,k[i]); free(k); Return 0; Tipo de dato estructurado STRING 11
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 ) h o l a \0 Para que un arreglo sostenga un string de 10 caracteres, char str[11], ya que 11 hace lugar para el null al final del string. Leyendo un string desde un teclado #include<stdio.h> int main(){ char str[80]; printf( escribir string ); scanf( %s,str);//no lleva & /* Lee un string hasta que encuentra un espacio vacío */ 12
String con espacios #include<stdio.h> int main(){ char str[80]; printf( escribir string ); gets(str);//con espacios Asignación de String Para asignar un carácter a un char se utiliza la comilla simple 13
Librería para menejo de 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 string strlen() : largo del string strcmp() : comparación de string Descripción 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 14
#include <stdio.h> #include <stdlib.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 de nuevo\n"); while(strcmp(s,c)!=0); printf("la clave es correcta\n"); #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); 15
String.h strcat strchr strcmp strcmpi strcpy strlwr strncat strncmp strncpy strnset strrchr strrev strset strspn strupr Appends a string Finds first occurrence of a given character Compares two strings Compares two strings, non-case sensitive Copies one string to another strlen Finds length of a string Converts a string to lowercase Appends n characters of string Compares n characters of two strings Copies n characters of one string to another Sets n characters of string to a given character Finds last occurrence of given character in string Reverses string Sets all characters of string to a given character Finds first substring from given character set in string Converts string to uppercase String Ejercicio: 4.- Realizar un programa que convierta un string a mayúscula y contar número de dígitos. 16
Arreglos de 2 dimensiones Arreglo 2-dimensional Un arreglo bidimensional es una lista de arreglos unidimensional Para declarar un arreglo bidimensional de enteros int matriz[3][4]; 17
#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; Arreglos Multidimensionales 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] 18