Académique Documents
Professionnel Documents
Culture Documents
EL ARTE DE
PROGRAMAR
Con el lenguaje de programación C++
Autor
Ing. Máximo Obregón Ramos
Profesor UNI
1
GUIA DEL PROGRAMADOR
TIPO DE DATO # bits y rango para 32 bits Para 16 bits
unsigned char 8 (0 ... 255)
char 8 (-128 ... 127)
short int 16 (-32,768 ... 32,767)
unsigned int 32 (0 ... 4,294,967,295) 16
int 32 (-2,147,483,648 ... 2,147,483,647) 16
unsigned long 32 (0 ... 4,294,967,295)
enum 32 (-2,147,483,648 ... 2,147,483,647) 16
long 32 (-2,147,483,648 ... 2,147,483,647)
float 32 (3.4 * 10E-38 ... 1.7* 10E38 (7-digit) precisión))
double 64 (1.7* 10E-308 ... 3.4* 10E308 (15-digit precisión))
long double 80 (3.4* 10E-4932 ... 1.1* 10E4932 (18-digit precision))
cos Coseno
cosh Coseno hiperbólico
exp(double x) x
Función exponencial, computa e
abs Valor absoluto de entero
fabs Valor absoluto de float
floor Entero más cercano a −∞
Ley de Coseno
2
= 2
+2−2 . ()
2 2
= +2−2 . ()
2 2
= + 2−2 . ()
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.
2
1
4
3
cout.setf(ios::fixed);
cout.precision(3);
cout<<"PI="<<M_PI<<endl; //3.142
cout.precision(20);
cout<<"PI="<<M_PI<<endl;//3.14159265358979310000
cout.width(10); cout.fill('0');
cout<<12<<endl; //0000000012
cout.width(10); cout.fill('0');
cout<<2312<<endl;//0000002312
cout.setf(0,ios::floatfield);
cout.precision(2);
cout<<"PI="<<M_PI*10<<endl;//31
getche();
return 0;
}
EJERCICIOS PROPUESTOS
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 10: Leer la distancia XB, YB, el ángulo grados sexagesimales y determine la velocidad
inicial del objeto, de tal manera que impacte el punto B.
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;
}
Autor: Ing. Máximo Obregón R. (+51) 951629294 / maximo@uni.edu.pe
15
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;
case 10: cout<<"C";break;
}
PROBLEMA PROPUESTOS
Problema 1: Leer 7 números y encontrar el mayor, desarrolle 3 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 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: 5 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)
Direcciones de
Lanzamientos posibles:
(0,1)
(-1,1)
(-1,0)
(-1,-1)
(0,-1) (-
1,1)
(1,0)
(1,1)
Problema 12: Calcular el precio de un automovil, considerando las siguientes tablas:
Tipo de Auto:
1) nuevo
2) usado
Precio en miles de dolares por marca si es nuevo
1)Toyota 27
2)Hyundai 20
3)Chino 14
Descuento por antiguedad si es usado
<5 años es 15%
[5,10> años es 30%
>10 años es 50%
Descuento por color:
1) Negro 10%
2) Rojo 2%
3) Azul 20%
4) Resto, no tiene descuento
Nota: Usar if y switch dentro de otro switch.
Ejemplo1:
Ingrese Tipo de auto: 2
Ingrese marca: 2
Ingrese antiguedad: 15
Ingrese color:1
El precio es 8 mil dolares
X (col)
Y
(fil)
El programa deberá calcular la nueva posición de la bolilla cuando esta avance una casilla, si
está en el borde deberá considerar el rebote.
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:";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.h> if (esprimo==1)
#include<conio.h> cout<<"El número es primo"<<endl;
int main() else
{int i,c,n,esprimo; cout<<"El número no es primo"<<endl;
cout<<"Ingrese n:";cin>>n; getche();
return 0;
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!
= − + − + − +⋯
1 3 5 7 9 11
()= − 3! 5! 7! 9! 11!
+ − + − +⋯
Problema 10: Dentro de las maravillosas expresiones que se pueden construir en las
matemáticas, se tiene la siguiente fórmula de recurrencia: = ( ) = 2 + 1 , que nos permite
calcular la √2 usando solamente sumas y divisiones. Lo interesante de esta expresión es que empieza con un valor de x0
cualquiera, con la cual obtenemos f(x0), la cual viene a ser x1, luego evalúas f(x1) para obtener x2, luego f(x2) para
obtener x3 y así sucesivamente. Por ejemplo:
X0=5 =>f(x0)=2.7 (el valor de x0=5 es un valor cualquiera diferente de 0)
x1=2.7 =>f(x1)=1.72
x2=1.72 =>f(x2)=1.44
…
Observa que el número se va aproximando a √2 = 1.4142 …
Desarrolle un programa que lea como dato de entrada x 0 y n, y muestre la √2 después de n iteraciones y compare este resultado con el valor exacto.
Problema 11: Usando el procedimiento anterior, considerando n iteraciones y partiendo de un
x0 cualquiera: 2 1
Calcule √3, sabiendo que la fórmula de recurrencia es ( ) =3+ 2
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
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.
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; }
Autor: Ing. Máximo Obregón R. (+51) 951629294 / maximo@uni.edu.pe
26
Ejemplo 3: Funciones para extraer los dígitos de un numero de diferentes formas.
#include<iostream> int extraer2(int n,int p) //con iterativa
#include<conio.h> while {//int dig,con;con=0;
#include<math.h> int dig,con=0;
using namespace std; while (n>0)
//prototipo de la funcion {con++;//con=con+1;
int extraer1(int,int); dig=n%10;
int extraer2(int,int); n/=10;//n=n/10;
int extraer3(int,int); if (con==p)
//programa principal return dig;
int main() }
{int n,p,d; return 0;
cout<<"Ingrese n:";cin>>n; }
cout<<"Ingrese posicion de digito(de int extraer3(int n,int p) //con iterativa
derecha a izquierda):"; cin>>p; for {//int dig,con;con=0;
int dig,con;
d=extraer3(n,p); //34568 , 2 ==>6 for(con=1;n>0;con++)
cout<<"El digito es "<<d<<endl; {dig=n%10;
getch(); n/=10;//n=n/10;
} if (con==p)
//desarrollo de las funciones return dig;
int extraer1(int n,int p)//sin iterativa }
{return int(n/pow(10.0,(p-1)*1.0)) return 0;
%10; } }
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); }
//programa principal //desarrollo de las funciones
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 d3 d4
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.
3. Fibonacci(n)=Fibonacci(n-1)+Fibonacci(n-2) Fibonacci(1)=0,Fibonacci(2)=1
4. Mayor(n, V)= Al mayor entre V[n] y Mayor(n-1,V) Mayor(1,V) = V[1]
5. Triángulo de pascal
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,2
| 2,1
2,3| = 1,1
| 3,3 | - 1,2 | 3,3 |+ 1,3 |3,1 3,2 |
ℎ
( + ℎ) ( −1) − ( )( −1)
( )( ) ≈ , ℎ ñ
ℎ
//prototipo de la funcion
int sum(int n) //sumatoria recursivo
{if (n==0)
return 0;
else
return n+sum(n-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;
case 10:cout<<"Transpuesta(A)==>C\n"; transpuesta(fa,ca,A,fc,cc,C);
}
int menu()
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.
g. La(s) nota(s) que tiene mayor incidencia.
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;}