Con la directiva #define podemos
definir macros en las primeras líneas del fichero.
Antes de compilar el programa, en
una primera pasada, el compilador sustituirá la macro por su valor en todos los
sitios que aparezca.
Podemos usar las macros para
definir constantes:
#define FALSO 0 /* Valores constantes en
mayúsculas */
#define PI 3,141592
Las podemos usar para casos más
complicados
#define MAX(a,b)(a>b?a:b)
c
à Caracter à ‘a’
d
à Decimal entero con
signo à 382
e
à Notación científica
(mantisa/exponente) à
3.9865e+2
E
à Notación científica
(mantisa/exponente) à
3.9865E+2
F
à Decimal en coma flotante
à 392,65
g
à Usa el privilegio de
%e o %f à 392,65
G
à Usa el privilegio de
%E o %F à 392,65
o
à Octal à 610
s
à Secuencia de
caracteres à ‘sample’
u
à Decimal entero sin
signo à 7235
x
à Hexadecimal sin signo à 7fa
X
à Hexadecimal sin signo à 7FA
p
à Dirección de puntero à B8600000
Añadiendo entre el % y la letra un . y a continuación un
número, especifico la precisión que deseo, cuyo significado depende del tipo de
datos y la letra empleada.
- Para enteros (d, i, o, u,
x, X) à
Especifica el número mínimo de dígitos que pueden ser escritos. Si el dado
es más largo no será contado. Si es más corto se rellenará con ceros.
- Para reales (e, E, f) à
Especifica el número de dígitos decimales que saldrán
- Para reales (g, G) à
Especifica el número máximo de dígitos decimales que saldrán
- Para cadenas à
Número máximo de caracteres a ser escritos. Por defecto se escriben todos
los que tienen la cadena antes del /
- Caracter nulo à \O!
Ejemplo
/* printf example */
#include<stdio.h>
int main()
{
printf(“Characters: %c, %c
\n”,’a’,65);
printf(“Decimals: %d, %d \n”,1977,6500001);
printf(“Procedy with blants: %.10d
\n”,1977);
printf(“Procedy with blants: %010d
\n”,1977);
printf(“Blue differents redixes:
%d,%x,o,%#X,%#o |n”,100,100,100,100,100);
printf(“Width triels: %*d \n”,5,10);
}
En ocasiones los tipos que ofrece un lenguaje de
programación como tipos predefinidos se le quedan cortos al programador para
almacenar en ellos la información que tiene que manejar.
Los lenguajes de programación ofrecen mecanismos para que el
programador puede definirse tipos.
Concretamente, es raro que un lenguaje de programación no
ofrezca la posibilidad de hacer uso de vectores
y registros
Antes de declarar una variable de un tipo de datos definido
por el usuario, será necesario declarar el tipo de datos en cuestión. Hay
lenguajes de programación (C por ejemplo) donde esto no es necesario.
Algoritmo ejemplo
{comentarios}
“Declaración de constantes”
“Declaración de tipos”
“Declaración de
variables”
Principio
“instrucción 1”
“instrucción 2”
…
“instrucción n”
Fin
Un vector es un tipo de datos que nos permite guardar una
secuencia de datos de un tipo determinado.
Hay problemas en los que tengo que guardar una secuencia de
datos de un mismo tipo y donde el orden podría ser importante, incluso el poder
acceder directamente a un elemento determinado de una secuencia.
Por ejemplo, yo con lo que conozco hasta ahora no podría
resolver problemas como este:
“Pedir una secuencia
de datos por teclado terminada en 0 (de longitud desconocida pero finita y
acotable), e invertirla mostrando por pantalla la secuencia en orden inverso.”
Disponía hasta ahora de variables enteras, pero no de una
forma de poder almacenar 20, 50 o 100 enteros y poderlos manipular a mi antojo.
Otro ejemplo podría ser el siguiente:
“Contar el número de
apariciones de una letra del alfabeto de un texto que es introducido una sola
vez en el computador”
Un vector v es una aplicación de un conjunto finito I de
valores escalares, ordenados y consecutivos, denominado conjunto de índices del
vector, en otro conjunto D de datos variables de un mismo tipo, conjunto de
base del vector.
Los valores escalares del conjunto I podrían ser de un tipo
entero, caracter o definido por enumeración. Se puede poner el tipo completo
(si es definido por enumeración) o un subgrupo.
El tipo de datos para los datos variables, podría ser
cualquiera.
Ejemplos:
vector[1,15] de real;
vector[‘A’,’Z’ de
real;
vector[tipoDias] de
caracter (siendo
tipoDias=(lunes,martes,miércoles,jueves,viernes,sábado,domingo)
Algoritmo vectores
Tipos
vectorReales=vector[1..20] de real;
vectorFrecuencias=vector[‘a’..’z’]
de entero;
variables
v:vectorReales;
w:vectorReales;
f:vectorFrecuencias;
principio
…
Fin
Una variable de tipo vector es una estructura de datos
compuesta de un número fijo de componentes del tipo de datos del vector.
Cada componente puede denotarse explícitamente y puede
accederse a su valor, escribiendo el nombre de la variable de tipo vector,
seguido del valor de su índice, encerrado entre corchetes.
<nombre
vector>[<expresión>]
La evolución de <expresión>
da como resultado el valor del índice del elemento considerado.
Una componente de un vector puede usarse exactamente igual
que una variable de ese mismo tipo, y puede aparecer en cualquier expresión del
mismo modo.
Ejemplos:
v[17:=14.1];
w[i]=w[i-1]+1;
f[‘a’]=f[‘b’]+f[chr(ord(‘c’)+9]-7;
si (v[i]>[i+1])
entonces…
La representación interna de un dato de tipo vector se
realiza de forma contigua en memoria, es decir, representando una tras otra
todas las componentes del vector.
Por consiguiente lo que el vector ocupará en memoria
dependerá del tipo del que sean las componentes y el número de componentes.
El tiempo de acceso a cualquiera de las componentes será
lógicamente el mismo, y podemos acceder directamente a las componentes que nos
interesen.
Asignación. Al
igual que con cualquier variable podemos asignarle a un vector otro vector que
sea exactamente del mismo tipo.
El resultado de la instrucción de asignación, a todas y cada
una de las componentes del vector del lado izquierda, de todos los vectores de
las componentes del vector del lado derecho.
Recorrido del vector:
para indice:=<valor inicial> hasta
<valor final> hacer
<acción afectando a
la componente índice>
fpara
Ejemplo:
Algoritmo invertirSecuencia
{Lee una secuencia de
datos del tipo entero, terminada con un 0, y la escribes en orden inverso. La
secuencia será de longitud menor que 1000}
Constantes
N=1000;
Tipos
tvec=vector[1..N]de entero;
Variables
v:tvec;
cont,num,i:entero;
principio
cont:=0;
leerEntero(teclado,numero);
mientras que numero <>0 hacer
cont:=cont+1;
v[cont]:=numero;
leerEntero(teclado,numero);
fmq
para i:=cont descendiendo hasta 1
hacer
escribirEntero(pantalla,v[i]);
fpara
fin
Escribe un procedimiento que lea de teclado una secuencia de
caracteres y los almacene en el vector secuencia de tipo tsec. N y secuencia
son parámetros del procedimiento
Algoritmo almacenarCaracteres
Constantes
maxN=1000;
Tipos
tsec:=vector[1..maxN] de caracter;
procedimiento
leerSecuencia (E N:entero, S secuencia:tsec)
variables
indice:entero;
principio
para indice:=1 hasta N
hacer
leerCaracter(teclado,secuencia[indice]
fpara
fin
Escriba un procedimiento que escriba por pantalla los N
primeros elementos del vector secuencia
Procedimiento escribirSecuencia(E
N:entero, E secuencia:tsec)
variables
indice:entero;
principio
para
indice:=1 hasta N hacer
escribirCaracter(pantalla,secuencia[indice])
fpara
fin
Una estructura de datos multi-indexada puede ser construida
a partir de mecanismos de definición de vectores (con un único índice)
presentado anteriormente.
Así, por ejemplo, una matriz de dimensión nx puede ser
declarada como un vector de vectores:
Constantes
N=150;
M:50;
Tipos
fila=vector[1..N]
de entero;
columna=vector[1..M]
de fila;
Variables
m:matriz;
El dato declarado y sus elementos pueden ser accedidos de la
forma:
- m à
Dato de tipo matriz
- m[i] à
Dato de tipo fila
- m[i][j] à
Dato de tipo entero
También se puede definir (ya que la forma anterior puede
resultar algo pesada) un vector con varios índices.
Tipos
matriz=vector[1..N,1..M]
de entero;
estadoCasilla=(agua,barco);
planoNaval=vector[‘A’..’J’,1..10]
de estadoCasilla;
Variables
m:matriz;
miPlano:planoNaval;
Para acceder a los elementos:
- m à
Dato de tipo matriz
- m[i,j] à
Dato de tipo entero
- miPlano à
Dato de tipo plano
- miPlano[‘C’,7] à
Dato de tipo estado
0 comments:
Publicar un comentario