Documente Academic
Documente Profesional
Documente Cultură
El lenguaje C
(3.1) historia del lenguaje C
(3.1.1) el nacimiento de C
Fue Dennis Ritchie quien en 1969 creo el lenguaje C a partir de las ideas
diseadas por otro lenguaje llamado B inventado por Ken Thompson, quien en
los aos 70 fue el encargado de desarrollar el lenguaje C.
Ritchie lo invent para programar la computadora PDP-11 que utilizaba el
sistema UNIX (el propio Ritchie creo tambin Unix). De hecho La historia de C
est muy ligada a la de UNIX, este sistema siempre ha incorporado compiladores
para trabajar en C. El lenguaje C se dise como lenguaje pensado para
programar sistemas operativos, debido a sus claras posibilidades para ello.
Pero su xito inmediato hizo que miles de programadores en todo el mundo lo
utilizaran para crear todo tipo de aplicaciones (hojas de clculo, bases de
datos,), aunque siempre ha ten ido una clara relacin con las aplicaciones de
gestin de sistemas.
Debido a la proliferacin de diferentes versiones de C, en 1983 el organismo
ANSI empez a producir un C estndar para normalizar su situacin. En 1989
aparece el considerado como C estndar que fue aceptado por ISO, organismo
internacional de estndares. Actualmente ste C es universalmente aceptado.
Actualmente se sigue utilizando enormemente para la creacin de aplicaciones
de sistemas (casi todas las distribuciones de Linux estn principalmente creadas
en C) y en educacin se considera el lenguaje fundamental para aprender a
programar.
(3.1.2) C y C++
Debido al crecimiento durante los aos 80 de la programacin orientada a
objetos, en 1986 Bjarne Stroupstrup creo un lenguaje inspirado en Simula pero
utilizando la sintaxis del lenguaje C.
C y C++ pues, comparten instrucciones casi idnticas. Pero la forma de
programar es absolutamente diferente. Saber programar en C no implica saber
programar en C++
(53)
Fundamentos de programacin
(Unidad 3) El lenguaje C
Es un lenguaje compilado
Permite crear todo tipo de aplicaciones
(2)
(3)
(4)
Fundamentos de programacin
(Unidad 3) El lenguaje C
(5)
(3.4) fundamentos de C
(3.4.1) estructura de un programa C
Un programa en C consta de una o ms funciones, las cuales estn
compuestas de diversas sentencias o instrucciones. Una sentencia indica una
accin a realizar por parte del programa. Una funcin no es ms que (por ahora)
un nombre con el que englobamos a las sentencias que posee a fin de poder
invocarlas mediante dicho nombre. La idea es:
nombreDeFuncin(parmetros) {
sentencias
}
Los smbolos { y } indican el inicio y el final de la funcin. Esos smbolos
permiten delimitar bloques en el cdigo.
El nombre de la funcin puede ser invocado desde otras sentencias
simplemente poniendo como sentencia el nombre de la funcin. Como a veces las
funciones se almacenan en archivos externos, necesitamos incluir esos archivos
en nuestro cdigo mediante una sentencia especial include, que en realidad es
una directiva de preprocesador. Una directiva de preprocesador es una
instruccin para el compilador con el que trabajamos. El uso es:
#include <cabeceraDeArchivoExterno>
La directiva include permite indicar un archivo de cabecera en el que estar
incluida la funcin que utilizamos. En el lenguaje C estndar los archivos de
cabecera tienen extensin h. Los archivos de cabecera son los que permiten
utilizar funciones externas (o libreras) en nuestro programa.
Una de las libreras ms utilizadas en los programas, es la que permite leer y
escribir en la consola del Sistema Operativo. En el caso de C esta librera est
disponible en la cabecera stdio.h
(56)
(2)
(3)
(57)
Fundamentos de programacin
(Unidad 3) El lenguaje C
(3.5.2) comentarios
Se trata de texto que es ignorado por el compilador al traducir el cdigo. Esas
lneas se utilizan para documentar el programa.
Esta labor de documentacin es fundamental. De otro modo el cdigo se
convierte en ilegible incluso para el programador que lo dise. Tan importante
como saber escribir sentencias es utilizar los comentarios. Todava es ms
importante cuando el cdigo va a ser tratado por otras personas, de otro modo
una persona que modifique el cdigo de otra lo tendra muy complicado. En C los
comentarios se delimitan entre los smbolos /* y */
/* Esto es un comentario
el compilador har caso omiso de este texto*/
Como se observa en el ejemplo, el comentario puede ocupar ms de una
lnea.
double
else
enum
extern
float
for
goto
if
int
long
register
return
short
signed
sizeof
static
struct
switch
typedef
union
unsigned
void
volatile
while
A estas palabras a veces los compiladores aaden una lista propia. Como C
distingue entre maysculas y minsculas, el texto GoTo no es una palabra
reservada.
(3.5.4) identificadores
Son los nombres que damos a las variables y a las funciones de C.
Lgicamente no pueden coincidir con las palabras reservadas. Adems puesto
que C distingue entre las maysculas y las minsculas, hay que tener cuidado de
usar siempre las minsculas y maysculas de la misma forma (es decir, nombre,
Nombre y NOMBRE son tres identificadores distintos).
El lmite de tamao de un identificador es de 32 caracteres (aunque algunos
compiladores permiten ms tamao). Adems hay que tener en cuenta que los
identificadores deben de cumplir estas reglas:
(58)
Deben comenzar por una letra o por el signo de subrayado (aunque comenzar
por subrayado se suele reservar para identificadores de funciones especiales
del sistema).
(3.6) variables
(3.6.1) introduccin
Las variables sirven para identificar un determinado valor que se utiliza en el
programa. En C es importante el hecho de tener en cuenta que una variable se
almacena en la memoria interna del ordenador (normalmente en la memoria
RAM) y por lo tanto ocupar una determinada posicin en esa memoria. Es decir,
en realidad identifican una serie de bytes en memoria en los que se almacenar
un valor que necesita el programa.
Es decir si saldo es un identificador que se refiere a una variable numrica que
en este instante vale 8; la realidad interna es que saldo realmente es una
direccin a una posicin de la memoria en la que ahora se encuentra el nmero 8.
Fundamentos de programacin
(Unidad 3) El lenguaje C
float
double
void
3.4E-38 a 3.3E+38
1.7E-308 a 1.7E+308
sin valor
4
8
0
Hay que tener en cuenta que esos rangos son los clsicos, pero en la prctica los
rangos (sobre todo el de los enteros) depende del computador, procesador o
compilador empleado.
tipos enteros
Los tipos char e int sirven para almacenar enteros y tambin valen para
almacenar caracteres. Normalmente los nmeros se almacenan en el tipo int y los
caracteres en el tipo char; pero la realidad es que cualquier carcter puede ser
representado como nmero (ese nmero indica el cdigo en la tabla ASCII). As el
carcter A y el nmero 65 significan exactamente lo mismo en lenguaje C.
tipos decimales
En C los nmeros decimales se representan con los tipos float y double. La
diferencia no solo est en que en el double quepan nmeros ms altos, sino en la
precisin.
Ambos tipos son de coma flotante. En este estilo de almacenar nmeros
decimales, la precisin es limitada. Cuntos ms bits se destinen a la precisin,
ms preciso ser el nmero. Por eso es ms conveniente usar el tipo double
aunque ocupe ms memoria.
(60)
tipos lgicos
En C estndar el uso de valores lgicos se hace mediante los tipos enteros.
Cualquier valor distinto de cero (normalmente se usa el uno) significa verdadero y
el valor cero significa falso. Es decir en el cdigo:
int x=1;
Se puede entender que x vale 1 o que x es verdadera. Ejemplo:
int x=(18>6);
printf("%d",x); /*Escribe 1, es decir verdadero */
En C++ se aadi el tipo bool (booleano o lgico) para representar valores
lgicos, las variables bool pueden asociarse a los nmeros cero y uno, o mejor a
las palabras true (verdadero) y false (falso). Ejemplo:
bool b=true; //Eso es el equivalente C++ del C int b=1;
En C para conseguir el mismo efecto se utilizan trucos mediante la directiva
#define (cuyo uso se explica ms adelante)
modificadores de tipos
A los tipos anteriores se les puede aadir una serie de modificadores para que
esos tipos varen su funcionamiento. Esos modificadores se colocan por delante
del tipo en cuestin. Son:
unsigned. Contrario al anterior, hace que el tipo al que se refiere use el rango
de negativos para incrementar los positivos. Por ejemplo el unsigned int
tomara el rango 0 a 65535 en lugar de -32768 a 32767
(61)
tamao en bytes
1
2
4
Fundamentos de programacin
(Unidad 3) El lenguaje C
long long
long double
-9.223.372.036.854.775.809 a 8
9.223.372.036.854.775.808
(casi ningn compilador lo
utiliza, casi todos usan el
mismo que el long)
3.37E-4932 a 3,37E+4932
10
Una vez ms hay que recordar que los rangos y tamaos depende del procesador
y compilador. Por ejemplo, el tipo long double no suele incorporarlo casi ningn
compilador (aunque s la mayora de los modernos).
An as conviene utilizar esas combinaciones por un tema de mayor claridad
en el cdigo.
(3.6.5) literales
Cuando una variable se asigna a valores literales (17, 2.3,etc.) hay que tener en
cuenta lo siguiente:
secuencias de escape
En el caso de los caracteres, hay que tener en cuenta que hay una serie de
caracteres que son especiales. Por ejemplo como almacenamos en una variable
char el smbolo de la comilla simple, si la propia comilla simple sirve para
delimitar, es decir:
char a=;/*Error*/
Eso no se puede hacer ya que el compilador entiende que hay una mala
delimitacin de caracteres. Para resolver este problema y otros se usan los
caracteres de escape, que representan caracteres especiales.
(63)
Fundamentos de programacin
(Unidad 3) El lenguaje C
significado
Alarma (beep del ordenador)
Retroceso
Nueva lnea
Retorno de carro
Tabulador
Comilla simple
Comilla doble
Barra inclinada invertida o
backslash
(2)
(3)
(4)
variables locales
Son variables que se crean dentro de un bloque (se entiende por bloque, el
cdigo que est entre { y }). Con el fin del bloque la variable es eliminada. La
mayora son locales a una determinada funcin, es decir slo se pueden utilizar
dentro de esa funcin. Ejemplo:
void func1(){
int x;
x=5;
}
void func2(){
int x;
x=300;
}
(64)
Fundamentos de programacin
(Unidad 3) El lenguaje C
Archivo 1
int x,y;
int main(){
x=12;
y=6;
}
void funcion1(void){
x=7;
}
Archivo 2
extern int x,y;
void func2(void){
x=2*y;
}
Fundamentos de programacin
(Unidad 3) El lenguaje C
modificador volatile
Se usa para variables que son modificadas externamente al programa (por
ejemplo una variable que almacene el reloj del sistema).
significado
Entero
Entero
(68)
%c
%f
%e
%g
%o
%x
%s
%u
%li o %ld
%p
%%
Un carcter
Punto flotante (para double o
float)
Escribe en notacin cientfica
Usa %e o %f, el ms corto de
los dos
Escribe nmeros enteros en
notacin octal
Escribe nmeros enteros en
notacin hexadecimal
Cadena de caracteres
Enteros sin signo
Enteros largos (long)
Escribe un puntero
Escribe el signo %
Ejemplo:
char c=H;
int n=28;
printf(Me gusta la letra %c y el nmero %i,
%s,c,n,adis);
/* Escribe: Me gusta la letra H y el nmero 28, adis */
Mediante printf, tambin se pueden especificar anchuras para el texto. Es una de
sus caractersticas ms potentes. Para ello se coloca un nmero entre el signo %
y el cdigo numrico (i, d, f,...). Ese nmero indica anchura mnima. Por ejemplo:
int a=127, b=8, c=76;
printf(%4d\n,a);
printf(%4d\n,b);
printf(%4d\n,c);
/* Sale:
127
8
76
*/
En el ejemplo se usan 4 caracteres para mostrar los nmeros. Los nmeros
quedan alineados a la derecha en ese espacio, si se desean alinear a la
izquierda, entonces el nmero se pone en negativo (%-4d).
Si se coloca el nmero delante del nmero, el espacio sobrante se rellena con
ceros en lugar de con espacios.
(69)
Fundamentos de programacin
(Unidad 3) El lenguaje C
Ejemplo:
int a=127, b=8, c=76;
printf(%04d\n,a);
printf(%04d\n,b);
printf(%04d\n,c);
/* Sale:
0127
0008
0076
*/
Tambin se pueden especificar los decimales requeridos (para los cdigos
decimales, como f por ejemplo). De esta forma el cdigo %10.4f indica que se
utiliza un tamao mnimo de 10 caracteres de los que 4 se dejan para los
decimales.
(70)
(3.8) operadores
Se trata de uno de los puntos fuertes de este lenguaje que permite especificar
expresiones muy complejas gracias a estos operadores.
significado
Suma
Resta
Producto
Divisin
resto (mdulo)
Incremento
Decremento
La suma, resta, multiplicacin y divisin son las operaciones normales. Slo hay
que tener cuidado en que el resultado de aplicar estas operaciones puede ser un
nmero que tenga un tipo diferente de la variable en la que se pretende
almacenar el resultado.
El signo - tambin sirve para cambiar de signo (-a es el resultado de
multiplicar a la variable a por -1).
El incremento (++), sirve para aadir uno a la variable a la que se aplica. Es
decir x++ es lo mismo que x=x+1. El decremento funciona igual pero restando
uno. Se puede utilizar por delante (preincremento) o por detrs
(postincremento) de la variable a la que se aplica (x++ ++x). Esto ltimo tiene
connotaciones. Por ejemplo:
int x1=9,x2=9;
int y1,y2;
y1=x1++;
y2=++x2;
printf(%i\n,x1);
printf(%i\n,x2);
printf(%i\n,y1);
printf(%i\n,y2);
/*Escribe 10*/
/*Escribe 10*/
/*Escribe 9!!! */
/*Escribe 10*/
(71)
Fundamentos de programacin
(Unidad 3) El lenguaje C
significado
Mayor que
Mayor o igual que
Menor que
Menor o igual que
Igual que
Distinto de
significado
Y (AND)
O (OR)
NO (NOT)
Por ejemplo: (18>6) && (20<30) devuelve verdadero (1) ya que la primera
expresin (18>6) es verdadera y la segunda (20<30) tambin. El operador Y (&&)
devuelve verdadero cuando las dos expresiones son verdaderas. El operador O
(||) devuelve verdadero cuando cualquiera de las dos es verdadera.
Finalmente el operador NO (!) invierte la lgica de la expresin que le sigue; si
la expresin siguiente es verdadera devuelve falso y viceversa. Por ejemplo
!(18>15) devuelve falso (0).
(72)
significado
AND de bits
OR de bits
NOT de bits
XOR de bits
Desplazamiento derecho de los bits
Desplazamiento izquierdo de bits
significado
Suma y asigna
Resta y asigna
Multiplica y asigna
Divide y asigna
Calcula el resto y asigna
Adems tambin se permiten abreviar las expresiones de bit: &=, |=, ^=, >>=, <<=
(73)
Fundamentos de programacin
(Unidad 3) El lenguaje C
(3.8.6) operador ?
Permite escribir expresiones condicionales. Su uso es el siguiente:
Expresin_a_valorar?Si_verdadera:Si_falsa
Ejemplo:
x=(y>5?A:B);
Significa que si la variable y es mayor de 5, entonces a x se le asigna el carcter
A, sino se le asignar el carcter B.
Otro ejemplo:
printf(%s,nota>=5?Aprobado:Suspenso);
En cualquier caso hay que utilizar este operador con cautela. Su dominio exige
mucha prctica.
(74)
Fundamentos de programacin
(Unidad 3) El lenguaje C
( ) [ ] . ->
(2)
Aritmticos prioritarios: / * %
(4)
(5)
(6)
(7)
Relacionales de igualdad: == !=
(8)
&
(9)
(10)
(11)
&&
(12)
||
(13)
?:
(14)
(15)
, (coma)
(3.9.2) conversin
Cuando una expresin utiliza valores de diferentes tipos, C convierte la expresin
al mismo tipo. La cuestin es qu criterio sigue para esa conversin. El criterio, en
general, es que C toma siempre el tipo con rango ms grande. En ese sentido si
hay un dato long double, toda la expresin se convierte a long double, ya que
ese es el tipo ms grande. Si no aparece un long double entonces el tipo ms
grande en el que quepan los datos.
El orden de tamaos es:
(1)
long double
(2)
double
(3)
float
(4)
unsigned long
(5)
long
(6)
int
(77)
(Unidad 4)
Programacin
estructurada en C
(4.1) expresiones lgicas
Hasta este momento nuestros programas en C apenas pueden realizar programas
que simulen, como mucho, una calculadora. Lgicamente necesitamos poder
elegir qu cosas se ejecutan segn unas determinada circunstancias.
Todas las sentencias de control de flujo se basan en evaluar una expresin
lgica. Una expresin lgica es cualquier expresin que pueda ser evaluada con
verdadero o falso. En C (o C++) se considera verdadera cualquier expresin
distinta de 0 (en especial el uno, valor verdadero) y falsa el cero (falso).
(4.2) sentencia if
(4.2.1) sentencia condicional simple
Se trata de una sentencia que, tras evaluar una expresin lgica, ejecuta una
serie de sentencias en caso de que la expresin lgica sea verdadera. Su sintaxis
es:
if(expresin lgica) {
sentencias
}
Si slo se va a ejecutar una sentencia, no hace falta usar las llaves:
if(expresin lgica) sentencia;
(79)
Fundamentos de programacin
(Unidad 4) Programacin estructurada
Ejemplo:
if(nota>=5){
printf(Aprobado);
aprobados++;
}
[nota>=5]
escribe "Aprobado"
[nota<5]
incrementa n
aprobados
(80)
escribe "Aprobado"
escribe "Suspenso"
[nota<5]
[nota>=5]
incrementa n
aprobados
decrementa n
aprobados
Ilustracin 8, diagrama UML de actividad del ejemplo anterior
(4.2.3) anidacin
Dentro de una sentencia if se puede colocar otra sentencia if. A esto se le llama
anidacin y permite crear programas donde se valoren expresiones complejas.
Por ejemplo en un programa donde se realice una determinada operacin
dependiendo de los valores de una variable, el cdigo podra quedar:
if (x==1) {
sentencias
}
else {
if(x==2) {
sentencias
}
else {
if(x==3) {
sentencias
}
}
}
(81)
Fundamentos de programacin
(Unidad 4) Programacin estructurada
Pero si cada else tiene dentro slo una instruccin if entonces se podra escribir
de esta forma (que es ms legible), llamada if-else-if:
if (x==1) {
instrucciones
}
else if (x==2) {
instrucciones
}
else if (x==3) {
instrucciones
(82)
Ejemplo:
switch (diasemana) {
case 1:
printf(Lunes);
break;
case 2:
printf(Martes);
break;
case 3:
printf(Mircoles);
break;
case 4:
printf(Jueves);
break;
case 5:
printf(Viernes);
break;
case 6:
printf(Sbado);
break;
case 7:
printf(Domingo);
break;
default:
std::cout<<Error;
}
Slo se pueden evaluar expresiones con valores concretos (no hay una case >3
por ejemplo). Aunque s se pueden agrupar varias expresiones aprovechando el
hecho de que al entrar en un case se ejecutan las expresiones de los siguientes.
(83)
Fundamentos de programacin
(Unidad 4) Programacin estructurada
Ejemplo:
switch
case
case
case
case
case
(diasemana) {
1:
2:
3:
4:
5:
printf(Laborable);
break;
case 6:
case 7:
printf(Fin de semana);
break;
default:
printf(Error);
(4.4) bucles
A continuacin se presentan las instrucciones C que permiten realizar
instrucciones repetitivas (bucles).
(2)
(3)
int i=1;
while (i<=100){
printf(%d,i);
i++;
}
[ i<=100 ]
escribe i
[i>100]
Ejecutar sentencias
(2)
(3)
Sintaxis:
do {
sentencias
} while (expresin lgica)
Ejemplo (contar del 1 al 1000):
int i=0;
do {
i++;
printf(%d,i);
} while (i<=1000);
(85)
Fundamentos de programacin
(Unidad 4) Programacin estructurada
(2)
Se comprueba la condicin
(3)
(4)
(86)
(87)
(Unidad 5)
Funciones
(5.1) funciones y programacin modular
(5.1.1) introduccin
En cuanto los programas resuelve problemas ms complejos, su tamao empieza
a desbordar al programador. Para mitigar este problema apareci la
programacin modular. En ella el programa se divide en mdulos de tamao
manejable. Cada mdulo realiza una funcin muy concreta y se pueden
programar de forma independiente.
En definitiva la programacin modular implementa el paradigma divide y
vencers, tan importante en la programacin. El programa se descompone en
esos mdulos, lo que permite concentrarse en problemas pequeos para resolver
los problemas grandes.
En C los mdulos se llaman funciones. En los temas anteriores hemos usado
algunas funciones implementadas en las libreras del lenguaje C (printf y scanf
por ejemplo). El lenguaje C proporciona diversas funciones ya preparadas (se las
llama funciones estndar) para evitar que el programador tenga que codificar
absolutamente todo el funcionamiento del programa.
Las funciones son invocadas desde el cdigo utilizando su nombre. Cuando
desde el cdigo se invoca a una funcin, entonces el flujo del programa salta
hasta el cdigo de la funcin invocada. Despus de ejecutar el cdigo de la
funcin, el flujo del programa regresa al cdigo siguiente a la invocacin.
(89)
Fundamentos de programacin
(Unidad 5) Funciones
As por ejemplo:
int main(){
printf(%lf, pow(3,4));
}
Ese cdigo utiliza dos funciones, la funcin printf que permite escribir en la
pantalla y la funcin pow que permite elevar un nmero a un exponente (en el
ejemplo 34).
Para poder utilizarlas las funciones tienen que estar definidas en el cdigo del
programa o en un archivo externo. Si estn en un archivo externo (como ocurre
en el ejemplo) habr que incluir la cabecera de ese archivo para que al crear el
ejecutable de nuestro programa se enlacen los archivos compilados de las
funciones externas que utilice el programa.
Es decir hay que indicar en qu archivos se definen esas funciones. En el
ejemplo, habra que incluir al principio esta lneas:
#include <stdio.h>
#include <math.h>
tipo. Sirve para elegir el tipo de datos que devuelve la funcin. Toda funcin
Fundamentos de programacin
(Unidad 5) Funciones
#include <stdio.h>
#include <conio.h>
/*Prototipo de la funcin*/
double potencia(int base, int exponente);
int main(){
int b, e;
do{
printf(Escriba la base de la potencia (o cero para salir);
scanf(%d,&b);
if (b!=0){
printf(Escriba el exponente);
scanf(%d,&e);
printf(Resultado: %lf, potencia(b,e));
}
}while(b!=0);
getch();
}
/*Cuerpo de la funcin*/
double potencia(int base, int exponente){
int contador;
int negativo=0;
double resultado=1.0;
if (exponente<0) {
exponente=-exponente;
negativo=1;
}
for(contador=1;contador<=exponente;contador++)
resultado*=base;
if (negativo) resultado=1/resultado;
return resultado;
}
Aunque no es obligatorio el uso de prototipos, s es muy recomendable ya que
permite detectar errores en compilacin (por errores en el tipo de datos) que
seran muy difciles de detectar en caso de no especificar el prototipo.
tarea no implica que retornen un determinado valor. Es decir son funciones sin
instruccin return.
A estas funciones tambin se las llama procedimientos. Funcionan igual
salvo por la cuestin de que al no retornar valore, no tienen porque tener
instruccin return. Si se usa esa instruccin dentro de la funcin, lo nico que
ocurrir es que el flujo del programa abandonar la funcin (la funcin finaliza).
No es muy recomendable usar as el return ya que propicia la adquisicin de muy
malos hbitos al programar.
Fundamentos de programacin
(Unidad 5) Funciones
(5.3) recursividad
(5.3.1) introduccin
La recursividad es una tcnica de creacin de funciones en la que una funcin se
llama a s misma. Hay que ser muy cauteloso con ella (incluso evitarla si no es
necesario su uso), pero permite soluciones muy originales , a veces, muy claras a
ciertos problemas. De hecho ciertos problemas (como el de las torres de Hanoi,
por ejemplo) seran casi imposibles de resolver sin esta tcnica.
La idea es que la funcin resuelva parte del problema y se llame a s misma
para resolver la parte que queda, y as sucesivamente. En cada llamada el
problema debe ser cada vez ms sencillo hasta llegar a una llamada en la que la
funcin devuelve un nico valor.
(95)
Fundamentos de programacin
(Unidad 5) Funciones
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(5.4) bibliotecas
(5.4.1) introduccin
En cualquier lenguaje de programacin se pueden utilizar bibliotecas (tambin
llamadas libreras) para facilitar la generacin de programas. Estas bibliotecas en
realidad son una serie de funciones organizadas que permiten realizar todo tipo
de tareas.
Cualquier entorno de programacin en C permiten el uso de las llamadas
bibliotecas estndar, que son las que incorpora el propio lenguaje de
programacin.
(97)
Fundamentos de programacin
(Unidad 5) Funciones
Descripcin
int abs(int n)
Devuelve el valor absoluto del nmero entero
indicado
int ceil(double n)
Redondea el nmero decimal n obteniendo el menor
entero mayor o igual que n. Es decir ceil(2.3)
devuelve 3 y ceil(2.7) tambin devuelve 3
double cos(double n)
Obtiene el coseno de n (n se expresa en radianes)
double exp(double n)
Obtiene en
double fabs(double n)
Obtiene el valor absoluto de n (siendo n un nmero
double)
int floor(double n)
Redondea el nmero decimal n obteniendo el mayor
entero menor o igual que n. Es decir floor(2.3)
devuelve 2 y floor(2.7) tambin devuelve 2
double fmod(double x, double y)
Obtiene el resto de la divisin entera de x/y
double log(double n)
Devuelve el logaritmo neperiano de n
double log10(double n)
Devuelve el logaritmo decimal de n
double pow(double base, double Obtiene baseexponente
exponente)
double sin(double n)
Obtiene el seno de n (n se expresa en radianes)
double sqrt(double n)
Obtiene la raz cuadrada de n
double sin(double n)
Obtiene la tangente de n (n se expresa en radianes)
Fundamentos de programacin
(Unidad 5) Funciones
(3)
(100)
(Unidad 6)
Estructuras estticas
(6.1) introduccin
En programacin se llaman estructuras estticas a datos compuestos de datos
simples (enteros, reales, caracteres,...) que se manejan como si fueran un nico
dato y que ocupan un espacio concreto en memoria.
Las estructuras estticas son:
(6.2) arrays
(6.2.1) introduccin
Imaginemos que deseamos leer las notas de una clase de 25 alumnos.
Desearemos por tanto almacenarlas y para ello con lo que conocemos hasta
ahora no habr ms remedio que declarar 25 variables.
Eso es tremendamente pesado de programar. Manejar esas notas significara
estar continuamente manejando 25 variables. Por ello en C (como en casi todos
los lenguajes) se pueden agrupar una serie de variables del mismo tipo en un tipo
de datos ms complejo que facilita su manipulacin.
Los arrays son una coleccin de datos del mismo tipo al que se le pone un
nombre (por ejemplo nota). Para acceder a un dato de la coleccin hay que
utilizar su ndice (por ejemplo nota[4] leer la cuarta nota).
(101)
Fundamentos de programacin
(Unidad 6) Estructuras estticas
(102)
nota[1]
6
nota[2]
4
...
...
nota[19]
7
nota[20]
4
Fundamentos de programacin
(Unidad 6) Estructuras estticas
0
(104)
Fundamentos de programacin
(Unidad 6) Estructuras estticas
(106)
(107)
Fundamentos de programacin
(Unidad 6) Estructuras estticas
bsqueda lineal
En este caso el array no est ordenado. La funcin de bsqueda busca un valor
por cada elemento del array. Si le encuentra devuelve la posicin del mismo y si
no devuelve -1.
/* parmetros:
vector: Array que contiene todos los valores
tamanio: Tamao del mismo
valor: valor a buscar
*/
int busquedaLineal(int vector[], int tamanio, int valor){
int i=0;
int enc=0; /* Indica si se ha encontrado el valor */
while (enc==0 && i< tamanio){
if(vector[i]==valor) enc=1;
else i++;
}
if(enc==1) return i;
else return -1;
}
bsqueda binaria
Se basa en que el array que contiene los valores est ordenado-. En ese caso la
bsqueda anterior es excesivamente lenta.
Este algoritmo consiste en comparar el valor que buscamos con el valor que
est en el centro del array; si ese valor es menor que el que buscamos, ahora
buscaremos en la mitad derecha; si es mayor buscaremos en la mitad derecha. Y
as hasta que lo encontremos.
Una variable (en el cdigo es la variable central) se encarga de controlar el
centro del array que nos queda por examinar, las variables bajo y alto controlan
los lmites (inferior y superior respectivamente) que nos quedan por examinar.
En caso de que el valor no se encuentre, entonces los lmites bajo y alto se
cruzan. Entonces el algoritmo devuelve -1 para indicar que el valor no se
encontr. Esta bsqueda es rapidsima ya que elimina muchas comparaciones al
ir quitando la mitad de lo que nos queda por examinar.
(108)
se han tenido que desplazar los valores 5,6 y 7 para hacer hueco al 4 en su sitio.
(109)
Fundamentos de programacin
(Unidad 6) Estructuras estticas
Para un array de enteros la funcin que inserta un nuevo valor en dicho array
sera:
/* Parmetros de la funcin:
vector: Array que contiene los datos ya ordenados
tamanio: Tamao actual del array, es el tamao de los
datos ordenados. cero significa que an no se ha
insertado ningn valor
valor: El nuevo valor a insertar en el array
*/
void insercion(int vector[], int tamanio, int valor){
/* valor es el valor que se inserta */
int i,pos=0;
int enc=0; /* indica si hemos encontrado la posicion
del
elemento a insertar*/
if (tamanio==0) /*Si no hay datos aadimos este y
salimos*/
vector[0]=valor;
else{ /* Hay datos */
/*Localizar la posicin en la que ir el nuevo
valor*/
while(enc==0 && pos<tamanio ){
if(valor<vector[pos]) enc=1;
else pos++;
}
/* Desplazar los elementos necesarios para hacer
hueco
al nuevo */
for(i=tamanio-1;i>=pos;i--)
vector[i+1]=vector[i];
/*Se coloca el elemento en su posicin*/
if(pos<=tamanio) vector[pos]=valor;
}/*fin del else */
}
(110)
mtodo burbuja
Para ordenar un array cuando ya contiene valores y stos no estn ordenados, no
sirve el mtodo anterior.
Para resolver esa situacin, el algoritmo de ordenacin de la burbuja o de
intercambio directo es uno de los ms populares. Consiste en recorrer el array
n veces, donde n es el tamao del array. De modo que en cada recorrido vamos
empujando hacia el principio del array los valores pequeos (si ordenamos en
ascendente). Al final, el array est ordenado. La funcin que ordenara mediante
el mtodo de la burbuja un array de enteros de forma ascendente.
Cdigo:
void burbuja(int vector[], int tamanio){
int i,j;
int aux; /* Para intercambiar datos del array */
for(i=0;i<tamanio;i++){
for(j=0;j<tamanio-1;j++){
if(vector[j]>vector[j+1]){
aux=vector[j];
vector[j]=vector[j+1];
vector[j+1]=aux;
}
}
}
}
(111)
Fundamentos de programacin
(Unidad 6) Estructuras estticas
int i,j,v,aux;
if(dcha > izda)
{
v = a[dcha]; i = izda-1; j = dcha;
for(;;){
while(a[++i] < v && i < dcha);
while(a[--j] > v && j > izda);
if(i >= j)
break;
swap(a,i,j);
}
swap(a,i,dcha);
quicksort(a,izda,i-1);
quicksort(a,i+1,dcha);}
}
La llamada a esta funcin para ordenar un array es quicksort(0,tamanio), donde
tamanio es el tamao del array menos uno.
(112)
columna 0
columna 1
columna 2
columna 3
columna 4
columna 5
4
5
6
5
4
3
6
2
5
8
8
7
9
5
8
3
8
9
Fundamentos de programacin
(Unidad 6) Estructuras estticas
saber cuntas columnas forman parte del array, es imposible determinar esa
posicin. Lo correcto es:
void funcion(int a[][5]);
(6.3) punteros
(6.3.1) introduccin
Se trata de una de las herramientas ms importantes de C. Se trata de una
variable cuyo contenido es la direccin al contenido de otra variable. Son la base
de las estructuras dinmicas.
En general una variable contiene un valor que es con el que se opera, en el
caso de los punteros no es un valor directo sino que es la direccin de memoria
en la que se encuentra el valor.
X
26
120301
26
(114)
Fundamentos de programacin
(Unidad 6) Estructuras estticas
(116)
Fundamentos de programacin
(Unidad 6) Estructuras estticas
(118)
(119)
Fundamentos de programacin
(Unidad 6) Estructuras estticas
char s[4][50]={"Ana","Pablo","Julin","Roberto"};
puts(s[2]); /* Escribe Julin */
La declaracin en este caso crea un array bidimensional de 4 x 50 caracteres.
Eso se puede interpretar como cuatro arrays de caracteres de 50 caracteres como
mximo cada uno. As los textos utilizados en el ejemplo se copian en el rea
reservada por el array y s se podran modificar.
Si deseamos un puntero sealando a la segunda cadena del array:
char *p=s[2];
puts(p); /*Tambin escribe Julin */
Eso es vlido ya que s[2] es el tercer elemento del array s, es un array de 50
caracteres. Es decir, s[2] es la tercera cadena del array de cadenas s.
descripcin
Devuelve verdadero si el carcter es un dgito
de 0 a 9
(121)
Fundamentos de programacin
(Unidad 6) Estructuras estticas
prototipo de la funcin
int isalpha(int carcter)
int isalnum(int carcter)
int islower(int carcter)
int isupper(int carcter)
int tolower(int carcter)
int toupper(int carcter)
int isspace(int carcter)
int iscntrl(int carcter)
int ispunct(int carcter)
int isprint(int carcter)
int isgraph(int carcter)
descripcin
Devuelve verdadero (un valor distinto de 0) si
el carcter es una letra (del alfabeto ingls)
Devuelve verdadero si el carcter es una letra
o un nmero.
Devuelve verdadero si el carcter es una letra
minscula (segn el alfabeto ingls).
Devuelve verdadero si el carcter es una letra
mayscula (segn el alfabeto ingls).
Convierte el carcter a minsculas
Convierte el carcter a maysculas
Devuelve verdadero si el carcter es el
espacio en blanco
Devuelve verdadero si el carcter es de
control
Devuelve verdadero si el carcter es de
puntuacin
Devuelve verdadero si el carcter no es de
control
Devuelve verdadero si el carcter no es de
control y no es el espacio
descripcin
Convierte la cadena s a formato double. Si la
cadena no contiene datos que permitan la
conversin (por ejemplo si contiene texto), su
comportamiento es impredecible.
Convierte la cadena s a formato int. Si la
cadena no contiene datos que permitan la
conversin (por ejemplo si contiene texto), su
comportamiento es impredecible.
Convierte la cadena s a formato long. Si la
cadena no contiene datos que permitan la
conversin (por ejemplo si contiene texto), su
comportamiento es impredecible.
descripcin
Aade s2 al final de la cadena s1. Devuelve
la propia s1
(122)
prototipo de la funcin
char * strcpy(char *s1, char *s2)
int strcmp(char *s1, char *s2)
int * strlen(char * s)
descripcin
Copia s2 en s1. Devuelve la propia s1
Compara s1 con s2. Si s1 es mayor devuelve
un valor positivo, si es menor un valor
negativo y si son iguales devuelve 0.
Busca la primera vez que aparece el carcter
dentro de la cadena s1 si le encuentra
devuelve un puntero al mismo, sino devuelve
el valor NULL.
Busca la ltima vez que aparece el carcter
dentro de la cadena s1 si le encuentra
devuelve un puntero al mismo, sino devuelve
el valor NULL.
Busca la primera vez que aparece el texto s2
de la cadena s1. Si le encuentra devuelve un
puntero al primer carcter de s2 dentro de s1,
sino devuelve el valor NULL.
Devuelve el tamao del texto s.
(6.5) estructuras
Son colecciones de variables de distinto tipo agrupadas bajo un mismo nombre.
Son equivalentes a los registros de otros lenguajes. Representan fichas de datos
referidas a la misma cosa.
(6.5.1) definicin
Se trata de un tipo de datos formado por medio de variables de otros tipos. Por
ejemplo:
struct persona{
char nombre[25];
char apellidos[50];
char dni[10];
int edad;
};
Esa instruccin define un tipo de estructura, pero no declara variable alguna.
Las variables de estructura se definen as:
struct persona pepe;
pepe es una variable de tipo persona. La definicin de la estructura se suele
hacer en la zona global (antes del main) para que sea accesible a cualquier
funcin del programa.
(123)
Fundamentos de programacin
(Unidad 6) Estructuras estticas
(6.5.2) typedef
Una forma mucho ms interesante de utilizar estructuras, consiste en declararlas
como definicin de tipos. El ejemplo anterior podra utilizarse de esta forma:
struct persona{
char nombre[25];
char apellidos[50];
char dni[10];
int edad;
};
typedef struct persona Persona;
Con esa instruccin acabamos de definir el tipo Persona (a los nombres de tipo se
les suele poner la primera letra en maysculas). Ese tipo se puede utilizar igual
que los propios de C. Es decir:
Persona pepe;
pepe es una variable de tipo Persona. Se puede hacer todo lo anterior de esta
forma (definiendo la estructura y creando el tipo a la vez).
Ejemplo:
typedef struct{
char nombre[25];
char apellidos[50];
char dni[10];
int edad;
}Persona;
As se define directamente el tipo Persona. Otra vez podramos usar:
Persona pepe;
Es mucho ms aconsejable este mtodo que el anterior.
(125)
Fundamentos de programacin
(Unidad 6) Estructuras estticas
(126)
Tras crear dicho tipo, podemos crear un array de Personas de esta forma:
Persona amigos[15];
Para utilizar dicho array:
Persona amigos[10];
amigos[0].nombre="Alfonso";
amigos[0].edad=25;
amigos[1].nombre="Ana";
amigos[1].edad=31;
puts(amigos[1].nombre);
punteros a estructuras
Ejemplo:
Persona ana;
Persona *ptr1=&ana;
ptr1 es un puntero que seala a variables de tipo Persona. En este ejemplo, ese
puntero seala a ana ya que toma su direccin. Para acceder a los valores a los
que seala el puntero, no se utiliza la expresin *ptr1 a la que estbamos
acostumbrados, sino que se utiliza el operador ->. De esta forma:
strcpy(ptr1->nombre,"Ana");
strcpy(ptr1->apellidos,"Fernandez Castro");
ptr1->edad=19;
printf("%s %s",ptr1->nombre,ptr1->apellidos);
En el ejemplo la expresin ptr1->nombre, es equivalente a ana.nombre.
Fundamentos de programacin
(Unidad 6) Estructuras estticas
La funcin sera:
void subirEdad1(Persona pers){
pers.edad++;
}
Pero en la llamada:
subirEdad1(pedro);
printf("%d",pedro.edad);
La edad de pedro no cambia tras la llamada. La razn es que la estructura se ha
pasado por valor. Con lo que el contenido se copia en la funcin a la variable
pers, y esa es la variable que se modifica. No se ha cambiado la estructura
original.
La forma de pasar estructuras por referencia es utilizar punteros (al igual que
en el caso de cualquier otra variable). As el formato de la funcin sera:
void subirEdad2(Persona *ptrPers){
ptrPers->edad++;
}
Y la llamada se hara:
subirEdad2(&pedro);
printf("%d",pedro.edad); /* Sale 24, un ao ms */
(6.6) uniones
Es un tipo de dato muy parecido a las estructuras. En este caso los miembros
comparten el mismo espacio de almacenamiento. El gasto en bytes de las
uniones ser el correspondiente al miembro que gasta ms espacio.
El caso tpico de unin sera:
union numero{
int x;
double y;
};
Lo que ganamos es que podemos asignar a esa variable valores tanto enteros
como de tipo double. Ejemplo:
union numero1 valor = {10}; /*El 10 se almacena como
entero*/
union numero2 valor = {1.03}; /*Se almacena como double*/
(128)
rojo:2;
verde:2;
azul:2;
transpar:3;
(6.8) enumeraciones
Las enumeraciones son otro tipo definido por el usuario que sirve para definir un
conjunto entero de constantes de enumeracin. Las constantes de enumeracin
son identificadores (que se suelen poner en maysculas) asociados a nmeros
enteros.
Gracias a las enumeraciones se pueden utilizar tipos de datos que aportan una
mayor claridad en el cdigo.
(129)
Fundamentos de programacin
(Unidad 6) Estructuras estticas
Ejemplo:
enum meses{
ENE, FEB, MAR, ABR, MAY, JUN, JUL, AGO, SEP, OCT, NOV,
DIC
};
Las constantes de enumeracin (de ENE a DIC) tomarn valores de 0 a 11. Si
deseramos que tomarn valores de 1 a 12:
enum meses{
ENE=1, FEB, MAR, ABR, MAY, JUN, JUL, AGO,SEP, OCT,
NOV, DIC
};
Para declarar una variable de tipo enum se hara:
enum meses m1;
Tambin se puede utilizar typedef, para definir un tipo propio. De hecho se suele
utilizar ms:
typedef enum {
ENE=1, FEB, MAR, ABR, MAY, JUN, JUL, AGO,SEP, OCT,
NOV, DIC
}Meses;
...
Meses m1;
Despus se pueden utilizar las constantes definidas para asignar valores a la
variable de enumeracin:
m1=JUL; /* Es lo mismo que m1=7 */
(130)
int main(){
Clases c1;
char *nombreClases[]={
"Primero de ESO",
"Segundo de ESO",
Tercero de ESO",
"Cuarto de ESO",
"Formacin profesional 1",
"Formacin profesional 2",
"Bachiller 1",
"Bachiller 2",
"Preuniversitario"
};
int i;
for(i=ESO1;i<=PREU;i++){
puts(nombreClases[i]);
}
}
Ese bucle, muestra los nombres de todas las clases. Ese listado se poda hacer
sin enumeraciones, pero el cdigo es as mucho ms claro.
(131)