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]