Está en la página 1de 18

Materia: Programación I

Apuntes Unidad V

CONTENIDO
UNIDAD V ARREGLOS DE DATOS......................................................................2
V.1
V.2
V.3
V.4

OBJETIVOS:.............................................................................................. 2
INTRODUCCIÓN......................................................................................... 2
DECLARANDO Y ASIGNANDO VALORES A LOS ARREGLOS.............................2
REGLAS PARA ASIGNAR NOMBRES A LOS ARREGLOS...................................4
Arreglos de una dimensión o vectores............................................................5
Problemas propuestos.................................................................................5
Arreglos o tablas bidimensionales, o tipo matriz............................................6
Problemas propuestos.................................................................................9
Arreglos multidimensionales...........................................................................9
Problemas propuestos...............................................................................10
Arreglos de caracteres (listas).......................................................................11
Problemas propuestos...............................................................................13
V.5
ORDENAMIENTOS DE ARREGLOS..............................................................15
V.6
LLAMADAS A FUNCIONES CON ARREGLOS.................................................16

1

También se le define como un conjunto de variables que son del mismo tipo de datos. y la posición mas alta al ultimo elemento se accede a cualquiera de ellos con sólo cambiar el índice que lo referencia. Ej. ordenar y buscar grupos de datos del mismo tipo.3 Declarando y asignando valores a los arreglos La Declaración de un Arreglo es igual a como se haría con una variable.La dirección mas baja corresponde al primer elemento. Para evitar los valores desconocidos. 2 .. como se muestra a continuación: int vector[5]. El alumno aprenderá como declarar e inicializar arreglo de datos de uno. los valores almacenados en cada uno de los elementos son desconocidos (se dice que el arreglo "tiene basura").1 Objetivos: El alumno será capaz de desarrollar tareas de programación donde se puedan almacenar.2 Introducción Un arreglo es un identificador que hace referencia a un conjunto de datos del mismo tipo. se recomienda asignar valores iniciales a cada uno de los elementos de los arreglos. dos o mas subíndices y podrá de pasar arreglos a funciones V. En C los arreglos comienzan por la posición 0. El índice será un valor entero y positivo. a excepción de que también se especifica la cantidad de elementos en el arreglo encerrado entre corchetes de la siguiente manera: Tipo nombre[ tamaño]. Los arreglos de datos están formados por posiciones contiguas de memoria. V. bajo un mismo nombre..Materia: Programación I Apuntes Unidad V Unidad V Arreglos de datos V. mediante un nombre común. lo cual causa que el programa correspondiente arroje resultados inesperados. Asignando valores a los elementos de un arreglo Al declarar un arreglo. El tipo identificara el tipo de datos que contendrá el arreglo El nombre es el nombre o identificador del arreglo El tamaño define cuantos elementos puede contener el arreglo. Int sueldo[8].

el primer subíndice siempre vale cero y el último tiene un valor menor en uno que el valor de la dimensión del arreglo. internamente se puede representar como una pila de datos 3 . vector[2] = 102 . se declara un arreglo de 5 variables de tipo entero agrupadas con el nombre vector. vector[3] = 103 . las cuales pueden representarse con la figura: Como puede observarse en la figura el primer subíndice tiene valor cero y el último tiene valor cuatro. vector[4] = 104 . se pueden asignar valores a cada uno de sus elementos. vector[1] = 101 . Una vez declarado el arreglo.Materia: Programación I Apuntes Unidad V En este caso. como se muestra enseguida: vector[0] = 100 . Lo anterior se debe a que. en C.

la línea luce así: printf ("%d". puede escribirse : int digitos[] = { 0.3. digitos[9] = 9 . 7. for( int x=0 . 2. ya que este no lo obedecerá.2. digitos[3] = 3 . digitos[8] = 8 . para declarar un arreglo de 10 enteros y al mismo tiempo asignarle a cada uno de sus elementos los valores 0.4. digitos[1] = 1 . Si desea imprimir un valor de un arreglo. 6. 8. 4. 3.8. caracter[x]) . lista[1]).7. x < 256 . sin embargo. x++ ) printf("%c".9 }. digitos[0] = 0 .6. las restantes posiciones se inicializan con 0´s.5. un nombre de arreglo debe ser único Cuando se declara un arreglo. 5.1. Una Característica importante de los arreglos en C es que no se pueden modificar los limites superior e inferior (y por tanto el rango) durante el programa. digitos[5] = 5 . digitos[4] = 4 . No trate de engañar al Compilador inicializando mas valores en el arreglo de los que puede. digitos[7] = 7 . es decir: 4 . tiene el mismo efecto que escribir: int digitos[10].Materia: Programación I Apuntes Unidad V Ejemplo de un programa con un arreglo que nos permite desplegar en pantalla los caracteres del código ASCII char caracter[256]. V. En este caso. El limite inferior se fija siempre en 0 y el superior lo fija el programador. 1. 9. digitos[2] = 2 . digitos[6] = 6 .4 Reglas para asignar nombres a los arreglos Las reglas para asignar nombres a los arreglos son las mismas que para los nombres de las variables. se puede declarar inicializandolo junto con sus valores de la siguiente manera: Por ejemplo. aunque no se escribe el tamaño de la dimensión del arreglo digitos. si inicializa solo una parte del arreglo.

El arreglo llamado “a” que contiene 30 elementos cada un de los elementos es equivalente a una variable del tipo flotante.. El subíndice es un numero encerrado entre corchetes el numero identifica la cantidad de elementos individuales que contiene le arreglo. calif[1]. se pueden declarar arreglos de cualquier tipo de datos ( int. char.. float etc) Por ejemplo El subíndice que identifica al arreglo calif[30] siempre iniciara en 0 por el primer elemento del arreglo sera : calif[0]. calif[29] Cuando se declara un arreglo el compilador reserva un bloque de memoria para guardar el arreglo completo y cada elemento es guardado en posiciones consecutivas de memoria Después de declarar un arreglo puede acceder por separado a cada uno de sus elementos Problemas propuestos Diseñar un programa donde se pueda capturar una lista de calificaciones y se calcule el promedio Diseñar un programa donde se presente un menú de opciones de Inventario y reporte de ventas de un comercio 5 ... float a[30].Materia: Programación I Apuntes Unidad V Arreglos de una dimensión o vectores Son arreglos que tienen una sola dirección y se identifican por medio de su nombre y un subíndice ( tienen un solo parámetro en el subíndice).

h> #include <conio. Obsérvese que el primer subíndice varía de 0 a 2 y el segundo varía de 0 a 3. como se observa en el listado #include <iostream.Materia: Programación I Apuntes Unidad V Arreglos o tablas bidimensionales.h> void main(void) 6 . El arreglo matriz puede representarse con la figura . debe recordarse que el subíndice de cada una de ellas inicia con un valor 0. Cuando se manejan arreglos de varias dimensiones. o tipo matriz Un arreglo tipo tabla se define como un conjunto de datos del mismo tipo organizados en dos o mas columnas y uno o mas renglones.

x < 3 x++) { for(y=0 y< 4 . y++) { matriz[x][y]=x+y+1 . 67}}. clrscr().{23. tipo nomtabla[cant ren][cant col]. Los elementos de la tabla se deberán simbolizar con el nombre de la tabla y 2 subíndices. lista_nueva[1][0]). La declaración de una tabla sera de acuerdo al siguiente formato. Se declaran semejante a los de una dimensión solo que ahora se tomaran dos subíndices: tipo nombre_arreglo_bi[tamaño][tamaño]. y se acceden de la misma manera que un unidimensional. for(int x=0 . Ejemplo printf ("%d". } } } Para procesar ( recordar solo operaciones y comparaciones) internamente todos los elementos de la tabla se ocupan dos ciclos for() uno externo para controlar renglón y uno interno para controlar columna. el primer subíndice referencia al renglón y el siguiente subíndice referencia la columna. gotoxy(y+1.Materia: Programación I Apuntes Unidad V { int matriz[3][4].x+1). El tamaño en la declaración de la matriz Renglon-Columna y se representarían así: Estos también se pueden inicializar: Int lista_nueva[2][2]={{14. 34}. Ejemplo: 7 . print(“%d” matriz[x][y]).y.

printf("%d ". } 8 .c++)calif[r][c]=calif[r][c]+10. nc=nc+10. printf("%d %d: ".r+6). //desplegando for (r=0. getchar(). // capturando printf("CALIFICACIONES \n").r+2). r<=2. r<=2.c<=3.h> #include <string.c++) { gotoxy(nc.&calif[r][c]).c++) { gotoxy(nc.getchar().c.h> #include <conio.r. nc=5. nc=5.c<=3. for (r=0.Materia: Programación I Apuntes Unidad V int calif[3][4].nc=5. scanf("%d". r++) { for(c=0. r++) { for(c=0. r<=2. r++) for(c=0.c). //operando for ( r=0. }.calif[r][c]). int r. }. // declaracion tabla int calif[3][4].h> void main() { clrscr(). nc=nc+10. long int ingresos [3][4].c<=3. }. }. #include <stdio.

ademas listas de comisiones totales y promedios ganadas por los vendedores. agregar al final una lista que muestre los ingresos mensuales totales por meses y una segunda lista que muestre los ingresos mensuales totales por sucursal. Int CURP [5][7][8][2][3][2].Materia: Programación I Apuntes Unidad V Problemas propuestos 1. 3..construir un cuadro que contenga los ingresos mensuales por ventas durante los tres primeros meses del año de cuatro sucursales de una cadena de auto refacciones. 9 . 2.-construir un cuadro que contenga las comisiones ganadas por tres vendedores. en la memoria siguen siendo representados como espacios secuenciales lineales.: int grande[3][4][7]. Recordar que el primer renglón o índice en CPP es el renglón 0. asi como listas de comisiones totales y promedios por tipo de linea blanca.. analizar este segmento de codigo: for r = 0 to 3 for c = 0 to 2 totreng(r) = totreng(r) + tabla(r. de los 5 tipos de linea blanca de conocida muebleria. Se debe de tener cuidado al manejar estos arreglos por que son complejos de manipular a la larga. misma que también se usa como índice del arreglo. que se producen en tres plantas diferentes de una empresa maquiladora.c) next c promreng(r) = totreng(r)/3 next r 'para totales y promedios por columna for c = 0 to 2 for r = 0 to 3 totcol(c)=totcol(c) + tabla(r.c) next r promcol(c) = totcol(c) / 4 next c Arreglos multidimensionales Se pueden construir arreglos Multidimensionales Ej. Se recomienda usar siempre un ciclo for con una variable de control llamada renglón. A pesar de ser Bidimensionales.construir un cuadro que contenga los costos fijos de cuatro productos cualesquiera.

r++) { gotoxy(5. misma que se usara también como índice de la lista. }. }. gotoxy(5. tal como se muestra en el siguiente ejemplo. o comparaciones. scanf("%d". //procesando for ( r=0. r<=2. r<=2. r*2+10).. etc) los elementos de la lista.gets(nombre[r]). Para desplegar los elementos de la lista. r++) { gotoxy(5.edad[r]).Capturar 4 sueldos y desplegarlos aumentados en un 25% 10 . getchar(). gotoxy(5. printf("%d NOMBRE: ". siempre y cuando las listas sean del mismo tamaño. printf("NOMBRE:= %s". //desplegando for ( r=0.getchar(). operaciones)deberá acompañarse de su índice respectivo. Para procesar (hacer operaciones con ellos. printf("%d EDAD: ". se deberá usar un ciclo for con una variable de control llamada renglón. int edad[3].r). también se usa un ciclo for con su variable de control renglón. } Problemas propuestos 1. r*2+3).h> #include <string. printf("EDAD:=%d". El mismo ciclo de proceso o despliegue se puede utilizar para procesar o desplegar los elementos de mas de una lista. r*2+9).&edad[r]). // capturando for (int r=0.. r<=2. r++) edad[r]=edad[r] *12.r). Ejemplo: #include <stdio.Materia: Programación I Apuntes Unidad V Siempre que se use un elemento de una lista en Cpp con cualquier proceso (captura.Capturar y desplegar 5 precios de productos cualesquiera.h> void main() { clrscr(). despliegue. r*2+2). // declaracion listas char nombre[3][20].h> #include <conio. 2. nombre[r]).

tendremos que declarar la variable con una longitud capaz de alojar el nombre más largo de entre los valores posibles. Para facilitar el tratamiento de estos vectores de caracteres con longitud variable. Lo que cambia es su lectura y escritura. como nombres de personas. etc. Esta marca le permitiría saber posteriormente donde se encuentra el fin de la cadena. Existe una librería que contiene todas las funciones para manejar cadenas cuyas declaraciones están en string. Todas estas funciones consideran a una string como una secuencia de caracteres acabada en nulo ('\0'). hace falta declarar el vector de dimensión k+1 para poder alojar también esta marca. el computador los leerá uno a uno hasta encontrar un cambio de línea. Existe otra manera de leer una cadena desde el teclado. Así. C tiene un tipo predefinido : el tipo string (cadena de caracteres). Cuando esto suceda. 11 .h. Así. En el momento de leer una cadena de caracteres.Materia: Programación I Apuntes Unidad V Arreglos de caracteres (listas) Se presenta la necesidad de utilizar vectores para la manipulación de cadenas de caracteres. de calles. usando la instrucción gets con el formato gets (nombre_cadena). añadirá al final de la secuencia leída un carácter nulo (el carácter con código ASCII igual a 0). en el ejemplo anterior se debería declarar char nombre[16] La lectura de una cadena de caracteres se realiza poniendo en el control el formato %s y quitando del nombre de la variable el prefijo & en la instrucción scanf. podemos declarar el vector char nombre[15] si se sabe que 15 caracteres es una el tamaño de los nombres que aparecerán durante la ejecución. En estos casos. Huelga decir que si sabemos que la longitud máxima de las cadenas a tratar es k. para almacenar nombres de personas. Su declaración es la normal de un vector de caracteres.

char *strcat(char *dest. primero que nada se deberá usar un arreglo bidimensional tipo carácter. size_t strlen(char *s). devolviendo un puntero a dicha posición o NULL si no hay. pero con los maxlen primeros caracteres. char *src). char *strchr(char *str. Busca dentro de s1 el primer caracter de los de s2. Busca el primer caracter c en str y retorna un puntero a dicha c o NULL si no hay. char *strpbrk(char *s1. char *s2). size_t maxlen). devolviendo dest. Devuelve el número de caracteres en s. int stricmp(char *s1. Busca el último caracter c en str y retorna un puntero a dicha c o NULL si no hay. char *strupr(char *s). char *strlwr(char *s). Para manejar listas de un arreglos de caracteres o llamadas strings o cadenas. size_t maxlen). Igual que strcmp pero sin diferencial mayúsculas de minúsculas. size_t maxlen). sin contar /0. Compara s1 y s2. char *s2.Materia: Programación I Apuntes Unidad V Algunas librerías y funciones importantes para cadenas en ANSI C int strcmp(char *s1. int c). donde el primer subíndice referenciará la cantidad de cadenas (strings) que tendrá el arreglo y el segundo subíndice indicara el tamaño máximo de cada cadena (string) para leer los siguientes datos en un programa en lenguaje C: rosa juan jose‚ maria 12 . Convierte la cadena a mayúsculas. devolviendo <0. Añade src al final de dest. Convierte s a minúsculas. int c). 0 ó >0 según sea s1<s2. char *s2). char *src). Copia la cadena src en dest. s1==s2 ó s1>s2. char *strrchr(char *str. Igual que strcmp. char *s2). Mescla de stricmp y strncmp. char *strncat(char *dest. Añade a lo sumo maxlen caracteres de src a dest. int strncmp(char *s1. int strnicmp(char *s1. char *s2. char *src. char *strcpy(char *dest.

después calcular una cuarta lista con el gasto total por cada producto desplegarlo todo incluyendo también el gran total. // capturar o inicializar los elementos scanf(“%s”.. ejemplo: char nombres[4][30].Materia: Programación I Apuntes Unidad V se debera declarar un arreglo del tipo char nombres[4][6]. precio y cantidad en sus 3 listas respectivas.Capturar en sus listas respectivas los datos de 6 alumnos. Por ejemplo no es valido usar simples sentencias de asignación o comparación.char nombre [30]..nombres[reng]).nombres. // despliegue for(ren=0.. Para efectuar cualquier proceso (captura. esto no es valido en CPP 2.if(opcion==`si`) Tampoco es valido en CPP Para casos como estos se deberán usar ciertas funciones de manipulación de strings que provee el lenguaje C.. Las cademas o strings no son mas que un caso especial de arreglo de caracteres y como tales presentan ciertas peculiaridades que no son posible resolver con métodos tradicionales. copia[30]..ren<=3. despliegue). 1.... comparación. 2.Capturar los datos de 5 productos comprados en una tienda.ren++) printf("%s". incluyendo nombre. estas funciones son : 13 . pero solo desplegar los que sean de la carrera de sistemas. int ren. Problemas propuestos 1. se deberá usar el nombre de la lista y nada mas el primer subíndice.. copia = nombre...

"si").string original).strlen(nombre)).string2).---->REGRESA 30 printf"%d". nombre= getstring("nombre").h> a) STRCPY(string destino.Materia: Programación I Apuntes Unidad V #include <string. Esta función regresa la cantidad de caracteres que tiene la string. ejemplo: char nombre[30]."lopez").copia[30]. if(strcmp(opcion. ejemplo: char nombre[30].copia[30]. strcpy(copia."pepe").nombre). c) STRCMP(string1. strcmp(opcion. Encadena o agrega al final de la string1 la string2. strcpy(nombre. printf("%d". esta función regresa cero si ambas strings son iguales."si")==0) c) STRLEN(string). b) STRCAT(string1.string2).---->REGRESA 4 14 . ejemplo: char nombre[30]."juan"). ejemplo: char opcion[3]. regresa un numero mayor que cero si string 1 es mayor que string 2 y regresa un numero menor que cero si string 1 es menor alfabeticamente que string 2. Se utiliza para comparar 2 strings.sizeof(nombre)). Se utiliza para copiar el contenido de un string original en un string de destino. strcat(nombre. strcpy(nombre. strcpy(nombre."pato").

Para el caso de listas de strings. son variables de control y deberán ser declaradas de tipo int. deberá ser declarada de acuerdo al tipo de dato de los elementos de la lista.Todas las referencias a LISTA. for(k=1.La variable temp. k. es decir.ordenar descendentemente 6 ciudades 15 .. (<) descendente. }. Lista original Ord crec Ord decr 15 2 15 2 8 10 10 10 8 8 15 3 Existen muchos métodos u algoritmos de sorteos.k<=n-1. . }. renglon=renglon+1..k++) { renglon=0. . es el denominado sorteo de burbuja que se basa en el siguiente algoritmo: /*area de ordenamiento*/ n=cantidad de elementos de la lista.Es el símbolo del if.5 Apuntes Unidad V Ordenamientos de arreglos Este proceso consiste en reacomodar los elementos de la lista en un nuevo orden.Las variables n. (>)ascendente.Materia: Programación I V. renglón. quien determina el tipo de sorteo. while(renglon< n-k) { if(lista[renglon]>lista[renglon+1]) { temp=lista[renglon]. la comparación en el if y el intercambio en la parte cierta de abajo se debera hacer usando las instrucciones o metodos que se analizarón en el tema de strings. . de acuerdo a algún criterio. lista[renglon+1]=temp. . }. lista[renglon]=lista[renglon+1]. el mas común de ellos. problemas sugeridos: 1. deberán ser cambiadas por el nombre verdadero de la lista real. Las notas a considerar con respecto al algoritmo son: .ordenar ascendentemente 5 matriculas 2.

observar que no es necesario especificar la dimensión del arreglo cuando es un parámetro de la función.6 Llamadas a funciones con arreglos Cuando se usan un arreglo como un argumento a la función. return(suma/tam). for ( i=0.Materia: Programación I Apuntes Unidad V 3. float lista[]) { int i. Se muestra otro ejemplo.. t--) printf("%c". se pasa sólo la dirección del arreglo y no los datos del arreglo El siguiente ejemplo en donde se pasa un arreglo a la función imp_rev. float suma = 0. float enconprom(int tam. la función imp_rev no usa la sentencia return ni para terminar de usar la función. main() { char nombre[]="Universidad". for( t=strlen(s)-1.ordenar a criterio del usuario 7 eventos de su vida V. i<tam.s[t]).0. } void imp_rev(char s[]) { int t. Por otra parte. } Observar que en la función imp_rev se usa la función strlen para calcular la longitud de la cadena sin incluir el terminador nulo. imp_rev(nombre). ni para regresar algún valor. i++) suma += lista[i]. t>=0. } 16 .

o puede poner todos los valores iniciales. x<tamx. 20. y<tamy. y++ ) printf("t[%d][%d]=%f".x.0. 15. printf("\n").int tamy.01. -2. } } RESUMEN Un arreglo es una colección de variables que son del mismo tipo de datos En c el índice para un arreglo comienza en 0 Puede inicializar cada elemento de un arreglo después de declararlo. no se indica la primera dimensión pero.numeros) ). 8. Un par de corchetes vacío( el operador de subíndices de arreglo [y] indica una dimensión 17 .3. } Para el caso de que se tenga que pasar un arreglo con más de una dimensión. Las funciones de c. el resto de las dimensiones deben señalarse. enconprom(7. dentro de bloque de datos encerrados entre llaves al mismo tiempo de declararlo El espacio de memoria que ocupa un arreglo esta determinado por la multiplicación del tamaño del tipo de datos por las dimensiones del arreglo Se dice que un apuntador hace referencia a un arreglo cuando la dirección del primer elemento del arreglo se asigna al apuntador.9}.y. float tabla[][5]) { int x. separados por comas.tabla[x][y]).Materia: Programación I Apuntes Unidad V main() { float numeros[]={2.0. x++ ) { for ( y=0. como printf() detendrán el procesamiento de la cadena al encontrar el carácter nulo C también maneja arreglos multidimensionales.2. La dirección del primer elemento de un arreglo también se conoce como dirección de inicio del arreglo. 44. for ( x=0. -3. Se muestra a continuación un ejemplo: void imprtabla(int tamx.0. Para asignar la dirección de inicio de un arreglo a un apuntador puede poner la combinación del operador de dirección (&) y el nombre del primer elemento del arreglo o simplemente usar el nombre del arreglo a la derecha del operador de asignación ( = ) El carácter nulo (\0) marca el final de una cadena. printf("El promedio de la lista es %f\n".y.

el cual marca el primer elemento del arreglo ¿Cómo se hace referencia a un arreglo usando un apuntador? Puede emplear un apuntador para hacer referencia a un arreglo asignándole al apuntador la dirección de inicio del arreglo. 18 . en lugar de declarar cada variable por separado. puede declararlas todas en formato de arreglo.Materia: Programación I Apuntes Unidad V El compilador puede calcular en forma automática el espacio de memoria necesario para un arreglo sin especificación de tamaño PREGUNTAS FRECUENTES Porque surge la necesidad de utilizar arreglos? Se presentan casos donde se necesita declarar un conjunto de variables que son del mismo tipo de datos. el carácter nulo siempre se evalúa como un valor cero. Además. ya sea a través de una referencia al elemento del arreglo o por medio de un apuntador que haga referencia al arreglo ¿Cuál es el índice mínimo en un arreglo? En C el índice mínimo de un arreglo de una sola dimensión es 0. Por ejemplo dada una variable de puntador aptr y un arreglo de caracteres arreglo puede usar una de las siguientes instrucción para hacer referencia al arreglo mediante el apuntador Aptr = arreglo. O bien Aptr = &arreglo[0] Que hace el carácter nulo? En C el carácter nulo (`\0’ se puede utilizar para marcar el final de una cadena Por ejemplo la función printf() continua poniendo en la pantalla el siguiente carácter hasta que encuentra el carácter nulo. se puede acceder a cada variable como un elemento del arreglo.