Sie sind auf Seite 1von 5

UNIVERSIDAD NACIONAL MAYOR DE SAN MARCOS

Facultad de Ingeniería de Sistemas e Informática


Curso: Algorítmica I
Prof. G. A. Salinas A.
S06 Lab. Arreglos Unidimensionales
TEMA: Arreglos Unidimensionales.
 Implementación de una aplicación en C
 Construcciones de algoritmos con funciones en C
 Mejorar soluciones planteadas
DURACIÓN ESTIMADA : 01:40 horas.
I. OBJETIVOS
El presente laboratorio tiene por objetivos:
 Construir una Aplicación con las especificaciones de las operaciones (subprogramas)
 Implementar los subprogramas de acuerdo a las especificaciones para ejecutar operaciones básicas de
arreglos unidimensionales.
o Aplicar y reconocer funciones, procedimientos y predicados.
o Aplicar y reconocer parámetros por valor (datos de entrada).
o Aplicar y reconocer parámetros por referencia (datos de entrada, salida o entrada/salida).
 Aplicación a problemas concretos.
II. RESUMEN
En esta práctica usted implementa una Aplicación las operaciones básicas de un arreglo unidimensional
utilizando subprogramas.
III.CONSTRUCCION DE LA APLICACIÓN
1. Implemente los siguientes programas en C y comente las líneas de código no comprendidas consultando al
profesor.

#include <…> void mostrarVector(int x[], int dx)


#define Max 10 {
' using namespace std; int i, val;
void crearVector(int x[], int *dx); if(dx>0){
void leerVector(int x[], int *dx); printf("vector = < ");
void mostrarVector(int x[], int dx); for(i=0;i<dx;){
int main() val=x[i];
{ printf("%d ", val);
int a[MAX]; i=i+1;
int na, nb; }
crearVector(a, &na); printf(">\n");
leerVector(a, &na); }
mostrarVector(a, na); else{
system("pause"); printf("Vector vacioooo...!\n");
return(0); }
} }
void crearVector(int x[], int *dx) void ordenarVector(int x[], int dx)
{ {
*dx=-1; int aux, i, j;
} if(dx>-1){
void leerVector(int x[], int *dx) for(i=0; i<dx-1; i++){
{ for(j=i+1; j<dx; j++){
int i, n, val; if(x[i]>x[j]){
scanf("%d", &n); aux=x[j];
if(n<MAX){ x[j]=x[i];
for(i=0;i<n;){ x[i]=aux;
scanf("%d", &val); }
x[i]=val; j=j+1;
i=i+1; }
} i=i+1;
*dx=i;//Actualizac de la dimension }
} }
else{ else{
printf("Diemnsion fuera de RANGO ..."); printf("Vector vacioooo...!\n");
} }
} }

1
En los siguientes ejercicios, diseñe, especifique e implemente según sea caso.
Tengan presente cualquier resolución requiere primero hacer el análisis, el diseño y luego la especificación, sin
necesidad de pensar todavía en el cómo va ser el algoritmo, con esto tenemos una idea clara de lo que se
quiere, si se desea construir una casa, el ingeniero primero analiza el contexto, diseña, especifica y luego
construye, valore la importancia de cada uno de los pasos.

2. Implemente en lenguaje C la siguiente especificación insertar un elemento por posición:


Solucion:
Diseño. Una idea básica acerca de los datos de entrada, datos de salida y modulos a utilizar o reutilizar.

x={ } o x={dato}
x={e1, e2,…,en} x={e1, e2,…dato, …,en}
dato, pos

mostrarVector(x, dx)

Especificacion. Consiste en especificar las condiciones que deben cumplir los datos de entrada para
obtener los datos salida.
ACCION insertarxPosic(Vector x, ENTERO dx, ENTERO pos, TD dato)
//Inserta el elemento dato en la posición pos del vector X
PRE: x = < >  x = <e1, e2 ...,en>  pos [0, n+1] donde n = dx-1
POS: x = <dato >  x = <e1, e2 ...,dato, ...en+1>

Implementación: Se debe implementar de acuerdo a la especificación, las precondiciones se convierten


generalmente en consistencias para asegurar la salida y se debe hacer pruebas para que funcione en todos
los casos, por ejemplo sea vector:
Debemos probar para los valores de la posición pos: 0, 1 3, 7, 8, 9 es la posición del usuario, debemos
trabajar con (pos-1), para todas estas posiciones debe insertar dato en el vector. Y NO DEBE INSERTAR
para los valores de la posición pos negativos ni superiores a nueve. Si pasa estas pruebas podríamos decir
que nuestro subprograma funciona adecuadamente.

0 1 2 3 4 5 6 7

12 5 2 8 19 3 2 6

//Inserta el elemento dato en la posición pos del vector X


void insertarxPos(int x[], int *dx, int posi, int dato)
{
int i, n;
n = *dx;
n = n + 1;//
i = *dx;
if(n<MAX){
if(posi-1>-1 && posi-1<*dx){
*dx=n;
while(i>posi-1){
x[i] = x[i-1];
i = i-1;
}
x[posi-1]=dato;
printf("\nDato %d INSERTADO en posicion %d \n\n ", dato, posi);
mostrarVector(x, *dx);
}
else{
printf("La posicion %d no existe en el vector...\n", posi);

2
}
}
else{
printf("Dimension fuera de rango ...\n");
system("pause");
}
}

3. Implemente en lenguaje C la siguiente especificación eliminar un elemento de una posición del vector:
ACCION eliminarxPosic(Vector x, ENTERO dx, TD pos)
//Ellimina el elemento de la posición pos del vector X
PRE: x = < >  x = <e1, e2 ...,en>  pos [0, n] donde n = dx-1
POS: Msge =”Vector vacio…”  x = <e1, e2 ..., en-1>
Solucion:
//Ellimina el elemento de la posición pos del vector x

4. Implemente en lenguaje C la siguiente especificación ordenar vector:


ACCION ordenarVector(Vector x[], ENTERO dx)
//Ordena los elementos del vector X en forma ascendente
PRE: x = < >  x = <e1, e2 ..., ei , ..., en>
POS: Msge =”Vector vacio…”  x = <e1, e2 ..., ei , ..., en>  i  [0, dx-1] ei - 1,<= ei <= ei + 1
Solución:
// Ordena los elementos del vector X en forma ascendente
void ordenarVector(int x[], int dx)
{
int aux, i, j;
if(dx>-1){
for(i=0; i<dx-1; i++){
for(j=i+1; j<dx; j++){
if(x[i]>x[j]){
aux=x[j];
x[j]=x[i];
x[i]=aux;
}
j=j+1;
}
i=i+1;
}
}
else{
printf("Vector vacioooo...!\n");
}
}

5. Se tienen dos números muy grandes( mas de 500 dígitos) hallar la suma de dichos números. Implemente
reutilizando las operaciones necesarias , complete la solución:
ACCION SumaDigitos(Vector x, ENTERO dx, Vector y, ENTERO dy, Vector Z, ENTERO *dz)
// Suma 2 números almacenados en los vectores X y Y y la suma lo almacena en Z
PRE: ¿…?
POS: ¿…?
Implementación:

6. Implemente en lenguaje C la siguiente especificación buscar la posición de un elemento en el vector:


ACCION buscarDato(Vector x, ENTERO dx, TD dato)
//Busca el elemento dato y retorna V y la posición que ocupa en el vector X y F en otro caso
PRE: x = < >  x = <e1, e2 ...,en>  dato  x[ ]
POS: Msge =”Vector vacio…”  x, posición  [0, dimX-1]  F

3
7. Implemente en lenguaje C la siguiente especificación buscar la posición de un elemento en el vector:
ACCION buscarDato1(Vector x, ENTERO dx, TD dato)
//Busca el elemento dato y retorna la posición que ocupa o debe ocupar en el vector X
PRE: x = < >  x = <e1, e2 ...,en> / e1< e2< ...,<en  dato  x[ ]
POS: Si dato <= e1 , pos=0  Si dato >= e1 pos=dx  Si dato  [e1, en] pos  <0, dx>

8. Implemente en lenguaje C la siguiente especificación insertar un dato reutilizando las operaciones


anteriores buscar e insertar por posición:
ACCION insertarxValor(Vector x, ENTERO dx, ENTERO dato)
//Inserta el elemento dato en la posición adecuada en el vector X Utiliza buscar e insertar por posición.
PRE: x = < >  x[ ] = <e1, e2 ...,en>  dato  <e1, en>
POS: x : < dato, e1, e2 ..., en+1>  <e1, e2 ...,dato, ...en+1>  <e1, e2 ..., en , dato >

9. Implemente en lenguaje C la siguiente especificación editar un dato reutilizando las operaciones anteriores
ACCION editarxValor(Vector x, ENTERO dx, ENTERO dato)
//Edita el elemento dato del vector x
PRE: x = < >  x = <e1, e2 ...,en>  dato  [e1, en]
POS: “Vector vacioooo..”  x = <e1, e2 ..., en>

10. Implemente en lenguaje C la siguiente especificación eliminar un dato reutilizando las operaciones
anteriores buscar y eliminar por posicion:
ACCION eliminaxValor(Vector x, ENTERO dx, ENTERO dato)
//Elimina el elemento dato del vector X
PRE: x = < >  x = <e1, e2 ...,en>  dato  [e1, en]
POS: “Vector vacioooo..”  x = <e1, e2 ..., en-1>

Solución modular: Analice, diseñe, especifique e implemente:


11. Construya un subprograma que permite adicionar un elemento al final del vector.
12. Construya un subprograma que permite leer o ingresar datos en forma ordenada a un vector reutilizando
subprogramas ya implementados.
13. Construya un subprogramas que permita eliminar de elementos sin desplazamiento de elementos y un
subprograma que permita administrar adecuadamente los espacios libres.
14. Escribir un programa que calcule el producto escalar de dos vectores. Si a y b son los vectores y n su
tamaño, el producto escalar se calcula como la sumatoria de a( i )*b( i )
15. Escribir un programa que devuelva el mínimo y el máximo de los elementos de un vector.
16. Hallar la suma de los elementos de dos vectores no necesariamente del mismo tamaño Por ejemplo
A=<1,2,3>, B=<5,6,7,8,9>, C=A+B=<6,8,10,8,9>
17. Implemente una aplicación para las operaciones básicas de un conjunto de enteros.
18. Se tiene un vector de enteros con muchos elementos repetidos, implemente un subprograma para eliminar
los elementos repetidos, no esta permitido el uso de vectores auxiliares. Atajo: analice que funciones
puede reutilizar.
19. Implemente un subprograma llamado secuencia que realice la búsqueda de la secuencia en orden creciente
más larga dentro de un vector de enteros. El subprograma debe devolver tanto la posición del primer
componente como el tamaño de la misma. Por ejemplo A=<9, 1, 4, 7, 6 8, 11,1,4, 5> Salida: posición =2
tamaño: 4 (1,4,7,11).
20. Dado un vector de números enteros no ordenados, escriba un subprograma que ordene los elementos del
vector de tal forma que los números pares aparezcan antes que los números impares. Además, los números
pares deberán estar ordenados de forma ascendente, mientras que los números impares deberán estar
ordenados de forma descendente. Esto es, sea el vector A=<1,2,3,4,5,6,7,8> quedará como
R=<2,4,6,8,7,5,3,1>.

4
21. Se tiene los siguientes algoritmos, analice, determine la traza y diga lo que hace e implemente en lenguaje
C aplicando las buenas practicas, y luego implemente la versión con la estructura de control PARA/for

ACCION xxx (ENTERO x[], ENTERO dimx) ACCION yyy (ENTERO x[], ENTERO dimx)
ENTERO i ← 0, j, min ENTERO i ← 1, j, min
MIENTRAS (i < dimx) MIENTRAS (i < dimx)
min ← i J ← dimx
J ←i+1 MIENTRAS (j < i)
MIENTRAS (j < dimx) SI(x[j] < x[j-1])
SI(x[j] < x[min]) Intercambia(x[j], x[j-1] )
min ← j FIN_SI
FIN_SI j ←j+1
j ←j+1 FIN_MIENTRAS
FIN_MIENTRAS i ←i+1
Intercambia(x[i], x[min ] ) FIN_MIENTRAS
i ←i+1 FIN_ACCION
FIN_MIENTRAS
FIN_ACCION

22. El ordenamiento por mezcla consiste partir el vector por la mitad, ordenar la mitad izquierda, ordenar la
mitad derecha y mezclar las dos mitades ordenadas en un vector ordenado (no utilizar métodos
ordenamiento). Dado el algoritmo analice, determine la traza e implemente en lenguaje C completando
adecuadamente. La interpretación del algoritmo es parte de la pregunta.

ACCION mezclar(dat, izqp, izqu, derp, deru) MIENTRAS( izqa <= izqu)
izqa ← izqp temporal[ind] ← arreglo[izqa]
dera ← derp izqa ← izqa + 1
ind ← izqp ind ← ind +1
MIENTRAS ((izqa <= izqu) y (dera <= deru)) FIN_MIENTRAS
SI (arreglo[izqa] < dat[dera] ) MIENTRAS( dera <= deru )
temporal[ind] <- arreglo[izqa] temporal[ind] <=dat[dera]
izqa ← izqa + 1 dera ← dera + 1
SINO ind ← ind + 1
temporal[ind] <- arreglo[dera] FIN_MIENTRAS
dera ← dera + 1 PARA ind ← izqp HASTA deru
FIN_SI arreglo[ind] ← temporal[ind]
ind ← ind +1 ind ← ind + 1
FIN_MIENTRAS FIN_PARA
FIN_ACCION

23. Implemente los métodos de ordenamiento interno –Capitulo 8- del libro de Osvaldo Cairo de Estructura
de Datos.

Referencias bibliográficas básicas.

Joyanes Aguilar, Luis y Zahonero Martinez, Ignacio (2004). Programación en C, metodología, Algoritmos,
estructura de datos y objetos.McGraw-Hill, 4ta Edicion, Madrid España.

Joyanes Aguilar, Luis (2008). Fundamentos de la Programación Algoritmos y estructura de datos y


objetos.McGraw-Hill, 4ta Edición, Madrid España.

Osvaldo Cairo (2008) Estuctura de Datos. Ed McGraw-Hill. Mexico DF.

Das könnte Ihnen auch gefallen