PDA

View Full Version : [C]Non riesco a capire l'errore del mio programma


Squiddi
12-02-2015, 15:51
Ciao a tutti sto convertendo un programma da C++ a C, ecco qual'è il codice del programma in C++:
#include <iostream>
#include <stdlib.h>
#include <string.h>

using namespace std;

const int numGruppi = 3;
const char *gruppoName[] = { "mila", "milioni" };
const char *irregular[] = { "mille", "unmilione" };

const char *cifre19[] = {
"zero",
"uno",
"due",
"tre",
"quattro",
"cinque",
"sei",
"sette",
"otto",
"nove",
"dieci",
"undici",
"dodici",
"tredici",
"quattordici",
"quindici",
"sedici",
"diciassette",
"diciotto",
"diciannove"
};

const char *decine[] = {
"venti",
"trenta",
"quaranta",
"cinquanta",
"sessanta",
"settanta",
"ottanta",
"novanta"
};



bool Cifra ( const char *ch );
int moveEfondo ( char array[], int size );
void ConvLetter ( const char cifreIn[], int size );

bool Cifra ( const char *str )
{

for( ; *str != '\0'; str++)
{
if ((*str < 48) || (*str > 57))
return false;
}

return true;


}

int moveEfondo ( char array[], int size )
{
int lungChars = strlen ( array ),
sposta = (size-1);

if (lungChars < size)
{
for (int i=0; i < lungChars; i++)
{
array[sposta] = array[((lungChars-1)-i)];
sposta--;
}

for (int j=0; j < (size-lungChars); j++)
array[j] = 48;
}

if (size < 1)
return -1;

else return 0;
}


void ConvLetter ( const char cifreIn[], int size )
{


void Centinaia ( int cifre[], int group );
void Decine ( int cifre[], int group );
void Gruppi ( int cifre[], int group );


int gCifre [numGruppi] = { 0 };




for (int gruppo=(numGruppi-1), copia=0; gruppo >= 0; gruppo--, copia += 3)
{


gCifre[gruppo] = ( (cifreIn[copia]-48)*100 +
(cifreIn[copia+1]-48)*10 +
(cifreIn[copia+2]-48) );
}


int zero = 0;


for (int chkGroup=(numGruppi-1); chkGroup >= 0; chkGroup--)
{

if (gCifre[chkGroup] == 0)
zero++;

else
{
Centinaia ( gCifre, chkGroup );


Decine ( gCifre, chkGroup );


Gruppi ( gCifre, chkGroup );


}

}


if (zero == numGruppi)
cout << cifre19[0];


cout << endl;

}

void Centinaia ( int cifre[], int group )
{


if ((cifre[group]/100) > 1)
cout << cifre19[ (cifre[group]/100) ]; // "due"..."nove"


if ((cifre[group]/100) > 0)
{
if (((cifre[group]%100)/10) == 8 )
cout << "cent";
else cout << "cento";
}

}



void Decine ( int cifre[], int group )
{


if (((cifre[group]%100) < 20) && ((cifre[group]%100) > 0))
{

if ( (group == 0)
|| ((group > 0) && (cifre[group] != 1)) )
cout << cifre19[ (cifre[group]%100) ];

}
else
{

if ( ((cifre[group]%100) > 20) &&
(((cifre[group]%10) == 1) || ((cifre[group]%10) == 8)) )
{
char temp[9] = "";

cout << strncpy ( temp,
decine[ (((cifre[group]%100)/10) - 2) ],
(strlen (decine[ (((cifre[group]%100)/10) - 2) ]) -1));
}

else if ((cifre[group]%100) >= 20)
cout << decine[ (((cifre[group]%100)/10) - 2) ];

if (((cifre[group]%100)%10) > 0)
cout << cifre19 [ ((cifre[group]%100)%10) ];

}

}




void Gruppi ( int cifre[], int group )
{
if (group > 0)
{
if (cifre[group] > 1)
cout << gruppoName[ group-1 ];

else cout << irregular[ group-1 ];
}

}





int main()
{

char input[numGruppi*3];

cout << "Digita un intero (max " << (numGruppi*3) << " cifre): ";
cin >> input;

if (Cifra ( input ) == true)
{

moveEfondo ( input, numGruppi*3 );

cout << endl;


ConvLetter ( input, numGruppi*3 );

}

else
{
cout << endl
<< "ERRORE: Input non valido!" << endl
<< "Riavviare il programma e digitare soltanto numeri."
<< endl << endl;
}
system("PAUSE");
return 0;
}

E questo è quello che io ho fatto in C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


const int numGruppi = 3;
const char *gruppoName[] = { "mila", "milioni" };
const char *irregular[] = { "mille", "unmilione" };

const char *cifre19[] = {
"zero",
"uno",
"due",
"tre",
"quattro",
"cinque",
"sei",
"sette",
"otto",
"nove",
"dieci",
"undici",
"dodici",
"tredici",
"quattordici",
"quindici",
"sedici",
"diciassette",
"diciotto",
"diciannove"
};

const char *decine[] = {
"venti",
"trenta",
"quaranta",
"cinquanta",
"sessanta",
"settanta",
"ottanta",
"novanta"
};



int Cifra ( const char *ch );
int moveEfondo ( char array[], int size );
void ConvLetter ( const char cifreIn[], int size );

int Cifra ( const char *str )
{

for( ; *str != '\0'; str++)
{
if ((*str < 48) || (*str > 57))
return 0;
}

return 1;


}

int moveEfondo ( char array[], int size )
{
int i,j;
int lungChars = strlen ( array ),
sposta = (size-1);

if (lungChars < size)
{
for (i=0; i < lungChars; i++)
{
array[sposta] = array[((lungChars-1)-i)];
sposta--;
}

for (j=0; j < (size-lungChars); j++)
array[j] = 48;
}

if (size < 1)
return -1;

else return 0;
}


void ConvLetter ( const char cifreIn[], int size )
{


void Centinaia ( int cifre[], int group );
void Decine ( int cifre[], int group );
void Gruppi ( int cifre[], int group );


int gCifre [numGruppi];



int gruppo,copia;
for (gruppo=(numGruppi-1), copia=0; gruppo >= 0; gruppo--, copia += 3)
{


gCifre[gruppo] = ( (cifreIn[copia]-48)*100 +
(cifreIn[copia+1]-48)*10 +
(cifreIn[copia+2]-48) );
}


int zero = 0;

int chkGroup;
for (chkGroup=(numGruppi-1); chkGroup >= 0; chkGroup--)
{

if (gCifre[chkGroup] == 0)
zero++;

else
{
Centinaia ( gCifre, chkGroup );


Decine ( gCifre, chkGroup );


Gruppi ( gCifre, chkGroup );


}

}


if (zero == numGruppi)
printf("%c",cifre19[0]);


// cout << endl;

}

void Centinaia ( int cifre[], int group )
{


if ((cifre[group]/100) > 1)
printf("%c",cifre19[ (cifre[group]/100) ]); // "due"..."nove"


if ((cifre[group]/100) > 0)
{
if (((cifre[group]%100)/10) == 8 )
printf("cent");
else printf("cento");
}

}



void Decine ( int cifre[], int group )
{


if (((cifre[group]%100) < 20) && ((cifre[group]%100) > 0))
{

if ( (group == 0)
|| ((group > 0) && (cifre[group] != 1)) )
printf("%c",cifre19[ (cifre[group]/100) ]);

}
else
{

if ( ((cifre[group]%100) > 20) &&
(((cifre[group]%10) == 1) || ((cifre[group]%10) == 8)) )
{
char temp[9] = "";

printf("%c",temp,decine[ (((cifre[group]%100)/10) - 2) ],(strlen (decine[ (((cifre[group]%100)/10) - 2) ]) -1));
//cout << strncpy ( temp,
// decine[ (((cifre[group]%100)/10) - 2) ],
// (strlen (decine[ (((cifre[group]%100)/10) - 2) ]) -1));
}

else if ((cifre[group]%100) >= 20)
printf("%c",decine[ (((cifre[group]%100)/10) - 2) ]);
//cout << decine[ (((cifre[group]%100)/10) - 2) ];

if (((cifre[group]%100)%10) > 0)
printf("%c",cifre19 [ ((cifre[group]%100)%10) ]);
//cout << cifre19 [ ((cifre[group]%100)%10) ];

}

}




void Gruppi ( int cifre[], int group )
{
if (group > 0)
{
if (cifre[group] > 1)
printf("%c",gruppoName[ group-1 ]);

else printf("%c",irregular[ group-1 ]);
}
}





int main()
{

char input[numGruppi*3];
int a = numGruppi*3;
printf("Digita un intero max %d cifre: ",a);

scanf("%c",&input);
if (Cifra ( input ) == 1)
{

moveEfondo ( input, numGruppi*3 );

printf("\n");

ConvLetter ( input, numGruppi*3 );

}

else
{
printf("ERRORE: Input non valido! \nRiavviare il programma e digitare soltanto numeri.");
}
system("PAUSE");
return 0;
}


Solo che il codice in C parte ma non converte i numeri in lettere come dovrebbe, potreste dirmi dove ho sbagliato :) ? Grazie in anticipo :)

Squiddi
12-02-2015, 17:57
UPP
Per favore, è importantissimo

FreeMan
12-02-2015, 20:47
Ti credi furbo vero?

http://www.hwupgrade.it/forum/showthread.php?t=2700321

Bannato

CLOSED!!

>bYeZ<