Passa al tema normale
Discussioni su argomenti di Informatica

Regole del forum

Consulta il nostro regolamento e la guida per scrivere le formule
Rispondi al messaggio

[C] Stampare cifre ripetute

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)...

Re: [C] Stampare cifre ripetute

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("");
}

Re: [C] Stampare cifre ripetute

11/03/2017, 21:32

grazie mille... domani provo, e se ho ancora problemi ti riscrivo ancora....
grazei e buona serata

Re: [C] Stampare cifre ripetute

12/03/2017, 15:56

Fammi sapere ;)
Ciao!

Re: [C] Stampare cifre ripetute

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.

Re: [C] Stampare cifre ripetute

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 ;)

Re: [C] Stampare cifre ripetute

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.
Rispondi al messaggio


Skuola.net News è una testata giornalistica iscritta al Registro degli Operatori della Comunicazione.
Registrazione: n° 20792 del 23/12/2010.
©2000— Skuola Network s.r.l. Tutti i diritti riservati. — P.I. 10404470014.