/*
AUTORE: Manuel Vichi
Recupero: Verifica 3 3^BIN
*/
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

// Struct per la funzione 1b
typedef struct  {
    int a;
    int b;
} Struct1b;

// Struct per la funzione 2b
typedef struct  {
    char car;
    int num;
} Struct2ab;

// Struct per il risultato della funzione 2b
struct StructResult2b {
    int nVocali;
    int nDispari;
};

// Dichiarazione delle funzioni da implementare
void funzione0b(int arr[], int size, int num);

Struct1b funzione1b(int arr[], int size, Struct1b params);

StructResult2b funzione2b(Struct2ab arr[], int size);

// Funzioni già implementate per stampa
void stampaArray(int arr[], int size) {
    for (int i = 0; i < size; ++i) {
        cout << arr[i] << " ";
    }
    cout << endl;
}

void stampaArrayStruct2ab(Struct2ab arr[], int size) {
    for (int i = 0; i < size; ++i) {
        cout << "{" << arr[i].car << ", " << arr[i].num << "} ";
    }
    cout << endl;
}

int main() {
    srand(time(0)); // Inizializza il generatore di numeri casuali

    // Esempio per la funzione 0b
    int arr[10];

    funzione0b(arr, 10, 5);
    cout << "\nArray riempito con 5 numeri dispari e il resto 0:" << endl;
    stampaArray(arr, 10);

    // Esempio per la funzione 1b
    Struct1b params = {2, 3}; // Parametri di input
    Struct1b result1b = funzione1b(arr, 10, params);
    cout << "\nSommatoria calcolata (funzione 1b):" << endl;
    cout << "somma(v[i]*a+b): " << result1b.a << ", somma(v[i]*a-b): " << result1b.b << endl;

    // Esempio per la funzione 2b
    Struct2ab structArr[5] = {{'a', 6}, {'b', 4}, {'e', 7}, {'o', 5}, {'u', 3}};
    cout << "\nArray di struct (Struct2ab):" << endl;
    stampaArrayStruct2ab(structArr, 5);

    StructResult2b result2b = funzione2b(structArr, 5);
    cout << "Numero di vocali: " << result2b.nVocali << endl;
    cout << "Numero di dispari: " << result2b.nDispari << endl;

    return 0;
}
void funzione0b(int arr[], int size, int num) {
	// Riempimento dell'array con 0 in tutte le posizioni per comodità
	for (int i = 0; i < size; i++) {
		arr[i] = 0;
	}
	// Genera per 5 volte la posizione casuale e la riempie con un numero casuale dispari
	for (int i = 0; i <= num; i++) {
		int s = rand() % size;
		int r = rand() % 1000;
		if (r % 2 != 0) {
			arr[s] = r;
		}
		else {
			arr[s] = r + 1; // Se il numero è pari allora memorizza nell'array il suo sucessivo che è sicuramente dispari
		}
	}
}

Struct1b funzione1b(int arr[], int size, Struct1b params){
	Struct1b s; //Inizializzazione struct di return
	for (int i = 0; i < size; i++) {
		s.a += arr[i] * params.a + params.b;
		s.b += arr[i] * params.a - params.b;
	}
	return s;
}

StructResult2b funzione2b(Struct2ab arr[], int size){
	StructResult2b s; //Inzializzazione struct di return
	s.nVocali = 0; //Inizializzazione a 0 per comodità
	s.nDispari = 0; //Inizializzazione a 0 per comodità
	for (int i = 0; i < size; i++) {
		if (arr[i].car == 'A' || arr[i].car == 'E' || arr[i].car == 'I' || arr[i].car == 'O' || arr[i].car == 'U' || arr[i].car == 'a' || arr[i].car == 'e' || arr[i].car == 'i' || arr[i].car == 'o' || arr[i].car == 'u') {
			s.nVocali++;
		}
		if (arr[i].num % 2 != 0) {
			s.nDispari++;
		}
	}
	return s;
}