You are on page 1of 29

Tomado de http://codigoc.

org

MANUAL DE PROGRAMACIN EN C++


Tomado de http://codigoc.org
Por: Amado Ospina M

DIFERENCIAS ENTRE C Y C++


Me han estado llegando comentarios y correos con dudas, correcciones y todo tipo de
insultos (no, eso ltimo no) y decid responder todos ellos con este post en el que aclarar lo
que es C y lo que es C++ y sus diferencias.
C fue creado en 1972 por Dennis M. Ritchie en los Laboratorios Bell como evolucin del
anterior lenguaje B, a su vez basado en BCPL.
C++, por su parte, fue creado a mediados de los aos 1980 por Bjarne Stroustrup. La
intencin de su creacin fue el extender al exitoso lenguaje de programacin C con
mecanismos que permitan la manipulacin de objetos.
As que C es el lenguaje original, mientras que C++ es una ampliacin de C, por eso el ++.
A mi cuando me ensearon a programar me dijeron que iba a aprender a programar en C++,
pero en verdad me ensearon nicamente C, as que muchos profesores en realidad no saben
lo que es programar en C++. Veamos un hola mundo en los dos programas:
En C
1#include<stdio.h>
2
3int main()
4{
5
printf ("Hola Mundo");
6
return 0;
7}

En C++
1#include<iostream>
2
3using namespace std;
4
5int main()
6{
7
cout << "Hola mundo";
8
return 0;
9}

Para el tipo de programas que se estarn mostrando en este blog la diferencia ms


importante es la entrada y salida de datos. As que veamos un ejemplo de entrada y salida
de datos de cada programa:

Tomado de http://codigoc.org
En C

1 #include<stdio.h>
2
3 int main()
4 {
5
int radio;
6
float area, perimetro;
7
8
// SALIDA: mensaje un pantalla
9
printf("Introduce el radio del circulo: ");
10
11
//ENTRADA: recibir dato desde teclado
12
scanf("%d", &radio);
13
14
// calculos
15
area = 3.1416 * radio * radio;
16
perimetro = 3.1416 * radio * 2;
17
18
//SALIDA: resultado en pantalla
19
printf("El area es %.2f y el perimetro %.2f", area, perimetro);
20
getch();
21
22
return 0;
23}

En C++
1 #include<iostream>
2 using namespace std;
3
4 int main()
5 {
6
int radio;
7
float area, perimetro;
8
9
// SALIDA: mensaje un pantalla
10
cout << "Introduce el radio del circulo: ";
11
12
//ENTRADA: recibir dato desde teclado
13
cin >> radio;
14
15
// calculos
16
area = 3.1416 * radio * radio;
17
perimetro = 3.1416 * radio * 2;
18
19
//SALIDA: resultado en pantalla
20
cout << "El area es " << area << " y el perimetro " << perimetro;
21
cin.get();cin.get();
22
23
return 0;
24}

Tomado de http://codigoc.org
Lo que not al hacer estos dos programitas es que pedir un dato en C++ es mucho mucho ms
simple que en C. Sin embargo, el asunto de los << y >> puede llegar a asustar a los recin
iniciados en la programacin.
Pedir un dato en C
scanf("modificador", &nombre de la variable);

Pedir un dato en C++


cin >> nombre de la variable;

Mostrar un dato en C
printf("Dato: modificador", nombre de la variable);

Mostrar un dato en C++


cout << "Dato: " << nombre de la variable;

Los modificadores son los siguientes: %d para int, %f para float, %s para string, %c para char.

Libreras en C++
Por simple convencin las libreras en C terminan en .h (punto hache). Todas las libreras
de C sirven para C++, sin embargo, tambin por convencin, se elimina la terminacin .h y
mejor se agrega c al principio.
Libreria en C

Librera en C++

math.h

cmath

string.h

cstring

time.h

ctime

etcetera.

El namespace
C como lenguaje tiene un conjunto de palabras reservadas, como por ejemplo: if, for, while,
int, float, C++ es una ampliacin, por lo tanto tiene que agregar nuevas palabras
reservadas. stas palabras reservadas estn en un namespace ( espacio de nombres). En
especfico cout y cin estn el namespace std (standard).
Si no declararamos que vamos a usar el namespace std (using namespace std;), cada vez que
quisieramos usar cout, tendramos que escribir std::cout.

Como declarar una variable en C++


C++ maneja varios tipos de variables: numricas, de caracteres y boolean ( cierto o falso)
esencialmente.
Para declarar una variable numrica llamada altura que inicie con un valor de 0, escribimos
esto:

Tomado de http://codigoc.org
int altura=0;

Para declarar una variable numrica llamada distancia que inicie con un valor de 2.67,
escribimos esto:
float distancia=2.67;

Para declarar una variable de caracter llamada inicial, con un valor de R, escribimos esto:
char inicial='R';

Para declarar una variable boolean llamada terminado, que empiece como falso, escribimos
esto:
bool terminado=false;

En resumen:

Para
Para
Para
Para

variables
variables
variables
variables

numricas sin decimales se usa: int


numricas con decimales se usa: float
de un solo caracter se usa: char
boolean se usa: bool

Como declarar varias variables en C++


Solo se pone el tipo de dato (int, float, char, bool) y separamos las variables con comas.
Ya sabemos cmo agregar variables a nuestros programas, pero cmo se usan?
Para mostrar el valor de una variable en pantalla con printf() se usan los caracteres de
sustitucin. Vean este programa:
#include<stdio.h>
#include<conio.h>
int main() //Esta es la funcin main, va en todos los programas
{
int numero=7; //A la variable numrica 'numero' le asignamos un valor de 7
printf("El numero es %i", numero); //Esto mostrar en pantalla: El nmero es 7
getch(); //Hace una pausa
}

Como ven, el valor de la variable aparece en lugar de %i, cada tipo de dato tiene su propio
caracter de sustitucin.

Para int se usa %i o %d


Para float se usa %f
Para char se usa %c

Tomado de http://codigoc.org
Otros ejemplos:
#include<stdio.h>
#include<conio.h>
int main()
{
int edad=17;
float altura=1.67;
printf("Edad: %i aos, altura: %f metros", edad, altura);
//Esto mostrar en pantalla: Edad: 17 aos, altura: 1.670000 metros
getch();
}

Para mostrar datos float, podemos usar este truco:

%f mostrar 0.000000
%.2f mostrar 0.00
%.1f mostrar 0.0
%.f mostrar 0

Posts Relacionados

Pedir datos en C++ scanf()


Variables en C++ 1 Lo bsico
Operaciones en C++
Cmo contar el nmero de veces que sucede algo

Operadores lgicos en C++


Con operadores de relacin nos referimos a los ya conocidos:

< (menor que)


<= (menor o igual que)
> (mayor que)
>= (mayor o igual que)
== (igual)
!= (diferente)
Bueno, tal vez los operadores de igual (==) y diferente (!=) no los hayan visto escritos as,
pero en C++ as se representan.
Una expresin con operadores de relacin (por ejemplo: a<b, a!=b) nicamente nos dice si la
evaluacin es verdadera (true) o falsa (false).
Tambin estn estos otros:

and, que significa y y se representa con &&


or, que significa o y se representa con || (alt+124 dos veces)

Tomado de http://codigoc.org
Sirven para relacionar dos o ms operaciones lgicas. Al usar && (y), las dos operaciones
tienen que ser verdaderas para que arroje un resultado verdadero, si no, es falso. Al usar ||
(o), las dos operaciones tienen que ser falsas para que arroje un resultado falso, si no, es
verdadero.

Ejemplos
Si a=4 y b=5 entonces,
a==b es false
a>b es false
a!=b es true
a==b && a<b es false
a==b || a<b es true

Operaciones en C++
Bien, ya sabemos declarar y mostrar variables, ahora solo falta saber cmo hacer
operacionesmatemticas con ellas. Una suma sera as:
#include<stdio.h>
#include<conio.h>
int main()
{
int num1=5, num2=10, resultado=0;
resultado=num1+num2;
printf("El resultado es: %i", resultado);
//Esto mostrar en pantalla: El resultado es: 15
getch();
}

Como ven, siempre hay que tener una variable para guardar el resultado de cualquier
operacin. En algunos casos se puede usar la misma variable:
#include<stdio.h>
#include<conio.h>
int main()
{
int num1=5;
num1=num1+6;
printf("El resultado es: %i", num1);
//Esto mostrar en pantalla: El resultado es: 11
getch();
}

Entonces, los signos de operacin en C++ y la mayora de los lenguajes de programacin


son:
+ para suma
- para resta
* para multiplicacin
/ para divisin

Tomado de http://codigoc.org
() Tambin indican multiplicacin

Operadores compuestos en C++


Los operadores (en cualquier lenguaje de programacin) son los smbolos que permiten
hacerle una operacin a una o ms variables. Los ms conocidos son los operadores
aritmticos:
+ Suma
- Resta
* Multiplicacin
/ Divisin
% Mdulo (residuo de la divisin)
Otros son los lgicos (&&, ||), los relacionales (<, >, !=, ==), etc. Pero en este post, como
dice el ttulo, vamos a ver los operadores compuestos en c++.
Cmo haramos para sumarle a una variable int, por ejemplo, 3 unidades? Alguien que nunca
hubiera programado escribira algo as:
mivar + 3;

Sabemos que eso no es vlido porque una suma retorna un valor ( el resultado) y ese valor
tiene que ser almacenado en una variable. En el cdigo anterior ese valor no se almacena en
ninguna variable, por lo tanto ERROR. Sabiendo esto ltimo podemos escribir esto:
mivar = mivar + 3;

En la variable mivar, guardamos el contenido de esa misma variable ms tres. Todo bien no?
eso es perfectamente vlido y normal, sin embargo los operadores compuestos nos permiten
hacer lo mismo con menos cdigo:
mivar += 3;

Como ven est inspirado en hacer que lo-primero-que-se-nos-ocurre sea posible.


As tenemos que:
mivar
mivar
mivar
mivar

=
=
=
=

mivar
mivar
mivar
mivar

+
*
/

3;
3;
3;
3;

es
es
es
es

lo
lo
lo
lo

mismo
mismo
mismo
mismo

que
que
que
que

mivar
mivar
mivar
mivar

+=
-=
*=
/=

3;
3;
3;
3;

Tomado de http://codigoc.org
Bueno, para ver un poco de la utilidad de estos operadores y hacindole un favor a un tal
Victor, vamos a ver un programa que imprima los mltiplos de un cierto nmero (introducido
por el usuario) que haya desde 1 hasta otro cierto nmero (introducido por el usuario):
#include<iostream>
using namespace std;
int main()
{
int num, lims, m=0;
cout << "Numero?: "; cin >> num;
cout << "Limite superior?: "; cin >> lims;
while(lims >= (m+=num))
{
cout << m << ", ";
}
}

Primero pedimos el nmero del cual queremos obtener mltiplos ( num), luego el lmite
superior (lims).m obtendr el valor de los mltiplos y lo tenemos que igualar a 0 al inicio.
Luego tenemos un ciclo while. En espaol dice: Me mantendr ejecutando mientras
el lims sea mayor o igual a m ms num. Dentro del ciclo mostramos la variable m.
Si, por ejemplo, num = 3, entonces la instruccin n+=num se desarrolla as:
m
m+=num;
----->
m+=num;
----->
m+=num;
----->
etc, etc.

m=
m=
m=

m
m
m

+
+
+

num;
num;
num;

=
-----> m
-----> m
-----> m

=
=
=

0
3
6

+
+
+

3;
-----> m
3;
-----> m
3;
----->
m

=
=
=

0;
3;
6;
9;

Aqu podra poner un otro programa an ms til para usar los operadores compuestos, pero
mejor lo dejo para el siguiente post. Ah y si t eres Victor, entonces tal vez te interese este
post: Cmo contar el nmero de veces que sucede algo.

Tomado de http://codigoc.org

Instrucciones de control
La estructura condicional if... else
En la gran mayora de los programas ser necesario tomar decisiones sobre qu acciones
realizar. Esas decisiones pueden depender de los datos que introduzca el usuario, de si se ha
producido algn error o de cualquier otra cosa.
La estructura condicional if... else es la que nos permite tomar ese tipo de decisiones.
Traducida literalmente del ingls, se la podra llamar la estructura "si...si no", es decir, "si se
cumple la condicin, haz esto, y si no, haz esto otro".
Un ejemplo sencillo sera el siguiente (no se trata de un programa completo, sino tan slo
una porcin de cdigo):
if (edad < 18)
printf("No puedes acceder.\n");
else
printf("Bienvenido.\n");

Este cdigo de ejemplo dice que si el valor de la variable edad es menor que 18 se imprimir
"No puedes acceder.\n", mientras que en caso contrario se imprimir "Bienvenido.\n".
Como se ve en el ejemplo, la estructura de un condicional es bastante simple:
if (condicin) {
sentencias_si_verdadero;
} else {
sentencias_si_falso;
}

La condicin, encerrada entre parntesis, es una expresin que puede dar como resultado 0
(interpretado como falso) o cualquier valor distinto de 0 (interpretado como verdadero).
Cuando la condicin sea verdadera, se ejecutarn las sentencias dentro del primer bloque de
cdigo, cuando la condicin sea falsa, se ejecutarn las sentencias del segundo bloque de
cdigo. Las expresiones y valores de tipo verdadero/falso son tambin llamados valores
lgicos o booleanos.
La indentacin o sangra (los espacios al comienzo de las lneas) no es necesaria, pero ayuda
a la claridad del cdigo. La utilizacin de las llaves {...} es obligatoria cuando se quiere
utilizar ms de una instruccin por bloque, y optativa cuando slo se quiere escribir una
instruccin. Por claridad, sin embargo, es recomendable utilizarlas an cuando slo vaya a
haber una instruccin.
El bloque del else es opcional. Si no se lo encuentra, slo se realizar la accin
correspondiente al bloque if.

Tomado de http://codigoc.org

A continuacin, un ejemplo con una funcin, que devuelve el mayor de dos nmeros:
int mayor(int a, int b)
{
if (b > a) {
return b;
}// No posee especificacin de la parte "else", ya que no es
necesaria.
return a; // Finaliza la funcin retornando el valor de "a".
}

Operadores lgicos
Los operadores && ("y"), || ("o") y ! ("no") son operadores lgicos. Permiten operar con
expresiones lgicas para generar expresiones ms complejas.
Por ejemplo: determinar si un ao es bisiesto o no. Los aos son bisiestos si son divisibles por
4, pero no si son divisibles por 100, a menos que tambin sean divisibles por 400.
if ( (!(a % 4) && ((a % 100))) || !(a % 400) )
printf("es un ao bisiesto.\n");
} else {
printf("no es un ao bisiesto.\n");
}

En realidad, teniendo en cuenta la prioridad de los operadores utilizados, podemos


simplificar la expresin anterior del siguiente modo:
if ( !(a % 4) && (a % 100) || !(a % 400) ) {
printf("es un ao bisiesto.\n");
} else {
printf("no es un ao bisiesto.\n");
}

Adems, como a cada rama del if le sigue una nica instruccin, podemos expresar la
expresin anterior del siguiente modo:
if ( !(a % 4) && (a % 100) || !(a % 400) )
printf("es un ao bisiesto.\n");
else
printf("no es un ao bisiesto.\n");

En este caso, se utiliza el operador mdulo (%), que obtiene el resto de la divisin entera de
un nmero por otro. Cuando un nmero es divisible por otro, el resto de su divisin entera
ser cero. Siendo que cero es equivalente a falso, y cualquier valor distinto de cero es
equivalente a verdadero, podemos usar el operador % para verificar si el nmero es mltiplo
de 4, de 100 o de 400.

10

Tomado de http://codigoc.org
Evaluacin de cortocircuito
La evaluacin en corto circuito es una caracterstica del lenguaje C que se utiliza para
optimizar la ejecucin de programas. Consiste en que el programa puede verificar si una
expresin es verdadera o falsa antes de haber evaluado toda condicin.
Por ejemplo, si se tiene una condicin como la siguiente:
if ((a > 2) || (b < 4)) {
...
}

Al ejecutarse el programa, se evaluar primero si a > 2. En el caso en que sea verdadero, no


continuar con la siguiente condicin, ya que el resultado ser de cualquier modo verdadero.
De la misma forma, si la condicin fuera:
if ((a > 2) && (b < 4)) {
...
}

En este caso, si no se cumple que a > 2, no se evaluar la siguiente condicin, ya que el


resultado ser falso de todos modos.
Esta caracterstica no tiene demasiada importancia al comenzar a programar, pero facilitar
ciertas operaciones y optimizaciones en programas avanzados.
La estructura condicional switch ... case
La estructura condicional switch ... case se utiliza cuando queremos evitarnos las llamadas
escaleras de decisiones. La estructura if nos puede proporcionar, nicamente, dos
resultados, uno para verdadero y otro para falso. Una estructura switch... case, por su parte,
nos permite elegir entre muchas opciones. Ejemplo:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int dia;
printf("que nmero de da de la semana es?");
scanf("%d",&dia);
switch(dia) {
case 1 :
printf("Lun, Lunes");
break;
case 2 :
printf("Mar, Martes");
break;
case 3 :
printf("Mier, Miercoles");
break;
case 4 :
printf("Jue, Jueves");
break;

11

Tomado de http://codigoc.org
case 5 :
printf("Vie, Viernes");
break;
case 6 :
printf("Sab, Sabado");
break;
case 7 :
printf("Dom, Domingo");
break;
default :
printf("No existe");
}
return 0;
}

La estructura anterior, de realizarse con sentencias if, necesitara cuatro de ellas,


resultando un enorme bloque muy difcil de leer. En la mayora de los casos, adems, la
sentencia switch proporciona una ganancia en velocidad del cdigo, pues permite al
compilador trabajar en base a que se trata de una decisin mltiple para una nica variable,
cosa que con sentencias if el compilador no tiene por qu detectar.
Como vemos, para cada valor de la variable se ejecuta un bloque de sentencias distinto, en
el que no necesitamos llaves. Hay un caso especial, default, que se ejecuta si ningn otro
corresponde, y que no es necesario poner. Es, en todo, equivalente al bloque else de una
sentencia if.
Las sentencias break son muy importantes, ya que el comportamiento normal de un bloque
switch es ejecutarlo todo desde la etiqueta case que corresponda hasta el final. Por ello, si
no queremos que se nos ejecute ms de un bloque, pondremos sentencias break al final de
cada bloque excepto el ltimo.
Es decir, las etiquetas case son puntos de entrada de la ejecucin, y no implican que al
acabarse el bloque case la ejecucin salte al final del bloque switch. Las etiquetas case
siguientes a la que hemos utilizado para entrar son, sencillamente, ignoradas.
A la ausencia de sentencias break se le llama, en ocasiones, "dejar caer la cascada switch".
El bucle while
El bucle while sirve para ejecutar cdigo reiteradas veces.
while (/*condicion*/) {
/* Cdigo */
}

La condicin debe de ser una expresin lgica, similar a la de la sentencia if. Primero se
evala la condicin. Si el resultado es verdadero, se ejecuta el bloque de cdigo. Luego se
vuelve a evaluar la condicin, y en caso de dar verdadero se vuelve a ejecutar el bloque. El
bucle se corta cuando la condicin da falso.

12

Tomado de http://codigoc.org
Ejemplo: imprimir los nmeros de 0 a 99:
int i = 0;
while (i < 100) {
printf("%d\n", i);
i = i + 1;
}

El bucle for
El bucle for es un bucle muy flexible y a la vez muy potente ya que tiene varias formas
interesantes de implementarlo, su forma ms tradicional es la siguiente:
for (/* inicializacin */; /* condicin */; /* incremento */)
{
/* cdigo a ejecutar */
}
Inicializacin: en esta parte se inicia la variable que controla el bucle y es la primera
sentencia que ejecuta el bucle. Slo se ejecuta una vez ya que solo se necesita al principio
del bucle.
Expresin condicional: al igual que en el bucle while, esta expresin determina si el bucle
continuar ejecutndose o no.
Incremento: es una sentencia que ejecuta al final de cada iteracin del bucle. Por lo
general, se utiliza para incrementar la variable con que se inicio el ciclo. Luego de ejecutar
el incremento, el bucle revisa nuevamente la condicin, si es verdadera tiene lugar una
ejecucin ms del cuerpo del ciclo, si es falsa se termina el ciclo y as.
Aqu se muestra el mismo ejemplo visto para el bucle while, pero implementado con un
bucle for:
int i;
for (i=0; i < 100; i = i + 1)
{
printf("%d\n", i);
}

Nota: En C, la sentencia i = i + 1 puede escribirse en forma ms reducida como i++. Esta


forma se utiliza ms comnmente en el bucle for:
int i;
for (i=0; i < 100; i++) {
printf("%d\n", i);
}

13

Tomado de http://codigoc.org

El bucle do...while
El bucle do...while es un bucle que, por lo menos, se ejecuta una vez. Do significa
literalmente "hacer", y while significa "mientras"
Su forma es esta:
do {
/* CODIGO */
} while (/* Condicin de ejecucin del bucle */)

Un ejemplo sencillo de uso:


int aleatorio;
do {
aleatorio = rand();
} while (aleatorio != 25);

La verdad es que este ejemplo puede resultar un poco absurdo, pero es bastante intuitivo. El
cdigo del bucle asigna un valor aleatorio a la variable definida anteriormente, y mientras
esa variable no tenga el valor 25, el bucle sigue ejecutndose.
La sentencia goto
La sentencia goto sirve para indicar al programa que continue ejecutndose desde la lnea de
cdigo indicada. Su sintaxis es ms o menos as:
/* Cdigo */
ETIQUETA:
/* Cdigo */
goto ETIQUETA;
/* Cdigo */

As, cuando se ejecute la sentencia goto, el programa "saltar" y continuar su ejecucin a


partir de la etiqueta marcada.
Como se puede observar se puede usar para crear un bucle, o para ir a una parte del cdigo
u otra si se combina con una sentencia if...else. Pero por lo general puede obtenerse el
mismo efecto utilizando los bucles anteriormente vistos.
Por eso, la sentencia goto es poco aceptada por la comunidad de programadores, pues
puede provocar que se hagan programas un poco "sucios" y confusos. Slo en ocasiones muy
excepcionales ser recomendado el uso del goto al crear iteraciones muy complejas. Sin
embargo, con el pasar de los aos este comando ya ha quedado prcticamente descartado
del lenguaje de los programadores.
Han pagado algn recibo en una mquina automtica y se han preguntado cmo ser el
programa que les devuelve el cambio? Lo ms seguro es que no, pero pues resulta que el
profesor de Miguel ngel le encarg un programa que simulara eso, en sus propias palabras:
Supn que una mquina de monedas de 10,5,2,1 y 50 centavos. Debes escribir un programa
que decida cuantas monedas dar de cambio, dando prioridad las de mayor denominacin.

14

Tomado de http://codigoc.org
Debe recibir como entrada la cantidad de dar a cambio. Ejemplo: para $40.50 ser 4 de 10, 0
de 5, 0 de 2, 0 de 1 y 1 de 50 centavos.

As que el primer problema se presenta con la entrada cmo hacer que el usuario introduzca
slo cantidades como $50 o $43.50 y no cantidades como $23.45 o $9.70?
Lo que se me ocurri es pedir la cantidad en una variable float ( cambio), en otra variable
convertir esa cantidad a tipo int (cambioint). En ese proceso se perder la parte decimal del
nmero, as que si la resta cambio cambioint es igual a 0 o igual a 0.50, la cantidad que
introdujo el usuario es correcta.
La otra parte es sencilla, slo se necesita ver si la variable cambio es mayor que 10. Si si, se
le restan 10 a la variable y se aumenta un contador. Luego se hace lo mismo con las dems
monedas.
Pero bueno, el programa es este:
1 #include<iostream>
2 using namespace std;
3
4 int main()
5 {
6
float cambio; int cambioint, m10=0, m5=0, m2=0, m1=0, m50c=0;
7
do
8
{
9
cout << "Cambio?: "; cin >> cambio;
10
cambioint = (int)cambio;
11
}while((cambio - cambioint) != 0 && (cambio - cambioint) != 0.50);
12
while(cambio != 0)
13
{
14
if(cambio>=10)
15
{
16
m10++;
17
cambio-=10;
18
}
19
else if(cambio>=5)
20
{
21
m5++;
22
cambio-=5;

15

Tomado de http://codigoc.org
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41}

}
else if(cambio>=2)
{
m2++;
cambio-=2;
}
else if(cambio>=1)
{
m1++;
cambio-=1;
}
else if(cambio>=0.5)
{
m50c++;
cambio-=0.5;
}
}
cout << m10 << ", " << m5 << ", " << m2 << ", " << m1 << ", " << m50c;

Solo le faltara darle un poco de formato a la salida, pero pues ya es cuestin de gustos y ya
saben, cualquier duda aqu estn los comentarios abajo.

Primo o no SIN CICLOS! en C++


Me preguntaban en los comentarios de este post: Primo o no, que si habra alguna forma de
hacer ese mismo programa pero sin ciclos. Mmmm
Pues mi primera respuesta es no. Pero hay una forma muy burda de aproximarse a l. El
siguiente programa es para calcular si un nmero es primo o no sin ciclos y es infalible
hasta el 168, a partir de ah puede que le atine o puede que no.
#include<iostream>
using namespace std;
int main()
{
int n;
cout << "Introduce un numero: "; cin >> n;
if(n!=2 & n%2==0)
cout << "No es primo";
else
{
if(n!=3 & n%3==0)
cout << "No es primo";
else
{
if(n!=5 & n%5==0)
cout << "No es primo";
else
{

16

Tomado de http://codigoc.org
if(n!=7 & n%7==0)
cout << "No es primo";
else
{
if(n!=11 & n%11==0)
cout << "No es primo";
else
{
cout << "Es primo";
}
}
}
}
}
}

Como vemos, primeramente checa si n es igual a 2; si no, checa si el residuo de n/2


es cero. Si si, no es primo; si no, sigue.
Luego checa si n es igual a 3; si no, checa si el residuo de n/3 es cero. Si si, no es
primo; si no, sigue.
Lo mismo con el 5, el 7 y el 11.
Con eso obtenemos un buen nmero de nmeros en los que estamos seguros que no
fallaremos. Si agregamos el 13, agrandamos esa cantidad; y an ms con el 17, el 19,
como en esta versin optimizada, que tiene su primer error con el 1681 ( que no es primo)
#include<iostream>
using namespace std;
int main()
{
int n;
cout << "Introduce un numero: "; cin >> n;
if((n!=2 & n%2==0)||(n!=3 & n%3==0)||(n!=5 & n%5==0)||(n!=7 & n%7==0)||
(n!=11 & n%11==0)||(n!=13 & n%13==0)||(n!=17 & n%17==0)||(n!=19
n%19==0)||
(n!=23 & n%23==0)||(n!=29 & n%29==0)||(n!=31 & n%31==0)||(n!=37
n%37==0))
cout << "No es primo";
else
cout << "Es primo";
}

&
&

Pero pues de eso no se trata, los ciclos son para evitar las cantidades interminables de ifs,
as que usmoslos.
Ah y recuerden que si corren un programa y su compilador no se pausa solo, tienen que
agregar cin.get();cin.get(); al final del programa, antes de la llave de cierre del main.
Si llegaste aqu buscando un programa para saber si un nmero es primo o no, sigue el link
que est al principio del post

17

Tomado de http://codigoc.org

Programa: Porcentaje de Hombres y Mujeres


Supongamos que nos preguntan qu porcentaje de hombres y qu porcentaje de mujeres
hay un saln de clases. Lo primero que tenemos que hacer es preguntar el total de personas
que hay, luego hacer un ciclo que en cada iteracin pregunte el sexo de cada alumno. En
base a esos datos se calculan los porcentajes.
El programa en c++ sera as:

18

Tomado de http://codigoc.org
#include<stdio.h>
#include<conio.h>
int main()
{
float total=0,ciclo=0,conta_h=0,conta_m=0,porc_h=0,porc_m=0;
char mof;
gotoxy(5,5);printf("Cuantos alumnos hay en este grupo?: ");scanf("%f",&total);
for(ciclo=1;ciclo<=total;ciclo++)
{
clrscr();
PREG:
gotoxy(10,6);printf("Sexo
de
alumno
%.f?
(M
o
F):
",ciclo);scanf("%c",&mof);
if(mof=='m' || mof=='M')
conta_h++;
else if(mof=='f' || mof=='F')
conta_m++;
else
goto PREG;
}
//Calculos
porc_h=conta_h/total*100;
porc_m=conta_m/total*100;
//
gotoxy(5,5);printf("El
porcentaje
de
hombres
es
%.1f
(%.f
de
%.f)",porc_h,conta_h,total);
gotoxy(5,6);printf("El
porcentaje
de
mujeres
es
%.1f
(%.f
de
%.f)",porc_m,conta_m,total);
getch();
}

if else anidados en c++


Ya haba escritos varios posts sobre las condiciones if else en c++, pero algo que hace falta
saber es que dentro de una estructura if puede haber otra estructura if tantos veces como
sea necesario. Es decir:
if ( condicion )
{
instrucciones

19

Tomado de http://codigoc.org
if ( condicion )
{
instrucciones
}
}
else
{
if ( condicion )
{
instrucciones
}
else
{
instrucciones
}
instrucciones
}

Y como para qu? Pues hay algunas situaciones que as lo requieren. Por ejemplo:
Si un alumno tiene un promedio mayor o igual a 9 se le hara un 20% de descuento en la
colegiatura, si tiene un promedio mayor o igual a 8 pero menor que 9 el descuento ser del
10%, si su promedio es menor que 8 pero mayor o igual a 7 el descuento ser del 5% y si
promedia con 7 o menos no tendr descuento.
La solucin de este problema en c++ sera as:

Programa: Aprob o no aprob?


Tambin es muy comn entre los profesores, encargar este tipo de programas una vez que se
ven las condiciones. De lo que se trata es de pedir, por ejemplo, 3 calificaciones, sacar el
promedio y mostrar un mensaje si el alumno aprob o no aprob.
Como el promedio puede ser un valor con decimales, tenemos que declarar las variables
como tipo float.

#include<stdio.h>
#include<conio.h>
int main()
{
float calif_1=0,calif_2=0,calif_3=0,promedio=0;
printf("\nIntroduce tu primera calificacion: ");scanf("%f",&calif_1);
printf("\nIntroduce tu segunda calificacion: ");scanf("%f",&calif_2);
printf("\nIntroduce tu tercera calificacion: ");scanf("%f",&calif_3);

20

Tomado de http://codigoc.org
promedio=(calif_1+calif_2+calif_3)/3;
if(promedio<6)
{
printf("\n\tLo siento, tu promedio de %.2f no es aprobatorio",promedio);
}
else
{
printf("\n\tFelicidades, pasaste con un %.2f",promedio);
}
getch();
}

Aqu estamos asumiendo que la calificacin mnima aprobatoria es de 6, pero y si quiero que
este dato tambin sea variable? Entonces el programa quedara as:

Programa: Qu tipo de tringulo es?


Ok, hasta hoy ya hemos visto las herramientas necesarias para hacer nuestro primer
programa un poco ms en serio. Este programa nos pide la medida de los tres lados de un
tringulo y nos devuelve el tipo de triangulo que es (equiltero, issceles o escaleno).
Para esto vamos a usar condiciones en C++ para comparar los lados de nuestro tringulo.
Un tringulo equiltero tiene sus tres lados iguales, por tanto, la condicin quedara as:
si el lado 1 es igual al lado 2 y el lado 2 es igual al lado 3, entonces es equiltero
Un tringulo issceles tiene solo dos lados iguales, por tanto, la condicin quedara as:
si el lado 1 es igual al lado 2 y el lado 2 es diferente al lado 3, oel lado 2 es igual al lado 3 y
el lado 3 es diferente al lado 1, oel lado 3 es igual al lado 1 y el lado 1 es diferente al lado 2
entonces es issceles
Un tringulo escaleno tiene sus tres lados diferentes, por tanto, la condicin quedara as:
si el lado 1 es diferente al lado 2 y el lado 2 es diferente al lado 3 y el lado 3 es diferente al
lado 1, entonces es escaleno

Pero vamos a lo bueno. El programa completo en C++, sera as:


#include<stdio.h>
#include<conio.h>
int main()
{
//Declaracion de variables
int lado1=0,lado2=0,lado3=0;

21

Tomado de http://codigoc.org
//Pedir los datos
printf("TIPOS DE TRIANGULOS");
printf("\nIntroduce el lado 1: ");scanf("%i",&lado1);
printf("\nIntroduce el lado 2: ");scanf("%i",&lado2);
printf("\nIntroduce el lado 3: ");scanf("%i",&lado3);
//Hacer comparaciones
if(lado1==lado2 && lado2==lado3)
{ printf("\n\tEs equilatero"); }
if(lado1==lado2 && lado2!=lado3 || lado2==lado3 && lado3!=lado1 || lado3==lado1
&& lado1!=lado2)
{ printf("\n\tEs isosceles"); }
if(lado1!=lado2 && lado2!=lado3 && lado3!=lado1)
{ printf("\n\tEs escaleno"); }
//Pausa
getch();
}

Aprovecho para explicarles un detalle ms. \n (alt+92 n) dentro de un printf(); indica un


salto de lnea, y \t (alt+92 t) indica una sangra o tabulado o algo de espacio.

Condiciones (decisiones) en C++ if, else


Cmo haran para saber si alguien es mayor o menor de edad? Creo que los pasos seran:
1. Preguntarle su edad
2. Si tiene 18 o ms entonces es mayor de edad
3. Si no, es menor de edad
Metiendonos al lenguaje de C++, quedara algo as:
1. scanf(%d, &edad);
2. if(edad>=18) { printf(Es mayor de edad); }
3. else { printf(Es menor de edad); }
if significa si y else significa si no
edad>=18 es una comparacin. Si la variable edad es mayor o igual a 18, se hacen las
instrucciones que estn entre las llaves {} del if; si no es as, se realizan las instrucciones
que estn entre las llaves del else.
El programa en s quedara de la siguiente forma:
#include<stdio.h>
#include<conio.h>
int main()
{
int edad=0;
printf("Cual es tu edad?: "); scanf("%d",&edad);

22

Tomado de http://codigoc.org
if(edad>=18)
{
printf("Eres mayor de edad");
}
else
{
printf("Eres menor de edad");
}
getch();
}

Un if no tiene que tener un else a fuerzas, es opcional. Es muy importante que se fijen muy
bien en las llaves, cada if tiene su llave de apertura y de cierre, al igual que el else.

Funciones en C++
Supongo que ya es hora de retomar el blog y ponerme a hablar de funciones en c++. Una
funcin es un pedazo de cdigo fuera del main, con un nombre y que puede ser llamado
desde otra parte de nuestro programa.
Imagnense que estn entrenando a su perro a hacerse el muertito. Cada vez que ustedes
dicen muertito, el perro se tira de espaldas en el suelo, cierra los ojos y saca la lengua. En
programacin, el contenido de la funcin sera tirarse de espaldas, cerrar los ojos y sacar la
lengua; el nombre de la funcin sera muertito; y cada vez que nosotros decimos muertito
estamos llamando a la funcin.
Nuestra funcin sera algo as:
void muertito()
{
Perro.Tirarse(posicion='espalda');
Perro[OjoDer].Cerrar();
Perro[OjoIzq].Cerrar();
Perro[Lengua].Sacar();
}

Jajaja, bueno, bueno. Ya en serio vamos a hacer un clsico Hola Mundo pero usando una
funcin:
#include<iostream>
using namespace std;
void hola()
{
cout << "Hola Mundo!";
}

23

Tomado de http://codigoc.org
int main()
{
hola();
}

Como ven, esta funcin es muy estpida. No nos beneficia en nada y nos hace escribir ms
cdigo del necesario, pero nos sirve para ver cmo acta una funcin: al momento de llamar
a la funcin, el compilador se brinca a la funcin, la ejecuta y cuando termina, vuelve al
punto desde donde brinc.
Si pudieran leerle la mente a un compilador, este dira:
Linea
1.
Incluir
la
librera
iostream.
OK
Linea
2.
Usar
el
namespace
estndar.
OK
Linea
3.
Oh!
una
funcin
llamada
hola,
la
recordar.
Linea
4.
Llave.
Parte
de
la
funcin.
Ignorar
Linea
5.
Imprimir
Hola
Mundo!.
Parte
de
la
funcin.
Ignorar
Linea
6.
Llave.
Parte
de
la
funcin.
Ignorar
Linea
7.
Por
fin
el
main!
Linea
8.
Llave.
Entrar
Linea 9. Esta funcin se me hace conocida oh s ya recuerdo. Ejecutar lineas 4, 5 y 6
Linea 10. Llave. Salir
Ahora veamos una funcin que s nos es til:
#include<iostream>
using namespace std;
void hola(char nombre[50])
{
cout << "Hola " << nombre << "!";
}
int main()
{
char nombre[50];
cout << "Cual es tu nombre?: "; cin.getline(nombre, 50, '\n');
hola(nombre);
}

Primero pedimos un nombre, lo guardamos en una variable y se le mandamos a la funcin


para que lo muestre.
No se preocupen, si nunca haban visto una funcin tal vez no entiendan la sintaxis, pero el
objetivo de este post es que sepan qu es una funcin y para qu se puede usar. En el
siguiente post voy a explicar la sintaxis de los cuatro tipos de funciones en c++.

Tipos de funciones en C++


Los tipos de funciones en c++ son 4, aunque en realidad son las combinaciones de las 2
cosas que una funcin puede hacer.

24

Tomado de http://codigoc.org
Una funcin, como les deca, puede hacer (o no) dos cosas: 1 Recibir datos y 2 Retornar
datos. De esto surgen los cuatro tipos de funciones:
1.
2.
3.
4.

No reciben ni retornan
Reciben y no retornan
No reciben y retornan
Reciben y retornan

Vamos a hacer un programa que sume dos nmeros, usando los cuatro tipos de funciones:

No reciben ni retornan
Las ms sencillas. Para usarlas slo tenemos que saber cmo crearlas y cmo llamarlas. Una
funcin 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 funcin: cualquiera que empiece con una letra, que sea
significativo y que no sea una palabra reservada.
Para llamarlas slo hay que escribir el nombre de la funcin seguido de sus parntesis y un
punto y coma (;).
nombre();

As nuestro programa sera:


#include<iostream>
using namespace std;
void sumar()
{
int num1, num2, r;
cout << "Numero 1: "; cin >> num1;
cout << "Numero 2: "; cin >> num2;
r = num1 + num2;
cout << "La suma es " << r;
}
int main()
{
sumar();
}

Como ven, todo lo que habramos puesto en nuestro main mejor los pusimos en una funcin y
desde el main la llamamos. Una funcin siempre, siempre, siempre tiene que ir antes del
main.
Una funcin de este tipo que hemos usado muchas veces es getch();

25

Tomado de http://codigoc.org

Reciben y No Retornan
Cmo haramos para pedir los dos nmeros en el main y que la funcin haga la suma? Para
eso tenemos que hacer una funcin capaz de recibir datos, entonces la sintaxis cambia un
poco:
tipo nombre(tipo_var1 nombre_var1, tipo_var2 nombre_var2){}

tipo y nombre se refieren a lo mismo y como no retorna el tipo siempre es void.


Dentro del parntesis tenemos otros aspectos:
tipo_var1 se refiere al tipo de la variable que nuestra funcin va a recibir.
nombre_var1 se refiere al nombre de esa variable.
Si queremos recibir una variable hasta ah es suficiente, si queremos otra variable ponemos
una coma (,) y declaramos la siguiente variable.
Para llamar la funcin hay que poner las variables que vamos a enviar dentro del parntesis
en el mismo orden en que las declaramos en la funcin:
nombre(var1, var2);

Nuestro programa quedara as:


#include<iostream>
using namespace std;
void sumar(int num1, int num2)
{
int r;
r = num1 + num2;
cout << "La suma es " << r;
}
int main()
{
int num1, num2;
cout << "Numero 1: "; cin >> num1;
cout << "Numero 2: "; cin >> num2;
sumar(num1, num2);
}

Pedimos los dos nmeros en el main, los enviamos a la funcin, sta los suma y los muestra.
Una funcin de este tipo que hemos usado muchas veces es el odiado por muchos, amados
por otros, gotoxy(x,y);

26

Tomado de http://codigoc.org

Retornan y No Reciben
Y si ahora queremos lo contrario? Pedir los nmeros en la funcin, pero mostrar el resultado
en el main. Para eso necesitamos una funcin que retorne.
Recibir es enviar datos del main a la funcin. Retornar es enviar datos de la funcin 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 funcin es int.
Para indicar qu variable estamos retornando usaremos la palabra return seguido de la
variable. Usualmente esto va al final de la funcin.
Para llamar a la funcin hay que preparar un colchn en donde caiga la variable que est
retornando.
var = nombre();

La variable que est retornando nuestra funcin 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 funcin no es la
misma que la variable var de la funcin; 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 quedara as:
#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;
}

A alguien se le ocurre una funcin conocida de este tipo?

27

Tomado de http://codigoc.org

Reciben y Retornan
Ahora queremos que nuestra funcin nicamente sume, el main se va a encargar de pedir los
nmeros y sumar los resultados. Para eso necesitamos que nuestra funcin reciba las
variables y adems retorne el resultado. Wow! Es acaso eso posible? Claro que s.
Es slo cuestin de combinar las funciones que reciben y no retornan con las que retornan y
no reciben.
Nuestro programa quedara as:
#include<iostream>
using namespace std;
int sumar(int num1, int num2)
{
int r;
r = num1 + num2;
return r;
}
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;
}

Las funciones de la librera math.h son en su mayora de este tipo. sqrt(); pow(); sin();
En principio puede parecer que las funciones sirven nicamente para organizar el cdigo, lo
cual es cierto, pero no slo eso. Se imaginan si tuviramos que escribir todo el cdigo detrs
de un simple gotoxy();? Ah verdad
Bueno, no me iba a quedar tranquilo si no les mostraba la versin optimizada de la ltima
funcin:
#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);
}

28

Tomado de http://codigoc.org

29

You might also like