Ejercicios C
Ejercicios C
Ejercicios C
recursividad (II)
¡Hola! Vuelvo con otra entrada de C++ para repasar tanto los procedimientos y funciones y el
paso de parámetros a estos como la recursividad. Si os interesa practicar estos temas os
recomiendo que además de ver esta entrada, os paséis por ésta sobre procedimientos
y ésta sobre recursividad publicadas hace unos días. Os dejo los ejercicios resueltos ;)
Escribe un programa que lea un número natural N por teclado y dibuje un triángulo de
asteriscos con base y altura N. Por ejemplo si N=5 debería dibujarse:
#include <iostream>
using namespace std;
int main() {
unsigned x;
leerDatos(x);
dibujarPiramide(x);
return 0;
}
Escriba un programa que tome como entrada desde teclado dos números naturales (mayores
que cero) "N" e "i", e imprima en pantalla el dígito que ocupa la posición i-ésima del número
N. Si i es mayor que el número de dígitos de N, se escribirá en pantalla -1. Por ejemplo, para N
= 25064 e i = 2, el resultado es el dígito 6, y para i = 7, el resultado es -1.
#include<iostream>
#include <math.h>
using namespace std;
void introducirDatos(unsigned& N, unsigned& i){
cout << "Introduce N (>0) : ";
cin >> N;
cout << "Introduce i (>0) : ";
cin >> i;
}
int calcularDigito(unsigned N, unsigned i){
int num;
num = N /(pow( 10,(i-1) ));
if(num == 0){
num = -1;
}else{
num = num%10;
}
return num;
}
int main() {
unsigned N, i;
cout << "Programa que imprime en pantalla el dígito que ocupa la
posición i-ésima del número N."<< endl;
introducirDatos(N, i);
cout << "Resultado: " << calcularDigito(N, i);
return 0;
}
Escribe un programa que acepte como entrada desde teclado un número natural mayor que
cero
y dé como salida el resultado de sumar dos a dos los dígitos que aparecen en posiciones
simétricas respecto al dígito central dentro del número dado como entrada. Por ejemplo :
para el número : 2354869
la salida es: 2+9 = 11, 3 + 6 = 9, 5 + 8 = 13, 4
para el número : 6582
la salida es : 6 + 2 = 8, 5 + 8 = 13
#include <iostream>
using namespace std;
unsigned suma;
for(int i =1; i <= int(longitud/2); i++){
suma = calcularDigito(N, i) + calcularDigito (N, long2);
cout << calcularDigito (N, long2)<< "+" << calcularDigito(N, i)
<<"=" << suma << " ";
long2 --;
}
if(longitud%2 != 0){
cout << calcularDigito(N, unsigned(longitud/2)+1 );
}
}
int main() {
unsigned N;
introducirDatos(N);
Sumar(N);
return 0;
}
Decimos que una sucesión a1,a2,...,an de enteros forma una montaña, si existe un h tal
que : 1 <= h <= n y además
a1 < ...ah-1 < ah > ah+1 > ...an
Definimos la longitud de una montaña como el número de enteros que la forman. Por ejemplo
la sucesión -7, -1, 6, 21, 15 es una montaña de longitud 5.
Definimos un valle de la misma forma que una montaña pero cambiando el signo de las
desigualdades de la definición anterior:
a1 > ...ah-1 > ah < ah+1 < ...an
Por ejemplo 24, 13, 6, 15, 50 sería un valle.
Dada una secuencia de enteros terminada en cero (0) que como mínimo contiene una montaña
y un valle (suponemos que la secuencia de enteros de entrada es una secuencia correcta de
montañas y valles), diseña un programa que calcule la longitud de la montaña y el valle más
largos.
#include<iostream>
using namespace std;
}else{
montana++;
if(mmontana < montana){
mmontana = montana;
}
}
antant = ant;
ant= num;
cin >> num;
}
}
int main() {
int mmontana;
int mvalle;
leerNumero(mmontana, mvalle);
cout <<"Mayor montaña: "<< (mmontana+1) << endl;
cout << "Mayor valle: "<< mvalle;
return 0;
}
El máximo común divisor (mcd) de dos números naturales p y q es el mayor entero d que
divide a ambos. Un algoritmo muy conocido para calcularlo es el de Euclides. Éste utiliza
dos variables, que contienen inicialmente a cada uno de los números, y trata de hacer que su
contenido sea el mismo. Para ello, irá restando la menor a la mayor hasta que ambas
contengan el mismo valor. En dicho momento, el valor obtenido en cualquiera de ellas es el
máximo común divisor de los dos números iniciales. Por ejemplo, si P = 18 y Q = 12, el
algoritmo hará que P y Q vayan tomando los siguientes valores:
Inicialmente P == 18 y Q == 12 (P > Q => P = P - Q)
Después P == 6 y Q == 12 (Q > P => Q = Q - P)
Después P == 6 y Q == 6 (P == Q => El mcd es 6)
Diseña el algoritmo anterior siguiendo un enfoque recursivo:
unsigned mcd(unsigned P, unsigned Q)
#include <iostream>
using namespace std;
int main() {
unsigned P, Q;
cout << "Máximo común divisor. " << endl; // prints !!!Hello World!!!
cout << "Introduce dos naturales: ";
cin >> P >> Q;
cout << "El mcd es "<< mcd(P,Q);
return 0;
}
Diseña un procedimiento recursivo que lea una secuencia de caracteres de longitud arbitraria
terminada en un punto, y la imprima en orden inverso. El procedimiento no tiene parámetros.
#include <iostream>
using namespace std;
void invertirTexto(){
char a;
cin.get(a);
if(a == '.'){
}else{
invertirTexto();
cout << a;
}
}
int main() {
cout << "Introduce texto a invertir terminado en punto." << endl; //
prints !!!Hello World!!
invertirTexto();
return 0;
}
2
using namespace std;
3
4
void intercambiar(int, int); //Protipo de la función para intercambiar los valor
5
6
int main(void)
7
{
8
int a = 2,b = 3;
9
cout<<"Valores originales a = "<<a<<" y b = "<<b<<endl<<endl;
10 intercambiar(a,b); //Llmado a la función intercambiar
11 cout<<"Luego de la funcion a = "<<a<<" y b = "<<b<<endl<<endl;
12
13 return 0;
14 }
15
void intercambiar(int i, int j)
16
{
17
int z;
18
z = i;
19
i = j;
20 j = z;
21 }
22
23
Luego si solo agregamos este operador (el & se conoce también como operador
de referencia), al programa anterior tal como se muestra a continuación, el uso
de las variables será común y corriente, sin embargo cualquier cambio que se
realice en ellas afectará directamente a las variables en el programa principal
(función main( )), si compilamos y ejecutamos el siguiente código.
1
2 #include <iostream>
3
using namespace std;
4
5
void intercambiar(int &i , int &j ); //Protipo de la función para intercambiar lo
6
7
int main(void)
8
{
9
int a = 2,b = 3;
10 cout<<"Valores originales a = "<<a<<" y b = "<<b<<endl<<endl;
11 intercambiar(a,b); //Llmado a la función intercambiar
12 cout<<"Luego de la funcion a = "<<a<<" y b = "<<b<<endl<<endl;
13
14 return 0;
15 }
16
void intercambiar(int &i, int &j)
17
{
18
int z;
19
z = i;
20
i = j;
21 j = z;
22 }
23
Saludos.
Variable referencia
Usando punteros
int i;
int *p=&i;
*p=40; //i vale 40
void main()
{int n=10;
cout<<n<<endl;
demo(n);
cout<<n<<endl;
}
//llamada a la función
segundo_despues(&horas, &minutos, &segundos);
Una referencia es un nombre alternativo (un alias, un sinónimo) para un objeto. Una
referencia no es una copia de la variable referenciada, sino quees la misma
variable con un nombre diferente.
Utilizando referencias, las funciones trabajan con la misma variable utilizada en la
llamada. Si se modifican los valores en la función, realmente se están modificando
los valores de la variable original.
Ejemplo:
El primer ejemplo del punto anterior utilizando referencias lo podemos escribir así:
#include <iostream>
using namespace std;
void intercambio(int &, int &);
int main( )
{ int a, b;
cout << "Introduce primer numero: ";
cin >> a;
cout << "Introduce segundo numero: ";
cin >> b;
cout << endl;
cout << "valor de a: " << a << " valor de b: " << b << endl;
intercambio(a, b);
cout << endl << "Despues del intercambio: " << endl << endl;
cout << "valor de a: " << a << " valor de b: " << b << endl;
system("pause");
}
void intercambio(int &x, int &y)
{
int z;
z = x;
x = y;
y = z;
}
En la declaración de la función y en la definición se coloca el operador referencia a &
en aquellos parámetros formales que son referencias de los parámetros actuales:
void intercambio(int &, int &); //declaración de la función
void intercambio(int &x, int &y) //definición de la función
Cuando se llama a la función:
intercambio(a, b);
se crean dos referencias (x e y) a las variables a y b de la llamada. Lo que se haga
dentro de la función con x e y se está haciendo realmente con a y b.
La llamada a una función usando referencias es idéntica a la llamada por valor.
Ejemplo:
El segundo ejemplo anterior, utilizando referencias:
// Hora un segundo después
#include <iostream>
#include <iomanip>
using namespace std;
void segundo_despues(int &, int &, int &);
int main()
{ int horas, minutos, segundos;
do
{
cout << "Introduce hora: ";
cin >> horas;
}while(horas<0 || horas > 23);
do
{
cout << "Introduce minutos: ";
cin >> minutos;
}while(minutos<0 || minutos > 59);
do
{
cout << "Introduce segundos: ";
cin >> segundos;
}while(segundos<0 || segundos > 59);
segundo_despues(horas, minutos, segundos);
cout << setfill('0');
cout << endl << "Hora un segundo despues: ";
cout << setw(2) << horas << ":";
cout << setw(2) << minutos << ":";
cout << setw(2) << segundos << endl;
system("pause");
}