[C] Stampare cifre ripetute

Messaggioda Omar79 » 11/03/2017, 19:15

buona sera ho un problema devo creare un programma che dopo aver inserito una serie di numeri lui mi stampi i numeri ripetuti(se ce ne sono).


questo dovrebbe essere l'output
Enter a number: 939577
Repeat digit: 7 9


io ho iniziato cos'ì
#include <stdio.h>
int main(void)
{
int vett[6];
int numeri, digit;
printf("digita i numeri ");
scanf("%d",&numeri);
while(numeri>0){
digit=numeri%10;
vett[digit]++;
numeri/=10;
}

return 0;




da qui in poi non ho minimamente idea di come devo fare(sopratutto non so proprio come far stampare la cifra ripetuta)...
Omar79
Junior Member
Junior Member
 
Messaggio: 26 di 126
Iscritto il: 11/12/2016, 10:07

Re: [C] Stampare cifre ripetute

Messaggioda mark97 » 11/03/2017, 20:25

Ho implementato diversamente, ma potresti comunque usare l'idea finale con la tua implementazione. Nel mio codice c'è una criticità: se inserisci più di 99 numeri vai in buffer overflow ;)

Codice:
#include <stdio.h>
#define STRLEN 100
int main(void) {
    char str[STRLEN];
    int repeat[10] = { };

    printf("Inserisci i numeri (senza spazi): ");

    scanf("%s", str);

    for (size_t i = 0; str[i] != '\0'; i++) {
        int num = ((int) str[i]) - 48;
        //printf("%d", num);
        if (num < 10)
            repeat[num]++;
        else
            puts("!!");
    }

    printf("%s", "I numeri ripetuti sono: ");

    int j = 0;
    for (size_t i = 0; i < 10; i++) {
        if (repeat[i] > 1) {
            j++;
            printf("%d ", i);
        }
    }
    if (!j) {
        printf("Nessun numero ripetuto!");
    }
    puts("");
}
mark97
Junior Member
Junior Member
 
Messaggio: 75 di 186
Iscritto il: 03/03/2014, 15:19

Re: [C] Stampare cifre ripetute

Messaggioda Omar79 » 11/03/2017, 21:32

grazie mille... domani provo, e se ho ancora problemi ti riscrivo ancora....
grazei e buona serata
Omar79
Junior Member
Junior Member
 
Messaggio: 28 di 126
Iscritto il: 11/12/2016, 10:07

Re: [C] Stampare cifre ripetute

Messaggioda mark97 » 12/03/2017, 15:56

Fammi sapere ;)
Ciao!
mark97
Junior Member
Junior Member
 
Messaggio: 78 di 186
Iscritto il: 03/03/2014, 15:19

Re: [C] Stampare cifre ripetute

Messaggioda apatriarca » 12/03/2017, 18:27

Perché nel tuo codice hai usato un array con \(6\) elementi? Le cifre possibili sono ovviamente \(10\).. C'è inoltre il problema che la stringa numerica possa rappresentare un numero più grande di quello rappresentabile in un intero. Sarebbe quindi più robusto leggere semplicemente i caratteri da stdin uno per volta. Qualcosa come il seguente insomma:
Codice:
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    fputs("Enter a number: ", stdout);
   
    // Ignore spaces before the number
    int c = getc(stdin);
    while(isspace(c)) { c = getc(stdin); }

    // Test if a number has been given
    if (!isdigit(c)) {
        fputs("Invalid input.", stderr);
        return EXIT_FAILURE;
    }

    // Count digits
    int digit_count[10] = { 0 };
    while (isdigit(c)) {
        digit_count[c - '0']++;
        c = getc(stdin);
    }

    // Print digits repeated multiple times
    fputs("Repeat digit: ", stdout);
    for (char i = 0; i < 10; ++i) {
        if (digit_count[i] > 1) {
            putc('0' + i, stdout);
        }
    }
    puts("");
}


@mark97: Non c'è alcuna garanzia che i caratteri siano in ASCII. E' in generale cattiva idea quella di usare codici numerici che fanno affidamento su dettagli di programmazione, per quanto comuni come la codifica ASCII. Costanti come '0' sono più leggibili e portabili di 48. Leggendo un codice con costanti come '0', 'a', 'Z', etc. se ne comprende subito il senso. Le corrispondenti costanti 48, 97 e 90 sono molto più ambigue e in generale richiedono una ricerca su internet (almeno per quanto mi riguarda*).
La lettura di una stringa usando scanf è una pessima idea a meno di inserire anche la dimensione massima che si può scrivere in tale stringa. La stringa di formato nel tuo caso avrebbe per esempio dovuto essere "%99s". Ma come ho mostrato nel mio codice non c'è alcuna ragione di avere una dimensione massima in quanto si può semplicemente leggere un carattere per volta.
Il seguente codice non ha senso. Una stringa di formato può contenere qualsiasi testo!!
Codice:
printf("%s", "I numeri ripetuti sono: ");
// è equivalente al seguente:
printf("I numeri ripetuti sono: ");
// o a
fputs("I numeri ripetuti sono ", stdout);


* Conosco qualche valore, ma non sempre il valore è in decimale. Per esempio mi ricordo i codici per cose come '~' in decimale ma dello spazio in esadecimale.
apatriarca
Moderatore
Moderatore
 
Messaggio: 4568 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [C] Stampare cifre ripetute

Messaggioda mark97 » 12/03/2017, 18:53

apatriarca ha scritto:Non c'è alcuna garanzia che i caratteri siano in ASCII.

Effettivamente hai ragione.

apatriarca ha scritto:La lettura di una stringa usando scanf è una pessima idea a meno di inserire anche la dimensione massima che si può scrivere in tale stringa. La stringa di formato nel tuo caso avrebbe per esempio dovuto essere "%99s". Ma come ho mostrato nel mio codice non c'è alcuna ragione di avere una dimensione massima in quanto si può semplicemente leggere un carattere per volta.

Se hai visto lo avevo scritto. In realtà di primo acchitto avevo usato scanf_s ma non facendo parte dello standard C99 lo ho tolto ;)

Comunque si, meglio leggere un carattere per volta, ma mi volevo attenere al suo input ;)
mark97
Junior Member
Junior Member
 
Messaggio: 83 di 186
Iscritto il: 03/03/2014, 15:19

Re: [C] Stampare cifre ripetute

Messaggioda Omar79 » 15/03/2017, 19:58

scusa se ti rispondo solo ora, dopo un po di giorni di prove sono finalmente riuscito a far andare il programma come volevo..
grazie mille epr l'aiuto.
Omar79
Junior Member
Junior Member
 
Messaggio: 35 di 126
Iscritto il: 11/12/2016, 10:07


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite