You are on page 1of 10

Ejercitario de C++

Propiedad exclusiva de Team Compu


Bueno, bsicamente hice esto porque ya queda poco tiempo para el parcial de
computacin y quiero que se vayan en el mejor estado posible. Al comienzo hay
un poco de teora y ejemplos para entender cmo funciona cada cosa y al fondo
hay ejercicios que encontr y otros que escrib.

Hecho por Juan Jos Cabrera Ugarte

Team Compu - C++


En la portada ya haba dicho que tenemos poco tiempo, y capaz a muchos no les guste
esta parte, pero para poder entender como programar tenemos que conocer lo bsico (y
perdnenme si desde donde empiezo ya es MUY bsico).

Formato general del programa:


Para explicar las partes de un programa recurriremos al clsico primer programa en C++ Hola
Mundo!:
1
2
3
4
5
6
7
8

// mi primer programa en C++


#include <iostream>
using namespace std;

Hola Mundo!

int main()
{
cout << "Hola Mundo!";
}

Bsicamente todo programa tiene esta estructura, pero vamos a explicar qu pasa:
La primera lnea empieza con // esto significa que es un comentario que el
compilador no debe procesar, sino que solo est ah para otras personas que capaz
lean el cdigo. Esto funciona para escribir un comentario de una lnea, pero para
escribir varias lneas se recomienda usar /*
*/ y todo lo que este entre esos
smbolos se considera comentario, aunque estn en diferentes lneas.
En la segunda lnea se observa un #include este comando sirve para agregar libreras.
Las libreras contienen los comandos que usamos para escribir el cdigo. Entre las ms
comunes estn <iostream>, <math.h>, <time.h> y <stdlib.h>. En nuestro compilador es
necesario escribir siempre que usemos <iostream> la frase using namespace std;,
aunque hay formas de evitar este paso son en general mucho ms complicadas y no
tiene sentido tanto trabajo para no escribir una lnea.
En la quinta lnea podemos leer int main(), esto es conocido como la funcin
principal, y es donde escribimos la mayor parte de nuestro cdigo. Para definir lo que
est escrito dentro de esta funcin existen las llaves { }, que son indispensables al
programar.
Los programas difieren en complejidad y tamao, pero todos se suelen guiar por lo que escrib
arriba. Como esto es demasiado bsico para todos pasamos a lo siguiente.

Tipos de variables:
En la programacin las variables son lo ms fundamental que puede existir. No obstante,
pueden complicarse un poco las cosas si no sabemos muy bien cmo funcionan
int: Probablemente el tipo ms usado, slo admite nmeros enteros y en caso de
cargarles un nro decimal como 1.24 el slo considera la parte entera y lo que en
realidad carga es 1.
float y double: Son los tipos decimales, si bien parecen iguales lo que los diferencia es
el tamao que poseen. Un double acepta casi todos los valores que podemos imaginar,
es por ello la variable ms grande que podemos utilizar.

char: Es el tipo de dato carcter (de ah viene su nombre), y es el que se utiliza para
las letras y los caracteres especiales. Pero este tipo tiene algo especial, para cargar los
valores, dichos valores deben estar entre comillas simples (char a = m ;).
bool: Es el tipo lgico, se utiliza en programas con muchas condiciones o de gran
complejidad usualmente. Slo admite dos valores o estados, true o false.

Llamamos declarar una variable a escribir el tipo de variable seguido de su nombre, por
ejemplo int k, o float m. Y llamamos inicializar una variable a asignar un valor a la par que se
declara, por ejemplo int k=3, o char m=x.
Algunos errores comunes que ocurren cuando no entendemos bien cmo funcionan los tipos
que mencion arriba son:
Al operar con %(resto): Este operador solo acepta enteros, si se usan otros tipos es
necesario escribir int(variabe1) % int(variable2) o de lo contrario habr un error.
Sumar tipos char: Si bien podemos hacer char a=n, b=o; la suma de ellos no
producir la palabra no, sino que dar un nmero. Esto se debe a que al escribir a+b,
el compilador tomar las representaciones numricas de dichas letras y las sumar (en
el caso anterior lo que pasara es que la suma ser 221).

Operadores lgicos:
Los operadores lgicos son la base para la toma de decisiones en un lenguaje de
programacin. Los ms utilizados son los siguientes:
&&
Y
a==0 && b==1
||
O
a==0 || b==1
!
NO
!(a<0)
<
MENOR QUE
a<b
<= MENOR O IGUAL QUE
a<=b
>
MAYOR QUE
a>b
>= MAYOR O IGUAL QUE
a>=b
==
IGUAL QUE
a==b
!=
DISTINTO DE
a!=int(a)
Tengan cuidado de no confundir = con ==, el primero es de asignacin mientras que el segundo
es para comparacin.

Bucles y estructuras de seleccin:


Saber usar las variables a veces no es suficiente, a veces necesitamos repetir comandos varias
veces o condicionar que dependiendo de lo que ocurre tome diferentes acciones, lo que
usamos para esos casos vamos a ver ahora:
Sentencia if: Bsicamente lo que hace es verificar una condicin y actuar segn ello. En
el ejemplo imprime en pantalla x es positivo porque eso es lo que condicionamos que
haga si x>0. Es posible escribir la sentencia sin utilizar if else o else, pero para usar los
ltimos es indispensable escribir primero un if.

1
2
3
4
5
6
7
8
9
10
11
12
13
14

// ejemplo del if
#include <iostream>
using namespace std;
int main()
{
int x = 2;
if (x > 0)
cout << "x
else if (x <
cout << "x
else
cout << "x
}

x es positivo

es positivo";
0)
es negativo";
es 0";

Bucle while: Esto es un bucle, lo que significa que repetir la accin mientras se
verifique la condicin, que en este caso era n>0. Esto tiene una variacin que es el
bucle do-while, la nica diferencia con respecto al ejemplo sera que en el while se
verifica la condicin y luego se realiza lo que est entre llaves, mientras que el do-while
realiza lo que est entre llaves y luego verifica la condicin para volver a trabajar.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

// cuenta regresiva usando while


#include <iostream>
using namespace std;
int main ()
{
int n = 10;
while (n>0)
{
cout << n << "\n";
--n;
}

10
9
8
7
6
5
4
3
2
1
Despegue!

cout << "Despegue!\n";


}

Bucle for: Es un bucle al igual que while pero a diferencia de l, el for no necesita una
lnea para aumentar o reducir el valor de n, ya que esto ya est dentro de su sintaxis.
Es preferible usar un for cuando se saben ambos extremos del intervalo a recorrer, sin
embargo, cuando no se conoce uno de los extremos es preferible utilizar while.
1
2
3
4
5
6
7
8
9
10
11
12
13

// cuenta regresiva usando for


#include <iostream>
using namespace std;
int main ()
{
for (int n=10; n>0; n--)
{
cout << n << "\n";
}
cout << "Despegue!\n";
}

10
9
8
7
6
5
4
3
2
1
Despegue!

Tambin existen la sentencia switch(que es recomendable cuando existen muchas


posibilidades) y los comandos break(sirve para terminar un bucle), goto(sirve para ir a una
parte especfica del programa, ignorando bucles y cualquier otro ciclo activo) y continue(sirve
para saltear un ndice en el bucle).
Admito que no estn bien explicados y seran ms fciles de entender con ejemplos, pero
prefiero explicarles cuando vengan a mi casa como funcionan.

Funciones:
Hasta ahora fue un repaso de lo que siempre vimos, pero ac es donde la cosa se pone
interesante.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

// funcion de ejemplo
#include <iostream>
using namespace std;

La suma es 8

int suma (int a, int b)


{
int r;
r=a+b;
return r;
}
int main ()
{
int z;
z = suma (5,3);
cout << "La suma es " << z;
}

En el ejemplo podemos observar cmo trabaja una funcin, se les llaman parmetros a los
valores que recibe y cmo podemos observar tambin se debe especificar el tipo de variables
que son. En este ejemplo la funcin se escribi arriba del main, pero lo correcto es como se
muestra a continuacin.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

// funcion de ejemplo
#include <iostream>
using namespace std;
int suma (int a, int b);
int main ()
{
int z;
z = suma (5,3);
cout << "La suma es " << z;
}
int suma (int a, int b)
{
int r;
r=a+b;
return r;
}

La suma es 8

Esa lnea que est entre el main y el include lleva el nombre de prototipo de la funcin y eso
como le decimos al programa que existe una funcin del tipo int llamada suma. Vendra a ser
lo mismo que declarar la funcin.
As como en las variables, existen diferentes tipos de funciones, estos tipos determinar el tipo
de variable que devuelven al ejecutarse. Los tipos son char, int, double y float, aunque existe
uno ms que se llama void. Este ltimo es una funcin que no devuelve valores (no usa la lnea
return) y generalmente se usa para cosas como imprimir frases, vectores o trabajar con
parmetros especiales.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

// ejemplo de void
#include <iostream>
using namespace std;

Funcion void: 5

void print (int a);


int main ()
{
print (5);
}
void print (int a)
{
cout << "Funcion void: " << a;
}

Existe una forma de escribir funciones que evita el uso de bucles, que bsicamente consiste en
llamarse a s misma mientras cumpla ciertas condiciones. A dichas funciones se las llama
funciones recursivas y el truco que se debe tener en cuenta para utilizarlas es considerar un
(raras veces son ms de uno) caso base en el cual sabemos el valor que toma la funcin y un
caso general que seran las dems alternativas.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

// factorial con recursividad


#include <iostream>
using namespace std;
double factorial (int a);
int main ()
{
int number = 9;
cout << number << "! = " << factorial (number);
}
double factorial (int a)
{
if (a > 1)
return (a * factorial (a-1));
else
return 1;
}

9! = 362880

Antes dijimos que int main() era la funcin principal, y como dice int al comienzo retorna un
valor entero al finalizarse (por eso si se intenta compilar un programa mientras otro est
abierto sale el error ID status 1, ya que al terminar de ejecutarse el main normalmente
devuelve un 0).

Vectores y matrices:
Pongo los dos en la misma categora porque son, en esencia, lo mismo. Una vector es una serie
de elementos del mismo tipo colocado en ubicaciones de memoria contiguas que pueden ser
referenciados individualmente a travs de un ndice. Las matrices son, bsicamente, varios
vectores fila uno encima del otro o vectores hechos por vectores.
Los vectores y las matrices tienen los mismos tipos que cualquier variable, pero para
declararse son diferentes a las variables comunes:

Conociendo la
cantidad de
componentes
Conociendo las
componentes

Vector

Matriz

int v[a];

int m[a][b];

int v[]={1,2,3};

Int m[][2]={1,2,3,4};

Si se desea crear una matriz dados los componentes la primera casilla (de las filas) puede
dejarse vaca, no obstante, la de las columnas debe escribirse sin excepcin, ya que utilizar
este valor para calcular la cantidad de filas.
Existen algunos comandos interesantes que se pueden utilizar para operar con vectores y
matrices, por ejemplo usando sizeof() podemos calcular la cantidad de componentes.
1
2
3
4
5
6
7
8
9
10

// calcular cantidad de componentes


#include <iostream>
using namespace std;

Cant. de componentes: 4

int main ()
{
int v[] = {1, 2, 3, 4};
int n = sizeof(v) / sizeof(int);
cout << "Cant. de componenetes: " << n;
}

sizeof() devuelve el valor numrico de la cantidad de memoria ocupada por el parmetro.


Como le pasamos el vector como primer parmetro nos devolver la memoria utilizada para
almacenarlo (en este caso 16B) y como en el segundo caso le pasamos int como parmetro nos
devuelve cunto pesa en la memoria una variable de dicho tipo (4B). De ah con una simple
divisin se puede calcular la cantidad de componentes, aunque una forma ms eficiente y
general sera int n = sizeof(v) / sizeof(v[0]); que siempre nos devolver la cantidad de
componentes, sin importar el tipo que sea. Otras funciones tiles para vectores son gets() y
puts(), pero tampoco voy a explicar eso en detalle ac.

Algunas cosas importantes que se deben tener en cuenta al trabajar con vectores y matrices:
No empiezan en la posicin 1 sino que en la 0.
Para referirse a una componente en especfico se escribe v[i] o m[i][j] siendo i/j la
posicin de la componente.
No se pueden imprimir directamente con un cout, se debe recorrer con bucles for e
imprimir cada componente individualmente (ac s se puede usar cout). Tratar de
imprimir directamente el vector producir la impresin de las direcciones de la
memoria que este ocupan.

Ejercicios
1. Escribir un programa que lea dos nmeros enteros no negativos (m y n) y calcule la
funcin de Ackermann A(m,n), definida por:
= 0
n+1
0 = 0
A(m-1, 1)
0 0
A(m-1 , A(m, n-1) )
2. Escribir una funcin para ayudar a un cajero. Deber recibir el monto a pagar y lo que
pag el cliente y luego imprimir el vuelto y la cantidad de billetes as como los billetes
que deber entregar (siendo dicha cantidad la menor posible).
3. Escribir un programa que lea N nmeros y luego funciones para:
Imprima el promedio de los nmeros.
Imprima el mayor y menor de los nmeros.
Imprime todos los impares ingresados.
4. Escribir una funcin que reciba como parmetro una oracin y la devuelva invertida.
5. Escribir un programa que lea una palabra y luego una letra, a continuacin imprime la
palabra sin dicha letra.
6. Escribir una funcin que realice la suma de dos matrices.
7. Escribir un programa que lea una letra y diga su posicin en el abecedario.
8. Escribir un programa que calcule la transpuesta de una matriz de mxn cargada por el
usuario.
9. Escribir una funcin que tome un vector y luego devuelva otro sin elementos
repetidos.
10. Escribir un programa que muestre aleatoriamente y sin repetir los elementos de:
Un vector de 20 componentes
Una matriz de 4 filas y columnas
11. Escribir un programa que calcule el coseno del ngulo entre 2 vectores de R3.
12. Escribir un programa que permita cargar las notas de n alumnos en compu, lineal y
clculo, a continuacin se debe calcular el promedio as como la cantidad de aplazados
en cada materia.
13. Escribir un programa que lea un nmero entero y positivo n, genere al azar un vector
de n componentes. Luego ordene, en secuencia ascendente, dichas componentes
utilizando el mtodo de:
Seleccin.
Burbuja.
Insercin.
14. Escribir una funcin que dado un elemento e de un vector y un nmero p, retorne
el elemento que se encuentra a p posiciones del elemento e.
Por ejemplo, dado el vector vec= [a,b,c,d,e,f,g,h]
buscarElemento(vec, b, 3) = e
buscarElemento(vec, a, 5) = f
buscarElemento(vec, e, 6) = c
Note que en el ltimo ejemplo, si las posiciones se terminan, empieza de 0.
Considerar tambin el caso en que p sea negativo, por ejemplo
buscarElemento(vec, e, -3) = b

buscarElemento(vec, b, -5) = e
15. Escribir un programa que tome una matriz A cuadrada y luego la represente como la
suma de una matriz simtrica y una anti simtrica.
16. Considere una encriptacin de mensajes muy antigua inventada por Julio Cesar, la cual
se basa en que a cada letra de un mensaje se le asocia un nmero (el orden en el
abecedario), luego se suma al nmero de cada letra otro nmero (la clave) y el
resultado es una nueva letra.
Por ejemplo, el mensaje vienen los romanos con clave 2, se transformara en
xkgogoUnquUtqcoqu, ya que la primera letra del mensaje cifrado, la x, es
la que va 2 lugares despus de la v, etc.).
Nota, despus de la z va la a. Adems los espacios en blanco se convierten
en letras U .
Hacer las funciones para encriptar y desencriptar un texto.
encriptar(vienen los romanos, 2) = xkgogoUnquUtqcoqu
desencriptar(xkgogoUnquUtqcoqu,2) = vienen los romanos
17. Escribir un programa que lea un nmero entero, positivo y mltiplo de 3, a
continuacin genere un vector en cdigo binario de n componentes y luego, cada 3
componentes agregue una casilla donde cargar la suma de las 3 componentes
anteriores.