Documentos de Académico
Documentos de Profesional
Documentos de Cultura
EL ARTE DE
PROGRAMAR
Autor
Ing. Máximo Obregón Ramos
Profesor UNI
1
PROGRAMACION EN C++
El lenguaje de programación a usar será el C++ y el IDE será Visual Studio de
Microsoft versión 2010, la cual tiene como logo inicial:
Para iniciar un programa en este IDE en modo consola, se puede hacer de varias
maneras, de las cuales se sugiere la siguiente:
Paso 1: Abrir el software Visual Studio 2010.
Paso 2: Abrir un nuevo proyecto
Paso 3: Luego de cualquiera de las formas del paso 2, debería aparecer esta
ventana, la cual debe ser llenada en el orden indicado. Cuando seleccione
examinar, deberá indicar la carpeta donde se alojarán sus programas.
1 2
4
3
Considerar lo siguiente:
División entera 7/2 => 3
División de coma flotante 7/2.0 => 3.5
Residuo 7%2 => 1
Para enteros usar: int
Para números con decimales usar: float
Las variables flotantes, se muestra por defecto con 4 decimales, si
usted desea otra cantidad, observe el problema 3.
Considerando que un triangulo se describe principalmente por 6 parámetros, sus 3 lados (a,b
y c) y sus 3 ángulos A,B y C. cuyas relaciones matemáticas en entre estas son:
Ley de Seno
𝑆𝑒𝑛(𝐴) 𝑆𝑒𝑛(𝐵) 𝑆𝑒𝑛(𝐶)
= =
𝑎 𝑎 𝑎
Ley de Coseno
𝑎2 = 𝑏2 + 𝑐 2 − 2𝑏𝑐. 𝑐𝑜𝑠(𝐴)
𝑏2 = 𝑎2 + 𝑐 2 − 2𝑎𝑐. 𝑐𝑜𝑠(𝐵)
𝑐 2 = 𝑎2 + 𝑏2 − 2𝑎𝑏. 𝑐𝑜𝑠(𝐶)
Problema 1: Leer los tres lados de un triángulo y mostrar los 3 ángulos en sexagesimal.
Problema 2: Leer las coordenadas cartesianas de un punto y mostrar la coordenada polar de
dicho punto, donde el ángulo sea expresada en sexagesimal.
Problema 3: Leer el valor de un monto en soles y calcular cuantas monedas de 5 soles y cuantas
de 1 sol forman dicho monto, considerando la mínima cantidad de 1 sol.
Problema 4: Leer un número de 4 cifras e invertir el número.
Problema 5: Leer las coordenadas polares de un punto en el plano cartesiano y mostrar la
coordenada cartesiana de dicho punto, considerar los puntos solo en el primer cuadrante.
Problema 6: Leer las coordenadas cartesianas de un punto en el espacio tridimensional y
determinar las coordenadas esféricas y cilíndricas del mismo punto.
Problema 7: Leer las coordenadas cartesianas de 3 puntos en el espacio tridimensional para
formar un triángulo y calcular su perímetro y área.
Problema 8: Leer las coordenadas de los centros de 2 circunferencias y el radio de uno de ellos,
luego calcular el radio del segundo, de tal manera que estas sean tangentes, así mismo calcule
también el punto de tangencia.
Problema 9: Leer la velocidad inicial y el ángulo inicial de un movimiento parabólico y
determinar la altura máxima, la distancia máxima, el tiempo total que se toma en llegar a la
distancia máxima.
Problema 5: Leer un número entero de hasta 3 cifras, formar otro número ordenando sus
cifras de menor a mayor, luego duplicarlo. Si el número tiene más de 3 cifras enviar un
mensaje de error. Por ejemplo, si se lee: 412 entonces la salida será 248.
int main() if (M<b) M=b;
{int n,a,b,c,m,M,i,N; if (M<c) M=c;
cout<<"Ingrese Numero:"; if (m>b) m=b;
cin>>n; if (m>c) m=c;
if (n<=999) i=a+b+c-M-m;
{//Partiendo el numero n //Formando el nuevo numero
c=n%10; N=(m*100+i*10+M)*2;
a=n/100; cout<<"El número procesado es:" ;
b=(n/10)%10; cout<<N<<endl;
//Ordenando m<i<M }
m=M=a; //M=a; m=M; else
cout<<"El número es mayor a 3 cifras
\n";
getche();
return 0;
}
Problema 8: Convertir un número arábigo en romano hasta el número 100. Recuerda que
las equivalencias son: I=1 V=5 X=10 L=50 C=100. Por ejemplo: 49 => XLIX
#include<iostream> switch (u)
#include<conio.h> {case 1: cout<<"I";break;
using namespace std; case 2: cout<<"II";break;
int main() case 3: cout<<"III";break;
{int n,d,u; case 4: cout<<"IV";break;
cout<<"Ingrese Numero:"; cin>>n; case 5: cout<<"V";break;
d=n/10; u=n%10; case 6: cout<<"VI";break;
switch (d) case 7: cout<<"VII";break;
{case 1: cout<<"X";break; case 8: cout<<"VIII";break;
case 2: cout<<"XX";break; case 9: cout<<"IX";break;
case 3: cout<<"XXX";break; }
case 4: cout<<"XL";break; getche();
case 5: cout<<"L";break; return 0;
case 6: cout<<"LX";break; }
case 7: cout<<"LXX";break;
case 8: cout<<"LXXX";break;
case 9: cout<<"XC";break; D=500
case 10: cout<<"C";break; M=1000
}
PROBLEMA PROPUESTOS
Problema 0: Leer 3 dados y mostrar el menor de ellos, desarrolle 2 formas distintas de
codificación para encontrar la misma respuesta.
Problema 5: Leer los 3 lados de un triángulo e indicar si: no existe, es rectangular, es isósceles,
es equilátero, es acutángulo, escaleno, etc.
Problema 7: Leer un numero entero de hasta 3 cifras, formar otro número ordenando sus cifras
de menor a mayor, luego duplicarlo. Si el número tiene más de 3 cifras enviar un mensaje de
error. Ejemplo si se lee: 412 entonces la salida será 248.
Problema 8: Leer las coordenadas de un punto e indicar en que cuadrante se encuentra o algún
eje y el origen de coordenadas.
Problema 9: Leer las coordenadas de los vértices de un triángulo y las coordenadas de un punto
cualquiera. Si el triángulo existe, verificar la posición relativa del punto con respecto al
triangulo, si esta fuera, dentro o en el perímetro.
Problema 10: Leer el valor de 2 dados y mostrar el puntaje obtenido, de acuerdo a las siguientes
reglas:
2 parejas de 2 o 3 o 6, será 1 puntos
números correlativos entre (2,3) o (4,5) o (5,6) tendrá 2 puntos
los dos 1 obtendrá 3 puntos,
el resto será 0 puntos
Nota: Deberá usar switch.
Ejemplo:
Dado1:5
Dado2:4
Puntaje obtenido: 2 puntos
Problema 11: Leer la coordenadas inicial x,y de un objeto y luego ingresar la distancia y la
dirección dos veces, donde dirección puede ser : 1(Derecha), 2(Izquierda), 3(Arriba), 4(Abajo).
Luego deberá imprimir la nueva posición, en este ejemplo se pide que use switch
obligatoriamente.
Ejemplo:
Ingrese posición Inicial
x:10
y:5
Ingrese Desplazamiento 1:
Distancia:8
Direccion:2
Ingrese Desplazamiento 2:
Distancia:5
Direccion:3
Posición final:
(2,10)
Problema 1: Ejemplo básico de iterativas sentencia while mostrar los n primeros números y sus
cuadrados.
#include<iostream> cout<<"Ingrese n:";cin>>n;
#include<conio.h> i=1;
using namespace std; while (i<=n)
int main() {c=i*i;
{int i,c,n; cout<<i<<" ==> "<<c<<endl;
i++;
}
getche();
return 0;
}
Para n=4
Iteración c pantalla i
Inicia 1
1 1 1==>1 2
2 4 2==>4 3
3 9 3==>9 4
4 16 4==>16 5
Problema 2: Ejemplo básico de iterativas sentencias while mostrar los n primeros capicúas de 3
cifras
#include<iostream>
#include<conio.h>
using namespace std;
int main()
{int i,c,n,u,d,con;
cout<<"Ingrese n(3 cifras):";cin>>n;
i=100; con=1;
while (con<=n)
{c=i/100;u=i%10;d=(i%100)/10;
if (u==c)
{cout<<"Capicua "<<con<<":"<<i<<endl;
con++;
}
i++;
}
getche();
return 0;
}
Problema 5: Ejemplo semi - básico de iterativas sentencia for, para mostrar si un numero n es
primo o no.
#include<iostream> if (esprimo==1)
#include<conio.h> cout<<"El número es
using namespace std; primo"<<endl;
int main() else
{int i,c,n,esprimo; cout<<"El número no es
cout<<"Ingrese n:";cin>>n; primo"<<endl;
esprimo=1; getche();
for (i=2;i<n;i++) return 0;
if (n%i==0) }
esprimo=0;
Problema 6: Ejemplo semi-básico de iterativas sentencia for, para mostrar los n primeros
primos.
#include<iostream> //Imprime el número si es primo
#include<conio.h> if (esprimo==1)
using namespace std; {cout<<"primo "<<c<<"=>"<<n<<endl;
int main() c++;
{int i,c,n,esprimo,can; }
cout<<"Ingrese n:"; }
cin>>can; getche();
for(n=2,c=1;c<=can;n++) return 0;
{ //averigua si n es primo }
esprimo=1;
for (i=2;i<n;i++)
if (n%i==0)
esprimo=0;
Problema 7: Ejemplo semi - básico de iterativas sentencia for, mostrar los n primeros términos
de fibonacci: 0, 1, 1, 2, 3, 5, 8, 13, 21,...
#include<iostream.h> for(a=0,b=1,i=3;i<=n;i++)
#include<conio.h> {c=a+b;
int main() cout<<","<<c;
{int a,b,c,i,n; a=b;
cout<<"Ingrese n:";cin>>n; b=c;
cout<<"0,1"; }
getche();
return 0;
}
PROBLEMA PROPUESTOS
Problema 1: Calcular la suma de n primeros números naturales
Problema 2: Mostrar los primos comprendidos entre a y b.
Problema 3: Calcular la suma de n primeros primos
Problema 4: Calcule el factorial de n
Problema 5: Mostrar la coordenada cartesiana de los vértices de un polígono regular de n lados
cuyo centro se encuentra en el origen de coordenadas.
Problema 6: Calcule el número e= 2.718281828…, a partir de la siguiente serie, usando los n
primeros términos.
1 1 1 1 1 1 1
𝑒 = + + + + + + +⋯
0! 1! 2! 3! 4! 5! 6!
Problema 7: Calcule el número π= 3.1415926…, a partir de la siguiente serie, usando los n
primeros términos.
4 4 4 4 4 4
𝜋= − + − + − +⋯
1 3 5 7 9 11
3𝑥 1
Calcule √4, sabiendo que la fórmula de recurrencia es 𝑓(𝑥) = +
4 𝑥3
4𝑥 1
Calcule √5, sabiendo que la fórmula de recurrencia es 𝑓(𝑥) = +
5 𝑥4
Calcule √𝑎 por deducción de las fórmulas anteriores.
Problema 12: En todos los problemas anteriores que usan una serie o una fórmula de
recurrencia, se ha usado como criterio de parada la cantidad de iteraciones. Intente ahora usar
el error aparente como criterio de parada, la cual está definido por:
𝐄𝐫𝐫𝐨𝐫 𝐚𝐩𝐚𝐫𝐞𝐧𝐭𝐞 = |𝐮𝐥𝐭𝐢𝐦𝐚 𝐚𝐩𝐫𝐨𝐱𝐢𝐦𝐚𝐜𝐢ó𝐧 − 𝐩𝐞𝐧ú𝐥𝐭𝐢𝐦𝐚 𝐚𝐩𝐫𝐨𝐱𝐢𝐦𝐚𝐜𝐢ó𝐧|
Entonces las iteraciones se debe realizar hasta que este error sea menor que un error máximo,
que previamente se ha tenido que leer como dato de entrada.
SOLUCIONARIO:
Problema 1:
#include<iostream.h> for (i=1,s=0;ii<n;i++)
#include<conio.h> s+=i;//s=s+i;
int main() cou<<"La suma es "<<s;
{int i,s; getch();
cout<<"Ingrese n:";cin>>n; }
Problema 4:
#include<iostream.h> for (i=1,f=1;i<=n;i++)
#include<conio.h> f*=i;//f=f*i;
int main() cout<<n<<"!="<<f;
{int i,f,n; getch();
cout<<"Ingrese n:";cin>>n; }
Problema 6:
#include<iostream.h> for (j=0,s=0;j<n;j++)
#include<conio.h> {for (i=1,f=1;i<=j;i++)
int main() f*=i;//f=f*i;
{int i,f,n; s+=1.0/f;//s=s+f;
float s; }
cout<<"Ingrese cantidad de términos:"; cout<<"e="<<s;
cin>>n; getch();
}
Problema 7:
#include<iostream.h> for (sig=1,i=1,s=0;i<=n;i++,sig=-sig)
#include<conio.h> s+=sig*4/(i*2-1);//s=s+4.0/(i*2-1);
int main()
{int i,j,f,n; cout<<"pi="<<s;
float s,sig; getch();
cout<<"Ingrese cantidad de términos:"; }
cin>>n;
Problema 10:
#include<iostream.h> cout<<"Ingrese aproximacion inicial:";
#include<conio.h> cin>>x;
int main() for (i=1;i<=n;i++)
{int i,j,f,n; x=x/2+1/x;
float x; cout<<"raiz de 2="<<x;
getch();
Problema 12:
#include<iostream.h> for(i=1;error>errormax;i++)
#include<math.h> {x=x/2+1/x;
#include<conio.h> error=fabs(x-xa);
#define errormax 0.0001 xa=x;
int main() cout<<"raiz de 2="<<x<<endl;
{int i,n; }
float x,error=1,xa; cout<<"Esta respuesta se obtuvo con ";
cout<<"Ingrese aproximacion inicial:"; cout<<i<<" iteraciones";
cin>>x; getch();
xa=x; }
Ejemplo 2: Calcular los ángulos de un triángulo a partir de sus tres lados, usando funciones.
#include<iostream> angC= calsex(calang(a,b,c));
#include<conio.h> angB= calsex(calang(a,c,b));
#include<math.h> angA= 180-angC-angB;
#define M_PI (atan(1.0)*4) cout<<"El ángulo opuesto a A es "<<angA<<endl;
using namespace std; cout<<"El ángulo opuesto a B es "<<angB<<endl;
cout<<"El ángulo opuesto a C es "<<angC<<endl;
//prototipo de las funciones getch();
float calang(float a,float b,float c); }
float calsex(float ang);
//desarrollo de las funciones
//programa principal float calang(float a,float b,float c)
int main() {return acos((a*a+b*b-c*c)/(2*a*b));
{float a,b,c,angA,angB,angC; }
cout<<"Lado a:";cin>>a; float calsex(float ang)
cout<<"Lado b:";cin>>b; {return ang*180/M_PI;
cout<<"Lado c:";cin>>c; }
Ejemplo 4: Funciones para calcular de forma aproximada las raíces de una función matemática
en un determinado intervalo [a,b].
Para graficar, puede usar Matlab y colocar la siguiente orden:
>> ezplot('exp(-0.1*x)*sin(cos(5*x))',[10 16]);grid
Ejemplo 5: Funciones para calcular de forma aproximada los puntos máximos de una función
matemática en un determinado intervalo [a,b].
#include<iostream> cout<<"Las raices de la funcion son:\n";
#include<conio.h> for(x=a;x<=b;x=x+h)
#include<math.h> if (f(x)>f(x+h) && f(x)>f(x-h))
using namespace std;
cout<<"\t\t==>Maximo=("<<x<<","<<f(x)<<")\n";
//prototipo de la funcion getch();
float f(float); }
PROBLEMAS PROPUESTOS
Problema 1: Desarrolle una función que devuelva la suma de los n primeros números naturales.
Problema 2: Desarrolle una función que devuelva verdadero si un número n es primo y falso si
no lo es.
Problema 3: Desarrolle una función que devuelva la cantidad de primos que existen en un
intervalo de a y b.
Problema 4: Desarrolle una función que permita calcular el enésimo término de la serie de
Fibonacci.
Problema 5: Desarrolle una función que invierta un número n, por ejemplo, si ingresa 357 debe
entregar 753.
Problema 6: Desarrolle una función que cuente la cantidad de dígitos que tiene un número n.
Problema 10: Desarrolle una función que devuelva la longitud de curva de la función
f(x)=cos(x+sin(x)*x)*x, en el intervalo x=[a,b], para ello deberá dividir el intervalo en n tramos,
luego deberá tomar cada tramo y aproximar que la curva en cada tramo es una recta. Por lo
tanto los datos de entrada de la función seria a,b y n, la función debe estar incorporada dentro
de la función. Por ejemplo en la figura se divide en 4 partes(n=4), entonces la longitud de la
curva es d1+d2+d3+d4.
d2 d4
d3
d1
a b
Parte 1 Parte 2 Parte 3 Parte 4
Problema 11: Haciendo uso de funciones convenientemente, escriba un programa en C++ que
permita elaborar un juego con dados, que sigue las siguientes reglas:
• Se tiene 2 jugadores: Blanco (B) y una Negro (N).
• Inicia el juego el blanco, tirando los dados
• Por cada lance, el programa debe generar un número entre 1 y 6, de manera alterna (B-N-
B-N, etc.): es decir, primero genera un número para la ficha blanca y en la siguiente jugada
genera un número para la ficha negra.
• Si el número generado es igual a 6, entonces esa ficha repite otro turno (juega otra vez,
inmediatamente).
• Gana la ficha que acumule más de 100 puntos.
El programa deberá mostrar por cada lance:
- El color de la ficha
- El puntaje que saca en el lance
- El puntaje acumulado del jugador
- Un mensaje que indique si hay o no cambio de turno (le toca al otro)
Se mostrarán los resultados finales.
Nota: Utilice las funciones rand() para generar números al azar.
Implemente las funcione pascal(f,t) donde f es la fila del triángulo y t es el término a extraer de
esa fila. Por ejemplo pascal(5,3) debe devolver 6
6. La determinante de una matriz de n x n, considere el siguiente ejemplo para el caso de 3x3.
𝑎1,1 𝑎1,2 𝑎1,3
𝑎2,2 𝑎2,3 𝑎2,1 𝑎2,3 𝑎2,1 𝑎2,2
|𝑎2,1 𝑎2,2 𝑎2,3 | = 𝑎1,1 |𝑎 | -𝑎1,2 |𝑎 |+𝑎1,3 |𝑎 |
3,2 𝑎3,3 3,1 𝑎3,3 3,1 𝑎3,2
𝑎3,1 𝑎3,2 𝑎3,3
7. La derivada enésima de función determinada.
𝑓(𝑥 + ℎ)(𝑛−1) − 𝑓(𝑥)(𝑛−1)
𝑓(𝑥)(𝑛) = 𝐿𝑖𝑚ℎ→0
ℎ
(𝑛)
𝑓(𝑥 + ℎ)(𝑛−1) − 𝑓(𝑥)(𝑛−1)
𝑓(𝑥) ≈ , 𝑐𝑜𝑛 ℎ 𝑚𝑢𝑦 𝑝𝑒𝑞𝑢𝑒ñ𝑜
ℎ
0 1 2 3 4 0 9
1 7
2 5
int menu();
//PROGRAMA PRINCIPAL
int main()
{ float A[Fm][Cm],B[Fm][Cm],C[Fm][Cm];
int fa=0,ca=0,fb=0,cb=0,fc=0,cc=0,opcion;
system("color f9");
srand(time(NULL));
do{
opcion=menu();
switch(opcion)
{case 1:cout<<"matriz A=\n";generar(fa,ca,A);
mostrar(fa,ca,A);break;
case 2:cout<<"matriz B=\n";generar(fb,cb,B);
mostrar(fb,cb,B);break;
case 3:cout<<"matriz A=\n";leer(fa,ca,A);
mostrar(fa,ca,A);break;
case 4:cout<<"matriz B=\n";leer(fb,cb,B);
mostrar(fb,cb,B);break;
case 5:cout<<"matriz A=\n";
mostrar(fa,ca,A);break;
case 6:cout<<"matriz B=\n";
mostrar(fb,cb,B);break;
case 7:cout<<"matriz C=\n";
mostrar(fc,cc,C);break;
case 8:cout<<"A+B==>C\n";sumar(fa,ca,A,fb,cb,B,fc,cc,C);
mostrar(fc,cc,C);break;
case 9:cout<<"A-B==>C\n";restar(fa,ca,A,fb,cb,B,fc,cc,C);
mostrar(fc,cc,C);break;
fc=1;
cc=ca;
}
Problemas:
1) Lea los datos de un polinomio, en un arreglo de una dimensión, luego muestre el producto
entre la derivada e integral de dicho polinomio
2) Lea 2 polinomios y muestre el producto entre ellas.
3) Considerando que un número gigante de 200 cifras se almacena en un vector (arreglo de
una dimensión), donde cada digito es almacenado en cada elemento del vector, entonces
desarrolle un programa que lea 2 números grandes y calcule la suma, la resta, el producto
y la factorial.
4) Simule el juego de una rifa, considerando n participantes y considerando que el ganador
será designado en el k-esimo intento. Los que salieron sorteados antes del k-esimo intento,
son anulados del juego.
5) Registrar las notas de n alumnos, simulando desde números aleatorios en un arreglo
unidimensional y en otro se registrará sus DNI, la cual también se llenará de forma
aleatoria. Luego realizar los siguientes reportes:
a. La nota promedio
b. Cantidad de desaprobados
c. Los códigos de los alumnos tercio superior
d. Los códigos de los alumnos tercio inferior
e. Los códigos de los alumnos que obtuvieron la mayor nota.
f. Los códigos de los alumnos que obtuvieron la menor nota.
Ejemplo definamos:
La clase vector:
class vector2d{
//datos miembro
private:
int x,y;
//funciones miembro(métodos)
public:
void leer();
void mostrar();
void setear(int vx,int vy);
float modulo();
};
La clase persona:
class persona{
private:
char nombre[100];
char apellido[200];
int edad;
float peso;
public:
void correr();
void estudiar();
};
La clase matriz
class matriz{
private:
int nfil,ncol;
float m[50][50];
public:
void leer();
void mostrar();
float determinante();
matriz inversa();
matriz traspuesta();
class Crecta3d
{protected:
Cpunto3d P;
Cvector3d Q;
public:
void leer();
void ver();
void setear(Cpunto3d vP,Cvector3d vQ);
};
Cvector3d Cvector3d::operator*(float k)
{Cvector3d temp;
temp.x=x*k;
temp.y=y*k;
temp.z=z*k;
return temp;
}
Cvector3d::operator++()
{x++;y++;z++;}
Cvector3d::operator+=(float k)
{x+=k;y+=k;z+=k;}