Documente Academic
Documente Profesional
Documente Cultură
DE SISTEMAS E INFORMATICA
ALGORITMICA I
_________________________________________________________________________
Contenido
________________________________________________________________________
1.1 Elementos del Lenguaje
1.2 Estructura General de un Programa en C++
1.3 Constantes, Variables y Tipos de Datos
1.4 Acciones Bsicas y Expresiones
1.5 Entrada y Salida en C++
Ejercicios
________________________________________________________________________
En este captulo vamos a introducir el lenguaje de programacin C++ que se va a utilizar en la
asignatura, describiendo algunos conceptos bsicos y plasmando la estructura general de un
programa escrito en este lenguaje. A lo largo de los sucesivos temas se seguir la notacin BNF
para ir describiendo las diferentes reglas sintcticas del lenguaje. De esta forma se ir
introduciendo de una manera formal la sintaxis de C++.
Cuando se usa e en un literal constante real se dice que el nmero est expresado en punto
flotante (notacin cientfica). En cuanto a las cadenas de caracteres (o strings), en C++ se
expresan mediante una secuencia de caracteres cualesquiera1 encerrados entre comillas
simples.
1
El smbolo \ tiene un significado especial en C/C++ como introductor de caracteres especiales (e.g., \n para
un salto de lnea, \t para una tabulacin, \ para las comillas dobles, etc.), lo que deber tenerse en cuenta a la
hora de su introduccin como literal. Si se desea usar literalmente, utilcese \\.
Como puede apreciarse, el programa comienza con un comentario a lo largo de siete lneas,
y en el cual se da informacin sobre el nombre, autor, fecha y propsito del programa. Esto no
es sintcticamente necesario como es bien sabido, pero siempre lo incluiremos como norma de
estilo. A continuacin nos encontramos con dos operaciones de inclusin. Sin entrar en detalles
sobre lo que internamente significan dichas inclusiones, lo que hacemos mediante las mismas
es indicarle al compilador que pretendemos hacer uso de las funcionalidades que nos
proporcionan unas ciertas bibliotecas (en este caso predefinidas; en temas posteriores
aprenderemos a definirlas por nuestra cuenta). En este caso concreto queremos emplear la
biblioteca de entrada/salida iostream para lo cual tenemos que incluirla.
El algoritmo comienza en la lnea int main(). Aqu aparecen varios elementos cuyo
significado veremos en temas posteriores. Lo que s debemos saber es que todo programa que
realicemos tendr un algoritmo principal (el que empezar a realizarse cuando ejecutemos el
programa), y que el comienzo de dicho algoritmo principal se indica mediante una lnea de
estructura como la mostrada.
A continuacin encontramos el cuerpo del algoritmo principal, que abarca desde la llave de
apertura ({) hasta la llave de cierre (}). Siempre aparecern estas llaves delimitando el
cuerpo de un algoritmo. En este caso, el algoritmo consta de una sola orden, mostrar en
pantalla el mensaje Hola Mundo y saltar a la lnea siguiente. Como puede verse, esto se
expresa haciendo uso del objeto predefinido (en iostream precisamente) cout. Todo lo que
redirijamos (mediante el empleo del operador <<) hacia dicho objeto ser mostrado en
pantalla. En el ejemplo se redirige en primer lugar la cadena Hola Mundo, y a continuacin
la indicacin de salto de linea (endl abreviatura de end of line). La instruccin termina
mediante un punto y coma (;), que la separa de instrucciones posteriores (es preciso poner
dicho delimitador incluso si como es el caso aqu, no hay una instruccin posterior).
int
Reales: los nmeros reales (en realidad nmeros en punto flotante, ya que los nmeros
reales en sentido estricto no son representables en ningn computador digital) se
representan mediante los tipos float y double. El segundo tipo permite representar
nmeros con mayor magnitud y precisin, empleando para ello el doble de memoria que
float.
modificador long sobre double, i.e., long double. No se pueden emplear los
modificadores signed/unsigned sobre double.
Todos estos tipos tienen dos propiedades en comn: cada uno est formado por elementos
indivisibles o atmicos que adems estn ordenados. Los tipos de datos con estas
caractersticas se denominan tipos de datos escalares. Cuando decimos que un valor es
atmico, nos referimos a que no contiene partes componentes a las que pueda accederse
independientemente. Por ejemplo, un carcter es indivisible, mientras que la cadena de
caracteres Hola no. Cuando hablamos de que un conjunto de valores est ordenado,
queremos decir que los operadores relacionales estndares (mayor que, menor que, igual, etc.)
pueden aplicarse a los mismos.
Para declarar una variable basta con indicar el tipo de la misma y su nombre. La
declaracin termina con el punto y coma. Los siguientes ejemplos muestran declaraciones
vlidas:
int num;
unsigned x,y;
Como puede apreciarse en el ltimo ejemplo, es posible dar un valor inicial a una variable
a la vez que se declara. As, la sintaxis BNF de una declaracin de variable es:
<decvar> ::= <tipo> <ident> [= <literal>] {, <ident> [= <literal>]};
Tanto las declaraciones de variables como de constantes pueden realizarse de dos maneras:
global y local. El primer modo consiste en situar dicha declaracin al principio del cdigo,
justo despus de las inclusiones. El segundo modo consiste es situarlas dentro del programa
principal, en la zona delimitada por las llaves. Ejemplos:
La diferencia entre ambas formas de declaracin ser evidente cuando en temas posteriores
se introduzca la nocin de funcin. De momento, la regla prctica que seguiremos ser definir
7
El caso ms simple es aqul en el que se asigna un valor literal a una variable, o el valor de
una variable a otra, por ejemplo,
int main()
{
int num1, num2;
num1 = 10;
num2 = num1;
En general, se emplear una expresin para asignar valores a las variables. Las posibles
expresiones que se pueden utilizar dependern en principio del tipo de los objetos
involucrados en las mismas. Sin embrago, debe tenerse en cuenta que C++ no es un lenguaje
con una comprobacin de tipos muy fuerte. Ello quiere decir que no se controla el tipo de los
objetos que forman parte de una operacin. Por ejemplo, es lgico suponer que para sumar dos
objetos, stos han de ser de un tipo numrico (enteros o reales, en cualquiera de sus variantes).
Sin embargo, esto no se comprueba, permitindose sin ir ms lejos que se sumen dos
caracteres. Lo que ocurre internamente es que se produce una operacin de conversin
(casting) mediante la cual los valores de tipo carcter se convierten en valores numricos.
Dicha conversin se puede producir entre cualesquiera dos tipos. De hecho podemos forzar a
que ocurra indicndolo explcitamente. Para ello es preciso indicar el tipo al que queremos
realizar la conversin, y el objeto que queremos convertir, este ltimo entre parntesis. Por
C++ proporciona operadores para realizar las operaciones ms usuales, como pueden ser
las siguientes:
Operaciones aritmticas: se proporcionan los operadores binarios +, , *, / y % con el
significado de suma, resta, multiplicacin, divisin (entera o en punto flotante
dependiendo de los operandos) y resto o mdulo respectivamente. Asimismo, existe el
operador unario para la inversin de signo. Ejemplos:
int num1, num2, num3;
num1 = -10*num2;
num2 = num1%7;
num3 = num1/num2;
Operaciones relacionales: se proporcionan los operadores binarios ==, !=, >, <, >=, <=
con el significado respectivo de comparacin de igualdad, desigualdad, mayor que,
menor que, mayor o igual que y menor o igual que. El resultado de la operacin
relacional ser un valor lgico, Ejemplo,
int num1, num2;
bool b1, b2;
b1 = num2 == num1;
b2 = (num1-num2) >= (num2*2);
C++ proporciona una sintaxis especial en el caso bastante frecuente en el que el valor de
una variable use como operando en una expresin aritmtica logica cuyo resultado se asigna
a la propia variable. Dicha sintaxis permite simplificar asignaciones del tipo v = v <op> E,
permitiendo expresarlas como v <op>= E. Por ejemplo:
int x, y, z;
Precisamente en relacin con este ltimo ejemplo, C++ proporciona una forma sintctica
an ms simple mediante el uso de los denominados operadores de incremento (++) y
decremento (--). stos son operadores unarios que slo pueden aplicarse sobre variables (no
sobre expresiones) y que modifican el valor de la misma, incrementndola o decrementndola
segn corresponda. Por ejemplo:
int x, y, z;
z++; // equivale a z = z + 1 o a z += 1
--x; // equivale a x = x - 1 o a x -= 1
10
En el caso de que tengamos una expresin compleja con varios operadores, C++
proporciona reglas de precedencia que permiten determinar cul es el orden en el que se
aplican los operadores. Dichas reglas son las siguientes:
1. Los operadores unarios se aplican antes que los binarios. Si hay ms de un operador
unario aplicado sobre la misma variable o subexpresin, el orden de aplicacin es de
derecha a izquierda.
2. Los operadores binarios se aplican segn el siguiente orden de precedencia:
Nivel 1 (mayor precedencia): *, /, &
Nivel 2: +, Nivel 3: <, <=, >, >=
Nivel 4: ==, !=
Nivel 5: &&
Nivel 6: ||
Nivel 7 (menor precedencia): =, *= , +=, /=, -=, %=, &=, |=
En caso de que aparezcan varios operadores con igualdad de precedencia, se evalan
de izquierda a derecha. Estas reglas pueden alterarse mediante el uso de parntesis.
Como puede apreciarse, la gestin de la salida de datos es muy cmoda y homognea. Otro
tanto ocurre con la gestin de la entrada de datos. En este caso, simplemente tenemos que
extraer los datos que vayamos precisando del flujo cin:
#include <iostream>
using namespace std;
int main()
{
int x, y;
char c;
double d;
cin >> x >> y >> c >> d;
}
12
setprecision().
punto flotante. Afecta a todos los datos que se introduzcan con posterioridad.
setw(). Permite indicar el nmero de espacios que se emplearn para escribir
un dato, alineando al mismo a la derecha dentro de dicho espacio. Si el espacio
requerido es mayor que el indicado, el modificador se ignora. Slo afecta al dato
que se indica a continuacin.
setfill(): Para especificar el carcter de relleno que se emplear para los
espacios no usados al escribir un dato (segn un modificador setw()).
A continuacin se muestra un ejemplo:
#include <iostream>
#include <iomanip>
using namespace std;
13
EJERCICIO
1 El siguiente programa escrito en C++ tiene errores. Encuntrelos.
/*
* Nombre: Ejemplo.cpp
* Autor:
* Fecha:
* Descripcin: Programa ejemplo sobre errores lxicos,
* sintcticos y semnticos
*
*/
#include <iostream>
int main ()
{
const int tasa = 25.00;
double horas, das, total, neto;
cout << Introduce las horas trabajadas: ' << endl;
cin >> horas
cout << Introduce los dias trabajados: << endl;
cin >> dias;
horas*dias = total;
14
15