Fine... legna tutta tagliata, ora posso dedicarmi e continuare il progetto in sospeso della Calcolatrice romana in C.
Uno spezzone che mi dava parecchi grattacapi è stato risolto, cioè la parte che convertiva i decimali in numeri romani.
A differenza di Vb e Python il linguaggio C si comporta in maniera a sè stante, e ho dovuto rivedere tutta la procedura di conversione
infatti a differenza di Vb e python in cui è bastato un semplice adattamento nella trasposizione da un linguaggio all'altro
senza sorprese, e con poche modifiche, con il C le cose sono cambiate dopo la trasposizione i numeri decimali
venivano si convertiti diritti ma al contrario, mi spiego meglio Es.numero decimale 1459 convertito con la trasposizione o adattamento (praticamente senza modificare il codice e adattandolo semplicemente)
al linguaggio C mi dava in conversione IXLCDM in pratica blocchi di numeri romani convertiti correttamente ma al contrario IX = 9 - L = 50 - CD = 400 - M = 1000
Quindi ho dovuto ''reinventare'' la conversione invertendo la seguenza di composizione dei numeri romani, e in seguito creare una funzione per invertire l'intera stringa
che per affetto lo chiamata come in vb6 StrReverse(), cmq ora funza bene.
Pure il menu principale faceva i capricci come ho scritto nel topic (programmazione bla.. bla.. bla..) non voleva saperne di tornare sui suoi passi.
Beh!!! per ora il convertitore Decimale romano e il menu in C funzano bene sempre con numeri inferiori a 4000.
Ecco il Codice:
CODICE
// Calcolatrice romana in C. ver. 0.01
// Provata e funzionante su Ubuntu con g++ e su win seven con Dev-C++
#include <stdio.h>
//Costanti
#define MAX 30
#define TRUE 1
#define FALSE 0
//Prototipi di funzioni
int ContConvDec();
char convert_dec();
int StrReverse();
int Unisci();
//Dichiarazione variabili globali
char dgt[] = "IVXLCDM";
char g[MAX];
char t[MAX];
int num = 0;
int s = 0;
int z = 0;
int x = 0;
int selezione = TRUE;
int choice;
//Corpo del programma
int main()
{
while (selezione == TRUE)
{
printf("\nCALCOLATRICE E CONVERTITORE IN NUMERI ROMANI E VICEVERSA.");
printf("\n");
printf("\nMenu principale.\n");
printf("----------------\n");
printf("\n1) - Convertitore Decimale Romano.");
printf("\n2) - Convertitore Romano Decimale.");
printf("\n3) - Calcolatrice Romana.");
printf("\n4) - Uscita dal programma.\n");
printf("\n");
printf("\nScegli un'opzione da (1 a 4) -> ");
scanf("%d",&choice);
if (choice == 1)
{
ContConvDec(); //Chiama la funzione di conversione decimale romano.
}
if (choice == 2)
{
printf("\n\nFunzione non implementata!!!\n");
break;
}
if (choice == 3)
{
printf("\n\nFunzione non implementata!!!\n");
break;
}
if (choice == 4)
{
printf("\n\nGrazie per aver usato la Calcolatrice Romana!!\n");
break;
}
if (choice <= 0 || choice >= 5)
{
printf("\n\nScelta non valida. Programma terminato!\n");
selezione = FALSE;
}
}
return 0;
}
int ContConvDec()
{
s = 0;
z = 0;
x = 0;
printf("\nInserisci un numero decimale da 1 a 3999: ");
scanf("%d", &num); //chiede un numero decimale.
convert_dec(); //Converte il decimale in numero romano
StrReverse(); //Inverte il numero romano (o meglio lo radrizza)
printf("\n\nNUMERO ROMANO = %s\n",g);
printf("-----------------------------\n");
}
char convert_dec() //Funzione di conversione decimale romano.
{
int dg = 0;
do
{
dg = num % 10;
num = num / 10;
if (dg == 1)
{
Unisci();
}
if (dg == 2)
{
Unisci();
Unisci();
}
if (dg == 3)
{
Unisci();
Unisci();
Unisci();
}
if (dg == 4)
{
t[s] = dgt[x+1];
s++;
Unisci();
}
if (dg == 5)
{
t[s] += dgt[x+1];
s++;
}
if (dg == 6)
{
Unisci();
t[s] = dgt[x+1];
s++;
}
if (dg == 7)
{
Unisci();
Unisci();
t[s] = dgt[x+1];
s++;
}
if (dg == 8)
{
Unisci();
Unisci();
Unisci();
t[s]= dgt[x+1];
s++;
}
if (dg == 9)
{
t[s] = dgt[x+2];
s++;
Unisci();
}
x += 2;
}while (num != 0);
s++;
t[s] = '\0';
}
int StrReverse() //Funzione di inversione stringa (numero romano)
{
int r;
for (r = s-2;r >= 0;r--)
{
g[z] = t[r];
z++;
}
g[z] = '\0';
}
int Unisci() //Funzione per assegnare il numero romano
{
t[s] = dgt[x];
s++;
}
Mo continuo.......