Prácticas de C++ Practica Nº 3 Informática II Fundamentos de Programación Prof. Dr. Paul Bustamante Practica Nº3 Programación en C++ Pág. 1 ÍNDICE ÍNDICE ........................................................................................................................................ 1 1. Introducción...................................................................................................................... 1 1.1 Ejercicio 1: Mi primeras Funciones ........................................................................... 1 1.2 Ejercicio 2: Cálculo de las Raíces de una Función .................................................... 2 1.3 Ejercicio 3: Estructuras y Funciones.......................................................................... 3 1.4 Ejercicio 4: Cálculo del Seno de un ángulo ............................................................... 4 1. Introducción. Como ya lo hemos venido haciendo, el primer ejercicio de esta práctica debe realizarlo solo, con el fin de que pueda ganar más experiencia en la programación en C++. En algunos ejercicios se dará el código, lo que no significa que sólo tenga que escribirlo en el ordenador, debe tratar de realizarlos por su cuenta. Recuerde borrar los ficheros que estén en los subdirectorios \debug y \release del proyecto, para que libere espacio en su disco G\. 1.1 Ejercicio 1: Mi primeras Funciones Este ejercicio permite introducirle un poco en el cálculo estadístico, para lo cual vamos a implementar el método de la desviación estándar. Como ya habíamos dicho en clase, la desviación estandar es un valor que nos da la dispersión que hay entre varias muestras (es cero cuando todas son iguales). La fórmula de la desviación estandar es la siguiente: ∑ (x n −1 σ= i =0 i −x n −1 ) n −1 2 , donde x= ∑x i =0 i n A continuación se dará la estructura general del programa, debiendo poner cada uno el código necesario, respetando los nombres de las funciones: //Calculo de media y desv std (medida de la dispersion=0 cuando todos //son iguales) #include <iostream.h> #include <math.h> double *PedirDatos(int &n); double Media( double *d, int n); double Desviacion( double *d, int n); void main() { int num; double *datos; double med,desv; datos = PedirDatos(num); med = Media(datos,num); desv = Desviacion(datos,num); cout << "\tMedia:" << med << endl; cout << "\tDesv. Std:" << desv << endl; Informática II – Fundamentos de Programación - Tecnun Practica Nº3 Programación en C++ delete [] datos; //liberar } double Desviacion( double *d, int n) { double desv, md; // agregar aqui el codigo return desv; } double Media( double *d, int n) { double md; // agregar aqui el codigo Pág. 2 // ds= sqrt( sum(xi-xm)^2 / n-1) return md; } double *PedirDatos(int &n) { double *d; } // agregar aquí el código return d; Recuerde que la función PedirDatos debe pedir al usuario el número de muestras que quiere introducir y luego introducir todas las muestras. Esta función debe devolver a main dos cosas: 1- El vector con los datos y 2- El número de datos que hay en dicho vector. Para hacer este programa debe crear el proyecto Ejer1 y el fichero Desviacion.cpp. 1.2 Ejercicio 2: Cálculo de las Raíces de una Función Este ejercicio consiste en hacer un programa que encuentre las raíces de una función entre dos puntos dados (a,b) empleando el método del punto medio. El algoritmo consiste en hacer iteraciones sucesivas, dividiendo el intervalo en dos y eligiendo un nuevo intervalo en el cual se encuentra la raíz (se comprueba si f(a)*f(b)<0). El método termina cuando la raíz está cerca de un valor (CERO=1e-9) o cuando se alcanza un número máximo de iteraciones y no se ha llegado a encontrar la raíz. Debe crear el proyecto Ejer2 y el fichero Raices.cpp, con el siguiente código: //obtención de las raíces de una función por el método del pto. medio #include <iostream.h> #include <math.h> #include <iomanip.h> double fx( double); double PtoMedio( double a, double b, int max, int &num); void main() { double a,b; int num,max=300; cout << "Dar intervalo a evaluar a b:"; cin >> a >> b; if ( (fx(a) > 0 && fx(b)>0) || (fx(a)<0 && fx(b)<0)) { cout << "Error en el intervalo" << endl; return; //quitar para probar intervalos } Informática II – Fundamentos de Programación - Tecnun Practica Nº3 Programación en C++ Pág. 3 double raiz = PtoMedio(a,b,max,num); if (num == max){ cout << "No hay raiz, limite maximo alcanzado\n"; }else{ cout << "Raiz x=" << setprecision(12) << raiz; cout << " con " << num << " iteraciones\n"; } } double PtoMedio( double a, double b, int max, int &num) { double m, ym, CERO=1e-9; num=0; //importante do{ m = (a+b)/2; ym = fx(m); if ( fabs(ym) < CERO) break; if ( (fx(a) * ym) < 0) b=m; //ver si cambia de signo else a = m; num++; }while( num < max); return m; } double fx( double x) //x en radianes { double f = x – cos(x); //raices entre 0 y PI/2 return f; } Como ya se ha comentado anteriormente, el ejercicio hay que tratar de hacerlo sin mirar la solución. 1.3 Ejercicio 3: Estructuras y Funciones Este ejercicio consiste en hacer un programa que sume, reste, multiplique y divida 2 complejos, utilizando las estructuras, para que analice la importancia de su utilización. Como ya hemos aprendido en clase cómo se declaran y usan las funciones, tenemos que hacerlo todo con funciones, de tal forma que vamos dotar de modularidad a nuestro programa. A continuación se muestra parte del código, el cual Ud. debe completar para hacer todo lo que se pide: #include <iostream.h> struct complejo{ float r,i; }; int Menu(); complejo GetComplejo(); PrtComplejo( complejo c); complejo Suma( complejo c1, complejo c2); void main() { complejo c1,c2,c3; char *operador[]={" +"," -"," *"," /"}; while(true){ int opt=Menu(); if (opt==5) break; c1=GetComplejo(); c2=GetComplejo(); Informática II – Fundamentos de Programación - Tecnun Practica Nº3 Programación en C++ Pág. 4 switch(opt){ case 1: c3=Suma(c1,c2); break; case 2: /*c3=Resta(c1,c2);*/ break; case 3: /*c3=Multiplica(c1,c2);*/ break; case 4: /*c3=Divide(c1,c2);*/ break; } PrtComplejo(c1); cout << operador[opt-1]; PrtComplejo(c2); cout << "\n -------- "; PrtComplejo(c3); } } complejo Suma( complejo c1, complejo c2) { complejo c; c.r=c1.r+c2.r; c.i=c1.i+c2.i; return c; } PrtComplejo( complejo c) { cout << "\n(" << c.r << "," << c.i<<"i)"; } complejo GetComplejo() { complejo c1; char ch; cout << "Dar r,i: "; cin >> c1.r >> ch >> c1.i; return c1; } int Menu() { int opt; while(true){ cout << "\n\n**** Menu ****"; cout << "\n1. Sumar"; cout << "\n2. Restar"; cout << "\n3. Multiplicar"; cout << "\n4. Dividir"; cout << "\n5. Salir"; cout << "\n\tOpcion: "; cin >> opt; if (opt > 0 && opt < 6) return opt; } } 1.4 Ejercicio 4: Cálculo del Seno de un ángulo Este ejercicio consiste en calcular el valor del Seno de un ángulo, cuyo desarrollo en series es: x3 x5 x7 sen( x) = x − + − + ... 3! 5! 7! (x en radianes) El ejercicio lo debe desarrollar en dos partes: Informática II – Fundamentos de Programación - Tecnun Practica Nº3 Programación en C++ Pág. 5 1. Debe hacer una función Seno que reciba como argumentos el ángulo y el número de iteraciones y tiene que devolver el valor de la serie como double. La declaración de dicha función puede ser de la siguiente manera. double Seno( double x, int N ) 2. Debe hacer otra función Seno que reciba como argumentos el ángulo, el error entre una iteración y otra y la referencia a una variable entera para que devuelva el número de iteraciones empleadas. La declaración de esta función puede ser de la siguiente manera: double Seno( double x, double error, int &num) Las funciones, que tienen el mismo nombre porque usamos la sobrecarga de funciones, deben ser llamadas desde main() con los respectivos valores, pedidos al usuario (el ángulo y el error o número de iteraciones, según sea el caso). Debe crear un proyecto Ejer4 y el fichero FuncSeno.cpp para escribir en el código. Informática II – Fundamentos de Programación - Tecnun