Exercicis Programació C++ VI (2011)

Ejercicio Catalán
Universidad Universidad Politécnica de Cataluña (UPC)
Grado Ingeniería Electrónica Industrial y Automática - 1º curso
Asignatura Fonaments Informàtica
Año del apunte 2011
Páginas 19
Fecha de subida 12/11/2014
Descargas 2
Subido por

Descripción

Exercicis pas a pas de programació en C++

Vista previa del texto

Funcions I 1. Llibreries El llenguatge C++ també aporta una gran quantitat de funcions ja fetes, disponibles per ser utilitzades.
Les funcions pre-implementades són part de l'estàndard de C++ i s'agrupen en llibreries. Per a més informació, podeu consultar la referència cmath de C++ a la web (en anglès).
Per fer servir una llibreria, es fa servir la directiva "#include", que hem fet servir fins ara per poder utilitzar cin i cout. El nom de la llibreria va entre els angles '<' i '>'. Per exemple, per fer servir la llibreriafstream, que permet obrir i tancar fitxers (i que farem servir més endavant), es posaria: #include <fstream>.
Sabent l'existència d'aquestes funcions, fes un programa que, 2. Majúscules Al guió de laboratori "Expressions" vau fer un programa per passar un caràcter a majúscula.
Modifiqueu aquell programa per que faci servir la funció de llibreria que fa exactament això.
3. Valor absolut Feu un programa que permeti introduir un numèric a l'usuari i visualitzi el seu valor absolut. Per fer això heu de buscar una funció de llibreria que calculi el valor absolut.
4. Aleatoris Comprova quin és l’efecte si eliminem la línia ombrejada. (Executeu el programa varies vegades per tal de veure l’efecte).
/********************************************************/ /* Nom autor: LSI */ /* Descripció: Exercici Aleatoris */ /* Funcions de biblioteca */ /********************************************************/ /*********************** BIBLIOTEQUES *******************/ #include <iostream> #include <cstdlib> using namespace std; /**************** DECLARACIÓ DE CONSTANTS ***************/ /******************* PROGRAMA PRINCIPAL *****************/ int main (void) { /**************** DECLARACIÓ DE VARIABLES ***************/ int num1; int num2; /*********************** SENTÈNCIES *********************/ srand(time(NULL)); num1=rand(); num2=rand(); cout <<RAND_MAX<<endl; cout <<num1<<endl; cout <<num2<<endl; system("pause"); return 0; } Si eliminem la linia ombrejada el programa continua funcionant sense problemes.
5. Nota Final Implementeu un programa que calculi la nota final d'una assignatura a partir de 5 notes: examen parcial (NEP), examen final (NEF), sessions laboratori (NSL), projecte (NPL), i exàmen de projecte (NPE).
6. Equació de segon grau Implementeu un programa que permeti calcular les arrels d’una equació de segon grau (http://es.wikipedia.org/wiki/Ecuación_de_segundo_grado) (ax 2+bx+c=0). En cas de que l’equació no tingui solució mostrar un missatge per pantalla. L’usuari entrarà per teclat 3 valors reals corresponents a a,b i c. Dissenyeu un joc de proves adequat.
7. Integral Implementeu un programa que permeti calcular la integral (http://es.wikipedia.org/wiki/Integral) del sinus entre 2 valors com a suma d’àrees. Per fer això s’utilitzaran increments de 1/10 de l’unitat. donades les coordenades d'un punt (o sigui, x i y), indiqui quina és la distància a l'origen d'aquest punt, i l'angle que forma amb l'eix horitzontal (o sigui, les coordenades polars). Per fer aquest programa, hauràs d'afegir, tal com es comenta més amunt, el següent: #include <cmath> Funcions II 1. De programa a funció Per poder crear programes grans (i més complicats) el que es fa és combinar l'execució de "subprogrames". Un subprograma, de fet, és un petit programa que utilitzem des d'un altre.
Veiem un exemple, el programa següent calcula el valor absolut d'un nombre: #include <iostream> using namespace std; int main() { float x; cin >> x; if ( x < 0.0 ) { x = -x; } cout << x << endl; } L'important del programa és que rep un valor d'entrada i mostra per pantalla un valor de sortida.
Això és el que caracteritza el càlcul del valor absolut: "entrem un número y es retorna un resultat". L'entrada està marcada en vermell (el cin) i la sortida en blau (el cout). Per poder utilitzar aquest programa dins d'un altre, primer l'hem de transformar en una funció. La transformació és la següent: float valor_absolut(float a) { if ( a < 0.0 ) { a = -a; } return a; } La nova funció (valor_absolut) també té una entrada (el valor de 'x' original) i una sortida (el que hi ha al costat de 'return'), que estan marcats també en vermell i blau, tal com en el programa original. En la funció 'valor_absolut' (el nom descriu de què es tracta) l'entrada la obtenim amb la variable 'a' (que és un paràmetre) i la sortida la donem amb el 'return' (que té associat el tipus float, en blau). El codi que hi ha a dins de la funció és el mateix que en el programa original, simplement manipula la variable 'a' en comptes de 'x'. Ara la idea és fer servir aquesta funció en un altre programa, que calcularà la fórmula.
Per fer-ho, escriu el següent codi: #include <iostream> using namespace std; int main() { float x, y, res; cin >> x >> y; res = valor_absolut(x) / valor_absolut(y); cout << res << endl; } Ara inserta en la part marcada en taronja la funció valor_absolut, tal com està a dalt.
Tenim, doncs, un programa (el main), que utilitza un subprograma (el valor_absolut) per fer el càlcul. Com que el valor absolut es necessita dues vegades, fer una funció que el calcula té l'avantatge de que no s'ha de repetir el càlcul del valor absolut 2 cops, s'implementa només 1 cop i es fa servir tants cops com faci falta.
2. Potències Fixa't en el següent programa: #include <iostream> using namespace std; int main() { float x, y=1; int n; cin >> x >> n; while ( n >= 1 ) { y *= x; } cout << y << endl; } Determina primer quin càlcul realitza (i omple la instrucció que falta a la zona taronja), i mira quants valors rep a l'entrada i quants resultats dóna. Ara transforma el programa en una funció "pot", tal com hem fet a l'apartat anterior. Utilitza llavors la funció "pot" per fer un programa que, donat un valor de 'x', calculi la fórmula.
4. Funció num_xifres Transforma el programa Numero de xifres que calcula el número de xifres d'un enter (exercici 8 del laboratori de composició iterativa) en una funció "num_xifres".
5. Obtenir una xifra Quan volem "declarar" una funció (dir quin nom té, quins paràmetres i quin tipus retorna), escrivim només la seva capçalera: int xifra_N(int x, int n); Amb això n'hi ha prou per saber quins paràmetres rep la funció, quin nom té (com la cridarem) i quin tipus retorna (per obtenir el resultat). Respectant la declaració (o capçalera) de la funció xifra_N, implementa-la, sabent que el càlcul que realitza és extreure una xifra d'un número enter. El resultat no és un char, sinó un int. Les xifres de l'enter es numeren des de 1 (la de la més a la dreta) i van creixent segons les desenes. La següent taula mostra el resultat de cridar la funció per a diversos valors d'entrada: xifra_N( 123, 1) 3 xifra_N(7054, 2) 5 xifra_N(3892, 3) 8 xifra_N( 104, 7) 0 xifra_N( 45, 0) 0 Fixa't que quan la funció no pot obtenir la xifra que se li demana, retorna 0 (els dos últims cassos).
6. Super-programa Les dues funcions anteriors ens permeten fer, doncs, el següent programa: /******************************************************/ /* Nom autor: Alberto Lendinez */ /* Data: 4/04/11 */ /* Descripcio: Exercici 5. Laboratori 7. */ /* Super-programa */ /******************************************************/ /*********************** BIBLIOTEQUES *****************/ #include <iostream> #include <cmath> using namespace std; double num_cifras (double& n); double cifra_n (double& n, double x, double cifra); /******************* PROGRAMA PRINCIPAL ***************/ int main () { cout << " ____----____ AUTOR: ALBERTO LENDINEZ ____----____" << endl; /**************** DECLARACIO DE VARIABLES *************/ int x, n, i; bool iguals = true; /*********************** SENTÈNCIES *******************/ cin >> x; n = num_xifres( x ); i = 0; while ( i < n && iguals ) { if ( xifra_N( x, i ) != xifra_N( x, n - i ) ) iguals = false; else i++; } if (iguals) cout << "Si" << endl; else cout << "No" << endl; system("pause"); return 0; } double cifra_n (double& n, double x, double cifra) { double calculo; if (cifra>=n){ calculo = x%pow(10,n); } else calculo = 0; return calculo; } double num_cifras (double& n) { double resta=n, cifra=0; while (resta>=1){ resta=resta/10; cifra++; } return cifra; } Completa el programa inserint les funcions que has fet anteriorment i comprova que funcioni correctament.
Quin càlcul realitza?? Si el contador es igual al resultado, dará “trae”; si no, “false”.
Accions 1. Equivalència de funcions i accions Les funcions sempre es poden transformar en accions. Per exemple, la taula següent mostra l'equivalència entre una acció i una funció que calculen el valor absolut: Funció Acció float f_vabs( float x ) { if ( x < 0.0 ) x = -x; return x; } void a_vabs( float x, float& res ) { if ( x < 0.0 ) x = -x; res = x; } La funció retorna el resultat directament, fent servir return (i el tipus de retorn és float).
L'acció, no retorna res, teòricament (el tipus és void), però li passen una variable a on poder guardar el resultat (el paràmetre res, que passa per referència, ja que té un '&'). Per tant, l'acció dóna el resultat amb l'assignació "res = x;". En els dos cassos, el codi que produeix el resultat és en blau. El codi que fa servir la funció i l'acció és diferent, també: Crida a la funció f_abs Crida a l'acció a_vabs float a; a = f_vabs( -4.5 ); float a; a_vabs( -4.5, a ); En els dos cassos, s'aconsegueix el mateix, bàsicament que el resultat de calcular el valor absolut de -4.5 s'assigni (es guardi) a la variable 'a'. En el de l'esquerra, el valor que retorna la funció s'assigna a 'a'. En el de la dreta, la pròpia variable 'a' se li passa a l'acció a_vabs i l'assignació la fa ella mateixa (dins de v_abs, el paràmetre 'res' es referirà a la variable 'a').
De fet es diu que 'res' és un paràmetre de sortida. Inspirant-te en aquest exemple, transforma la funció següent en una acció seguint la mateixa recepta: float max( float a, float b ) { float m = a; if ( m < b ) m = b; return m; } 2. Més d'un resultat Què succeeix quan volem fer un subprograma que retorna més d'un resultat? Un exemple podria ser una funció que passi de coordenades cartesianes a polars o al revés, una funció que doni les solucions a una equació de segon grau, o una funció que calculi la mitjana i la variància d'una seqüència de nombres.
Quan necessitem retornar més d'un valor podem fer servir el truc de l'apartat anterior. Com que no hi ha límit en el número de paràmetres per referència que es poden passar, per fer un subprograma que retorni dos valors (a_polars) farem el següent: void a_polars( float x, float y, float& radi, float& angle ) { radi = sqrt( x * x + y * y ); angle = atan( y / x ); } Aquesta acció omple radi i angle amb el resultat i per tant, retorna, indirectament, 2 valors.
Fes un programa que utilitzi aquesta acció per passar a coordenades polars tots els valors del fitxer dades1.txt que trobaràs a Atenea. El fitxer conté parelles de valors x i y, i la última parella (que indica el final de la seqüència de valors) és 0.0 i 0.0. Tingues en compte que alguns valors de x i y són 0.0 però el programa ha d'acabar només quan els dos són 0.0.
/******************************************************/ /* Nom autor: Alberto Lendinez */ /* Data: 4/04/11 */ /* Descripcio: Exercici 3. Laboratori 8. */ /* Mas de un Resultado */ /******************************************************/ /*********************** BIBLIOTEQUES *****************/ #include <iostream> #include <math.h> using namespace std; void a_polars( float x, float y, float& radi, float& angle ) { radi = sqrt( x * x + y * y ); angle = atan( y / x ); } /******************* PROGRAMA PRINCIPAL ***************/ int main () { cout << " ____----____ AUTOR: ALBERTO LENDINEZ ____----____" << endl; /**************** DECLARACIO DE VARIABLES *************/ float x,y,radi,angle,i; /*********************** SENTÈNCIES *******************/ cout<<"Introduce x: "; cin>>x; cout<<"Introduce y: "; cin>>y; while (y==0.0 && x==0.0){ a_polars(x,y,radi,angle); cout<<"Radi: "; cin>>radi; cout<<"Angle: "; cin>>angle; cout<<"Introduce x: "; cin>>x; cout<<"Introduce y: "; cin>>y; i++; } } system("pause"); return 0; 3. Màxim i mínim Quan fem servir paràmetres per referència, també ens poden servir com a valors d'entrada, no només de sortida. Per exemple, si volem calcular, donats 2 nombres, el màxim i el mínim, podem passar els valors inicials dels dos nombres en paràmetres per referència de tal forma que quan es calculi el resultat es deixi en aquests dos paràmetres.
Fes, doncs, una acció anomenada "maxmin" que intercanviï els dos paràmetres per referència que rep si el primer és més petit que el segon. Això farà que quan l'acció retorni, la variable que hem passat com a primer paràmetre sempre sigui més gran. El programa següent fa servir aquesta acció: 4. Accions que fan servir cout Un dels motius pels quals un subprograma es considera una acció és quan fa servir cout. Un exemple d'una acció d'aquest estil és el següent: void saluda( string nom ) { cout << "Que passa, " << nom << "!" << endl; } En un programa, podem cridar l'acció saluda amb el següent codi: saluda("Groucho"); saluda("Chico"); saluda("Harpo"); El programa mostrarà la salutació per pantalla així: Que passa, Groucho! Que passa, Chico! Que passa, Harpo! Fes, doncs, una acció que mostri per pantalla el següent missatge: 5. Accions que fan servir cin Un altre motiu pel qual un subprograma es considera una acció és que faci servir cin. Per exemple, la següent funció serveix per fer un menú: int demana_opcio() { int opc = -1; while ( opc < 1 || opc > 3 ) { cout << "Menu: " << endl << " 1. Suma" << endl << " 2. Resta" << endl << " 3. Sortir" << endl << "opció? "; cin << opc; } return opc; } L'acció, quan és cridada, mostra el menú (repetidament fins que l'usuari posi una opció entre 1 i 3), i retorna la opció escollida. Això és molt còmode d'utilitzar en un programa, com en el següent: /******************************************************/ /* Nom autor: Alberto Lendinez */ /* Data: 4/04/11 */ /* Descripcio: Exercici 5. Laboratori 8. */ /* Acciones que usan cin */ /******************************************************/ /*********************** BIBLIOTEQUES *****************/ #include <iostream> using namespace std; int demana_opcio(int opc=-1) { while ( opc < 1 || opc > 3 ) { cout << "Menu: " << endl; cout << " 1. Suma" << endl; cout << " 2. Resta" << endl; cout << " 3. Sortir" << endl; cout << "opció? "; cin >> opc; } return opc; } void demana_nombres (float& a, float& b){ cout<<"Nombre 1: "; cin>>a; cout<<"Nombre 2: "; cin>>b; } /******************* PROGRAMA PRINCIPAL ***************/ int main() { cout << " ____----____ AUTOR: ALBERTO LENDINEZ ____----____" << endl; /**************** DECLARACIO DE VARIABLES *************/ int op; float a, b; /*********************** SENTÈNCIES *******************/ op = 1; while ( op != 3 ) { op = demana_opcio(); demana_nombres( a, b ); cout << "Resultat: "; if ( op == 1 ) { cout << a + b; } else if ( op == 2 ) { cout << a - b; } cout << endl; } system("pause"); return 0; } 8. Seguiment Per a cada una de les següents crides a l'acció sorpresa col·locada al lloc que s'indica en la funció main, cal dir si és correcta o no. Donat el cas que sigui incorrecta, cal argumentar per què (els motius) ho és. Si és correcta s'ha de dir quins valors es visualitzarien per pantalla i quina es la taula d'evolució de totes les variables.
/******************************************************/ /* Nom autor: Alberto Lendinez */ /* Data: 4/04/11 */ /* Descripcio: Exercici 8. Laboratori 8. */ /* Seguimiento */ /******************************************************/ /*********************** BIBLIOTEQUES *****************/ #include <iostream> #include <cstring> using namespace std; void calcula (int &num1, int &num2, int &num3){ int aux; if (num1>num2){ aux=num1; num1=num2; num2=aux; } num3=num2/num1; if (num2>10) num2=num1; } void sorpresa (int &num1, int &num2, string para, char let) { int cont=0,aux; calcula(num1,num2,aux); num1=0; while (cont<num2){ if (cont%aux==0){ cout<<let<<endl; num1=num1+1; } cout<<para; cont=cont+1; } cout<<endl; num2=cont; } /******************* PROGRAMA PRINCIPAL ***************/ int main() { cout << " ____----____ AUTOR: ALBERTO LENDINEZ ____----____" << endl; /**************** DECLARACIO DE VARIABLES *************/ string pal="***"; int num1, val, aux; char car = 'a'; /*********************** SENTÈNCIES *******************/ num1 = 65; val = 7; aux = 2; sorpresa(3,7,pal,car);//Crida a sorpresa cout << num1 << " " << val << " " << aux <<endl; system ("pause"); return 0; ...