Premetto che mi sto avvicinando da poco alla programmazione c, quindi spero nel vostro buonsenso e di non criticare se ho fatto qualche errore grossolano. Ancora non ho studiato i puntatori, quindi non so bene come funzionano e sto avendo dei problemi.
C'era un esercizio nel quale inserito un numero da 1 a 49 devo stampare a video il corrispondente valore scritto in numeri romani.
Siccome ho voluto fare un pochino più di quello che mi è stato chiesto, ho creato un algoritmo che riesce a convertire i numeri da 1 a 1000.
L'ho scritto in java e testato e funziona.
Algoritmo in java:
private static String trasforma(int n) {
String stringa = "";
String max = "n", min = "n", middle = "n";
int divisore = 1;
if (n <= 10) {
max = "X";
middle = "V";
min = "I";
divisore = 1;
} else if (n <= 100) {
max = "C";
middle = "L";
min = "X";
divisore = 10;
}else if (n <= 1000) {
max = "M";
middle = "D";
min = "C";
divisore = 100;
}
switch (n / divisore) {
case 0:
stringa += "";
break;
case 1:
stringa += min;
break;
case 2:
stringa += min + min;
break;
case 3:
stringa += min + min + min;
break;
case 4:
stringa += min + middle;
break;
case 5:
stringa += middle;
break;
case 6:
stringa += middle + min;
break;
case 7:
stringa += middle + min + min;
break;
case 8:
stringa += middle+min+min+min;
break;
case 9:
stringa += min + max;
break;
case 10:
stringa += max;
break;
}
if (n <= 10) {
return stringa;
} else {
stringa += trasforma(n % divisore);
}
return stringa;
}
Poi ho provato a tradurlo in c:
char* trasforma(int n) {
char* stringa;
stringa = (char*) malloc (100*sizeof(char));
stringa ="";
char* max = "n", min = "n", middle = "n";
int divisore = 1;
if (n <= 10) {
max = "X";
middle = "V";
min = "I";
divisore = 1;
} else if (n <= 100) {
max = "C";
middle = "L";
min = "X";
divisore = 10;
}else if (n <= 1000) {
max = "M";
middle = "D";
min = "C";
divisore = 100;
}
switch (n / divisore) {
case 0:
stringa = strcat(stringa, "");
break;
case 1:
stringa = strcat(stringa, min);
break;
case 2:
stringa = strcat(stringa, strcat(min,min));
break;
case 3:
stringa = strcat(stringa, strcat(min,strcat(min,min)));
break;
case 4:
stringa = strcat(stringa, strcat(min,middle));
break;
case 5:
stringa = strcat(stringa, middle);
break;
case 6:
stringa = strcat(stringa, strcat(middle,min));
break;
case 7:
stringa = strcat(stringa, strcat(middle,strcat(min,min)));
break;
case 8:
stringa = strcat(stringa, strcat(middle,strcat(min,strcat(min,min))));
break;
case 9:
stringa = strcat(stringa, strcat(min,max));;
break;
case 10:
stringa = strcat(stringa, max);
break;
}
if (n <= 10) {
return stringa;
} else {
stringa = strcat(stringa, trasforma(n%divisore));
}
return stringa;
}
Però non funziona. Se avete un pochino di tempo potete dare un'occhiata? Non controllate la correttezza dell'algoritmo(funziona anche se non so se è scritto bene perchè l'ho fatto da solo). Non riesco a visualizzare le stringhe e concatenarle tra loro. Compare a video l'errore segmentation fault (core dumped), ho visto ed è come se in memoria non ci fosse nulla(?)