Documentos de Académico
Documentos de Profesional
Documentos de Cultura
23"
Estructura de un Programa en C++
#include <iostream>
Las líneas de directivas para el preprocesador comienzan con el signo ( # ).
La directiva #include <iostream> indica al preprocesador incluir el archivo iostream estándar. Este
incluye las declaraciones de la biblioteca de entrada-salida de C + +.
Comentarios
// mi primer programa en C++
Línea de comentario. Comienzan con dos signos de barra ( // ) y no tienen ningún efecto sobre el
comportamiento del programa. El programador puede utilizarlo para incluir breves explicaciones u
observaciones de su propio código fuente. Podemos usar /* Comentario*/ para escribir un bloque de
texto.
Identificadores
Un identificador válido es una secuencia de una o más letras, números o caracter de subrayado. Sólo letras, dígitos
y caracteres de subrayado son válidos. Además, los identificadores de variables siempre tienen que comenzar con
una letra. También puede comenzar con un carácter de subrayado, pero en algunos casos éstos pueden ser
reservados para las palabras clave específicas del compilador o identificadores externos.
No puede coincidir con palabras clave del lenguaje C + +, ni los específicos de su compilador, que son palabras
clave reservadas. Las palabras clave reservadas estándar son:
asm, auto, bool, break, case, catch, char, class, const, const_cast, continue, default, delete, do, double,
dynamic_cast, else, enum, explicit, export, extern, false, float, for, friend, goto, if, inline, int, long, mutable,
namespace, new, operator, private, protected, public, register, reinterpret_cast, return, short, signed, sizeof, static,
static_cast, struct, switch, template, this, throw, true, try, typedef, typeid, typename, union, unsigned, using, virtual,
void, volatile, wchar_t, while
Las representaciones de operadores no se pueden utilizar como identificadores, ya que son palabras reservadas
bajo algunas circunstancias:
and, and_eq, bitand, bitor, compl, not, not_eq, or, or_eq, xor, xor_eq
Muy importante: El lenguaje C + + es "sensible al lenguaje". Esto significa que un identificador escrito en letras
mayúsculas no es equivalente a otro con el mismo nombre pero escrito en letras minúsculas.
Podemos declarar varias variables del mismo tipo, separando sus identificadores con comas.
Los tipos de datos int, char, short, int largo y puede ser con signo o sin signo. Tipos con signo pueden
representar los valores tanto positivos como negativos, mientras que los tipos sin signo sólo puede representar
valores positivos (y cero).
Por defecto, si no se especifica si el tipo de dato es con/sin signo el compilador asumirá que es con signo: int
MyAccountBalance; //variable con signo
Una excepción a esta regla es el tipo char, pensada para almacenar caracteres. Debe usar ya sea signed charo
unsigned char , si tiene la intención de almacenar los valores numéricos en una variable de tipo char de tamaño.
short y long se pueden usar solos como especificadores de tipo. En este caso, se refieren a sus respectivos tipos
enteros fundamentales: short es equivalente a short int y long es equivalente a long int.
Por último, signed y unsigned también puede ser utilizado como especificadores de tipo independientes, y so
equivalentes a signed int y unsigned int respectivamente.
Ejemplo:
// Operaciones con variables
#include <iostream>
using namespace std;
int main ()
{
// Declaración de variables:
int a, b; int result;
// Procesoso:
a = 5; b = 2; a = a + 1;
result = a - b;
// Imprime los resultados:
cout << result;
// Termina el programa:
return 0;
}
Alcance de las variables
Una variable puede ser cualquiera de alcance global o local. Una variable global es una variable declarada en el
cuerpo principal del código fuente, fuera de todas las funciones, mientras que una variable local es declarada
dentro del cuerpo de una función o un bloque.
Las variables globales pueden ser referidos desde cualquier parte del código, incluso dentro de las funciones,
siempre que sea después de su declaración.
Inicialización de variables
Cuando se declara una variable local regular, su valor por defecto es indeterminado. Sin embargo, es posible que
desee una variable para almacenar un valor concreto en el momento en que se declara. Con el fin de hacer esto,
puede inicializar la variable. Hay dos maneras de hacer esto en C + +:
1. A la declaración de la variable, se añade un signo igual seguido por el valor para inicializar la variable:
Sintaxis: type identifier = Valor_inicial;
Ejemplo: int a=0;
2. Conocida como la inicialización del constructor, encerrar el valor inicial entre paréntesis ( ):
Sintaxis: type identifier (Valor_inicial);
Ejemplo: int a (0)
// Inicialización de variables
#include <iostream>
using namespace std;
int main ()
{
int a=5;
// Inicializa value = 5
int b(2);
// Inicializa value = 2
int result;
// Inicializa value a un valor indeterminado
a = a + 3;
result = a - b;
cout << result;
return 0;
}
Introducción a las cadenas
Las variables que pueden almacenar valores no numéricos que son más de un carácter se conoce como cadenas.
// Mi primer cadena
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string micadena = "Esta es una cadena" ;
cout << micadena;
return 0;
}
Como se puede ver en el ejemplo anterior, las cadenas se pueden inicializar con cualquier cadena válida literal.
Ambos formatos son válidos para inicializar variables de cadena:
Con las cadenas también se pueden realizar todas las operaciones básicas que con otros tipos de datos
fundamentales
// mi primer cadena
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string micadena;
mystring = "Este es el contenido de la cadena inicial" ;
cout << micadena << endl;
mystring = "Esta es el contenido de una cadena diferente" ;
cout << micadena << endl;
return 0;
}
Constantes
Las constantes son expresiones con un valor fijo.
Literales
Las literales son el tipo más obvio de las constantes. Se utilizan para expresar valores particulares dentro del
código fuente de un programa.
a = 5;
El 5 en esta parte del código es una constante literal.
Constantes literales pueden ser divididas en: números enteros, números en coma flotante, caracteres, cadenas y
valores booleanos.
Números enteros
1776 707 -273 Son constantes numéricas que identifican valores enteros sin decimales.
C++ permite números decimales, octales (base 8) y hexadecimales (base 16) como constantes literales. Para
expresar un número octal tiene que ir precedido de un 0(cero), un hexadecimal tiene que ir precedido por los
caracteres 0x (cero, x).
Por defecto, las literales enteras son de tipo int. Sin embargo, podemos obligarlas a ser sin signo añadiendo el
carácter u , o largo añadiendo l:
3.14159 // 3.14159 6.02e23 // 6.02 x 10^23 1.6e-19 // 1.6 x 10^-19 3.0 // 3.0
El tipo por defecto para los literales de punto flotante es el doble. Si queremos expresar de forma explícita un
flotante o un largo doble numérica literal, puede utilizar los sufijos f, l o s, respectivamente:
Cualquiera de las letras que se usan en una constante numérica de punto flotante ( e , f , l ) se puede escribir
usando letras mayúsculas o minúsculas.
\n salto de línea
\r retorno de carro
\t tabulador
\v tabulador vertical
\b tecla de retroceso
\f la forma de alimentación (alimentación de página)
\a alerta (zumbido)
\' comilla simple (')
\" comillas (")
\? signo de interrogación (?)
\\ barra invertida (\)
Primer caso (octal) las cifras debe seguir inmediatamente a la barra invertida (por ejemplo \23).
Segundo caso (hexadecimal), una x debe presidir los dígitos (por ejemplo \x20 o \x4A ).
Las cadena se puede extender a más de una línea de código, escriba un signo de barra invertida ( \ ) al final de
cada línea sin terminar.
También puede concatenar varias constantes de cadena que los separan por uno o varios espacios en blanco,
tabuladores, nueva línea o de cualquier otro carácter en blanco válido:
Por último, si queremos que la cadena se con caracteres anchos (tipo wchar_t), en lugar de los caracteres
estrechos (tipo char), se puede preceder a la constante con el prefijo L:
Literales Booleanas
Sólo hay dos valores válidos booleanos: true y false. Estos pueden ser expresados en C + + como valores de tipo
bool mediante las literales booleanas true y false .
Esto define dos nuevas constantes: PI y la nueva línea. Una vez que se definan, se pueden utilizar en el resto del
código como si se tratara de cualquier otra constante.
Ejemplo:
// definición de constantes: Calcula el área de una circunferencia
#include <iostream>
using namespace std;
#define PI 3.14159
#define NEWLINE '\n'
int main ()
{
double r=5.0;
// radio
double circle;
circle = 2 * PI * r;
cout << circle;
cout << NEWLINE;
return 0;
}
#define no es una instrucción C + +, pero si una directiva para el preprocesador, por lo tanto no requiere de un
punto y coma ( ; ) en su extremo.
Constantes declaradas (const)
Con el prefijo const se pueden declarar constantes con un tipo específico de la misma manera como lo haría con
una variable:
pathwidth y tabulador son dos constantes con tipo. Se tratan igual que las variables, salvo que sus valores no
pueden ser modificados después de su definición.
Operadores
Los operadores en C + + se compone de los signos que que representan las operaciones matemáticas.
Asignación (=)
El operador de asignación asigna un valor a una variable.
a=b
Ejemplo:
// Operador de asignación
#include <iostream>
using namespace std;
int main ()
{
int a, b;
// a:?, b:?
a = 10;
// a:10, b:?
b = 4;
// a:10, b:4
a = b;
// a:4, b:4
b = 7;
// a:4, b:7
cout << "a=" ;
cout << a;
cout << " b=" ;
cout << b;
return 0;
}
Una propiedad de C + + es que la operación de asignación se puede utilizar como el valor de la derecha (o parte
de un valor de la derecha) para otra operación de asignación.
Ejemplo: a = 2 + (b = 5);
Es equivalente a:
b = 5;
a = 2 + b;
Significa: asignar 5 a variable b y luego asignar 2 a la variable a mas el valor de b.
a = b = c = 5;
+ adición
- sustracción
* multiplicación
/ división
% módulo
Módulo es la operación que le da el resto de una división de dos valores. Por ejemplo, si escribimos:
a = 11 % 3;
Cuando se quiere modificar el valor de una variable mediante la realización de una operación con el valor
almacenado actualmente en esa variable se puede utilizar operadores de asignación compuestos:
expresión es equivalente a
valor + = incremento; valor = valor + incremento;
uno - = 5; uno = uno - 5;
uno / = b; a = a / b;
Precio * = unidades + 1; Precio = Precio * (unidades + 1);
Incrementar y Disminuir
El operador incremento (+ +) y el operador de una disminución (-) aumenta o disminye en uno el valor almacenado
en una variable. Son equivalentes a + = 1 y - = 1, respectivamente. Así:
c++; c+=1; c=c+1;
Son equivalentes en su funcionalidad: los tres incrementan en uno el valor de c.
Una característica de este operador es que puede ser utilizado tanto como un prefijo y como sufijo. Es decir puede
ser escrito o antes del identificador de variable (+ + a) o después de el (a + +).
En el caso de que el operador incremento se utilice como prefijo (+ + a) el valor se incrementa antes de que el
resultado de la expresión se evalúa y por lo tanto el mayor valor se considera en la expresión externa, si se utiliza
como un sufijo ( a + +) el valor almacenado se incrementa después de ser evaluado y por lo tanto, el valor
almacenado antes de la operación de aumento se evalúa en la expresión exterior.
Ejemplo 1 Ejemplo 2
B = 3; B = 3;
A = B + +; A = B + +;
/ / A contiene 4, B contiene 4 / / A contiene 3, B contiene 4
== Igual a
!= No es igual a
> Mayor que
< Menos que
>= Mayor o igual a
<= A menos de o igual a
Ejemplos:
(7 == 5) //evalúa a false. (5 > 4) //evalúa a true. (3 != 2) //evalúa a true.
(6 >= 6) //evalúa a true. (5 < 5) //evalúa a false.
Por supuesto, en lugar de utilizar sólo las constantes numéricas, podemos utilizar cualquier expresión válida,
incluidas las variables. Supongamos que a = 2, b = 3 y c = 6,
El Operador! en C ++ es el operador para llevar a cabo la operación booleana NOT, que tiene un solo operando,
ubicado a su derecha, y lo único que hace es invertir el valor de la misma, produciendo falso si su operando es
verdadero y cierto si su operando es falso
!(5 == 5) // evalúa false porque la expression a su derecha(5 == 5) es verdadera. !(6 <= 4) // evalúa true porque(6
<= 4) sera false.
!true // evalúa false
!false // evalúa true.
Los operadores lógicos && y || se utilizan en la evaluación de dos expresiones y obtener un resultado relacional
único. El operador && es la operación lógica booleana AND. Esta operación da como resultado true si ambos
operandos son verdaderos, y falsa en caso contrario.
OPERADOR &&
a b a && b
verdadero verdadero verdadero
verdadero falso falso
falso verdadero falso
falso falso falso
El operador || es la operación lógica booleana OR. Esta operación da como resultado verdadero si cualquiera de
sus dos operandos es verdadera, por lo tanto es falsa solamente cuando ambos operandos son falsos:
Operador | |
a b a||b
verdadero verdadero verdadero
verdadero falso verdadero
falso verdadero verdadero
falso falso falso
Ejemplo:
corto-circuito
operador
Si la expresión izquierda es falsa, el resultado combinado es falsa (de la derecha no se evalúa la
&&
expresión de lado).
Si la expresión izquierda es cierto, el resultado combinado es cierto (la mano derecha no se evalúa la
||
expresión de lado).
Esto es sobre todo importante cuando la expresión de la derecha tiene efectos secundarios, tales como la alteración
de los valores:
if ((i<10)&&(++i<n)) { /*...*/ }
Esta expresión condicional combinada i se incrementa en uno, pero sólo si la condición a la izquierda de && es
cierto, ya que de lo contrario la expresión de la derecha (+ + i <n) no se evalúa.
El operador condicional evalúa una expresión que devuelve un valor si la expresión es verdadera y otra distinta si
la expresión se evalúa como falsa. Su formato es:
condición? result1: result2
// conditional operator
#include <iostream>
using namespace std;
int main ()
{
int a,b,c;
a=2; b=7;
c = (a>b) ? a : b;
cout << c;
return 0;
}
Ejemplo:
a = (b=3, b+2);
Se asigna el valor 3 a B, y luego se asigna b=2 a la variable a. Así, al final, una variable que contiene el valor 5,
mientras que la variable b contendría valor 3.
El código anterior se convierte el número flotat 3,14 a un valor entero (3), el resto se pierde. Otra forma de hacer
lo mismo en C + + es utilizando la notación funcional: que precede a la expresión que se convierte por el tipo y
encerrando la expresión entre paréntesis:
i = int ( f );
sizeof ()
Este operador acepta un parámetro, que puede ser un tipo o una misma variable y devuelve el tamaño en bytes
de ese tipo o un objeto:
a = sizeof ( char );
Todos estos niveles de precedencia para los operadores pueden ser manipulados o ser más legibles, eliminando
posibles ambigüedades que utilizan signos entre paréntesis (y), como en este ejemplo:
a = 5 + 7 % 2; podría ser escrito, ya sea como: a = 5 + (7 % 2); o a = (5 + 7) % 2;
C + + utiliza una abstracción llamada corrientes para realizar operaciones de entrada y salida en los medios como
la pantalla o el teclado.
La biblioteca estándar de C + + incluye el archivo de cabecera iostream, donde los objetos estándar de entrada y
salida se declaran.
De salida estándar (cout)
cout se utiliza en conjunción con el operador de inserción, que se escribe como << dos signos "meno que".)
En los ejemplos anteriores se inserta: una cadena, Una constantes numéricas y variable. Una cadena debe estar
encerrada entre comillas ("):
cout << "Hola" ; // Imprime hola cout << Hola; // pImprime el contenido de la variable hola
El operador de inserción (<<) se puede utilizar más de una vez en una sola sentencia:
cout << "Hola, " << "Yo soy " << "una instrucción C++" ;
Imprime el mensaje Hola, soy una instrucción C + + en la pantalla. La utilidad de repetir el operador de inserción
(<<) se demuestra cuando queremos imprimir una combinación de variables y constantes o variables:
cout << "Hola, Yo tengo " << Edad << " años y mi código postal es " << codigopostal;
La salida seria:
Hola, yo tengo 24 años y mi código postal es 90064
Es importante señalar que cout no agrega un salto de línea después de su salida a menos que se le indique.
Por lo tanto, las siguientes declaraciones:
cout << "Esta es una sentencia” ; cout << "Esta es otra sentencia." ;
se muestra en la pantalla una después de la otra sin ningún tipo de salto de línea entre ellos:
Esta es una sentencia. Esta es otra sentencia.
Para realizar un salto de línea en la salida de manera explícita debe insertar un carácter de nueva línea en cout.
En C + + un carácter de nueva línea se pueden especificar como \ n (barra invertida, n):
cout << "Primera sentencia.\n" ; cout << "Segunda sentencia.\nTercera sentencia." ;
Esto produce el siguiente resultado:
La primera frase.
Segunda frase.
La tercera frase.
Además, para añadir una nueva línea, usted también puede usar el manipulador endl. Por ejemplo:
cout << "primera sentencia." << endl; cout << "Segunda sentencia." << endl;
Se imprime:
La primera frase.
Segunda frase.
El manipulador endl produce un carácter de nueva línea y cuando se utiliza con flujos de buffer: el buffer se vacía.
Estándar de entrada(cin).
El dispositivo de entrada estándar es generalmente el teclado. El Manejo de la entrada estándar en C + + se lleva
a cabo mediante la aplicación del operador sobrecargado de extracción (>>) en el flujo cin. El operador debe ser
seguida por la variable que almacenan los datos que van a extraerse. Ejemplo:
int age;
cin >> age;
La primera instrucción declara una variable de tipo int llamada edad, y el segundo espera una entrada de CIN (el
teclado) con el fin de almacenar en esta variable entera. cin sólo puede procesar la entrada desde el teclado una
vez que la tecla de retorno ha sido presionado.
El tipo de la variable se debe considerar como un recipiente con extracciones del cin. Si usted solicita un número
entero obtendrá un número entero, si usted solicita un caracter tendrá un carácter y si usted solicita una cadena
obtendrá una cadena.
// Ejemplo de E/S
#include <iostream>
using namespace std;
int main ()
{
int i;
cout << "Por favor, introduzca un valor entero:" ;
cin >> i;
cout << "El valor que introdujo es" << i;
cout << " y su doble es" << i*2 << ".\n" ;
return 0;
}
El usuario de un programa puede ser uno de los factores que generan los errores. Puesto que si usted solicita un
valor entero y el usuario introduce un nombre se genera un error de tipo de datos.
La clase stringstream ofrece una posible solución para los errores que pueden ser causados por este tipo de entrada
del usuario.
También puede utilizar el cin para pedir más de una entrada de datos:
Es equivalente a:
cin >> a;
cin >> b;
cin y cadenas
Podemos usar cin para conseguir secuencias con el operador de extracción (>>) como lo hacemos con las
variables de tipo de datos:
cin >> micadena;
La extracción de cin deja de leer cuando se encuentra con un espacio en blanco, por lo que en este caso no
podemos obtener una palabra para cada extracción.
Con el fin de conseguir líneas enteras, podemos usar la función getline, que es la forma más recomendable para
obtener la entrada del usuario con cin:
Observe cómo en las dos llamadas a getline se utiliza el identificador de cadena (mistr). Lo que hace el programa
en la segunda convocatoria es simplemente para reemplazar el contenido anterior por el nuevo que se introduce.
stringstream
El encabezado del archivo <sstream> define una clase llamada stringstream . De esta manera podemos realizar
las operaciones de extracción o inserción de / a las cadenas, lo cual es especialmente útil para convertir cadenas
en valores numéricos, y viceversa. Ejemplo, si queremos extraer un número entero de una cadena se puede escribir:
Esto declara un objeto de cadena con un valor de "1204", y un objeto int. Luego utilizamos el constructor
stringstream 's para construir un objeto de este tipo desde el objeto de cadena. Debido a que podemos utilizar
objetos stringstream como si fueran corrientes, podemos extraer un número entero de lo que hubiéramos hecho en
cin aplicando el operador de extracción (>>) sobre el mismo seguido por una variable de tipo int.
Después de esta pieza de código, la variable Mientero contendrá el valor numérico de 1204.
// stringstreams
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main ()
{
string micadena;
float precio=0;
int cantidad=0;
cout << "Introduzca el precio: " ;
getline (cin,micadena);
stringstream(micadena) >> precio;
cout << "Introduzca la cantidad: " ;
getline (cin,micadena);
stringstream(micadena) >> cantidad;
cout << "Precio total: " << Precio*cantidad << endl;
return 0;
}
Salida
En este ejemplo, se adquieren valores numéricos de la entrada estándar indirectamente. En vez de extraer los
valores numéricos directamente desde la entrada estándar, obtenemos las líneas de la entrada estándar (cin) en un
objeto de cadena (mystr), y luego extraer los valores enteros de esta cadena en una variable de tipo int (cantidad).
El uso de este método, en lugar de las extracciones directas de valores enteros, tenemos más control sobre lo que
ocurre con la entrada de valores numéricos del usuario, ya que se van a separar el proceso de obtener la entrada
del usuario (que ahora sólo le pedimos para las líneas) con la interpretación de que la entrada. Por lo tanto, este
método se prefiere generalmente para obtener los valores numéricos del usuario en todos los programas que son
intensivas en la entrada del usuario.
Estructuras de control
Un programa generalmente no se limita a una secuencia lineal de instrucciones. Durante su proceso se puede
bifurcar, repetir código o tomar decisiones. Para ello, C + + proporciona estructuras de control que sirven para
especificar lo que se tiene que hacer nuestro programa, bajo determinadas circunstancias.
Un bloque es un grupo de sentencias que están separadas por punto y coma (;) como todos los de C + +, pero
agrupados en un bloque entre llaves: {}:
En el caso de que la declaración tenga una sola sentencia, no es necesario encerrarla entre llaves ({}). Pero en
el caso de que queremos que la declaración sea una instrucción compuesta debe ser encerrado entre llaves ({}),
formando un bloque.
Por ejemplo, el siguiente fragmento de código imprime x es 100 sólo si el valor almacenado en la variable x es
igual a 100:
Si queremos algo más que una sola instrucción que se ejecutará en caso de que la condición es verdadera se
puede especificar un bloque mediante llaves {}:
if (x == 100)
{
cout << "x es " ;
cout << x;
}
if ( condición )
{
instrucciones a ejecutar
}
Donde condición es la expresión que se está evaluando. Si esta condición se cumple, se ejecuta la sentencia o
bloque de sentencias. Si es falsa, la declaración no se ejecuta y el programa continúa inmediatamente después de
la estructura condicional.
En el siguiente ejemplo tenemos un programa que nos pide un número, si ese número es 10 se muestra un mensaje.
Si no es 10 no se muestra ningún mensaje:
#include <stdio.h>
int main()
{
int num;
if (x == 100) cout << "x es 100" ; else cout << "x no es 100" ;
En el if si no se cumplía la condición no se ejecutaba el bloque siguiente y el programa seguía su curso normal. Con
el if-else tenemos un bloque adicional que sólo se ejecuta si no se cumple la condición.
Recuerde que en caso de que queramos más que una sola sentencia para su ejecución, debemos agruparlos en
un bloque encerrándolos entre llaves {}.
If-else-if
Se pueden anidar el if-else si se desea con la intención de verificar un rango de valores. El siguiente ejemplo
muestra su uso diciendo si el valor almacenado actualmente en la x es positivo, negativo o cero:
if (x > 0)
cout << "x es positivo" ;
else if (x < 0)
cout << "x es negativo" ;
else
cout << "x es 0" ;
Ejemplo
#include <stdio.h>
int main()
{
int a;
El símbolo && de la condición del segundo if es un AND (Y). De esta forma la condición queda: Si a es mayor que
10 Y a es menor que 100.
Y así todos los if else que queramos. Si la condición del primer if es verdadera se muestra el mensaje El número
introducido era menor de 10 y se saltan todos los if-else siguientes (se muestra Fin del programa). Si la condición
es falsa se ejecuta el siguiente else-if y se comprueba si a está entre 10 y 100. Si es cierto se muestra El número
está entre 10 y 100. Si no es cierto se evalúa el último else-if.
? El otro if-else
Ejemplo
#include <stdio.h>
int main()
{
int a;
int b;
Si el valor que tecleamos al ejecutar es menor que 10 entonces b=1, en cambio si tecleamos un número
mayor que 10 'b' será igual a 2. Ahora vamos a reescribir el programa usando '?':
#include <stdio.h>
int main()
{
int a;
int b;
switch
El formato de la sentencia switch es:
switch ( variable )
{
case opción 1:
código a ejecutar si la variable tiene el
valor de la opción 1
break;
case opción 2:
código a ejecutar si la variable tiene el
valor de la opción 2
break;
default:
código que se ejecuta si la variable tiene
un valor distinto a los anteriores
break;
}
Aquí no tenemos una condición que se debe cumplir sino el valor de una variable. Dependiendo del valor se cumplirá
un caso u otro.
int main()
{
int num;
y su función principal es repetir la declaración mientras la condición sigue siendo verdad. Pero además, el bucle
proporciona lugares específicos para contener una instrucción de inicialización y una declaración de incremento.
Esta instrucción esta diseñado para llevar a cabo una acción repetitiva con un contador que se inicializa y el
incremento en cada iteración.
1. inicialización se ejecuta. Es el valor inicial para una variable de contador. Esto se ejecuta sólo una vez.
2. condición se comprueba. Si bien es cierto el bucle continúa, de lo contrario el bucle termina y se omitirá
la sentencia (no ejecutados).
3. se ejecuta la sentencia. Como de costumbre, puede ser una sola sentencia o un bloque entre llaves {}.
4. Finalmente, todo lo que se especifica en el campo de aumento se ejecuta el bucle y vuelve al paso 2.
Los campos de inicialización e incremento son opcionales. Pueden permanecer vacío, pero en todos los casos
los signos punto y coma entre ellos debe estar
Por ejemplo, podríamos escribir: for (; n <10 ;) si queremos especificar que no hay inicialización ni incremento(; n
<10, n + +) si quisiéramos incluir un campo de incremento, pero no de inicialización (tal vez porque el variable se
inicializa antes).
Si lo desea, usando el operador coma (,) se puede especificar más de una expresión en cualquiera de los campos
incluidos en un bucle, como en la inicialización, por ejemplo. El operador coma (,) es un separador de expresión,
que sirve para separar más de una expresión que sólo una se espera en general. Por ejemplo, supongamos que
queremos iniciar más de una variable en nuestro bucle:
Este bucle se ejecutará durante 50 horas cuando ni n=, 0 i=100 son modificadas dentro del bucle:
n comienza con un valor de 0, y I con 100, la condición es n! = i (que n no es igual a i). Dado que n se incrementa
en uno y disminuyó por una, la condición del bucle se convertirá en falso después del bucle 50a, cuando ambos n
e i será igual a 50.
El bucle while
Su formato es:
Al iniciar el programa se pide al usuario que introduzca un número de partida de la cuenta regresiva. Entonces
comienza el bucle mientras, si el valor especificado por el usuario cumple la condición n> 0 (que n es mayor que
cero) el bloque que sigue a la condición será ejecutado y repite mientras la condición (n> 0) permanece siendo
verdadera.
Todo el proceso del programa anterior se puede interpretar de acuerdo con la siguiente secuencia de comandos:
Por supuesto esto es una acción tan sencillo para nuestro equipo en el que la cuenta atrás de todo se realiza al
instante sin demora alguna práctica entre los números.
El bucle do-while
Su formato es:
do while (condición);
Su funcionalidad es exactamente el mismo que el bucle while, con esa condición en el bucle do-while se evalúa
después de la ejecución de la declaración en lugar de antes, la concesión de al menos una ejecución de la
declaración, incluso si la condición no se cumple. Por ejemplo, el siguiente programa de ejemplo se hace eco de
cualquier número que introduzca hasta que introduzca 0.
// number echoer
#include <iostream>
using namespace std;
int main ()
{
unsigned long n;
do
{
cout << "Enter number (0 to end): " ;
cin >> n;
cout << "You entered: " << n << "\n" ;
} while (n != 0);
return 0;
}
El do-while se utiliza generalmente cuando la condición de que tiene que determinar el final del bucle se
determina dentro de la instrucción bucle sí mismo, como en el caso anterior, donde la entrada del usuario dentro
del bloque es lo que se utiliza para determinar si el bucle tiene que terminar. De hecho, si no se introduce el valor
0 en el ejemplo anterior puede que se le pida más números para siempre.
Saltar declaraciones.
La sentencia break
Uso de descanso que puede dejar un bucle, incluso si la condición para que su fin no se cumple. Puede ser
utilizado para poner fin a un bucle infinito, o para forzarlo a terminar antes de su fin natural. Por ejemplo, vamos a
detener la cuenta regresiva antes de su fin natural (tal vez debido a un fallo del motor del cheque?)
Obtener numeros aleatorios en C++ (rand, srand)Es algo muy frecuente, cuando ya dominas todo eso de pedir
y almacenar datos, ahora tu profesor te pedirá que tus programas generen números aleatorios para automatizar
el proceso de llenar arreglos y todo eso.
Eso es básicamente. Para ajustar el rango de número aleatorios podemos hacer varias cosas.
Así que un programa que muestre 10 números aleatorios entre 1 y 10 quedaría así:
#include<stdlib.h>
#include<iostream>
using namespace std;
int main()
{
int num,c;
srand(time(NULL));
for(c=1;c<=10;c++)
{
num=1+rand()%(11-1);
cout<<num<<" ";
}
cin.get();
}
Primero que nada, <cstdlib> es la forma correcta de incluir la librería <stdlib.h> en c++, igual con <ctime>.
Como ven, usamos una función bool (que retorna falso o verdadero) para checar si el número aleatorio ya existe
en nuestra matriz. Si cualquiera de los números es igual a nuestro número aleatorio n, la función retorna true, por lo
que el ciclo do-while desde el cual llamamos la función tendrá que repetirse una vez más y hasta que la función
retorne false.
Cuando se logra salir del ciclo do-while, guardamos nuestra n en el lugar de la matriz que corresponda, lo mostramos
en pantalla y continuámos con la siguiente posición de la matriz.
Otra cosa. Para decirnos si un número está repetido en la matriz, la función checkrep() necesita obviamente dos
cosas, el número aleatorio y la matriz. Así que le enviámos como parámetros nuestra matriz y nuestro número
aleatorio.
Otro ejemplo, la tabla de multiplicar del 2 en C++:
#include<stdio.h>
#include<conio.h>
int main()
{
int c=0;
for(c=1;c<=10;c++)
{
printf("2 x %d = %d\n",c,2*c);
}
getch();
}
Veamos como funcionaría un contador dentro de un ciclo:
#include<iostream>
using namespace std;
int main()
{
int contador=0;
for(int i=0; i<10; i++)
contador++;
cout << contador;
}
Con una condición:
#include<iostream>
using namespace std;
int main()
{
int contador=0;
for(int i=0; i<10; i++)
{
if(i==5)
contador++;
}
cout << contador;
}
Con una condición para obtener los números pares:
#include<iostream>
using namespace std;
int main()
{
int contador=0;
for(int i=0; i<10; i++)
{
if(i%2==0)
contador++;
}
cout << contador;
}
Funciones en C++
#include<iostream>
using namespace std;
void hola()
{
cout << "Hola Mundo!";
}
int main()
{
hola();
}
Ahora veamos una función que sí nos es útil:
#include<iostream>
using namespace std;
int main()
{
char nombre[50];
cout << "Cual es tu nombre?: ";
cin.getline(nombre, 50, '\n');
hola(nombre);
}
No reciben ni retornan
Las más sencillas. Para usarlas sólo tenemos que saber cómo crearlas y cómo llamarlas.
Una función se crea de esta forma general:
tipo nombre()
{
}
El ‘tipo’ se refiere al tipo de dato (int, float, void, char) y en las funciones que no retornan siempre es void.
El ‘nombre’ es el nombre de la función: cualquiera que empiece con una letra, que sea significativo y que
no sea una palabra reservada.
Para llamarlas sólo hay que escribir el nombre de la función seguido de sus paréntesis y un punto y coma
(;).
nombre();
Así nuestro programa sería:
Si queremos recibir una variable hasta ahí es suficiente, si queremos otra variable ponemos una coma (,)
y declaramos la siguiente variable.
Para llamar la función hay que poner la variables que vamos a enviar dentro del paréntesis en el mismo
orden en que las declaramos en la función:
nombre(var1, var2);
Nuestro programa quedaría así:
//Ejemplo de una función que recibe pero no retorna
#include<iostream>
using namespace std;
int main()
{
int num1, num2;
cout << "Numero 1: ";
cin >> num1;
cout << "Numero 2: ";
cin >> num2;
sumar(num1, num2);
}
Pedimos los dos números en el main, los enviamos a la función, ésta los suma y los muestra.
Una función de este tipo que hemos usado muchas veces es el odiado por muchos, amados por otros,
gotoxy(x,y);
Retornan y No Reciben
¿Y si ahora queremos lo contrario? Pedir los números en la función, pero mostrar el resultado en el
main. Para eso necesitamos una función que retorne.
Recibir es enviar datos del main a la función. Retornar es enviar datos de la función al main. Para
retornar datos hay que hacer dos cosas: no usar void como tipo y usar return.
De forma general:
tipo nombre()
{
return var;
}
El ‘tipo’ tiene que ser del tipo de variable que queremos retornar, si nuestra variable retorna una variable
int, pues el tipo de la función es int.
Para indicar qué variable estamos retornando usaremos la palabra return seguido de la variable.
Usualmente esto va al final de la función.
Para llamar a la función hay que preparar un colchón en donde caiga la variable que está
retornando.
var = nombre();
La variable que está retornando nuestra función se va a almacenar en la variable ‘var’. Este es un buen
momento para recordarles que las variables declaradas entre dos llaves {} únicamente existen entre esas
dos llaves. O sea que la variable ‘var’ de la función no es la misma que la variable ‘var’ de la función; sin
embargo la var del main está adquiriendo el valor de la var del main. Un poco confuso lo se, no se
preocupen.
Nuestro programa quedaría así:
//Ejemplo de una función que retorna y no recibe
#include<iostream>
using namespace std;
int sumar()
{
int num1, num2, r;
cout << "Numero 1: "; cin >> num1;
cout << "Numero 2: "; cin >> num2;
r = num1 + num2;
return r;
}
int main()
{
int r;
r = sumar();
cout << "La suma es " << r<<”\n”;
}
¿A alguien se le ocurre una función conocida de este tipo?
Reciben y Retornan
Ahora queremos que nuestra función únicamente sume, el main se va a encargar de pedir los números y
sumar los resultados. Para eso necesitamos que nuestra función reciba las variables y además retorne el
resultado. ¡Wow! ¿Es acaso eso posible? Claro que sí.
Es sólo cuestión de combinar las funciones que reciben y no retornan con las que retornan y no reciben.
Nuestro programa quedaría así:
//Ejemplo de una función que recibe datos y retorna resultados
#include<iostream>
using namespace std;
int main()
{
int num1, num2, r;
cout << "Numero 1: ";
cin >> num1;
cout << "Numero 2: ";
cin >> num2;
r = sumar(num1, num2);
cout << "La suma es " << r<<”\n”;
}
Las funciones de la librería math.h son en su mayoría de este tipo. sqrt(); pow(); sin();
En principio puede parecer que las funciones sirven únicamente para organizar el código, lo cual es cierto,
pero no sólo eso. ¿Se imaginan si tuviéramos que escribir todo el código detrás de un simple gotoxy();?
Ah verdad…
Bueno, no me iba a quedar tranquilo si no les mostraba la versión optimizada de la última función:
#include<iostream>
using namespace std;
int sumar(int num1, int num2)
{
return num1 + num2;
}
int main()
{
int num1, num2;
cout << "Numero 1: "; cin >> num1;
cout << "Numero 2: "; cin >> num2;
cout << "La suma es " << sumar(num1, num2);
}
Vamos a ver como se declaran las funciones en c++. No tiene ningun misterio, es
igual que en c. Siempre hay que especificar el tipo de retorno.
/**
* Funcion.cpp
* Programa con llamada a una funcion
*
* Pello Xabier Altadill Izura
*
* Compilado: g++ Funcion.cpp -o Funcion
*/
using namespace std;
#include <iostream>
// Funcion: llamada
int llamada (int x, int y) {
cout << "Estamos en la funcion!!" << endl;
return (x+y);
}
int main() {
// Estos comentarios son propios de C++
cout << "Vamos a llamar a la funcion.." << endl;
// Llamamos a la funcion
// Llamamos a una funcion y asignamos
int z = llamada(5,7);
cout << "Resultado:" << z << endl;
// Llamada desde el output
cout << "Resultado:" << llamada(6,7) << endl;
cout << "Programa terminado \n" << endl;
return 0;
}
Atencion, en este caso veremos como recoger datos de stdin o entrada estandar.
/**
* Funcion3.cpp
* Programa con llamada a una funcion
* El programa principal recoge datos de la entrada estandar
*
* Pello Xabier Altadill Izura
*
* Compilado: g++ Funcion3.cpp -o Funcion3
*/
using namespace std;
#include <iostream>
// Funcion: llamada
int llamada (int x, int y) {
cout << "Estamos en la funcion!!" << endl;
return (x+y);
}
int main() {
// Estos comentarios son propios de C++
cout << "Vamos a llamar a la funcion.." << endl;
// Llamamos a la funcion
// Llamamos a una funcion y asignamos
int z = 0, x = 0, y = 0;
// Recogemos los parametros
cout << "Dame el primer parametro:";
cin >> x;
cout << "\nOK!\nDame el segundo parametro:";
cin >> y;
cout << "\nOK vamos a calcular.";
6
Capítulo 3. Funciones
// Efectuamos la funcion.
z = llamada(x,y);
// Mostramos el resultado
cout << "Resultado:" << z << endl;
// Llamada desde el output
cout << "Resultado:" << llamada(6,7) << endl;
cout << "Programa terminado \n" << endl;
return 0;
}
Actividades de Programación
I. Estructura Secuencial (los algoritmos deberían tener análisis, pseudocodigo, diagrama de flujo y Código
Programas
I. Programas con instrucciones de Entrada/Salida
1. Programa que imprime el mensaje “¡Bienvenidos al Curso de POO!
2. Programa que imprime cuatro mensajes dos en cada renglón
M1: Soy Alumno del grupo 416
M2: Curso el Módulo de POO
M3: Para acreditar el Curso
M4: Debo Trabajar y Estudiar
3. Programa que declara e inicializa dos variables numéricas enteras y calcula e imprime su
suma
4. Programa que lee dos números enteros y calcula e imprime su suma y resta
5. Programa que lea cuatro valores numéricos desde teclado, calcula y muestra en pantalla
su suma y promedio.
6. Programa que lee desde teclado el lado de un cuadrado, calcula y muestra en pantalla el
perímetro y área del mismo
7. Programa que lee desde el teclado el radio de un circulo y calcula e imprime el área y
perímetro del circulo
8. Programa que lee desde el teclado el largo y ancho de un rectángulo y calcula e imprime
el área y perímetro del rectángulo
9. Programa que lee desde el teclado la base y altura de un triángulo equilátero y calcula e
imprime el área y perímetro del triangulo
10. Programa que lee desde el teclado el lado de un cubo y calcula e imprime el área y
volumen del cubo
11. Programa que lee desde el teclado el radio de la base de un cilindro, su altura y calcula e
imprime el volumen del cilindro
12. Programa que lee desde el teclado lee el precio de un artículo y la cantidad de artículos
que lleva el cliente, el programa calcula y Muestra lo que debe pagar el comprador.
13. Programa que calcula el pago de las compras realizadas en una tienda, considerando las
siguientes compras:
a) Un horno de 16000 con un descuento del 5%
b) Una sala de 13000 con un descuento del 20%
c) Un refrigerador de 8900 con un descuento del 12%
d) Una pantalla de 18000 con un descuento del 15%
14. Programa que calcula e imprime el pago mensual de un empleado que trabaja 8 horas
diarias, 5 días a la semana, al trabajador se le aplica un ISR del 22%, el pago por hora se
lee desde teclado.
15. 7. Diseñar el algoritmo en pseudocódigo y diagrama de flujo para realizar la conversión de
grados Celsius a grados fahrenheit
Nota: ºF= 9/5ºC +32
16. 8. Diseñar el algoritmo en pseudocódigo y diagrama de flujo para realizar la conversión de
grados fahrenheit a grados Celsius
Nota: ºC= 5/9(ºF – 32)
II. Programas con sentencias de control de toma de decisión
1. Programa que lee la edad de una persona y en base a esta imprima los mensajes “Es
un niño “ si la edad es menor o igual a 12, sino imprime “No es un niño”
2. Programa que lee desde el teclado dos números enteros N1 y N2, si N1 es mayor que
N2, calcula e imprime la suma, sino calcula e imprime la resta
3. Programa que lee desde el teclado un numero entero N y determina e imprime si es par,
impar o nulo
4. Programa que lee desde el teclado un numero entero N y determina e imprime si es
positivo, negativo o cero
5. Programa que lee desde el teclado 3 calificaciones de un alumno, Calcula su promedio y
en base a este determina e imprime si está aprobado o reprobado (calificación mínima
aprobatoria 7)
6. Programa que lee desde el teclado tres calificaciones de un alumno, calcula el promedio e
imprima un mensaje según las siguientes condiciones:
Si el promedio es >=7 mostrar "Aprobado".
Si el promedio es >=6 y <7 mostrar "Regular".
Si el promedio es <6 mostrar "Reprobado".
7. Programa que lee desde el teclado tres números enteros y determina e imprime cual es
el mayor
8. Programa que lee desde el teclado una cantidad
a. Si la cantidad es menor a 500 se le suma el 50%
b. Si la cantidad es mayor o igual a 500, pero menor a 1000 se le suma el 20%
c. Si la cantidad es mayor o igual a 1000, pero menor a 5000 se le suma el 15%
d. Si la cantidad es mayor o igual a 5000 se le resta el 5%
9. Programa que resuelve una ecuación de segundo grado, considerando las siguientes
condiciones (b2 - 4AC=0, b2 - 4AC>0 , b2 - 4AC=<0), el programa lee desde el teclado
los coeficientes de la ecuación, calcula e imprime la o las soluciones de la ecuación.
10. Programa que permita leer desde el teclado un número entero positivo de hasta tres cifras
y muestre un mensaje indicando si tiene 1, 2, o 3 cifras. Mostrar un mensaje de error si el
número de cifras es mayor de tres cifras.
11. programa que simula una calculadora para realizar las operaciones básicas(+, -, *, /, %,
potencia y raíz cuadrada ) utilizando switch, el programa lee los valores desde el teclado