Qualche commento.
Guarda la tua tastiera. C'è un motivo per cui il tasto più grande è lo spazio: dovrebbe essere quello usato più spesso. Usa lo spazio per rendere il codice più leggibile, separando operatori, variabili e funzioni. E soprattutto indenta il codice!
Ecco come potresti aver fatto:
- Codice:
#include <iostream>
#include <stdlib.h>
using namespace std;
int mcd(int a, int b)
{
if (a < 0)
{
a = -a;
}
int r = a % b;
while (r != 0)
{
a = b;
b = r;
r = a % b;
}
return b;
}
void normfrazione(int &a, int &b)
{
if (a == 0)
{
b = 1;
}
else
{
if (b < 0)
{
a = -a;
b = -b;
}
int c = mcd(a, b);
a = a / c;
b = b / c;
}
return;
}
void outfrazione(int a, int b)
{
cout << a;
if (b != 1)
{
cout << "/" << b;
}
return;
}
void moltfrazione(int &a, int &b, int c, int d)
{
a = a * c;
b = b * d;
normfrazione(a, b);
return;
}
int main()
{
char v[20];
int a = 0, b = 1, c = 1, d = 1, p = 1;
cin >> v;
for (int i = 19; i >= 0; i--)
{
if (v[i] > 47 && v[i] < 58)
{
a = (a + ((v[i] - '0') * p));
p = p * 10;
}
if (v[i] == 45)
{
a = -a;
}
if (v[i] == 46)
{
b = p;
}
if (v[i] == 47)
{
c = a;
d = b;
a = 0;
b = 1;
p = 1;
}
}
moltfrazione(a, b, d, c);
outfrazione(a, b);
cout << endl << endl;
system("PAUSE");
}
Per motivi analoghi, racchiudi sempre il corpo di un if, for, while… tra parentesi graffe. Non scrivere
- Codice:
if(v[i]==45)a=-a;
ma scrivi
- Codice:
if (v[i] == 45)
{
a = -a;
}
Dimenticati di system("PAUSE"). Piuttosto configura il tuo IDE per lasciare aperta la console quando il programma termina (
non usare DevC++).
Gli header C (come <stdlib.h>) in C++ si includono togliendo il .h e aggiungendo una c all'inizio: <cstdlib>. Ma tanto quello ti serviva solo per system(), quindi toglilo direttamente.
Cerca di non usare using namespace std. I namespace esistono per evitare collisioni nei nomi, in questo modo li rendi inutili. Meglio scrivere il nome completo (std::cout, std::cin, std::endl…), almeno per namespace corti (std sono solo 3 lettere). Non usare
mai using namespace std in un file header.
Usa nomi più significativi per variabili e funzioni. normfrazione, outfrazione… Molto meglio normalizza_funzione, stampa_funzione (o normalizzaFunzione, stampaFunzione, a seconda di come preferisci). a, b… Molto meglio numeratore, denominatore (o num, den).
Poi, in generale, meglio scrivere codice in inglese. Il linguaggio, la libreria standard e praticamente tutte le librerie di terze parti sono in inglese, stona molto avere funzioni o variabili in italiano.
Le funzioni che operano sulle frazioni sono scritte abbastanza bene, e soprattutto sono modulari. mcd() calcola l'mcd di due numeri. normfrazione() normalizza una frazione, chiamando mcd(). moltfrazione() moltiplica due frazioni, chiamando normfrazione() per normalizzare il risultato. È abbastanza raro vedere un principiante riuscire a dividere bene le responsabilità tra funzioni, complimenti!
La funzione main() invece no… Avresti dovuto scrivere una funzione leggifrazione().
Cosa sono 58, 45, 46, 47? In gergo, questi vengono chiamati magic numbers. Tu sai che sono i valori di : - . / nel codice ASCII, ma un'altra persona che legge il codice (o più probabilmente tu stesso tra qualche giorno) potrebbe non saperlo. Inoltre non tutte le implementazioni di C++ usano ASCII (ok, probabilmente tutte quelle che userai sì, però in linea teorica…).
Scrivi semplicemente ':', '-', '.', '/'.
La lettura dei due numeri funziona solo se l'utente scrive correttamente, inoltre si aspetta esattamente l'espressione NUMERO/NUMERO.
Sarebbe meglio avere una funzione che legge un numero, e una che legge la riga.
Ad esempio:
- leggi una riga in una stringa
- spezza la stringa in due quando trovi '/'
- leggi i due numeri separatamente.
La funzione per leggere un numero potrebbe essere:
- Leggi un eventuale '-' all'inizio.
- Se tutti i caratteri della stringa sono cifre, è un intero, leggi quell'intero.
- Se uno dei caratteri è '.', allora è una frazione. Leggi i due gruppi di cifre. Calcola la lunghezza del secondo gruppo (10 elevato a questa lunghezza è il denominatore). Concatena i due gruppi di cifre (questo intero è il numeratore).
Esempio: 1234.555 => dopo il punto ci sono 3 cifre, quindi il denominatore è 10^3 = 1000. Il numeratore è 1234555. Il risultato è 1234555 / 1000 = 246911 / 200
(se vuoi, considera che il '.' potrebbe essere all'inizio o alla fine, es. .5 = 0.5 e 12. = 12)
- Se ci sono altri caratteri, errore.
Oppure cerca di adattare quello che hai scritto tu.
Non mettere return; alla fine di funzioni void. Non serve.
Non usare char[]. Usa std::vector<char>. O, ancora meglio, std::string. Per leggere un'intera linea:
- Codice:
std::string line;
std::getline(std::cin, line);
Infine, ricordati di
questo sito.