/*
Nome: Mario
Cognome: Montanari
Classe: 3AIN
Data: 29/01/2025

Scrivere un programma in C che:
  1. Definisce una struct Studente con i seguenti campi:
       - char inizialeNome;
       - char inizialeCognome;
       - int matricola;
       - float media.
  2. Definisce una struct Risultato con i seguenti campi:
       - int matricola;
       - char esito (può contenere ‘P’ o ‘B’, in base alla media dello studente);

  3. Definire la seguente funzione:
       - void elaboraStudenti(Studente studenti[], int n, Risultato risultati[]).
    
  4. La funzione riceve un array di struct Studente e un array di struct Risultato.
  5. Determina se lo studente è promosso (media >= 6.0) o bocciato (media < 6.0).
  6. Aggiorna l'array di struct Risultato con la matricola e l'esito.

Nel main, dichiarare e inizializzare un array di struct Studente con almeno
3 elementi, chiamare la funzione e stampare il contenuto del secondo array.

VARIANTE:
modificare la funzione o crearne un’altra in modo che,
oltre ad elaborare come visto sopra, restituisce il numero dei promossi
*/

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <iomanip>

#define LMIN 65
#define LMAX 90

#define NMIN 0
#define NMAX 99999999

#define MMIN 2
#define MMAX 9

#define PDMIN 10
#define PDMAX 100

#define NSTUDENTI 10

using namespace std;

typedef struct {
	char inizialeNome;
	char inizialeCognome;
	int matricola;
	float media;
} Studente;

typedef struct {
	char esito;
} Risultato;

void riempiElaborazione(Studente studenti[], int nstudenti, Risultato risultato[]);
void elaboraStudenti(const Studente studenti[], int nstudenti, Risultato risultati[]);
void contaPromossi(Risultato risultati[], int nstudenti);

int main(void) {
	Studente studenti[NSTUDENTI];
	Risultato risultati[NSTUDENTI];
	int nstudenti = NSTUDENTI;
	
	srand(time(NULL));
	
	riempiElaborazione(studenti, nstudenti, risultati);
	elaboraStudenti(studenti, nstudenti, risultati);
	contaPromossi(risultati, nstudenti);
	
	return 0;
}

void riempiElaborazione(Studente studenti[], int nstudenti, Risultato risultati[]) {
	float parteDecimale = 0;
	
	for (int i = 0; i < nstudenti; i++) {
		studenti[i].inizialeNome = rand() % (LMAX - LMIN + 1) + LMIN;
		studenti[i].inizialeCognome = rand() % (LMAX - LMIN + 1) + LMIN;
		studenti[i].matricola = rand() % (NMAX - NMIN + 1) + NMIN;
		
			studenti[i].media = rand() % (MMAX - MMIN + 1) + MMIN;
			parteDecimale = rand() % (PDMAX - PDMIN + 1) + PDMIN;
			for (int j = 0; j < nstudenti; j++) {
				if (parteDecimale == 10 || parteDecimale == 20 || parteDecimale == 30 ||parteDecimale == 40 ||parteDecimale == 50 ||parteDecimale == 60 ||parteDecimale == 70 || parteDecimale == 80 || parteDecimale == 90 || parteDecimale == 100) {
					parteDecimale = rand() % (PDMAX - PDMIN + 1) + PDMIN;
				}
			}
		studenti[i].media = studenti[i].media + (parteDecimale / 100);
		
		if (studenti[i].media >= 6.0) {
			risultati[i].esito = 'P';
		} else if (studenti[i].media < 6.0) {
			risultati[i].esito = 'B';
		}
	}
}

void elaboraStudenti(const Studente studenti[], int nstudenti, Risultato risultati[]) {
	cout << " -------------------------------------------------------------" << endl;
	
	cout << " | Nome:"
		<< setw(13) << " | Cognome:"
		<< setw(13) << " | Matricola:"
		<< setw(13) << " | Media:"
		<< setw(13) << " | Stato:" << setw(2) << "|"
		<< endl;
		
	cout << " -------------------------------------------------------------" << endl;
	
	for (int i = 0; i < nstudenti; i++) {
		cout << " | " << studenti[i].inizialeNome << "."
			<< setw(8) << " | " << studenti[i].inizialeCognome << "."
			<< "       | " << setfill('0') << setw(8) << studenti[i].matricola << setfill(' ')
			<< setw(9) << " | " << studenti[i].media
			<< setw(9) << " | " << risultati[i].esito << "." << setw(6) << "|"
			<< endl;
	}
	
	cout << " -------------------------------------------------------------" << endl;
}

void contaPromossi(Risultato risultati[], int nstudenti) {
	int promossi = 0;
	for (int i = 0; i < nstudenti; i++) {
		if (risultati[i].esito == 'P') {
			promossi++;
		}
	}
	cout << endl << " Numero di studenti promossi: " << promossi << endl;
}