8 -Funciones preseteadas
En BASIC contamos con funciones predefinidas:
-Unas son funciones matemáticas, como el valor absoluto o el coseno de un ángulo;
-Y otras permiten escoger parte de una cadena de texto (por ejemplo las letras de más a la izquierda), etc. Veremos las más habituales.
Las funciones matemáticas:
ABS - Devuelve el valor absoluto de un número.
ATN - Devuelve el arco tangente.
COS - Devuelve el coseno de un ángulo (en radianes).
SIN - Devuelve el seno de un ángulo (en radianes).
LOG - Devuelve el logaritmo natural o neperiano (base e).
EXP - Devuelve la exponencial (e elevado al número).
RND - Devuelve un número aleatorio entre 0 y 1 (se deberá usar junto con RANDOMIZE).
SQR - Devuelve la raíz cuadrada de un número.
INT - Devuelve el mayor número entero que es menor o igual que el número dado.
RANDOMIZE - En cuanto a los números aleatorios (generados al azar), la orden RANDOMIZE es la que hace que se comiencen a generar a partir de una cierta "semilla".
Se usa "RANDOMIZE + un_numero".
El problema es que si escribimos, RANDOMIZE 2, siempre obtendremos la misma secuencia de números "aleatorios". (es decir, pseudo-aleatorios)
Si queremos números realmente "al azar", la mejor solución suele ser basarse en el reloj interno del sistema (si el ordenador lo tiene), dado que será casi imposible que el ordenador se ponga siempre en marcha a la misma hora (con una precisión de centésimas de segundo).
En QBasic, se consigue escribiendo RANDOMIZE TIMER.
Un ejemplo
REM Funciones matematicas
PRINT "Valor absoluto de -5: "; ABS(-5)
PRINT "Coseno de 0,5 radianes: "; COS(0.5)
PRINT "Seno de 0,5 radianes: "; SIN(0.5)
PRINT "Arco cuya tangente vale 1: "; ATN(1)
PRINT "Logaritmo natural de 10: "; LOG(10)
PRINT "El número e vale: "; EXP(1)
PRINT "La raiz de 125 es: "; SQR(125)
PRINT "La parte entera de 4,7 es: "; INT(4.7)
RANDOMIZE TIMER
PRINT "Un número al azar: "; RND
Y su resultado (con QBasic) es:
Valor absoluto de -5: 5
Coseno de 0,5 radianes: .8775826
Seno de 0,5 radianes: .4794255
Arco cuya tangente vale 1: .7853982
Logaritmo natural de 10: 2.302585
El número e vale: 2.718282
La raiz de 125 es: 11.18034
La parte entera de 4,7 es: 4
Un número al azar: .5464441
Su equivalente en Basic256 sería muy parecido, con las diferencias de que no se puede escribir varias expresiones en un mismo PRINT, que no existe ATN y que para obtener un número al azar ser usa RAND en vez de RND, y no es necesario hacer un RANDOMIZE TIMER para inicializar la semilla:
REM Funciones matematicas
PRINT "Valor absoluto de -5: ";
PRINT ABS(-5)
PRINT "Coseno de 0,5 radianes: ";
PRINT COS(0.5)
PRINT "Seno de 0,5 radianes: ";
PRINT SIN(0.5)
PRINT "Logaritmo natural de 10: ";
PRINT LOG(10)
PRINT "El número e vale: ";
PRINT EXP(1)
PRINT "La raiz de 125 es: ";
PRINT SQR(125)
PRINT "La parte entera de 4,7 es: ";
PRINT INT(4.7)
PRINT "Un número al azar: ";
PRINT RAND
Por otra parte, las órdenes para manipular cadenas de texto que permitirán casi todas las versiones de BASIC son:
LEN - Longitud de la cadena de texto.
PRINT LEN("Ana") escribiría 3.
VAL - Valor numérico de la cadena, para poder hacer operaciones con ella.
RIGHT$ - Toma varias letras de la derecha de la cadena: PRINT RIGHT$("Nadal", 3) escribiría "dal".
LEFT$ - Toma varias letras de la izquierda de la cadena: PRINT LEFT$("Nanis", 2) escribiría "Na".
MID$ - Toma varias letras intermedias de la cadena: PRINT MID$("Nacho", 2,3) escribiría "ach"
CHR$ - Letra o símbolo con un cierto código ASCII: PRINT CHR$(65) escribiría "A"
ASC - Dice el código ASCII de una letra o símbolo: PRINT ASC("A") escribiría 65.
INSTR - Indica en qué posición de una cadena se encuentra cierto texto: PRINT INSTR("Nacho", "ach")
diría "2". Si no existe, el resultado será 0.
Se puede indicar un dato adicional, que es a partir de qué posición queremos buscar (este dado, si se incluye, debe ser el primero):
PRINT INSTR(4, "Nacho", "ach") diría "0".
(El código ASCII es un estándar que permite guardar la información dentro del ordenador, representando internamente cada letra con un cierto número).
Un ejemplo sería:
10 REM Funciones de cadena
20 texto1$ = "Texto de prueba"
30 texto2$ = "23"
40 PRINT "La longitud del texto 1 es: "; LEN(texto1$)
50 PRINT "Las primeras 5 letras son: "; LEFT$(texto1$, 5)
60 PRINT "Las 6 ultimas son: "; RIGHT$(texto1$, 6)
70 PRINT "De la 3 a la 7 son: "; MID$(texto1$, 3, 5)
80 PRINT "El doble del valor numérico del texto 2 es: "; VAL(texto2$)*2
90 PRINT "El codigo ASCII de la A es: "; ASC("A")
100 PRINT "La letra 99 es: "; CHR$(99)
110 PRINT "La posición de A dentro de HOLA es: "; INSTR("HOLA","A")
Cuyo resultado será:
La longitud del texto 1 es: 15
Las primeras 5 letras son: Texto
Las 6 ultimas son: prueba
De la 3 a la 7 son: xto d
El doble del valor numérico del texto 2 es: 46
El codigo ASCII de la A es: 65
La letra 99 es: c
En Basic256 hay algunas diferencias:
Las dos peculiaridades que ya conocíamos: no se puede usar números de línea y no se puede encadenar varias expresiones separadas por "punto y coma" en una misma orden PRINT
LEN se llama LENGTH
LEFT$, RIGHT$, MID$ y CHR$ no usan símbolo de "dólar", y se convierten en LEFT, RIGHT, MID y CHR
No existe VAL, pero en su lugar se puede usar INT
Por tanto, en Basic256, éste programa sería:
REM Funciones de cadena
texto1$ = "Texto de prueba"
texto2$ = "23"
PRINT "La longitud del texto 1 es: ";
PRINT LENGTH(texto1$)
PRINT "Las primeras 5 letras son: ";
PRINT LEFT(texto1$, 5)
PRINT "Las 6 ultimas son: ";
PRINT RIGHT(texto1$, 6)
PRINT "De la 3 a la 7 son: ";
PRINT MID(texto1$, 3, 5)
PRINT "El doble del valor numérico del texto 2 es: ";
PRINT INT(texto2$)*2
PRINT "El codigo ASCII de la A es: ";
PRINT ASC("A")
PRINT "La letra 99 es: ";
PRINT CHR(99)
PRINT "La posición de A dentro de HOLA es: ";
PRINT INSTR("HOLA","A")