| Apartado anterior | Apartado siguiente |
Tema 4: Operaciones matemáticas.
En Pascal contamos con una serie de operadores para realizar sumas, restas, multiplicaciones y otras operaciones no tan habituales. Algunos de ellos ya los habíamos comentado. Vamos a verlos ahora con más detalle. Son los siguientes:
| Operador | Operación | Operandos | Resultado |
| + | Suma | enteros
reales |
entero
real |
| - | Resta | enteros
reales |
entero
real |
| * | Multiplicación | enteros
reales |
entero
real |
| / | División | enteros
reales |
real |
| div | División entera | enteros | entero |
| mod | Resto | enteros | entero |
En operaciones como +, - y * supongo que no habrá ninguna duda: si sumo dos números enteros obtengo un número entero, si resto dos reales obtengo un número real, y lo mismo pasa con la multiplicación. Los problemas pueden venir con casos como el de 10/3. Si 10 y 3 son números enteros, ¿qué ocurre con su división? En otros lenguajes como C, el resultado sería 3, la parte entera de la división. En Pascal no es así: el resultado sería 3.333333, un número real. Si queremos la parte entera de la división, deberemos utilizar div. Finalmente, mod nos indica cual es el resto de la división. El signo - se puede usar también para indicar negación. Allá van unos ejemplillos:
{--------------------------} { Ejemplo en Pascal: } { } { Prueba de operaciones } { elementales } { OPERAC.PAS } { } { Este fuente procede de } { CUPAS, curso de Pascal } { por Nacho Cabanes } { } { Comprobado con: } { - Free Pascal 2.2.0w } { - Turbo Pascal 7.0 } { - Turbo Pascal 5.0 } { - Surpas 1.00 } {--------------------------} program operaciones; var e1, e2: integer; (* Numeros enteros *) r1, r2, r3: real; (* Números reales *) begin e1:=17; e2:=5; r1:=1; r2:=3.2; writeln('Empezamos...'); r3:=r1+r2; writeln('La suma de r1 y r2 es :', r3); writeln(' o también ', r1+r2 :5:2); (* Indicando el formato *) writeln('El producto de r1 y r2 es :', r1 * r2); writeln('El valor de r1 dividido entre r2 es :', r1 / r2); writeln('La diferencia de e2 y e1 es : ', e2 - e1); writeln('La división de e1 entre e2 : ', e1 / e2); writeln(' Su división entera : ', e1 div e2); writeln(' Y el resto de la división : ', e1 mod e2); writeln('El opuesto de e2 es :', -e2); end.
Supongo que no habrá ninguna duda. O:-) De todos modos, experimentad. Y ojo con el formato de "mod", porque se parece bastante poco como se diría "el resto de dividir e1 entre e2" a la notación "e1 mod e2". Aun así, todo fácil, ¿verdad?
Ejercicio propuesto: Crea un programa que pida al usuario dos números reales y muestre cuando es el resultado de su división (sólo la parte entera) y el resto de la división. Por ejemplo, si se indican los números 21 y 5, el programa debería responder que el resultado de la división es 4 y que el resto es 1
Tema 4.2: Concatenar cadenas.
El operador + (suma) se puede utilizar también para concatenar cadenas de texto, así:{--------------------------} { Ejemplo en Pascal: } { } { Concatenar cadenas } { con "+" } { CONCAT.PAS } { } { Este fuente procede de } { CUPAS, curso de Pascal } { por Nacho Cabanes } { } { Comprobado con: } { - Free Pascal 2.2.0w } { - Turbo Pascal 7.0 } { - Tmt Pascal Lt 1.20 } {--------------------------} Program Concat; var texto1, texto2, texto3: string; begin texto1 := 'Hola '; texto2 := '¿Cómo estás?'; texto3 := texto1 + texto2; writeln(texto3); (* Escribirá "Hola ¿Cómo estás?" *) end.
(Más adelante se dedica un apartado al manejo de cadenas de texto).
Cuando tratemos tipos de datos más avanzados, veremos que +, - y * también se pueden utilizar para conjuntos, e indicarán la unión, diferencia e intersección. (Esto lo veremos más adelante, en el tema 9).
Ejercicio propuesto: Crea un programa que pida al usuario su nombre y su apellido, cree una cadena formada por el apellido, una coma y el nombre (por ejemplo si el usuario introduce Nacho como nombre y Cabanes como apellido, la cadena contendrá "Cabanes, Nacho"), y finalmente escriba esa cadena.
Tema 4.3: Operadores lógicos.
Vimos de pasada en el tema 2 que había unos tipos de datos llamados "boolean", y que podían valer TRUE (verdadero) o FALSE (falso). En la próxima lección veremos cómo hacer comparaciones del estilo de "si A es mayor que B y B es mayor que C", y empezaremos a utilizar variables de este tipo, pero vamos a mencionar ya eso del "y".Podremos encadenar proposiciones de ese tipo (si A y B entonces C) con:
and (y), or (ó), not (no) y los operadores
relacionales,que se usan para comparar y son los siguientes:
| Operador | Operación |
| = | Igual a |
| <> | No igual a (distinto de) |
| < | Menor que |
| > | Mayor que |
| <= | Menor o igual que |
| >= | Mayor o igual que |
(No haremos ejercicios todavía sobre estos operadores, sino que los aplicaremos en el siguiente tema, cuando aprendamos a comprobar condiciones.
Igual que antes, algunos de ellos (>=, <=, in) los utilizaremos también en los conjuntos, más adelante.
Tema 4.4: Operaciones entre bits.
Los operadores "and", "or" y "not", junto con otros, se pueden utilizar también para operaciones entre bits de números enteros:| Operador | Operación |
| not | Negación |
| and | Producto lógico |
| or | Suma lógica |
| xor | Suma exclusiva |
| shl | Desplazamiento hacia la izquierda |
| shr | Desplazamiento a la derecha |
Explicar para qué sirven estos operadores implica conocer qué es eso de los bits, cómo se pasa un número decimal a binario, etc. Supondré que se tienen las nociones básicas, y pondré un ejemplo, cuyo resultado comentaré después:
{--------------------------} { Ejemplo en Pascal: } { } { Operaciones entre } { bits } { BITOPS.PAS } { } { Este fuente procede de } { CUPAS, curso de Pascal } { por Nacho Cabanes } { } { Comprobado con: } { - Free Pascal 2.2.0w } { - Turbo Pascal 7.0 } { - Tmt Pascal Lt 1.20 } {--------------------------} program BitOps; { Operaciones entre bits } const a = 67; b = 33; begin writeln('La variable a vale ', a); writeln('y b vale ', b); writeln(' El complemento de a es: ', not(a)); writeln(' El producto lógico de a y b es: ', a and b); writeln(' Su suma lógica es: ', a or b); writeln(' Su suma lógica exclusiva es: ', a xor b); writeln(' Desplacemos a a la izquierda: ', a shl 1); writeln(' Desplacemos a a la derecha: ', a shr 1); end.
Veamos qué ha ocurrido. La respuesta que nos da Turbo Pascal 7.0 es la siguiente:
- - - - - - - - - - - - - - - - - - - - - - - - - - -
La variable a vale 67
y b vale 33
El complemento de a es: -68
El producto lógico de a y b es: 1
Su suma lógica es: 99
Su suma lógica exclusiva es: 98
Desplacemos a a la izquierda: 134
Desplacemos a a la derecha: 33
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Para entender esto, deberemos convertir al sistema binario esos dos números:
67 = 0100 0011
33 = 0010 0001
- En primer lugar complementamos "a", cambiando los ceros por unos:
1011 1100 = -68
- Después hacemos el producto lógico de A y B,
multiplicando
cada bit,
de modo que 1*1 = 1, 1*0 = 0, 0*0 = 0
0000 0001 = 1
- Después hacemos su suma lógica, sumando cada bit, de modo que
1+1 = 1, 1+0 = 1, 0+0 = 0
0110 0011 = 99
- La suma lógica exclusiva devuelve un 1 cuando los dos bits son distintos:
1 xor 1 = 0, 1 xor 0 = 1, 0 xor 0 = 0
0110 0010 = 98
- Desplazar los bits una posición a la izquierda es como
multiplicar
por
dos:
1000 0110 = 134
- Desplazar los bits una posición a la derecha es como
dividir
entre
dos:
0010 0001 = 33
¿Y qué utilidades puede tener todo esto? Posiblemente, más de las que parece a primera vista. Por ejemplo: desplazar a la izquierda es una forma muy rápida de multiplicar por potencias de dos; desplazar a la derecha es dividir por potencias de dos; la suma lógica exclusiva (xor) es un método rápido y sencillo de cifrar mensajes; el producto lógico nos permite obligar a que ciertos bits sean 0; la suma lógica, por el contrario, puede servir para obligar a que ciertos bits sean 1...
Ejercicio propuesto: Crea un programa que pida al usuario un número entero, le aplique una operación XOR 21 y muestre el resultado, aplique nuevamente una operación XOR 21 sobre dicho resultado y muestre el valor final obtenido
Curso de Pascal. Tema 4.5: Precedencia de los operadores.
Para terminar este tema, debemos conocer la precedencia (o prioridad) de los operadores:
| Operadores | Precedencia | Categoría |
| @ not | Mayor (1ª) | Operadores unarios |
| * / div mod
and shl shr |
2ª | Operadores de multiplicación |
| + - or xor | 3ª | Operadores de suma |
| = <> < >
<= >= in |
Menor (4ª) | Operadores relacionales |
Esto quiere decir que si escribimos algo como 2+3*4, el ordenador primero multiplicará 3*4 (la multiplicación tiene mayor prioridad que la suma) y luego sumaría 2 a ese resultado, de modo que
obtendríamos 14. Si queremos que se realice antes la suma, que tiene menor nivel de precedencia, deberíamos emplear paréntesis, así:
(2+3)*4
Y queda como ejercicio hallar (y tratar de entender) el
resultado
de este programita:
{--------------------------} { Ejemplo en Pascal: } { } { Prueba de prioridad } { en las operaciones } { elementales. } { EJT04.PAS } { } { Este fuente procede de } { CUPAS, curso de Pascal } { por Nacho Cabanes } { } { Comprobado con: } { - Turbo Pascal 7.0 } { - Turbo Pascal 5.0 } { - Surpas 1.00 } {--------------------------} Program EjT04; begin writeln('Allá vamos... '); writeln( 5+3+4*5*2 ); writeln( (5+3)*4+3*5-8/2+7/(3-2) ); writeln( 5 div 3 + 23 mod 4 - 4 * 5 ); end.
| Apartado anterior | Apartado siguiente |