Documentos de Académico
Documentos de Profesional
Documentos de Cultura
int A[3]; // forma una secuencia de tres elementos Nombre del grupo a Nombre de los elementos a[0] primer elemento a[1] segundo elemento a[2] tercer elemento
Declaracin.
La declaracin de un arreglo unidimensional consiste en establecer las caractersticas del arreglo y sus elementos, por medio de la siguiente sintaxis: <tipo> [ ] < identificador > ; Donde: tipo indica el tipo correspondiente a los elementos del arreglo , identificador es el nombre del arreglo, y el par de corchetes, [ ], representa la dimensin del arreglo y encierra un nmero entero que corresponde al nmero de elementos del arreglo. Ejemplos: int [ ] a ; float [ ] distancia ; Artculo [ ] art = new Artculo[ 3]; Observe que, en la declaracin, el espacio entre los corchetes est vaco. Esto se debe a que, durante dicha operacin, no se reserva espacio en la memoria.
Creacin.
La creacin de un arreglo unidimensional consiste en reservar espacio de memoria para todos sus elementos, utilizando la siguiente sintaxis:
< identificador > = new <tipo> [ tamao ] ; Donde: new es el operador para gestionar espacio de memoria, en tiempo de ejecucin, tamao es un nmero entero que representa el nmero de elementos del arreglo. Ejemplos: a = new int [10] ; // Se crea el arreglo a , con 10 elementos de tipo entero. distancia = new float[ 5] ; // Se crea el arreglo distancia , con 5 elementos de punto flotante y precisin sencilla .Artculo [] art = new Artculo[3]; Artculo [ ] art = new Artculo[ 3]; // Se crean 3 referencias a objetos de la clase Artculo art[0]= new Artculo(); // Se crea el primer objeto del arreglo art art[1]= new Artculo(); // Se crea el segundo objeto del arreglo art art[2]= new Artculo(); // Se crea el tercer objeto del arreglo art
Las dos primeras operaciones de declaracin y creacin anteriores se pueden agrupar en una sola instruccin, como se muestra enseguida: int [ ] a = new int [10] ; float [ ] distancia = new float[5] ;
Inicializacin.
Un arreglo es un objeto que, cuando es creado por el compilador, se le asignan automticamente valores iniciales predeterminados a cada uno de sus elementos, de acuerdo a los siguientes criterios: Si el tipo del arreglo es numrico, a sus elementos se les asigna el valor cero. Si el tipo del arreglo es char, a sus elementos se les asigna el valor '\u0000'. Si el tipo del arreglo es bool, a sus elementos se les asigna el valor false. Si el tipo del arreglo es una clase, a sus elementos se les asigna el valor null. Cuando se requiere asignar valores iniciales diferentes de los predeterminados, es posible agrupar las operaciones de declaracin, creacin e inicializacin en una sola instruccin, por ejemplo:
int [ ] a = { 1, 0,4,-6, 2,9, 23,455, 90,35 }; float [ ] distancia = { 2.50F, 286.45F, 46.75F, 30.62F, 93.00F }; string [ ] pato = { "Hugo", "Paco", "Lus" };
Acceso.
Se puede acceder a los valores de los elementos de un arreglo a travs del nombre del arreglo y un subndice. El subndice debe escribirse entre corchetes y representa la posicin del elemento en el arreglo. As, podemos referirnos a un elemento del arreglo escribiendo el nombre del arreglo y el subndice del elemento entre corchetes. Los valores de los subndices empiezan en cero para el primer elemento, hasta el tamao del arreglo menos uno. Ejemplo: float [ ] distancia = new float[5] ; // Crea el arreglo distancia con 5 elementos. float x = 25F, y = 10F ; // Crea dos variables de punto flotante y precisin sencilla. distancia[0] = x + y ; // El valor asignado al primer elemento es 35. distancia[1] = ++distancia[0] ; // Asigna 36 al segundo elemento. distancia[2] = distancia[1] - distancia[0] + 4 ; // Asigna 5 al tercer elemento. distancia[3] = distancia[2]-- ; // Asigna 5 al cuarto elemento // y disminuye en 1 el valor del tercero.
distancia[4] = distancia[3] * distancia[2] ; // Asigna 20 al quinto elemento. y = distancia[4] ; // Asigna a y el valor almacenado en el quinto elemento.
Aplicaciones.
Listas. Resolvamos el problema de manejar dos listas: una con los nombres de un grupo de alumnos y otra con una calificacin para cada uno de los alumnos. Primero se debern leer los nombres de los alumnos y la calificacin que corresponde a cada uno de ellos y despus habr que desplegar dos columnas: una con los nombres de los alumnos y la otra con sus respectivas calificaciones.
La lectura debe lucir de manera similar a la siguiente: Nmero de alumnos: 30 Nombre [0] : Calificacin[0] : Nombre [1] : Calificacin[1] : Nombre [2] : Calificacin[2] : ... ... Nombre [29] : Calificacin[29] : El despliegue en el monitor lucira as: No. Nombre Calif. 1 Hugo 100 2 Paco 90 3 Lus 95 ... ... 30 Donald 70 El siguiente cdigo corresponde a un programa que resuelve el problema. // Lista.cs : Lee una lista de nombres y calificaciones correspondientes a un grupo de // alumnos de una materia. using System; using C = System.Console; public class Lista { public static void Main() { int nAlumnos; C.Write("Nmero de alumnos: ");
nAlumnos = Convert.ToInt32(C.ReadLine()); string [ ] alumnos = new string[nAlumnos]; //Crea el arreglo de //alumnos. int [ ] calif = new int [nAlumnos]; // Crea el arreglo de calificaciones. // Lee los elementos de los dos arreglos. for(int i = 0; i < nAlumnos ; i++) { C.Write("Nombre del alumno [" + i + "] : "); alumnos[i] = C.ReadLine( ); C.Write("Calificacin [" + i + "] : "); calif[i] = Convert.ToInt32(C.ReadLine( )); } // Despliega los valores de los dos arreglos. C.WriteLine("No. Nombre Calif."); for(int i = 0 ; i < nAlumnos ; i++) { C.Write(" " + (i+1) + ".- " + alumnos[ i] ); C.WriteLine(" " + calif[i] ); } } }
Vectores.
Otra de las aplicaciones de los arreglos es el manejo de vectores. Los vectores son una forma de almacenar datos que permiten contener una serie de valores del mismo tipo, cada uno de los valores contenidos tiene una posicin asociada que se usar para accederlos. Est posicin o ndice ser siempre un nmero entero positivo.
En C la cantidad de elementos que podr contener un vector es fijo, y en principio se define cuando se declara el vector. Los vectores se pueden declarar de la siguiente forma: tipo_elemento nombre[largo]; Esto declara la variable nombre como un vector de tipo_elementos que podr contener largo cantidad de elementos, y cada uno de estos elemento podr contener un valor de tipo tipo_elemento. Por ejemplo: double valores[128]; En este ejemplo declaramos un vector de 128 elementos del tipo double, los ndices de los elementos iran entre 0 (para el primer elemento y 127 para el ltimo). De la misma forma que con las otras declaraciones de variables que hemos visto se le puede asignar un valor iniciar a los elementos. O tambin se pueden declarar: tipo_elemento nombre[largo]={valor_0, valor_1, valor_2}; En caso estamos asignadole valores a los primeros 3 elementos del vector nombre. Notar que largo debe ser mayor o igual a la cantidad de valores que le estamos asignando al vector, en el caso de ser la misma cantidad no aporta informacin, por lo que el lenguaje nos permite escribir: tipo_elemento nombre[]={valor_0, valor_1, valor_2}; Que declarar nombre como el vector de largo 3. Para acceder a un elemento accederemos a travs de su posicin. Es decir: tipo_elemento elemento; ... elemento = nombre[2]; Asumiendo que tenemos el vector anterior definido estaramos guardando valor_2 en elemento. Veamos algunos ejemplos: /* * Ejemplo : El producto escalar de dos vectores */ #include <stdio.h> double producto_escalar(double v1[], double v2[], int d); int main() {
const int largo = 3; double vector_1[] = {5,1,0}; double vector_2[] = {-1,5,3}; double resultado = producto_escalar(vector_1, vector_2, largo); // imprime el resultado printf("(%f, %f, %f) . (%f, %f, %f) = %f\n", vector_1[0], vector_1[1], vector_1[2], vector_2[0], vector_2[1], vector_2[2], resultado); return 0; } /* producto escalar entre dos vectores */ double producto_escalar(double v1[], double v2[], int d) { double resultado = 0; int i; for (i=0; i < d; i++) { resultado += v1[i] * v2[i]; } return resultado; } En el ejemplo anterior usamos los vectores de C para representar vectores matemticos y calcular el producto vectorial entre ellos. Una peculiaridad que se puede notar es que al recibir un arreglo en una funcin no se especifica el largo, volveremos a esto en un captulo posterior. Otra funcin clsica es la bsqueda de un mximo o mnimo, que podemos escribirla de la siguiente manera: int buscar_maximo(double valores[], int num_valores) { int maximo_pos = 0; for (int i = 1; i < num_valores; i++) { if (valores[i] > valores[maximo_pos]) { maximo_pos = i; } } return maximo_pos; } Otro ejemplo sencillo, calcular el promedio de los valores. double promedio(double valores[], int largo) { double suma=0;
for (int i=0;i<largo;i++) { suma+=valores[i]; } return suma/largo; } Cuando una funcin recibe un vector por parmetro y cambia su contenido y el cambio es permanente (se ve an fuera de la funcin). Esto puede parecer extrao despus del nfasis que pusimos en resaltar que todos los parmetros de una funcin se reciben por valor, pero se aclarar en el siguiente capitulo. Mientras tanto usemos esto para definir una funcin que le aplique otra funcin que recibe por parmetro a cada elemento del vector, guardando el resultado en el mismo vector y una llamada de ejemplo a esta. void cuadrados(double vector[], int largo) { for (int i=0;i<largo;i++) { vector[i]=cuadrado(vector[i]); } } ... double cuadrado(double valor) { return valor*valor; } ... cuadrados(elementos,num_elem); ... De la misma forma que venimos usando vectores de tipos bsicos, podemos tener vectores de vectores, estos se declaran de la siguiente forma: int matriz[3][7]; int tabla[3][4]={ { 1, 2, 3, 4}, { 5, 6, 7, 8}, /* los espacios y saltos de lneas no son tomados en cuenta */ { 9,10,11,12} }; double v[2][2][2]; ... printf("tabla[0][1]: %i\n", tabla[0][3]); // Imprime 4 printf("tabla[2][0]: %i\n", tabla[2][0]); // Imprime 9 ... En este ejemplo tabla es un vector de longitud 3, cuyos elementos son vectores de longitud 4 de elementos de tipo int. En resumen, suponiendo que v[n] es un vector de cualquier tipo de dato con n cantidad de posiciones, al vector v se le aplican las siguientes reglas: 1.La primera posicin siempre ser v[0] 2.La ltima posicin es v[n-1]
3.En versiones previas a C99 n es una constante definida antes de la declaracin de v[n]
Declaracin.
La declaracin de un arreglo consiste en establecer las caractersticas del arreglo y sus elementos, por medio de la siguiente sintaxis: <tipo> [ , ] < identificador > ; Donde: tipo indica el tipo correspondiente a los elementos del arreglo , identificador es el nombre del arreglo, y el par de corchetes y la coma, [ , ], representan las dimensiones del arreglo y encierra dos nmeros enteros, cuyo producto corresponde al nmero de elementos del arreglo. Ejemplos: double [ , ] matriz ; int [ , ] ubicacin ;
Rama [ , ] rbol; // Rama es una clase. Observe que, en la declaracin, el espacio entre los corchetes est vaco. Esto se debe a que, durante dicha operacin, no se reserva espacio en la memoria.
Creacin.
La creacin de un arreglo bidimensional consiste en reservar espacio en la memoria para todos sus elementos, utilizando la siguiente sintaxis: < identificador > = new <tipo> [ dim1, dim2 ] ; Donde: new es el operador para gestionar espacio de memoria, en tiempo de ejecucin, dim1 y dim2 son valores enteros que representan las dimensiones del arreglo. El tamao del arreglo es el resultado de multiplicar los valores de las dimensiones y representa el nmero de elementos del arreglo. Ejemplos: matriz = new double [2, 3] ; // Se crea el arreglo matriz, con 6 elementos de tipo //punto flotante y precicin doble . ubicacin = new int[ 4,2] ; // Se crea el arreglo ubicacin, con 8 elementos de //tipo entero de 32 bits . rbol = new Rama[5,2] ; // Se crea el arreglo arbol, con 10 objetos //de la clase Rama. Las operaciones de declaracin y creacin anteriores se pueden agrupar en una sola instruccin, como se muestra enseguida: double [ , ] matriz = new double [2,3] ; int [ , ] ubicacin = new int[4, 2] ; Rama [ , ] alumno = new Rama[5,2] ;
Inicializacin.
Un arreglo es un objeto que,cuando es creado por el compilador, se le asignan
automticamente valores iniciales predeterminados a cada uno de sus elementos, de acuerdo a los siguientes criterios: Si el tipo del arreglo es numrico, a sus elementos se les asigna el valor cero. Si el tipo del arreglo es char, a sus elementos se les asigna el valor '\u0000'. Si el tipo del arreglo es bool, a sus elementos se les asigna el valor false. Si el tipo del arreglo es una clase, a sus elementos se les asigna el valor null. Cuando se requiere asignar valores iniciales diferentes de los predeterminados, es posible agrupar las operaciones de declaracin, creacin e inicializacin en una sola instruccin, por ejemplo:
double [ , ] matriz = { {1.5, 0, 4, -6.5, 2 } , {2.3, 9, 3.5, 4.8, 6.2} }; int [ , ] ubicacin = { {2, 4} , {6, 8} , {9, 10}, {5 , 1}}; string [ , ] funcionario = { {"Hugo", "jefe"} , { "Paco", "operador "}, { "Lus","ayudante"} };
Acceso.
Se puede acceder a los valores de los elementos de un arreglo bidimensional a travs del nombre del arreglo y dos subndices. Los subndices deben escribirse entre corchetes y representa la posicin del elemento en el arreglo. As, podemos referirnos a un elemento del arreglo escribiendo el nombre del arreglo y los subndices del elemento entre corchetes. Los valores de los subndices empiezan en cero para el primer elemento, hasta el tamao del arreglo menos uno. Ejemplo: int [ , ] posicin = new int[5, 10] ; // Crea el arreglo posicin , con 50 elementos de tipo entero. int x; posicin[ 3, 5] = 3 ; x = posicin[ 3, 5] ;
Aplicaciones. Matrices.
Una matriz es un arreglo rectangular de dos dimensiones, donde el acomodo de los elementos est dispuesto en renglones y columnas. Ejemplo 1: Se debe controlar la ubicacin de los asistentes a una sala de conferencias por medio de un gafete que tiene escrito el nombre del asistente, la fila y la columna donde se ubica su asiento. El siguiente segmento de cdigo muestra la solucin con arreglos bidimensionales. string [ , ] asistente = new string[10,12] ; // Inicializa los valores de los nombres con cadenas vacas. for(int i=0 ; i < 10 ; i++ ) // Controla la fila. for(int j=0 ; j < 12 ; j++ ) // Controla la columna. asistente[ i , j ] = " " ; // Captura los nombres de todos los asistentes y les asigna sus asientos, // en el orden en que van llegando. for(int i=0 ; i < 10 ; i++ ) // Controla la fila. for(int j=0 ; j < 12 ; j++ ) // Controla la columna. asistente[ i , j ] = System.Console.ReadLine( ); // Despliega los nombres de todos los asistentes. for(int i=0 ; i < 10 ; i++ ) // Controla la fila. for(int j=0 ; j < 12 ; j++ ) // Controla la columna. System.Console.WriteLine( asistente[ i , j ] );
714 503 Elaborar un programa en C# para obtener la suma de ambas matrices: S = A + B // SumMatrices.cs : Suma dos matrices de 2 renglones y 3 columnas. using System; using C = System.Console; namespace Sumatrices {
class Matriz {
const int r = 2, c = 3; int i, j; double[,] A = new double[r, c]; double[,] B = new double[r, c]; double[,] S = new double[r, c]; C.Clear(); // Lectura de valores para los elementos de A. C.WriteLine("Suma de las matrices A y B de 2x3\n"); C.WriteLine("\nTeclee los valores de la Matriz A\n"); for (i = 0; i < r; i++) for (j = 0; j < c; j++) { C.Write(" A[{0},{1}] = ",i,j); A[i, j] = Double.Parse(Console.ReadLine()); }
// Lectura de valores para los elementos de B. C.WriteLine("\nTeclee los valores de la Matriz B\n"); for (i = 0; i < r; i++) for (j = 0; j < c; j++) { C.Write(" B[{0},{1}] = ", i,j); B[i, j] = Double.Parse(Console.ReadLine()); } // Suma y despliegue de la matriz resultado. C.WriteLine("\nMatriz S = A+B\n"); for (i = 0; i < r; i++) { for (j = 0; j < c; j++) { S[i, j] = A[i, j] + B[i, j]; C.Write(" " + S[i, j]); } C.WriteLine(); } } } }
Un arreglo de tres dimensiones se subdivide en arreglos de dos dimensiones los cuales a su vez se dividen en arreglos de una dimensin. Un arreglo de cuatro dimensiones se subdivide en arreglos de tres dimensiones los cuales a su vez se dividen en arreglos de dos dimensiones los cuales a su vez se dividen en arreglos de una dimensin. La misma idea se aplica en arreglos de ms dimensiones. Ejemplo #2. Arreglo de dos dimensiones
Declaracin char m[2][3]; // forma una tabla de dos filas y tres columnas // cada fila es un arreglo de una dimensin // la declaracin indica que hay dos arreglos de una dimensin Nombre del grupo m indica la localizacin del grupo en la memoria Nombre de las filas m[0] primera fila indica la localizacin de la fila dentro del grupo m[1] segunda fila indica la localizacin de la fila dentro del grupo Nombre de los elementos m[0][0] primer elemento m[0][1] segundo elemento m[0][2] tercer elemento m[1][0] cuarto elemento m[1][1] quinto elemento m[1][2] sexto elemento Ejemplo #3. Arreglo de tres dimensiones Declaracin double w[2][2][3]; // forma dos tablas de dos filas y tres columnas // cada fila es una secuencia de tres elementos // cada fila es un arreglo de una dimensin // la declaracin indica que hay dos arreglos de dos dimensiones // los arreglos de dos dimensiones tienen a su vez dos arreglos de una dimensin
char resp; clrscr(); for (i=0;i<=19;i++){ printf("\nDame el elemento %d ",i); scanf("%d",&num[i]); } do{ bandera=0; printf("\nde un numero entero : \n"); scanf("%d",&dato); for (i=0;i<=19;i++){ if (dato==num[i]){ printf("\nEl %d se encuentra en la posicion %d del arreglo \n",dato,i); bandera=1; }} if (bandera==0){ printf("\nNO");} printf("\nQuieres buscar otro numero en el arreglo s/n"); resp=getch(); }while(resp=='s'); getch();}
1. define un registro de nombre <nombre> donde los diferentes campos son definidos dentro de Bloquev. Este bloque solo debe contener definicin de variables; 2. define los las variables <var1> a <varN> como de tipo: struct <nombre>. Se puede definir una variable de tipo, de una estructura dada, donde quiera que la estructura este definida; 3. es una abreviacin de 1.) y 2.).
Operaciones estructuras y acceso campos Operaciones estructuras: 1. operaciones sobre un campo en partcular; 2. el paso de una estructura como parmetro; 3. afectaciones y comparaciones entre estructuras son prohibidas. Uso de un campo: struct libro {
char titulo[20]; /* ttulo del libro */ char autor[20]; /* autor del libro */ int num; /* nmero de libro */ }; struct libro lib1,lib2; Para accesar los campos de lib1 y lib2 se usa el operador . de la forma siguiente: lib1.titulo[i] o lib2.titulo[i] para accesar el (i+1) caracter del ttulo lib1.autori[i] o lib2.autor[i] para accesar el (i+1) caracter del autor lib1.num o lib2.num para el nmero del libro
progReg1.c Ejemplo estructuras #include <stdio.h> int main() { struct triangulo { int base; int altura; int l1, l2, l3; float area; float perimetro; }
printf("Proporcione las longitudes de los lados del primer triangulo:") scanf("%d %d %d", &fig1.l1, &fig1.l2, &fig1.l3) printf("Proporcione el valor de la base y la altura del primer triangulo") scanf ("%d %d",&fig1.base, &fig1.altura); fig1.area = (fig1.base * fig1.altura)/2 fig1.perimetro = fig1. l1 + fig1.l2 + fig1.l3;
printf("Proporcione las longitudes de los lados del segundo triangulo:") scanf("%d %d %d", &fig2.l1, &fig2.l2, &fig2.l3) printf("Proporcione el valor de la base y la altura del segundo triangulo")
scanf("%d %d",&fig2.base, &fig2.altura); fig2.area = (fig2.base * fig2.altura)/2 fig2.perimetro = fig2. l1 + fig2.l2 + fig2.l3;
if (fig1.area > fig2.area) printf("El primer triangulo tiene un area mas grande: %.3f \n",fig1.area ); else printf("El segundo triangulo tiene un area mas grande: %.3f \n",fig2.area);
if (fig1.perimetro > fig2.perimetro) printf("El primer triangulo tiene un perimetro mas grande: %.f \n",fig1.perimetro ); else printf("El segundo triangulo tiene un perimetro mas grande: %.1f \n",fig2.perimetro); }