Squiddi Comune mortale
  
 
  Registrato: 12/02/15 17:41 Messaggi: 1
 
  | 
		
			
				 Inviato: 12 Feb 2015 17:42    Oggetto: [C]Programma non funziona come dovrebbe | 
				     | 
			 
			
				
  | 
			 
			
				Ciao a tutti sto convertendo un programma da C++ a C, ecco qual'è il codice del programma in C++:
 
 	  | Codice: | 	 		  #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
 
 	  | Codice: | 	 		  #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   | 
			 
		  |