Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad

Programación en C: Arreglos y Programación Modular, Ejercicios de Informática

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

2023/2024

Subido el 24/02/2024

santiago-barreto-9
santiago-barreto-9 🇻🇪

1 documento

1 / 37

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
Tema N° 3.- Arreglos y Programación Modular
Recopilado por: MSc. Leonardo Javier Malavé Quijada
Unidad Curricular: Algorítmica y Programación. Trayecto I. Período I-22 Página 1
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.
Aquí desarrollaremos los siguientes ítems:
Arreglos
Unidimensionales
Cadenas
Bidimensionales
Arreglo de Cadenas
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25

Vista previa parcial del texto

¡Descarga Programación en C: Arreglos y Programación Modular y más Ejercicios en PDF de Informática solo en Docsity!

Recopilado por: MSc. Leonardo Javier Malavé Quijada

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.

Aquí desarrollaremos los siguientes ítems:

 Arreglos

 Unidimensionales

 Cadenas

 Bidimensionales

 Arreglo de Cadenas

Recopilado por: MSc. Leonardo Javier Malavé Quijada

 Multidimensionales

 Operaciones con Arreglos Unidimensionales

 Inicialización

 Lectura

 Escritura

 Asignación

 Operaciones con Arreglos Bidimensionales

 Inicialización

 Lectura

 Escritura

 Asignación

 Rutinas de Ordenamiento

 Intercambio

 Selección

 Inserción

 Burbuja

 Rutinas de Búsqueda

 Secuencial

 Binaria

Recopilado por: MSc. Leonardo Javier Malavé Quijada

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

Arreglos Unidimensionales

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:

tipo nombre_de_variable[tamaño];

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:

double Notas[100];

Recopilado por: MSc. Leonardo Javier Malavé Quijada

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,

Notas[3] = 12.23;

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

tanto, cuando se escribe char p[10]; se está declarando un arreglo de caracteres

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:

#include <stdio.h>

int main(void)

int x[100]; /* esto declara un arreglo de 100 elementos enteros •/

int t;

/* mostrar el contenido de x */

for(t=0; C<100; t++)

x[t]=t; printf("%d ", x[t];

return 0;

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

int XX[50 ]; for(i=0; i<100; i++) XX[i]= i;

Recopilado por: MSc. Leonardo Javier Malavé Quijada

Estas funciones usan el archivo de cabecera estándar <string.h>. El siguiente programa ilustra el uso de estas funciones de cadenas:

#include <stdio.h>.

#include <string.h>

int main(void)

char c1[80],c2[80] ;

gets(c1);

gets(c2);

printf("longitudes: %d %d\n", strlen(c1), strlen(c2));

if (strcmp(c1, c2)==0) printf("Las cadenas son iguales\n") ;

strcat(c1, c1);

printf("%s\n",c1) ;

strcpy(c1, "Ésta es una prueba.");

printf (c1) ;

if(strchr("hola", 'o')) printf("o está en hola\n");

if(strstr("hola amigos", "hola")) printf("hola encontrado");

return 0;

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

Arreglos Bidimensionales

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.

Recopilado por: MSc. Leonardo Javier Malavé Quijada

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á

int num[10] [20];

De forma similar, para acceder al punto 1,2 del arreglo d se escribirá

num[1][2]

El siguiente ejemplo carga un arreglo bidimensional con los números del 1 al 12 y luego los imprime fila a fila.

#include <stdio.h>

int main(void)

int t, i, num [3][4];

for (t=0; t<3; ++t)

for(i=0; i<4; ++i)

num [t][i]=(t*4)+ i + 1;

/* ahora imprimirlos */

for (t=0; t<3; ++t)

for(i=0; i<4; ++i)

printf ("%3d ", num[t] [i] ) ;

printf("\n");

return 0;

Recopilado por: MSc. Leonardo Javier Malavé Quijada

La declaración anterior equivale funcionalmente a

gets(&arreglo_cad[2][0]);

Arreglos Multidimensionales

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:

tipo nombre [Tamaño1][Tamaño2][Tamaño3]...[TamañoN];

Operaciones con Arreglos Unidimensionales

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:

especificador_de_tipo nombre_de_arreglo [tamaño1 ]...[tamaño N]=

{lista_de_valores};

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

Recopilado por: MSc. Leonardo Javier Malavé Quijada

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:

int i[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

Inicialización de arreglos no delimitados

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.

char mensaje[26] = “Bienvenido al Sistema”;

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]);

Recopilado por: MSc. Leonardo Javier Malavé Quijada

int cuads[10] [2] = {

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:

int cuads[10][2] = {

Cuando se utiliza agrupamiento subagregado, si no se proporcionan suficientes inicializadores para un grupo dado, los restantes miembros se inicializan a cero automáticamente.

Inicialización de arreglos no delimitados

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:

Recopilado por: MSc. Leonardo Javier Malavé Quijada

int cuads[] [2] = {

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

del arreglo.

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]); }

Recopilado por: MSc. Leonardo Javier Malavé Quijada

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;

Recopilado por: MSc. Leonardo Javier Malavé Quijada

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

2. Ordenación por selección: El funcionamiento de este método se puede

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:

Recopilado por: MSc. Leonardo Javier Malavé Quijada

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

  1. Ordenación por burbuja: es el más conocido y popular de todos por su facilidad de entender, pero es el más ineficiente y por ello, normalmente se aprende su técnica pero no suele usarse. Se denomina burbuja porque los valores más pequeños del arreglo suben a la cima del mismo, de manera similar a como suben las burbujas en el agua, mientras que los valores mayores se hunden en la parte inferior del arreglo. El funcionamiento de este método se puede observar gráficamente a continuación sea a el siguiente arreglo:

En la iteración 0 se tiene:

Recopilado por: MSc. Leonardo Javier Malavé Quijada

(^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