per esempio
2/0 ----> 2/1
0/2 ---> 0/2
1/-2 ----> non lo legge
3// ---> 3/1
. ----> 0/1
2.3.4 --->23/10
mi scuso se ho frainteso io le finalità del programma
La lettura dei due numeri funziona solo se l'utente scrive correttamente, inoltre si aspetta esattamente l'espressione NUMERO/NUMERO.
l'algoritmo funziona sia per x/y (dove x e y possono essere interi o decimali, positivi o negativi) sia per x (intero o decimale, positivo o negativo).
ho aggiunto anche i controlli sull'inserimento(caratteri validi e loro limitazioni, divisione per 0, successione validi di caratteri validi...):
- Codice:
#include <iostream>
#include <cstdint>
#include <string>
#include <cstdlib>
int64_t mcd(int64_t a, int64_t b)
{
if(a < 0)
{
a = -a;
}
int64_t r = a % b;
while(r != 0)
{
a = b;
b = r;
r = a % b;
}
return b;
}
void normalizza_frazione(int64_t &num, int64_t &den)
{
if(num == 0)
{
den = 1;
}
else
{
if(den < 0)
{
num = -num;
den = -den;
}
int64_t c = mcd(num, den);
num = num / c;
den = den / c;
}
}
void prodotto_frazione(int64_t &num_1, int64_t &den_1, int64_t num_2, int64_t den_2)
{
num_1 = num_1 * num_2;
den_1 = den_1 * den_2;
normalizza_frazione(num_1, den_1);
}
void inserisci_frazione(int64_t &num, int64_t &den, bool &x)
{
num = 0;
den = 1;
int64_t a = 1, b = 1, c = 1;
int virgola = 0, meno = 0, fratto = 0, v_1, v_2, m_1, m_2, f;
x = 1;
std::string v;
std::cin >> v;
for(int i = 0; i < v.size(); i++)
{
if(v[i] < '-' || v[i] > '9')
{
x = 0;
break;
}
if(v[i] == '.')
{
virgola++;
if(virgola > 2)
{
x = 0;
break;
}
if(virgola == 1)
{
v_1 = i;
}
else
{
v_2 = i;
}
}
if(v[i] == '-')
{
meno++;
if(meno > 2)
{
x = 0;
break;
}
if(meno == 1)
{
m_1 = i;
}
else
{
m_2 = i;
}
}
if(v[i] == '/')
{
fratto++;
if(fratto > 1)
{
x = 0;
break;
}
f = i;
}
}
while(x == 1)
{
if(virgola > 0)
{
if(v[v_1 - 1] < '0' || v[v_1 + 1] < '0')
{
x = 0;
break;
}
if(virgola == 2)
{
if(v[v_2 - 1] < '0' || v[v_2 + 1] < '0' || fratto == 0 )
{
x = 0;
break;
}
}
}
if(meno > 0)
{
if(v[m_1 + 1] < '0')
{
x = 0;
break;
}
if(meno == 2)
{
if(v[m_2 + 1] < '0' || fratto == 0)
{
x = 0;
break;
}
}
}
if(fratto > 0)
{
if(v[f - 1] < '0')
{
x = 0;
break;
}
if(virgola == 2)
{
if(v_1 > f || v_2 < f)
{
x = 0;
break;
}
}
if(meno == 2)
{
if(m_1 > f || m_2 < f)
{
x = 0;
break;
}
}
}
break;
}
if(x == 1)
{
for(int i = v.size(); i > -1; i--)
{
if(v[i] > '/' && v[i] < ':')
{
num = num + (v[i] - '0') * c;
c = c * 10;
}
if(v[i] == '-')
{
num = -num;
}
if(v[i] == '.')
{
den = c;
}
if(v[i] == '/')
{
a = num;
b = den;
num = 0;
den = 1;
c = 1;
}
}
if(a != 0)
{
prodotto_frazione(num, den, b, a);
}
else
{
x = 0;
}
}
if(x == 0)
{
std::cout << std::endl << "Inserimento non valido";
}
}
void mostra_frazione(int64_t num, int64_t den)
{
normalizza_frazione(num, den);
if(den == 1)
{
std::cout << num << "\t";
}
else
{
std::cout << num << "/" << den << "\t";
}
}
int main()
{
int64_t a , b;
bool x;
std::cout << "Caratteri validi: . - / 0 1 2 3 4 5 6 7 8 9";
std::cout << std::endl << std::endl << "Inserire valore: ";
inserisci_frazione(a, b, x);
if(x == 1)
{
std::cout << std::endl << "Frazione ridotta: ";
mostra_frazione(a, b);
}
std::cout << std::endl <<std::endl;
system("PAUSE");
}
credo di aver preso in considerazione ogni controllo sull'inserimento, in caso contrario ogni critica è ben accetta.