//1.1.4.5 Modificate varie cose tra cui la prima parte di riorganizzazione e conversione agli array multidimensionali
//Inizializzo variabili e array
bool riduci = true;
//1.1.4.0 Serve per attivare una funzione che corregge un bug matematico
//1.1.4.5 variabili globali
bool numactive = false;
bool denactive = false;
//variabili ed array riferiti a una singola parentesi
//operatori
string tempoperator [20][50];
int indexoperator [20];
for(int f = 0; f < 20; f++) indexoperator[f] = 0;
//numeratori
string temparraynum [20][100];
int indexnum[20];
for(int f = 0; f < 20; f++) indexnum[f] = 0;
//denominatori
string temparrayden [20][100];
int indexden[20];
for(int f = 0; f < 20; f++) indexnum[f] = 0;
//1.1.4.5 Aggiunto indice per chiamare uno degli array qui sopra
int indexarray = 0;
//1.1.4.5 Aggiunto array per identificare gli array da risolvere per primi
int firstarray [20];
for(int f = 0; f < 20; f++) firstarray[f] = 0;
// Scrivo l'altro messaggio console
cout << "Inserire l'espressione (è necessario scrivere le frazioni in questo modo: es. 1|2) e premere invio, oppure scrivere fine per chiudere il programma." << endl;
string input;
cin >> input;
//1.1.4.5 For debug only
if(input == "t")
{
input = "13|3-{2|3+[(4|3-1|5-12|5)*3|4*(5|4-1|2-1|12)]*(7|5+2|1)}*5|37";
}
if(input == "fine")
{
return 1;
}
// Divido caratteri e elaboro gli elaboro per individuare i numeratore, i denominatori, gli operatore e (1.1.3.0) le parentesi
for (int indexenumerator = 0; indexenumerator < input.size(); indexenumerator++)
{
switch (input[indexenumerator])
{
// Se il carattere corrente è un numero...
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '0':
{
// individuo di che cosa fa parte il numero
if (numactive == true && denactive == false)
{
//1.1.4.5 Usato += e migliorato codice
// se è un numeratore lo inserisco nell'array dei numeratori
--indexnum[indexarray];
temparraynum[indexarray][indexnum[indexarray]] += input[indexenumerator];
++indexnum[indexarray];
}
else if (numactive == false && denactive == false)
{
// se è il primo numero letto è sicuramente un numeratore per cui lo metto nell'array dei numeratori
temparraynum[indexarray][indexnum[indexarray]++] = input[indexenumerator];
numactive = true;
}
else if (numactive == false && denactive == true)
{
// se c'è appena stata una linea di frazione, questa cifra è sicuramente il denominatore
// 1.1.4.0 Migliorato codice
temparrayden[indexarray][indexden[indexarray] - 1] += input[indexenumerator];
denactive = true;
}
break;
}
case '|':
{
// se trovo una linea di frazione predispongo le variabili in modo che il prossimo numero si riconosciuto come un denominatore
numactive = false;
denactive = true;
indexden[indexarray]++;
break;
}
case '+':
{
// se trovo un + vorrà dire che questa operazione sarà un addizione
tempoperator[indexoperator[indexarray]++][indexarray] = "+";
denactive = false;
numactive = false;
riduci = false;
break;
}
case '-':
{
// se trovo un - vorrà dire che questa operazione sarà un sottrazione
tempoperator[indexoperator[indexarray]++][indexarray] = "-";
denactive = false;
numactive = false;
riduci = false;
break;
}
case '*':
{
// se trovo un * vorrà dire che questa operazione sarà un moltiplicazione
tempoperator[indexoperator[indexarray]++][indexarray] = "*";
denactive = false;
numactive = false;
riduci = false;
break;
}
case '/':
{
// se trovo un / vorrà dire che questa operazione sarà un divisione
tempoperator[indexoperator[indexarray]++][indexarray] = "/";
denactive = false;
numactive = false;
riduci = false;
break;
}
case '(':
{
//1.1.4.5 inserisco nell'arraynum corrente x + il numero dell'array seguente
temparraynum[indexnum[indexarray++]++][indexarray] = ("x"+Tostring(indexarray+1));
firstarray[indexarray] = 3;
break;
}
case ')':
{
//1.1.4.5 qui diminuisco l'indice in modo da
indexarray--;
break;
}
case '[':
{
//1.1.4.5 inserisco nell'arraynum corrente x + il numero dell'array seguente
temparraynum[indexnum[indexarray++]++][indexarray] = ("x"+Tostring(indexarray+1));
firstarray[indexarray] = 2;
break;
}
case ']':
{
//1.1.4.5 qui diminuisco l'indice in modo da
indexarray--;
break;
}
case '{':
{
//1.1.4.5 inserisco nell'arraynum corrente x + il numero dell'array seguente
temparraynum[indexnum[indexarray++]++][indexarray] = ("x"+Tostring(indexarray+1));
firstarray[indexarray] = 1;
break;
}
case '}':
{
//1.1.4.5 qui diminuisco l'indice in modo da
indexarray--;
break;
}
}
}