Exercicis programació C++ (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 15
Fecha de subida 14/11/2014
Descargas 3
Subido por

Descripción

Exercicis pas a pas de programació en C++

Vista previa del texto

Taules 1. Taules Les taules són agrupacions de variables del mateix tipus. L'interès de les taules és que ens permeten controlar moltes variables amb poc esforç.
Declara una taula de 20 reals. Fes un programa per omplir la taula completament, visualitza totes les dades i calcula els valor màxim i mínim. Per fer això fer servir 3 accions/funcions per: omplir, mostrar i calcular.
/******************************************************/ /* Nom autor: Alberto Lendinez */ /* Data: 27/05/11 */ /* Descripcio: Exercici 1. Laboratori 11. */ /* Tablas */ /******************************************************/ /*********************** BIBLIOTEQUES *****************/ #include <iostream> using namespace std; /******************* DECLARACIO DE CONSTANTS ***************/ const int rMax=3; /******************* TUPLES I TAULES ***************/ typedef int real[rMax]; void LeerDatos (real& r) { int suma=0; for (int i=0; i<rMax; i++) { cout<<" Numero real ["<<i<<"]: "; cin>>r[i]; } } void ProcesarDatos (real r, int& nMax, int& nMin) { int i=0; while (i<rMax){ if (r[i] > r[i+1]) { nMax = r[i]; } else if (r[i] < r[i+1]) { nMax = r[i]; } else if (r[i] > r[i+1]) { nMin = r[i]; } else if (r[i] < r[i+1]) { nMin = r[i]; } ++i; } } /******************* PROGRAMA PRINCIPAL ***************/ int main () { cout << " ____----____ AUTOR: ALBERTO LENDINEZ ____----____" << endl; /**************** DECLARACIO DE VARIABLES *************/ int nMax=0, nMin=0, contador=0; real r; /*********************** SENTÈNCIES *******************/ LeerDatos (r); ProcesarDatos (r, nMax, nMin); cout<<"El numero maximo = " << nMax << endl; cout<<"El numero minimo = " << nMin << endl; system("pause"); return 0; } 2. Dibuixa Esbrina què mostra aquest programa per pantalla: int main() { bool vb[80]; int k; for (k = 0; k < 80; k++) { if (k > 40) vb[k] = true; else vb[k] = false; } for (k = 0; k < 80; k++) { if (vb[k]) cout << '*'; else cout << '-'; } } Primer canvia la part en blau perquè mostri el següent: *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*Ara fes els canvis necessaris perquè surti (només canviant la part blava, com abans): ********************--------------------********************-----------------int main() { bool vb[80]; int k; for (k = 0; k < 80; k++) { if (k > 40) vb[k] = true; else vb[k] = false; } for (k = 0; k < 80; k++) { if (vb[k]) cout << '*'; else cout << '-'; } } El programa dibuixa una sequencia de guions i estels.
3. Explosió Executa el següent programa i observa què succeeix a l'executar-lo: /******************************************************/ /* Nom autor: Alberto Lendinez */ /* Data: 27/05/11 */ /* Descripcio: Exercici 1. Laboratori 11. */ /* Explosion */ /******************************************************/ /*********************** BIBLIOTEQUES *****************/ #include <iostream> using namespace std; /******************* DECLARACIO DE CONSTANTS ***************/ /******************* TUPLES I TAULES ***************/ /******************* PROGRAMA PRINCIPAL ***************/ int main () { cout << " ____----____ AUTOR: ALBERTO LENDINEZ ____----____" << endl; /**************** DECLARACIO DE VARIABLES *************/ int t[1000]; // Con mas de 2 digitos se cuelga int k = 123; // Con dos digitos no se cuelga t[k] = 0; /*********************** SENTÈNCIES *******************/ // Al ejecutar, se cuelga el comando de windows.
// Con t[10] admite dos digitos, se cuelga al tercer digito.
// Con t[1000] admite dos digitos, se cuelga al cuarto digito.
system("pause"); return 0; } 4. Strings Els strings són cadenes de caràcters (string és cadena en anglès), i malgrat fins ara els hem tractat com a unitats, de fet és possible en C++ accedir als caràcters individuals d'un string.
Això és perquè en el fons, els strings són molt semblants a les taules. Per exemple, mira aquest programa: int main() { string paraula; cout << "Entra una paraula: "; cin >> paraula; cout << "La primera lletra és la '" << paraula[0] << "'" << endl; cout << "... i la segona la '" << paraula[1] << "'" << endl; } Per indicar una lletra d'un string, s'escriu primer la variable (en aquest cas, paraula) i després entre corxets el número de la lletra que es vol accedir (les dues zones blaves), tal com per a les taules. Un detall important és que quan escrivim "paraula[1]", el resultat d'això és un char, no un string. Això té força sentit, ja que les caselles dels strings són chars. Per exemple, el programa següent compta quantes paraules d'una seqüència acabada en "FI" comencen per 'A' o 'a': int main() { string paraula; int npar = 0; cin >> paraula; while ( paraula != "FI" ) { if ( paraula[0] == 'A' || paraula[0] == 'a' ) npar++; cin >> paraula; } cout << npar << " paraules començades per 'a'" << endl; } Les lletres d'una paraula no només es poden consultar, també es poden modificar: int main() { string missatge = "Hello!"; missatge[1] = 'a'; cout << missatge << endl; } Què et sembla que sortirà per pantalla? Fes, doncs, un programa que, donada una seqüència de paraules (acabada en "."), vagi mostrant per pantalla les mateixes paraules amb la primera lletra en majúscules. O sigui: groucho Groucho chico Chico harpo Harpo zeppo Zeppo .
/******************************************************/ /* Nom autor: Alberto Lendinez */ /* Data: 27/05/11 */ /* Descripcio: Exercici 3. Laboratori 11. */ /* Strings */ /******************************************************/ /*********************** BIBLIOTEQUES *****************/ #include <iostream> using namespace std; /******************* DECLARACIO DE CONSTANTS ***************/ /******************* TUPLES I TAULES ***************/ struct tParaula { string paraula; }; typedef tParaula p[]; void LeerDatos (tParaula& p) { cin >> p.paraula; } /******************* PROGRAMA PRINCIPAL ***************/ int main () { cout << " ____----____ AUTOR: ALBERTO LENDINEZ ____----____" << endl; /**************** DECLARACIO DE VARIABLES *************/ tParaula p; int ch; /*********************** SENTÈNCIES *******************/ while ( p.paraula != "." ) { LeerDatos (p); string missatge = p.paraula; ch = missatge[0]; missatge[0] = ch - 32; cout << missatge << endl; } system("pause"); return 0; } 5. Paraula invertida Fes un programa que donada una paraula l’escrigui invertida.
/******************************************************/ /* Nom autor: Alberto Lendinez */ /* Data: 27/05/11 */ /* Descripcio: Exercici 4. Laboratori 11. */ /* Palabra Invertida */ /******************************************************/ /*********************** BIBLIOTEQUES *****************/ #include <iostream> using namespace std; /******************* DECLARACIO DE CONSTANTS ***************/ const int C=5; /******************* TUPLES I TAULES ***************/ typedef char palabra[C]; /******************* PROGRAMA PRINCIPAL ***************/ int main () { cout << " ____----____ AUTOR: ALBERTO LENDINEZ ____----____" << endl; /**************** DECLARACIO DE VARIABLES *************/ palabra v1; int K; /*********************** SENTÈNCIES *******************/ for (K=0; K<C; K++) { cin >> v1[K]; } cout<<endl; for (K=(C-1); K>-1; K--) cout << v1[K]; cout<<endl<<endl<<endl; system("pause"); return 0; } 6. Cap-i-cua Fent servir el programa anterior determina si una paraula donada es palíndroma.
/******************************************************/ /* Nom autor: Alberto Lendinez */ /* Data: 27/05/11 */ /* Descripcio: Exercici 5. Laboratori 11. */ /* Capicua */ /******************************************************/ /*********************** BIBLIOTEQUES *****************/ #include <iostream> using namespace std; /******************* DECLARACIO DE CONSTANTS ***************/ const int C=5; /******************* TUPLES I TAULES ***************/ typedef char numero[C]; /******************* PROGRAMA PRINCIPAL ***************/ int main () { cout << " ____----____ AUTOR: ALBERTO LENDINEZ ____----____" << endl; /**************** DECLARACIO DE VARIABLES *************/ numero v1; int K, n1=0, n2; /*********************** SENTÈNCIES *******************/ for (K=0; K<C; K++){ cin >> v1[K]; } n2=(C-1); while ((n1!=n2)&&(n1!=8)){ if(( v1[n1] )==( v1[n2] )) { n1++; n2--; } else { n1=8; } } cout<<endl<<endl; if (n1==8){ cout<<"No es capicua"<<endl; } else cout<<"Si es capicua"<<endl; system("pause"); return 0; } 7. Cerca un enter en una seqüència Fent servir el problema de seqüències amb el mateix nom es demana fer els canvis necessaris per emmagatzemar la seqüència dins una taula.
/******************************************************/ /* Nom autor: Alberto Lendinez */ /* Data: 27/05/11 */ /* Descripcio: Exercici 6. Laboratori 11. */ /* Busqueda de un entero en una secuencia */ /******************************************************/ /*********************** BIBLIOTEQUES *****************/ #include <iostream> using namespace std; /******************* DECLARACIO DE CONSTANTS ***************/ const double CENTINELA = -1; /******************* TUPLES I TAULES ***************/ struct tSequencia { float num, ent; }; typedef tSequencia s[]; void LeerDatos (tSequencia& s) { cout << "Introduzca el numero entero a encontrar: "; cin >> s.ent; cout << "Introduzca la secuencia de numeros enteros: "; cin >> s.num; } /******************* PROGRAMA PRINCIPAL ***************/ int main () { cout << " ____----____ AUTOR: ALBERTO LENDINEZ ____----____" << endl; /**************** DECLARACIO DE VARIABLES *************/ tSequencia s; bool trobat = false; char t=0; /*********************** SENTÈNCIES *******************/ LeerDatos (s); while (s.num != CENTINELA && trobat !=true) { if (s.num == s.ent) trobat = true; else trobat = false; } if (trobat) cout << " El numero " << s.ent << " estaba en la secuencia introducida "<< endl; else cout << "El numero " << s.ent <<" no estaba en la secuencia introducida " << endl; system("pause"); return 0; } 8. Distància a la mitjana Fes un programa que llegeixi les temperatures d’un mes i les emmagatzemi en una taula.
Seguidament, calculeu la temperatura mitjana del mes i mostreu la diferència de cada temperatura amb la mitjana.
/******************************************************/ /* Nom autor: Alberto Lendinez */ /* Data: 27/05/11 */ /* Descripcio: Exercici 8. Laboratori 11. */ /* Distancia a la media */ /******************************************************/ /*********************** BIBLIOTEQUES *****************/ #include <iostream> using namespace std; /******************* DECLARACIO DE CONSTANTS ***************/ const int nMax = 30; /******************* TUPLES I TAULES ***************/ struct tTemperatura { double temp; }; typedef tTemperatura TE[nMax]; void LeerDatos (TE& t, double& tempMit) { double suma=0; for (int i=0; i<nMax; i++) { cout<<"Temperatura ["<<i<<"] : "; cin>>t[i].temp; suma = suma + t[i].temp; } tempMit = suma / nMax; } /******************* PROGRAMA PRINCIPAL ***************/ int main () { cout << " ____----____ AUTOR: ALBERTO LENDINEZ ____----____" << endl; /**************** DECLARACIO DE VARIABLES *************/ TE t; double tempMit; /*********************** SENTÈNCIES *******************/ LeerDatos ( t, tempMit); cout << "La temperatura media es: " << tempMit << endl; for (int i=0; i<nMax; i++) { cout << "Temperatura ["<<i<<"] : " << t[i].temp << " grados, diferencia de " << t[i].temptempMit << " con la temperatura media" << endl; } system("pause"); return 0; } 9. Constants Les constants són com variables que no canvien durant l'execució d'un programa, i es posen a dalt de tot del codi font: const int N = 25; int main() { ...
} En el cas de les taules, les constants són molt útils pel següent motiu. Fixa't en aquest programa: typedef float tVector[5]; int main() { tVector v1,v2; int k; for (k = 0; k < 5; k++) cin >> v1[k]; for (k = 0; k < 5; k++) cin >> v2[k]; for (k = 0; k < 5; k++) cout << v1[k] - v2[k] << endl; } A quants llocs apareix un 5? Si volem canviar el tamany del vector de reals a 10 o a 7, hem de canviar molts llocs del programa (i aquest és petit...).
El truco és introduir una constant que es digui MAX_ELEM, i canviar tots els fors per tal que no posi 5 sinó MAX_ELEM.
Introdueix, doncs, la constant i corregeix el programa per tal que la utilitzi.
Canvia ara el tamany del vector a 4 i comprova que el programa funciona bé.
/******************************************************/ /* Nom autor: Alberto Lendinez */ /* Data: 27/05/11 */ /* Descripcio: Exercici 8. Laboratori 11. */ /* Constantes */ /******************************************************/ /*********************** BIBLIOTEQUES *****************/ #include <iostream> /******************* DECLARACIO DE CONSTANTS ***************/ using namespace std; const int MAX_ELEM=4; /******************* TUPLES I TAULES ***************/ typedef float tVector[5]; /******************* PROGRAMA PRINCIPAL ***************/ int main () { cout << " ____----____ AUTOR: ALBERTO LENDINEZ ____----____" << endl; /**************** DECLARACIO DE VARIABLES *************/ tVector v1,v2; int k; /*********************** SENTÈNCIES *******************/ for (k = 0; k < MAX_ELEM; k++) cin >> v1[k]; for (k = 0; k < MAX_ELEM; k++) cin >> v2[k]; for (k = 0; k < MAX_ELEM; k++) cout << v1[k] - v2[k] << endl; system("pause"); return 0; } 10. Declaració de tipus En C++, quan hem de fer servir un mateix tipus de taula moltes vegades, podem declarar-lo a dalt de tot del programa, i després fer servir aquest tipus per a crear noves variables i passar variables com a paràmetres en les funcions: typedef int tLlistaEnters[10]; Aquesta declaració diu: "es defineix el tipus tLlistaEnters com una taula de 10 caselles a on cada casella és un enter". Un cop tenim això, podem crear variables d'aquest tipus, tal com hem fet sempre: tLlistaEnters llista1, llista2; Compara això amb la típica declaració: float x, y; char c1, c2; int j1,j2; Sempre tenim el tipus a l'esquerra i després el nom de la variable. La idea és que ara, amb el "typedef...", podem declarar variables de tipus "tLlistaEnters", i passar paràmetres d'aquest tipus a les funcions o les accions. Una cosa és molt important: cada una de les variables de tipus tLlistaEnters és una taula diferent. El nom tLlistaEnters l'escollim nosaltres i no és més que una "abreviació", que significa "taula de 10 ints".
Observa el següent programa i afegeix a dalt de tot les declaracions necessàries (i les constants) per tal de que funcioni bé: int main() { tA x; tB r; int k; for (k = 0; k < MAX_A; k++) { x[k] = '*'; } for (k = 0; k < MAX_B; k++) { r[k] = "<buit>"; } } /******************************************************/ /* Nom autor: Alberto Lendinez */ /* Data: 27/05/11 */ /* Descripcio: Exercici 9. Laboratori 11. */ /* Declaración de Tipos */ /******************************************************/ /*********************** BIBLIOTEQUES *****************/ #include <iostream> /******************* DECLARACIO DE CONSTANTS ***************/ using namespace std; const int MAX_A = 10; const int MAX_B = 5; /******************* TUPLES I TAULES ***************/ typedef char tA[MAX_A]; typedef char tB[MAX_B]; /******************* PROGRAMA PRINCIPAL ***************/ int main () { cout << " ____----____ AUTOR: ALBERTO LENDINEZ ____----____" << endl; /**************** DECLARACIO DE VARIABLES *************/ tA x; tB r; int k; /*********************** SENTÈNCIES *******************/ for (k = 0; k < MAX_A; k++) { x[k] = '*'; } for (k = 0; k < MAX_B; k++) { r[k] = ' '; } system("pause"); return 0; } 11. Histogrames Un histograma és una taula de comptadors. Cada casella de la taula diu quantes vegades ha passat certa cosa. Per exemple, el programa següent compta quantes vegades surten els enters d'una seqüència com "1 8 4 3 9 0 2 5 4 4 2 9 3 1 -1" (a on tots són menors que 10, i s'acaba amb -1): Faltaria fer, doncs, la funció "son_permut". Començarem per una cosa més fàcil, però.
Fes una funció (hist_par) que obtingui l'histograma d'una paraula, o sigui, quantes vegades surt cada lletra en la paraula. Pots assumir que les paraules tenen lletres sempre en minúscula.
Consulta els programes que has fet anteriorment si no ho veus clar. Hauràs de definir un tipus per a la taula de l'histograma, tal com hem fet anteriorment, però pensa quantes caselles tindrà i posa una constant que sigui aquest nombre. Pensa també com pots obtenir un índex començant per 0 per a cada lletra.
/******************************************************/ /* Nom autor: Alberto Lendinez */ /* Data: 27/05/11 */ /* Descripcio: Exercici 10. Laboratori 11. */ /* Historigramas */ /******************************************************/ /*********************** BIBLIOTEQUES *****************/ #include <iostream> #include <stdlib.h> #include <cctype> using namespace std; /******************* DECLARACIO DE CONSTANTS ***************/ const int MAX_SEQ = 2; const int NMAX = 15; typedef int tSeq[MAX_SEQ]; typedef int tHist[NMAX]; /******************* DECLARACIO DE SUBPROGRAMES ***************/ void llegeix_seq( tSeq& seq ) { int k = 0, n1, n2; string p1, p2; cout << "Entra dues paraules: "; cin >> p1 >> p2; n1= p1.length(); n2= p2.length(); cout << '"' << p1 << '"'; } void hist_par( tHist& h ) { for (int k = 0; k < NMAX; k++) cout << k << " ha sortit " << h[k] << " vegades." << endl; } void son_permut( tSeq& seq, tHist& h ) { int cont=0, a1, a2, n1, n2; string p1, p2; n1= p1.length(); n2= p2.length(); a1=n1-1; a2=n2-1; while (cont<= a1 && cont <= a2){ if(p1[n1]==p2[n2]){ cont++; a1--; a2--; } } } /******************* PROGRAMA PRINCIPAL ***************/ int main () { cout << " ____----____ AUTOR: ALBERTO LENDINEZ ____----____" << endl; /**************** DECLARACIO DE VARIABLES *************/ tSeq s; tHist h; string p1, p2; /*********************** SENTÈNCIES *******************/ llegeix_seq(s); hist_par(h); son_permut(s,h); if ( ! son_permut( p1, p2 ) ) { cout << " NO"; } else cout << p1 << " es una permutació de " << p2 << endl; system("pause"); return 0; } ...