Compito di Basi di Informatica Febbraio 2018

 Per ognuna delle 4 domande poste viene incluso alla fine un programma da completare: fatto questo dovete eseguire il programma e controllare che dia i risultati previsti. Attenzione: La domanda 3 richiede una soluzione ricorsiva, altrimenti vale 0 punti.

 Domanda 0. Scrivete una funzione 

string cifre(string s);

che data una stringa s restituisce la stringa t formata dagli elementi di s che sono cifre, e di lunghezza il numero delle cifre di s. Suggerimento. Usate s+c per concatenare una stringa e un carattere. Esempio. Sia s = "abc12de3" di lunghezza 8. Allora cifre(s)= "123" ha lunghezza 3.
Domanda 1. Definite la struttura 

struct Pagamenti {string persona, tassa; int versamento, data; };

 Se x ha tipo Tasse allora x = {p,t,v,d}, dove p è un nome di persona, t un nome di tassa, v una quantità versata e d la data del versamento. Definite una funzione
 
int totale(vector<Pagamenti> V, string p);

che restituisce il totale dei versamenti fatti dalla persona di nome p, quale che siano la tassa e la data del versamento. Il totale è 0 se p non ha fatto versamenti. 

Domanda 2. Definite una funzione 

vector<int> Perm(int n)

Perm(n) crea un vettore V di n interi, inserisce i valori da 0 a n-1 nel vettore, quindi scambia, per ogni i tra 0 e n-1, V[i] con V[j], dove j è ottenuto scegliendo a caso un indice tra i e n-1 compresi (anche j=i va bene). Quindi Perm(n) restituisce V. Suggerimento. Definite prima una funzione void swap(int& x, int& y) per scambiare due valori interi. Per ottenere un intero casuale tra i e n-1 usate la formula 
i+rand()%(n-i)
Esempio. Perm(10) restituisce una permutazione casuale di {0,1,2,3,4,5,6,7,8,9}.
 Domanda 3: Scrivere una funzione (ricorsiva, altrimenti vale 0 punti)

int somma(int n)

tale che somma(n) = 12 + … + n2 è la somma dei quadrati degli interi da 1 a n.

// TESTO DOMANDA 0: completare il programma
#include <math.h>
#include <iostream>
#include <stdlib.h>
using namespace std;

string cifre(string s)
{
  return s; //soluzione errata: sostituite con la soluzione corretta
}

main()
{ string s = "abc12de3", t = "4@#$5zzz6"; 
  cout << "ATTENZIONE\n" << "gli esempi inclusi possono non bastare a controllare se l’esercizio \212 corretto" << endl << endl;

  cout << "s=" << s << " t = " << t << endl << endl;
  string ris1 = cifre(s), ris2 = cifre(t);
  
  cout << "cifre(s)= " << ris1 << endl;
  cout << "dovreste ottenere 123" << endl << endl;
  
  cout << "cifre(t)= " << ris2 << endl;
  cout << "dovreste ottenere 456" << endl;

  cout << endl; system("pause");
 }

//TESTO DOMANDA 1: completate il seguente programma
#include <math.h>
#include <iostream>
#include <stdlib.h>
#include <vector>
using namespace std;

struct Pagamenti {string persona, tassa; int versamento, data; };

int totale(vector<Pagamenti> V, string p)
{
   return 0; // soluzione errata: inserite qui la soluzione corretta 
}

main(){ //per semplicità non inseriamo la data del versamento
vector<Pagamenti> V(5); string p;
V[0].persona="Rossi";     V[0].tassa="IMU";    V[0].versamento=50;
V[1].persona="Bianchi"; V[1].tassa="TASI";   V[1].versamento=18;
V[2].persona="Ferrero"; V[2].tassa="TARI";  V[2].versamento=20;
V[3].persona="Turiddu"; V[3].tassa="TARI";  V[3].versamento=28;
V[4].persona="Rossi";     V[4].tassa="TASI";   V[4].versamento=100;

p = "Rossi";
cout << "Totale versamenti di " << p << " =  " << totale(V,p) << endl;
cout << "Dovreste ottenere 150" << endl;

p = "Turiddu";
cout << "Totale versamenti di " << p << " =  " << totale(V,p) << endl;
cout << "Dovreste ottenere 28" << endl;

p = "Genova";
cout << "Totale versamenti di " << p << " =  " << totale(V,p) << endl;
cout << "Dovreste ottenere 0" << endl;

system("pause");}  

//TESTO DOMANDA 2: completate il seguente programma
#include <math.h>
#include <iostream>
#include <stdlib.h>
#include <vector>
#include <time.h>
using namespace std;

vector <int> Vuoto(0,0);

vector<int> Perm (int n) 
{
  return Vuoto; // soluzione errata; inserite la soluzione corretta
}

void print(vector<int> V, int a)
{if (a<V.size()){cout << V[a] << " "; print(V, a+1);}}

main(){srand(time(NULL)); //inizializzazione di una successione casuale
int n; vector<int> V;              //dichiaro un vettore V vuoto

n=5; 
V = Perm(n);
cout << "Perm(" << n << ") = " << endl; 
print(V,0); cout << endl;

n=10; 
V = Perm(n);
cout << "Perm(" << n << ") = " << endl; 
print(V,0); cout << endl;

n=20; 
V = Perm(n);
cout << "Perm(" << n << ") = " << endl; 
print(V,0); cout << endl;

n=30; 
V = Perm(n);
cout << "Perm(" << n << ") = " << endl; 
print(V,0); cout << endl;

cout << endl; system("pause");}  

// TESTO DOMANDA 3: 
// completare con una funzione ricorsiva, altrimenti vale 0 punti
#include <math.h>
#include <iostream>
#include <stdlib.h>
#include <vector>
using namespace std;

int somma(int n)
{
   return 0; // soluzione errata; inserite qui la soluzione corretta
   // La soluzione deve essere ricorsiva, altrimenti vale 0 punti
}

void test(int n)
{cout << "somma(" << n << ") = " << somma(n) << endl;}

main(){
test(0); test(1);test(2);test(3);test(4); test(10);

system("pause");}