You are on page 1of 20

Universidad Catlica de Valparaso

Arreglos y Punteros
ICI-142 Profesor: Teddy Alfaro

Arreglos (array)
El arreglo es un tipo estructurado de dato, el cual es capaz de almacenar una coleccin de datos del mismo tipo. Es la estructura de datos ms utilizada por los programadores Es la forma ms simple de agrupar componentes de un mismo tipo y asociarles un nmero de orden de cada componente llamado ndice. Los arreglos en C, se almacenan en posiciones contiguas de memoria Posee un tamao

Dimensionalidad
El arreglo es una estructura multidimensional de largo fijo En una dimensin puede ser visto como un vector matemtico, necesita de un ndice (la posicin) 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

Dimensinalidad
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, posicin 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.

Ejemplos
Unidimensional int a[20];

Tridimensional float a[7][7][4];

Bidimensional Int a[6][7];

Ejemplos
int numeros[]={1,3,34,54}; //su tamao es 4 char alfabeto[5]={A,B,C,D,E}; //arreglo de caracteres de tamao 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

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 funcin principal main() tendr las dimensiones incluidas. Cuando se pasa un arreglo a una funcin, esta ultima no necesita saber el tamao. El uso ms comn es arreglos nmericos ya que se pueden automatizar procesos

Arreglos Unidimensionales
Es una lista o vector. Declaracin
Tipo_dato nom_arreglo[tamao]; Tipo_dato: de que tipo sern los elementos. Recordar que todo son del mismo tipo Nom_arreglo: nombre para la variable tipo arreglos []: nos indica que su dimensionalidad es uno tamao: la cantidad de elementos que a los ms podr contener el arreglo.

Accesando a elementos
Un elemento individual dentro de un arreglo es accedido por el uso de un ndice. Un ndice describe la posicin de un elemento dentro de un arreglo. En C/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; }

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 direccin ms baja corresponde al primer elemento, y la ms alta al ltimo elemento La cantidad de bytes del arreglo de tamao 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]); } return 0; } Lleno los 10 primeros elementos Pasamos la direccin del elemento 10 al puntero list Lleno los siguientes 10 elementos usando el puntero list Muestra los 20 elementos del arreglo lista

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 mximo de una lista de 10 elementos

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); return 0; }

Ejemplo 2
#include <stdio.h> int main(){ int x[10]; int i,suma; printf ("\n Ingrese 10 nmeros:\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; }

Paso de Arreglos unidimensionales a funciones


Primera Forma: arreglo delimitado
#include <stdio.h> func1(int x[10]){ /*Arreglo delimitado*/ ... } Se debe especificar el tamao int main(){ del arreglo int a[10]; .. func1(a); Se pasa la direccin del primer ... elemento del arreglo a la funcin return 0; }

Paso de Arreglos unidimensionales a funciones


Forma 1: Arreglo no delimitado
#include <stdio.h> func1(int x[ ]){ /*Arreglo no delimitado*/ ... } No se especifica el tamao del int main(){ arreglo int a[10]; .. func1(a); ... return 0; }

Pasando arreglos como parmetros


#define N 5 float promedio1(int num[], int n){ float promedio2(int num[N]){ int i,suma=0; int i,suma=0; for(i=0; i<N; i++) for(i=0; i<n; i++) suma+=num[i]; suma+=num[i]; return suma/(float)n; return suma/(float)N; } } int main( ){ int main( ){ int arr[N]={4,4,5,6,3}; int arr[ ]={4,4,5,6,3}; float f=promedio1(arr,5); float f=promedio2(arr); return 0; return 0; } }

Paso de Arreglos unidimensionales a funciones


Nota:
Al llamar una funcin pasndole un arreglo como parmetro, como se le entrega la direccin del primer elemento, entonces si los valores del arreglo son modificados dentro de la funcin, tambin son modificados en la funcin que llama. Por lo tanto el paso de la arreglos es por Referencia

10

Pasando un arreglo y que no sea modificado


Una forma de pasar un arreglo y que no sea modificado, es declararlo como un parmetro constante funcion( const int x[10] ){ ... } Si se intenta moficar dentro el la funcin, resultar un error de compilacin

Arreglos de 2 dimensiones
Un arreglo bidimensional es una lista de arreglos unidimensional Para declarar un arreglo bidimensional de enteros int matriz[3][4];

11

Array 2D
#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; }

Ejercicios
Desarrollar una funcin que reciba 3 matrices de nxn, la multiplicacin de las dos primeras en la tercera

12

Arreglos Multidimensionales
C permite arreglos con mas de dos dimensiones La forma general de una declaracin de arreglo es tipo nombre_var[tamao1][tamao2][tamaoN]
int a=3,b=4,c=5,i ,j ,k , arr[a][b][c]; for(i=0; i<a; i++) for(j=0; j<; j++) for(k=0; k<c; k++) arr[i][j][k]=i+j+k;

Tipo de dato cadena de caracteres STRING

13

String
El uso ms comn para un arreglo unidimensional es guardar un arreglo de caracteres Un string esta definido como un arreglo de caracteres terminado por un smbolo null (\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.

Asignando String
char cadena[tamao]; cadena[0]=h; cadena[1]=o; cadena[2]=l; cadena[3]=a; cadena[4]=\0; cadena=hola;

Definicin de un tamao determinado

Asignacin carcter a carcter

Se copia directamente en el array todos los caracteres y se incluye automticamente el caracte \0

14

Leyendo un string desde un teclado


#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 vaco */

String con espacios


#include<stdio.h> int main(){ char str[80]; printf(escribir string); gets(str); //con espacios return 0; }

15

Asignacin de String
Para asignar un carcter a un char se utiliza la comilla simple a carcter con comilla simple abuna string, arreglo de caracteres

Librera para menejo de string


La librera string.h, permite hacer operaciones con string. Los ms usados son: strcpy() : copia caracteres de un string a otro strcat() : concatenacin de string strlen() : largo del string strcmp() : comparacin de string

16

Descripcin
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

#include <stdio.h> #include <stdlib.h> int main() { char s[10],c[10]={"ici142"}; 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"); return 0; }

17

#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; }

String.h
strcat Appends a string strchr Finds first occurrence of a given character strcmp Compares two strings strcmpi Compares two strings, non-case sensitive strcpy Copies one string to another strlen Finds length of a string strlwr Converts a string to lowercase strncat Appends n characters of string strncmp Compares n characters of two strings strncpy Copies n characters of one string to another strnset Sets n characters of string to a given character strrchr Finds last occurrence of given character in string strrev Reverses string strset Sets all characters of string to a given character strspn Finds first substring from given character set in string strupr Converts string to uppercase

18

String
Ejercicio: Realizar un programa que convierta un string a mayscula y contar nmero de dgitos.

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; Asignando char X[10]; char *Y; strcpy(X,hola); // X=hola es un error Y=chao

19

Cadenas
int main(){ char x[20] ={"www.google.com"}; char *y ="www.google.com"; printf("%s\n%s\n",x,y); printf("%d y %d\n",strlen(x),strlen(y)); printf("%c %c y %c %c\n",x[3],x[10],*(y+3),*(y+10)); x[3]='-'; x[10]='-'; *(y+3)='-'; //error carcter inmutable *(y+10)='-'; //error carcter inmutable return 0; }

#include <stdio.h> #include <string.h> void cambia(char *word){ char mword[strlen(word)]; int diff='a'-'A',i; strcpy(mword,word); for(i=0; i<strlen(mword); i++) if(mword[i]>'a' && mword[i]<'z') mword[i]-=diff; strcpy(word,mword); } int main(int argc, char *argv[ ]){ char name[ ]={"teddy"}; cambia(name); printf("%s\n",name); return 0; }

20

You might also like