Docente:
Ing. Walter Zelaya
Instructor:
Job Acosta
Alumnos:
Arias Argueta, Ernesto Alonso AA17001
Guzmán Azúcar, Elvin Javier GA15008
Reyes Ruano, José Miguel RR15057
Rodríguez Gonzales, José Roberto RG17012
GL: 06
OBTETIVO ESPECÍFICO
Utilizar arreglos para la solución de problema.
Relacionar punteros con arreglos
Utilizar los arreglos en ANSI C para poder resolver problemas de
diversa índole.
Conocer las características principales de los arreglos.
ARREGLO
Es una colección de datos del mismo tipo. Sirve para manejar un número “n”
de elementos en común.
Ordenaciones en Arreglos
Selección directa
int n[10]={32, 27, 64, 18, 95, 24, 90, 70, 8, 3};
int n[10]={0};
Si en una declaración on con una l ista inicializadora se omite el tamaño del
arreglo el numero de elementos del arre lo ser a el numero de elementos
incluidos en la lista inicializadora.
Por ejemplo
int a1 [] ={1,2,3,4,5};
Operaciones frecuentes:
Recorrido de un arreglo de tamaño n: El indice puede ir del primero al ultimo
elemento:
for (i=0; i<n; i++)
{ proceso
}
Los punteros son variables cuyo valor es una dirección de memoria. Así, si
tenemos uno cuyo valor es 1234, decimos que apunta a la dirección 1234.
Como cualquier variable, un puntero está almacenado en una dirección de la
memoria, que además es distinta de aquella a la que apunta. En esta imagen
tenemos un puntero localizado en la dirección
1000, que hace referencia, o apunta, a la dirección 1234:
// C
int *ptr = malloc(numBytes);
// C++ int *ptr = new
int[numElementos];
int arreg[4];
Tanto los arreglos como los punteros son lo que se conoce como tipos
derivados, porque se forman a partir de otros tipos. De esta manera
tenemos, por ejemplo, punteros a int, punteros a float, punteros a char,
arreglos de 4 int, arreglos de 4 float, arreglos de 6 int, etc.
arreg
&arreg[0]
ptr[4] = 15;
Antes de seguir, vamos a dejar algo en claro: cuando se dice que el nombre
del arreglo sin índices se convierte a puntero, nos referimos a un puntero
"conceptual". Aclaro esto porque se podría pensar que el compilador añade
punteros para cada uno de los arreglos que declaramos, lo cual no ocurre.
Sería un desperdicio de memoria, ya que los punteros, como cualquier otra
variable, ocupan espacio. Veremos a continuación lo que en realidad ocurre.
PROCEDIMIENTO
Programa B:
1. int main ( int argc, char * argv[ ] )
2. {
3. float A [ MAX ];
4. int indice = 0, p;
5. do if ( indice >= 8 ) break ;
6. else scanf ( "%f", & A [ indice++ ] );
7. while ( getchar ( ) != EOF ) ;
8. printf("\nIndice Dato Direccion\n" );
9. for ( p = 0 ; p < indice ; p++ ) 10. printf ( "%4d%14.3g %10x\n", p, A [ p ], &
A[ p ] );
11. return 0;
12. }
PARTE 2. Lectura desde archivo.
/* Con este programa se trata de mostrar como asignar datos desde el un
archivo a un arreglo. Recordar que JAMAS se debe sobre pasar la capacidad
del arreglo y por eso se utiliza el break. */
1. #include <stdio.h>
2. #define MAX 20 //Limite del arreglo
3. int main ( int argc, char * argv[ ] )
4. {
5. float A [ MAX ];
6. int indice = 0, p;
7. FILE *f;
8. if ( argc != 2 ) exit ( 1 );
9. else
10. {
11. f = fopen( argv[ 1 ], "r" );
12. for ( indice = 0; indice < MAX; indice++ )
13. fscanf( f, "%f", A + indice );
14. printf ( "\n\n\nIndice Dato Direccion\n" );
15. for ( p = 0 ; p < indice ; p++ ) 16. printf ( "%4d%14.3g %10x\n", p, *(A + p),
A + p );
17. } // fin if else
18. return 0;
19.}
Una solución sin punteros, es cambiando las siguientes líneas:
13. fscanf( f, "%f", & A[ indice ] ); 16. printf ( "%4d%14.3g %10x\n", p, A [ p ],
& A[ p ] );
PARTE 3. Método de la burbuja.
/* Este programa ordena un arreglo de mayor a menor utilizando el método
de la burbuja. */
#include <stdio.h>
#include <stdlib.h>
#define MAX 50
int main ( int argc, char * argv[ ] ) {
float A[ MAX ];
int indice, pasada, temp;
FILE *f;
if ( argc != 2 ) exit ( 1 );
else
{
f = fopen( argv [ 1 ], "r" );
for ( indice = 0 ; indice < MAX ; indice++ )
fscanf( f , "%f", A + indice );
printf ("\n\n Arreglo original\n\n");
for ( indice = 0 ; indice< MAX ; indice++ )
if ( !( indice % 10 ) ) printf ( "\n" );
else printf( "%8g ", * ( A + indice ) );
for ( pasada = 1 ; pasada < MAX ; pasada++ )
for ( indice = 0 ; indice < MAX-1 ; indice++ )
if ( A[ indice ] > A[ indice + 1 ] )
{
temp = A[ indice ] ;
A[ indice ] = A[ indice + 1 ];
A[ indice + 1 ] = temp;
}
printf ("\n\n Arreglo ordenado\n\n");
for ( indice= 0 ; indice < MAX ; indice++ )
if ( !( indice % 10 ) ) printf ( "\n" );
else printf( "%8g ", * ( A + indice ) );
fclose( f );
printf("\n");
}
return 0;
}
ASIGNACIÓN
1. Utilizar el método de la burbuja, para ordenar un arreglo de números
reales y que se impriman de mayor a menor.
#include <stdio.h>
int main () {
int k=0,n,bandera;
float temp,A[20];
printf("Introduzca el número de datos, máximo 20: ");
scanf("%i",&n);
scanf("%f",&A[k]); }while(++k<n);
do{ k=0;bandera=0;
do{ if(A[k]>A[k+1]) {
temp=A[k];
A[k]=A[k+1];
A[k+1]=temp;
bandera=1; }
k++; }
while(k<n-1); }
while(bandera==1);
k=n-1;
return 0;
}
2. Guardar en un arreglo los primeros 50 números primos, y después
estos datos poder guardarlos en un archivo local.
#include <stdio.h>
int main () {
int prim[50], i=0,counter=0 , k=3,a;
FILE *fp;
prim[0]=2;
fp = fopen("/home/jose/primes.txt", "w");
fprintf(fp,"%i) %i\n",counter+1,prim[counter]);
do{ do{ a=k%prim[i]; i++; }while (!(a==0) & i<counter);
if (!(a==0)) { counter++;
prim[counter]=k; fprintf(fp,"%i)
%i\n",counter+1,prim[counter]);
} k++; i=0;
}while (counter<49);
return 0;
}
3. Utilizando arreglos y la regla del trapezoidal encontrar el área bajo la
curva. Elegir una función matemática y leer desde el teclado n, xo, xn.
#include <stdio.h>
#define DIM 500
int main (int argc, char * argv[]) {
int N,n,C;
float F [DIM], AR = 0.0, A, B;
printf ("\n Intro cantidad de subintervalos: ");
scanf ("%d", &N);
printf ("\n Intro Xo y Xn ");
scanf ("%f%f", &A, &B);
puts ("\n");
for ( C=0; C<N+1; C++) {
printf("f(%d) = ", C);
scanf ("%f", F+C);
}
AR= F[0]+ F[n];
for ( C=1; C<N; C++) {
AR+= 2.*F[C];
AR*=(B-A)/2./N;
}
printf("\n El area bajo la curva es %f\n\n\n", AR);
return 0;
}
4. En un arreglo de 80 elementos asignar los números de Bernoulli. Es
decir que en el primer elemento deberá estar B1 en se segundo
elemento B2 y así sucesivamente. Además se debe imprimir en un
archivo en forma de tabla.
#include <stdio.h>
#define pi 3.14159265358979323846
#define E 0.000000000000001
int main(){
double mul,B[80],sum,temp;
int n=1,j=0,k=2;
FILE *fp;
fp = fopen("/home/jose/bernoulli.txt", "w");
double fac(int n){ int i; double fac=n;
for(i=n-1;i>1;i--){ fac=fac*i;
}
return fac;
}
double pot(double x, int k){ int i; double pote=x; for (i=1;i<k;i++){
pote=pote*x;
}
return pote; }
do{ sum=1;temp=0;k=2;
mul=(fac(2*n))/(pot(2,(2*n-1))*pot(pi,2*n));
do{ sum=sum+temp;
temp=1.0/pot(k,2*n);
k++;
}
while(temp>E);
B[j]=sum*mul; j++; n++;
}while(j<80); j=0;
do{
fprintf(fp,"B%i\t %E\t B%i\t %E\t B%i\t %E\t B%i\t
%E\n",j+1,B[j],j+21,B[j+20],j+41,B[j+40],j+61,B[j+60]);
/* Para que los datos queden uniformes, de manera que se vea parecido
a una tabla,
limitamos la cantidad de dígitos con ayuda del formato de notación
científica*/
j++; }
while (j<20);
return 0;
}
5. Por medio de un programa escrito en ANSI C guardar en un arreglo
los primeros 100 términos de la siguiente serie.
#include <stdio.h>
#define IT 100.0
int main ()
{
float A=1.0, B, C, D, E, F, SUM=0.0;
float N=1.0, DEN=2.0, POT=1.0, a, x, G;
printf("Introduzca el valor de a: ");
scanf("%f",&a);
printf("Introduzca el valor de x: ");
scanf("%f", &x);
E= a/x;
for (G=0.0; G<IT; G++){
D= a/x;
B= NUM/DEN;
A*=B;
E= E*D*D;
C= E/(POT*POT);
F= A*C;
SUM+= F;
NUM+=2.0;
DEN+=2.0;
POT+=2.0;
}
SUM= (SUM+D)*(-1.0);
printf("La suma de los 100 terminos guardados es: %f\n", SUM);
return 0;
}
CONCLUSIÓN
Se puede decir que los arreglos pueden variar dependiendo sus dimensiones
estos pueden ser unidimensionales y bidimensionales; a los primeros se les
conoce como vectores y como su nombre lo indica poseen una dimensión o
una lista de datos del mismo tipo y los bidimensionales poseen dos
dimensiones se usan para representar datos que pueden verse como una
tabla con filas y columnas y se les conoce como matrices