





























Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Los mejores documentos en venta realizados por estudiantes que han terminado sus estudios
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Descubre las mejores universidades de tu país según los usuarios de Docsity
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Un programa en c que muestra cómo cargar y manipular arreglos unidimensionales y bidimensionales, así como operaciones básicas como lectura, escritura, asignación y inicialización. Además, se explican las formas de declaración de arreglos multidimensionales y se muestran ejemplos de su uso. También se incluyen rutinas de búsqueda y ejemplos de funciones en c.
Tipo: Ejercicios
1 / 37
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!
Una estructura de datos es una colección de datos que pueden ser caracterizados por su organización y las operaciones que definen en ella. Las estructuras de datos son muy importantes en los sistemas de computadora. Los tipos de datos más frecuentes utilizados en los diferentes lenguajes de programación son:
Datos simples Estándar Entero, real, carácter y lógico Estructura de datos Estáticos Vectores y matrices, registro y archivos Dinámicos Lineales: Lista, pilas y colas No lineales: Árboles y grafos
Las estructuras de datos estáticas son aquellas en las que el tamaño ocupado en memoria se define antes que el programa se ejecute y el mismo no puede ser modificado durante la ejecución.
Los tipos de datos que vimos hasta hora son datos simples cuya característica común es que cada variable representa a un elemento; en cambio los tipos de datos estructurados tienen como particularidad que con un nombre o identificador se puede representar múltiples datos individuales y a su vez cada uno de estas puede ser referenciado independientemente.
En cuanto a las dimensiones los arreglos se pueden clasificar:
Unidimensional o vectores: un solo índice Bidimensional o matriz: dos índices Multidimensional: más de dos índices
Un arreglo unidimensional es un tipo de datos estructurado que está formado de una colección finita y ordenada de datos del mismo tipo. Es la estructura natural para modelar listas de elementos iguales.
El tipo de acceso a los arreglos unidimensionales es el acceso directo, es decir, podemos acceder a cualquier elemento del arreglo sin tener que consultar a elementos anteriores o posteriores, esto mediante el uso de un índice para cada elemento del arreglo que nos da su posición relativa.
La forma general de declaración de un arreglo unidimensional es:
Los arreglos tienen que declararse explícitamente para que el compilador pueda reservar espacio en memoria para ellos. En la declaración tipo declara el tipo base del arreglo, que es el tipo de cada elemento del arreglo. El valor de tamaño indica cuántos elementos mantendrá el arreglo. Por ejemplo, para declarar un arreglo de 100 elementos de tipo double denominado Notas se usa la instrucción:
Un elemento se puede acceder indexando el nombre del arreglo. Esto se hace colocando el índice del elemento entre corchetes justo detrás del nombre del arreglo. Por ejemplo,
asigna al elemento número 3 de Notas el valor 12.23.
En C, todos los arreglos tienen el 0 como índice de su primer elemento. Por
que tiene diez elementos, desde p[0] hasta p[9]. Por ejemplo, el siguiente programa carga un arreglo de enteros con los números desde el 0 hasta el 99:
C no comprueba los límites de los arreglos. Como programador, es tarea suya proporcionar una comprobación de límites cuando sea necesario. Por ejemplo, este código compilará sin errores, pero es incorrecto porque el bucle for hace que se sobrepase el final del arreglo XX
Estas funciones usan el archivo de cabecera estándar <string.h>. El siguiente programa ilustra el uso de estas funciones de cadenas:
Si se ejecuta este programa y se introducen las cadenas "hola" y "hola", la salida es
longitudes: 4 4 Las cadenas son iguales hola hola Ésta es una prueba o está en hola hola encontrado
Este tipo de arreglos al igual que los anteriores es un tipo de dato estructurado, finito ordenado y homogéneo. El acceso a ellos también es en forma directa por medio de un par de índices.
Los arreglos bidimensionales se usan para representar datos que pueden verse como una tabla con filas y columnas. La primera dimensión del arreglo representa las columnas, cada elemento contiene un valor y cada dimensión representa una relación.La representación en memoria se realiza de dos formas: almacenamiento por columnas o por renglones.
Para declarar un arreglo num de enteros bidimensional de tamaño 10,20 se escribirá
De forma similar, para acceder al punto 1,2 del arreglo d se escribirá
El siguiente ejemplo carga un arreglo bidimensional con los números del 1 al 12 y luego los imprime fila a fila.
La declaración anterior equivale funcionalmente a
Este también es un tipo de dato estructurado, que está compuesto por n dimensiones. Para hacer referencia a cada componente del arreglo es necesario utilizar n índices, uno para cada dimensión. C permite arreglos de más de dos dimensiones. La forma general de declaración de un arreglo multidimensional es:
Las operaciones en arreglos pueden clasificarse de la siguiente forma: Inicialización Lectura Escritura Asignación
Inicialización
C permite la inicialización de arreglos en el momento de declararlos. La forma general de inicialización de un arreglo, que aparece a continuación, es similar a la de otras variables:
La lista_de_valores es una lista de constantes separadas por comas cuyo tipo es compatible con el especificador_de_tipo. La primera constante se coloca
en la primera posición del arreglo, la segunda constante en la segunda posición, y así sucesivamente. Obsérvese que un punto y coma sigue a }.
En el ejemplo que sigue se inicializa un arreglo de enteros de 10 elementos con los números del 1 al 10:
Como se podrá suponer, resulta tedioso contar los caracteres de cada mensaje manualmente para determinar la dimensión correcta del arreglo. Se puede hacer que el compilador calcule automáticamente las dimensiones de los arreglos. Si en una instrucción de inicialización de un arreglo no se especifica el tamaño del arreglo, el compilador automáticamente crea un arreglo suficientemente grande para mantener todos los inicializadores presentes. Esto es lo que se denomina arreglo no delimitado.
Además de ser menos tedioso, el uso de la inicialización de arreglos no delimitados permite cambiar cualquiera de los mensajes sin temor a teclear una cuenta incorrecta accidentalmente. El uso de inicializaciones de arreglos no delimitados no está restringido a los arreglos unidimensionales.
Lectura
Este proceso consiste en leer un dato de un arreglo y asignar un valor a cada uno de sus componentes. La lectura se realiza de la siguiente manera: int n = 100; /* donde la variable n contiene la cantidad máxima que contendrá el arreglo*/ for (i=0;i < n-1; i++) scanf(“%d”,&arreglo[i]);
Cuando se inicializan arreglos multidimensionales se pueden añadir llaves para encerrar los inicializadores de cada dimensión. Esto se denomina agrupamiento subagregado. Por ejemplo, la declaración anterior se podría haber escrito también como:
Cuando se utiliza agrupamiento subagregado, si no se proporcionan suficientes inicializadores para un grupo dado, los restantes miembros se inicializan a cero automáticamente.
Para los arreglos multidimensionales se deben especificar todas excepto la dimensión más a la izquierda. (Las otras dimensiones se necesitan permitir al compilador de C indexar el arreglo adecuadamente.) De este modo se puede construir tablas de longitudes variables, y el compilador asignará automáticamente suficiente espacio para ellas. Por ejemplo, a continuación se muestra la inicialización del arreglo no delimitado cuads:
La ventaja de esta declaración sobre la versión de tamaño delimitado es que la tabla puede alargarse o acortarse sin tener que cambiar las dimensiones
Lectura
Este proceso consiste en leer un dato de un arreglo y asignar un valor a cada uno de sus componentes. La lectura se realiza de la siguiente manera: int n = 100; /* donde la variable n contiene la cantidad máxima que contendrá el arreglo*/ for (i=0;i < n-1; i++) { for (j=0;j < n-1; j++) { scanf(“%d”,&arreglo[i][j]); } } Escritura
Consiste en imprimir o mostrar por pantalla el valor de cada posición del arreglo. La escritura se realiza de la siguiente manera:
int n = 100; /* donde la variable n contiene la cantidad máxima que contendrá el arreglo*/ for (i=0;i < n-1; i++) { for (j=0;j < n-1; j++) { printf(“%d”,arreglo[i][j]); }
orden resultante de la comparación no sea correcto. El funcionamiento de este método se puede observar gráficamente a continuación:
Se tiene el siguiente arreglo a:
En la iteración 0 ocurriría lo siguiente: (^8 4 6 2) Se realiza intercambio 4 8 6 2
4 8 6 2 No se realiza intercambio 4 8 6 2
(^4 8 6 2) Se realiza intercambio 2 8 6 4
Vector inicial Vector resultante
En la iteración 1 pasaría lo siguiente:
(^2 8 6 4) Se realiza intercambio 2 6 8 4
(^2 6 8 4) Se realiza intercambio 2 4 8 6
Vector inicial Vector resultante
En la iteración 2 se tendría: (^2 4 8 6) Se realiza intercambio 2 4 6 8
Vector inicial Vector resultante
Implementación del método en C:
void intercambio( int a[], int n ) { int i, j , aux;
for (i=0;i < n-1; i++) for (j=i+1;j < n; j++) if( a[i] > a[j] ) { aux=a[i]; a[i] = a[j]; a[j] = aux; } }
observar gráficamente a continuación: considérese un arreglo a con 5 valores enteros:
51 21 39 80 35 Iteración 0 Seleccionar 21 e intercambiar 21 y a[0]
21 51 39 80 35 Iteración 1 Seleccionar 35 e intercambiar 35 y a[1]
(^21 35 39 80 51) Iteración 2 Seleccionar 39 e intercambiar 39 y a[2]
(^21 35 39 80 51) Iteración 3 Seleccionar 51 e intercambiar 35 y a[3]
(^21 35 39 51 80) Iteración 4 Lista ordenada Después de observar gráficamente el método se puede deducir lo siguiente: El método selecciona el elemento más pequeño de la lista a. Lo intercambia con el primer elemento a[0]. Ahora el valor más pequeño está en la primera posición del vector. Considerar las posiciones de la lista a[1], a[2], a[3],…, seleccionar el elemento más pequeño e intercambiarlo con a[1]. Ahora los dos valores más pequeños de a están en orden. Continuar este proceso encontrando o seleccionando el elemento más pequeño de los restantes intercambiarlos adecuadamente.
Implementación del método en C:
Por cada iteración se mueve hacia a la derecha del vector todos los elementos mayores que la posición a insertar, para dejar vacía esa posición. Insertar ele elemento en la posición correcta.
Implementación del método en C:
void insercion( int a[], int n ) { int i, j ,aux; for (i=1;i < n; i++) { j = i; aux=a[i]; while(j>0 && aux<a[j-1]) { a[j]=a[j-1]; j--; } a[j]=aux; } }
En la iteración 0 se tiene:
(^50 20 40 80 30) Intercambio 50 y 20
20 50 40 80 30 Intercambio 50 y 40
(^20 40 50 80 30) 50 y 80 ordenados
20 40 50 80 30 Intercambio 80 y 30
(^20 40 50 30 80) Elemento mayor es 80
En la iteración 1 se tiene: 20 40 50 30 80 20 y 40 ordenados
(^20 40 50 30 80) 40 y 50 ordenados
20 40 50 30 80 Intercambio 50 y 30
(^20 40 30 50 80) 50 y 80 elementos mayores ordenados
En la iteración 2 se tiene: (^20 40 30 50 80) 20 y 40 ordenados
20 40 30 50 80 Intercambio 40 y 30
20 30 40 50 80 40, 50 y 80 elementos mayores ordenados
En la iteración 3 se tiene: 20 30 40 50 80 20 y 30 ordenados
(^20 30 40 50 80) Lista ordenada