Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Apuntes 24pag PDF PDF
Apuntes 24pag PDF PDF
CONTENIDO
Tema 1 ______________________________________________________________ 3
Introducción__________________________________________________________ 3
1.1 Historia del lenguaje de programación C y C++______________________________ 3
1.2 Programación Orientada a Objetos ________________________________________ 4
1.3 Características de la POO ________________________________________________ 5
TEMA 2 _____________________________________________________________ 8
Tipos de Datos ________________________________________________________ 8
2.1 Tipos de datos básicos en C _______________________________________________ 8
2.2 Tipo de dato “char _____________________________________________________ 10
2.3 Tipo de dato “int” _____________________________________________________ 12
2.4 Tipo de dato “long” ____________________________________________________ 16
2.5 Tipo de dato “float” ____________________________________________________ 17
2.6 Tipo de dato “double” __________________________________________________ 16
2.7 Tipo de dato “long double” ______________________________________________ 16
2.8 Representación en punto flotante _________________________________________ 17
2.9 Aritmética de punto flotante _____________________________________________ 22
2.10 Representación en formato estándar IEEE (short real) _____________________ 22
2.11 Pase de entero a short real IEEE ________________________________________ 23
2.12 Tipo de dato “void ____________________________________________________ 24
Tema 3 _______________________________________ ¡Error! Marcador no definido.
TIPOS DE DATOS DEFINIDOS POR EL USUARIO _________ ¡Error! Marcador no definido.
3.1 Estructuras _____________________________________ ¡Error! Marcador no definido.
3.2 Creación de una estructura ________________________ ¡Error! Marcador no definido.
3.3 Unión __________________________________________ ¡Error! Marcador no definido.
Tema 4 _______________________________________ ¡Error! Marcador no definido.
APUNTADORES (POINTERS) ________________________ ¡Error! Marcador no definido.
4.1 Definición ______________________________________ ¡Error! Marcador no definido.
4.2 Operadores * y & en apuntadores __________________ ¡Error! Marcador no definido.
4.3 Operaciones Aritméticas entre Apuntadores _________ ¡Error! Marcador no definido.
TEMA 5 _____________________________________ ¡Error! Marcador no definido.
CLASES _______________________________________ ¡Error! Marcador no definido.
5.1 Definición de una clase ___________________________ ¡Error! Marcador no definido.
5.1 Definición de una clase _______________________ ¡Error! Marcador no definido.
1
TEMA 6 ______________________________________ ¡Error! Marcador no definido.
ASIGNACIÓN DINÁMICA DE MEMORIA _______________ ¡Error! Marcador no definido.
6.1 Uso de malloc y free ______________________________ ¡Error! Marcador no definido.
Tema 7 _______________________________________ ¡Error! Marcador no definido.
ESTRUCTURAS DINÁMICAS DE DATOS ________________ ¡Error! Marcador no definido.
7.1 Listas simplemente enlazadas ______________________ ¡Error! Marcador no definido.
7.2 Listas doblemente enlazadas _______________________ ¡Error! Marcador no definido.
7.3 Estructura de datos llamada “Pila” _________________ ¡Error! Marcador no definido.
7.4 Estructura de datos llamado “Cola” (Queue) _________ ¡Error! Marcador no definido.
Tema 8 _______________________________________ ¡Error! Marcador no definido.
RECURSIVIDAD _________________________________ ¡Error! Marcador no definido.
8.1 Recursividad ____________________________________ ¡Error! Marcador no definido.
8.2 Tipos de recursión _______________________________ ¡Error! Marcador no definido.
Tema 9 _______________________________________ ¡Error! Marcador no definido.
ÁRBOLES BINARIOS ______________________________ ¡Error! Marcador no definido.
9.1 Árboles Binarios _________________________________ ¡Error! Marcador no definido.
Tema 10 ______________________________________ ¡Error! Marcador no definido.
ARCHIVOS Y CORRIENTES _________________________ ¡Error! Marcador no definido.
10.1 Corrientes _____________________________________ ¡Error! Marcador no definido.
10.2 Archivos ______________________________________ ¡Error! Marcador no definido.
10.3 Apuntadores a archivos __________________________ ¡Error! Marcador no definido.
10.4 Lectura y escritura de Bloques ____________________ ¡Error! Marcador no definido.
2
Tema 1
INTRODUCCIÓN
Lenguaje C
El lenguaje C se diseñó en 1972 (Dennis Ritchie). Más tarde, en 1983, se definió el
estándar ANSI C (que es el que aquí presentaremos). Ya ha quedado dicho que el
lenguaje C está creado para la programación estructurada.
El lenguaje C tiene muy pocas reglas sintácticas, sencillas de aprender. Su léxico es
muy reducido: tan solo 32 palabras.
A menudo se le llama lenguaje de medio nivel, más próximo al código máquina que
muchos lenguajes de más alto nivel. Y por eso mismo es un lenguaje muy eficiente.
Permite el uso del lenguaje ensamblador en partes del código, trabaja a nivel de bit, y
permite modificar los datos con operadores que manipulan bit a bit la información.
También se puede acceder a las diferentes posiciones de memoria conociendo su
dirección.
El lenguaje C permite con facilidad la programación modular, creando unidades
independientes que pueden compilarse de forma independiente, que pueden
posteriormente enlazarse. Así, se crean funciones o procedimientos, que se pueden
compilar y almacenar, creando así bibliotecas de código ya editado y compilado que
resuelve distintas operaciones. Cada programador puede diseñar sus propias
bibliotecas, que simplifican luego considerablemente el trabajo futuro. El ANSI C posee
una amplia colección de bibliotecas de funciones estándar y normalizadas.
Lenguaje C++
En 1980 surge C++ de la mano de Bjarne Stroustrup (también de Laboratorios Bell de
AT&T). Diseña este lenguaje con el objetivo de añadir a C nuevas características: clases
y funciones virtuales (de SIMULA67), tipos genéricos y expresiones (de ADA), la
posibilidad de declarar variables en cualquier punto del programa (de ALGOL68), y
sobre todo, un auténtico motor de objetos con herencia múltiple que permite combinar
la programación imperativa de C con la programación orientada a objetos. En 1985 se
realizan pruebas permitiendo el uso de este.
3
El nombre de C++ de debe a Rick Mascitti, significando el carácter evolutivo de las
transformaciones de C (“++” es el operador de incremento de C).
C++ ha sido ampliamente revisado y refinado, lo que ha dado lugar a añadir nuevas
características, como herencia múltiple funciones miembro static y const, miembros
protected, tipos genéricos de datos o plantillas y manipulación de excepciones. Se han
revisado características como sobrecarga, enlace y manejo de memoria. Además, se
realizaron cambios para así poder incrementar la compatibilidad con C y se añadieron
la identificación de tipos durante la ejecución y los espacios de nombres con el objetivo
de convertir a C++ en un lenguaje mas propicio para la escritura y utilización de
bibliotecas.
Apartir la estandarización publicada en 1998 llamada estándar ISO C++ (ISO/IEC –
International Standardization Organization/ International Electrotechnical Commissión)
14882) se logro tener la biblioteca que actualmente incorpora C++ y que fue escrita con
la intención de que el código se pueda portar entre diferentes plataformas y de incluir
solo aquellas clases que realmente fueran utilizadas por la mayoría de los
programadores. Las facilidades proporcionadas por esta biblioteca estándar las
podemos resumir en los siguientes puntos:
Soporte básico, como por ejemplo identificación del tipo de los objetos durante la
ejecución y gestión de memoria.
Soporte proporcionado para la biblioteca de C (manipulación de cadenas, archivos,
etc.).
La clase string para la manipulación de cadenas de caracteres.
Clases para la entrada-salida
Clases contenedor como vectores, listas y mapas.
Algoritmo de búsqueda y de ordenación.
Clases para trabajar con números como son cmath, complex y cstdlib.
C++ es por lo tanto, un lenguaje híbrido que, por una parte, ha adoptado todas las
características de la programación orientada a objetos (POO) que no perjudiquen su
efectividad; por ejemplo, funciones virtuales y la ligadura dinámica (dynamic binding), y
por otra parte, mejora sustancialmente las capacidades de C. Esto, junto con la
biblioteca de clases soportada, dota a C++ de una potencia, eficacia y flexibilidad que
lo convierten en un estándar dentro de los lenguajes de programación orientados a
objetos.
4
POO. Que es una serie de normas de realizar las cosas de manera que otras personas
puedan utilizarlas y adelantar su trabajo, de manera que consigamos que el código se
pueda reutilizar con el fin de disminuir el costo del software, aumentando la eficiencia
en la programación y reduciendo el tiempo necesario para el desarrollo de una
aplicación.
Todo objeto del mundo real tiene 2 componentes: características y comportamiento. Por
ejemplo, los automóviles tienen características (marca, modelo, color, velocidad
máxima, etc.) y comportamiento (frenar, acelerar, retroceder, llenar combustible,
cambiar llantas, etc.).
Los Objetos de Software, al igual que los objetos del mundo real, también tienen
características y comportamientos. Un objeto de software mantiene sus características
en una o más "variables", e implementa su comportamiento con "métodos". Un método
es una función o subrutina asociada a un objeto.
Para redondear estas ideas, imaginemos que tenemos estacionado en nuestra cochera
un Ford Focus color azul que corre hasta 200 km/h. Si pasamos ese objeto del mundo
real al mundo del software, tendremos un objeto Automóvil con sus características
predeterminadas:
Marca = Ford
Modelo = Focus
Color = Azul
Velocidad Máxima = 200 km/h
Abstracción:
Es la capacidad de separar los elementos (al menos mentalmente) para poder verlos de
forma singular. Como cuando describimos el cuerpo humano y decimos cabeza,
brazo(s), pierna(s), etc. Cada objeto en el sistema sirve como modelo de un "agente"
5
abstracto que puede realizar trabajo, informar y cambiar su estado, y "comunicarse" con
otros objetos en el sistema sin revelar cómo se implementan estas características.
Encapsulamiento:
Poliformismo:
Esta propiedad indica la posibilidad de definir varias operaciones con el mismo nombre,
diferenciándolas únicamente en los parámetros de entrada. Dependiendo del objeto que
se introduzca como parámetro de entrada, se elegirá automáticamente cual de las
operaciones se va a realizar.
Ya está habituado al operador <<suma>> que está presente en todos los lenguajes de
programación. Sin embargo, los operadores <<suma de fracciones>> y <<suma de
números complejos>> no existen en casi ningún lenguaje de programación.
Los lenguajes POO permiten definir un operador <<suma>> tal que reconozca que tipo
de objeto se le está aplicando, a través de operaciones de objetos. Previamente deberá
definir la fracción y el número complejo como una clase y la operación suma como una
operación de una clase. Definiendo adecuadamente la operación suma de fracciones y
suma de números imaginarios, el operador suma devolverá, en el caso que los
operandos sean fracciones, una fracción y en el caso de los números imaginarios, otro
número imaginario. Es posible extender el concepto e incluso definir operaciones como
suma de bases de datos.
6
Herencia:
La herencia es la capacidad que tiene una clase de derivar las propiedades y métodos
de otra. Consiste en la propagación de los atributos y las operaciones a través de
distintas subclases definidas a partir de una clase común. Nos permite crear estructuras
jerárquicas de clases donde es posible la creación de subclases que incluyan nuevas
propiedades y atributos. Estas subclases admiten la definición de nuevos atributos, así
como crear, modificar o inhabilitar propiedades.
Asociemos a este tipo básico una clase cuyos atributos representen las piezas que
componen el coche. Las subclases aportarán sus propios atributos (en el caso de
vehículos con aire acondicionado, todas aquellas piezas que lo componen), permitiendo
la definición de todos los posibles modelos.
7
TEMA 2
Tipos de Datos
Los números enteros largos y los valores de punto flotante utilizan más espacio en
almacenamiento, obteniendo una ejecución de operaciones más lentas. Las variables
numéricas del C caen en las dos categorías principales:
Las variables enteras guardan valores que no tienen fracciones usan únicamente
números enteros. Dentro de las variables enteras existen con signo y sin signo. Las
variables enteras con signo ayudan a guardar valores positivos o negativos, en
cambio las variables enteras sin signo únicamente guardar valores positivos
incluyendo el 0.
Las variables de punto flotante guardan valores que tienen fracciones (números
reales).
El rango aproximado (como se puede ver en la siguiente tabla) significa los valores
máximos y mínimos que puede guardar una variable dada, (por desgracia las
limitaciones de los espacios impiden listar los rangos exactos para cada una de estas
variables).
8
TIPOS DE VARIABLES
Cada tipo puede ser calificado por las palabras clave signed o unsigned, lo que
da lugar a tener disponibles los siguientes tipos extras:
9
signed char
unsigned char
signed short
unsigned short
signed int
unsigned int
signed long
unsigned long
Un entero calificado signed es un entero con signo, esto es, un número entero
positivo o negativo. Un número entero calificado unsigned es un número enero
sin signo, el cual es manipulado como un número entero positivo.
signed x;
signed int x;
unsigned y;
unsigned int y;
Este ejemplo declara una variable llamada car de tipo char, capaz de contener
un carácter cuyo código ASCII se corresponderá con un valor entero entre 0 y
127. Otros ejemplos son:
char a = ’z’;
signed char b = 0x07;
unsigned char c = 32;
10
1 byte = 8 bits
8 bits = 1 byte
64 32 16 8 4 2 1 Valor de la posición
1 2 3 4 5 6 7 8
11
PROGRAMA # 1
#include<conio.h>
#include<string.h>
#include<iostream>
//#include<iomanip.h>
// PROGRAMA No.1
int main(void)
{
unsigned char c;
cout<<" TABLA ASCII"; cout<<"\n\n\n Este programa despliega en la pantalla la tabla
ASCII";
cout<<"\n En modo caracter y sus valores en decimal y hexadecimal \n\n";
getch();
system("cls");
cout<<"------------------------------------------------------------"<<endl;
cout<<"| CARACTER º DECIMAL º HEXADECIMAL |"<<endl;
cout<<"------------------------------------------------------------"<<endl;
for(c=0;c<255;c++)
{
cout<<endl<<"| "<<c<<" |"<<"\t"<< dec << (int)c <<" |"<< hex << (int)c <<" |";
getch();
}
cout<<endl<<"| "<<c<<" |"<<"\t"<< dec << (int)c <<" |"<< hex << (int)c <<" |";
cout <<endl;
cout<<"----------------------------------------";
getch();
return(0);
}
12
2.3 Tipo de dato “int”
De forma similar el tipo unsigned short puede almacenar valores en el rango de:
0 a 65535.
Ejemplo:
short i, j;
En general:
13
2 bytes = 16 bits
bit de signo
0=+
1=-
0000000000000000 = + 0
0000000000000001 = +1
0111111111111111 = + 32767
1000000000000000 = - 0 = -32768
1111111111111111 = -32767
Ejemplos:
int a = 2000;
signed int b= -30;
unsigned int c = oxf003;
14
PROGRAMA #2
#include<conio.h>
#include<string.h>
#include <stdio.h>
#include<iostream>
#include<time.h>
#include<ctime>
// PROGRAMA No.2
int main(void)
{
int i, j;
int xmin=1,xmax=15,ymin=1,ymax=3;
system("cls");
cout<<"\t\t\t\t\tMANEJO DE DATOS ENTEROS\n\t\SIMULACION DE
MOVIMIENTO\n\n";
cout<<"\n\n\t\tpresione cualquier tecla para continuar";
getch();
system("cls");
for(j=ymin; j<ymax;j++)
{
for(i=xmin;i<=xmax;i++)
{ cout<<">"; delay(1);
cout <<"\b ";
}cout<<endl;
}
cout<<"\n FIN";
getch();
15
2.4 Tipo de dato “long”
(entero largo 4 bytes)
Este tipo de números es idóneo para aplicaciones de gestión. Al igual que los
enteros, son números sin punto decimal comprendidos en el rango de:
-2147483648 a 2147483647 para tipo long.
0 a 4294967295 para el tipo unsigned long.
En general:
tamaño (int) tamaño (long).
Un número real en doble precisión es uno que puede tener un punto decimal y
puede estar comprendido en el rango de:
Ejemplo:
double x;
double a= 3.1415926;
double b= 2.2 e-8
16
Un número real en doble precisión formato largo no tiene más de 19 dígitos
significativos. Esto da lugar a cálculos más precisos que en doble precisión.
Ejemplo:
long double x;
long double>’=3.17e+425;
float x;
float a = 3.14159;
float b = 2.2 e-8;
17
Signo exponente signo exponente
32 bits
18
El rango de valores representable por cada uno de los campos es:
OVERFLOW Y UNDERFLOW:
Overflow
Underflow
19
o coprocesadores para poder usarlos, y si bien actualmente todas las PC que
podemos encontrar poseen coprocesadores, no pasa lo mismo con los
microcontroladores que en su mayoría no lo soporta.
Si bien el ensamble posee emuladores de coma flotante, lo que se intenta, es
que se comprenda el uso del punto flotante para luego poder ser utilizado en
cualquier microprocesador o microcontrolador que no posee ninguna
característica de manejo para estos números.
Componentes
Un número flotante esta formado por:
- 1 . 10111 X 21101
Exponente
Mantisa (parte decimal)
Signo
Cada una de estas partes del punto flotante tendrán una ubicación determinada
dentro de la codificación del número, y su longitud detendrá el tipo del número.
EXPONENTE
eieee = e + 2m-1 -1
MANTISA
La mantisa debe cumplir 1 = mantisa<2. Por lo tanto la parte entera será siempre
1 y solo será guardada en el número la parte decimal justificada a la derecha (un
caso particular es el 10 – byte real, en el cual el campo de parte entera existe, y
siempre valdrá 1).
20
Signo
1 = NEGATIVO
0 = POSITIVO
TIPOS
Signo: 1 bit
Exponente: 8 bits
Mantisa (parte decimal): 23 bits
Total: 32 bits (4 bytes).
Singo: 1 bit
Exponente: 11 bits
Mantisa (parte decimal): 52 bits
Total: 64 bits (8 bytes)
21
2.9 Aritmética de punto flotante
X=3.625
El número será de la forma (-1)5 X f X 2e.
Sacamos el exponente
f X 2e = 3.625
Parte decimal:
0.8125 X 2 = 1.625 entero =1
0.625 X 2 = 1.25 entero =1
0.25 X 2 = 0.5 entero =0
0.5 X 2 = 1 entero= 1
f= 1.1101
resultado:
x=(-1)0 X 1.1101 X 21
Signo= 0
Mantisa = 110100000000000000000002
Exponente:
exp= 1 +27 -1= 1 +127 = 128
exp= 100000002
Resultado
x= 3.625
x= 1.1101x21
22
x= 0_10000000_11010000000000000000000
x=4068000016
Primero debemos realizar una función que almacene el valor en el número. Está
función realizará lo siguiente:
carga el bit de signo con el signo del número.
guarda en la mantisa el valor ABSOLUTO del número.
Calcular el exponente y guardarlo en el campo correspondiente.
Para la realización del cálculo del exponente deberemos saber primero como
estamos almacenando el número.
x = 1,000000000001001001101 x 2e
Esto significa que el exponente no puede ser 0, sino que será un número que
recorra la coma a la derecha tantos lugares como longitud de mantisa tenga,
para este caso serán 23, además sabemos que el valor a almacenar en el campo
de exponente es
0 10001010 00000000000100100110100
Una vez hecho esto debemos realizar otra operación llamada normalización.
Esta operación realiza sucesivos shift register a la izquierda al mismo tiempo
23
que se decrementa el exponente hasta que el shift register provoque el desborde
de un uno.
Ejemplo:
double fx(void);
double fy(void);
void *p;
Este ejemplo declara la función denominada fx como una función sin argumentos
que devuelve un valor de tipo real de doble precisión; la función fy, como una
función sin argumentos que no devuelve valor alguno; y un puntero p a un objeto
de un tipo especificado.
PROGRAMA #3
24