Story Transcript
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 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 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 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 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 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 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 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 #include 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 41
#include 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 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 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