curso de C++ - FISI WIKIPEDIA

Transcripción

curso de C++ - FISI WIKIPEDIA
C++
FISI
UNMSM
UNIVERSIDAD NACIONAL MAYOR DE SAN MARCOS
FACULTAD DE INGENIERIA DE SISTEMAS E INFORMATICA
CURSO: C++
MODULO 01: Introducción
¿Que es un problema?
Un problema es definido por un conjunto de hipótesis y / o restricciones, y por lo menos un
objetivo.
Una instancia de un problema esta dada por un conjunto ordenado de datos particulares del
problema.
¿Que es un Algoritmo?
Es un método para resolver un problema mediante una serie de pasos precisos, definidos y
finitos.
Un algoritmo debe producir un resultado en un tiempo finito.
Los métodos que utilizan algoritmos se denominan métodos algorítmicos en oposición a los
métodos que implican algún juicio o interpretación que se denominan métodos heurísticos.
¿Que es un programa?
Un programa es un conjunto de instrucciones que nos permite resolver problemas mediante
el uso de un ordenador, también se puede decir que es la traducción de un algoritmo en
instrucciones que puede entender una maquina, para ello de hace uso de algún lenguaje de
programación con en este caso el lenguaje C++.
¿Que es un lenguaje de programación?
Es un lenguaje, como cualquier otro, que tiene reglas de escritura que conforman su
sintaxis. Para verificar la correcta escritura cuenta con un compilador quien identifica los
errores que se pueda cometer en la escritura de un programa. Nosotros utilizaremos el
lenguaje de programación C++.
Fases en la resolución de problemas.
El proceso de resolución de un problema mediante el uso de una computadora nos lleva a la
escritura de un programa y la ejecución de la misma.
Las fases de resolución de un problema son:
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
1.- Análisis del problema
2.- Diseño del algoritmo
3.- Codificación
4.- Compilación y ejecución
5.- Verificación
6.- Depuración
7.- Mantenimiento
8.- Documentación
Todo esto es un repaso nada mas de la parte de teoría, ahora nos dedicaremos a la parte
esencial del curso que es la resolución del os problemas mediante el uso de este lenguaje
C++.
Elementos básicos de programación
1.- Esquema de todo programa C++
// librerias
…
// funcion principal
void main(){
// declaracion de variables
…
// entrada de datos
…
// proceso de calculo
….
// salida de resultados
….
}
2.- Librerias básicas a utilizar:
#include <conio.h>
#include <iostream.h>
3.- Cómo declaro variables?
Tipo_de_dato nombre_de_variable;
Tipo_de_dato nombre1, nombre2, nombre3;
4.- Qué tipos de dato puedo utilizar?
short
byte
int
long
entero corto: -127 a 128
entero corto: 0 a 255
entero : -32767 a 32768
entero largo : 11 digitos positivos y negativos
Alejandro Reyes Marzano
[email protected]
C++
FISI
float
double
char
UNMSM
real de baja precision
real de alta precision
caracter
Ejm :
int x, y ;
double area;
5.- Cómo guardo valores en una variable ?
variable = valor;
Siempre la variable va al lado izquierdo. El valor puede ser fijo, variable o
expresión.
Ejm:
x = 15;
// valor fijo
y = x;
// valor variable
x= 2.5*y+x;
// valor expresión
6.- Cómo imprimo en pantalla en C++?
cout <<”texto”<<valor<<variable<<expresión<<endl;
Ejm: cout <<”El valor de x es: “<<x<<endl;
7.- Cómo leo los datos ingresados por teclado en C++?
cin >> variable;
Ejm: cout<<”ingrese valor de x”; cin >> x;
PROBLEMA 1:
Encontrar el área de un terreno rectangular.
Solución:
// librerias
#include <conio.h>
#include <iostream.h>
//funcion principal
void main(){
// declaracion de variables
double ancho, alto, area;
// entrada
cout<<”Ingrese valor del ancho: “; cin >>ancho;
cout <<”Ingrese valor del alto : “; cin >>alto;
// proceso de calculo
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
area = ancho * alto;
// salida
cout<<”El area es: “<<area<<endl;
}
PROBLEMA 2:
Una tienda, por liquidación, ofrece 50% de descuento en todos sus productos. Por la
compra de cierta cantidad de unidades de un producto, se desea saber el monto de la
compra, el monto del descuento y el monto a pagar.
Solución:
// librerias
#include <conio.h>
#include <iostream.h>
//funcion principal
void main(){
// declaracion de variables
double precio, mcompra, mdscto,
mpago;
int cantidad;
// entrada
cout<<”Ingrese precio: “;
cin>>precio;
cout<<”Ingrese unidades: “;
cin>>cantidad;
// proceso
mcompra = precio * cantidad;
mdscto
= mcompra*0.50;
mpago
= mcompra – mdscto;
// salida
cout << “Monto de compra:
“<<mcompra<<endl;
cout << “Monto de dscto
“<<mdscto<<endl;
cout << “Monto a pagar
}
:
: “<<mpago<<endl;
PROBLEMA 3:
Dado un capital, encuentre los intereses correspondientes considerando una tasa de
interes determinada y un cierto número de períodos financieros. Considere las
siguientes fórmulas:
Monto = capital(1+tasa/100)^n
Intereses= Monto – capital
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
Solución:
// librerias
#include <conio.h>
#include <iostream.h>
#include <math.h>
// para la
funcion pow(base, exponente)
//funcion principal
void main(){
// declarar variables
double capital, tasa, n, intereses,
monto;
// entrada
cout<<”Ingrese capital: “;
cin>>capital;
cout<<”Ingrese tasa de interes: “;
cin >> tasa;
cout<<”Ingrese numero de periodos: “;
cin>>n;
// proceso
monto = capital * pow(1+tasa/100,n);
intereses = monto – capital;
// salida
cout<<”Monto final: “<< monto<<endl;
cout<<”Intereses
:
“<<intereses<<endl;
}
PROBLEMA 4:
Encontrar el area de un triangulo conociendo sus 3 lados. Considere la siguiente
formula:
Area = raiz cuadrada(p(p-a)(p-b)(p-c))
Donde p es el semiperimetro.
Solución:
/*
Name:
Calculo de areas
Author:
Reyes Marzano, Alejandro
Description: Encontrar el area de un triangulo conociendo
sus 3 lados.
Considere la siguiente formula: Area = raiz
cuadrada(p(p-a)(p-b)(p-c))
Donde p es el semiperimetro.
Alejandro Reyes Marzano
[email protected]
C++
FISI
Date:
Copyright:
UNMSM
22/01/08 12:23
*/
// librerías
#include <conio.h>
#include <iostream.h>
#include <math.h>
// para la función pow(base,
exponente)
//funcion principal
void main(){
// declarar variables
float a, b, c, p, area,perimetro;
// entrada
cout<<"Ingrese el lado a del triangulo : "; cin>> a;
cout<<"Ingrese el lado b del triangulo : "; cin >> b;
cout<<"Ingrese el lado c del triangulo : "; cin>> c;
// proceso
p = (a+b+c)/2;//semi perimetro del triangulo
area =pow((p*(p-a)*(p-b)*(p-c)),0.5);
perimetro=2*p;
// salida
cout<<"perimetro: "<<perimetro<<endl;
cout<<"área
: "<<area<<endl;
getche ();
}
PROBLEMA 5:
Dada una cantidad que representa grados centígrados, encontrar su equivalente en
grados Fahrenheit, ranking y kelvin.
Solución:
/*
Name:
cambio de temperatura
Author:
Reyes Marzano, Alejandro
Description: Dada una cantidad que representa grados
centigrados,encontrar su equivalente en
grados Fahrenheit,ranking y kelvin
Date:
22/01/08 12:11
Copyright:
fisi_unmsm lima peru 2008
*/
// librerías
#include <stdlib.h>
#include <iostream.h>
#include <math.h>
// para la función pow(base,
exponente)
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
//funcion principal
int main(){
// declaracion variables
double C, F, K, R;
// entrada de datos
cout<<"Ingrese la temperatura en grados centigrados C:
\n";
cin>> C;
// proceso de datos
F=(9*C/5)+32;
K=C+273;
R=(9*C)/5+492;
// salida de datos
cout<<"Los equivalentes en otros sistemas son: \n";
cout<<"Fahrenheit : "<<F<<endl;
cout<<"kelvin
: "<<K<<endl;
cout<<"Ranking
: "<<R<<endl;
cout<<"Celcius
: "<<C<<endl;
system("PAUSE");
//espera la pulsacion de una tecla
para salir
return 0;
}
PROBLEMA 6:
Dado un número entero de 4 cifras, obtener el número invertido.
Solución:
/* Name:
invertir numero de 4 cifras
Author:
Reyes Marzano, Alejandro
Description: Dado un numero de 4 cifras como dato de
entrada invierte el numero
Date:
22/01/08 12:32
Copyright:
fisi_unmsm lima peru 2008
*/
#include <conio.h>
#include <iostream.h>
void main(){
int N,a,b,c,d,num;
cout<<"Ingrese un numero de cuatro cifras\nNumero =
";cin>>N;
//hallando cifras
a=N/1000;
b=(N/100)%10;
c=(N/10)%10;
d=N%10;
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
num=d*1000+c*100+b*10+a;
cout<<"El numero invertido es :"<<num<<endl;
getche ();
}
PROBLEMA 7:
Evaluar el resultado de la siguiente función:
F(x) = raíz cúbica de (5x+73)
Solución:
/* Name:
evaluacion de una funcion
Author:
Reyes Marzano, Alejandro
Description: dado el valor de x evalua la funcion
Date:
22/01/08 12:47
Copyright:
*/
#include <conio.h>
#include <iostream.h>
#include <math.h>
void main(){
float x,f;
cout<<"funcion a evaluar\nF(x) = raiz cubica de
(5x+73)\n";
cout<<"Ingrese el valor de x = ";
cin>>x;
f=pow((5*x+pow(7,3)),0.3);
cout<<" X = "<<x<<endl;
cout<<" F(X) = "<<f<<endl;
getche ();
}
PROBLEMA 8:
Una persona tiene una cuenta en dólares, una en sóles y una en euros. Quiere saber
cuanto dinero tiene en las tres cuentas pero expresado en dólares, en soles y en euros
por separado.
Solución:
/*
Name:
Cambio de monedas
Author:
Reyes Marzano, Alejandro
Description: es un programa que hace cambio
de acuerdo al tipo de cambio
Alejandro Reyes Marzano
[email protected]
C++
FISI
Date:
Copyright:
UNMSM
22/01/08 12:51
*/
//librerias
#include <conio.h>
#include <iostream.h>
#include <math.h>
#define tc1 3.2
#define tc2 0.8
#define tc3 4
//funcion principal
void main(){
float a,b,c,A,B,C;
cout<<"Ingrese la cantidad en la cuenta en dolares
= ";cin>>a;
cout<<"Ingrese la cantidad en la cuenta en soles =
";cin>>b;
cout<<"Ingrese la cantidad en la cuenta euros =
";cin>>c;
A=a+b*1.0/tc1+c*1.0/tc2;
B=b+a*1.0*tc1+c*1.0*tc3;
C=c+a*1.0*tc2+b*1.0/tc3;
cout<<"La cantidad total en dolares es =
"<<A<<endl;
cout<<"La cantidad total en soles es = "<<B<<endl;
cout<<"La cantidad total en euros es = "<<C<<endl;
getche ();
}
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
Modulo 02: Estructuras de Control
Condicionales:
La sentencia If
Sintaxis:
If(expresión_logica){
<secuencia de sentencias>
}
En español seria:
si(expresión_logica)entonces
<Secuencia de sentencias>
Fin_si
Si la expresión lógica es verdadera, entonces se ejecuta la secuencia de sentencias en caso
contrario se salta la estructura. Después que la sentencia if se ha ejecutado, el control pasa a
la siguiente sentencia.
La sentencia if –else
Sintaxis:
if(expresión_logica){
<Secuencia de sentencias 01>
}
else{
<Secuencia de sentencias 02>
}
En español sería:
si(expresión_logica)entonces
<Secuencia de sentencias 01>
Si_no
<Secuencia de sentencias 02>
Fin_si
Si la expresión lógica es verdadera, entonces se ejecuta la secuencia de sentencias 01 en
caso contrario o sea cuando la expresión lógica es falso se ejecuta la secuencia de
sentencias 02.
Después que la sentencia if se ha ejecutado, el control pasa a la siguiente sentencia.
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
Sentencias if –else anidados:
C++ permite anidar sentencias if_else anidados para crear una sentencia de alternativas
múltiples:
Sintaxis:
if(expresión_logica_01){
<Secuencia 01>
}
else{
if(expresión_logica_02){
<Secuencia 02>
}
else{
if(expresión_lógica_n){
<secuencia n>
}
}
}
En español sería:
si(expresión_logica_01)entonces
<Secuencia 01>
Si_no
si(expresión_logica_02)entonces
<Secuencia 02>
Si_no
si(expresión_lógica_n)entonces
<secuencia n>
Fin_si
Fin_si
Fin_si
PROBLEMA 1
Una tienda ofrece 20% de descuento sobre el monto de consumo si es que éste supera los
30 soles, caso contrario el descuento es del 10%. El monto de consumo no incluye
impuestos que se aplica al monto neto. Se desea saber el monto del descuento, el monto
neto, el monto de los impuestos y el monto a pagar.
Solución:
// librerias
#include <conio.h>
#include <iostream.h>
Alejandro Reyes Marzano
[email protected]
C++
FISI
#include <iomanip.h>
manipuladores setw, setiosflags, etc.
// definicion de constantes
#define Pdscto1 0.20
#define Pdscto2 0.10
#define Pimpto 0.19
UNMSM
// para
// 20% descuento
// 10% descuento
// 19% impuesto
// funcion principal
void main(){
// declaracion de variables
double Consumo,Dscto,Neto,Impuesto,Pago;
// ingreso de consumo
cout << "Ingrese consumo : "; cin >> Consumo;
// Calcular Descuento
if ( Consumo > 30)
Dscto = Consumo * Pdscto1;
else
Dscto = Consumo * Pdscto2;
// calcular el monto neto
Neto = Consumo - Dscto;
// Calcular monto del impuesto
Impuesto = Neto * Pimpto;
// Calcular monto del importe a pagar
Pago = Neto + Impuesto;
// Escribir resultados
cout << endl;
cout << setiosflags(ios::fixed|
ios::showpoint);
// formato para reales
cout << "Consumo
: "
// ancho 10, con 2 decimales, variable,
cambio de linea
<< setw(10) << setprecision(2) <<
Consumo
<< endl
<<"Descuento
: "
<< setw(10) << setprecision(2) <<
Dscto
<< endl
<<"Neto
: "
<< setw(10) << setprecision(2) <<
Neto
<< endl
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
<< "Impuesto
: "
<< setw(10) << setprecision(2) <<
Impuesto << endl
<< endl
<< "Importe a Pagar: "
<< setw(10) << setprecision(2) << Pago
<< endl;
getch();
}
nota 1: el manipulador ios::fixed fija
formato para reales
el
manipulador ios::showpoint muestra punto decimal y decimales
nota 2: el manipulador setw(nn) establece el
ANCHO del dato
el
manipulador setprecision(2) establece 2 decimales para un
real
nota 3: otra forma de escribir los mismos
resultados es:
cprintf("\r\nConsumo
: %10.2f",Consumo);
cprintf("\r\nDescuento
: %10.2f",Dscto);
cprintf("\r\nNeto
: %10.2f",Neto);
cprintf("\r\nImpuesto
: %10.2f",Impuesto);
cprintf("\r\nImporte a Pagar
: %10.2f",Importe);
para lo cual debe incluir la libreria
<stdio.h>
PROBLEMA 2
Dado 5 numeros cualquiera, encontrar el mayor y el numero de veces que se repite.
Solución:
// librerias
#include <conio.h>
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
#include <iostream.h>
// function principal
void main(){
//declaracion de variables
double A,B,C,D,E,mayor, veces;
// ingreso de 5 numeros
cout << "Ingrese 5 numeros separados por un
espacio: ";
cin >> A >> B >> C >> D >> E;
// Determinar el
mayor = A;
if ( mayor
if ( mayor
if ( mayor
if ( mayor
mayor de los numeros ingresados
// asume que es el primero
< B )
mayor = B;
< C )
mayor = C;
< D )
mayor = D;
< E )
mayor = E;
// cuantas veces se repite
veces=0;
if (mayor == A) veces++;
if (mayor == B) veces++;
if (mayor == C) veces++;
if (mayor == D) veces++;
if (mayor == E) veces++;
// Escribir resultado
cout << endl;
cout << "Mayor valor ingresado: " << mayor
<<endl;
cout << "Numero de veces que se repite:
"<<veces<<endl;
getch();
}
PROBLEMA 3:
El estado ha puesto en marcha un plan de subsidio a las familias bajo las siguientes
consideraciones:
a) hasta 2 hijos se le otorga S/.70.0
b) mas de 2 hasta 5 hijos se le otorga S/.90.0
c) mas de 5 hijos se le otorga S/.120,0
d) por cada hijo escolar se le otorga S/.10.0 adicionales
e) si la madre es viuda se le otorga S/.50 adicionales
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
Se desea saber el subsidio total que debe recibir una familia.
Solución:
// librerias
#include <conio.h>
#include <iostream.h>
#include <iomanip.h>
#include <ctype.h> // para la function toupper()
// funcion principal
void main(){
// declaracion de variables
int Nhijos, NhijosEsc;
char Ecivil;
double Subsidio;
// ingreso de datos
cout << "ingrese n£mero de hijos: "; cin >> Nhijos;
cout << "ingrese n£mero de hijos escolares: "; cin >>
NhijosEsc;
cout << "estado civil de la madre <Viuda,Otro> : ";
cin>>Ecivil;
Ecivil = toupper( Ecivil ); // convierte a mayuscula
// calcular subsidio por total de hijos
if ( Nhijos <= 2 )
Subsidio = 70;
else
if ( Nhijos <= 5 )
Subsidio = 90;
else
Subsidio = 120;
// incrementar subsidio por hijos en edad escolar
Subsidio = Subsidio + NhijosEsc * 10;
// incrementar subsidio por viudez de la madre
if ( Ecivil == 'V' )
Subsidio = Subsidio + 50;
// escribir subsidio
cout << "\nSu familia recibie un subsidio de "
<< Subsidio << " soles."<< endl;
cin.ignore();// ignora la ultima entrada de datos
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
getch();
}
PROBLEMA 4:
Resolver una ecuación de 2do grado.
2
AX + BX + C = 0
solución:
// librerias
#include <conio.h>
#include <iostream.h>
#include <iomanip.h>
#include <math.h>
// definir constantes
#define False 0
#define True 1
// funcion principal
void main(){
// declaracion de variables
double A,B,C,Disc,Raiz1,Raiz2;
int
Imaginario;
// ingreso de 3 coeficientes
cout << "Ingresar los 3 coeficientes separados por
espacios: ";
cin >> A >> B >> C;
// asumir que no hay raices imaginarias
Imaginario = False;
// verificar si la ecuación tiene solucion
if ( A == 0 && B == 0 )
cout << "Ecuacion sin solucion";
else{
if ( A == 0 ) {
Raiz1 = C / B * (-1);
Raiz2 = Raiz1;
}
else{
Disc = pow(B,2) - 4 * A * C;
if ( Disc < 0 )
{
Imaginario = True;
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
Disc
= -Disc;
}
Raiz1 = (-B + sqrt(Disc)) / (2 * A);
Raiz2 = (-B - sqrt(Disc)) / (2 * A);
}
// escribir resultados
cout << endl;
cout << setiosflags(ios::fixed |
ios::showpoint);
cout << "Ecuacion a resolver: " << endl
<< setw(12) << "2" << endl
<< setw(10) << setprecision(2) << A <<
"X + "
<< setw(0) << setprecision(2) << B <<
"X + "
<< setw(0) << setprecision(2) <<
C
<< " = 0"
<< endl
<< "Raiz 1 = " << setw(8) <<
setprecision(3) << Raiz1 << endl
<< "Raiz 2 = " << setw(8) <<
setprecision(3) << Raiz2 << endl;
if ( Imaginario )
cout << "Son raices imaginarias"<<endl;
}
cin.ignore();
getch();
}
nota: otra forma de escribir resultados es:
cprintf("\r\nEcuacion a resolver: \r\n
%12s","2");
cprintf("\r\n%10.2fX + %0.2fX + %0.2f =
0",A,B,C);
cprintf("\r\nRaiz 1 = %8.3f",Raiz1);
cprintf("\r\nRaiz 2 = %8.3f",Raiz2);
cprintf("\r\n");
if ( Imaginario )
cprintf("Son raices imaginarias");
para lo cual debe incluir la libreria <stdio.h>
PROBLEMA 5:
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
Una compañía de teléfonos necesita la siguiente información de cada cliente para emitir su
recibo de pago: nombre, dirección, número telefónico y cantidad de minutos consumidos en
el mes. Para el cálculo del importe de pago considere lo siguiente:
Los 50 primeros minutos son libres, los 100 siguientes tienen un costo de S/0.50 cada
minuto. Los 100 siguientes tienen un costo de S/0.30 cada minuto. Los siguientes minutos
tienen un costo de S/0.10 cada minuto. Se requiere emitir el recibo de pago correspondiente
mostrando los montos calculados.
Solución:
// librerias
#include <conio.h>
#include <iostream.h>
#include <iomanip.h>
// definicion de constantes
#define
tarifa0 0.00
#define
tarifa1 0.50
#define
tarifa2 0.30
#define
tarifa3 0.10
// funcion principal
void main(){
// declaracion de variables
char nombre[40], direccion[80], telefono[10];
int minutos, exceso0, exceso1, exceso2, exceso3;
double importe, importe0, importe1,importe2, importe3;
// ingreso de datos
cout << "ingrese nombre
:
cin.getline(nombre,40);
cout << "ingrese direccion :
cin.getline(direccion,80);
cout << "ingrese telefono :
cin.getline(telefono,10);
cout << "minutos consumidos:
";
";
";
"; cin >> minutos;
// inicializar minutos en exceso
exceso0 = exceso1 =
exceso2 = exceso3 = 0;
// calcular minutos en exceso
if ( minutos <= 50 )
exceso0 = minutos;
else if ( minutos <= 150 ){
exceso0 = 50;
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
exceso1 = minutos - 50;
} else if (minutos <= 250){
exceso0 = 50;
exceso1 = 100;
exceso2 = minutos-150;
} else{
exceso0 = 50;
exceso1 = 100;
exceso2 = 100;
exceso3 = minutos-250;
}
// calcular importes a pagar
importe0 = exceso0 * tarifa0;
importe1 = exceso1 * tarifa1;
importe2 = exceso2 * tarifa2;
importe3 = exceso3 * tarifa3;
importe = importe0 + importe1 + importe2 + importe3;
// mostrar resultados
cout << endl;
cout << "Nombre
: " << nombre << endl
<< "Direccion
: " << direccion << endl
<< "Telefono
: " << telefono << endl
<< endl;
cout << setiosflags(ios::fixed | ios::showpoint);
cout << setw(20) << "MINUTOS" << setw(10) << "TARIFA"
<< setw(15) << "IMPORTE" << endl
<< setw(20) << exceso0 << setw(10) <<
setprecision(2) << tarifa0
<< setw(15) << setprecision(2) << importe0 <<
endl
<< setw(20) << exceso1 << setw(10) <<
setprecision(2) << tarifa1
<< setw(15) << setprecision(2) << importe1 <<
endl
<< setw(20) << exceso2 << setw(10) <<
setprecision(2) << tarifa2
<< setw(15) << setprecision(2) << importe2 <<
endl
<< setw(20) << exceso3 << setw(10) <<
setprecision(2) << tarifa3
<< setw(15) << setprecision(2) << importe3 <<
endl;
cout << setw(20) << minutos << setw(10) << "
Alejandro Reyes Marzano
TOTAL"
[email protected]
C++
FISI
UNMSM
<< setw(15) << setprecision(2) << importe <<
endl;
cin.ignore();
getch();
}
Sentencia de alternativa multiple: switch
La sentencia switch ofrece una forma de realizar decisiones de alternativas multiples.
Sintaxis:
switch (variable) {
case valor1: acción1; break;
case valor2: acción2; break;
case valor3: acción3; break;
// ...
default: acciónx;
}
Compara el valor contenido en la variable con cada uno de los valores situados después del
case, ejecutando en caso de que exista coincidencia la acción correspondiente. Si no existe
coincidencia, se ejecuta la acciónx correspondiente al caso default. Y si no se pusiera el
default, simplemente no ejecuta ninguna instrucción dentro del switch.
La orden break hace que la ejecución salga del switch; de no ponerlo se ejecutarán todas
las órdenes hacia abajo sin importar el valor de los case hasta encontrar un break o la llave
de cierre del switch.
La variable del switch debe ser entera o de un solo caracter
Ejemplo 1: ingresar como numero entero el estado civil de una persona e imprimir su
descripción:
inicio
int ecivil;
Leer ecivil
switch(ecivil){
case 1: Imprimir “soltero” break;
case 2: Imprimir “casado” break;
case 3: Imprimir “casado” break;
case 4: Imprimir “casado” break;
default: // ningun caso anterior
Imprimir “error”
}
fin
PROBLEMA 6:
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
Dado 5 números cualquiera, encontrar el mayor valor positivo si es que lo hubiera, de lo
contrario de un mensaje adecuado.
Solución:
/*
Name:
Author:
Description:
mayor valor
comparador de numeros
Reyes Marzano, Alejandro
Dado 5 números cualquiera, encontrar el
positivo si es que lo hubiera, de lo
contrario de un
Date:
Copyright:
mensaje adecuado.
22/01/08 14:23
fisi_2008 lima peru
*/
// librerias
#include <conio.h>
#include <iostream.h>
// function principal
void main(){
//declaracion de variables
double A,B,C,D,E,mayor, veces;
// ingreso de 5 numeros
cout <<"Ingrese 5 numeros enteros = ";cin>>A>>B>>C>>D>>E;
// Determinar el mayor de los numeros ingresados
mayor = A; // asume que es el primero
if ( mayor < B )
mayor = B;
if ( mayor < C )
mayor = C;
if ( mayor < D )
mayor = D;
if ( mayor < E )
mayor = E;
cout << endl;
if (mayor>0){
cout << "Mayor valor positivo es : "<<mayor<<endl;
}
else{
cout << " No hay un mayor valor positivo\n"<<endl;
}
getche();
}
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
PROBLEMA 7:
Dado la cantidad de votos totales de 3 candidatos A, B, C. Determinar el ganador si es que
lo hubiera, caso contrario indicar quienes pasan a la segunda vuelta. Considere que el
ganador debe superar el 50% del total de los votos y pasan a la segunda vuelta quienes
tengan los 2 puntajes más altos. De no darse las condiciones para una segunda vuelta se
anula la elección.
Solución:
/*
Name:
Author:
Description:
Date:
Copyright:
Escruta votos
Reyes Marzano, Alejandro
ingrese los votos de los candidatos
22/01/08 14:34
*/
#include <iostream.h>
#include <conio.h>
void main(){
int A,B,C,ganador,mitad,totalvotos,porcganador;
cout<<"Ingrese los votos de A = ";cin>>A;
cout<<"Ingrese los votos de B = ";cin>>B;
cout<<"Ingrese los votos de c = ";cin>>C;
totalvotos=A+B+C;
cout<<"Total de votos = "<<totalvotos;
ganador=A;
if(ganador<B)
ganador=B;
if(ganador<C)
ganador=C;
cout<<endl;
if(ganador>totalvotos/2){
if(ganador==A)
cout<<"Ganador A"<<endl;
if(ganador==B)
cout<<"Ganador B"<<endl;
if(ganador==C)
cout<<"Ganador C"<<endl;
cout<<"felicitaciones"<<endl;
}
else{
cout<<"No hay ganador"<<endl;
cout<<"Habra segunda vuelta"<<endl;
}
if(A==B==C){
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
cout<<"No hay ganador"<<endl;
cout<<"Se anulan las elecciones"<<endl;
}
getche();
}
PROBLEMA 8:
Dado un número natural de 3 cifras, determine si es o no es un número capicúa. Se
considera que un número es capicúa cuando se lee igual de derecha a izquierda que de
izquierda a derecha. Verifique que le número dado tenga sólo 3 cifras, de lo contrario de un
mensaje adecuado.
Solución:
/*
Name:
Numero Capicua
Author:
Reyes Marzano, Alejandro
Description:
ingrese un numero
Date:
22/01/08 14:44
Copyright:
*/
//librerias
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void main(){
int N,a,b,c,n;
cout<<"Ingrese un numero de tres cifras = ";cin>>N;
cout<<endl;
if(N>=100 && N<1000){
a=N/100;
b=(N/10)%10;
c=N%10;
n=c*100+b*10+a;
cout<<"El numero invertido es = "<<n<<endl;
cout<<endl;
}
else{
cout<<"El numero no cumple con la condicion"<<endl;
}
if(N==n){
cout<<"El numero ingresado es capicua"<<endl;
}
else {
cout<<"El numero ingresado no es capicua"<<endl;
}
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
getche();
}
PROBLEMA 9:
Dado un número natural de no más de 3 cifras, determine su escritura en el formato
romano.
Solución:
/*
Name:
convierte un decimal a romano
Author:
Reyes Marzano, Alejandro
Description:
Dado un número natural de no más de 3
cifras,
determine su escritura en el formato
romano.
Date:
22/01/08 14:48
Copyright:
*/
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
void main(){
int N,digito,r,j;
cout<<"Ingrese un numero de maximo tres cifras\n
";cin>>N;
if(N>0 && N<1000){
cout<<"EN ROMANOS:\n";
r=N;
digito=r/100;
r=r%100;
if(digito==9)
cout<<"C"<<"M";
else{
if(digito>4){
cout<<"D";
for(j=1;j<=(digito-5);j++){
cout<<"C";
}
}
else{
if (digito==4)
cout<<"C"<<"D";
else{
for(j=1;j<=digito;j++)
cout<<"C";
Alejandro Reyes Marzano
=
[email protected]
C++
FISI
UNMSM
}
}
}
digito=r/10;
r=r%10;
if(digito==9)
cout<<"X"<<"C";
else{
if(digito>4){
cout<<"L";
for(j=1;j<=(digito-5);j++)
cout<<"X";
}
else{
if (digito==4)
cout<<"X"<<"L";
else{
for(j=1;j<=digito;j++)
cout<<"X";
}
}
}
digito=r;
if(digito==9)
cout<<"I"<<"X";
else{
if(digito>4){
cout<<"V";
for(j=1;j<=(digito-5);j++)
cout<<"I";
}
else{
if(digito==4)
cout<<"I"<<"V";
else{
for(j=1;j<=digito;j++)
cout<<"I";
}
}
}
}
else{
cout<<"No se encuentra en el rango pedido\n";
}
getche ();
}
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
PROBLEMA 10:
Dado 3 valores numéricos determine si pueden corresponder a un triángulo o no.
Solución:
/*
Name:
Author:
Description:
verifica si es un triangulo
Reyes Marzano, Alejandro
Dado 3 valores numéricos determine
si pueden corresponder a un triángulo o
no.
Date:
22/01/08 15:27
Copyright:
*/
#include <conio.h>
#include <iostream.h>
void main(){
int A,B,C,mayor,medio,menor,n,m,r,x,y,z;
cout<<"Ingrese tres numeros separados por un espacio en
blanco = ";
cin>>A>>B>>C;
n=A;
m=B;
r=C;
x=n;
y=m;
z=r;
mayor=A;
if(mayor<B)
mayor=B;
if(mayor<C)
mayor=C;
cout<<endl;
medio=n;
if(medio<m)
medio=m;
if(medio<r)
medio=r;
cout<<endl;
menor=x;
if(menor<y)
menor=y;
if(menor<z)
menor=z;
cout<<endl;
if(mayor-menor<medio && medio<mayor+menor){
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
if(mayor-medio<menor && menor<mayor+medio)
if(medio-menor<mayor && mayor<medio+menor)
cout<<"Es un triangulo"<<endl;}
else{
cout<<"No es un triangulo"<<endl;
}
getche ();
}
MODULO 03: ESTRUCTURAS REPETITIVAS
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
Antes de describir el funcionamiento y la utilidad de las estructuras repetitivas, hagamos un
repaso de los operadores disponibles en el lenguaje C++.
Operadores
Los operadores sirven para unir identificadores y literales formando expresiones, que son el
resultado de una operación.
A continuación se muestran los operadores aritméticos:
Descripción
*
Expresión
de
ejemplo
2*4
%
5%2
+
++
-+=
-=
*=
/=
%=
2+2
7-2
c++
c--(2+4)
X += 4
X -= 4
X *= 4
X /= 4
X %= 4
Símbolo
Multiplicación
Residuo de dividir
enteros
Suma
Resta
Aumenta en uno
Disminuye en uno
Menos unario
Suma al contenido
Resta al contenido
Multiplica al contenido
Divide al contenido
Residuo del contenido
Resultado del
ejemplo
8
1
c =
c =
X
X
X
X
X
=
=
=
=
=
4
5
c +
c -6
X +
X X *
X /
X %
1
1
4
4
4
4
4
Los operadores de comparación o también conocidos como relacionales y que devuelven
un valor lógico que será true si la comparación fue verdad y false en caso contrario son los
siguientes:
Descripción
Símbolo
Expresión
de ejemplo
2 == 2
2 != 2
2 < 2
3 > 2
Resultado del
ejemplo
true
false
false
true
==
Igualdad
!=
Desigualdad
<
Menor que
>
Mayor que
Menor o igual
<=
2 <= 2
true
que
Mayor o igual
>=
1 >= 2
false
que
Los operadores lógicos que permiten evaluar expresiones lógicas compuestas son los
siguientes:
Alejandro Reyes Marzano
[email protected]
C++
FISI
Descripción Símbolo
Negación
Y lógico
O lógico
!
&&
||
UNMSM
Resultado del
ejemplo
!(2 == 2)
false
(2 == 2) && (2 >= 0)
true
(2 == 2) || (2 != 2)
true
Expresión de ejemplo
Separadores
Existen otros caracteres con significado especial. Son los separadores:
Separador
()
{}
[]
;
,
.
Descripción
Contienen listas de parámetros, tanto en la
definición de un método como en la llamada al
mismo. También se utilizan para modificar la
precedencia en una expresión, contener
expresiones para control de flujo y realizar
conversiones de tipo.
Se utilizan para definir bloques de código,
definir ámbitos y contener los valores iniciales
de los vectores.
Se utiliza tanto para declarar vectores o
matrices como para referenciar valores dentro
de los mismos.
Separa sentencias.
Separa identificadores consecutivos en la
declaración de variables y en las listas de
parámetros. También se utiliza para encadenar
sentencias dentro de una estructura for.
Separa un nombre de propiedad o método de
una variable de referencia ú objeto.
ESTRUCTURA REPETITIVA: while
Repite la ejecución de la acción mientras la expresión lógica siga siendo verdad. Cuando
sea falsa, el proceso termina.
Inicialización
while (condición) {
acción
variación
}
Por ejemplo, imprimir los 100 primeros números naturales:
int n=1; // inicialización
while (n <=100) {
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
Imprimir n
n++ // aumenta en 1
}
Mientras que la condición sea verdad, se seguirá ejecutando la acción
ESTRUCTURA REPETITIVA: do – while
Igual que la anterior, con la única diferencia que la anterior evalúa la condición antes de
ejecutar la acción. En cambio, el do while evalúa la condición después de realizar la acción
por lo menos una vez.
Esta estructura de programación repetitiva es recomendable cuando la acción se va a
realizar de todas maneras, por lo menos una vez, o cuando no se sabe la cantidad de veces
que se va a repetir la acción.
inicialización
do {
acción
variación
}while (condición);
Por ejemplo, imprimir los 100 primeros números naturales:
int n=1; // inicialización
do {
Imprimir n
n++ // aumenta en 1
} while (n <=100);
ESTRUCTURA REPETITIVA: for
Es un while simplificado, mucho mas rápido y eficaz. Muy preferido por los
programadores. Veamos su forma general:
for (inicialización; condición; variación) {
acción;
}
Por ejemplo, imprimir los 100 primeros números naturales:
for (int n=1; n <=100; n++) {
Imprimir n;
};
La variación se relaciona con la variable utilizada en la condición.
En este caso lo primero que hará será la inicialización ( n=1;) luego comprobará si es cierta
la comparación (n <=100) y de ser verdad, ejecutará las instrucciones. Finalmente ejecutará
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
la variación ( n++ ) . Luego comprobará de nuevo la comparación para continuar con el
proceso repetitivo o para finalizar cuando el resultado de la comparación sea falsa.
Observe que todo proceso repetitivo necesita de una previa inicialización de algún
contador, acumulador, estado, lo cual permite la evaluación de la condición que controla la
repetición del proceso.
La inicialización puede incluir la declaración de la variable pero no necesariamente debe
ser así, por ejemplo:
int x;
for (x=1; x<=100; x++){
más ordenes
}
Cuál es la diferencia entre declararlo antes del for con hacer la declaración dentro de la
inicialización?. Simplemente el alcance para la utilización de la variable.
Cuando se declara antes del for, el alcance de la variable se extiende dentro y fuera de las
llaves del for; es decir que podemos utilizar la variable dentro y también fuera de las llaves;
en cambio, cuando se declara dentro de la inicialización, el alcance se limita solamente
dentro de las llaves del for; es decir que sólo se puede utilizar la variable dentro de las
llaves del for y nó fuera de ellas.
PROBLEMA 1:
Dado el número de mes, determinar su nombre y la estación a la que pertenece. Verificar
que el número esté entre 1 y 12, caso contrario dar un mensaje de error adecuado.
Solución:
#include <conio.h>
#include <iostream.h>
// funcion principal
void main(){
// declaracion de variables
int n;
// ingreso del numero de mes
cout << "Ingrese Numero de Mes: "; cin >> n;
// Determinar estaci¢n
cout<<endl<<"Estacion: ";
switch ( n ) {
case 1: case 2: case 3:
cout<<"Verano";
break;
case 4: case 5: case 6:
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
cout<<"Otoño";
break;
case 7: case 8: case 9 :
cout<<"Invierno"; break;
case 10: case 11: case 12 :
cout<<"Primavera";break;
default:
cout<<"Error en estación";
}
// Determinar nombre del mes
cout<<endl<<"Nombre del Mes: ";
switch ( n ) {
case 1 : cout<<"Enero";
break;
case 2 : cout<<"Febrero";
break;
case 3 : cout<<"Marzo";
break;
case 4 : cout<<"Abril";
break;
case 5 : cout<<"Mayo";
break;
case 6 : cout<<"Junio";
break;
case 7 : cout<<"Julio";
break;
case 8 : cout<<"Agosto";
break;
case 9 : cout<<"Setiembre"; break;
case 10: cout<<"Octubre";
break;
case 11: cout<<"Noviembre"; break;
case 12: cout<<"Diciembre"; break;
default: cout<<"Desconocido";
}
cout<<endl;
getch();
}
PROBLEMA 2:
El mismo problema anterior ejecutarlo repetidamente hasta que el número de mes sea
incorrecto.
Solución:
#include <conio.h>
#include <iostream.h>
// funcion principal
void main(){
// declaracion de variables
int n;
do {
// hacer esto
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
// ingreso del numero de mes
cout << "Ingrese Numero de Mes: "; cin >> n;
// Determinar estaci¢n
cout<<endl<<"Estacion: ";
switch ( n ) {
case 1: case 2: case 3:
cout<<"Verano";
break;
case 4: case 5: case 6:
cout<<"Otoño";
break;
case 7: case 8: case 9 :
cout<<"Invierno"; break;
case 10: case 11: case 12 :
cout<<"Primavera";
default:
cout<<"Error en estación";
}
break;
// Determinar nombre del mes
cout<<endl<<"Nombre del Mes: ";
switch ( n ) {
case 1 : cout<<"Enero";
break;
case 2 : cout<<"Febrero";
break;
case 3 : cout<<"Marzo";
break;
case 4 : cout<<"Abril";
break;
case 5 : cout<<"Mayo";
break;
case 6 : cout<<"Junio";
break;
case 7 : cout<<"Julio";
break;
case 8 : cout<<"Agosto";
break;
case 9 : cout<<"Setiembre"; break;
case 10: cout<<"Octubre";
break;
case 11: cout<<"Noviembre"; break;
case 12: cout<<"Diciembre"; break;
default: cout<<"Desconocido";
}
cout<<endl;
} while (n>=1 && n <=12);
}
PROBLEMA 3:
Dado un número entero, determinar cuántos dígitos tiene y cuánto suman entre ellos.
Solución:
#include <conio.h>
#include <iomanip.h>
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
void main(){
int n, cont=0, digito, suma=0;
cout<<"Numero entero: "; cin>>n;
do{
digito=n%10;
suma += digito;
cont++;
n /= 10;
}while(n!=0);
cout<<"cantidad de digitos: "<<cont<<endl;
cout<<"suma de digitos: "<<suma<<endl;
}
PROBLEMA 4:
Generar un número aleatorio entre 0 y 100 y trate de adivinarlo. El programa debe orientar
según el resultado con los mensajes “alto”, “bajo”. Al final debe mostrar el número de
intentos en los que adivinó el número.
Solución:
#include
#include
#include
#include
<conio.h>
<iomanip.h>
<iostream.h>
<stdlib.h>
// para numeros aleatorios
// adivina un numero
void main(){
int num, adivina, intentos=0;
// genera numero aleatorio
randomize();
num = random(101);
do{
cout <<"Adivina: "; cin>>adivina;
intentos++;
if (adivina>num) cout <<"alto"<<endl;
if (adivina<num) cout <<" bajo"<<endl;
}while(num!=adivina);
cout<<"felicitaciones, "<<"adivinaste en "<<intentos<<"
intentos"<<endl;
}
PROBLEMA 5:
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
Imprimir n términos de la serie de fibonacci: 1, 1, 2, 3, 5, 8, 13,..
Solución:
#include <conio.h>
#include <iomanip.h>
void main(){
int n, a=1, b=1, c;
cout<<"Numero de terminos: "; cin>>n;
for (int i=1; i<=n; i++){
if (i==1) cout <<a<<", ";
else if (i==2) cout <<b<<", ";
else{
c = a + b;
cout<<c<<", ";
a=b;
b=c;
}// fin del else
}// fin del for
cout<<endl;
}
PROBLEMA 6:
Determinar la suma de los n primeros términos de la siguiente serie:
1, 4, 7, 10, 13,…
Solución:
/*
Name:
Author:
Description:
términos de
Date:
Copyright:
serie p0306
Reyes Marzano, Alejandro
Determinar la suma de los n primeros
la siguiente serie:1,4,7,10,13, ...
22/01/08 16:10
fisi_2008 lima-peru
*/
#include <iostream.h>
#include <conio.h>
void main(){
int N,i,j;
float Suma;
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
cout<<"Ingrese la cantidad de terminos a sumar = ";
cin>>N;
i=1;j=1;Suma=0;
while(i<=N){
cout<<j<<", ";
Suma+=j;
i++;
j+=3;
}
cout<<" = "<<Suma<<endl;
cout<<endl;
cout<<"presione una tecla para continuar..."<<endl;
getche();
}
PROBLEMA 7:
Determinar la suma de los n primeros términos de la siguiente serie:
Solución:
/*
Name:
Author:
Description:
Date:
Copyright:
p0307
Reyes Marzano,Alejandro
Determinar la suma de los n
primeros términos de la siguiente serie:
?X^1+X?^2+X^(3 )+X^(4 )+?
22/01/08 16:22
*/
#include <iostream.h>
#include <conio.h>
void main(){
int N,i,x;
float Suma,j;
cout<<"Ingrese la cantidad de terminos a sumar = ";
cin>>N;
cout<<"ingrses x: ";cin>>x;
i=1;j=x;Suma=0;
while(i<=N){
cout<<j<<", ";
Suma+=j;
i++;
j*=x;
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
}
cout<<" = "<<Suma<<endl;
cout<<endl;
cout<<"presione una tecla para continuar..."<<endl;
getche();
}
PROBLEMA 8:
Escriba un programa que calcule el promedio de cualquier número de calificaciones.
Solución:
/*
Name:
p0308
Author:
Reyes Marzano, Alejandro
Description: Escriba un programa que calcule el promedio
De cualquier número de calificaciones
Date:
22/01/08 16:26
Copyright:
fisi_unmsm lima-peru
*/
#include <conio.h>
#include <iostream.h>
#include <math.h>
void main(){
int i=1,n;
float nota,suma=0,promedio,c;
cout<<"Ingrese la cantidad de notas = ";cin>>n;
while(i<=n){
cout<<"Ingrese nota = ";cin>>nota;
c=nota;
suma=suma+c;
i++;
c+=nota;
}
promedio=suma*1.0/n;
cout<<"El promedio de notas es = "<<promedio<<endl;
getche();
}
PROBLEMA 9:
Lea los pesos y tallas de los alumnos de una clase y determine la media de pesos y tallas.
Solución:
/*
Name:
Alejandro Reyes Marzano
p0309
[email protected]
C++
FISI
Author:
Description:
UNMSM
Reyes Marzano, Alejandro
Lea los pesos y tallas de los alumnos de
una
clase y determine la media de pesos y
tallas.
Date:
Copyright:
*/
22/01/08 16:30
fisi_unmsm lima peru
#include <conio.h>
#include <iostream.h>
void main(){
int N,i=1,j=1;
float talla,peso,suma1=0,suma2=0,promedio1,promedio2,c,v;
cout<<"Ingrese la cantidad de alumnos = ";cin>>N;
while(i<=N){
cout<<"Ingrese talla = ";cin>>talla;
c=talla;
suma1=suma1+c;
i++;
c+=talla;
}
promedio1=suma1*1.0/N;
cout<<"El promedio de tallas es = "<<promedio1<<endl;
while(j<=N){
cout<<"Ingrese peso = ";cin>>peso;
v=peso;
suma2=suma2+v;
j++;
v+=peso;
}
promedio2=suma2*1.0/N;
cout<<"El promedio de pesos es = "<<promedio2<<endl;
getche();
}
PROBLEMA 10:
Escriba un algoritmo que permita calcular Xn.
Solución:
/*
Name:
Author:
Description:
p0310
Reyes Marzano, Alejandro
Escriba un algoritmo que permita calcular
Xn
Alejandro Reyes Marzano
[email protected]
C++
FISI
Date:
Copyright:
UNMSM
22/01/08 16:34
fisi_unmsm lima peru
*/
#include <iostream.h>
#include <conio.h>
void main(){
int n,x,i=1;
float exp=1;
cout<<"Ingrese el valor del exponente = ";cin>>n;
cout<<"ingrses el valor de x: ";cin>>x;
while(i<=n){
exp*=x;
i++;
}
cout<<"El resultado es = "<<exp<<endl;
cout<<endl;
cout<<"presione una tecla para
continuar..."<<endl;
getche();
}
MODULO 04: ARREGLOS UNIDIMENSIONALES
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
En esta parte del curso empezaremos con los tipos de datos estructurados, y con el más
sencillo, los arrays (vector o arreglo).
Los arreglos permiten agrupar datos usando un mismo identificador. Todos los elementos
de un arreglo son del mismo tipo, y para acceder a cada elemento se usan subíndices.
Sintaxis:
<tipo> <identificador_del_arreglo>[<número de elementos>][[<número de elementos>]...];
Los valores para el número de elementos deben ser constantes, y se pueden usar tantas
dimensiones como queramos, limitado sólo por la memoria disponible.
Cuando sólo se usa una dimensión se suele hablar de listas o vectores, cuando se usan dos,
de tablas.
Ahora podemos ver que las cadenas de caracteres son un tipo especial de arreglos. Se trata
en realidad de arreglos de una dimensión de tipo char.
Los subíndices son enteros, y pueden tomar valores desde 0 hasta
<número_de_elementos>-1. Esto es muy importante, y hay que tener mucho cuidado, por
ejemplo:
int vector[25];
Creará un arreglo con 25 enteros a los que accederemos como vector[0] a vector[24].
Como subíndice podremos usar cualquier expresión entera.
En general C++ no verifica el ámbito de los subíndices. Si declaramos un arreglo de 25
elementos, no obtendremos errores al acceder al elemento 26. Sin embargo, si asignamos
valores a elementos fuera del ámbito declarado, estaremos accediendo a zonas de memoria
que pueden pertenecer a otras variables o incluso al código ejecutable de nuestro programa,
con consecuencias generalmente desastrosas.
Ejemplo:
int Tabla[20][20];
double QuinTabla[5][15][15][10][25];
QuinTabla[3][11][0][4][6] = QuinTabla[0][12][5][3][1];
Tabla[0][0] += Tabla[9][9];
Cada elemento de Tabla, desde Tabla[0][0] hasta Tabla[9][9] es un entero. Del mismo
modo, cada elemento de QuinTabla es un real de alta precisión.
ASIGNACION DE ARREGLOS:
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
Los arreglos pueden ser inicializados en la declaración.
Ejemplos:
float R[10] = {2, 32, 4.6, 2, 1, 0.5, 3, 8, 0, 12};
float M[] = {2, 32, 4.6, 2, 1, 0.5, 3, 8, 0, 12};
int A[] = {1, 2, 3, 6};
int L[][3] = { 213, 32, 32, 32, 43, 32, 3, 43, 21};
char Mensaje[] = "Error de lectura";
En estos casos no es obligatorio especificar el tamaño para la primera dimensión, como
ocurre en los ejemplos de las líneas 2, 3, 4 y 5. En estos casos la dimensión que queda
indefinida se calcula a partir del número de elementos en la lista de valores iniciales.
En el caso 2, el número de elementos es 10, ya que hay diez valores en la lista.
En el caso 3, será 4.
En el caso 4, será 3, ya que hay 9 valores, y la segunda dimensión es 3: 9/3=3.
Y en el caso 5, el número de elementos es 17, 16 caracteres más el cero de fin de cadena.
ALGORITMOS DE ORDENACION, METODO DE LA BURBUJA:
Una operación que se hace muy a menudo con los arreglos, sobre todo con los de una
dimensión, es ordenar sus elementos.
Dedicaremos más capítulos a algoritmos de ordenación, pero ahora veremos uno de los más
usados, aunque no de los más eficaces, se trata del método de la burbuja.
Consiste en recorrer la lista de valores a ordenar y compararlos dos a dos. Si los elementos
están bien ordenados, pasamos al siguiente par, si no lo están los intercambiamos, y
pasamos al siguiente, hasta llegar al final de la lista. El proceso completo se repite hasta que
la lista está ordenada.
Lo veremos mejor con un ejemplo:
Ordenar la siguiente lista de menor a mayor:
15, 3, 8, 6, 18, 1.
Empezamos comparando 15 y 3. Como están mal ordenados los intercambiamos, la lista
quedará:
3, 15, 8, 6, 18, 1
Tomamos el siguiente par de valores: 15 y 8, y volvemos a intercambiarlos, y seguimos el
proceso...
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
Cuando llegamos al final la lista estará así:
3, 6, 8, 15, 1, 18
Empezamos la segunda pasada, pero ahora no es necesario recorrer toda la lista. Si observas
verás que el último elemento está bien ordenado, siempre será el mayor, por lo tanto no será
necesario incluirlo en la segunda pasada. Después de la segunda pasada la lista quedará:
3, 6, 8, 1, 15, 18
Ahora es el 15 el que ocupa su posición final, la penúltima, por lo tanto no será necesario
que entre en las comparaciones para la siguiente pasada. Las sucesivas pasadas dejarán la
lista así:
3ª 3, 6, 1, 8, 15, 18
4ª 3, 1, 6, 8, 15, 18
5ª 1, 3, 6, 8, 15, 18
PROBLEMA 1:
Inicializar un arreglo con 8 números enteros y determinar el primer mayor, el primer
menor, la suma de sus valores y el valor promedio entre ellos.
Solución:
#include <conio.h>
#include <iostream.h>
// declaraciones globales
int A[] = {22,32,25,67,54,78,26,17};
int n=8;
// funcion principal
void main(){
// declaracion de variables
int mayor, menor, suma;
int indMay, indMen, i;
double promedio;
// Determinar indice del primer mayor y del primer
menor
mayor = A[0]; indMay =0;
// supuesto del primer
menor = A[0]; indMen =0;
// supuesto del primer
valor
valor
Alejandro Reyes Marzano
[email protected]
C++
FISI
suma
=
0;
UNMSM
//
acumulador
de
suma
for (i = 0; i < n; i++){
if ( A[i] > mayor )
indMay = i;
if ( A[i] < menor )
indMen = i;
suma += A[i];
}
// calcular promedio
promedio = suma*1.0/n;
// Mostrar resultados
cout << setw(40) << "Arreglo Inicializado" << endl;
for (i = 0; i < n; i++)
cprintf("%5d%10d\r\n",i,A[i]);
cprintf("\r\nMayor valor
cprintf(" corresponde al
cprintf("\r\nMenor valor
cprintf(" corresponde al
cprintf("\r\nLa suma es
cprintf("\r\nEl promedio
getch();
= %10d",A[indMay]);
elemento nro. %10d",indMay);
= %10d",A[indMen]);
elemento nro. %10d",indMen);
= %10d",suma);
es = %10.2f",promedio);
}
PROBLEMA 2:
Considere un arreglo para guardar un máximo de 20 nombres y otro arreglo para guardar 20
notas correspondientes a los alumnos de un salón. Luego, ingrese los datos
correspondientes y emita un reporte donde se asigne un grado de “satisfactorio” si la nota
esta en el rango del promedio mas menos 10; “sobresaliente” si la nota esta por encima del
promedio mas 10 y, “deficiente” si la nota esta por debajo del promedio – 10.
Solución:
#include <conio.h>
#include <iostream.h>
#include <string.h>
// para strcpy()
// definicion de constantes
#define PtajeMax 100 // puntaje maximo
#define MaxAlum
20 // maxima cantidad de alumnos
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
// declaraciones globales
int
Notas[MaxAlum];
// arreglo de notas
char Nombres[MaxAlum][20]; // arreglo de nombres
int
n =0;
// cuántos se ingresaron
// funcion principal
void main(){
// variables
int i, suma;
double Promedio;
char grado[30];
// ingresar numero de alumnos
do {
cout << "Ingresar numero de alumnos <1.."
<< MaxAlum << ">: ";
cin >> n;
cin.ignore();
// ignorar el enter
} while (n > MaxAlum || n < 1);
// Ingreso de datos
for (i = 0; i < n; i++) {
cprintf("%10s%5d\r\n","Alumno # " ,i+1);
cout
<<
"Nombre
:
";
cin.getline(Nombres[i],20);
do {
cout << "Nota <0.." << PtajeMax << "> : ";
cin >> Notas[i];
cin.ignore();
// ignorar el enter
} while ( Notas[i] > PtajeMax);
}
// calcular promedio
suma = 0;
for (i = 0; i < n; i++)
suma += Notas[i];
Promedio = (double) suma / n;
// Mostrar resultados
for (i = 0; i < n; i++) {
cprintf("%2d)%-20s%15d",i+1,Nombres[i],Notas[i]);
if ( (Notas[i] > Promedio - 10) &&
(Notas[i] < Promedio + 10) )
strcpy(grado," Satisfactorio");
else
if ( Notas[i] > Promedio + 10 )
strcpy(grado," Sobresaliente");
else
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
strcpy(grado," Deficiente
cprintf("%20s\r\n",grado);
");
}
cprintf("\r\nPuntaje Promedio: %10.2f",Promedio);
getch();
}
PROBLEMA 3:
Considere un arreglo para un máximo de 20 números enteros e ingréselos evitando que se
repitan.
Solución:
/*
Name:
p0403
Author:
Reyes Marzano, Alejandro
Description: Considere un arreglo para un máximo de 20
números
enteros e ingréselos evitando que se repitan.
Date:
23/01/08 20:00
Copyright:
*/
#include <iostream.h>
#include <stdlib.h>
int main(){
int A[20],aux,cont=0;
bool sw=false;
cout<<"Ingrese los numero :\n";
while(cont<20){
cin>>aux;
int i=0;
while(i<cont && !sw){
if(A[i]==aux)
sw=true;
i++;
}
if(!sw){
A[cont]=aux;
cont++;
}
else{
cout<<"Numero Repetido :";
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
sw=false;
}
}
cont=0;
cout<<"Los numeros son:\n";
while(cont<20){
aux=A[cont];
cout<<aux<<endl;
cont++;
}
system("PAUSE");
return 0;
}
PROBLEMA 4:
Considere dos arreglos de 10 números enteros cada uno. Inicialice los arreglos y en un
tercer arreglo guarde la suma de cada casillero. Luego muestre el contenido de los 3
arreglos en forma de tabla marcando con un * aquellos que tengan la mayor suma.
Solución:
/*
Name:
p0404
Author:
Reyes Marzano, Alejandro
Description: Considere dos arreglos de 10 números enteros
cada uno.
Inicialice los arreglos y en un tercer
arreglo guarde
la suma de cada casillero. Luego muestre el
contenido
de los 3 arreglos en forma de tabla marcando
con un * aquellos que tengan la mayor suma.
Date:
23/01/08 20:17
Copyright:
fisi_unmsm Lima-Peru
*/
#include <iostream.h>
#include <stdlib.h>
int main(){
int A[10]={15,16,2,33,36,38,92,856,5,12};
int L[10]={12,9,585,15,69,75,236,54,52,35};
int E[10];
for(int i=0;i<10;i++){
E[i]=A[i]+L[i];
}
int suma=0,med;
Alejandro Reyes Marzano
[email protected]
C++
FISI
for(int i=0;i<10;i++){
suma+=E[i];
}
med=suma/10;
cout<<"\nPromedio = "<<med<<endl;
for(int i=0;i<10;i++){
cout<<"
"<<E[i]<<" = "<<A[i]<<"
if(E[i]>med)
cout<<" * "<<endl;
else
cout<<endl;
}
system("PAUSE");
return 0;
UNMSM
+
"<<L[i];
}
PROBLEMA 5:
Considere un arreglo para guardar un máximo de 10 nombres de producto diferentes, otro
arreglo para guardar el precio de cada producto y otro arreglo para guardar la cantidad en
stock. Escriba un programa que permita desarrollar el siguiente menú de opciones:
[1] Ingreso de datos
[2] Listado general
[3] Listado de productos más caros
[4] Listado de productos bajo stock (menos de 10)
[0] Fin
Solución:
Name:
p0404
Author:
Reyes Marzano, Alejandro
Description: Considere dos arreglos de 10 números enteros
cada uno.
Inicialice los arreglos y en un tercer
arreglo guarde
la suma de cada casillero. Luego muestre el
contenido
de los 3 arreglos en forma de tabla marcando
con un * aquellos que tengan la mayor suma.
Date:
23/01/08 20:17
Copyright:
fisi_unmsm Lima-Peru
*/
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#define NUM_MAX
10
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
int main(){
char nombres[NUM_MAX][10];
float stock[NUM_MAX];
float precios[NUM_MAX];
int op,tope=0;
do{
system("cls");
cout<<"[1] para ingresar datos\n";
cout<<"[2] para Ver listado General\n";
cout<<"[3] para Ver los precios mas altos\n";
cout<<"[4] para Ver los stock mas bajos\n";
cout<<"[0] Salir del Programa\n";
cout<<"\nIngrese la opccion : ";
cin>>op;
switch(op){
case 1:{ system("cls");
//leer datos
int val;
cout<<"ingrese numero de Productos:";
cin>>val;
if(tope+val<NUM_MAX){
for(int i=0;i<val;i++){
cout<<"\nIngrese nombres del
"<<tope+i+1<<" producto: ";
gets(nombres[tope+i]);
cout<<"\nIngrese el precio del :
"<<nombres[tope+i]<<" : ";
cin>>precios[tope+i];
cout<<"\nIngrese el stock del :
"<<nombres[tope+i]<<" : ";
cin>>stock[tope+i];
}
tope+=val;
}
else{
cout<<"fuera de rango \n";
}
}break;
case 2:{system("cls");
//mostrar datos
cout<<"Producto\t\tPrecio\t\t\tStock\n";
cout<<"********\t\t******\t\t\t*******\n";
for(int i=0;i<tope;i++){
printf("%s\t\t\t%f\t\t
%f\n",nombres[i],precios[i],stock[i]);
}
printf("\n");
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
system("PAUSE");
}break;
case 3:{system("cls");
//productos mas caros
cout<<"PRECIOS MAS ALTOS : \n\n";
float temp1,temp2;
char temp3[10];
for(int j=0;j<tope;j++){
for(int i=0;i<tope-1;i++){
if(precios[i]<precios[i+1]){
temp1=precios[i];
temp2=stock[i];
temp3=nombres[i];
precios[i]=precios[i+1];
stock[i]=stock[i+1];
nombres[i]=nombres[i+1];
precios[i+1]=temp1;
stock[i+1]=temp2;
nombres[i+1]=temp3;
}
}
}
//mostrar datos
cout<<"Producto\t\tPrecio\t\t\tStock\n";
cout<<"********\t\t******\t\t\t*******\n";
for(int i=0;i<tope;i++){
printf("%s\t\t\t%f\t\t
%f\n",nombres[i],precios[i],stock[i]);
}
printf("\n");
system("PAUSE");
}break;
case 4:{system("cls");
//stock's mas bajos
cout<<"STOCK MAS BAJOS:\n";
float temp1,temp2;
char temp3[10];
for(int j=0;j<tope;j++){
for(int i=0;i<tope-1;i++){
if(stock[i]>stock[i+1]){
temp1=precios[i];
temp2=stock[i];
temp3=nombres[i];
precios[i]=precios[i+1];
stock[i]=stock[i+1];
nombres[i]=nombres[i+1];
precios[i+1]=temp1;
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
stock[i+1]=temp2;
nombres[i+1]=temp3;
}
}
}
//mostrar datos
cout<<"Producto\t\tPrecio\t\t\tStock\n";
cout<<"********\t\t******\t\t\t*******\n";
for(int i=0;i<tope;i++){
printf("%s\t\t\t%f\t\t
%f\n",nombres[i],precios[i],stock[i]);
}
printf("\n");
system("PAUSE");
}break;
case 0: exit(0);
break;
default:cout<<"No existe esa opcion \n";
}
}while(op!=0);
system("PAUSE");
return 0;
}
MODULO 05: FUNCIONES
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
CONCEPTO:
Las funciones son un conjunto de instrucciones que realizan una tarea específica. En
general toman unos valores de entrada, llamados parámetros y proporcionan un valor de
salida o valor de retorno; aunque tanto unos como el otro pueden no existir.
Tal vez sorprenda que las introduzca tan pronto, pero como son una herramienta muy
valiosa, y se usan en todos los programas C++, creo que debemos tener, al menos, una
primera noción de su uso. Al igual que con las variables, las funciones pueden declararse y
definirse. Una declaración es simplemente una presentación, una definición contiene las
instrucciones con las que realizará su trabajo la función.
En general, la definición de una función se compone de las siguientes secciones, aunque
pueden complicarse en ciertos casos:
Opcionalmente, una palabra que especifique el tipo de almacenamiento, puede ser
"extern" o "static". Si no se especifica es "extern". No te preocupes de esto todavía, de
momento sólo usaremos funciones externas, sólo lo menciono porque es parte de la
declaración. Una pista: las funciones declaradas como extern están disponibles para todo el
programa, las funciones static pueden no estarlo.
El tipo del valor de retorno, que puede ser "void", si no necesitamos valor de retorno. Si no
se establece, por defecto será "int". Aunque en general se considera de mal gusto omitir el
tipo de valor de retorno.
Modificadores opcionales. Tienen un uso muy específico, de momento no entraremos en
este particular, lo veremos en capítulos posteriores.
El nombre de la función. Es costumbre, muy útil y muy recomendable, poner nombres que
indiquen, lo más claramente posible, qué es lo que hace la función, y que permitan
interpretar qué hace el programa con sólo leerlo. Cuando se precisen varias palabras para
conseguir este efecto existen varias reglas aplicables de uso común. Una consiste en separar
cada palabra con un "_", la otra, que yo prefiero, consiste en escribir la primera letra de
cada palabra en mayúscula y el resto en minúsculas. Por ejemplo, si hacemos una función
que busque el número de teléfono de una persona en una base de datos, podríamos llamarla
"busca_telefono" o "BuscaTelefono".
Una lista de declaraciones de parámetros entre paréntesis. Los parámetros de una función
son los valores de entrada (y en ocasiones también de salida). Para la función se comportan
exactamente igual que variables, y de hecho cada parámetro se declara igual que una
variable. Una lista de parámetros es un conjunto de declaraciones de parámetros separados
con comas. Puede tratarse de una lista vacía. En C es preferible usar la forma "func(void)"
para listas de parámetros vacías. En C++ este procedimiento se considera obsoleto, se usa
simplemente "func()".
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
Un cuerpo de función que representa el código que será ejecutado cuando se llame a la
función. El cuerpo de la función se encierra entre llaves "{}".
Una función muy especial es la función "main". Se trata de la función de entrada, y debe
existir siempre, será la que tome el control cuando se ejecute un programa en C++.
Los programas Windows usan la función WinMain() como función de entrada, pero esto se
explica en otro lugar.
Existen reglas para el uso de los valores de retorno y de los parámetros de la función
"main", pero de momento la usaremos como "int main()" o "int main(void)", con un entero
como valor de retorno y sin parámetros de entrada. El valor de retorno indicará si el
programa ha terminado sin novedad ni errores retornando cero, cualquier otro valor de
retorno indicará un código de error.
En C++ es obligatorio usar prototipos. Un prototipo es una declaración de una función.
Consiste en una definición de la función sin cuerpo y terminado con un ";". La estructura de
un prototipo es:
<tipo> func(<lista de declaración de parámetros>);
Por ejemplo:
int Mayor(int a, int b);
Sirve para indicar al compilador los tipos de retorno y los de los parámetros de una función,
de modo que compruebe si son del tipo correcto cada vez que se use esta función dentro del
programa, o para hacer las conversiones de tipo cuando sea necesario. Los nombres de los
parámetros son opcionales, y se incluyen como documentación y ayuda en la interpretación
y comprensión del programa. El ejemplo de prototipo anterior sería igualmente válido y se
podría poner como:
int Mayor(int,int);
Esto sólo indica que en algún lugar del programa se definirá una función "Mayor" que
admite dos parámetros de tipo "int" y que devolverá un valor de tipo "int". No es necesario
escribir nombres para los parámetros, ya que el prototipo no los usa. En otro lugar del
programa habrá una definición completa de la función.
Normalmente, las funciones se declaran como prototipos dentro del programa, o se
incluyen estos prototipos desde un fichero externo, (usando la directiva "#include", ya lo
hemos dicho más arriba, pero las funciones son "extern" por defecto. Esto quiere decir que
son accesibles desde cualquier punto del programa, aunque se encuentren en otros ficheros
fuente del mismo programa. En contraposición las funciones declaradas "static" sólo son
accesibles dentro del fichero fuente donde se definen.
La definición de la función se hace más adelante o más abajo, según se mire. Lo habitual es
hacerlo después de la función "main".
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
La estructura de un programa en C o C++ quedaría así:
[directivas del pre-procesador: includes y defines]
[declaración de variables globales]
[prototipos de funciones]
función main
[definiciones de funciones]
Una definición de la función "Mayor" podría ser la siguiente:
int Mayor(int a, int b){
if(a > b)
return a;
else
return b;
}
Los programas complejos se escriben normalmente usando varios ficheros fuente.
Estos ficheros se compilan separadamente y se enlazan juntos. Esto es una gran ventaja
durante el desarrollo y depuración de grandes programas, ya que las modificaciones en un
fichero fuente sólo nos obligarán a compilar ese fichero fuente, y no el resto, con el
consiguiente ahorro de tiempo. La definición de las funciones puede hacerse dentro de los
ficheros fuente o enlazarse desde librerías pres compilados. La diferencia entre una
declaración y una definición es que la definición posee un cuerpo de función.
En C++ es obligatorio el uso funciones prototipo, y aunque en C no lo es, resulta altamente
recomendable.
OBJETIVO:
Simplificar y reducir el cuerpo de cualquier función haciéndola más entendible y mejor
organizada.
ESQUEMA:
Para incorporar funciones en un programa C++, debe considerarse el siguiente esquema
general:
// librerias
…
// prototipos de las funciones
tipo_de_dato nombre(lista de parámetros);
// variables globales
….
// funcion principal
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
void main(){
//Declaraciones locales
….
//llamadas
…
}
// desarrollo de los prototipos
tipo_de_dato nombre(lista de parámetros){
// declaraciones locales
// cuerpo de la función
}
// librerias
…
// prototipos de las funciones
tipo_de_dato nombre(lista de parámetros);
// variables globales
….
// funcion principal
void main(){
//Declaraciones locales
….
//llamadas
…
}
// desarrollo de los prototipos
tipo_de_dato nombre(lista de parámetros){
// declaraciones locales
// cuerpo de la función
}
PROTOTIPOS
Existen 4 formas de escribir un prototipo de alguna función:
Cuando la función es SIN RETORNO y SIN PARAMETROS
void nombre();
Cuando la función es SIN RETORNO y CON PARAMETROS
void nombre(lista de parámetros);
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
Cuando la función es CON RETORNO y SIN PARAMETROS
tipo_de_dato nombre();
Cuando lafunción es CON RETORNO yCON PARAMETROS
tipo_de_dato nombre(lista de parámetros);
LLAMADAS:
Según el prototipo de una función, las llamadas pueden realizarse de las siguientes formas:
Para funciones SIN RETORNO:
nombre(lista de valores separados por comas);
Para funciones CON RETORNO:
variable = nombre();
variable = nombre(lista de valores separados por comas);
DESARROLLO DE LOS PROTOTIPOS:
Según el prototipo de una función, el desarrollo tiene el siguiente esquema:
Para funciones SIN RETORNO y SIN PARAMETROS
void nombre(){
// declaraciones locales
Cuerpo de la función
}
Para funciones SIN RETORNO:y CON PARAMETROS:
•
void nombre(lista de parámetros separados por comas){
// declaraciones locales
Cuerpo de la función
}
Para funciones CON RETORNO y SIN PARAMETROS
tipo_de_dato nombre(){
// declaraciones locales
Cuerpo de la función
return valor;
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
}
Para funciones CON RETORNO y CON PARAMETROS
tipo_de_dato nombre(lista de parámetros separados por comas){
// declaraciones locales
Cuerpo de la función
return valor;
}
La lista de parámetros no es otra cosa que una lista de variables que tienen tipo de dato y
nombre.
Los parámetros sirven para que la función reciba valores cuando sea llamada. También
sirven para que la función retorne valores. Sin embargo, para éste propósito el nombre de la
variable debe estar precedido por el símbolo & que indica que el parámetro se pasa por
referencia, es decir lo que se pasa es la referencia a la dirección de memoria de la variable.
PROBLEMA 1:
Determinar la suma de los n primeros términos de la siguiente serie:
1,
4,
7,
10,
13,
……
Utilice funciones CON variables globales en su solución:
Solución:
/*
Name:
Author:
Description:
Date:
Copyright:
p0501
Reyes Marzano, Alejandro
Determinar la suma de los n primeros
términos de la siguiente serie:1,4,7,10,13
24/01/08 10:54
fisi_unmsm lima-peru
*/
// librerias
#include <conio.h>
#include <conio.c>
#include <iostream.h>
#include <iomanip.h>
// prototipos
void leer();
void proceso();
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
void resultado();
// variables globales
int n, suma=0, valor=1;
// funcion principal
void main(){
// llamadas
leer();
proceso();
resultado();
}
// desarrollo de prototipos
//función leer lee la cantidad de elementos
void leer(){
cout <<"Cuantos terminos: ";
cin >> n;
}
//funcion de procesamiento
void proceso(){
for (int i=1; i<=n; i++){
cout<<valor;
if (i<n) cout <<",";
suma += valor;
valor += 3;
}
}
//funcion que muestra en pantalla los resultados
void resultado(){
cout<<endl<<"Suma: "<<suma<<endl;
getch();
}
PROBLEMA 2:
Determinar la suma de los n primeros términos de la siguiente serie:
Utilice funciones SIN variables globales en su solución:
Solución:
/*
Name:
Alejandro Reyes Marzano
p0502
[email protected]
C++
FISI
Author:
Description:
de taylor
Date:
Copyright:
*/
UNMSM
Reyes Marzano, Alejandro
Determinar la suma de los n primeros
términos de la siguiente serie:expresion
24/01/08 10:54
fisi_unmsm lima-peru
// librerias
#include <conio.h>
#include <conio.c>
#include <iostream.h>
#include <iomanip.h>
#include <math.h>
// prototipos
int leeN();
double leeX();
double sumaSerie(int n, double x);
int factorial(int n);
void imprime(double rpta);
// funcion principal
void main(){
int n=leeN();
double x=leeX();
double suma=sumaSerie(n,x);
imprime(suma);
}
// desarrollo de prototipos
int leeN(){
int n;
cout <<"Cuantos terminos: ";
return n;
}
//
//
//
//
llamada
llamada
llamada
llamada
a
a
a
a
leeN()
leeX()
sumaSerie()
imprime()
cin >> n;
double leeX(){
double x;
cout <<"Valor de X: "; cin >> x;
return x;
}
double sumaSerie(int n, double x){
double suma=0;
for (int cont=1; cont<=n; cont++){
suma += pow(x,cont)/factorial(cont);
}
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
return suma;
}
int factorial(int n){
int f=1;
for (int c=1; c<=n; c++){
f *= c; // f = f * c;
}
return f;
}
void imprime(double rpta){
cout << endl<< "suma de serie: "<<rpta;
getch();
}
PROBLEMA 3:
Dado un número entero, determinar la suma de sus dígitos, el número de dígitos que tiene y
el número que resulta de invertir sus dígitos. Presentar un menú de opciones para elegir el
proceso que se desea desarrollar.
Utilice funciones SIN variables globales en su solución:
Solución:
/*
Name:
Author:
Description:
de sus
p0503
Reyes Marzano, Alejandro
Dado un número entero, determinar la suma
dígitos, el número de dígitos que tiene y
el número
que resulta de invertir sus dígitos.
Presentar un menú de opciones para elegir
el proceso
Date:
Copyright:
que se desea desarrollar.
24/01/08 11:08
fisi_unmsm lima-peru
*/
// librerias
#include <conio.h>
#include <conio.c>
#include <iostream.h>
#include <iomanip.h>
#include <math.h>
// prototipos
Alejandro Reyes Marzano
[email protected]
C++
int
int
int
int
int
FISI
UNMSM
menu();
leeNumero();
sumaDigitos(int n);
numeroDigitos(int n);
invierte(int n);
// funcion principal
void main(){
int opcion, n;
do{
opcion=menu();
switch(opcion){
case 1:
n=leeNumero();
cout<<"La suma de digitos es:
"<<sumaDigitos(n)<<endl;
break;
case 2:
n=leeNumero();
cout<<"Numero de digitos:
"<<numeroDigitos(n)<<endl;
break;
case 3:
n=leeNumero();
cout<<"Numero invertido es:
"<<invierte(n)<<endl;
break;
}
}while(opcion!=0);
}
//desarrollo de funciones propias
int menu(){
int opcion;
cout<<"*****************************"<<endl;
cout<<"[1] suma digitos"<<endl;
cout<<"[2] cuantos digitos"<<endl;
cout<<"[3] invierte numero"<<endl;
cout<<"[0] fin"<<endl;
cout<<"OPCION: ";
cin>>opcion;
cout<<"*****************************"<<endl;
return opcion;
}
int leeNumero(){
int n;
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
cout<<"ingresa un numero entero: "; cin>>n;
return n;
}
int sumaDigitos(int n){
int suma=0, digito;
while(n>0){
digito=n%10;
suma += digito;
n /=10;
}
return suma;
}
int numeroDigitos(int n){
int cont=0;
while(n>0){
cont++;
n /= 10;
}
return cont;
}
int invierte(int n){
int digito, ninv=0, ndig;
ndig=numeroDigitos(n);
for (int i=1; i<=ndig; i++){
digito=n%10;
ninv += digito*(int)pow(10,ndig-i); //parte entera
n /= 10;
}
return ninv;
}
PROBLEMA 4:
Escriba un programa que permita dibujar un rectángulo relleno con asteriscos. El largo y el
ancho deben ser datos ingresados.
Utilice funciones SIN variables globales en su solución.
Solución:
/*
Name:
Author:
Alejandro Reyes Marzano
p0504
Reyes Marzano, Alejandro
[email protected]
C++
FISI
Description:
rectángulo
UNMSM
Escriba un programa que permita dibujar un
relleno con asteriscos. El largo y el
ancho deben
Date:
Copyright:
ser datos ingresados.
24/01/08 11:16
fisi_unmsm lima-peru
*/
// librerias
#include <iostream.h>
#include <conio.h>
//prototipos
void rectangulo(int a, int b);
int leerAltura();
int leerAncho();
//funcion principal rectangulo
void main(){
// llamadas
int a=leerAltura();
int b=leerAncho();
rectangulo(a,b);
getche ();
}
// desarrollo de prototipos
int leerAltura(){
int a;
cout<<"INGRESE ALTURA:";
cin>>a;
return a;
}
int leerAncho(){
int b;
cout<<"INGRESE ANCHO:";cin>>b;
return b;
}
void rectangulo(int a, int b){
int i,j;
for (int i=1; i<=a; i++){
for (int j=1; j<=b; j++)
cout <<"*";
cout<<endl;
}
getche();
}
PROBLEMA 5:
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
Escriba un programa que permita dibujar un triángulo rectángulo isósceles relleno con
asteriscos. El lado debe ser ingresado.
Utilice funciones SIN variables globales en su solución.
Solución:
/*
Name:
p0505
Author:
Reyes Marzano, Alejandro
Description:
grafica un triangulo con contorno de
asteriscos
Date:
24/01/08 11:16
Copyright:
fisi_unmsm lima-peru
*/
// librerias
#include <iostream.h>
#include <conio.h>
//prototipos
int leerLado();
void trianguloisosceles(int l);
//funcion principal triangulo
void main(){
//llamadas
int l=leerLado();
trianguloisosceles(l);
getche ();
}
//desarrollo de prototipos
int leerLado(){
int l;
cout<<"INGRESE LADO:";cin>>l;
return l;
}
void trianguloisosceles(int l){
int i,j;
for(i=1;i<=l;i++) {
for(j=1;j<=i;j++)
cout<<"*";
cout<<endl;
}
getche();
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
}
PROBLEMA 6:
Escriba un programa que permita dibujar un rombo relleno con asteriscos. El tamaño debe
ser ingresado.
Utilice funciones SIN variables globales en su solución.
Solución:
/*
Name:
Author:
Description:
Date:
Copyright:
p0506
Reyes Marzano, Alejandro
grafica un rombo con relleno de asteriscos
24/01/08 11:29
fisi_unmsm lima-peru
*/
// librerias
#include <conio.h>
#include <iostream.h>
//prototipos
int leerDiagonal();
void rombo(int d);
//funcion principal
void main(){
//llamadas
int d=leerDiagonal();
rombo(d);
getche();
}
//desarrollo de los prototipos
int leerDiagonal(){
int d;
cout<<"Ingrese diagonal del rombo";cin>>d;
return d;
}
void rombo(int d){
int v,h,f,c;
f=1;
v=d/2+1;
h=d/2+1;
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
while(f<=d/2+1){
for(c=1;c<=d;c++){
if(v<=c && c<=h)
cout<<"*";
else
cout<<" ";
}
cout<<endl;
v=v-1;
h=h+1;
f=f+1;
}
v=2;
h=d-1;
while(f<=d){
for(c=1;c<=d;c++){
if(v<=c && c<=h)
cout<<"*";
else
cout<<" ";
}
cout<<endl;
v=v+1;
h=h-1;
f=f+1;
}
getche();
}
PROBLEMA 7:
Dado un número entero positivo escriba una función que retorne un nuevo número pero
sólo con las cifras pares que contenga.
Solución:
/*
Name:
Author:
Description:
función
p0507
Reyes Marzano, Alejandro
Dado un número entero positivo escriba una
que retorne un nuevo número pero sólo con
las cifras
Date:
Copyright:
pares que contenga.
24/01/08 11:49
fisi_unmsm lima-peru
*/
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
// librerias
#include <conio.h>
#include <iostream.h>
#include <math.h>
//prototipos
long leerN();
long numCifrasPares(long n);
//funcion principal
void main(){
//llamadas
long n=leerN();
n=numCifrasPares(n);
if(n==0){
cout<<"\nNo tiene cifras pares ...\n";
}
else{
cout<<"\nel numero formado por las cifras pares es:\
n"<<n<<endl;
}
getche();
}
long leerN(){
long n;
cout<<"Ingrese un numero:\n";
cin>>n;
return n;
}
long numCifrasPares(long n){
long a,aux=0;
int i=0;
while(n!=0){
a=n%10;
n=n/10;
if(a%2==0){
aux+=a*(int)pow(10,i);
i++;
}
}
return aux;
}
PROBLEMA 8:
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
Dado un número entero positivo escriba una función que retorne el mayor número posible
con sus cifras.
Solución:
/*
Name:
Author:
Description:
función
p0508
Reyes Marzano, Alejandro
Dado un número entero positivo escriba una
que retorne el mayor número posible con
sus cifras.
Date:
Copyright:
*/
24/01/08 12:18
fisi_unmsm lima-peru
// librerias
#include <conio.h>
#include <iostream.h>
#include <math.h>
//prototipos
long leerN();
long numMayor(long n);
int numCifars(long n);
void ordenar(int v[],int n);
//funcion principal
void main(){
//llamadas
long n=leerN();
cout<<"El mayor numero
"<<numMayor(n);
getche();
}
con
cifras
de
"<<n<<"
es
:
long leerN(){
long n;
cout<<"Ingrese un numero:\n";
cin>>n;
return n;
}
long numMayor(long n){
int t=numCifars(n);
int v[t],i=0;
while(n!=0){
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
v[i]=n%10;
i++;
n=n/10;
}
ordenar(v,t);
long aux=0;
for(i=0;i<t;i++){
aux+=v[i]*(int)pow(10,i);
}
return aux;
}
void ordenar(int v[],int n){
int temp;
for(int j=0;j<n;j++){
for(int i=0;i<n-1;i++){
if(v[i]>v[i+1]){
temp=v[i];
v[i]=v[i+1];
v[i+1]=temp;
}
}
}
}
int numCifars(long n){
int num=0;
while(n!=0){
n=n/10;
num++;
}
return num;
}
PROBLEMA 9:
Dado un número entero positivo escriba una función que retorne la cifra que más se repite.
Por ejm: dado el número 43525, la respuesta debe ser: 5
Solución:
/*
Name:
Author:
Description:
función
Alejandro Reyes Marzano
p0509
Reyes Marzano, Alejandro
Dado un número entero positivo escriba una
[email protected]
C++
FISI
UNMSM
que retorne la cifra que más se repite.
Por ejm:
dado el número 43525, la respuesta debe
ser: 5
Date:
Copyright:
*/
24/01/08 12:32
fisi_unmsm lima-peru
// librerias
#include <conio.h>
#include <iostream.h>
#include <math.h>
//prototipos
long leerN();
int numCifars(long n);
int cifraRepetida(long n);
//funcion principal
void main(){
//llamadas
long n=leerN();
cout<<"La cifra q mas se repite es "<<cifraRepetida(n);
getche();
}
long leerN(){
long n;
cout<<"Ingrese un numero:\n";
cin>>n;
return n;
}
int numCifars(long n){
int num=0;
while(n!=0){
n=n/10;
num++;
}
return num;
}
int cifraRepetida(long n){
int t=numCifars(n),i,j;
int v[t];
for(i=0;i<t;i++){
v[i]=n%10;
n/10;
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
}
int mayor=0,aux=v[0];
for(i=0;i<t-1;i++){
int cont=0;
for(j=i+1;j<t;j++){
if(v[i]==v[j]){
cont++;
}
}
if(cont>mayor){
mayor=cont;
aux=v[i];
}
}
return aux;
}
FUNCIONES RECURSIVAS
CARACTERISTICAS:
• Se llaman así mismo tantas veces como lo permite la condición de finalización.
• No se debe declarar variables locales.
• No se debe utilizar estructuras iterativas en su desarrollo (for, while)
• Solamente el if.
• Simplifican las estructuras de código a cambio de un mayor consumo de memoria.
Pueden ser de dos tipos:
 Sin retorno
 Con retorno
Sin retorno
(void main(){ )
Ida antes de llamada
Vuelta después de llamada
Ejercicios
1. Dada un número entero positivo muestra los números naturales hasta dicho número en
forma descendente.
/*
Name:
Author:
Description:
números
p05rec01
Reyes Marzano, Alejandro
Dada un número entero positivo muestra los
naturales hasta dicho número en forma
descendente
Date:
Copyright:
*/
24/01/08 13:47
fisi_unmsm lima-peru
// librerias
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
#include <conio.h>
#include <iostream.h>
#include <math.h>
//prototipos
long leerN();
void mostraRec(long n);
//variables globales
long MAX_NUM=0;
//funcion principal
void main(){
//llamadas
long n=leerN();
MAX_NUM=n;
mostraRec(n);
getche();
}
long leerN(){
long n;
cout<<"Ingrese un numero:\n";
cin>>n;
return n;
}
void mostraRecDescendente(long n){
if(n!=0){
cout<<" "<<n;
mostraRec(n-1);
}
}
2. Dada un número entero positivo muestra los números naturales pares hasta dicho número
en forma ascendente.
void mostraRecAscendente(long n){
if(n!=MAX_NUM+1){
cout<<" "<<n;
mostraRec(n+1);
}
}
3. Dada un número entero positivo muestra los números naturales impares hasta dicho número
en forma ascendente.
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
void mostraRecDescendente(long n){
if(n!=0){
cout<<" "<<n;
mostraRec(n-2);
}
}
4. Dada un número entero positivo muestra los números naturales hasta dicho número en
forma ascendente.
void mostraRecAscendente(long n){
if(n!=MAX_NUM+1){
cout<<" "<<n;
mostraRec(n+1);
}
}
Con retorno
Ejercicios
1. Dada un numero natural que retorne la suma de dichos números incluyendo al numero dado
long sumaRec(long n){
if(n>0)
return sumaRec(n-1)+n;
else
return 0;
}
2. Dada un número natural que retorne el factorial de dichos numero.
long factorial(int n){
if(n==1 || n==0){
return 1;
}
else{
return factorial(n-1)*n;
}
}
3. Dada un numero natural que retorne la suma de los naturales pares comprendidos hasta el
numero dado.
long sumaRec(long n){
if(n>0){
cout<<" + "<<n;
return sumaRec(n-2)+n;
}
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
else
return 0;
}
4. Dada un numero natural que retorne la suma de los naturales impares comprendidos hasta
el numero dado.
long sumaRec(long n){
if(n>0){
cout<<" + "<<n;
return sumaRec(n-2)+n;
}
else
return 0;
}
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
MODULO 06: ARREGLOS BIDIMENSIONALES CON FUNCIONES
Arreglos bidimensionales se puede considerar como vector de vectores. Es por consiguiente
un conjunto de elementos todos del mismo tipo, en cual el orden de los componentes es
significativo y en el que se necesita especificar dos subíndices para poder identificar cada
elemento del arreglo.
Un arreglo bidimensional también se denomina matriz o tabla, se considera que tiene dos
dimensiones una dimensión por cada subíndice y necesita un valor para cada subíndice para
poder identificar un elemento individual.
En la notación estándar normalmente el primer subíndice se refiere a la fila del arreglo,
mientras que el segundo subíndice se refiere a la columna del arreglo.
Ejemplo:
Int A[8][6];
Es un arreglo de enteros con 8 filas y 6 columnas
15
66
3
333
225
885
58
55
2
98
52
3
5
6
522
5
3
66
198
2225
19
11
11
11
66
662
125
555
5
5
2565
111
88
55
144
22
26
22
22
22
87
68
2
32
9
66
3
222
Si se quiere acceder al elemento de la fila 3 y columna 5 seria de la siguiente forma A[3]
[5]; y elemento en referencia seria cuyo valor es 144.
PROBLEMA 1:
Considere una matriz de números enteros de 5 filas x 5 columnas y desarrolle el siguiente
menú de opciones:
[1] Generar números aleatorios de 2 cifras
[2] Sumar filas
[3] Sumar columnas
[4] Sumar diagonal principal
[5] Sumar diagonal secundaria
[0] Fin
Solución:
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
/*
Name:
Author:
Description:
de 5 filas x
p0601
Reyes Marzano, Alejandro
Considere una matriz de números enteros
5 columnas y desarrolle el siguiente menú
de opciones:
Date:
24/01/08 15:40
Copyright:
fisi_unmsm lima-peru
*/
//librerias
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
//constantes
#define FILAS 5
#define COLUMNAS 5
//prototipos
int menu();
void opcion1();
void opcion2();
void opcion3();
void opcion4();
void opcion5();
void listar();
int aleatorio(int li, int ls);
int sumaFila(int f);
int sumaColumna(int c);
int sumaDiagonal();
int sumaDiagonalsec();
//variables globales
int matriz[FILAS][COLUMNAS];
//funcion principal
int main(int argc, char *argv[]){
int op;
do{
op=menu();
switch(op){
case 1: opcion1(); break;
Alejandro Reyes Marzano
[email protected]
C++
FISI
case
case
case
case
2:
3:
4:
5:
opcion2();
opcion3();
opcion4();
opcion5();
UNMSM
break;
break;
break;
break;
}
}while(op!=0);
system("PAUSE");
return EXIT_SUCCESS;
}
//desarrollo
int menu(){
int op;
cout<<"[1] Genera"<<endl;
cout<<"[2] Suma Filas"<<endl;
cout<<"[3] Suma Columnas"<<endl;
cout<<"[4] Suma Diagonal Principal"<<endl;
cout<<"[5] Suma Diagonal Secundaria"<<endl;
cout<<"[0] Fin"<<endl;
cout<<"OPCION: "; cin>>op;
return op;
}
void opcion1(){
for(int f=0; f<FILAS;f++){
for(int c=0; c<COLUMNAS; c++)
matriz[f][c]=aleatorio(10,99);
}
listar();
getche();
}
void listar(){
for(int f=0; f<FILAS;f++){
for(int c=0; c<COLUMNAS; c++)
printf("%5d", matriz[f][c]);
printf("\r\n");
}
}
int aleatorio(int inic, int fin){
int n;
do{
n=rand()*(fin-inic+1)/3000+inic;
}while(n<inic||n>fin);
return n;
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
}
void opcion2(){
listar();
for(int f=0; f<FILAS; f++)
cout<<"Suma
"<<sumaFila(f)<<endl;
getche();
}
de
la
fila["<<f<<"]:
int sumaFila(int f){
int suma=0;
for(int c=0; c<COLUMNAS; c++)
suma += matriz[f][c];
return suma;
}
void opcion3(){
listar();
for(int c=0; c<COLUMNAS; c++)
cout<<"Suma de
"<<sumaColumna(c)<<endl;
getche();
}
la
columnas["<<c<<"]:
int sumaColumna(int c){
int suma=0;
for(int f=0; f<FILAS; f++)
suma += matriz[f][c];
return suma;
}
void opcion4(){
cout<<"Suma de la diagonal: "<<sumaDiagonal()<<endl;
getche();
}
int sumaDiagonal(){
int suma=0;
for(int f=0;f<=FILAS;f++){
for(int c=0;c<=COLUMNAS;c++)
if(f==c)
suma+=matriz[f][c];
}
return suma;
}
Alejandro Reyes Marzano
[email protected]
C++
FISI
void opcion5(){
cout<<"Suma
de
"<<sumaDiagonalsec()<<endl;
getche();
}
UNMSM
la
diagonal
secundario:
int sumaDiagonalsec(){
int suma=0,i;
i=FILAS-1;
for(int c=0;c<=COLUMNAS;c++){
for(int f=0;f<=FILAS;f++)
if((c+f)==i)
suma+=matriz[c][f];
}
return suma;
}
PROBLEMA 2:
Considere un arreglo de cadenas para los nombres de un máximo de 10 alumnos. Una
matriz de 10 x 4 para las notas y otro arreglo para los promedios de cada alumno y
desarrolle el siguiente menú de opciones:
[1] Ingresar datos: nombre y 4 notas por alumno
[2] Promediar sin considerar la nota menor en todos los alumnos
[3] Reportar en forma de tabla mostrando % de aprobados y % de desaprobados
[4] Identificar el/los alumnos que hayan alcanzado el mayor promedio
[5] Identificar el/los alumnos que hayan alcanzado el menor promedio
[0] Fin
Solución:
/*
Name:
Author:
Description:
de 5 filas x
p0602
Reyes Marzano, Alejandro
Considere una matriz de números enteros
5 columnas y desarrolle el siguiente menú
de opciones:
Date:
24/01/08 16:00
Copyright:
fisi_unmsm lima-peru
*/
//librerias
#include <cstdlib>
#include <iostream>
#include <conio.h>
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
#include <stdlib.h>
#include <iomanip.h>
using namespace std;
//constantes
#define filas 10
#define nomb 10
#define col 4
//prototipos
int menu();
void opcion1();
void opcion2();
void prom();
void opcion3();
void opcion4();
void opcion5();
//variables globales
char nombre[nomb][20];
int notas[filas][col];
int promedio[nomb] ;
int n;
//funcion principal
int main(int argc, char *argv[]){
int op;
do{
op=menu();
switch(op){
case 1: opcion1(); break;
case 2: opcion2(); break;
case 3: opcion3(); break;
case 4: opcion4(); break;
case 5: opcion5(); break;
}
}while(op!=0);
system("PAUSE");
}
//desarrollo
int menu(){
int op;
cout<<"[1] Ingresar datos: nombre y 4 notas por
alumno"<<endl;
cout<<"[2] Promediar sin considerar la nota menor en
todos los alumnos"<<endl;
cout<<"[3] Reportar en forma de tabla mostrando % de
aprobados y % de desaprobados"<<endl;
cout<<"[4] Identificar el/los alumnos que hayan alcanzado
el mayor promedio"<<endl;
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
cout<<"[5] Identificar el/los alumnos que hayan alcanzado
el menor promedio "<<endl;
cout<<"[0] Fin"<<endl;
cout<<"OPCION: "; cin>>op;
return op;
}
void opcion1(){
int i,d,r;
cout<<"Ingrese numero de alumnos"<<endl; cin>>n;
for(d=0;d<n;d++){
cout<<"Ingrese nombre";
cin>>nombre[d];
cout<<endl;
for( i=0;i<col;i++){
cout<<"Ingrese nota "<<i+1<<" : ";
cin>>r;
notas[d][i]=r;
cout<<endl;
}
cout<<endl<<endl;
}
getche();
}
void opcion2(){
int temp;
for(int m=0;m<n;m++){
for(int i=0;i<col;i++){
for(int k=1;k<col;k++){
if(notas[m][i]>notas[m][k]){
temp=notas[m][i];
notas[m][i]=notas[m][k];
notas[m][k]=temp;
}
}
}
}
int suma=0;
for(int x=0;x<n;x++){
suma=0;
for(int r=1;r<col;r++){
suma+=notas[x][r];
}
promedio[x]=suma/(col-1);
cout<<"Promedio de
"<<nombre[x]<<"="<<promedio[x]<<endl;
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
}
getche();
}
void opcion3(){
int ap=0,des=0;
float a,b;
cout<<setw(10)<<"ALumno"<<setw(6)<<setw(10)<<"estado"<<en
dl<<endl;
for(int i=0;i<n;i++){
if(promedio[i]>11){
cout<<setw(10)<<nombre[i]<<setw(6)<<setw(10)<<"
APROBADO"<<endl;
ap=ap+1;
}
else{
cout<<setw(10)<<nombre[i]<<setw(6)<<setw(10)<<"
DESAPROBADO"<<endl;
des=des+1;
}
}
a=(ap*100)*1.0/n;
b=(des*100)*1.0/n;
cout<<setw(10)<<"APROBADO"<<setw(20)<<setw(20)<<"DESAPROB
ADO"<<endl<<endl;
cout<<setw(10)<<a<<"%"<<setw(6)<<setw(10)<<b<<"%"<<endl;
}
void opcion4() {
int s,y,suma,aux,m,mayor;
for(int y=0;y<n;y++){
suma=0;
for(int s=1;s<col;s++){
suma+=notas[y][s];
promedio[y]=suma/(col-1);
}
mayor=promedio[0];
for(int m=0;m<n;m++){
if(promedio[m]>mayor)
mayor=promedio[m];
}
}
for(m=0;m<n;m++){
if(promedio[m]==mayor)
cout<<""<<nombre[m]<<endl;
}
cout<<"mayor promedio ="<<mayor<<endl;
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
}
void opcion5(){
int s,y,suma,aux,m,menor;
for(int y=0;y<n;y++){
suma=0;
for(int s=1;s<col;s++){
suma+=notas[y][s];
promedio[y]=suma/(col-1);
}
menor=promedio[0];
for(int m=0;m<n;m++){
if(promedio[m]<menor)
menor=promedio[m];
}
}
for(m=0;m<n;m++){
if(promedio[m]==menor)
cout<<""<<nombre[m]<<endl;
}
cout<<"menor promedio ="<<menor<<endl;
}
PROBLEMA 3:
Considere una matriz de números enteros de 10 filas x 20 columnas y desarrolle el
siguiente menú de opciones:
[1] Generar números aleatorios binarios (0,1)
[2] Muestre un * por cada 1 que encuentre en toda la matriz
[3] Muestre en % la cantidad de 1 y la cantidad de 0 que hay en la matriz
[4] Determine la mayor cantidad de 0 continuos que encuentre en forma horizontal y en qué
fila lo encontró
[5] Determine la mayor cantidad de 1 continuos que encuentre en forma vertical y en qué
columna lo encontró
[0] Fin
Solución:
/*
Name:
Author:
Description:
de 10 filas
p0603
Reyes Marzano, Alejandro
Considere una matriz de números
enteros
x 20 columnas y desarrolle el siguiente
menú de
Alejandro Reyes Marzano
[email protected]
C++
FISI
Date:
Copyright:
UNMSM
opciones:
24/01/08 16:09
fisi_unmsm lima-peru
*/
//librerias
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <iomanip.h>
#include <math.h>
#define FILAS 10
#define COLUMNAS 20
//prototipos
int menu();
void opcion1();
void opcion2();
void opcion3();
void opcion4();
void opcion5();
int aleatorio(int li,int ls);
void generar();
void listar();
//variables globales
int matriz[FILAS][COLUMNAS];
int aux[FILAS];
//funcion principal
int main(){
int op;
do{
op=menu();
switch(op){
case 1: opcion1();
case 2: opcion2();
case 3: opcion3();
case 4: opcion4();
case 5: opcion5();
}
}while(op!=0);
system("PAUSE");
return 0;
}
break;
break;
break;
break;
break;
int menu(){
int op;
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
cout<<"MENU"<<endl;
cout<<"===="<<endl;
cout<<"[1] Generar números aleatorios binarios
(0,1)"<<endl;
cout<<"[2] Muestre un * por cada 1 que encuentre en toda
la matriz"<<endl;
cout<<"[3] Muestre en % la cantidad de 1 y la cantidad de
0 que hay en la matriz"<<endl;
cout<<"[4] Determine la mayor cantidad de 0 en que
fila"<<endl;
cout<<"[5] Determine la mayor cantidad de 1 en que
columna"<<endl;
cout<<"[0] Fin"<<endl;
cout<<"OPCION: "; cin>>op;
return op;
}
void opcion1(){
cout<<endl<<setw(45)<<"numeros aleatorios (0,1)";
cout<<endl<<setw(45)<<"--------------------"<<endl;
cout<<endl;
generar();
listar();
getche();
}
void generar(){
for(int f=0;f<FILAS;f++){
for(int c=0;c<COLUMNAS;c++){
matriz[f][c]=aleatorio(0,1);
}
}
}
int aleatorio(int inic,int fin){
int n;
do{
n=rand()*(fin-inic+1)/200+inic;
}while(n<inic||n>fin);
return n;
}
void listar(){
for(int f=0;f<FILAS;f++){
for(int c=0;c<COLUMNAS;c++){
cout<<setw(2)<<matriz[f][c]<<" ";
cout<<setw(2);
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
}
cout<<endl<<endl;
}
}
void opcion2(){
cout<<endl<<setw(45)<<"muestra * por cada 1";
cout<<endl<<setw(45)<<"--------------------"<<endl;
cout<<endl;
for(int f=0;f<FILAS;f++){
for(int c=0;c<COLUMNAS;c++)
if(matriz[f][c]==1)
cout<<setw(4)<<" * ";
cout<<endl;
}
}
void opcion3(){
float suma=0,porc,porcs,total;
cout<<endl<<setw(45)<<"porcentaje de 1 y de 0 ";
cout<<endl<<setw(43)<<" ---------------------"<<endl;
cout<<endl;
for(int f=0;f<FILAS;f++){
for(int c=0;c<COLUMNAS;c++)
if(matriz[f][c]==1)
suma+=matriz[f][c];
}
total=FILAS*COLUMNAS;
porc=suma*1.0*100/total;
porcs=100-porc;
cout<<setw(10)<<"el porcentaje de 1 es
"<<setw(10)<<porc<<setw(6)<<"%"<<endl;
cout<<setw(10)<<"el porcentaje de 0 es
"<<setw(10)<<porcs<<setw(6)<<"%"<<endl;
}
void opcion4(){
int cont=0,mayor,indmay;
cout<<endl<<setw(45)<<"cantidad de 0 ";
cout<<endl<<setw(45)<<"--------------"<<endl;
cout<<endl;
for(int f=0;f<FILAS;f++){
for(int c=0;c<COLUMNAS;c++)
if(matriz[f][c]==0)
cont+=1;
aux[f]=cont;
cont=0;
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
}
for(int f=0;f<FILAS;f++)
cout<<setw(3)<<aux[f];
cout<<endl;
mayor=aux[1];
for(int f=0;f<FILAS;f++){
if(mayor<aux[f]){
mayor=aux[f];
indmay=f+1;
}
}
cout<<setw(20)<<"cantidad de 0"<<setw(20)<<"FILA"<<endl;
cout<<setw(20)<<mayor<<setw(20)<<indmay<<endl;
getche();
}
void opcion5(){
int cont=0,mayor,indmay,auxi[COLUMNAS];
cout<<endl<<setw(45)<<"cantidad de 1 ";
cout<<endl<<setw(45)<<"-------------"<<endl;
cout<<endl;
for(int c=0;c<COLUMNAS;c++){
for(int f=0;f<FILAS;f++)
if(matriz[f][c]==1)
cont+=1;
auxi[c]=cont;
cont=0;
}
for(int i=0;i<COLUMNAS;i++)
cout<<setw(3)<<aux[i];
cout<<endl;
mayor=auxi[1];
for(int i=0;i<COLUMNAS;i++){
if(mayor<aux[i]){
mayor=auxi[i];
indmay=i+1;
}
}
cout<<setw(20)<<"cantidad de
1"<<setw(20)<<"COLUMNA"<<endl;
cout<<setw(20)<<mayor<<setw(20)<<indmay<<endl;
getche();
}
PROBLEMA 4:
Considere una matriz de números enteros de 10 filas x 10 columnas y desarrolle el
siguiente menú de opciones:
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
[1] Generar números aleatorios menores a 1000
[2] Ordene sólo las filas
[3] Ordene sólo las columnas
[4] Ordene toda la matriz por filas
[5] Ordene toda la matriz por columnas.
[0] Fin
Solución:
/*
Name:
Author:
Description:
de 10 filas
p0604
Reyes Marzano, Alejandro
Considere una matriz de números enteros
x 10 columnas y desarrolle el siguiente
menú de
Date:
Copyright:
opciones:
24/01/08 16:09
fisi_unmsm lima-peru
*/
//librerias
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <iomanip.h>
#include <math.h>
#define FILAS 10
#define COLUMNAS 10
//prototipos
int menu();
void opcion1();
void opcion2();
void opcion3();
void opcion4();
void opcion5();
int aleatorio(int li,int ls);
void generar();
void mostrar();
void ordenarfilas();
void ordenarcolumnas();
void ordenar();
void porfilas();
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
void porcolumnas();
//variables globales
int matriz[FILAS][COLUMNAS];
int auxi[100];
//funcion principal
int main(){
int op;
do{
op=menu();
switch(op){
case 1:
case 2:
case 3:
case 4:
case 5:
}
opcion1();
opcion2();
opcion3();
opcion4();
opcion5();
break;
break;
break;
break;
break;
}while(op!=0);
system("PAUSE");
return 0;
}
int menu(){
int op;
cout<<"MENU"<<endl;
cout<<"===="<<endl;
cout<<"[1] Generar numeros aleatorios menores a
1000"<<endl;
cout<<"[2] Ordene solo las filas"<<endl;
cout<<"[3] Ordene solo las columnas"<<endl;
cout<<"[4] Ordene toda la matriz por filas"<<endl;
cout<<"[5] Ordene toda la matriz por columnas"<<endl;
cout<<"[0] Fin"<<endl;
cout<<"OPCION: "; cin>>op;
return op;
}
void opcion1(){
cout<<endl<<setw(40)<<"NUMEROS ALEATORIOS
(0,1000)"<<endl;
cout<<setw(40)<<"==========================="<<endl;
generar();
mostrar();
getche();
}
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
void generar(){
for(int f=0;f<FILAS;f++){
for(int c=0;c<COLUMNAS;c++){
matriz[f][c]=aleatorio(0,999);
}
}
}
int aleatorio(int inic,int fin){
int n;
do{
n=rand()*(fin-inic+1)/2000+inic;
}while(n<inic||n>fin);
return n;
}
void mostrar(){
for(int f=0;f<FILAS;f++){
for(int c=0;c<COLUMNAS;c++){
cout<<setw(6);
cout<<matriz[f][c]<<" ";
}
cout<<endl<<endl;
}
}
void opcion2(){
cout<<endl<<setw(40)<<"NUMEROS ORDENADOS POR
FILAS"<<endl;
cout<<setw(40)<<"==========================="<<endl;
ordenarfilas();
mostrar();
getche();
}
void ordenarfilas(){
int temp;
for(int f=0;f<FILAS;f++){
for(int b=0;b<COLUMNAS-1;b++){
for(int c=0;c<COLUMNAS-1;c++){
if(matriz[f][c]>matriz[f][c+1]){
temp=matriz[f][c];
matriz[f][c]=matriz[f][c+1];
matriz[f][c+1]=temp;
}
}
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
}
}
}
void opcion3(){
cout<<endl<<setw(40)<<"NUMEROS ORDENADOS POR
COLUMNAS"<<endl;
cout<<setw(40)<<"=============================="<<endl;
ordenarcolumnas();
mostrar();
getche();
}
void ordenarcolumnas(){
int temp;
for(int c=0;c<COLUMNAS;c++){
for(int b=0;b<FILAS-1;b++){
for(int f=0;f<FILAS-1;f++){
if(matriz[f][c]>matriz[f+1][c]){
temp=matriz[f][c];
matriz[f][c]=matriz[f+1][c];
matriz[f+1][c]=temp;
}
}
}
}
}
void opcion4(){
cout<<endl<<setw(40)<<"NUMEROS ORDENADOS DESDE
FILAS"<<endl;
cout<<setw(40)<<"============================="<<endl;
ordenar();
porfilas();
mostrar();
getche();
}
void porfilas(){
int i=0;
for(int f=0;f<FILAS;f++){
for(int c=0;c<COLUMNAS;c++){
matriz[f][c]=auxi[i];
i++;
}
}
}
Alejandro Reyes Marzano
[email protected]
C++
FISI
UNMSM
void opcion5(){
cout<<endl<<setw(40)<<"NUMEROS ORDENADOS DESDE
COLUMNAS"<<endl;
cout<<setw(40)<<"================================"<<endl;
ordenar();
porcolumnas();
mostrar();
getche();
}
void porcolumnas(){
int i=0;
for(int c=0;c<COLUMNAS;c++){
for(int f=0;f<FILAS;f++){
matriz[f][c]=auxi[i];
i++;
}
}
}
void ordenar(){
int i=0,temp;
//guardamos la matriz en un vector auxiliar
for(int f=0;f<FILAS;f++){
for(int c=0;c<COLUMNAS;c++){
auxi[i]=matriz[f][c];
i++;
}
}
//ordenamos el vector
for(int a=0;a<99;a++){
for(int b=0;b<99;b++){
if(auxi[b]>auxi[b+1]){
temp=auxi[b];
auxi[b]=auxi[b+1];
auxi[b+1]=temp;
}
}
}
}
Alejandro Reyes Marzano
[email protected]

Documentos relacionados