Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [C]Affiancamento numeri

    Ciao,
    devo fare un programma che dato un array di interi, contententi in ogni elemento una cifra, restituisca il numero intero ottenuto affiancando le cifre (es: 4 3 8 1 => 4381).

    Io ho scritto questo codice
    codice:
    #include<stdio.h>
    int numin(int[], int);
    int main()
    {
        int num[1000], i=0, op=0;
        printf("Inserisci una sequenza di numeri interi positivi\n");
        printf("Per terminare inserisci un numero maggiore di 9\n");
        do 
        {
            printf("\nInserisci il %d%c numero:", i+1, 167);
            scanf("%d", &num[i]);
            while(num[i]<0)
            {                                 
                      printf("Il numero inserito '%d' non e' corretto perche' e' minore di zero\n", num[i]);
                      printf("Inserisci nuovamente il %d%c numero", i+1, 167);
                      scanf("%d", &num[i]);
            }
        }
        while(num[i++]<=9);
        printf("Il risultato e\':%d\n", numin(num,i));
        system("pause");
        return 0;
    }
    //Implementazione della funzione che restituisce il numero intero ottenuto affiancando le cifre
    int numin(int n[], int tot)
    {
        int somma=0, i, j=1, k=tot;
        while(k!=0)
        {
             j=j*10;
             k--;
        }      
        for(i=0; i<tot; i++)
        {
                 somma=somma+(n[i]*j);
                 j=j/10;
        }
        return somma;
    }
    Il problema è che il numero generato ha giuste solo alcune cifre mentre le altre sono sbagliate (es: 1,2,3,4,10[usato per terminare] => 123500)

    Ciao e grazie
    Your time is limited, so don't waste it living someone else's life. Stay hungry, stay foolish. (Steve Jobs)

  2. #2
    Eseguire dei printf() ogni tanto per controllare i valori non sarebbe male...

    Nel main dopo aver inserito il 5° valore (che è maggiore di 10) incrementi lo stesso i anche se non dovresti, quindi se hai 4 valore conteggi per 5.

    Nella funzione moltiplichi j per 10 una volta di troppo, perché se hai 4 valori j varrà 10000, in più col fatto che conti un numero di troppo viene 10^6 = 100000, e quindi il risultato finale sarà 123400.


    Ad ogni modo, è più facile che usi le moltiplicazioni successive:

    codice:
    int numin(int n[], int tot)
    {
        int somma=0, i;
    
        for(i=0; i<tot; i++)
        {
            somma *= 10;
            somma += n[i];
        }
        return somma;
    }

  3. #3
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    1,2,3,4,10
    1,2,3,4+1,0 e uno 0 aggiuntivo dovuto a come calcoli j: l'ultima cifra non deve essere moltiplicata per 10^0 (1).
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  4. #4
    Ciao,
    ho sistemato il codice modificando l'implementazione della funzione come mi ha suggerito @ZioLuffio
    codice:
    #include<stdio.h>
    int numin(int[], int);
    int main()
    {
        int num[1000], i=0, op=0;
        printf("Inserisci una sequenza di numeri interi positivi\n");
        printf("Per terminare inserisci un numero maggiore di 9\n");
        do 
        {
            printf("\nInserisci il %d%c numero:", i+1, 167);
            scanf("%d", &num[i]);
            while(num[i]<0)
            {                                 
                      printf("Il numero inserito '%d' non e' corretto perche' e' minore di zero\n", num[i]);
                      printf("Inserisci nuovamente il %d%c numero", i+1, 167);
                      scanf("%d", &num[i]);
            }
        }
        while(num[i++]<=9);
        printf("Il risultato e\':%d\n", numin(num,i));
        system("pause");
        return 0;
    }
    //Implementazione della funzione che restituisce il numero intero ottenuto affiancando le cifre
    int numin(int n[], int tot)
    {
        int somma=0, i;
        for(i=0; i<tot; i++)
        {
            somma *= 10;
            somma += n[i];
        }
        return somma;
    }
    Nel main dopo aver inserito il 5° valore (che è maggiore di 10) incrementi lo stesso i anche se non dovresti, quindi se hai 4 valore conteggi per 5.
    Quindi come dovrei modificare l'implementazione al fine di renderla giusta?

    Ciao e grazie
    Your time is limited, so don't waste it living someone else's life. Stay hungry, stay foolish. (Steve Jobs)

  5. #5
    Hai 2 modi: o aggiungi semplicemente un decremento di i dopo il ciclo do, oppure al posto del do metti un ciclo while, dal quale esci (break) se il numero è maggiore di 10.

  6. #6
    Ok,
    quindi l'ho sistemato come mi hai detto
    codice:
    #include<stdio.h>
    int numin(int[], int);
    int main()
    {
        int num[1000], i=0, op=0;
        printf("Inserisci una sequenza di numeri interi positivi\n");
        printf("Per terminare inserisci un numero maggiore di 9\n");
        do 
        {
            printf("\nInserisci il %d%c numero:", i+1, 167);
            scanf("%d", &num[i]);
            while(num[i]<0)
            {                                 
                      printf("Il numero inserito '%d' non e' corretto perche' e' minore di zero\n", num[i]);
                      printf("Inserisci nuovamente il %d%c numero", i+1, 167);
                      scanf("%d", &num[i]);
            }
        }
        while(num[i++]<=9);
        i--; //Perchè così elimino il conteggio dell'ultimo numero inserito (il valore utilizzato per uscire) 
        printf("Il risultato e\':%d\n", numin(num,i));
        system("pause");
        return 0;
    }
    //Implementazione della funzione che restituisce il numero intero ottenuto affiancando le cifre
    int numin(int n[], int tot)
    {
        int somma=0, i;
        for(i=0; i<tot; i++)
        {
            somma *= 10;
            somma += n[i];
        }
        return somma;
    }
    Ciao e grazie

    P.S. Secondo te come posso migliorarlo?
    Your time is limited, so don't waste it living someone else's life. Stay hungry, stay foolish. (Steve Jobs)

  7. #7
    Beh, il tuo programma è già ottimizzato, non saprei come migliorarlo. Personalmente metterei che non fosse valido il numero maggiore di 10 e uscissi con uno negativo, che magari a uno scappa la mano su due tasti, ma sono dettagli.

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Invece di scrivere

    i--;

    potresti semplice scrivere

    printf("Il risultato e':%d\n", numin(num, i-1));
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Originariamente inviato da oregon
    Invece di scrivere

    i--;

    potresti semplice scrivere

    printf("Il risultato e':%d\n", numin(num, i-1));
    ...se è per questo può anche scrivere printf("Il risultato e':%d\n", numin(num, --i));

  10. #10
    Sistemato

    ciao e grazie
    Your time is limited, so don't waste it living someone else's life. Stay hungry, stay foolish. (Steve Jobs)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.