Pascal y Java: C, C++

Anuncio
Turbo Pascal
Tokens
Palabras reservadas de Pascal
and
array
begin
boolean
case
const
char
div
do
downto
else
end
file
for
function
goto
if
in
integer
label
mod
nil
not
of
or
packed
procedure
program
record
repeat
real
set
then
to
type
until
var
while
with
Tipos de datos
byte
char
integer
real
boolean
single
string
word
longint
double
constantes
basicamente Pascal maneja dos tipos de constantes : de caracteres string y numericas
De caracteres string que se hallan encerrados o delimitados por el carácter comillas . El tamaño de su longitud
depende del compilador. Cualquier carácter puede puede formar parte de la constante
numericas : En Pascal estamdar estan conformadas por digitos, el punto decimal y un signo . los dos ultimos
componentes dependen del tipo de constante.
La declaracion de variables presenta el siguiente prototipo :
const
variable=valor ;
un ejemplo de esto podria ser :
const
pi=3.14 ; radio = 20.8 ; titulo = `codigo' ;
Identificadores
1
Las reglas para los identificadores en Pascal Son :
• Deben empezar por letra.
• No exceder de 72 caracteres . En turbo pascal los identificadores deben ser unicos en sus primeros 63
caracteres.
• Los nombres de archivos, procedimientos, funciones y programas deben ser unicos o diferenciables
en sus primeros 63 caracteres. No deben contener el carácter guion y el underscore. .
Operadores
* Multiplicacion
/ Division real
div division entera
mod residuo de division entera
+ adicion, union de conjuntos
− substraccion, diferencia de conjuntos
= igual
< > no igual
< menor
> mayor
< = menor o igual
> = mayor o igual
in mienbro de conjunto
not negacion logica
or disyuncion logica
and conjuncion logica
(de mayor a menor)
Precedencia
4
3
2
1
operadores
not
* / div mod and
+ − or
= <> > >= <=
Las reglas de evaluacion de una expresion es :
2
• Si todos los operadores en una expresion tienen la misma precedencia la evaluacion de las
operaciones procede estrictamente de izquierda a derecha
• Cuando operadores de diferentes precedencias estan presentes en tonces las operaciones de
precedencia mas altas son evaluadas primero ( en una base de izquierda a derecha), luego son
evaluadas las operaciones de precedencia mas alta siguiente y asi sucesivamente.
• se puede alterar la prioridad de evaluacion mediante parentesis.
Control de flujo
Secuencias
En Pascal una secuencia en un numero finito de sentencias.
Sentencias condicionales
En Pascal las sentencias condicionales son el if y case (similar con el swicht en C/C++)
if
La sintaxis en pascal de esta sentencia es la siguiente :
if condicion then instrucción 1
else instrucción 2 ;
La condicion debe ser de tipo buleano, si el resultado es verdadero se ejecuta la instrucción 1, si es falso se
ejecutara la instrucción 2 . Si es requerido ejecutar mas de una instrucción, se debera hacer el uso de una
instrucción compuesta. Para satisfacer los requerimientos de sintaxis.
Por ejemplo :
if z=2
then begin
z :=k*t ;
y :=m
end
else begin
b := a ;
z :=k+b
end ;
case
Permite seleccionar de un cojunto de alternativas una de ellas, en base al valor de una variable de tipo
3
enumerado.
Iteraciones
En pascal estan tres sentencias de iteracion : while, repeat y for
repeat
esta sentencia consta de dos partes :
• Un conjunto de instrucciones, que puede ser una sola, las que al mismo tiempo de escritura del
programa no sabemos cuantas veces se van a ejecutar
• Una condicion de terminacion del bloque de instrucciones
La sintaxis de la instrucción es la siguiente :
repeat
instruccion1 ;
instruccion2 ;
..........
until condicion ;
while
su forma general es :
while condicion do begin
instruccio1 ;
instrucción 2 ;
instruccion
end ;
for
Su forma general es :
for variable de control
{ := valor inicial to valor final}
{ := valor inicial downto valor final}
do instrucción ;
4
La sentencia for con las opciones to downto implican en su orden, un aumento o disminucion de uno con
respecto a su valor inicial. El limite de la iteracion del bloque de instrucciones vendra dado por el valor final
Los valres inicial y/o final podrian ser expresiones cuyo resultado sea un entero.
La opcion to, el valor inicial tiene que ser menor o a lo sumo igual a su valor final.
Com la opcion downto , el valor inicial debe ser mayor o a lo sumo igual que el final
Por ejemplo ;
N :=20 ;
J=10 ;
For I := J to N do A :A+1 ;
Variables
Las variables en Pascal se deben definir siempre al principio del programa, en una parte destinada a esto..
Por ejemplo :
Program hola ;
type
.........
var
i,j,k :integer ;
x,y :real ;
Pascal posee variables globales y son accesibles por cualquier modulo del programa, su ciclo de vida es todo
el programa.
Tambien existen variables locales al procedimiento o funcion, tienen existencia propia, cuando el modulo ,
procedimiento o funcion es invocado y permanecen con vida hasta su terminacion, su visibilidad es
unicamente para ese modulo.en la cual la variable existe.
Estructuras
Son manejadas con la misma logica de otros lenguajes.
Su prototipo es :
type
nombre del tipo de registro = record
5
v1,v2 tipo v ;
v3 tipo w ;
end ;
var
variable :registro ;
En esta declaracion se especifica en la parte var si hay variables de tipo estructurado.
Un ejemplo de una estructura podria ser :
type
registro = record
codigo : integer ;
nombre : array[1..35] of char
end ;
var
estudiante :registro ;
Para que la estructura estudiante pueda accesar a alguno de sus componentes se escribe :
estudiante. variable que se halla en la estructura.
Otro tipo de estructura en Pascal son los conjuntos. Hay que tener en cuenta que en los conjuntos se tiene que
trabajar con la logica de estos.
Un conjunto se define como una colección de objetos que pertenecen a un mismo tipo base asociado al
conjunto.
Un ejemplo puede ser :
type
frutas=(Pera,Lulo) ;
f=set of frutas ;
var
b :f ;
Tipos definidos por el usuario
6
Tipo enumerado
Es u tipo de dato enumerado no estandar y definido por el programador, el cual esta constituido por una serie
de valores a los que el sistema de Pascal les asigna un ordenamiento lineal, para asi poderlos identificar
internamente.
Las variables asociadas a un tipo enumerado solo pueden almacenar valores que conforman el tipo.
El protoyipo para un tupo enumerado es :
type
te = (valor1,valor2...,valorn)
var
v1 :te ;
Procedimientos y funciones
Procedimientos
un procedimiento es un programa que puede entregar mas de un valor al procedimiento, funcion o programa
que lo activa.
Un procedimiento en Pascal se define de la siguiente forma :
procedure nombre del procedimiento (lista de parametros formales que necesita) ;
declaracion de variables locales al procedimiento si lo requiere
begin
Instruccines del procedimiento
end ;
Si el procedimiento no declara variables locales , significa que va a trabajarcon variables globales, que son
definidas en cualquier bloque externo que lo contenga.
La llamada a un procedimiento es :
nombre del procedimiento (parametros actuales si los requiere) ;
Funciones
Una funcion es un programa que solo entrega un valor al programa , funcion o procedimiento que la invoca.
La declaracion de una funcion es :
function nombre de la funcion (parametros formales si los requiere) : tipo resultante ;
7
var
declaracion de variables locales si lo requiere;
begin
instrucciones
end ;
La llamada a una funcion se hace en la siguiente forma :
identificador := (parametros actuales si los tiene) ;
El identificador y el nombre de la funcion deben ser de tipos compatibles.
Sustitucion por valor
Este tipo de sustitucion de parametros se representa cuando en la definicion de los parametros formales no se
antepone la palabra var a la definicion del parametro. Cuando este tipo de sustitucion se presenta, el valor del
parametro actual es evaluado y colocado en el parametro formal, o sea que se asegura que el valor almacenado
en el parametro formal no sea cambiado durante la ejecucion de la rutina.
Ejemplo :
.......
procedura a (i,j,k :integer) ;
.......
end ;
.......
a (5,w,t) ;
.......
Es bueno recalcar entonces que todo cambio efectuado en los parametro formales en el procedimiento no
afectara a ninguna variable que lo invoca, o esa que dichos parametros formales son variables locales al
procedimiento.
Sustitucion por referencia
Este tipo de sustitucion de parametros se presenta cuando en la definicion de parametros formales en la rutina,
se le antepone al parametro la palabra var. Cuando se presenta este tipo de sustitucion el parametro actual le
envia su direccion al parametro formal, luego el contenido del parametro actual puede ser modificado si su
correspondiente parametro formal es modificaf\do en la rutina.
Ejemplo :
8
...........
procedure B (var t,w : integer) ;
.....
end ;
begin (*principal*)
......
B (l,m) ;
Las variables l,m podran ser alteradas en su contenido en el procedimiento B.
Entrada y salida
Las instrucciones read y write son las instrucciones de entrada y salida asociadas con los medio estandar del
instema : Input y output (entrada y salida ) los cuales dependiendo del equipo, se asociarian a dispositivos
como : terminal, un archivo local , impresora, etc.
La instrucción de entrada posee la siguiente sintaxis :
read (input,lista de identificadores) ;
que es lo mismo que
readln (lista de identifiadores).
Un ejemplo de esto podria ser :
readln(a,c,d,...,n) ;
La instrucción de salida posee la siguiente sintaxis :
write (output lista de variables)
que es lo mismo que
writeln (lista de variables) ;
Un ejemplo de esto podria ser :
writeln(a,c,d,...,n) ;
Cabe la pena recordar que en las instrucciones read y write aunque estan asociadas a un input y a un output
estandar, estos pueden ser asignados a otros dispositivos, según las necesidades del programador.
Lenguaje C (turboC/C++3.1)
Tokens
9
Palabras claves ( reservadas) de C
Las 32 palabras clave definidas por el estándar ANSI
auto
double
int
break
else
long
case
enum
register
char
extern
return
const
float
short
continue
for
signed
default
goto
sizeof
do
if
static
struct
switch
typedef
union
unsigned
void
volatile
while
Tipos de datos
Tipos de datos básicos
Tipo
char
int
float
double
void
Tamaño en bits
8
16
32
64
0
Rango
0 a 255
−32768 a 32767
3.4E−38 a 3.4E+38
1.7E−308 a 1.7E+308
sin valor
A excepción del tipo void , los tipos de datos básicos pueden ser precedidos por varios modificadores. Un
modificador altera el significado del tipo base para que se ajuste más a cada necesidad. Los modificadores
son :
signed
unsigned
long
short
Los modificadores signed, short, long y unsigned se pueden aplicar a los tipos base entero y carácter . Sin
embargo , long también se pude aplicar a double.
Todas las combinaciones posibles de los tipos básicos y los modificadores de C
Tipo
char
unsigned char
signed char
int
unsigned int
signed int
Tamaño en bits
8
8
8
16
16
16
Rango
−128a 255
0 a 255
−128 a 127
−32768 a 32767
0 a 65535
−32768 a 32767
10
short int
unsigned short int
signed short int
long int
unsigned long int
signed long int
float
double
long double
16
16
16
32
32
32
32
64
64
−32768 a 32767
0 a 65535
−32768 a 32767
−2147483648 a 2147483647
0 a 4294967295
−2147483648 a 2147482647
3.4E−38 a 3.4E+38
1.7E−308 a 1.7E+308
1.7E−308 a 1.7E+308
Constantes
Las constantes en C se refieren a valores fijos que no pueden ser alterados por el programa . Pueden ser de
cualquier tipo de datos.
C admite otro tipo de constante, además de los tipos de datos predefinidos . Se trata de la cadena. Una
constante de cadena siempre está encerrada entre comillas dobles.
Identificadores
La longitud de un identificador en C puede variar entre uno y 32 caracteres. El primer carácter debe ser una
letra o un símbolo de subrayado y los caracteres siguientes pueden ser letras, números o símbolos de
subrayado . C permite también usar el símbolo $ en un nombre de un identificador , pero no se trata de algo
estándar, siendo recomendable no hacerlo.
En C las minúsculas y las mayúsculas se tratan como distintas. Por ejemplo hola, Hola y HOLA son tres
identificadores distintos. Un identificador no puede ser igual que una palabra clave de C y no debe tener el
mismo nombre que alguna función ya escrita o que se encuentre en la biblioteca de C
Operadores
En C hay tres clases generales de operadores : aritméticos, relacionales y lógicos
Operadores aritméticos
operador
−
+
*
/
%
−−
++
acción
resta, también menos
monario
suma
multiplicación
división
División en módulo
decremento
incremento
Es de recordar que cuando se aplica una división a un entero o a un carácter , cualquier resto es suprimido. Por
ejemplo 10/3 el resultado será 3 en división entera.
11
El operador % proporciona el resto de una división entera. Por ello no puede aplicarse a tipos de coma
flotante
Incremento y decremento
El operador ++ (incremento) añade 1 a su operando y −− (decremento) le resta 1. Por lo tanto las siguientes
operaciones son equivalentes :
x=x+1 ;
es lo mismo que
++x ;
También
x = x−1 ;
es lo mismo que
−−x :
En estas operaciones es lo mismo poner ++x ; y x++ ; (para el decremento ) y es lo mismo −−x ; y x−− ; (para
el decremento)
Pero no es lo mismo cuando se usan los operadores en una expresión . Cuando un operador de incremento o
decremento precede al operando, C lleva a cabo la operación de incremento o decremento antes de usar el
valor del operando. Por ejemplo :
x=4
y = ++x ;
En este caso, se pone a y en 11. Pero, si se escribe el código como
x = 10 ;
y = x++ ;
y toma el valor de 10. Es de mucha importancia tener en cuenta que en ambos casos x queda como 11 ; la
diferencia está en cuándo cambia el valor.
Precedencia de los operadores aritméticos.
Mayor ++ −−
−(monario)
/%
Menor + −
12
Operadores relacionales y lógicos
El terminode operador relacional se refiere a la relación entre unos valores y otros . En el termino operador
lógico la palabra lógico se refiere a las formas en que esas relaciones pueden conectaese entre sí siguiendo las
reglas de la lógica formal.
En los operadores lógicos se trabaja el 0 como falso y el 1 como verdadero
Operadores relacionales
operador
>
>=
<
<=
==
!=
acción
mayor
mayor o igual
menor
menor o igual
igual
no igual
Operadores lógicos
operador
&&
||
!
acción
y
o
no
Tanto los operadores relacionales como los lógicos tienen un nivel de precedencia menor que los aritméticos.
Esto significa que una expresión como 10>3+2 se evalúa como si hubiera escrito 10>(1+12)
Precedencia relativa entre los operadores relacionales y lógicos
Mayor !
>= < <=
== !=
&&
Menor ||
Como en el caso de las expresiones aritméticas , se pueden usar paréntesis para alterar el orden natural de
evaluación en una expresión relacional o lógica. Por ejemplo :
!1 &&0
Es falso , porque primero se evalúa ! y luego se evalúa &&. Sin embargo cuando se usan paréntesis en la
misma expresión el resultado es verdadero :
!(1&&0)
13
Operador ?
C contiene un operador muy conveniente para sustituir ciertas sentencias de la forma if−then−else. El
operador ternario ? toma la forma general :
Exp1 ? Exp2 :Exp3 ;
donde Exp1 , Exp2 y Exp3 son expresiones.
El operador ? funciona de la siguiente forma : evalúa Exp1 . Si es cierta, evalúa Exp2 y toma ese valor para la
expresión. Si Exp1 es falsa, evalúa Exp3 tomando su valor para expresión. Por ejemplo :
x=10 ;
y= x>9 ? 100 : 200
En este ejemplo, a y se le asigna el valor de 100, si x hubiera sido menor que 9, y habría recibido el valor de
200
Los operadores de puntero & y *
Un puntero es la dirección de memoria de una variable. Una variable puntero es una variable específicamente
declarada para contener un puntero a su tipo específico.
El primer operador de punteros es &, un operador monario que devuelve la dirección de memoria del
operando. Por ejemplo :
m = &cont ;
coloca en m la dirección de la memoria de la variable cont. Esta es la dirección de la posición interna en la
computadora de la variable. No ! tiene nada que ver con el valor de cont.
El segundo operando de puntero es * , el complementario de &. Es un operador monario que devuelve el valor
de la variable ubicada en la dirección que se especifica.
Para declarar una variable como puntero se pone :
tipo de dato *nombre de la variable
Por ejemplo : char *cadena ;
En este ejemplo hay que aclarar que cadena no es un carácter, sino un puntero a un carácter
La coma como operador
Como operador, la coma encadena varias expresiones. La parte izquierda del operador coma siempre se
evalúa como void. Esto significa que la parte derecha se convierte en el valor de la expresión total separada
por coma. Por ejemplo :
x = (y=3, y+1) ;
Primero se asigna el valor de 3 a y y luego se asigna el valor de 4 a x . Los paréntesis son necesarios debido a
14
que el operador coma tiene menor precedencia que el operador de asignación.
Los operadores . y !
Los operadores . (punto) y ! (flecha) referencian elementos individuales de las estructuras y de las uniones.
Las estructuras y las uniones son tipos de datos compuestos que se pueden referenciar bajo un solo nombre.
El operador punto se usa cuando se trabaja realmente con la estructura o la unión .
El operador flecha se usa cuando es usa un puntero a una estructura o a una unión. Por ejemplo, dada la
estructura :
struct empleado{
char nombre[70] ;
int edad ;
float sueldo ;
}emp ;
Se usa el siguiente código para asignar el valor 500,55 al elemento sueldo de la estructura emp
emp.sueldo = 500,55 ;
Sin embargo, la misma asignación usando un puntero a la estructura emp sería
emp! sueldo=500,55 ;
Operadores [ ] y ( )
En C , los paréntesis son operadores que aumentan la precedencia de las operaciones que la contienen.
Los corchetes sirven para la indexación de arrays.
Operador =
Es un operador binario que sirve en C para las asignaciones .
Su asociatividad a diferencias de todos los operadores binarios es de derecha a
izquierda.
Cuando el operador = es subsiguiente a un operador binario sirve para abreviar expresiones tales como :
x = x+10 ;
puede escribirse como
x+=10 ;
15
Asociatividad de los operadores en C
Los operadores del lenguaje C los operadores binarios a excepción del operador = poseen una asociatividad de
izquierda a derecha y los operadores monarios *,& y el operador ternario ? se asocian de derecha a izquierda.
Precedencia de los operadores de C
Mayor ( ) [ ] !
! ++ −− * &
*/%
+−
< <= > >=
== !=
&&
||
?
= += −= *= /=
Menor ,
Control de flujo
Secuencias
Las secuencias en C, son un numero finito de sentencias. Por ejemplo :
#include <stdio.h>
void main (void){
int a=10 ;
printf(%d,a) ;
}
Decisiones
En C una prueba condicional da un resultado cierto cuando arroja un numero distinto de cero y falso cuando
es cero.
C soporta dos tipos de datos condicionales : if y switch. Además , el operador ? que es una alternativa de if en
ciertas ocasiones.
16
if
La forma general de la sentencia if es :
if (expresión) sentencia ;
else sentencia ;
Si la expresión es cierta se ejecuta la sentencia o el bloque de sentencias que es el objetivo de if ; en cualquier
otro caso se ejecuta la sentencia o el bloque de sentencias que constituye el objetivo de else. Por ejemplo :
#include <stdio.h>
void main (void){
int numero=321 ;
int intento ;
printf(adivine el numero) ;
scanf(%d,&intento) ;
if(intento==numero) printf(correcto) ;
else printf(mala suerte) ;
}
operador ?
Se puede usar el operador ? para reemplazar las sentencias if/else con la forma general :
if(condición)
expresión
else
expresión
La restricción clave es que el objetivo de if y del else deben ser expresiones simples − no otra sentencia de C.
La ? tiene la forma general
Exp1 ? exp2 : Exp3
Si desea ver un ejemplo de este operador se puede remitir a la parte del trabajo donde se tratan los operadores
de C.
switch
Esta sentencia compara sucesivamente una variable con una lista de constantes enteras o de caracteres.
Cuando se encuentra una correspondencia se ejecuta una sentencia o bloque de sentencias. La forma general
17
de la sentencia switch es la siguiente :
switch (variable){
case constante1 :
secuencia de sentencias
break ;
case constante2 :
secuencia de sentencias
break ;
.
.
default :
secuencia de sentencias
}
donde la sentencia default se ejecuta si no se encuentra ninguna correspondencia
Hay tres cosas importantes que se deben saber de la sentencia switch :
• Solo puede comprobar igualdad
• No puede haber 2 constantes case en el mismo switch
3 Si se utilizan Constantes de tipo carácter en la sentencia switch, se convierte automáticamente a sus
valores.
Un ejemplo de swith puede ser :
void menu (void){
char c ;
printf(1.se calculan derivadas \n) ;
printf(2. Se calculan integrales) ;
c=getche() ;
switch(c){
18
case '1' :
derivar() ;
break ;
case `2' :
integrar() ;
break ;
default :
print(ninguna opción seleccionada) ;
}
}
Iteraciones
Las sentencias de iteración(bucles) son for,while y do.
For
La forma general de la sentencia for es
for(inicialización ; condición ; incremento) sentencia ;
Un ejemplo de for puede ser :
#include <stdio.h>
void main (void){
int i ;
for(i=0 ;i<=10 ;i++) printf(%d,i) ;
}
Este programa imprime los numeros del 1 al 10.
While
La forma general de la sentencia while es :
while (condición)sentencia ;
La condición puede ser cualquier expresión y cualquier valor distinto de cero es cierto. El bucle itera mientras
la condición es cierta. Cuando la condición se hace falsa, el control del programa pasa a la línea siguiente del
19
código del bucle.
Un ejemplo de while
#include <stdio.h>
void main (void){
int i =1;
while (i <=10){
printf(%d,i) ; i++ ;
}
}
Este programa imprime los números del 1 al 10.
Do/while
A diferencia de los bucle for y while, que analizan la condición del bucle al principio del mismo, el bucle
do/while analiza la condición al final del bucle. Esto significa que el bucle do/while siempre se ejecuta al
menos una vez. La forma general del bucle do/while es
do{
secuencia de sentencias ;
}while (condición) ;
Un ejemplo de do/while
#include <stdio.h>
void main (void){
int i =1;
do{
printf(%d,i) ; i++ ;
}while(i<=10) ;
Este programa imprime los números del 1 al 10.
Variables
Todas las variables han de ser declaradas antes de poder usarlas. La forma general de declaración es la que se
muestra a continuación :
20
tipo lista_de_variables ;
Por ejemplo :
int carro ;
Variables locales o automáticas
Estas variables pueden usar la palabra opcional auto para declararlas (pero es innecesario)
Son las que se declaran dentro de una función .
Pueden ser referenciadas solo por sentencias que estén dentro del mismo bloque en el que han sido declaradas.
Un bloque comienza donde hay una llave abierta y finaliza donde con una llave cerrada.
Estas variables solo existen mientras se está ejecutando el bloque de código en el que son declaradas, cuando
sale de este bloque la variable se destruye.
Variables globales
Su declaración se hace fuera de cualquier función.
Posee una visibilidad para todas las funciones del programa y su ciclo de vida es de todo el programa.
Especificadores de clase de almacenamiento
Existen cuatro especificadores de clase de almacenamiento admitidos por C. se trata de los siguientes :
extern
static
register
auto
Estos especificadores indican al compilador cómo debe almacenar la variable que le sigue. El especificador de
almacenamiento precede al resto de la declaración de variable. Su forma es :
especificador_de_almacenamiento tipo nombre_de_variable ;
Extern
Dado que C permite enlazar juntos distintos módulos de un gran programa compilados por separado con el fin
de acelerar la compilación y ayudar en la gestión de grandes proyectos, la forma de que todos los archivos
conozcan las variables globales requeridas en el programa es : declarando todas las variables globales en un
archivo y usar declaraciones extern en los otros archivos. Por ejemplo :
archivo 1
archivo 2
int y,x=123 ;
extern int y,x ;
21
main (void){
void funcionmatera(void){
y=100 ;
x=y/2 ;
}
}
Variables estáticas
Dentro de su propia función o archivo, las variables static son variables permanentes .
Difieren de las variables globales en que no son conocidas fuera de su función o archivo, aunque mantienen
sus valores entre llamadas.
Variables estáticas locales
Cuando se le aplica el modificador static a una variable local , el compilador crea un almacenamiento
permanente para ella de una forma muy parecida a cuando crea un almacenamiento a una variable local ,o sea
que no se destruye al salir de la función, la gran diferencia entre la variable local static y una global es que la
variable local static solo es conocida en el bloque en que está declarada.
Variables estáticas globales
Cuando se aplica el modificador static a una variable global , se indica al compilador que cree una variable
global conocida únicamente en el archivo en el que se declara la variable global static
Variables registro
El especificador register únicamente se puede aplicar a variables locales y a los parámetros formales de una
función, las operaciones sobre variables registro se llevan mucho más rápido que sobre las variables
guardadas en memoria .
Usualmente se usan para control de ciclos
Estructuras
En el lenguaje C, una estructura es una colección de variables que se referencia bajo un único nombre,
proporcionando un medio eficaz de mantener junta la información relacionada. Una declaración de estructura
forma una plantilla que puede utilizarse para crear variables de estructura . Las variables que componen la
estructura se llaman elementos de la estructura. En general, cada elemento de la estructura está lógicamente
relacionados con los otros.
La forma general de una estructura es :
struct etiqueta{
tipo nombre_de_variable ;
tipo nombre_de_variable ;
.
.
22
} variables_de_estructura ;
el nombre con que se identifica una estructura en particular es la etiqueta.
Las variables de estructura no necesariamente tienen que estar declaradas después de la declaración de la
estructura, se pueden declarar en otras partes de la función así :
struct etiqueta variable_de_estructura ;
Un ejemplo de una estructura podría ser :
struct directorio{
char nombre[30] ;
char dirección[40] ;
char ciudad[20] ;
char departamento[30] ;
};
struct directorio paciente ;
Tipos definidos por el usuario
Typedef
C permite definir explícitamente un nuevo tipo de dato usando la palabree typedef. Realmente no se crea una
nueva clase de dato, sino que se define un nuevo nombre para un tipo existente. Este proceso puede ayudar a
hacer más transportables los programas con dependencias con la máquina ; solo habrá que cambiar las
sentencias typedef .
La forma general de la sentencia typedef es :
typedef tipo nombre ;
Donde tipo es cualquier posible tipo de dato y nombre es el nuevo nombre para ese tipo. El nuevo nombre que
se define es una adición, no ! un reemplazamiento del nombre de tipo existente.
Por ejemplo, se puede crear un nuevo nombre para float usando
typedef float intereses;
En esta sentencia se indica al compilador que ha de reconocer intereses como otro nombre de float. A
continuación se puede crear una variable de tipo float usando intereses :
intereses Carlos ;
Aquí, Carlos, es una variable de tipo intereses, que es otro nombre de float.
23
Funciones
Las funciones son los bloques constructores de C y el lugar donde se da toda la actividad en el programa. La
forma general de la función es :
especificador_de_tipo nombre_de_la_función(lista de parámetros)
{
cuerpo de la función
}
El especificador_de_tipo especifíca el tipo de valor que devuelve la función mediante la sentencia return . El
valor puede ser cualquier tipo válido. Si no se especifica ningún tipo, el compilador asume que la función
devuelve como resultado un entero. La lista de parámetros es la lista de nombres de variable separados por
comas con sus tipos asociados que reciben los valores de los argumentos cuando se llama la función. Una
función puede no tener parámetros en cuyo caso la lista de parámetros contiene solo la palabra void.
En general se pueden pasar argumentos a las funciones de formas. El primer método se denomina llamada por
valor y el segundo método se denomina llamada por referencia la cual se basa en apuntadores.
Un ejemplo de una función usando el método de llamada por valor podría ser :
#include <stdio.h>
int cuad (int x) ;
main (void){
int t=10 ;
printf ("%d", cuad(t));
return 0 ;
}
cuad (int x)
{
x*=x ;
return x ;
}
En este programa se ha de tener en cuenta que el argumento recibido por la función cuad no altera de forma
alguna a la variable t de la función principal, caso contrario al usar el método de llamada por referencia , por
ejemplo :
24
#include <stdio.h>
int cuad (int *x) ;
main (void){
int t=2 ;
printf ("%d", cuad(&t));
return 0 ;
}
cuad (int *x)
{
(*x)*=*x ;
return *x ;
}
En este caso la variable t de la función principal si se altera, t queda con el valor de 4
Entrada y salida
La entrada y salida en C se llevan a cabo mediante el uso de funciones de la bibioteca ; no hay palabras claves
de C que realicen las operaciones de E/S.
Antes de empezar a mencionar algunas instrucciones de E/S es bueno conocer el concepto de flujo. El sistema
de E/S de C suministra un nivel de abtraccion entre el programador y el dispositivo que se esta usando. A esta
abstraccion se le llama flujo .
Toda la E/S tiene lugar a traves de flujos. Todos los flujos son iguales. El sistema de archivos enlaza un flujo
a un archivo , que es cualquier dispositivo capaz de llevar a cabo E/S .
los E/S que se van a mensionar en este trabajo son E/S de consola, pero se puede redirigir la E/S por consola a
otros dispositivos..
getche( ) y putchar( ).
Las funciones mas simples de E/S por consola son getche(), que lee un carácter del teclado , y putchar que
imprime un carácter en la pantalla en la posicion actual del cursor. La funcion getche () espera hasta que se
pulsa una tecla y entonces devuelve su valor. El eco de la tecla pulsada aparece automaticamente en la
pantalla
Los prototipos de getche() y putchar() son :
int getche(void) ;
25
int putchar (int0 ;
gets() y puts()
Estas funciones permiten leer y escribir cadenas de caracteres por consola .
La funcion gets() lee una cadena de caracteres introducida por el teclado y la situa en la direccion apuntada
por su argumento de tipo puntero a carácter.
La funcion puts() escribe su argumeto de cadena en la pantalla seguido de un carácter de salto de linea.
Un ejemplo de gets() y puts() puede ser :
#include <stdio.h>
#include <string.h>
void main (void){
char cadena [20] ;
gets(cadena) ;
puts(cadena) ;
}
printf()
el prototipo de printf() es
int printf(const char *cadena de formato,...) ;
en donde cadena de formato consiste en dos tipos de elementos : caracteres que se mostraran en la pantalla y
ordenes de formato que definen la forma en que muestran los argumentos posteriores. Una orden de formato
empieza con el signo porcentaje y va seguido por el codigo del formato.
Por ejemplo :
printf(hola %d, 10) ;
scanf()
Es una rutina de entrada por consola de proposito general. Puede leer todos los tipos de datos que suministra
el compilador y convierte los numeros automaticamente al formato interno apropiado.
Los especificadores de formato de entrada van precedidos por un signo % e indican a scanf() que tipo de dato
se va a leer a continuacion.
Todas las variables que utilizan para recibir valores a traves de scanf() se deben pasar por sus direcciones.
Por ejemplo : scanf(%d,&cuenta) ;
26
OBJETOS :
En los programas que analizaremos a continuacion se utilia la metodologia de programacion orientada a
objetos .De la cual hablaremos unos conceptos basicos en lo que sigue :
Modularidad y flexibilidad : esto nos permite crear programas faciles de modificar y entender. Pudiendo o
permitiendo este suprimir , aumentar el codigo a su minima o a su maxima expresion sin deterriorar o alterar
la escencia y finalidad del mismo. Podemos hacer un simil de esta metodologia con el juego de unir fichas
(Lego) ; dichas fichas hacen las veces de objetos , capacitando al programador para poder cambiar la posicion,
suprimiendolas o anadiendolas según sus requerimientos o caprichos .
Que es la herencia ? :
Consiste en que todas las propiedades, capacidades o caracteristicas de una clase son tambien propiedad,
capcidad o caracteristica de una clase ,instancia o metodo que se cree dentro de ella, reduciendo de esta forma
las definiciones y por ende el codigo.
Que es una clase ?
Es un tipo de dato que almacena un conjunto de atributos o caracteristicas que sirve para asociar una serie de
metodos o instancias en una solo plataforma o base.
Que es un objeto ?
Es una especie de dato o contenedor de instrucciones cuya principal caracteristica es ser independiente a otros
objetos y con capacidad de adherencia o desvinculacion a estos (tambien se le llama instancia).
Que es un Metodo ?
Es un a accion que ejecuta el programa escrito en el lenguaje. Puede ser parte de un a clase o de un objeto.
JAVA VERSION BETA 1
Palabras reservadas :
Abstract
Boolean
Break
Byte
case
cactch
char
class
const
27
continue
do
double
else
extends
final
finaly
float
for
goto
if
implements
import
instanceof
int
interface
long
native
new
null
package
private
protected
public
return
short
28
static
super
switch
synchonized
this
throw
thorws
transient
try
void
volatile
while
COMENTARIOS
/* Comentario de varias lineas */
// Comentario de una sola linea
/** Comentario Javadocs */
LITERALES
numero Tipo int
numero [1| L] Tipo int
0xhex Entero hexadecimal
0octal Entero octal
[numero]. Numero Tipo duble
numero [f|f] Tipo float
numero [d|d] Tipo double
[+|−] numero con signo
numeroenumero Exponente
29
numeroEnumero Exponente
`carácter' Un solo carácter
Carácter Cadena
Cadena vacia
/b Retroceso
/f Tabulador
/n Alimentacion de linea
/F Alimentacion de forma
/r Regreso del carro
/ Comillas dobles
/' Comilla sencilla
\ Diagonal inversa
/uNNNN Escape Unicode (NNNN eshexadecimal)
true Booleano
false Booleano
ASIGANACION DE VARIABLES
Variable = valor Asignacion
Variable ++ Incremento sufijo
++Varaible Incremento prefijo
Variable−− Decremento sufijo
−−Variable Decremento sufijo
Variable += Valor Sumar y asignar
Variable −= Valor Restar y asignar
Variable /= Valor Multuplicar y asignar
Variable = Valor Dividir y asignar
Variable & = valor AND y asignar
30
Variable | = Valor OR y aisgnar
Varialble ^=Valor XOR y asignar
Variable <<= Valor Desplazamiento a la izquierda y asignar
Variable >>= Valor Desplazamiento a la derecha y asignar
Variable >>>= Valor Complemento cero despalzamiento a la derecha y asignar .
OPERADORES
arg + arg SUMA
arg − arg RESTA
arg * arg MULTIPLICACION
arg / arg DIVICION
arg % arg MODULO
arg < arg MENOR QUE
arg > arg MAYOR QUE
arg <= arg MENOR O IGUIA L
arg = = IGUAL
arg != arg DIFERENTE
arg && arg AND LOGICO
arg || arg OR LOGICO
! arg NOT LOGICO
arg & arg AND
arg | arg OR
arg ^ arg XOR
arg<< arg DESPLAZAMIENTO A LA IZQUIERDA
arg>> arg DESPLAZAMIENTO A LA DERECHA
arg>>> arg COMPLEMENTO CERO DESPLAZAMIENTO A LA DERECHA
~ arg COMPLEMENTO
31
(tipo) Objeto FORZADO
arg Instance of class INSTANCIA DE
prueba ? Operverdadero : OPERADOR TERNARIO (IF)
operfalso
TIPO DE DATOS
En java existen varios tipos de datos divididos en dos clases :
• 8 tipos de datos llamdos datos primitivos
• Una clase o interfaz
3− Un arreglo
Tipos primitivos :
Estos tipos de datos estan integados al sistema y no son objetos en realidad lo cual hace sus usu mas eficiente
ademas de que son independientes de la computadorea lo cual ahce confiable que su tamano y caracteristicas
sean consistentes en el programa.
En la siguiente tabla se muestra la clasificacion de los 8 tipos primitivos .
TIPO TAMANO RANGO
ENEROS
byte 8 bits −128 a 127
short 16 bits −32,768 a 32,767
int 32 bits −2,147,483,648 a 2,147,483,647
long 64 bits −9223372036854775808 a 9223372036854775807
PUNTOS FLOTANTES
float
double
CARACTERES
char
BOOLEANOS
true
falso
32
TIPOS DE CLASE O NOMBRE DE INTERFAZ
En este se incluyen los tipos graficos, los objetos, binarios y los tipos definidos por el usuario.
String lastName
Font basicFont
OvalShape myOval
CONSTANTES
Final
IDENTIFICADORES
Los identificadores en Java se pueden utilizar de cualquier forma teniendo en cuenta que Java hac distincion
entre letras mayusculas y minusculas, ofrede posibilidad de utilizar caracteres ASCCI ademas Java utiliza el
conjunto de caracteres UNICODE sobre 00c0 ; La unica restriccion sobre los identificadores en Java es la
conserniente con las variables las cuales pueden ser nombradas iniciando con un guion de subarayado, un
signo de dollares o una letra de ningun modo con un numero. Despues del primer carácter las variables
pueden incluir cualquier tipo de carácter.
SINTAXIS
• Tipos de clase e instancia .
• El nombre de una clase o interfaz
Un tipo de dato de puede declarar de esta forma para mantener instancias de una clase dada y sus subclases
• Tipos de objetos
Una clase se puede ver como una especie de creacion de un nuevo tipo de datos compuestos al utilizar struc,
typedef y union que en Java se han suprimido en favor de las calses .
SINTAXIS
OPERACIONES REALIZADAS SOBRE LA INFORMACION
ASIGNACION
CONTROL DE FLUJO
Sentencias
Las secuencias en Java son un numero finito de sentencias al igual que en los otros lenguajes
• Sentencias de desicion
if (prueba) bloque
else bloque condicional con else.
33
Switch (prueba) { switch , solo con tipos enteros o carácter
case valor : enunciados
case valor : enunciados
...
default : enunciados
}
• Sentencias de iteracion
For (inicializadro ; prueba ;
change) bloque
While (prueba )
Do bloque
while (prueba)
Lebel ciclos etiquetados
ESTRUCTURAS
En Java no existen estructuras definidas mediante struc sino que el solo hecho de crear una clase se esta
definiendo una especie de estructura y el acceso a sus elementos se hace pr medio de comandos generales ya
definidos.
TIPOS DEFINIDOS POR EL USUARIO
Java no cuenta con un enunciado typedef para declarar nuevos tipos de datos, de hecho en Java se crar
verdaderos nuevos tipos de datos pero para ello debe primero debe declarar una nueva clase, luego las
variables, metodos, intancias, subclases podran declararse para que sean de ese mismo tipo de clase o crearse
dentro de ella y con ello asumira automaticamente el tipo por medio de la herencia.
TOPICOS ESPECIALES
Manejo de memoria y de ntrada y salida
La administacion de la memoria en Java es automatica ; La memoria se asigna de forma automatica al crear
un objeto y un recolectro de basura a tiempo de ejecucion (el gc) libera esa memoria cuando ese objeto ya no
se usa . Las funciones de C malloc() y free() no existen en Java.
Para forzar la liberacion de un objeto elimine todas la referencia a este (asigne todas la variables y elementos
del arreglo que lo contienen a nulo). La siguiente vez que se ejecute gc, ese objeto sera requerido.
34
Entrada y salida .
Para la entrada y salida de la informacion en Java se utilizan bibliotecas de clases y objetos ya definidos en el
lenguaje de pendiendo del resultado o de lo que se quiere hacer :
ejemplo :
Imprimir un letrero en la pantalla que diga hola mundo.
1 :Class holaMundo {
2 public static void main ( String arg[] ) {
3 System.out.println(hola mundo) ;
4}
5}
PARALELO ENTRE PASCAL, C, C++ y JAVA
Nota : De las siguientes anotaciones se excluyen las relaciones de igualdad entre estos lenguajes.
COMENTARIOS
JAVA con relacion a C y C++ JAVA posee un tipo de cometario adicional (/** Javadoc).
JAVA con relacion a C y C++ JAVA utiliza identificadores sin limites de campo, puede utilizar caracteres
ASCCI y UNICODE en cambio C y C ++ el limite de campo es de 32 caracteres y no acepta UNICODE,
comparten la restriccion de inicio en ningun caso numero y reconose mayusculas.
JAVA con relacion a C y C++ en JAVA no existen tipos de datos sin signo.
JAVA con relacion a C y C++ en JAVA el tipo Boolean regresan balores true y false en ningun caso es entero
aunque se pue forzar a cero y uno.
JAVA y C++ con relacion a C y PASCAL crea realmente nuevos tipos de datos ; Esta diferencia consite en
que en C se crea es un sinonimo de un tipo de dato conocido.( En java no existe el enunciado typedef, para
definir un nuevo tipo de dato se dee primero crear una clase con esa o esas caracteristicas y luego se asocian
las variables, metodos, instancias e inclusive otras clases a este tipo de clase o dato).
JAVA en realcion a C++ el forzado de tipos de datos esta mas controlado, el forzaod automatico ocurre
solamente cuando no existe perdida de informacion los demas forzados deberan ser explicitos ; Los tipos
primitivos no podran forzarse a objetos o viserversa.
JAVA en relacion a C los operadores se comportan de igual forma.
JAVA La palabra clave new se enlasa mas estrechamente que la notacin de (.) la cual tiene un
comportamiento distinto que cn C++ observe el siguiente ejemplo :
new cinco( ).excelente ;
35
esta exprecion funciona como si se ubiera escrito asi :
(new cinco()).excelente
La sobrecarga de operadores al igual que en C++ no se puede realizar en Java.
JAVA con relacion a C tiene los operadores >>,<< ,>>> y ~ estos generan desplazamientos o
redireccionamientos sin signo, teniendo en cuenta que en Java no existen tipos de datos sin signo.
JAVA con realcion a C y C++ no cuenta con punteros explicitos (*, &) para sustituir esto todas la referencias
se logran con la creacion de nodos de lista con variables que apunten al siguiente o anterior nodo (referencias
implicitas) con la limitante que no puede realizar aritmetica de apuntadores ; Despues para insertar elementos
en la lista asigne esas variables a otros objetos tipo nodo.
JAVA con relacion a C y C++ utiliza el + para unir cadenas de caracteres .
JAVA con relacion a C y C++ no tiene arreglos bidimencionales o matrices en cambio se puede declarar y
crear un arreglo de arreglos ( y esos erreglos pueden contener arreglos y asi en lo sucesivo, en tantas
dimenciones como lo necesite y tener acceso a el como lo haria en una matriz en C o C++ ; La unica
condicion que cumple es que un arreglo no soporta varios tipos de datos simultaneamente.
JAVA con relacion a C y C++ sus cadenas son arreglos que a diferencia de C y C++ no terminan en un
carácter nulo y tampoco puede sobrepasar el limite de dicho arreglo ; por ende se tratan con las dificultades
inherentes de rastrear la aritmetica del apuntador que como ya se dijo no existe en Java.
JAVA con relacion a C y C++ no utiliza variables globales .
JAVA con relacion a C y C++ aunque las expresiones if, while, for y do en C y C++ retornan un valor entero
en cambio Java asume el retoro falso o verdadero
JAVA con relacion a C++ no cuenta con clases de plantillas como en C++.
JAVA con relacion a C++ las herencias son sencillas lo cual quiere decir que cada clase solo puede tener una
y solo una superclase.
JAVA con relacion a C y C++ No cuenta con funciones puesto que todas estas deben ser metodos y no puede
haber ninguno de estos que no este enlasado a una clase.
JAVA con relacion a C y C++ La palabra reservada goto no esta implementada ; para conmutar o construir
ejecuciones de ciclos se puede utilizar break y continue para entrar y salirse de un ciclo.
JAVA con relacion a C y C++ NO cuenta con el tipo register el cual ejecuta la variable en la Cpu.
JAVA con relacion a C y C++ No cuenta con un procesador y por ello no ostenta #defines o macros.
JAVA con relacion a C y C++ Puede declarar constantes pero solamente de clase o de instancia en ningun
modo para variables locales .
JAVA con relacion a C y C++ La independencia de plataforma es una de las diferencias mas marcadas con
relacion a otros lenguajes y en particular para los sistemas que necesitan funcionar en varias plataformas .
Java mantiene esta independencia tanto a nivel de codigo fuente como del binario.
36
OO/C++
C++ es un Lenguaje "orientado a objetos". La programación orientada a objetos es una solución a los
problemas de los grandes paquetes de software que fueron desarrollados primero en los años 70.
Todos los Lenguajes orientados a objetos tratan de lograr tres cosas como una manera de frustrar los
problemas inherentes en proyectos grandes:
• Todos los Lenguajes orientados a objetos implementan la "abstracción de los datos" en una manera clara
usando un concepto llamado clases; Brevemente, la abstracción de los datos es una manera de combinar
datos con las funciones manipulando los datos para que se escondan detalles de la implementación del
programador. La Abstracción de los datos hace los programas mucho más fáciles de mantener y actualizar.
• Todos los Lenguajes orientados a objetos tratan de hacer partes de los programas mas fácilmente usables y
extensibles; de acá es donde la palabra "objeto" viene. Los programas son quebrados en objetos reusables,
Se pueden agrupar estos objetos entonces juntos en maneras diferentes para formar programas nuevos,
objetos ya existentes pueden ser también extendidos, dándole a los programadores un camino fácil para
reusar códigos; es mucho mas fácil escribir programas ensamblando piezas existentes.
• Los lenguajes orientados a objetos tratan de hacer que la existente codificación sea fácilmente modificable,
sin realmente tener que cambiar la codificación. Éste es un concepto único y muy poderoso, usando dos
nuevos conceptos poliformismo y herencia es posible usar solo eso, el objeto existente permanece igual, y
algún cambio para este quedan encima de el; la habilidad de que el programador de mantener y ajustar el
código en una forma que es drásticamente mejor usando ese camino.
Desde que C++ es un Lenguaje orientado a objetos, este posee tres beneficios orientados a objetos. C++
también tiene otros dos dos mejoramientos propios para arreglar algunos problemas en el C original o para
hacer la programación en C++ mas fácil que en C.
• C++ agrega un concepto llamado "operator overloading", esta característica permite especificar nuevos
caminos de usar operadores estándar como + y >> en sus propios programas. Por ejemplo si usted quiere
agregar un nuevo tipo como un numero complejo a un programa C, la implementación no será simple. Para
agregar dos números complejos usted debe crear una función llamada add y luego decir c3=add(c1,c2);
donde c1, c2 y c3 son valores del el nuevo tipo de numero complejo, en cambio en C++ usted puede
overload (sobrecargar) los operadores + y =, así que usted puede decir: c3 = c1 + c2. De esta forma nuevos
tipos son agregados al lenguaje, completamente en una manera mas fácil. El concepto overloading
(sobrecargar) se extiende para todas las funciones creadas en C++.
• C++ también remueve algunas de las implementaciones de varias porciones del el lenguaje C, las mas
importantes I/O (entrada/salida) y la asignación de la memoria. Las nuevas implementaciones han sido
creadas mirando hacia la sobrecarga de los operadores (operators overloading), así es mas fácil agregar
nuevos tipos y proveer menos operaciones de i/o y asignaciones de memoria.
Este ejemplo puede ser visto en cada librería interna de C, el problema esta demostrado en el siguiente código,
que tenemos una string con un valor y luego concatenamos otra string dentro de esta :
char s[100];
strcpy(s, "Hola ");
strcat(s, "Mundo");
Este código no esta muy bueno, pero el formato es típico en cada librería que tu creas en C. El tipo de string
es construido dentro de el tipo de caracteres nativos del C. Porque el nuevo tipo no es parte del lenguaje
original, el programador es forzado a usar la función calls para hacer algo con esta. Lo que usted tiene que
37
hacer es ser capaz de crear un nuevo tipo y tenerlo listo para el resto del lenguaje, algo como esto:
string s;
s = "hola ";
s += "mundo";
Si esto fuera posible, entonces el lenguaje seria infinitamente extensible. C++ soporta este tipo de extensión a
través del overloading del operador y las clases, Nótese que cuando se usa el tipo string la implementación es
completamente oculta. Por eso es mas fácil cambiar la implementación de un tipo en el futuro sin afectar el
código existente.
Otro problema que usted puede tener como programador de C, involucra en cuando usted tiene que cambiar
de libreria, digamos por ejemplo que usted esta usando la funcion printf definida en la libreria stdio pero
usted quiere modificar esta, de modo que pueda manejar un nuevo tipo que usted a creado recientemente,
digamos que usted quiere modificar printf para poder imprimir numeros complejos, usted estara sin suerte a
menos que tenga el source (codigo fuente) de printf, y aun si usted tiene el source, la modificacion no hara
mucho porque ese source no es transportable o usted no tiene el derecho para copiar este. No hay forma
realmente de extender una libreria en C facilmente una vez esta haya sido compilada, para resolver su
problema de salida, usted debera crear ua nueva funcion para imprimir su nuevo tipo, si usted tiene mas de un
nuevo tipo luego usted probablemente debera crear varias funciones diferentes de salida, y todas ellas seran
diferentes. C++ maneja todas esos problemas con su nueva tecnica para (standards outputs) salidas estandar.
Una combinacion de sobrecarga de operador y clases, permiten a nuevos tipos integrarsen dentro del esquema
C++ I/O standards.
Mientras pensando en la funcion printf, piensa en su diseño y preguntate tu mismo esto : es una buena forma
de diseñar un codigo? Dentro de printf hay una declaracion switch que le da el formato a la string, un %d es
usado para numeros decimales, un %c es usado para caracteres, un %s es usado para strings (frases), y asi
sucesivamente. Hay por lo menos tres problemas con esta implementacion:
• el programador debe de mantener esa declaracion de switch y modificarlo para cada nuevo que ha de ser
manipulado. La modificacion significa que nuevos bugs(fallos) seran introducidos.
• No hay garantia de que el usuario encajara los parametros del dato con el formato de la string, asi que todo
el sistema puede fallar catastróficamente.
• Este no es expandible, a menos que usted tenga el codigo de origen usted no podra extender la declaracion
printf.
C++ resuelve estos problemas completamente forzando al programador a estructurar el codigo en una nueva
forma, la declaracion switch is ocultada y manejada automaticamente por el compilador a traves de la function
overloading, (sobrecarga de la funcion), es imposible equivocarse en los parametros, prmero porque estos no
son implementados como parametros en C++, y segundo porque el tipo de variable automaticamente controla
el mecanismo del switch que es implementado por el compilador.
C++ resuelve algunos otros problemas como bien.
Todo los que se escribe en C funciona en C++. Por supuesto , en muchos casos C++ ofrece una mejor manera
de manejar una tarea dada, en otros casos C++ ofrece una segunda forma de hacer algo y la opción le da a
usted mas flexibilidad.
Comentarios en C++
38
C++ soporta el estilo viejo de comentario multi−linea, como bien uno nuevo de linea sencilla denotado por el
simbolo: //. Por ejemplo:
// get_it funcion que lee los valores de entrada
void get_it()
{
// haga algo.
}
Todo desde el // hasta el final de la linea es ignorado. Usted puede usar ambos estilos de comentario
intercambiablemente en un programa C++.
Descripcion de variables
En C, usted puede describir un tipo de variable colocando un nombre de tipo en parentesis y colocandolo en el
fente de el nombre de la variable come se muestra a continuacion:
int i;
float f;
f = (float) i;
En C++ un segundo formato es tambien aceptado. Este hace ver la descripcion como una llamada de funcion,
como se muestra a continuacion:
int i;
float f;
f = float(i);
Esto lo miraremos mas adelante cuando estaremos discutiendo clases, para ver que hay una razon para este
nuevo formato.
Entrada y Salida
Terminal I/O
Una de las mas obvias diferencias entre C y C++ es el reemplazo de la libreria stdio en C con la libreria
iostream in C++. La libreria iostream toma ventaja de un numero de caracteristicas de las extenciones
orientadas a objetos de C++, y por eso hace la adicion de nuevos typos de I/O definidos por el usuarios mucho
mas facil. La librería iostream tambien reemplaza todas las capacidades encontradas en la libreria stdio, asi
que es mas importante saber las caracteristicas basicas de la nueva libreria mientras pasas codigo hacia C++.
El uso de la libreria iostream para entradas y salidas basicas es mejor. Dos ejemplos simples son mostrados a
continuacion:
39
cout << Hola\n;
o equivalentemente:
cout << "Hola" << endl;
Ambas formas producen la misma salida, y hacen que la palabra Hola seguida de una linea nueva aparezca en
la salida estándar. La palabra cout indica salida estandar. Como la destinacion para la salida, y el operador <<
(el operador inserción) es usado para recolectar los elementos, otros dos predefinidos standards output (salidas
estandars) son: cerr para informacion erronea no bufferiada y clog para informacion erronea bufferiada.
Uno de los tipos estandar puede ser escrito usando la misma tecnica mostrada a continuacion : integers, floats,
chars, y apuntadores todos pueden ser escritos, multiples elementos pueden ser metidos en una simple linea o
separados en multiples lineas, por ejemplo:
int i = 2;
float f = 3.14
y lo mismo seria :
char c = 'A';
cout << s << c;
char *s = "hello";
cout << f;
cout << s << c << f << i << endl;
cout i << endl;
produce la salida :
helloA3.142
El mecanismo de cout automaticamente entiende las direcciones y formatos para las salidas hex. por ejemplo
si i es un entero, luego la declaracion :
cout << &i << endl;
imprime la direccion i en formato hexadecimal, si p es un apuntador a i, entonces imprimir p tambien imprime
la direccion i en formato hex, hay casos por supuesto donde esta regla de formato no se mantiene; imprimendo
s, donde s es un apuntador a un caracter, produce una string apuntada por s en vez de la direccion coontenida
por s, para remediar esta situacion cast (moldee) s para impedir que el apuntador como se muestra a
continuacion si usted quiere ver su direccion:
cout << (void *) s;
Ahora la direccion contenida por s sera mostrada en formato hex, si usted dessea mostrar la direccio como un
numero decimal en vez de formato hex, moldee este a un entero largo.
cout << long(& i);
Esta linea imprime la direccionde i en formarto decimal, de la misma forma, un int es usado para imprimir el
valor entero de un caracter.
cout << int('A'); // produce 65 como salida.
40
Usted se dara cuenta de que el operador << ,Conocido en C como Shift left operator, ha sido ronado para
manipular salidas en C++. Si usted desea usar este para tirar datos hacia la izquierda dentro de una linea de
salida, entonces dbe usar el parentesis asi:
cout << (2 << 4); // produce 32 como salida.
para darle formato a la salida usted podra usar varias tecnicas; la declaracion :
cout << "[" << setw (6) << setfill('*') << 192;
cout << "]" << endl;
cout << hex << "[" << setw (6);
cout << setfill('*') << 192 << "]" << endl;
cout << setprecision(4) << 3.14159 << endl;
produce:
[***192]
[****c0]
3.142
La entrada de datos es mannipulada en una manera similar, usando la funcion cin y el operador de extraccion
>>, por ejemplo la sgte declaracion:
int i,j,k;
cin >> i >> j >> k;
Leera tres valores enteros de entrada estandar en i, j y k. El espacio en blanco es automaticamente usado
como separador y es ignorado, cuando se esta leyendo dentro de una variable string, la entrada es leida
palabra por palabra, donde las palabras son separadas por espacios en blanco, los espacios en blanco son
ignorados cuando se lee dentro de un caracter; esto puede ser anulado leyendo strings y/o lineas
explicitamente, asi: todos los typos estandars estan manipulados por cout son manejados por cin :
while (cin >> i)
cout << i;
cin automaticamente parte las entradas en palabras y termina en un EOF.
Entrada y Salida de/a Archivos
Entrada y salida a archivos de texto son manipuladas incluyendo la libreria fstream.h y luego declarando
variables del tipo ifstream y ofstream respectivamente; por ejemplo el siguiente programa lee desde un
archivo llamado xxx y escribe a un archivo llamado yyy..
#include <iostream.h>
41
#include <fstream.h>
void main()
{
char c;
ifstream infile("xxx");
ofstream outfile("yyy");
if (outfile && infile) // Seran 0 si algun error.
while (infile >> c)
outfile << c;
}
Las variables infile y outfile son pasadas a el archivo en la inicializacion, y son usadas solo cuando cin y cout
son usados., este código no funciona como lo esperábamos por supuesto, porque espacios, tabs y caracteres
`\0' al final de cada linea son ignorados como espacios en blanco cuando usamos << sobre un caracter, en ves
de eso podemos usar la función get como se muestra a continuación :
while (infile.get(c))
outfile << c;
o:
while (infile.get(c))
outfile.put(c);
Es tambien posible leer lineas completas llamando la funcon getline en la misma forma como usamos la
funcion get, para abrir un archivo o para agregarlo a otro, usamos lo siguiente:
ofstream("xxx", iosapp);
Notese de que no usamos la guncion close para la entrada y la salida, Un archivo automaticamente se cierra el
solo cuando la variable del archivo se sale del limete, pero si usted necesita explícitamente cerrar un archivo
usted puede usar :
outfile.close();
String I/O
La entrada de datos tambien puede ser leida desde strings en la memoriam y la salida puede ser enviada a
strings en la memoria duplicando la accion de sscanf y sprintf, para hacer esto usted debe incluir la libreria
strstream.h y luego declarar strings de salida y entrada
42
char s[100];
ostrstream outstring(s,100);
outstring << 3.14 << " es pi" << ends;
cout << s;
La string s es llenada con el texto 3.14 es pi. Si s es sobrellenada, outstring automaticamente se detendra de
ponerle valores a esta.
Si la string s existe y usted quiere leer de esta, usted puede usar una string de entrada como se muestra :
char *s = "3.14 12 cat";
istrstream instring(s, strlen(s));
float f;
int i;
char t[100];
instring >> f >> i >> t;
La libreria iostream tiene muchas otras capacidades que no han sido discutidas aqui.
DECLARACION DE VARIABLES
Las variables son declaradas en C++ igual que como en C.
Las Variables pueden ser declaradas en cualquier parte del codigo en C++, la variable empieza a existir desde
el momento en que es declarada, y termina de existir cuando el fin de el brazo } de el bloque actual es
alcanzado, por ejemplo en el siguiente codigo:
{
int i;
... codigo ...
int j;
... codigo ...
int k=func(i,j);
... codigo ...
}
Todas tres variables empiezan a existir cuando son declaradas y desaparecen al final del brazo que cierra el
43
bloque.
CONSTANTES
En C usted crea una constante usando el preprocesador de macros, ejemplo:
#define MAX 100
Cuando el programa es compilado, el preprocesador encuentra cada ocurrencia de la palabra max y reemplaza
esta con la string 100.
En cambio en C++ se usa la palabra const ejemplo:
const int MAX=100;
La porcion int MAX=100;es formatiada exactamente en la misma forma que una declaracion normal; la
palabra const en frente de esta simplemente define que la variable MAX no puede ser cambiada
subsecuentemente. El uso de mayusculas para la definicion de constantes es solo una tradicion en C.
SOBRECARGA DE FUNCIONES.
Una de las mas poderosas características nuevas del C++ es llamada "function overloading" (sobrecarga de
funciones). Una funcion sobrecargada tiene diferentes listas de parametros, el lenguaje distingue que funcion
llamar basandose en el tipo de listas del parametro. Aquí está una demostración sumamente simple del
proceso:
#include <iostream.h>
void func(int i)
{
cout << "function 1 called" << endl;
cout << "parameter = " << i << endl;
}
void func(char c)
{
cout << "function 2 called" << endl;
cout << "parameter = " << c << endl;
}
void func(char *s)
{
44
cout << "function 3 called" << endl;
cout << "parameter = " << s << endl;
}
void func(char *s, int i)
{
cout << "function 2 called" << endl;
cout << "parameter = " << s;
cout << ", parameter = " << i << endl;
}
main()
{
func(10);
func('B');
func("hello");
func("string", 4);
return 0;
}
Cuando este código es ejecutado, cada version de la funcion func es llamado basandose el encajamiento con
la lista de parametros. Esto es una capacidad muy util del C++, por ejemplo si usted crea una funcion que
inicializa un modulo, usted puede tener este para que llame diferentes codigos dependiendo del cualiesquiera
tipo esta siendo pasado, una string, un entero, un numero de pnt flotante y asi sucesivamente.
ARGUMENTOS POR DEFECTO
C++ tambien le permite a usted dar diferentes valores a los parametros, si el parametro no es pasado, el valor
de por defecto es usado, esta capacidad es demonstrada en el siguiente codigo.
#include <iostream.h>
void sample(char *s, int i=5)
{
cout << "parameter 1 = " << s << endl;
45
cout << "parameter 2 = " << i << endl;
}
main()
{
sample("test1");
sample("test1",10);
return 0;
}
El primer llamado de la funcion dara una salida del valor que por defecto es 5 para el parametro i, mientras el
segundo llamado dara de salida un 10.
Cuando se crean parametros de por defecto usted necesita evitar ambigüedad entre el parámetro estándar de
lista y otros parametros sobrecargados en las listas del parámetro.
ASIGNACION DE LA MEMORIA
C++ reemplaza la función de asignación de memoria del C, malloc ; y la función de removimiento free con
new y delete respectivamente. Y en el proceso estas se hacen mucho mas fáciles de usar. New y delete
permiten crear tipos de usuario y ser asignados tan facilmente como tipos ya existentes.
El siguiente codigo muestra el uso simple de new y delete.
int *p;
p = new int;
*p = 12;
cout << *p;
delete p;
Es también posible asignar bloques constados de filas de longitud variante usando una técnica similar. Note el
uso de delete[ ] para borrar la fila.
int *p;
p = new int[100];
p[10] = 12;
cout << p[10];
delete [] p;
46
El valor 100 pude ser una variable si se desea.
Cuando se trabaja con tipos definidos por el usuario, new trabaja de la misma forma:
typedef node
{
int data;
node *next;
} node;
main()
{
node *p;
p=new node;
p−>date = 10;
delete p;
}
DECLARACIONES DE LA REFERENCIA
En C, los apuntadores son frecuentemente usados para pasar parametros a las funciones. Por ejemplo la
siguiente función swap intercambia los dos valores pasados:
void swap(int *i, int *j)
{
int t = *i;
*i = *j;
*j = t;
}
main()
{
int a=10, b=5;
swap(& a, & b);
47
cout << a << b << endl;
}
C++ provee un operador de referencia para limpiar y acortar la sintaxix un poco:
void swap(int& i, int& j)
{
int t = i;
i = j;
j = t;
}
main()
{
int a=10, b=5;
swap(a, b);
cout << a << b << endl;
}
Los parametros i y j declarados como el tipo int& actuan como referencia a los enteros pasados.
VOCABULARIO DEL C++
Mire el mundo alrededor suyo. Puede entender un pedazo bueno acerca de la estructura, vocabulario, y
organización de C++ mirando la estructura y organización del mundo real tan satisfactorio como el
vocabulario que usamos para hablar acerca de él. La jerarquía se extiende hacia ambos sentidos, hacia el
general y el más específico. Ejemplo un solo libro en particular. En la POO, tiene un "ejemplo" de la clase
"libro." Los libros tienen atributos seguros que son compartidos por todos los libros: Tienen una tapa, varios
capítulos, publicidad, y así sucesivamente.
El rasgo más importante que diferencia C++ de C es esta idea de una "clase," ambos a un nivel sintáctico y
conceptual.
Las clases permiten que usted use todas las caracteristicas de la programacion orientada a objetos en sus
programas C++: encapsulacion, herencia, y poliformismo. También son el armazón en otros rasgos, tal como
"sobrecarga de operador" (la habilidad de redefinir operadores tal como "+" y ">" para datos recientemente
creados), son construidos.
LA EVOLUCION DE CLASES
Dada la cantidad de poder conceptual se encarnó en el concepto de la clase, interesa notar que la sintaxis
48
queda justamente sincera. Una clase es simplemente una extensión de una estructura C. Básicamente una clase
le permite a usted crear una estructura, y entonces permanentemente enlazar todas esas funciones relacionadas
a esa estructura. Este proceso es conocido como encapsulacion. Es un concepto muy simple, pero es el
corazón de la programacion orientada a objetos: datos + funciones = objeto. Las clases tambien pueden ser
construidas sobre otras clases usando la herencia. Bajo la herencia, una nueva clase se extiende como clase de
base. Finalmente, nuevas clases pueden modificar la conducta de sus clases origen, una capacidad conocida
como poliformismo.
Uno de los mejores formas para entender las clases y su importancia para uno como programador es entender
como y porque ellas estan involucradas. Las raices del concepto de clase estan el el topico conocido como:
Abstracción de datos.
C++ Y ABSTRACCION DE DATOS
Los lenguajes orientados a objetos como C++ ofrecen faciles y extensas formas de implementar la abstraccion
de datos, todo lo que usted tiene que hacer es modificar su forma de pensar para pensar acerca de los
problemas en una forma abstracta, primero que todo usted tiene que pensar en terminos de tipos de datos; la
otra tecnica escencial es pensar en forma generica especifica.
OPERADORES EN C++
Casi cada operador en C++ se puede cargar excesivamente o sobrecargar:
+−*/%^&|
~ ! , = < > <= >=
++ −− << >> == != && ||
+= −= /= %= ^= & = |= *=
<<= >>= [ ] ( ) −> −>* new delete
muchos de estos nunca son vistos, y mucho menos sobrecargados, pero sobrecargando los operadores mas
comunes como + y == usted puede hacer una clase mucho mas facil de usar.
FUNCIONES POR DEFECTO.
Cuando usted quiera crear una clase nueva, cuatro funciones por defecto son creadas automaticamente, a
menos de que usted anule estas creando sus propias, estas son :
• el constructor por defecto
• la copia del constructor por defecto
• la asignacion del operador por defecto
• el destructor por defecto.
El constructor por defecto es invocado cuando usted declara una instancia de clase y pasa esta sin parametros,
por ejemplo si usted crea una clase de ejmplo y usted no le crea constructores a esta, entonces otroas
declaraciones invocan el constructor por defecto. El destructor por defecto es llamado cuando una variable se
sale de su alcance, y entonces el operador asignado por defecto es llamado cuabndo una asignacion normal
ocurre, usted puede impedir algunas de las funciones por defecto creando sus funciones propias, por ejemplo
si usted crea algun constructor, entonces el constructor por defecto no es creado.
49
QUE ES LA ENCAPSULACION ?
Es prevenir el acceso no autorizado a alguna pieza de informacion o funcionalidad. LA encapsulación pone
una barrera de fuego alrededor de un pedazo de codigo, que previene otros pedazos de codigo acceder las
partes volatiles de este, otros pedazos de codigo pueden acceder unicamente las partes estables. En contexto
de software Orientado a Objetos un pedazo de codigo es normalmente una clase o un grupo de clases.
QUE ES UN FRIEND ?
Es algo que le permite a tu clase tener acceso a otra clase o funcion.
Los Friends pueden ser funciones o otras clases. Una clase le da los privilegios de acceso a sus friends. Los
friends no violan la encapsulación si estos son usados propiamente, estos actualmente mejoran la
encapsulación.
Las ventajas y desventajas de usar funciones friends son que estas proveen un grado de libertad en las
opciones del diseño de la interface. Las funciones member y las friend estan igualmente privilegiadas, la
mayor diferencia es que una funcion friend es llamada como f(x), mientras que la funcion member es lamada
x.f(). Mas la habilidad de escoger entre funciones member (x.f( )) y las friend (f(x)) le permiten al diseñador
seleccionar la sintaxis mas legible, que rebaja los costos de mantenimiento. La mayor desventaja de las
funciones friend es que estas requieren una kinea extra de codigo cuando usted quiere hacer un enlace
dinamico.
ES LA HERENCIA IMPORTANTE PARA EL C++
Si.
La herencia es lo que separa la programacion de tipos de datos abstractos, de la programacion orientada a
objetos.
50
Descargar