jueves, 2 de mayo de 2019

prioridad de operadores, evaluacion de expreciones

4.5 Prioridad de operadores, evaluación de expresiones.

Determina el orden en que habrán de realizarse las operaciones en una expresión determinada. Para obtener la prioridad se deben conocer las siguientes reglas:

Las operaciones que están encerradas entre paréntesis se evalúan primero. Si existen diferentes paréntesis anidados (interiores unos a otros), las expresiones más internas se evalúan primero.
En caso de coincidir varios operadores de igual prioridad en una expresión o subexpresión encerrada entre paréntesis, el orden de prioridad en este caso es de izquierda a derecha.

Cuando se desea realizar una operación con baja prioridad por adelantado, debe agruparse a los operandos involucrados.

Los paréntesis tienen prioridad sobre el resto de las operaciones.
Determina el orden en que habrán de realizarse las operaciones en una expresión determinada.

Para obtener la prioridad se deben conocer las siguientes reglas:

Las operaciones que están encerradas entre paréntesis se evalúan primero. Si existen diferentes paréntesis anidados (interiores unos a otros), las expresiones más internas se evalúan primero.

En caso de coincidir varios operadores de igual prioridad en una expresión o subexpresión encerrada entre paréntesis, el orden de prioridad en este caso es de izquierda a derecha.

Cuando se desea realizar una operación con baja prioridad por adelantado, debe agruparse a los operandos involucrados.

Los paréntesis tienen prioridad sobre el resto de las operaciones.
.
.
.
.
+

operadores, operandos y expreciones

4.4.- Operadores, Operandos y Expresiones

*Operando:
Referente a la parte de la instrucción de lenguaje máquina de la computadora que designa la dirección de los datos con los que se debe operar.

*Expresion:
Una expresión es una secuencia de operadores y operandos que describe un cálculo. Normalmente una expresión se evalúa en tiempo de ejecución.


*OPERADORES:


operadores: un operador es el símbolo que determina el tipo de operación o relación que habrá que establecerse entre los operandos de una expresión para alcanzar un resultado.
Los operadores se clasifican en tres grupos:
  1. Aritméticos
  2. Relacionales
  3. Lógicos
1.-Operadores aritméticos: son aquellos que permiten la realización de cálculos aritméticos. Utilizan operandos numéricos y proporcionan resultados numéricos.

operadores aritmeticos
+ ------- suma
-------resta
* -------Multiplicación
/ -------División real
Div -----División entera
Mod ----Residuo
^ -------Exponenciación

Ejemplos:

7+3 = 10
7-3 = 4
20 Mod 3 = 2
10/4 = 2.5
2^3 = 8

en la expresión 7+3, los valores 7 y 3 se denominan operandos, que son los valores que se evaluan o relacionan. El valor de la expresión 7 + 3 se conoce como resultado de la expresión , que es el producto de la relacion entre los operandos condicionados por el operador.


*Operadores Relacionales: 

Los operadores relacionales, también denominados operadores binarios lógicos y de comparación, se utilizan para comprobar la veracidad o falsedad de determinadas propuestas de relación (en realidad se trata respuestas a preguntas). Las expresiones que los contienen se denominan expresiones relacionales. Aceptan diversos tipos de argumentos, y el resultado, que es la respuesta a la pregunta, es siempre del tipo cierto/falso, es decir, producen un resultado booleano.
Tabla: Operadores relacionales.
Operador
Acción
>
Mayor que
>=
Mayor o igual que
<
Menor que
<=
Menor o igual que
=
Igual
<>
Distinto
Si la propuesta es cierta, el resultado es true (un valor distinto de cero), si es falsa false (cero).
Ejemplos:
Si a = 10, b = 20, c = 30
a + b > c

Falso
a - b <>

Verdadero
a - b = c

Falso
a * b < > c

Verdadero

*Operadores lógicos
son aquellos que permiten la combinacion de condiciones para formar una sola expresion lógica. Utilizan operandos lógicos y proporcionan resultados lógicos también.

Operadores
not -------------negación (no)
and -------------conjunción (y)
or --------------disyunción (o)
xor -------------disyunción exclusiva (o/solo)

Se obtiene verdadero si:
NOT-----el operando el falso
AND-----ambos operandos son verdaderos
OR------Al menos un operando es verdadero
XOR----solo uno de los operandos es verdadero.

ejemplos: (5+3 and 4-2) > 1 , (5 or 6) < 50
Resultado de imagen para operadores, operandos y expresionesResultado de imagen para operadores, operandos y expresiones

proposicion de asignacion

Resultado de imagen para proposicion de asignacion
{ sentencia 1 ; sentencia 2 ; ............. sentencia n ; }


Este conjunto se comportará sintacticamente como una sentencia simple y la llave de cierre del bloque NO debe ir seguida de punto y coma .
Un ejemplo de bloque ya visto , es el cuerpo del programa principal de la función main() .main() { bloque de sentencias }


En las proposiciones de control de flujo de programa , trabajaremos alternativamente con sentencias simples y bloques de ellas .

2. PROPOSICION IF - ELSE

Esta proposición sirve para ejecutar ciertas sentencias de programa , si una expresión resulta CIERTA ú otro grupo de sentencias, si aquella resulta FALSA. Su interpretación literal sería : SI es CIERTA tal cosa , haga tal otra , si no lo es salteéla .

El caso más sencillo sería :if(expresión) sentencia ; ó if(expresión) sentencia ;


Cuando la sentencia que sigue al IF es única, las dos formas de escritura expresadas arriba son equivalentes . La sentencia sólo se ejecutará si el resultado de "expresión" es distinto de cero (CIERTO) , en caso contrario el programa salteará dicha sentencia , realizando la siguiente en su flujo.


Veamos unos ejemplos de las distintas formas que puede adoptar la "expresión" dentro de un IF :


if( a > b ) if( (a > b) != 0 ) las dos expresiones son idénticas, aunque a veces resulta más claro expresarla de la segunda manera, sobre todo en los primeros contactos con el lenguaje.
if(a) if(a != 0)
if(!a) if(a == 0 ) Las dos superiores son idénticas entre sí , al igual que las dos inferiores Obsérvese que (!a) dará un valor CIERTO sólo cuando a sea FALSO. (ver operador NEGACION en el capítulo anterior )
if( a == b )
if( a = b ) /* Error */ La primera es una expresión correcta , el IF se realizará sólo si a es igual a b. En cambio la segunda es un error , ya que no se está comparando a con b , sino ASIGNANDO el valor de esta a aquella . Sin embargo, a veces puede usarse como un truco (un poco sucio) de programacion , ya que primero se realiza la asignación y luego se evalúa el resultado de esta para realizar el IF , es entonces equivalente a escribir :
a = b ;
if(a) .................... con el ahorro de una linea de programa ( a costa de la legibilidad del mismo ).




En casos más complejos que los anteriores , la proposición IF puede estar seguida por un bloque de sentencias :if(expresión) if(expresión) { { sentencia 1 ; sentencia 1 ; sentencia 2 ; sentencia 2 ; ............... ............. } }


Las dos maneras son equivalentes , por lo que la posición de la llave de apertura del bloque queda librada al gusto del programador . El indentado de las sentencias (sangría) es también optativo , pero sumamente recomendable ,sobre todo para permitir la lectura de proposiciones muy complejas ó anidadas , como se verá luego. El bloque se ejecutará en su conjunto si la expresion resulta CIERTA. El uso del ELSE es optativo , y su aplicación resulta en la ejecución de una , ó una serie de sentencias en el caso de que la expresión del IF resulta FALSA.



Su aplicación puede verse en el ejemplo siguiente : if(expresión) if(expresión) { { sentencia 1 ; sentencia 1 ; sentencia 2 ; sentencia 2 ; } } sentencia 3 ; else sentencia 4 ; { sentencia 5 ; sentencia 3 ; sentencia 4 ; } sentencia 5 ;


En el ejemplo de la izquierda no se usa el ELSE y por lo tanto las sentencias 3 , 4 y 5 se ejecutan siempre . En el segundo caso , las sentencias 1 y 2 se ejecutan solo si la expresión es CIERTA , en ese caso las 3 y 4 NO se ejecutarán para saltarse directamente a la 5 , en el caso de que la expresión resulte FALSA se realizarán las 3 y 4 en lugar de las dos primeras y finalmente la 5 .
La proposición ELSE queda siempre asociada al IF más cercano , arriba de él .
Es común también , en caso de decisiones múltiples , el uso de anidamientos ELSE-IF de la forma indicada abajo:if(exp.1) if(exp.1) sentencia1 ; sentencia1 ; else if(exp.2) else if(exp.2) sentencia2 ; sentencia2 ; else if(exp.3) else if(exp.3) sentencia3 ; sentencia3 ; else else sentencia5 ; sentencia5 ;


Si bién se suele escribir según la modalidad de la izquierda , a la derecha hemos expresado las asociaciones entre los distintos ELSE é IF por medio del indentado del texto.



3. PROPOSICION SWITCH
El SWITCH es una forma sencilla de evitar largos , tediosos y confusos anidamientos de ELSE-IF .
Supongamos que estamos implementando un Menu , con varias elecciones posibles . El esqueleto de una posible solución al problema usando if-else podría ser el siguiente :
#include <<stdio.h>> main() { int c ; printf("\nMENU :") ; printf("\n A = ADICIONAR A LA LISTA ") ; printf("\n B = BORRAR DE LA LISTA ") ; printf("\n O = ORDENAR LA LISTA ") ; printf("\n I = IMPRIMIR LA LISTA ") ; printf("\n\nESCRIBA SU SELECCION , Y LUEGO <<ENTER>> : ") ; if( (c = getchar()) != '\n' ) { if( c == 'A') printf("\nUD. SELECCIONO AGREGAR") ; else if( c == 'B') printf("\nUD. SELECCIONO BORRAR") ; else if( c == 'O' ) printf("\nUD. SELECCIONO ORDENAR") ; else if( c == 'I' ) printf("\nUD. SELECCIONO IMPRIMIR") ; else printf("\n\a\aUD. APRETO UN CARACTER ILEGAL" ) ; } else printf("\n¡ UD. NO HA SELECCIONADO NADA !" ) ; }


Como es fácil de ver , cuando las opciones son muchas, el texto comienza a hacerse difícil de entender y engorroso de escribir.
El mismo programa, utilizando un SWITCH , quedaría mucho más claro de leer, y sencillo de escribir, como se aprecia en el EJEMPLO siguiente.
#include <stdio.h> #include <conio.h> main()
{ int c ; printf("\nMENU :") ; printf("\n A = ADICIONAR A LA LISTA ") ; printf("\n B = BORRAR DE LA LISTA ") ; printf("\n O = ORDENAR LA LISTA ") ; printf("\n I = IMPRIMIR LA LISTA ") ; printf("\n\nESCRIBA SU SELECCION , Y LUEGO <<ENTER>> : ") ; c = getchar() ; switch (c) { case 'A' : printf("\nUD. SELECCIONO AGREGAR") ; break ; case 'B' : printf("\nUD. SELECCIONO BORRAR") ; break ; case 'O' : printf("\nUD. SELECCIONO ORDENAR") ; break ; case 'I' : printf("\nUD. SELECCIONO IMPRIMIR") ; break ; case '\n': printf("\n¡ UD. NO HA SELECCIONADO NADA !" ) ; break ; default : printf("\n\a\aUD. APRETO UN CARACTER ILEGAL" ) ; break ; } }


El SWITCH empieza con la sentencia : switch (expresión) . La expresión contenida por los paréntesis debe ser ENTERA , en nuestro caso un caracter ; luego mediante una llave abre el bloque de las sentencias de comparación . Cada una de ellas se representa por la palabra clave "case" seguida por el valor de comparación y terminada por dos puntos . Seguidamente se ubican las sentencias que se quieren ejecutar , en el caso que la comparación resulte CIERTA . En el caso de resultar FALSA , se realizará la siguiente comparación , y así sucesivamente .
Prestemos atención tambien a la sentencia BREAK con la que se termina cada CASE. Una característica poco obvia del SWITCH , es que si se eliminan los BREAK del programa anterior , al resultar CIERTA una sentencia de comparación, se ejecutarán las sentencias de ese CASE particular pero TAMBIEN la de todos los CASE por debajo del que ha resultado verdadero. Quizás se aclare esto diciendo que , las sentencias propias de un CASE se ejecutarán si su comparación ú otra comparación ANTERIOR resulta CIERTA . La razón para este poco "juicioso" comportamiento del SWITCH es que así se permite que varias comparaciones compartan las mismas sentencias de programa , por ejemplo : ................. case 'X' : case 'Y' : case 'Z' : printf(" UD. ESCRIBIO X , Y , ó Z ") ; break ; ..................


La forma de interrumpir la ejecución luego de haber encontrado un CASE cierto es por medio del BREAK , el que dá por terminado el SWITCH .
Al final del bloque de sentencias del SWITCH , aparece una optativa llamada DEFAULT , que implica : si no se ha cumplido ningun CASE , ejecute lo que sigue. Es algo superfluo poner el BREAK en este caso , ya que no hay más sentencias despues del DEFAULT , sin embargo , como el orden en que aparecen las comparaciones no tiene importancia para la ejecución de la instrucción, puede suceder que en futuras correcciones del programa se agregue algún nuevo CASE luego del DEFAULT , por lo que es conveniente preveerlo , agregando el BREAK , para evitar errores de laboriosa ubicación .
Más adelante volveremos sobre otros usos del BREAK.


4. LA ITERACION WHILE
El WHILE es una de las tres iteraciones posibles en C . Su sintaxis podría expresarse de la siguiente forma : while(expresion) ó while(expresión) { proposición 1 ; proposición 1 ; proposición 2 ; ............... proposición n ; }


Esta sintaxis expresada en palabras significaria: mientras (expresión) dé un resultado CIERTO ejecútese la proposición 1 , en el caso de la izquierda ó ejecútese el bloque de sentencias , en el caso de la derecha.
Por lo general , dentro de la proposición ó del bloque de ellas , se modifican términos de la expresión condicional , para controlar la duración de la iteración .

5. LA ITERACION DO - WHILE
Su sintaxis será :do { proposición 1 ; proposición 2 ; ............... } while (expresión) ;


Expresado en palabras , esto significa : ejecute las proposiciones , luego repita la ejecución mientras la expresión dé un resultado CIERTO . La diferencia fundamental entre esta iteración y la anterior es que el DO-WHILE se ejecuta siempre AL MENOS una vez , sea cual sea el resultado de expresión.

6. ITERACION FOR
El FOR es simplemente una manera abreviada de expresar un WHILE , veamos su sintaxis :for ( expresión1 ; expresión2 ; expresion3 ) { proposición1 ; proposición2 ; .............. } Esto es equivalente a : expresión1 ; while ( expresión2 ) { proposición1 ; proposición2 ; .............. expresion3 ; }


La expresión1 es una asignación de una ó más variables , (equivale a una inicialización de las mismas ) , la expresión2 es una relación de algun tipo que , mientras dé un valor CIERTO , permite la iteración de la ejecución y expresión3 es otra asignación , que comunmente varía alguna de las variables contenida en expresión2 .
Todas estas expresiones , contenidas en el paréntesis del FOR deben estar separadas por PUNTO Y COMA y NO por comas simples .
No es imprescindible que existan TODAS las expresiones dentro del paréntesis del FOR , pudiendose dejar en blanco algunas de ellas , por ejemplo :for ( ; exp2 ; exp3) ó for (exp1 ; ; ) ó for ( ; ; )




Estas dos últimas expresiónes son interesantes desde el punto de vista de su falta de término relacional , lo que implica que el programador deberá haber previsto alguna manera alternativa de salir del lazo ( probablemente mediante BREAK ó RETURN como veremos más adelante ) ya que sinó , la ejecución del mismo es infinita ( ó tan larga como se mantenga encendida la computadora ) .


7. LA SENTENCIA BREAK
El BREAK , ya brevemente descripto con el SWITCH , sirve también para terminar loops producidos por WHILE , DO-WHILE y FOR antes que se cumpla la condición normal de terminación . En el EJEMPLO siguiente vemos su uso para terminar un WHILE indeterminado.#include <stdio.h> #include <conio.h> main() { char c ; printf("ESTE ES UN LOOP INDEFINIDO ") ; while(1) { printf( "DENTRO DEL LOOP INDEFINIDO (apriete una tecla):" ) ; if( (c = getch()) == 'Q' ) break ; printf( "\nNO FUE LA TECLA CORRECTA PARA ABANDONAR EL LOOP ") ; } printf("\nTECLA CORRECTA : FIN DEL WHILE ") ; }


Obsérvese que la expresión while(1) SIEMPRE es cierta , por lo que el programa correrá imparable hasta que el operador oprima la tecla "secreta" Q . Esto se consigue en el IF , ya que cuando c es igual al ASCII Q se ejecuta la instrucción BREAK ,dando por finalizado el WHILE .
El mismo criterio podría aplicarse con el DO-WHILE ó con FOR , por ejemplo haciendo for (;;) { /* loop indefinido */ ............ if( expresión ) break ; /* ruptura del loop cuando expresión sea verdadera */ }


8. LA SENTENCIA CONTINUE
La sentencia CONTINUE es similar al BREAK con la diferencia que en vez de terminar violentamente un loop , termina con la realización de una iteración particular y permitiendo al programa continuar con la siguiente.

9. LA FUNCION EXIT()
La función EXIT() tiene una operatoria mucho más drastica que las anteriores , en vez de saltear una iteración ó abandonar un lazo de programa , esta abandona directamente al programa mismo dándolo por terminado . Realiza también una serie de operaciones útiles como ser , el cerrado de cualquier archivo que el programa hubiera abierto , el vaciado de los buffers de salida , etc.
Normalmente se la utiliza para abortar los programas en caso de que se esté por cometer un error fatal é inevitable . Mediante el valor que se le ponga en su argumento se le puede informar a quien haya llamado al programa ( Sistema Operativo , archivo .bat , u otro programa ) el tipo de error que se cometió.

10 SENTENCIA GOTO
Si Ud. se ha admirado de que C tenga la operación GOTO , recuerde que el hecho de existir NO lo obliga a usarla , en el mismo sentido que por tener puertas los aviones no está obligado a saltar por ellas en pleno vuelo.
El uso del GOTO implica un salto incondicional de un lugar a otro del programa . Esta práctica hace que los programas sean muy dificiles de corregir ó mantener.
Si no quedara más remedio que usarlo, (y en programación estructurada SIEMPRE hay remedio) debe marcarse el destino del salto mediante un nombre seguido por dos puntos .if( c == 0 ) goto OTRO_LADO ; ............................. OTRO_LADO: printf(........


En este caso si c es cero se saltean todas las sentencias entre el if y el destino , continuandose con la ejecución del printf() . El destino puede ser tanto posterior como anterior al GOTO invocante .

almacenamiento, direccionamiento y representacion en memoria



4.3.4.- Almacenamiento, direccionamiento y representación en memoria.



Almacenamiento
La computadora posee determinada cantidad de almacenamiento interno denominado memoria principal, memoria RAM o memoria volátil. Esta memoria se activa al encender la computadora y se desactiva al apagarla. Para que un programa se ejecute, debe cargarse en la memoria principal, así como los datos necesarios. Como es más costosa, es un recurso escaso donde sólo se almacenan los datos que se requieren de inmediato, y los demás se relegan a los dispositivos de almacenamiento externo, donde la capacidad de almacenamiento es mayor, pero también el tiempo de recuperación. Por otra parte, el costo del almacenamiento externo es más bajo.
Direccionamiento
La memoria principal de la computadora se divide en pequeñas unidades de tamaño uniforme denominadas palabras, que tienen una dirección única.
Cada una de éstas palabras es capaz de almacenar una unidad de información (como, por ejemplo, resultados numéricos), y determina el número más grande y el más pequeño que puede almacenar.
El tamaño de la palabra depende de la computadora, pero siempre se especifica en múltiplos de 8 bits. Así, existen computadoras con tamaños de palabra de 8, 16, 32 y 64 bits.
Cada palabra de la memoria principal tiene una dirección fija que va de cero hasta el número total de palabras - 1. Las direcciones de memoria sirven para identificar cada palabra individualmente, de tal manera que pueda accederse al dato contenido en ella. A fin de simplificar su comprensión, las memorias se consideran como una hilera de palabras.
Por ejemplo, suponiendo que la memoria principal de una computadora tiene un tamaño de palabra de 8 bits, la cinta de color amarillo que se muestra enseguida podría representar las tres primeras palabras:



Dirección
P a l a b r a
Valor en decimal
0000
0
1
0
0
1
0
1
1
75
0001
0
1
0
0
0
0
0
1
65
0002
0
0
1
1
0
0
1
0
50
Representación en memoria
La representación en memoria de los caracteres no reviste mayor complicación, debido a que los códigos utilizados, como el ASCII (American Standard Code for Information Interchange), les asignan valores enteros positivos.
En el caso de los datos numéricos hay que considerar la distinción entre números negativos y positivos, y la que hay entre números de punto flotante y enteros.
Los signos se manejan normalmente mediante el bit más significativo de la palabra (el situado a la extrema izquierda), y se le denomina bit de signo. Cuando el bit de signo almacena un cero, el número se considera positivo; cuando almacena un uno el número es negativo. Es por esto que, si el tamaño de la palabra es de m bits, quedan m-1 bits para representar la magnitud del número almacenado.
Los números de punto flotante se manejan en formato logarítmico, con un número fijo de bits para la base y otro para la mantisa. El estándar para los números de punto flotante lo fija el IEEE.
Debido al formato logarítmico, los cálculos que se hacen con tipos de punto flotante no son tan precisos como los que se hacen con tipos enteros.
Resultado de imagen para almacenamiento, direccionamiento y representacion en memoria

identificadores

Identificadores en lenguajes informáticos

Resultado de imagen para identificadores
En los lenguajes informáticos, los identificadores son elementos textuales (también llamados símbolos) que nombran entidades del lenguaje. Algunas de las de entidades que un identificador puede denotar son las variables, las constantes, los tipos de dato, las etiquetas, las subrutinas (procedimientos y funciones) y los paquetes.
En muchos lenguajes algunas secuencias tienen la forma léxica de un identificador pero son conocidos como palabras clave (o palabras reservadas). Lo habitual es que si un identificador se corresponde con una palabra clave o reservada, éste ya no pueda utilizarse para referirse a otro tipo de entidades como variables o constantes (en unos pocos lenguajes, como PL/1, esta distinción no está del todo clara).
Los lenguajes informáticos normalmente ponen restricciones en qué caracteres pueden aparecer en un identificador. Por ejemplo, en las primeras versiones de C y C++, los identificadores están restringidos para que sean una secuencia de una o más letras ASCII, dígitos numéricos (que en ningún caso deben aparecer como primer carácter) y barras bajas. Las versiones posteriores de estos lenguajes, así como otros muchos más lenguajes modernos soportan casi todos los caracteres Unicode en un identificador. Una restricción común es que no está permitido el uso de espacios en blanco ni operadores del lenguaje.
En lenguajes de programación compilados, los identificadores generalmente son entidades en tiempo de compilación, es decir, en tiempo de ejecución el programa compilado contiene referencias a direcciones de memoria y offsets más que identificadores textuales (estas direcciones de memoria u offsets, han sido asignadas por el compilador a cada identificador).
En lenguajes interpretados los identificadores están frecuentemente en tiempo de ejecución, a veces incluso como objetos de primera clase que pueden ser manipulados y evaluados libremente. En Lisp, éstos se llaman símbolos.
Los compiladores e intérpretes normalmente no asignan ningún significado semántico a un identificador basado en la secuencia de caracteres actual. Sin embargo, hay excepciones. Por ejemplo:
  • En Perl una variable se indica utilizando un prefijo llamado sigil, que especifica aspectos de cómo se interpreta la variable en las expresiones.
  • En Ruby una variable se considera automáticamente como inmutable si su identificador empieza con una letra mayúscula.
  • En Fortran, la primera letra de una variable indica si por defecto es creada como entero o como flotante.

Identificadores C++

Los identificadores C++ pueden contener las letras a a z y A a Z, el guión bajo "_" ("Underscore") y los dígitos 0 a 9.

Caracteres permitidos

a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

Dígitos permitidos

0 1 2 3 4 5 6 7 8 9
Solo hay dos restricciones en cuanto a la composición:
  • El primer carácter debe ser una letra o el guión bajo. El Estándar establece que los identificadores comenzando con guión bajo y mayúscula no deben ser utilizados. Este tipo de nombres se reserva para los compiladores y las Librerías Estándar. Tampoco se permite la utilización de nombres que contengan dos guiones bajos seguidos.
  • El estándar ANSI establece que como mínimo serán significativos los 31 primeros caracteres, aunque pueden ser más, según la implementación. Es decir, para que un compilador se adhiera al estándar ANSI, debe considerar como significativos, al menos, los 31 primeros caracteres.
Los identificadores distinguen mayúsculas y minúsculas, así que Sum, sum y suM son distintos para el compilador. Sin embargo, C++Builderofrece la opción de suspender la sensibilidad a mayúsculas / minúsculas, lo que permite la compatibilidad con lenguajes insensibles a esta cuestión, en este caso, las variables globales Sum, sum y suM serían consideradas idénticas, aunque podría resultar un mensaje de aviso "Duplicate symbol" durante el enlazado.
Con los identificadores del tipo pascal hay una excepción a esta regla, ya que son convertidos siempre a mayúsculas con vistas al enlazado.
Los identificadores globales importados desde otros módulos siguen las mismas reglas que los identificadores normales.
Aunque los nombres de los identificadores pueden ser arbitrarios (dentro de las reglas señaladas), se produce un error si se utiliza el mismo identificador dentro del mismo ámbito compartiendo el mismo espacio de nombres. Los nombres duplicados son legales en diferentes espacios de nombres con independencia de las reglas de ámbito.
Un identificador no puede coincidir con una palabra clave o con el de ninguna función de biblioteca.

Tipos de identificadores

El estándar ANSI distingue dos tipos de identificadores:
  • Identificadores internos; los nombres de macros de preprocesado y todas las que no tengan enlazado externo. El estándar establece que serán significativos, al menos, los primeros 31 caracteres.
  • Identificadores externos; los que corresponden a elementos que tengan enlazado externo. En este caso el estándar es más permisivo. Se acepta que el compilador identifique solo seis caracteres significativos y pueda ignorar la distinción mayúsculas/minúsculas

Reglas de estilo

Es bastante frecuente que en la enseñanza de C++ (y de cualquier otro lenguaje de programación) no se subraye suficientemente la importancia de la elección de los identificadores. En este sentido, los textos se suelen limitar a señalar las reglas formales que impone el lenguaje para la declaración de nombres. Sin embargo, como todos los que tienen que ver con la legibilidad del código, el asunto es de capital importancia. Sobre todo, si se trata de algo más que del consabido programita "Hola mundo", y desde luego resulta crítico en proyectos medianamente grandes en los que puedan trabajar más de un programador y/o deba ser mantenido por personas distintas de su creador original (lo que antes o después acaba ocurriendo en la informática empresarial).
C y C++ tienen sus propias reglas no escritas, sancionadas por la costumbre, en cuanto a ciertas formas concretas de usar los identificadores. Por ejemplo: Es costumbre utilizar minúsculas para los nombres de variables y funciones (con frecuencia se utilizan combinaciones minúsculas/Mayúsculas - por ejemplo getRvalue o rColor-, aunque la inicial suele ser minúscula). Los identificadores de variables automáticas lo más cortos posibles; los de estáticas y globales más largos y descriptivos. Los nombres de constantes simbólicas normalmente en mayúsculas.
Ejemplo:
void someFunc (int numero, char clave, int* puntero_a_clase); //
static tipoCliente = 0; //
enum formaPago { CONTADO, CREDITO }; //
...
someFunc(int n, char k, int *ptr) { //
int z, y, z = 2; //
}
Aparte de las manías o hábitos particulares que pueda tener cada programador, la mayoría de empresas de software medianamente serias disponen de sus propios "Manuales de estilo" o "Reglas de uso", en los que se recogen las convenciones que deben utilizarse para los identificadores, de forma que se mantenga la máxima homogeneidad posible en el código, lo que a la postre redunda en una mayor legibilidad y facilidad de mantenimiento. En este sentido cabría señalar que, dentro de ciertos límites, no es tan importante cuales sean estas reglas, sino que existan y se respeten.
En determinados entornos existen reglas consagradas por el uso. Por ejemplo, en la programación C/C++ para las plataformas Windowssuelen seguirse determinadas convenciones conocidas como Notación Húngara, en la que el identificador de cada variable comienza con una o varias letras (minúsculas) que señalan el tipo de la variable. Por ejemplo, nValor.
Los nombres de clases se preceden siempre con una "C" mayúscula, y la siguiente letra también es mayúscula. Por ejemplo: CAboutDlg, CAprenderApp, CMainFrame, etc. Los nombres de variables comienzan por letras fijas según su tipo, pero cuando se refieren a una propiedad de clase, los dos primeros caracteres son "m_" (ejemplo m_nValor, m_wndStatusBar, etc). Los nombres de funciones miembro de clase comienzan siempre con mayúscula, pero la siguiente letra es minúscula. Por ejemplo: DoDataExchange(), InitInstance(), OnAppAbout(), etc.
Este tipo de notación presenta la ventaja de con un poco de práctica es mucha la información que puede extraerse de la simple lectura del código.

tipos de datos

Tipos de datos

Resultado de imagen para tipos de datos
Un tipo de datos es la propiedad de un valor que determina su dominio (qué valores puede tomar), qué operaciones se le pueden aplicar y cómo es representado internamente por el computador.
Todos los valores que aparecen en un programa tienen un tipo.
A continuación revisaremos los tipos de datos elementales de Python. Además de éstos, existen muchos otros, y más adelante aprenderemos a crear nuestros propios tipos de datos.

Números enteros

El tipo int (del inglés integer, que significa «entero») permite representar números enteros.
Los valores que puede tomar un int son todos los números enteros: ... -3-2-10123, ...
Los números enteros literales se escriben con un signo opcional seguido por una secuencia de dígitos:
1570
+4591
-12

Números reales

El tipo float permite representar números reales.
El nombre float viene del término punto flotante, que es la manera en que el computador representa internamente los números reales.
Hay que tener mucho cuidado, porque los números reales no se pueden representar de manera exacta en un computador. Por ejemplo, el número decimal 0.7 es representado internamente por el computador mediante la aproximación 0.69999999999999996. Todas las operaciones entre valores float son aproximaciones. Esto puede conducir a resultados algo sorpresivos:
>>> 1/7 + 1/7 + 1/7 + 1/7 + 1/7 + 1/7 + 1/7
0.9999999999999998
Los números reales literales se escriben separando la parte entera de la decimal con un punto. Las partes entera y decimal pueden ser omitidas si alguna de ellas es cero:
>>> 881.9843000
881.9843
>>> -3.14159
-3.14159
>>> 1024.
1024.0
>>> .22
0.22
Otra representación es la notación científica, en la que se escribe un factor y una potencia de diez separados por una letra e. Por ejemplo:
>>> -2.45E4
-24500.0
>>> 7e-2
0.07
>>> 6.02e23
6.02e+23
>>> 9.1094E-31
9.1094e-31
Los dos últimos valores del ejemplo son iguales, respectivamente, a 6.02×1023 (la constante de Avogadro) y 9.1094×1031 (la masa del electrón).

Números complejos

El tipo complex permite representar números complejos.
Los números complejos tienen una parte real y una imaginaria. La parte imaginaria es denotada agregando una j inmediatamente después de su valor:
3 + 9j
-1.4 + 2.7j

Valores lógicos

Los valores lógicos True y False (verdadero y falso) son de tipo bool, que representa valores lógicos.
El nombre bool viene del matemático George Boole, quien creó un sistema algebraico para la lógica binaria. Por lo mismo, a True y False también se les llama valores booleanos. El nombre no es muy intuitivo, pero es el que se usa en informática, así que hay que conocerlo.

Texto

A los valores que representan texto se les llama strings, y tienen el tipo str.
Los strings literales pueden ser representados con texto entre comillas simples o comillas dobles:
"ejemplo 1"
'ejemplo 2'
La ventaja de tener dos tipos de comillas es que se puede usar uno de ellos cuando el otro aparece como parte del texto:
"Let's go!"
'Ella dijo "hola"'
Es importante entender que los strings no son lo mismo que los valores que en él pueden estar representados:
>>> 5 == '5'
False
>>> True == 'True'
False
Los strings que difieren en mayúsculas y minúsculas, o en espacios también son distintos:
>>> 'mesa' == 'Mesa'
False
>>> ' mesa' == 'mesa '
False

Nulo

Existe un valor llamado None (en inglés, «ninguno») que es utilizado para representar casos en que ningún valor es válido, o para indicar que una variable todavía no tiene un valor que tenga sentido.
El valor None tiene su propio tipo, llamado NoneType, que es diferente al de todos los demás valores.

estructura basica de un programa



Resultado de imagen para estructura basica de un programa3.2 Estructura básica de un programa.
Como ya se ha visto, cuando se escribe un programa lo que se trata de hacer es indicarle a la computadora cómo ha de resolver un problema. Estos programas siguen determinada estructuras, que dependen del tipo de lenguaje que usemos y del entorno en el cual lo creemos.


Principios generales:

  • Un cargador - todo programa necesita ser cargado en la memoria por el sistema operativo. De esto se encarga el intérprete.
  • Definición de los datos - la mayoría de los programas operan con datos y por lo tanto en el código fuente debemos definir que tipo de datos vamos a utilizar en el programa. Esto se realiza de manera diferente en los distintos lenguajes. Todos los lenguajes que usaremos tienen la posibilidad de crear una nueva definición de datos simplemente al utilizar los datos. Veremos esto en la próxima sección.
  • Instrucciones - son la parte central del programa. Las instrucciones manipulan los datos que hemos definido, realizan cálculos, muestran los resultados, etc.  
La Mayoría de programas siguen una de dos estructuras:

  

1.- Programas de lotes

Estos se ejecutan típicamente desde una línea de comando o automáticamente desde otra aplicación y tienden al siguiente patrón
  • Inicialización interna de los datos
  • Lectura de los datos ingresados
  • Procesamiento de los datos
  • Visualización o ejecución de los resultados

2.- Programas controlados por eventos

La mayor parte de las interfaces responden a eventos
Los programas controlados por eventos son generalmente así:
  • Inicialización interna de los datos
  • Espera de los eventos
  • Identificación de los eventos y actuación en consecuencia 
Estructura Básica de un programa en C/C++:

La estructura de un programa es una cuestión que puede ser abordada desde varios puntos de vista, consideremos para su estudio solo este caso. .
     1.       Componentes lógicos se refiere a los diversos elementos que componen una aplicación, desde los más complejos hasta los más simples.  Si comparamos un programa con un edificio, los elementos irían desde el edificio como un todo, a los ladrillos (sus elementos más pequeños).

     2.       Estructura lógica.Desde el punto de vista lógico, puede considerarse que los programas comprenden dos tipos de elementos diferentes: estructuras de datos y algoritmos. O dicho en otras palabras: datos, e instrucciones para su manipulación. Su representación codificada adopta dos formas: una entendible por la máquina (ejecutable y ficheros de datos) y otra entendible por el humano (fuente). Para el conjunto de ambas puede considerarse una escala conceptual que, si vamos de lo general a lo particular, podemos representarla como sigue:






Aplicación :•Comprende ejecutables y datos. Puede haber múltiples ficheros de ambos tipos (ficheros de datos y ejecutables)


Programa : •Parte de una aplicación (código) que puede cargarse y ejecutarse independientemente.

Fichero fuente:•Se llaman así (abreviadamente) los ficheros que contienen el código fuente (ficheros .C / .CPP) escrito por el programador


Función: Una parte de un programa (subrutina) con un nombre, que puede ser invocada (llamada a ejecución) desde otras partes tantas veces como se desee. Opcionalmente puede recibir valores (argumentos); se ejecuta y puede devolver un valor

Bloque: •Lista, que puede estar vacía, de sentencias delimitadas


Sentencia: •Las sentencias se componen de una o varias expresiones y tienen sentido computacional completo


Expresión: •Las expresiones son secuencias de tokens (operadores, operandos y elementos de puntuación) que especifican una computación; tienen sentido computacional en sí mismas. Son los bloques de computación más simples con los que se construye un programa [6 §5] aunque no pueden ejecutarse separadamente sino cuando forman una sentencia. Nota: la diferencia entre sentencia y expresión es algo arbitraria.