Académique Documents
Professionnel Documents
Culture Documents
Un algoritmo
algoritmo es el
el conjunto de operaciones
operaciones y procedimientos
procedimientos
que deben seguirse para resolver un problema. La palabra "algoritmo"
deriva del nombre latinizado del gran matemático árabe Mohamed Ibn
Moussa Al Kow Rizmi, el cual escribió sobre entre los años 800 y 825
su obra Quitab Al Jabr Al Mugabala, donde se recogía el sistema de
numeración hindú y el concepto del cero. Fue Fibonacci, el que
tradujo su obra al latín y la inició con las palabras: Algoritmi
dicit.
+-Algoritmo raíces
|
| Variables reales a,b,c,x,y
|
| Escribir "Introduzca los coeficient
coeficientes
es de mayor a menor grado."
| Leer a,b,c
|
| +-Si sqr(b)>= 4*a*c entonces
| | x=(-b+sqrt(b^2-4*a*c))/
x=(-b+sqrt(b^2-4*a*c))/2a
2a
| +-Sino
| | Escribir "No existen raíces reales."
| +-Finsi
|
+-Final
0.4 Organigrama
Organigramas.
s.
Símbolos generales:
+-Algoritmo Suma
|
| Variable entera a,b
|
| Escribir "Indique el primer sumando"
| Leer a
| Escribir "Indique el segundo sumando"
| Leer b
| c=a+b
| Escribir "El resultado es: ";c
|
+-Final
+----------------------------+
| T R A Z A |
+------------+---------------+
| Comentario | Valores |
+------------+---------------+
| Leemos a: | a <- 4 |
| Leemos b: | b <- 5 |
| Calcula c: | c <- a+b <- 9 |
| Escribe c: | c <- 9 |
+------------+---------------+
Ejemplo:
1.2.1 Tipos.
Ejemplo:
+-Algoritmo Circunferen
Circunferencia
cia
|
| Constante real PI=3.1416
| Variable real r,c
|
| Escribir "Introduzca el radio de la circunferen
circunferencia"
cia"
| Leer r
| c=2*Pi*r
| Escribir "Su longitud es: ",c
|
+-Final
+-Algoritmo Producto_Es
Producto_Escalar
calar
|
| Vector entero a[1..3], b[1..3]
| Variable entera c
|
| Escribir "Introduzc
"Introduzca
a el vector A (x,y,z)"
| Leer a[1],a[2],
a[1],a[2],a[3]
a[3]
| Escribir "Introduzc
"Introduzca
a el vector B (x,y,z)"
| Leer b[1],b[2],
b[1],b[2],b[3]
b[3]
|
| c=a[1]*b[1]+a[2]*b[2]+a[3]*b[3]
|
| Escribir "El producto escalar es: ",c
|
+-Final
+-Algoritmo Circunferencia
|
| Constante real PI=3.1416
| Variable real r,c
|
+---->Escribir
+---->Escribir "Introduzca el radio de la circunferen
circunferencia"
cia"
Bloque | | Leer r
del | | c=2*Pi*r
Programa+---->Escribir
Programa+---->Escribir "Su longitud es: ",c
|
+-Final
+-Algoritmo Factorial
|
| Variable real num,valor
|
| Escribir "Introduzc
"Introduzca
a el número a factorizar:
factorizar:"
"
| Leer num
|
| Factor(num,valor)
Factor(num, valor) <- Llama al Procedimie
Procedimiento
nto Factor
| | |
| +---+---> Parámetro Actuales.
|
| Escribir "El factorial es: ",valor
|
+-Final
Ejemplo:
+--------------------+------------------------+
| Variables Locales | Subalgoritm
Subalgoritmo
o propio |
| Variables Globales | Cualquier subalgoritmo |
+--------------------+------------------------+
TEMA 3: Sentencias
- Sentencias Simples.
- Sentencias Compuestas.
- Sentencias de control del flujo del algoritmo.
- Sentencias Reiterativ
Reiterativas:
as: Mientras, Repetir, Para.
- Sentencias Condicionales: Si, Case... of
+-------------+-----------------------------------------------+
| + | Suma |
| - | Resta |
| * | Producto |
| / | División (devuelve un valor real) |
| div | División (devuelve un valor entero) |
| mod | Cálculo del módulo aritmético. |
| log | Logaritmo en base 10 |
| ln | Logaritmo neperiano |
| exp | Exponencial de un número |
| pow | Potencia de un número |
| random | Obtención de un número aleatorio |
| abs | Obtenemos el valor absoluto de un número |
| sqr | Obtención del cuadrado de un número |
| sqrt | Obtención de la raíz cuadrada |
| sin,cos,tan | Funciones trigonométric
trigonométricas
as |
| chr/toascii | Obtenemos un carácter a partir de un número |
| ord | Obtenemos el número correspondien
correspondiente
te al código |
| | ASCII |
+-------------+-----------------------------------------------+
+----+-----------------+
| = | Igual a |
| < | menor que |
| > | mayor que |
| <= | menor o igual a |
| >= | mayor o igual a |
| <> | distinto de |
+----+-----------------+
Operadores booleanos:
+--------------------------+
| true AND true -> true |
| true AND false -> false |
| false AND true -> false |
| false AND false -> false |
+--------------------------+
+-------------------------+
| true OR true -> true |
| true OR false -> true |
| false OR true -> true |
| false OR false -> false |
+-------------------------+
Operador XOR: (se cumple cuando las dos condiciones son distintas)
+--------------------------+
| true XOR true -> false |
| true XOR false -> true |
| false XOR true -> true |
| false XOR false -> false |
+--------------------------+
+--------------------+
| NOT true -> false |
| NOT false -> true |
+--------------------+
----------------------
------------- --------- Para leer el registro 'd', la cabeza
+- a b c d ... lectora, deberá pasar antes por los
| -------------
----------------------
--------- que le preceden.
+> cabeza lectora.
- Cerrar (variable)
- Leer/Escribi
Leer/Escribir/Reescribi
r/Reescribir
r (variable1,v
(variable1,variable2)
ariable2)
- NO fin (variable)
Ejemplo: En este ejemplo se intenta dar aun visión general del uso
de ficheros secuenciales.
secuenciales.
+-Algoritmo Copiar_fich
Copiar_fichero
ero
|
| Fichero de enteros Origen,Desti
Origen,Destino
no
| Variable entera x
|
| Escribir ("Indique el nombre del fichero Origen:");
| Leer Origen
| Escribir ("Indique el nombre del fichero Destino:")
| Leer Destino
|
| Abrir secuencial (Origen)
| Iniciar lectura en (Origen)
| Abrir secuencial (Destino)
| Iniciar escritura en (Destino)
|
| +-Mientras (NO fin(Origen)) hacer
| | Leer (Origen,x)
| | Escribir (Destino,x)
| +-Finmientra
+-Finmientras
s
|
| Escribir ("Fichero Copiado:")
|
| Cerrar (Origen)
| Cerrar (Destino)
|
+-Final
Ejemplo:
+-Registro datos-alumno
| Cadena nombre
| Cadena apellido1
| Cadena apellido2
| Cadena NIF
| Cadena curso
| Cadena telefono
| Cadena fecha_nac
| ...
+-Finregistro
+-----+------------+
| Reg | D A T O |
+-----+------------| Fíjese que los datos están
| 1 | LUIS | almacenados en el orden en el
| 2 | CARLOS | que han sido introducidos por el
| 3 | TERESA | usuario.
| 4 | JOAQUIN |
| 5 | INMA | Accedemos a los datos por medio
| 6 | JOSE | del valor de la posición del
+-----+------------+ registro.
Ejemplo:
+-Algoritmo Contador_de
Contador_de_registros.
_registros.
|
| Fichero de enteros F
| Variable entera x,contador
|
| Abrir directo (F)
| Iniciar lectura (F)
| contador = 0
| +-Mientras (NO fin(F)) hacer
| | Leer directo(F,
directo(F,x)
x)
| | contador=contador+1
contador=contador+1
| +-Finmientra
+-Finmientras
s
| Cerrar(F)
|
| Escribir ("El fichero:";F;
fichero:";F;"posee:";co
"posee:";contador;"reg.
ntador;"reg.")
")
|
+-Final
+------------+-------------------------------------+
| Clave | Clave Clave Clave |
| Principal | Secundaria Secundaria Secundaria |
+--------------------------------------------------+
+---------+------------+------------+-------------+--------+
| (Direc) | (D.N.I.) | (Nombre) | (Provincia) | (Edad) |
+---------|------------|------------|-------------|--------+
| 1 | 55.366.546 | LUIS | Las Palmas | 16 |
| 2 | 42.386.225 | CARLOS | Salamanca | 17 |
| 3 | 32.387.203 | TERESA | Oviedo | 16 |
| 4 | 46.399.554 | INMA | Palencia | 20 |
| 5 | 60.643.434 | JOAQUIN | Salamanca | 17 |
| 6 | 22.543.986 | JOSE | Las Palmas | 23 |
+---------+------------+------------+-------------+--------+
Como podemos observar, esto sería un ejemplo de un fichero
indexado.
+------------+---------+ +------------+---------+
| (D.N.I.) | (Direc) | | (Nombre) | (Direc) |
+------------+---------| +------------+---------+
| 22.543.986 | 6 | | CARLOS | 2 |
| 32.387.203 | 3 | | INMA | 4 |
| 42.386.225 | 2 | | JOAQUIN | 5 |
| 46.399.554 | 4 | | JOSE | 6 |
| 55.366.546 | 1 | | LUIS | 1 |
| 60.643.434 | 6 | | TERESA | 3 |
+------------+---------+ +------------+---------+
+--------------------------+ +---------------------------+
| Tabla de Ac. Clave Princ.|
Princ.| | Tabla de Ac. Clave
Clave Secund.|
Secund.|
+--------------------------+ +---------------------------+
- Cerrar (variable)
- Leer/Escribi
Leer/Escribir/Reescribi
r/Reescribir
r (variable1,K
(variable1,KEY=,variabl
EY=,variable2)
e2)
- NO fin (variable)
Esta función devuelve el valor lógico 'true' si no se ha
encontrado el final del fichero; y devuelve el valor lógico 'false'
si se ha encontrado el final del fichero.
- Error (variable)
Ejemplo:
+-Algoritmo Buscar_Pers
Buscar_Persona.
ona.
|
| +-Registro estructurado datos_personales
| | Variable cadena dni
| | Variable cadena nombre
| | Variable cadena tlf
| | Variable cadena provincia
| +-Finregistr
+-Finregistroo
|
| Fichero de datos_person
datos_personales
ales F
| Variable cadena documento
| Variable de datos_perso
datos_personales
nales dato
|
| Escribir "Indique el DNI de la persona a buscar"
| Leer documento
|
| Abrir indexado (F,KEY=dni,n
(F,KEY=dni,nombre)
ombre)
| Iniciar lectura (F)
|
| Leer (F,KEY=doc
(F,KEY=documento,dato)
umento,dato)
| +-Si error(F)<>
error(F)<>00 entonces
| | Escribir "Ese registro no existe."
| +-Sino
| | Escribir " DNI: ";dato.dni
| | Escribir " Nombre: ";dato.nombr
";dato.nombre
e
| | Escribir " Tlf: ";dato.tlf
| | Escribir "Provincia: ";dato.provi
";dato.provincia
ncia
| +-Finsi
|
| Cerrar (F)
+-Final
Muchas veces
veces surge el caso del que el fichero
fichero es tan grande
grande
que la tabla no puede mantener una ordenación eficaz debido a que
cuando introducimos
introducimos un nuevo dato debe hacerse un espacio en la
misma para albergar a éste. Es por ello que recurrimos al "Hashing".
Veamos un ejemplo:
+-Algoritmo Orden_selec
Orden_selección
ción
|
| Constante entera n=...
| Vector entero a(1..n)
| Variable entera x,i,j,h,mayo
x,i,j,h,mayor
r
|
| Escribir "Introduzc
"Introduzca
a el vector a ordenar"
| +-Para h desde 1 hasta n hacer
| | Leer a(h)
| +-Finpara
|
| +-Para k desde 1 hasta n-1 hacer
| | mayor <- k
| | +-Para j desde k+1 hasta n hacer
| | | +-Si a(j)<a(i) entonces mayor <-j
| | | +-Finsi
| | +-Finpara
| | x <- a(j)
| | a(j) <- a(i)
| | a(i) <- x
| +-Finpara
| Escribir a
+-Final
+-Algoritmo Busqueda_se
Busqueda_secuencial
cuencial
|
| Constante entera n=...
| Vector entero a(1..n)
| Variable entera x,i,j,h,mayo
x,i,j,h,mayorr
|
| Escribir "Introduzca el valor a buscar"
| Leer x
|
| k <- 0
| +-Repetir
| | k <- k+1
| | +-Si a(k)=x entonces
| | | Escribir "El dato: ";a;
| | | "esta en la posición: ";k
| | +-Finsi
| +-Hasta que (k=n) or (a(k)=x)
+-Final
+-Algoritmo Búsqueda_di
Búsqueda_dicotómica
cotómica
|
| Constante entera n= ...
| Vector de enteros a(1..n)
| Variable entera x,i,j,m,h
|
| Escribir "Introduzc
"Introduzca
a el vector a ordenar"
| +-Para h desde 1 hasta n hacer
| | Leer a(h)
| +-Finpara
|
| Escribir "Introduzca el valor a buscar"
| Leer x
|
| i <- 1
| j <- n
|
| +-Repetir
| | m <-(i+j) div 2
| | +-Si x < a(m) entonces
| | | j <- m-1
| | +-Sino
| | | i <- m+1
| | +-Finsi
| +-Hasta que (a(m)=x or i>j)
|
| +-Si i>j entonces
| | Escribir "El dato a buscar no se encuentra."
| +-Finsi
|
+-Final
+-Algoritmo mezcla
|
| +-Registro estructurado r
| | variable cadena clave
| | ...
| +-Finregistr
+-Finregistro
o
|
| Ficheros de r A,B,C
| Variables enteras a,b
|
| Abrir secuencial A,B,C
| Iniciar lectura en A,B
| Iniciar escritura en C
|
| Leer (A,a)
| Leer (B,b)
|
| +-Mientras (NO fin(A) AND NO fin(B)) hacer
| | +-Si a.clave < b.clave entonces
| | | Escribir (C,a)
| | | Leer (A,a)
| | +ÄSino
| | | Escribir (C,b)
| | | Leer (B,b)
| | +-Finsi
| +-Finmientra
+-Finmientras
s
|
| +-Mientras (NO fin(A)) hacer
| | Escribir (C,a)
| | Leer (A,a)
| +-Finmientra
+-Finmientras
s
|
| +-Mientras (NO fin(B)) hacer
| | Escribir (C,b)
| | Leer (B,b)
| +-Finmientra
+-Finmientras
s
|
| Cerrar A,B,C
|
+-Final
TEMA 0: Introducción
Paso 1: ESCRIBIRLO
Paso 2: COMPILARLO
Paso 3: ENLAZARLO
Paso 4: EJECUTARLO
El programa
p rograma se puede
pu ede ejecutar
e jecutar simplemente tecleando su
nombre desde la línea de comandos del sistema operativo.
ESQUEMA
1.0 Introducció
Introducción
n
En este segundo tema se describirá la estructura básica de
un programa en lenguaje C así como la forma de visualizar distintos
tipos de datos en pantalla. Se introducirán los conceptos de tipos
de datos básicos y su utilidad.
main()
{
printf ("\nHola mundo");
}
printf ("mensaje");
+-------------------------+------+
| Nueva línea | \n |
| Tabulador horizontal | \t |
| Tabulador vertical | \v |
| Backspace (<-) | \b |
| Retorno de carro | \r |
| Avance de página | \f |
| Pitido (alerta) | \a |
| Caracter \ | \\ |
| Caracter ? | \? |
| Caracter ' | \' |
| Caracter " | \" |
| Número Octal (ooo) | \ooo |
| Número Hexadecimal (hh) | \xhh |
+-------------------------+------+
+--------+---------------------------------------+
| int | Representa números enteros. |
| float | Representa números decimales. |
| double | Representa números decimales de mayor |
| | precisión. |
| char | Representa caracteres. |
+--------+---------------------------------------+
int numero1,numero2,numero3;
float coordenada_x,coordenada_y;
main()
{
int numero;
numero =20;
}
+---+---------------------------------------------+
| + | para indicar suma |
| - | para indicar resta |
| * | para indicar producto |
| / | para indicar división |
| % | para indicar módulo (resto división
división entera) |
+---+---------------------------------------------+
b=30;
a=(float)b;
#include <stdio.h>
main()
{
float e,v,t;
e = v*t;
printf ("\nVelocidad : %f\nTiempo : %f",v,t);
printf ("\nEspacio recorrido : %f",e);
}
+-----+------------------------------------------------+
| d,i | Entero en notación decimal con signo. |
| o | Entero notación octal sin signo. |
| x,X | Entero en notación hexadecimal sin signo. |
| u | Entero en notación decimal sin signo. |
| c | Entero como caracter simple. |
| s | Cadena de caracteres. |
| f | Tipo double (ó float) de la forma [-]mmmm.ddd. |
| e,E | Tipo double (ó float) en notación científica o |
| | exponencial [-]m.dddde+-
[-]m.dddde+-xx
xx ó [-]m.ddddE+-
[-]m.ddddE+-xx.
xx. |
| p | Tipo puntero. |
+-----+------------------------------------------------+
printf ("%f",numero
("%f",numero);
);
Visualiza un número real en el formato
formato normal, parte entera
entera
y parte decimal separadas por un punto.
printf ("%5.2f",num
("%5.2f",numero);
ero);
Visualiza un número entero en el mismo formato que la
anterior, pero sólo visualizando 5 cifras y siendo dos de ellas
reservadas para la parte decimal.
#include <stdio.h>
main()
{
int i;
float a,b;
i = 10;
a = 30.456;
b = 678.12;
main()
{
float v,t,e;
2.0 Introducció
Introducción
n
== Representa igualdad.
!= Representa desigualdad
> Mayor que.
< Menor que.
>= Mayor o igual que.
<= Menor o igual que.
&& Y lógico.
|| O lógico.
(a==2)||((b>=0)&&(b<=20))
if (condición
(condición)
) instrucción;
instrucción;else
else instrucción;
Un programa
p rograma ejemplo nos indicará su funcionamiento
f uncionamiento con
claridad. Supongamos
Supongamos que deseamos dividir dos números. El número por
el que dividimos no puede ser cero, ésto nos daría un valor de
infinito, provocando un error en el ordenador. Por tanto antes de
dividir deberíamos de comprobar si el divisor es cero. El programa
sería algo como ésto:
#include <stdio.h>
main()
{
float dividendo,divisor;
if (divisor==0)
printf ("\nNo podemos dividir un número por 0");
else
printf ("\nEl resultado es: %f",dividendo/divisor);
}
2.2.0 Introducció
Introducción
n
En la introducción
introducción ya se ha mencionado lo que es un bucle.
Una secuencia de instrucciones
instruccione s que se repite un número determinado
de veces o hasta que se cumplan unas determinadas condiciones.
Los bucles
bucles son extremadamente
extremadamente útiles en nuestros
nuestros programas,
programas,
algunos ejemplos son:
* Lectura/Visualización
Lectura/Visualización de un número determinado de datos,
como por ejemplo una matriz.
A continuación
c ontinuación describiremos
describirem os las
la s opciones
op ciones que nos
proporciona el lenguaje de programación C para crear y gestionar los
bucles.
for (exp1;exp2;
(exp1;exp2;exp3)
exp3) instrucción
instrucción;
;
#include <stdio.h>
main()
{
int i; /* Esta variable la utilizaremos como contador*/
#include <stdio.h>
main()
{
int i;
int tabla1,tabla2;
for (i=1;i<11;i++)
(i=1;i<11;i++)
{
printf ("\n %2dx%2d=%3d",tabla1,i,tabla1*i);
printf (" %2dx%2d=%3d",tabla2,i,ta
%2dx%2d=%3d" ,tabla2,i,tabla2*i);
bla2*i);
}
}
El ejemplo
ejem plo es análogo al anterior,
anter ior, pero
pe ro en este caso
visualizamos
visualizamo s valores desde uno a diez, en lugar de visualizarlos
visualizarlo s de
0 a 9. En este ejemplo, el bucle actúa sobre un conjunto de
instrucciones,
instrucciones, no sobre una sola, por tanto debemos introducirlas
introducirlas
entre las llaves para indicar al compilador que la instrucción for
actúa sobre las dos instrucciones.
instruccione s. Estamos considerando todo lo que
se encuentre entre las llaves como una sola instrucción.
for (i=0;i<20;i++)
(i=0;i<20;i++)
{
printf ("Jugador preferido %d",i);
for (j=0;j<3;j++)
{
leo característica j;
la almaceno donde sea;
}
}
exp1;
while (exp2)
{
instrucción;
exp3;
}
#include <stdio.h>
main()
{
int i;
i = 0;
while (i<10)
{
printf ("\n%d",i);
i++;
}
}
#include <stdio.h>
main()
{
int numero;
numero = 10;
while (numero!=0)
{
printf ("\nDime un número:");
scanf ("%d",&numero);
}
}
Su funcionamiento
funcionamien to es análogo al anterior, con la única
salvedad de que la condición ahora se evalúa después de ejecutar la
instrucción su sintaxis sería:
#include <stdio.h>
main()
{
int numero;
do
{
printf ("\nDime un numero :");
scanf ("%d",&numero);
} while (numero !=0);
#include <stdio.h>
main()
{
int numero;
int contador;
contador =0;
do
{
printf ("\nIntroduce el número %2d:",contador);
scanf ("%d",&numer
("%d",&numero);
o);
if ((numero<0)||(numero>20)) continue;
contador++;
} while (contador<50);
}
Este programa lee números en una variable hasta un máximo de
50, alcanzado este máximo el programa termina. Además si el número
no está entre 0 y 20 (si es menor que 0 o mayor que 20) vuelve a
pedir que lo introduzcamos. El comando continue en la instrucción if
obliga al programa a saltar a la instrucción while donde se vuelve a
evaluar la condición, sin pasar por la línea en la que se incrementa
el contador. De esta forma se nos vuelve a pedir el mismo número y
la entrada incorrecta no es tenida en cuenta.
#include <stdio.h>
main()
{
int i;
for (i=0;i<20;i++)
(i=0;i<20;i++)
{
if (i==5) break;
printf ("\n%d",i);
}
printf ("\n\n%d",i)
("\n\n%d",i);
;
}
0
1
2
3
4
2.2.2.1 Introducció
Introducción
n
#include <stdio.h>
main()
{
int opcion;
switch (opcion)
{
case 1:
/* Código para cargar fichero de datos*/
break;
case 2:
/* Código para almacenar datos */
break;
case 3:
/* Código para modificar datos */
break;
case 4:
/* Salir del programa */
exit (0);
default :
printf ("\nSu opción no está disponible");
printf ("\nInténtelo con otra");
}
switch (variable)
{
case valor1-varia
valor1-variable:
ble:
código asociado;
case valor2-varia
valor2-variable:
ble:
código asociado;
.
.
case valorN-varia
valorN-variable:
ble:
código asociado;
default:
código asociado;
}
while (Opcion!=0)
{
/* Secuencia de printfs que muestran en pantalla
el menú. En este caso la opción 0 debería ser salir */
switch (opcion)
{
/* Secuencia de cases */
default :
/* Mostrar mensaje de error */
}
}
@N - Activa Negrita.
@n - Desactiva Negrita.
@C,@c - Activa/desactiva cursiva.
@S,@s - idem sibrayado
etc...
3.0 Introducció
Introducción.
n.
tipo_de_dato
tipo_de_dato identificado
identificador[tamaño1][
r[tamaño1][tamaño2]...;
tamaño2]...;
Dónde :
a = matriz [2][1];
/* A toma el valor del elemeto (2,1) comenzando a contar
desde 0 o del (3,2) si consideramos que el primer valor de la matriz
es el (1,1) */
int matriz[2][3] = {
{ 1,2,3 },
{ 4,5,6 }
};
#include <stdio.h>
#include <math.h>
main()
{
float senos[360]; /* Almacenamos senos */
float cosenos[360];
int i;
3.2.0 Introducció
Introducción
n
struct [Nombre_de_la_estructura
[Nombre_de_la_estructura]
]
{
tipo1 campo1;
tipo2 campo2;
.
.
tipoN campoN;
} [variable];
La palabra
palabra clave struct define una
una estructura.
estructura. Por tratarse
de un tipo de datos puede utilizarse directamente para definir una
variable. La variable aparece entre corchetes puesto que puede ser
omitida. Si se especifica una variable, estaremos definiendo una
variable cuyo tipo será la estructura que la precede. Si la variable
no es indicada definimos un nuevo tipo de datos (struct
Nombre_de_la_estructura)
Nombre_de_l a_estructura),, que podremos utilizar posteriormente.
posteriorme nte. Si
es el nombre de la estructura lo que se omite, tendremos que
especificar obligatoriamente
obligatoriamente una variable que tendrá
tendrá esa estructura
estructura
y no podremos definir otras variables con esa estructura sin tener
que volver a especificar todos los campos. Lo que se encuentra
dentro de las llaves es una definición típica de variables con su
tipo y su identificador.
identificado r. Todo esto puede parecer un poco confuso
pero lo aclararemos con unos ejemplos.
struct punto
{
float x;
float y;
int color;
} punto_de_fuga;
int
float
double
char
struct punto
punto_de_fuga.x = 0;
punto_de_fuga.y = 0;
punto_de_fuga.color = 10;
matriz_de_puntos[4].x = 6;
struct otra
{
float x[10];
} matriz_de_puntos;
struct vector
{
float x;
float y;
float z;
};
struct poligono_cuadrado
poligono_cuadrado
{
struct vector p1;
struct vector p2;
struct vector p3;
struct vecto p4;
};
struct cubo
{
struct poligono_cua
poligono_cuadrado
drado cara[6];
int color;
struct vector posicion;
};
mi_cubo.color = 0;
mi_cubo.posicion.x
mi_cubo.posicion.x = 3;
mi_cubo.posicion.y
mi_cubo.posicion.y = 2;
mi_cubo.posicion.z
mi_cubo.posicion.z = 6;
mi_cubo.cara[0].p1.x
mi_cubo.cara[0].p1.x = 5;
/* Ahora acedemos a la coordenada 0 del tercer polígono
de la cara 0 de mi_cubo*/
mi_cubo.cara[0].p3.z
mi_cubo.cara[0].p3.z = 6;
....
union ejemplo
{
char caracter;
int entero;
} mi_var;
mi_var es una variable cuyo tipo es union ejemplo, y el
acceso a cada campo de los definidos se realiza igual que en las
struct mediante la utilización de un punto. Hasta aquí nada nuevo lo
que sucede es que carácter y entero (los dos campos) ocupan la misma
posición de memoria. Así:
63452 = 6*10^4+3*10^3+4*10^2+5*10^1+2*10^0=
= 60000+3000+4
60000+3000+400+50+2
00+50+2
b100101 = 1*2^5+0*2^4+0*2^3+1*2^2+0*2^1+1*2^0=
= 32 + 0 + 0 + 4 + 1 = 37
b11111111 = 255
b1111111111111111 = 65535
mi_var.entero = 0x00f10;
0 -> 0000
f -> 1111 -> 15 en decimal
1 -> 0001 -> 1 en decimal
BYTE var1,var2;
HEXAEDRO var3;
Sería equivalente a:
4.0 Introducció
Introducción
n
Además introduciremos
introducirem os el concepto de función asociado
estrechamente
estrechamente a la llamada programación
programación modular que nos permite
crear un programa
programa mucho más claro y fácil
fácil de corregir a la hora de
encontrar errores.
4.1 Punteros
main()
{
página *punt_página;
informe1 i1[10],*punt1;
informe2 i3[5],*punt2;
informe3 i4[15],*punt3;
....
punt_página = punt_página + 5;
punt3 = punt3 + 5;
punt3 pasaría a apuntar a el quinto informe de tipo 3
(i4[5]), puesto que punt3 es un puntero a informes de tipo tres. Si
ahora realizásemos la operación:
char identificador[tamaño_de_la_cadena];
char *identificador;
gets(cadena1);
gets(cadena1); /* Leemos un texto por teclado y lo
almacenamos en cadena 1 */
gets(cadena2);
gets(cadena2); /* Idem cadena2 */
4.2 Funciones
4.2.1 Introducció
Introducción
n
Código de la función
A continuación
continuación nos encontramos
encontramos con el identificador
identificador de la
función, es
es decir, el nombre con el que la vamos a referenciar
referenciar en
nuestro programas, seguido de una lista de d e parámetros
parám etros entre
paréntesis y separados por comas sobre los que actuará el código
que escribamos para esa función. En el caso de la función coseno a
la que antes aludíamos, el parámetro sería el ángulo calculamos el
coseno de un cierto ángulo que en cada llamada a la función
probablemente
probablemente sea distinto. Véase la importancia de los
parámetros, si no pudiésemos definir un parámetro para nuestra
función coseno, tendríamos que definir una función para cada
ángulo, en la que obviamente no indicaríamos ningún parámetro.
int busca_elemento
busca_elemento (int *vector,in
*vector,int
t valor,int longitud)
{
int i;
for (i=0;i<longitud;i++)
(i=0;i<longitud;i++)
if (vector[i] == valor) break;
return i;
}
main ()
{
int matriz1[20];
int matriz2[30];
int indice,dato;
indice = busca_elemen
busca_elemento
to (matriz1,1
(matriz1,10,20);
0,20);
....
dato = 15;
indice = busca_elemento
busca_elemento (matriz2,d
(matriz2,dato,30);
ato,30);
.....
}
t = a;
a = b;
b = t;
}
main ()
{
int c,d;
c = 5;
d = 7;
swap (c,d);
}
Veamos que pasa en la memoria de nuestro ordenador.
-Función main()
-Espacio para la variable c (Posición de memoria x)
-Espacio para la variable d (Posición de memoria y)
-Inicialización
-Inicialización de las variables
-swap(c,d)
-Fin de main()
-Función swap
-Código de la función swap
-Espacio privado para almacenar los parámetros (Posición
de memoria z)