9/22/2023 Comandos y sintaxis en IDL Este documento cubre varios aspectos de la estructura del lenguaje IDL. está organizado en las siguientes secciones: Tipos de variables o Procedimientos y Funciones o Operadores lógicos o Operadores matemáticos Funciones Matemáticas o Declaraciones de comando Arreglos I/O y archivos Gráficos y desarrollo Tipos de variable (2) Una variable entera (long integer) larga es lo mismo que una variable entera, excepto que ocupa 32 bits de memoria y, por lo tanto, abarca el rango de aproximadamente -2, 000,000,000 a +2, 000,000,000. Una variable de punto flotante (floating point) es un número de precisión simple de 32 bits en el rango de ±1038, con aproximadamente seis o siete decimales de significado. Una variable de punto flotante de precisión doble (double precision floating point) es un número de punto flotante de precisión doble de 64 bits en el rango de ±1038 en sistemas VMS y ±10308 en máquinas compatibles con el estándar IEEE, con aproximadamente 14 lugares decimales de importancia. Tipos de variable Una variable se usa en IDL para representar simbólicamente un valor. El valor de una variable está sujeto a cambio (como su nombre indica). Las variables vienen en diferentes tipos. Deben ser declarados como ciertos tipo, y luego se le asigna un valor consistente con el tipo declarado. Los tipos de variables que admite IDL son: Boolean, Integer, Long Integer, Floating Point Decimal, Decimal de punto flotante (floating point) de doble precisión, Complejo, Caracteres y strings. Las variables booleanas solo pueden ser 0 o 1. Se utilizan en lógica binaria. Las variables enteras pueden ser cualquier número entero. Con un rango de -32,768 a +32,767. Una variable entera tiene 16 bits de largo. Tipos de variable (3) Una variable compleja es un par real-imaginario de números de punto flotante de precisión simple. Los números complejos son útiles para el procesamiento de señales y el filtrado en el dominio de la frecuencia. También viene en una variedad de doble precisión. Un string es una secuencia de caracteres, de 0 a 32.767 caracteres de longitud, que se interpreta como texto. Un carácter tiene 8 bits de longitud. Es por tanto un número entre 0 y 255 que se interpreta como un símbolo alfanumérico. 1 9/22/2023 Tipos de variable (4) Integer: a = 5 Long Integer: a = 5L (minúscula l es aceptable pero parece un 1) Floating Point: a = 5.0 Double Precision a = 5.0D Complex a = complex(5,0) String a = ’5’ También se pueden crear matrices que consisten en cualquiera de los tipos de variables anteriores. La creación de arreglos se explica en la sección Arreglos de este documento. Las variables en IDL se "emiten dinámicamente", lo que significa que las operaciones en ese tipo de variable pueden cambiar el tipo de variable. Tipos de variable (5) a=5 print, a b=a/2 print, b b = a / 2.0 print, b Tipos de variable (6) print, 1024 * 768 print, long(1024 * 768) print, 1024 * 768L Vemos que la primera vez que dividimos a por 2 obtenemos 2 porque se supone que b es un número entero. Pero si dividimos a por 2.0, luego b se cambiará automáticamente a una variable flotante. También puede cambiar explícitamente el tipo de una variable usando los comandos fix, long, round, float y otros. Se justifica una precaución al forzar el tipo de una declaración matemática. IDL siempre evaluará la declaración primero y luego intentará cambiar el tipo del resultado. Esta a menudo conduce a resultados no deseados. 2 9/22/2023 Operadores y Expresiones IDL define un número de operaciones en cada tipo de datos Operadores lógicos (2) Considere los siguientes ejemplos: 1 and 1 = 1, 1 and 0 = 0, 0 and 1 = 0, 0 and 0 = 0 1 or 1 = 1, 1 or 0 = 1, 0 or 1 = 1, 0 or 0 = 0 1 xor 1 = 0, 1 xor 0 = 1, 0 xor 1 = 1, 0 xor 0 = 0 not 1 = 0, not 0 = 1 Operadores lógicos Los operadores lógicos se utilizan a menudo en bucles de comandos y también en sentencias matemáticas. Estos operadores devuelven un valor de 1 si la declaración que evalúan es verdadera o 0 si es falsa. Existen dos tipos de operadores lógicos: operadores booleanos y operadores relacionales. Operadores booleanos Hay cuatro operadores booleanos en IDL. Toman argumentos de 1 (verdadero) o 0 (falso) y devuelven ya sea un 1 o un 0. Los operadores son: AND, OR, XOR, NOT. Todos estos son sencillos con la posible excepción de XOR que significa OR eXclusivo, lo que significa que uno y solo uno de los argumentos puede ser verdadero para que XOR sea verdadero. Operadores lógicos (3) Operadores relacionales Hay seis operadores relacionales en IDL. Comparan números que pueden ser enteros o decimales. Estos devuelven 1 para verdadero y 0 para falso. Los operadores relacionales son: EQ, NE, LE, LT, GE, GT. EQ es ‘equals’ 5 eq 5 = 1, 5 eq 4 = 0 NE es ‘not equal’ 5 ne 5 = 0, 5 ne 4 = 1 LE es ‘less than or equal’ 5 le 5 = 1, 5 le 4 = 0, 5 le 6 = 1 LT es ‘less than’ 5 lt 5 = 0, 5 lt 4 = 0, 5 lt 6 = 1 GE es ‘greater than or equal’ 5 ge 5 = 1, 5 ge 4 = 1, 5 ge 6 = 0 GT es ‘greater than’ 5 gt 5 = 0, 5 gt 4 = 1, 5 gt 6 = 0 3 9/22/2023 Operadores lógicos (4) Estos operadores se pueden utilizar conjuntamente entre sí. (A le 50) and (A ge 25) solo será verdadera si A está entre 25 y 50. Si A es una matriz de números, entonces el resultado será una matriz de la misma dimensión que consistirá en 0 y 1 apropiados para el declaración. Operadores matemáticos IDL tiene todos los operadores matemáticos familiares (^*/+-) y algunos adicionales para matemáticas de matrices. Estos operadores en combinación con los operadores lógicos detallados arriba siguen un sistema de precedencia algebraica. Operadores lógicos (5) La precedencia es lo que determina en qué orden actúan los operadores dentro de una declaración. Las operaciones del mismo orden de precedencia son generalmente conmutativas, de modo que la ambigüedad en su orden de ejecución suele ser irrelevante. Se recomienda que para declaraciones complejas en las que el orden de operación no está claro, se deben usar paréntesis, incluso si no es explícitamente necesario. Los operadores se enumerarán y explicarán brevemente en el orden de su precedencia. Operadores lógicos (6) Operadores lógicos (6) Highest Precedence Parentesis () Los paréntesis anulan cualquiera de las precedencias algebraicas. Usar estos tan a menudo como sea necesario para estar seguro de que IDL evalúa su declaración como usted pretende. PRIMERA Precedencia Exponenciación ^ El símbolo (^) eleva un número a la potencia de otro. Para ejemplo: 96 se expresaría en IDL como 9^6 SEGUNDA Precedencia Multiplicación * El asterisco (*) es el operador de multiplicación: 9*6 = 54 División/ La barra diagonal (/) es el operador de división. Si los argumentos de este operador son ambos enteros, el resultado será entero también. Si uno o dos de los operadores son decimales, el resultado también será un decimal flotante: 9/6 = 1, 9.0/6 = 1.5, 9/6.0 = 1.5 MODULO La palabra MOD es el operador Modulo. El resultado de A mod B es el resto de A dividido por B. Esto funciona para la división de enteros y también para división flotante. 9 mod 6 = 3, 9.1 mod 6 = 3.1, 9 mod 6.1 = 2.9 4 9/22/2023 Operadores lógicos (7) TERCERA Precedencia Adición+ (+) es el operador de suma. Es sencillo. 9+6 = 15 Resta (-) es el operador de resta. También es sencillo. 9-6 = 3 NO lógico El operador not también se asigna al tercer nivel de precedencia. CUARTA Precedencia Operadores Relacionales Los operadores relacionales (eq,ne,ge,gt,le,lt) están todos asignados al Cuarto nivel de precedencia algebraica. Operadores lógicos (8) QUINTAPrecedencia Operadores booleanos Los tres operadores booleanos restantes se asignan al quinto nivel de precedencia algebraica. Como se indicó anteriormente, estos niveles de precedencia pueden ser anulados por paréntesis. 5 + 2 / 2 + 5 = 11 (5 + 2)/(2 + 5) = 1 Siempre es preferible utilizar paréntesis cuando se desee forzar el orden de las operaciones en un manera establecida. Procedimientos y funciones Procedimientos y funciones (2) En el lenguaje IDL existen dos tipos de subdivisiones de código: procedimientos y funciones. Una vez creadas, estas estructuras se pueden llamar desde cualquier lugar dentro de un programa IDL. Generalmente, ambos procedimientos y funciones aceptan parámetros, realizan cálculos, ejecutan tareas y luego regresan los resultados especificados. Es importante usarlos si… Esto es seguido por el nombre del procedimiento. El procedimiento principal debe tener el mismo nombre que el archivo en el que está guardado. Por ejemplo, si mi programa se guardó como decay.pro , luego la primera línea del procedimiento principal tendría que ser PRO decay. • desea que el código de su programa sea legible, • desea que su código sea más pequeño, • su programa necesita repetir los mismos comandos a menudo, • desea reutilizar instrucciones similares en otros programas. Los procedimientos, incluidos el procedimiento principal, comienzan con la palabra PRO. En muchos procedimientos, deseará pasar información del procedimiento que la invocó. Existen dos maneras de hacer esto. Una es usar directamente las mismas variables que el procedimiento de invocación. El otro es para pasar las variables como parámetros del procedimiento. El último de estos es generalmente preferible a la primera opción por razones de estilo y claridad. 5 9/22/2023 Procedimientos y funciones (3) Para pasar información que sea un parámetro para el procedimiento, la primera línea del procedimiento debe enumerar aquellas variables que espera como entrada. Un buen ejemplo de esto es el procedimiento de 'inicializar' del documento tutorial: pro initialize, nuclei, t, tau, dt Esto define que 'inicializar' puede aceptar cuatro argumentos como se indica arriba. Entonces cuando el procedimiento es llamado se le deben enviar cuatro parámetros del mismo tipo que espera el procedimiento. Esto es lo que el comando de invocación puede verse así: inicializar, núcleos, t, tau, dt Procedimientos y funciones (5) Digamos que deseo crear una función: radius(x,y,z) = sqrt(x^2 + y^2 + z^2) Comenzaría declarando ‘radius’ con la palabra function, y luego la lista de parámetros esperados separados por comas. Luego podría definir la función con una serie de comandos. Antes de terminar la función con el comando end, es necesario devolver el argumento de salida de las funciones usando el comando return. Procedimientos y funciones (4) Tenga en cuenta que los nombres de las variables que se pasan no tienen que ser las mismas que las del procedimiento, pero pueden serlo. Después que la primera línea define el nombre y los parámetros de entrada del procedimiento, sigue el resto como comandos IDL normales. Puede invocar bucles de comandos y otros procedimientos. Con precaución puede incluso invocar el mismo procedimiento desde dentro de sí mismo, lo que se llama recursividad. Todos los procedimientos deben terminar con el comando fin. Las funciones son como procedimientos excepto que devuelven un argumento y aceptan su entrada parámetros entre paréntesis en lugar de separarlos por comas. Procedimientos y funciones (6) Luego, en el código IDL podríamos invocar esta función escribiendo:. x1 = 5.76 x2 = 4.2 x3 = 8.0 hypotenuse = radius(x1,x2,x3) print, hypotenuse function radius,x,y,z r = sqrt(x^2 + y^2 + z^2) return, r end 6 9/22/2023 Procedimientos y funciones (7) Funciones Matemáticas En los procedimientos de IDL, las variables y las matrices se pasan por referencia cuando se especifican como parámetros para el procedimiento. Esto significa que si modifica el valor de los parámetros dentro del procedimiento, la alteración se trasladará también al procedimiento de llamada. Tenga esto en cuenta, ya que puede ser la fuente de molestos errores de programación, que a menudo son muy difíciles de rastrear. Una importante excepción a esta regla es el uso de elementos de estructuras o arreglos. Los elementos de la matriz siempre serán pasados por valor, lo que significa que si usa un elemento de matriz como parámetro de una función o procedimiento, la estructura puede ser usada pero no cambiarse el valor de ese parámetro. Un ejemplo de esto es leer entrada desde el teclado a una matriz. Además de los operadores básicos, IDL ha implementado numerosas funciones matemáticas. Para obtener una lista completa, invoque la ayuda de IDL desde la barra de menú, seleccione contenido y luego índice. Escriba mathematics, seleccione ‘Alphabetical list of Mathematics Routines' y pulsar display. Verá una lista que es similar pero más larga que esta. En los siguientes ejemplos, 'a' es una matriz [1,3,5,2,4] Funciones Matemáticas (2) ABS Absolute Value abs(-6)=6 ACOS Inverse Cosine (in radians) acos(0)= 1.57080 ALOG Natural Log ( ln(x) ) alog(2.71828) = 1 ALOG10 Log Base 10 alog(100)=2 ASIN Inverse Sine (in radians) asin(1)= 1.57080 ATAN Inverse Tangent (in radians) atan(1)= 0.785398 Funciones Matemáticas (3) COS Cosine (argument in radians) cos(1.57080)=0 ROUND Rounds a Number round(2.7) = 3 COSH Hyperbolic Cosine cosh(.5) = 1.12763 SIN Sine (argument in radians) sin(1.57080)=1 EXP Natural Exponent ( e ) exp(1)= 2.71828 FACTORIAL Factorial ( ! ) factorial(4) = 24 SINH Hyperbolic Sine sinh(1.5) = 2.12928 FIX Truncates Decimal to Integer fix(3.8) = 3 SQRT Square Root sqrt(16) = 4 FLOAT Changes Integer to Decimal float(3) = 3.000 TAN Tangent (argument in radians) tan(0.785398)=1 MAX Maximum Value of an Array max(a) = 5 TANH Hyperbolic Tangent tanh(1.5)= 0.905148 TOTAL Sum of Matrix Operations see IDL help on TOTAL MEAN The Mean of an Array mean(a) = 3 MIN Minimum Value of an Array min(a) = 1 !PI System Constant for pi !PI = 3.141593 PRIMES Computes First n Prime #’s primes(5)= 2,3,5,7,11 RANDOMU Generates a Uniformly Distributed Random # Between 0 and 1 randomu(1) = .04234 RANDOMN Generates a Normally Distributed Random # 7 9/22/2023 Declaraciones de comando Hay cuatro declaraciones que se pueden usar para ejecutar o crear un bucle a través de un bloque de instrucciones hasta que se cumpla una condición especificada. Estas declaraciones son FOR, IF, REPEAT, WHILE. Declaraciones de comando (2) i es el contador. 1,4 son los valores inicial y final de i. do es el encabezado de los comandos a ser ejecutados. print muestra el contador i e i2. El bucle se ejecuta con i = 1,2,3,4 y luego termina Si desea que el bucle cuente hasta un número mayor que 32000, es necesario especificar que i es long integer. Esto se puede hacer especificando los límites como números enteros largos. Por ejemplo, lo anterior podría ser escrito: for i = 1L,50000 do print, i, i^2 . No se recomienda ejecutar esto porque toma mucho tiempo! La 'L' después del 1 en los límites del contador le dice a IDL que i es un número entero largo. Si desea que el ciclo ejecute un bloque de instrucciones, entonces en lugar de escribir comando do, debe comenzar un bloque que se repetirá escribiendo 'do begin'. Luego terminará el bloque con una declaración 'end' o 'endfor'. Cualquiera de los dos funcionará, aunque al final endfor por estilo. Declaraciones de comando (2) Declaraciones de comando (3) FOR-DO El bucle FOR repite su bloque de instrucciones e incrementa su contador en uno cada vez que se ejecuta el bucle. for i = 1,4 do print, i, i^2 generará 1 1 2 4 3 9 4 16 Por ejemplo: for i = 0, 98 do begin nuclei[i+1]=nuclei[i]-(nuclei[i]*(dt/tau)) t[i+1]=t[i]+dt endfor for i = 4,1,-1 do print, i, i^2 generará 4 16 3 9 2 4 1 1 Esta vez el ciclo se ejecuta con i = 4,3,2,1 y luego termina. El tercer argumento (-1) especifica que el incremento sea -1 Repetirá 99 veces y calculará (método de Euler) la desintegración radiactiva de los "núcleos" hasta 99 pasos de tiempo. Si se tiene cuidado, también puede usar contadores flotantes (decimales). Pero esto no es recomendable. También es posible especificar que el incremento sea un número distinto de uno. El siguiente código se ejecuta en reversa: 8 9/22/2023 Declaraciones de comando (5) IF-THEN statement La declaración IF se usa junto con los operadores lógicos para ejecutar solo un comando o un bloque de comandos cuando una determinada condición es VERDADERA. Por ejemplo: if a eq 1 then print, ‘ a equals one’ También puede proporcionar alternativas con el comando ELSE if a eq 1 then print, ‘ a equals one’ else print, ‘ a is not one’ Puede usar bloques con declaraciones IF. Después de THEN ponga BEGIN. Esto inicia el bloque de comandos .Termina el bloque con END o ENDIF. Nuevamente preferimos el ENDIF por razones de estilo. Las declaraciones IF pueden hacer que el código se ejecute muy lentamente. A menudo querrá evitarlos y usar más métodos eficientes Declaraciones de comando (7) Declaraciones de comando (6) Considere el siguiente código: print, 'La computadora quiere saber el producto de 3 por 2' read,i if (i ne 6) then begin print, ' Respondiste un numero diferente a 6' print, ' Estamos decepcionados ' endif else begin print, ‘Seleccionaste el numero 6' print, ‘bien hecho!!' endelse Declaraciones de comando (8) REPEAT bucle Considere el siguiente código: El bucle REPEAT repetirá un comando o un bloque de comandos hasta que se cumpla una condición para detener el círculo. La sintaxis es REPEATComando-UNTIL (condición). Un ejemplo sería: a = 1 b = 1000 repeat begin a = 2*a print, 'El valor de a vale',a endrep until a gt b a = 1 b = 10 repeat a = a * 2 until a gt b Al igual que con todos los otros bucles de control, un bloque de comandos puede sustituirse por el único comando insertando un BEGIN después de REPEAT y un ENDREP al final del bloque seguido por UNTIL (condición). Al igual que con todos los otros bucles de control, un bloque de comandos puede sustituirse por el único comando insertando un BEGIN después de REPEAT y un ENDREP al final del bloque seguido por UNTIL (condición). 9 9/22/2023 Declaraciones de comando (9) Declaraciones de comando (9) WHILE bucle WHILE bucle El bucle WHILE es como el bucle REPEAT excepto que analiza la condición de ejecución antes de ejecutar el comando o bloque de comandos que controla. Aquí un ejemplo que repite un cálculo hasta que la diferencia en el resultado de los cálculos actuales y anteriores sea inferior a un error permitido. Esta es una buena manera de probar la convergencia en su método numérico. a = 1 b = 1000 WHILE (a LT b) DO BEGIN a = 2*a PRINT, 'El valor de a vale',a ENDWHILE while (delta_result ge err) do begin old_result = new_result new_result = somefunction(old_result) delta_result = new_result - old_result endwhile Arreglos • Los arreglos son listas de números con índices enteros. • En física computacional, a menudo se desea calcular una lista de números que representan alguna cantidad en varios intervalos de tiempo. Una matriz es perfectamente adecuado para esto. • Hay tantos tipos de arreglos como variables. Se puede crear un matriz de enteros o caracteres o números de coma flotante o variables booleanas. Para crear una matriz (o vector) unidimensional de números flotantes, escriba: nuclei = fltarr(100).Esto crea una lista de 100 números indexados del 0 al 99. Un arreglo tri-dimensional se puede crear así: V3D = fltarr(10,7,5). Arreglos (2) Este sería un tensor de 10x7x5 indexado desde (0-9,0-6,0-4). Para poner información en una matriz, se debe establecer la matriz con el índice apropiado para ese valor. Por ejemplo: nuclei[7] = 6.8 nuclei[i+1] = nuclei[i] + c nuclei = nuclei * 0 nuclei[*] = 0 Estas últimas líneas establecen todos los elementos de 'nuclei' en cero. Para crear una matriz de enteros, el comando es intarr(dim). Se usa igual que el comando fltarr explicado anteriormente. Para crear una matriz de enteros largos, use lonarr(dim). El comando dblarr(dim) crea una matriz de números flotantes de doble precisión. 10 9/22/2023 Arreglos (3) Arreglos (4) El comando strarr(dim) crea una matriz de strings. Todos estos comandos establecen los elementos de las matrices creadas en cero de forma predeterminada. A veces no querrá que los elementos de su matriz sean cero. El comando indgen(dim) crea una matriz de las dimensiones especificadas, con cada elemento establecido en el mismo número que su índice correspondiente. También es útil poder determinar el tamaño de una matriz, especialmente si desea acceder a cada elemento sin exceder los límites de la matriz. El comando N_ELEMENTS devolverá el tamaño de una matriz especificada. for i = 0, (n_elements(t)-1) do begin . endfor Este código se repetirá exactamente tantas veces como elementos haya en 't'. Para definir un arreglo se puede: M = INTARR(3,4) M = MAKE_ARRAY(3, 4, /INTEGER, VALUE = 5) M = INDGEN(3,4) Secciones de Arrays (5) 1 Función WHERE 4 idx = WHERE( A EQ 2, nc ) A = indgen(6,6) 0 1 2 3 4 5 0 0 6 12 18 24 30 1 1 7 13 19 25 31 2 2 8 14 20 26 32 3 3 9 15 21 27 33 4 4 10 16 22 28 34 5 5 11 17 23 29 35 A[0:2,0:2] 2 A[[1,3,5,1,3,5,1,3,5],[0,0,0,2,2,2,4,4,4]] 3 0 1 2 3 4 5 0 2 6 12 18 2 30 1 1 7 13 2 25 31 2 2 8 14 20 26 2 3 3 9 15 21 27 2 4 4 2 16 2 28 34 5 5 11 17 23 2 35 Result = WHERE( Array_Expression [, Count] [, COMPLEMENT=variable] [, NCOMPLEMENT=variable] ) A[4,1:4] A[[0,2,4],1:4] 11 9/22/2023 VARIABLES Y CONSTANTES ALFANUMERICAS ASCII (American Standard Code for Information Interchange) • Las variables y constantes alfanuméricas constan de texto y caracteres especiales. • Los valores se asignan a una variable o constante alfanumérica encerrando el texto entre comillas simples o dobles. • ASCII es una forma de representar caracteres de texto mediante números. Si su texto necesita incluir comillas, repita las comillas dentro de la cadena o use otro tipo de comillas para definir su cadena. Ejemplo: “Alex’s text” • Es posible que no todos los caracteres ASCII disponibles se impriman en la pantalla. Depende de qué tipo de letra utilice su sistema. • Las variables alfanuméricas pueden tener hasta 32.767 caracteres de longitud Funciones para operar con variables alfanuméricas • Puede convertir un carácter de cadena a su valor ASCII usando el carácter como argumento para la función BYTE. print, string(102b) => “f” print, string(102) => “102” print, byte(“f”) => 102 Funciones para operar con variables alfanuméricas Funciones Funciones strcompress() • Puede asignar caracteres ASCII a una cadena IDL utilizando la función string() y utilizando el código ASCII en formato byte como argumento. Elimina o comprime los espacios en blanco. La palabra clave /remove_all elimina todos los espacios en blanco. Sin la palabra clave /remove_all , todos los espacios en blanco se comprimen en un solo espacio. Ejemplo: a = “ String with whitespace ” strcompress(a) => “ String with whitespace ” strcompress(a, /remove_all) => “Stringwithwhitespace” • • • Elimina los espacios en blanco iniciales, los espacios en blanco finales o ambos, según el carácter de bandera opcional. A diferencia de strcompress, que elimina o comprime todos los espacios en blanco strtrim() • strcmp() • Compara dos cadenas para ver si son equivalentes. • Devuelve un valor BYTE de 1 si es verdadero y un valor BYTE de 0 si es falso. • Se puede utilizar para comparar cadenas completas o solo los primeros ncaracteres de las cadenas. • La palabra clave opcional /FOLD_CASE se puede utilizar para comparaciones que no distinguen entre mayúsculas y minúsculas.. • strlowcase()/ strupcase() Convierte el contenido de una cadena a minúsculas o mayúsculas, respectivamente. Example: a = “hi”; b = “Hi”; c = “Hilo” strlowcase(b) => “hi” strupcase(c) => “HILO” strmatch() strmid() strpos strput() strlen() strsplit • Esta función puede comparar dos cadenas usando comodines • Devuelve una subcadena de una cadena, especificando el primer carácter y la longitud de la subcadena que se va a xtraer. • Devuelve la posición de la primera aparición de una cadena de búsqueda dentro de una cadena de destino • Inserta caracteres en una cadena existente • Devuelve la longitud de la cadena • Divide una cadena según un delimitador determinado Ejemplo: a = “hi”; b = “Hi”; c = “Hilo” strcmp(a, b) => 0 strcmp(a, b, /FOLD_CASE) => 1 strcmp(a, c) => 0 strcmp(b, c, 2) => 1 12 9/22/2023 Entrada/salida (I/O) y archivos En física computacional, diseñamos código que toma ciertos argumentos y genera resultados. Esto requiere entradas y salidas. La entrada puede ser desde el teclado o desde un archivo. Las salida pueden ser resultados impresos en la pantalla, datos guardados en un archivo o dibujados en un dispositivo. Primero repasaremos la E/S del teclado. El comando PRINT se utiliza para enviar la salida al registro de salida (la ventana de texto cerca de la parte inferior de la interfaz IDLDE). Por ejemplo, si escribimos PRINT, ‘hola mundo’ en la línea de comando veremos ‘hola mundo’ en el registro de salida. Entrada/salida (I/O) y archivos (3) El comando PRINT envía el mensaje al registro de salida especificando qué información se requiere del usuario, y el comando de lectura toma la siguiente entrada del teclado y la almacena en la variable tau. A menudo, es preferible leer la entrada de un archivo y guardar la salida de una simulación en otro archivo para análisis mas extenso. Antes de que se pueda realizar cualquier entrada o salida de archivos, es necesario abrir un archivo. Esto se hace usando ya sea OPENR (abrir un archivo existente solo para lectura), OPENW (abrir y crear un archivo vacío para escribir) u OPENU (abrir un archivo existente para actualizar). Cuando se abre un archivo, éste es asociado con un número de unidad lógica o LUN (Logical Unit Number). Entrada/salida (I/O) y archivos (2) • PRINT también puede ser usado para desplegar variables y comandos. • Si x=2.5, el comando PRINT, x produciría la salida '2.5' en el registro de salida. • El comando PRINT, alog(x) • producirá la salida 0.916291. • Puede dar al comando PRINT varios argumentos separados por comas. Esto generará múltiples salidas en la misma línea. El comando READ se usa para tomar entradas desde el teclado. Es útil usar el comando PRINT para solicitar entrada y el comando READ para recibir la entrada. Por ejemplo, el siguiente código: print, "Time Constant (tau):" read, tau Entrada/salida (I/O) y archivos (4) Todas las rutinas de entrada y salida de archivos en IDL usan el LUN en lugar del nombre de archivo, y la mayoría requiere que el LUN se especifique explícitamente. No use -2, -1 o 0 como LUN ya que están reservados por el sistema. Una vez que el archivo se abre correctamente, hay varios comandos para leer y escribir datos. El comando PRINTF funciona como imprimir, excepto que dirige su salida al archivo especificado por el LUN. También hay un comando READF que leerá datos de un archivo específico, de la misma manera que READ tomará la entrada del teclado. 13 9/22/2023 Entrada/salida (I/O) y archivos (5) Aquí hay un programa de ejemplo: OPENW, 1, 'hello.dat' ;Abre LUN 1 para hello.dat para escribir. PRINTF, 1, 'Hello World.' ;Escribe en el archivo. CLOSE, 1 ;Cierra el archivo. OPENR, 1, 'hello.dat' ;Reabre el archivo. READF, 1, message ;Lee el string PRINT, message ; Imprime al Output Log. CLOSE, 1 ; Cierra el archivo. Entrada/salida (I/O) y archivos (6) FORMATOS estilo FORTRAN La sintaxis de los formatos es: [n]FC[+][-][width] n es un recuento de repeticiones opcional (1 ≤ n) que especifica el número de veces que se debe procesar el código de formato. Si no se especifica n, se utiliza un recuento repetido de uno. FC es el código de formato. Consulte Códigos de formato disponibles a continuación. + es un indicador opcional que especifica que los números positivos deben generarse con un prefijo “+”. El indicador “+” solo es válido para códigos de formato numérico. Normalmente, los números negativos se generan con un prefijo “-” y los números positivos no tienen prefijo de signo. Los códigos numéricos no decimales (B, O y Z) permiten la especificación del indicador “+”, pero lo ignoran. - es una bandera opcional que especifica que los valores numéricos o de cadena deben generarse con el texto justificado a la izquierda. Normalmente, la salida está justificada a la derecha. width es una especificación de ancho opcional. Las especificaciones de ancho y los valores predeterminados son específicos del código de formato y se describen en detalle junto con el código de formato. Entrada/salida (I/O) y archivos (7) Formato de relleno y ancho natural El valor al que se le da formato puede ser más corto que el ancho de salida especificado por el parámetro de ancho. Cuando esto sucede, IDL ajustará el contenido del valor de salida o el ancho del campo, utilizando los siguientes mecanismos: Entrada/salida (I/O) y archivos (8) Relleno cero Para códigos de formato numérico, si el primer dígito del parámetro de ancho es cero, IDL rellenará el valor con ceros en lugar de espacios en blanco. Por ejemplo: PRINT, FORMATO='(I08)', 300 produce el siguiente resultado: Relleno de espacios en blanco De forma predeterminada, si el valor al que se le da formato utiliza menos caracteres de los especificados por el parámetro de ancho, IDL rellena el valor con espacios en blanco a la izquierda para crear una cadena del ancho especificado. Por ejemplo, la siguiente declaración IDL PRINT, FORMATO='(I12)', 300 produce el siguiente resultado: bbbbbbbbb300 donde b representa un carácter de espacio. 00000300 Al rellenar valores con ceros, tenga en cuenta lo siguiente: Si especifica el indicador "-" para justificar a la izquierda la salida, especificar un cero a la izquierda en el parámetro de ancho no tiene ningún efecto, ya que no hay espacios no utilizados a la izquierda del valor de salida. Si especifica un valor de ancho mínimo explícito (a través del parámetro de ancho m) para un código de formato entero, especificar un cero a la izquierda en el parámetro de ancho no tiene ningún efecto, ya que el valor de salida ya está rellenado con ceros a la izquierda para crear un valor de salida. del ancho mínimo especificado. 14 9/22/2023 Entrada/salida (I/O) y archivos (8) Entrada/salida (I/O) y archivos (9) Formato de ancho natural Si se especifica el número cero para el parámetro de ancho, IDL utiliza el ancho "natural" para el valor. El valor se lee o se genera utilizando un formato predeterminado sin espacios en blanco al principio o al final, al estilo de la función printf() de la biblioteca C estándar. Usar un valor de cero para el parámetro de ancho es útil al leer tablas de datos en las que los elementos individuales pueden tener diferentes longitudes. Por ejemplo, si sus datos residen en tablas del siguiente formulario: Códigos Disponibles 26.01 92.555 344.2 Quoted String and H Format Codes Valores de cadena de salida directamente 101.0 6.123 99.845 23.723 200.02 141.93 T Format Code Especifica la posición absoluta dentro de un registro. TL Format Code Mueve la posición con un registro hacia la izquierda. Establecer el formato en: TR and X Format Codes Mover la posición dentro de un registro hacia la derecha FORMAT = '(3F0)' C() Format Code Transfiere datos del calendario garantiza que se lea o emita el número correcto de dígitos para cada elemento. Código Descripción A Format Code Transfiere caracteres alfanuméricos : Format Code Termina el proceso $ Format Code Suprime nuevas líneas en la salida F, D, E, and G Format Codes Transfiere valores de punto flotante B, I, O, and Z Format Codes Transfiere valores enteros Q Format Code Devuelve el número de caracteres que quedan por transferir durante una operación de lectura https://www.irya.unam.mx/computo/sites/manuales/IDL/Content/Creating%20IDL%20Programs/Components%20of%20the%20IDL%20Language/Format_Codes.html Entrada/salida (I/O) y archivos (10) Aquí hay un programa de ejemplo: OPENR, unit, nombre_archivo, ERROR=error, /GET_LUN IF error EQ 0 THEN BEGIN ; leemos los datos PRINT, 'Encontre los datos' encabezado = '' lista = STRARR(4,24) READF, unit, encabezado READF, unit, lista, FORMAT='(A15,2X,F10.2,I5)' FREE_LUN, unit ENDIF ELSE BEGIN PRINT, 'No puedo encontrar el archivo: ', nombre_archivo ENDELSE Entrada/salida (I/O) y archivos (11) For example, the IDL statement, PRINT, FORMAT = '(A6)', '123456789' generates the following output: 123456 : Format Code Available Format Codes The colon format code terminates format processing if there are no more data remaining in the argument list. The syntax is: : For example, the IDL statement, PRINT, FORMAT = '(6(I1, :, ", "))', INDGEN(6) will output the following comma-separated list of integer values: 0, 1, 2, 3, 4, 5 The use of the colon format code prevented a comma from being output following the final item in the argument list. 15 9/22/2023 Entrada/salida (I/O) y archivos (12) $ Format Code Available Format Codes When IDL completes output format processing, it normally outputs a newline to terminate the output operation. However, if a “$” format code is found in the format specification, this default newline is not output. The “$” format code is only used on output; it is ignored during input formatting. The syntax is: $ One use for the “$” format code is in prompting for user input in programs that run in a tty rather than in the graphical IDL Workbench. For example, the following simple program show the difference between strings formatted with and without the “$” format code. The first PRINT statement prompts the user for input without forcing the user’s response to appear on a separate line from the prompt; the second PRINT statement makes the user enter the response on a separate line. Entrada/salida (I/O) y archivos (13) IDL> .run PRO format_test name='' age=0 PRINT, FORMAT='($, "Enter name")' READ, name PRINT, FORMAT='("Enter age")' READ, age PRINT, FORMAT='("You are ", I0, " years old, ", A0)', age, name END % Compiled module: FORMAT_TEST. Running the procedure looks like this: IDL> format_test Enter name: Pat Enter age : 29 You are 29 years old, Pat IDL> Entrada/salida (I/O) y archivos (14) F, D, E, and G Format Codes Available Format Codes The F, D, E, and G format codes are used to transfer floating-point values between memory and the specified file. The syntax is: [n]F[+][-][w][.d] [n]D[+][-][w][.d] [n]E[+][-][w][.d][Ee] [n]G[+][-][w][.d][Ee] where the parameters “n”, “+”, and “-” are as described in Syntax of Format Codes and the width specification is as follows: w is an optional width specification (0 ≤ w ≤ 255). The variable w specifies the number of digits to be transferred. See Padding and Natural Width Formatting for additional details on the output width of a formatted value. Entrada/salida (I/O) y archivos (15) d is an optional width specification (1 ≤ d < w). For the F, D, and E format codes, d specifies the number of positions after the decimal point. For the G format code, d specifies the number of significant digits displayed. e is an optional width (1 ≤ e ≤ 255) specifying the width of exponent part of the field. IDL ignores this value—it is allowed for compatibility with FORTRAN. On input, the F, D, E, and G format codes all transfer w characters from the external field and assign them as a real value to the corresponding input/output argument list datum. 16 9/22/2023 Entrada/salida (I/O) y archivos (16) The F and D format codes are used to output values using fixed-point notation. The value is rounded to d decimal positions and right-justified into an external field that is w characters wide. The value of w must be large enough to include a minus sign when necessary, at least one digit to the left of the decimal point, the decimal point, and d digits to the right of the decimal point. The code D is identical to F (except for its default values for w and d) and exists in IDL primarily for compatibility with FORTRAN. The E format code is used for scientific (exponential) notation. The value is rounded to d decimal positions and right-justified into an external field that is w characters wide. The value of w must be large enough to include a minus sign when necessary, at least one digit to the left of the decimal point, the decimal point, d digits to the right of the decimal point, a plus or minus sign for the exponent, the character “e” or “E”, and at least two characters for the exponent. Entrada/salida (I/O) y archivos (17) The G format code uses the F output style when reasonable and E for other values, but displays exactly d significant digits rather than d digits following the decimal point. Overflow On output, if the field provided is not wide enough, it is filled with asterisks (*) to indicate the overflow condition. Default Values of the w, d, and e Parameters If w, d, or e are omitted, the values specified in the following table are used. Note: IDL uses the standard C library function snprintf() to format numbers and their exponents. As a result, different platforms may print different numbers of exponent digits. Entrada/salida (I/O) y archivos (10) If w, d, or e are omitted, the values specified in the following table are used. Entrada/salida (I/O) y archivos (10) If w, d, or e are omitted, the values specified in the following table are used. Floating Format Defaults Floating-Point Output Examples (“b” represents a blank space) Format Internal Value Format Code Examples The following table shows the results of the application of various format codes to given data values. Note that normally, the case of the format code is ignored by IDL. However, the case of the E and G format codes determines the case used to output the exponent in scientific notation. Formatted Output Floating-Point Output Examples (“b” represents a blank space) bbbb100.0000000 F 100.0 17 9/22/2023 Gráficos y dispositivos Gráficos y dispositivos (2) • Los problemas que resolvemos en Física Computacional rara vez son aquellos en los que simplemente obtienes "una respuesta". • A veces se dará el caso que nuestro programa se ejecutará a través de sus algoritmos y al final generará un número que es 'la respuesta'. • Sin embargo, más a menudo, generaremos muchos números y desearemos verlos en alguna relación entre sí. Estos problemas se adaptan naturalmente a interpretación gráfica. • Una de las mayores fortalezas de IDL como lenguaje de programación es la facilidad con la que puede mostrar datos en una amplia variedad de representaciones gráficas. • Por razones prácticas solo se explicará un diagrama x-y simple, con referencias posteriores para estudio adicional. Ya sea que IDL opere en el entorno de Microsoft Windows o Unix-X, IDL utiliza ' ventanas' para su salida gráfica. Puede haber varias ventanas abiertas simultáneamente. A las ventanas se le asignan números. Se puede asignar y acceder a estas ventanas de la siguiente manera: window, 0 ;abre la ventana #0 wset, 0 ;hace la ventana #0 la ventana seleccionada Si no especifica una ventana, IDL abrirá automáticamente una cuando invoque un comando gráfico como PLOT. PLOT es una rutina de gráficos IDL que trazará dos matrices de tamaño similar entre sí. El formato para graficar x versus y es: plot, x, y ;donde x ^ y son arreglos 1-D de la misma dimensión. Gráficos y dispositivos (3) Esta es el comando gráfico más básico que se puede escribir. IDL debería escalar automáticamente la figura para que todos sus puntos de datos quepen dentro de la ventana especificada. Hay muchos parámetros adicionales que pueden especificarse en PLOT. Estos incluyen: title, xtitle, ytitle, xrange, yrange, psym y color. PERSONAS Codigo Nombre Ciudad 001 Velarde Juan LP 002 Moreno Amparo EA 003 Ticona Jose EA 004 Gutierrez Andres LP 005 Mamani Carla LP 006 Conde Luis EA 007 Santana Virginia LP PAGOS Codigo Mes Monto Cod_Per P001 Ene 90.53 001 P002 Feb 38.99 001 P003 Ene 13.11 002 P004 Ene 24.46 007 P005 Ene 5.06 004 P006 Feb 23.65 004 P007 Mar 70.72 004 P008 Ene 34.61 003 P009 Ene 94.38 005 P010 Ene 7.13 006 P011 Feb 61.65 002 P012 Mar 36.38 002 P013 Mar 66.55 001 P014 Feb 74.53 003 P015 Feb 53.89 005 P016 Feb 93.90 007 P017 Feb 35.14 006 P018 Mar 42.95 007 P019 Mar 33.01 006 P020 Mar 43.39 005 P021 Mar 24.47 003 Preguntas: ¿Cuánto se pagó por: Cliente Mes Ciudad Mes y por ciudad 18 9/22/2023 x 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 y -15.42 21.64 -9.65 6.35 2.58 25.95 30.88 21.69 41.6 51.54 44.82 68.73 69.43 59.66 76.31 68.31 74.15 93.21 104.19 89.87 Ajuste de curvas (aproximaciones) Ajuste de curvas (aproximaciones) y y = 5.6536x - 13.071 120 s = 100 y −y = 80 + 60 y 40 Linear ( y) 20 0 0 5 10 15 20 25 -20 -40 19