informe dsp

9
Informe Practica 0 Sergio Liberati Laboratorio de procesamiento digital de se˜ nales Profesor: Carlos Mejias 8 de diciembre de 2015 Resumen En esta practica se explicaran y demostraran las metodolog´ ıas necesarias para rea- lizar operaciones como descomposici´ on de n´ umeros enteros para distintos procesos, uso de operadores comparativos y modelaci´ on de Series o Sucesiones mediante procesos Computables. 1. Introducci´ on Al realizar una demostraci´ on de la versatilidad que presentan los procedimientos asicos realizables por el lenguaje C, quedar´ a expuesta la potencia y fiabilidad de es- te. Yendo desde descomposici´on de n´ umeros hasta sucesiones, pasando incluso por los amigables n´ umeros primos que todos conocemos desde muy peque˜ nos, vali´ endonos de los operadores mas b´ asicos disponibles en C, se realizaran distintos experimentos que demostraran la utilidad y con fiabilidad que nos dispone el lenguaje C 2. Metodolog´ ıa Empleada A continuaci´on se presentaran los Algoritmos ( y explicaci´ on matem´atica) emplea- dos para la realizaci´ on de tres experimentos: N´ umeros Primos, Numeros Romanos y Secuencia de Fibonacci. 2.1. Algoritmo de N´ umeros Primos 2.1.1. Muestradec´odigos 1

Upload: sergio-liberati

Post on 29-Jan-2016

2 views

Category:

Documents


0 download

DESCRIPTION

Dsp, C programming

TRANSCRIPT

Page 1: informe Dsp

Informe Practica 0Sergio Liberati

Laboratorio de procesamiento digital de senalesProfesor: Carlos Mejias

8 de diciembre de 2015

Resumen

En esta practica se explicaran y demostraran las metodologıas necesarias para rea-lizar operaciones como descomposicion de numeros enteros para distintos procesos, usode operadores comparativos y modelacion de Series o Sucesiones mediante procesosComputables.

1. Introduccion

Al realizar una demostracion de la versatilidad que presentan los procedimientosbasicos realizables por el lenguaje C, quedara expuesta la potencia y fiabilidad de es-te. Yendo desde descomposicion de numeros hasta sucesiones, pasando incluso por losamigables numeros primos que todos conocemos desde muy pequenos, valiendonos delos operadores mas basicos disponibles en C, se realizaran distintos experimentos quedemostraran la utilidad y con fiabilidad que nos dispone el lenguaje C

2. Metodologıa Empleada

A continuacion se presentaran los Algoritmos ( y explicacion matematica) emplea-dos para la realizacion de tres experimentos: Numeros Primos, Numeros Romanos ySecuencia de Fibonacci.

2.1. Algoritmo de Numeros Primos

2.1.1. Muestra de codigos

1

Page 2: informe Dsp

#include<s t d i o . h>void main ( void ){int num [ 1 0 0 ] ;int i , j ;for ( i =1; i <=100; i++)// se carga e l v e c t o r num[100 ] con l o s//numeros d e l 1 a l 100{ num[ i−1]= i ; }for ( i =1; i <=99; i ++){i f (num[ i ] !=0){for ( j=i +1; j <=99; j++){i f ( (num[ j ] % num[ i ])==0){num[ j ]=0;}}}}p r i n t f ( ”\n Primos de l 1 a l 100\n” ) ;for ( i =1; i <=100; i ++){i f (num[ i −1]!=0){p r i n t f ( ” %d ” ,num[ i −1 ] ) ;}}}

2.1.2. Calculos Matematicos

esto es una prueba calculoEl calculo de numeros primos es una de las principales utilidades del lenguaje C

(desde el punto de vista de una programacion sencilla) ya que facilmente podremosconseguir los primeros 5000 numeros primos (por ejemplo).

A pesar que este procedimiento puede lograrse de distintas maneras (distintos Al-goritmos), utilizaremos un metodo que implica un vector con los numeros del 1 al 100y una comparacion elemento a elemento.

Consiste en tener un vector v[100] donde v[0] = 1, v[1] = 2, v[2] = 3...v[99] =100...v[n] = n + 1 (sabiendo que en C, la primera entrada de un vector v[] es v[0]).

El cual mediante un ciclo for se ira comparando elemento a elemento, donde todoaquel numero divisible (con residuo 0) por uno menor a el sera descartado por ser unnumero no primo.

De esta manera pueden conseguirse los numeros primo que hay entre el 1 y el 100, sinembargo este procedimiento se puede emplear para numeros superiores a 100 (inclusosuperiores a 5000 como ejemplificamos al comienzo).

2

Page 3: informe Dsp

2.2. Algoritmo de Conversion Numeros en Base Decimal a NomenclaturaRomana

2.2.1. Muestra de codigos

#include<s t d i o . h>void romano ( int n ) ; // so l o puede c a l c u l a r l o s numeros// romanos d e l 1 a l 3999int main ( void ){int num;s can f ( ” %d” ,&num ) ;p r i n t f ( ” e l va l o r de %d en romano es ” ,num ) ;i f (num==1000)p r i n t f ( ”M” ) ;elseromano (num ) ;return 0 ;}

void romano ( int n){int a , b , c , d ;d=n /1000 ;c=(n %1000)/100;b=(n %100)/10;a=(n %100) %10;

switch (d){case 3 :p r i n t f ( ”MMM” ) ;break ;case 2 :p r i n t f ( ”MM” ) ;break ;case 1 :p r i n t f ( ”M” ) ;break ;}

switch ( c ){case 9 :p r i n t f ( ”CM” ) ;break ;

3

Page 4: informe Dsp

case 8 :p r i n t f ( ”DCCC” ) ;break ;case 7 :p r i n t f ( ”DCC” ) ;break ;case 6 :p r i n t f ( ”DC” ) ;break ;case 5 :p r i n t f ( ”D” ) ;break ;case 4 :p r i n t f ( ”CD” ) ;break ;case 3 :p r i n t f ( ”CCC” ) ;break ;case 2 :p r i n t f ( ”CC” ) ;break ;case 1 :p r i n t f ( ”C” ) ;break ;}

switch (b){case 9 :p r i n t f ( ”XC” ) ;break ;case 8 :p r i n t f ( ”LXXX” ) ;break ;case 7 :p r i n t f ( ”LXX” ) ;break ;case 6 :p r i n t f ( ”LX” ) ;break ;case 5 :p r i n t f ( ”L” ) ;break ;case 4 :

4

Page 5: informe Dsp

p r i n t f ( ”XL” ) ;break ;case 3 :p r i n t f ( ”XXX” ) ;break ;case 2 :p r i n t f ( ”XX” ) ;break ;case 1 :p r i n t f ( ”X” ) ;break ;}

switch ( a ){case 9 :p r i n t f ( ”IX” ) ;break ;case 8 :p r i n t f ( ” VIII ” ) ;break ;case 7 :p r i n t f ( ” VII ” ) ;break ;case 6 :p r i n t f ( ”VI” ) ;break ;case 5 :p r i n t f ( ”V” ) ;break ;case 4 :p r i n t f ( ”IV” ) ;break ;case 3 :p r i n t f ( ” IIV ” ) ;break ;case 2 :p r i n t f ( ”IV” ) ;break ;case 1 :p r i n t f ( ” I ” ) ;break ;}

5

Page 6: informe Dsp

}

2.2.2. Calculos Matematicos

La principal caracterıstica de este algoritmo es que tiene un alcance limitado (a nivelde computo) debido a que historicamente y de acuerdo con la documentacion oficialde la epoca, los numeros romanos mayores a 3999, se representan con letras ajenas alalfabeto latino (mejor dicho letras pertenecientes a este alfabeto pero con agregadosvisuales). Por ende esto dificulta la representacion de estos numeros en un lenguaje conbase de caracteres reducida como lo es C. Puesto que los caracteres del tipo IV , V , X,L, entre otros, no son representables con el repertorio de caracteres del lenguaje C.

Sin embargo se logran el objetivo propuesto que es representar de manera correctanumeros en base decimal del 1 al 1000 (y mayores que este) con la nomenclatura Ro-mana, logrando procesar y convertir efectivamente cualquier numero entero x tal que1 ≤ x ≤ 3999.

El proceso utilizado para realizar la conversion de numeros en base decimal a la no-menclatura Romana consiste en el aprovechamiento de dos herramientas fundamentalesde la programacion: la division entera y el operador mod %.

La teorıa de operaciones aritmeticas basicas en la programacion en C nos indicaque el resultado de una division va de la mano con el tipo de variables que se estenoperando. Por lo tanto es de esperarse (y es ası) que al dividir dos variables del tipointeger (int), el resultado sea de tipo integer. Esta particularidad de las variables detipo int puede ser aprovechada para descomponer un numero, ya que al operar, porejemplo, 735/100, de la siguiente manera;. . .int a=735 ,b=100;p r i n t f ( ”735/100= %d” , a/b ) ;. . .Comprobaremos que efectivamente el resultado sera un numero entero (int), y ademasobtendremos que el numero 735 (el cual se encuentra en base decimal) al ser descom-puesto en base decimal, presenta un valor de 7 que acompana como multiplo al tercernumero en la base decimal (100).

Bien, ahora queremos obtener el resto del numero, pero se observa que la operacionde division entera destruye el numero original (si no se almacena), por lo tanto el primerpaso para corregir esta situacion es almacenar el valor del numero a descomponer enuna variable. Una vez resuelto esto, podemos conseguir el resto del numero utilizandoel operador mod( %).

El operador mod o (resto), consiste en calcular el cociente de una division (porejemplo, 5/4, cociente 1). podemos aprovechar esto para mostrar el resto del numeroque no se logra obtener utilizando la division entera. Es decir, siguiendo nuestro ejemplo,para obtener el 35 de 735 podemos realizar 735 %100 y obtendremos 35.

Una vez comprendido esto, podemos valernos de estas operaciones para descomponercualquier numero, almacenar esta descomposicion es distintas variables, y utilizarlas

6

Page 7: informe Dsp

para realizar distintas operaciones. En nuestro caso, haremos pasar estas variables poroperadores switch para imprimir el valor correspondiente en nomenclatura Romana detodas y cada una de las componentes del numero (original en base decimal).

Para ejemplificar esto podemos computar:. . .int n=1347int a , b , c , d ;a=n/1000 ;b=(n %1000)/100;c=(n %100)/10;d=(n %100) %10;. . .Y obtendremos que las variables a, b, cyd corresponderan al numero 1347 descompuesto(a = 1, b = 3, c = 4yd = 7), por lo tanto podremos valernos de estos valores pa-ra procesarlos posteriormente con un operador switch correctamente estructurado yobtendremos el numero 1347 en Nomenclatura Romana MCCCXLVII.

2.3. Algoritmo para representar la Serie de Fibonacci

2.3.1. Muestra de codigos

inc lude <s t d i o . h>int main ( void ){int f i b o l d =0, f ib new =1, t rans ;p r i n t f ( ”25 terminos de Fibonacc i : %d %d ” , f i b o l d , f ib new ) ;for ( int i =3; i <=25; i++){t rans =f ib new ;f ib new=f i b o l d+f ib new ;f i b o l d=trans ;p r i n t f ( ” %d ” , f ib new ) ;}}2.3.2. Calculos Matematicos

La secuencia de Fibonacci, Famosa por su relacion con Arcos Naturales desarrolladosen algunos animales (incluso el ser humano), proviene de una simple operacion recursivala cual toma dos numeros relativamente consecutivos (consecutivos en la secuencia deFibonacci) y los suma para obtener un tercero que sera sumado con el segundo numeroque lo origino. Es decir, para el enesimo termino de la secuencia de Fibonacci, tendremosque Fn+2 = Fn + Fn+1 para todo n ≥ 0 , donde F1 = 0, F2 = 1.

Ya que procederemos a sumar dos numeros consecutivamente, y el resultado de cadasuma sera utilizado en la siguiente suma, tendremos que utilizar 3 variables, dos que

7

Page 8: informe Dsp

se sumen y una tercera de transicion para intercambiar los valores y poder realizar lasuma recursiva perpetuamente.

3. Analisis e interpretacion de resultados

En el caso de los numeros primos, se obtuvieron efectivamente los numeros primoscontenidos desde el 1 hasta el numero 100, es decir, los primos desde el 1 hasta el 97.Sin embargo este algoritmo podrıa emplearse de manera mas eficaz y corta, ahorrandode esta manera el uso de memoria.

Para los numeros Romanos, tal como se expuso en la seccion de este experimento,solo se pueden obtener correctamente los numeros romanos del 1 al 3999. Cabe destacarque la conversion es completamente correcta en este rango (1-3999).

La Secuencia de Fibonacci fue modelada y simulada completamente segun la fina-lidad de la practica (obtener los primeros 25 terminos). aunque el algoritmo disenadoy empleado puede obtener el enesimo termino de la secuencia (con limitaciones dememoria dependiendo del tipo de variable usado).

4. Conclusiones

Se demostro que efectivamente el lenguaje C tiene una potencialidad y una fiabi-lidad (que va de la mano con la correcta programacion) que lo hacen sin duda, unaherramienta fundamental para modelaciones matematicas, y operaciones aritmeticas()simples o muy complejas) fundamentales en el Area de Ingenierıa.

*

5. Recomendaciones

El algoritmo de los Numeros primos se puede realizar de manera mas eficiente em-pleando el siguiente codigo para conseguir todos los numeros primos desde el 1 hastael enesimo numero n(introducido por el usuario).#include<s t d i o . h>int primo ( int n ) ;int main ( void ){int n ;s can f ( ” %d” ,&n ) ;p r i n t f ( ”1 2” ) ;for ( int i =3; i<=n ; i++)primo ( i ) ;}

int primo ( int n){int s =0;

8

Page 9: informe Dsp

for ( int i =2; i<=n ; i++)i f (n %i ==0)s+=1;i f ( s==0)p r i n t f ( ” %d” ,n ) ;}

6. Referencias

https://es.wikipedia.org/w/index.php?title=Alfabeto&oldid=87003116”,

9