al3xmill3r74
11-10-2018, 09:49
Salve a tutti,
Quest'anno ho iniziato il primo anno di Ingegneria Informatica al Politecnico di Torino, sono sempre stato appassionato di informatica da quando ero piccolo e ho sempre ritenuto che il forum di HWU fosse eccezionale, spero pertanto di trovare una risposta al mio quesito. :D
Ho recentemente ricominciato a scrivere programmi in C per esercitarmi, anche se non ho ancora ricevuto compiti "ufficiali" da parte dei docenti del Poli. Tuttavia, l'altro giorno ad un mio amico, che ha iniziato anche lui il Poli quest'anno, è stato assegnato un compito: scrivere un programma che convertisse numeri decimali in binario e viceversa (da 0 a 255).
Questo è quello che ci siamo inventati: :D
#include <stdio.h>
#include <Windows.h>
int a, b, c, d, e, f, g, h, ax, bx, cx, dx, ex, fx, gx, hx, numdec, numbin, numdecresult, progr;
char exit;
int main()
{
printf("\n 1. Conversione di numeri naturali da decimale a binario");
printf("\n 2. Conversione di numeri naturali da binario a decimale");
printf("\n\n > ");
scanf("%d", progr);
if (progr == 1)
{
return progr1();
}
else if (progr == 2)
{
return progr2();
}
else
{
printf("\n\n La selezione non è valida.");
Sleep(2000);
return main();
}
return 0;
}
int progr1()
{
printf("\n\n Numero da convertire in binario (0-255, 1 byte): ");
scanf("%d", numdec);
if (numdec >= 0 && numdec < 256)
{
a = numdec % 2;
ax = numdec / 2;
b = ax % 2;
bx = ax / 2;
c = bx % 2;
cx = bx / 2;
d = cx % 2;
dx = cx / 2;
e = dx % 2;
ex = dx / 2;
f = ex % 2;
fx = ex / 2;
g = fx % 2;
gx = fx / 2;
h = gx % 2;
hx = gx / 2;
printf("\n\n Il numero %d", numdec) && printf(" convertito in binario e': %d %d %d %d %d %d %d %d", h, g, f, e, d, c, b, a);
printf("\n\n\n Eseguire un'altra operazione? ");
getchar(); //scanf must have nothing else to handle
scanf("%c", &exit);
if (exit == 'y' || exit == 'Y')
{
system("cls");
return main();
}
else
{
return 0;
}
}
else
{
printf("\n\n Il numero non e' compreso tra 0 e 255.");
Sleep(2000);
return progr1();
}
return 0;
}
int progr2()
{
int decposition = 1;
loopprogr2:
decposition = decposition + 1;
printf("\n\n Cifra %d", decposition) && printf(" da convertire in decimale (0-1, 1 bit): ");
scanf("%d", numbin);
if (numbin == 0 || numbin == 1)
{
if (decposition == 1)
{
ax = numbin;
goto loopprogr2;
}
else if (decposition == 2)
{
bx = numbin;
goto loopprogr2;
}
else if (decposition == 3)
{
cx = numbin;
goto loopprogr2;
}
else if (decposition == 4)
{
dx = numbin;
goto loopprogr2;
}
else if (decposition == 5)
{
ex = numbin;
goto loopprogr2;
}
else if (decposition == 6)
{
fx = numbin;
goto loopprogr2;
}
else if (decposition == 7)
{
gx = numbin;
goto loopprogr2;
}
else if (decposition == 8)
{
h = numbin;
goto ifresultbin1;
}
ifresultbin1:
if (ax == 1)
{
a = 128;
goto ifresultbin2;
}
else
{
a = 0;
goto ifresultbin2;
}
ifresultbin2:
if (bx == 1)
{
b = 64;
goto ifresultbin3;
}
else
{
b = 0;
goto ifresultbin3;
}
ifresultbin3:
if (cx == 1)
{
c = 32;
goto ifresultbin4;
}
else
{
c = 0;
goto ifresultbin4;
}
ifresultbin4:
if (dx == 1)
{
d = 16;
goto ifresultbin5;
}
else
{
d = 0;
goto ifresultbin5;
}
ifresultbin5:
if (ex == 1)
{
e = 8;
goto ifresultbin6;
}
else
{
e = 0;
goto ifresultbin6;
}
ifresultbin6:
if (fx == 1)
{
f = 4;
goto ifresultbin7;
}
else
{
f = 0;
goto ifresultbin7;
}
ifresultbin7:
if (gx == 1)
{
g = 2;
goto resultbin;
}
else
{
g = 0;
goto resultbin;
}
resultbin:
numdecresult = a + b + c + d + e + f + g + h;
printf("\n\n Il numero %d %d %d %d %d %d %d %d", ax, bx, cx, dx, ex, fx, gx, h) && printf(" convertito in decimale e': %d", numdecresult);
printf("\n\n\n Eseguire un'altra operazione? ");
getchar(); //scanf must have nothing else to handle
scanf("%c", &exit);
if (exit == 'y' || exit == 'Y')
{
system("cls");
return main();
}
else
{
return 0;
}
}
else
{
printf("\n\n La cifra deve essere uno 0 o un 1.");
Sleep(2000);
return progr2();
}
return 0;
}
Il programma che ha scritto è inutilmente complicato a mio giudizio, ma mi ha spiegato che gli è stato richiesto di utilizzare particolari funzioni e di seguire questo percorso logico, pertanto mi sono limitato a controllare con lui che non ci fossero errori formali.
Ebbene, dopo aver controllato più volte il programma, abbiamo provato a compilarlo per eseguirlo e vedere se effettivamente funzionasse (utilizziamo entrambi Visual Studio 2017), ma con rammarico abbiamo scoperto che purtroppo ci vengono restituiti più errori, in particolare:
1. Errore C2365: 'exit': ridefinizione. La definizione precedente era 'funzione' -- ora, io ho ricontrollato più volte il programma, non mi sembra che ci sia una ridefinizione. Ovviamente questo errore non ci permette di compilare il programma, ma se elimino la riga 4 (char exit) per qualche motivo ci permette di compilarlo senza problemi.
2. Se elimino la riga 4, compilo il programma e lo avvio, ci viene presentata la "schermata principale" (dove viene richiesto di selezionare un'opzione, conversione decimale-binario o binario-decimale). Tuttavia, che io scriva 1, 2 o qualunque altra cosa e prema Invio, compare una finestra che mi avvisa di un errore di runtime (Microsoft Visual C++ Runtime Library) in cui si legge:
---
Debug Assertion Failed!
Program: (programma)
File: minkernel\crts\ucrt\inc\corecrt_internal_stdio_input.h
Line: 1565
Expression: result_pointer != nullptr
...
...
---
Ora, per quanto mi piaccia l'informatica e adori programmare un pochino nel tempo libero, non sono un esperto in (nessuna) materia.
Sapreste dirmi perché succedono queste due cose? :confused: :help:
Vi ringrazio in anticipo,
A.
Quest'anno ho iniziato il primo anno di Ingegneria Informatica al Politecnico di Torino, sono sempre stato appassionato di informatica da quando ero piccolo e ho sempre ritenuto che il forum di HWU fosse eccezionale, spero pertanto di trovare una risposta al mio quesito. :D
Ho recentemente ricominciato a scrivere programmi in C per esercitarmi, anche se non ho ancora ricevuto compiti "ufficiali" da parte dei docenti del Poli. Tuttavia, l'altro giorno ad un mio amico, che ha iniziato anche lui il Poli quest'anno, è stato assegnato un compito: scrivere un programma che convertisse numeri decimali in binario e viceversa (da 0 a 255).
Questo è quello che ci siamo inventati: :D
#include <stdio.h>
#include <Windows.h>
int a, b, c, d, e, f, g, h, ax, bx, cx, dx, ex, fx, gx, hx, numdec, numbin, numdecresult, progr;
char exit;
int main()
{
printf("\n 1. Conversione di numeri naturali da decimale a binario");
printf("\n 2. Conversione di numeri naturali da binario a decimale");
printf("\n\n > ");
scanf("%d", progr);
if (progr == 1)
{
return progr1();
}
else if (progr == 2)
{
return progr2();
}
else
{
printf("\n\n La selezione non è valida.");
Sleep(2000);
return main();
}
return 0;
}
int progr1()
{
printf("\n\n Numero da convertire in binario (0-255, 1 byte): ");
scanf("%d", numdec);
if (numdec >= 0 && numdec < 256)
{
a = numdec % 2;
ax = numdec / 2;
b = ax % 2;
bx = ax / 2;
c = bx % 2;
cx = bx / 2;
d = cx % 2;
dx = cx / 2;
e = dx % 2;
ex = dx / 2;
f = ex % 2;
fx = ex / 2;
g = fx % 2;
gx = fx / 2;
h = gx % 2;
hx = gx / 2;
printf("\n\n Il numero %d", numdec) && printf(" convertito in binario e': %d %d %d %d %d %d %d %d", h, g, f, e, d, c, b, a);
printf("\n\n\n Eseguire un'altra operazione? ");
getchar(); //scanf must have nothing else to handle
scanf("%c", &exit);
if (exit == 'y' || exit == 'Y')
{
system("cls");
return main();
}
else
{
return 0;
}
}
else
{
printf("\n\n Il numero non e' compreso tra 0 e 255.");
Sleep(2000);
return progr1();
}
return 0;
}
int progr2()
{
int decposition = 1;
loopprogr2:
decposition = decposition + 1;
printf("\n\n Cifra %d", decposition) && printf(" da convertire in decimale (0-1, 1 bit): ");
scanf("%d", numbin);
if (numbin == 0 || numbin == 1)
{
if (decposition == 1)
{
ax = numbin;
goto loopprogr2;
}
else if (decposition == 2)
{
bx = numbin;
goto loopprogr2;
}
else if (decposition == 3)
{
cx = numbin;
goto loopprogr2;
}
else if (decposition == 4)
{
dx = numbin;
goto loopprogr2;
}
else if (decposition == 5)
{
ex = numbin;
goto loopprogr2;
}
else if (decposition == 6)
{
fx = numbin;
goto loopprogr2;
}
else if (decposition == 7)
{
gx = numbin;
goto loopprogr2;
}
else if (decposition == 8)
{
h = numbin;
goto ifresultbin1;
}
ifresultbin1:
if (ax == 1)
{
a = 128;
goto ifresultbin2;
}
else
{
a = 0;
goto ifresultbin2;
}
ifresultbin2:
if (bx == 1)
{
b = 64;
goto ifresultbin3;
}
else
{
b = 0;
goto ifresultbin3;
}
ifresultbin3:
if (cx == 1)
{
c = 32;
goto ifresultbin4;
}
else
{
c = 0;
goto ifresultbin4;
}
ifresultbin4:
if (dx == 1)
{
d = 16;
goto ifresultbin5;
}
else
{
d = 0;
goto ifresultbin5;
}
ifresultbin5:
if (ex == 1)
{
e = 8;
goto ifresultbin6;
}
else
{
e = 0;
goto ifresultbin6;
}
ifresultbin6:
if (fx == 1)
{
f = 4;
goto ifresultbin7;
}
else
{
f = 0;
goto ifresultbin7;
}
ifresultbin7:
if (gx == 1)
{
g = 2;
goto resultbin;
}
else
{
g = 0;
goto resultbin;
}
resultbin:
numdecresult = a + b + c + d + e + f + g + h;
printf("\n\n Il numero %d %d %d %d %d %d %d %d", ax, bx, cx, dx, ex, fx, gx, h) && printf(" convertito in decimale e': %d", numdecresult);
printf("\n\n\n Eseguire un'altra operazione? ");
getchar(); //scanf must have nothing else to handle
scanf("%c", &exit);
if (exit == 'y' || exit == 'Y')
{
system("cls");
return main();
}
else
{
return 0;
}
}
else
{
printf("\n\n La cifra deve essere uno 0 o un 1.");
Sleep(2000);
return progr2();
}
return 0;
}
Il programma che ha scritto è inutilmente complicato a mio giudizio, ma mi ha spiegato che gli è stato richiesto di utilizzare particolari funzioni e di seguire questo percorso logico, pertanto mi sono limitato a controllare con lui che non ci fossero errori formali.
Ebbene, dopo aver controllato più volte il programma, abbiamo provato a compilarlo per eseguirlo e vedere se effettivamente funzionasse (utilizziamo entrambi Visual Studio 2017), ma con rammarico abbiamo scoperto che purtroppo ci vengono restituiti più errori, in particolare:
1. Errore C2365: 'exit': ridefinizione. La definizione precedente era 'funzione' -- ora, io ho ricontrollato più volte il programma, non mi sembra che ci sia una ridefinizione. Ovviamente questo errore non ci permette di compilare il programma, ma se elimino la riga 4 (char exit) per qualche motivo ci permette di compilarlo senza problemi.
2. Se elimino la riga 4, compilo il programma e lo avvio, ci viene presentata la "schermata principale" (dove viene richiesto di selezionare un'opzione, conversione decimale-binario o binario-decimale). Tuttavia, che io scriva 1, 2 o qualunque altra cosa e prema Invio, compare una finestra che mi avvisa di un errore di runtime (Microsoft Visual C++ Runtime Library) in cui si legge:
---
Debug Assertion Failed!
Program: (programma)
File: minkernel\crts\ucrt\inc\corecrt_internal_stdio_input.h
Line: 1565
Expression: result_pointer != nullptr
...
...
---
Ora, per quanto mi piaccia l'informatica e adori programmare un pochino nel tempo libero, non sono un esperto in (nessuna) materia.
Sapreste dirmi perché succedono queste due cose? :confused: :help:
Vi ringrazio in anticipo,
A.