Controllo se ci sono cifre ripetute

nadia891
Ciao ,
riporto il codice del mio libro poichè c'è un passaggio che non capisco.
Devo vedere se dato un numero qui si ripetono le cifre o no.

#include <stdio.h>
#include<stdbool.h>

int main (void)
{
 bool a[10]={false};
int b;
long n;

printf("scrivi il numero:");
scanf("%ld",&n);

while (n>0){

b=n%10;

if(a[b])   /* che significa questo passaggio? io avrei scritto if (a[b]true) */

break;

a[b]=true;

n=n/10;

}

if (n>0)
printf("cifre ripetute");
else
printf("cifre non ripetute");

return 0;
}

Risposte
apatriarca
atrue non è una istruzione valida in C.. a restituisce invece il valore b-esimo dell'array a.

claudio862
In C un'espressione vale "vero" se è diversa da zero, "falso" se è zero. Ad esempio puoi scrivere:

if (4) {
    // 4 è diverso da zero, vale "vero".
    // Questo ramo viene eseguito
}

if ("ciao") {
    // Questo pure
}

if (0) {
    // Questo ramo non viene eseguito
}

if (0.0) {
    // Questo nemmeno
}

if (NULL) {
    // Questo nemmeno
}

Questo vale anche per la vecchia versione del C, in cui non esisteva un tipo booleano. Spesso vale anche per altri linguaggi.

a è il b-esimo valore dell'array a. In sostanza entra nel ramo dell'if se a == true, le condizioni sono equivalenti:

if (a[b]) {
}
if (a[b] != 0) {
}
if (a[b] != false) {
}

nadia891
Ora cambio un pò il problema per esempio invece di un numero ne aggiungo più di uno e per ogni numero controllo le cifre ripetute ( per ogni cifra 0 1 2 3 4 5 6 7 8 9).

ho scritto:
#include <stdio.h>
#include <stdbool.h>

int main(void)

{ 
int s;
bool a[10][10]={false};
long n[s];
int b; 
int c[10][s];
int d=0;
int i=0  ;

printf("inserisci quanti numeri si vuole inserire:\n");
scanf("%d",&s);


for (i=0; i<s; i++)
printf("%d numero: \n", i++);
scanf("%ld",&n[i]);

while (i<s){

    while (n[i]>0){
    d=d+1;

    b=n[i]%10;

    if(a[b][i])
      c[b][i]= c[b][i]+1;

   a[b][i]=true;
   n[i]=n[i]/10;
  
   i=i+1;
  }

printf("0 1 2 3 4 5 6 7 8 9  \n");
printf("nel %d numero,ripetute rispettivamente :\n",i++);

for (b=0;b<10; b++)
for (i=0;i<s;i++)
printf("%d ", c[b][i]);
}

return 0;
}


Non capisco perchè il vettore a lunghezza variabile non si può inizializzare e poi quando eseguo è come se andasse in loop

apatriarca
Ho guardato di fretta il codice ma il seguente ciclo non fa probabilmente quello che desideri:
for (i=0; i<s; i++)
printf("%d numero: \n", i++);
scanf("%ld",&n[i]);

E' infatti equivalente a
for (i=0; i<s; i++) {
    printf("%d numero: \n", i++);
}
scanf("%ld",&n[s]);

Soprattutto all'inizio, quando si ha poca dimestichezza con la programmazione, conviene inserire sempre le parentesi graffe in modo da evitare errori di questo tipo..

Inoltre il ciclo successivo non viene eseguito perché dopo la fine del ciclo precedente i vale s e questo valore non viene mai modificato. Per cui i < s non sarà mai vero. Inoltre, siccome il valore di i è uguale a s alla fine del ciclo for e poi while, sarà uguale a s anche nelle due righe successive al while.

nadia891
effettivamente mi sono accorta che c'erano un bel pò di errori..
Ora l'ho riscritto ma continua a non andare:
#include <stdio.h>
#include <stdbool.h>

int main(void)

{ 
int s;
bool a[10][10]={false};
long n[s];
int b; 
int c[s][10];
int d=0;
int i=0  ;
int f=0;
int v=0;


printf("inserisci quanti numeri si vuole inserire:");
scanf("%d",&s);
for (i=0;i<s;i++)
for (f=0;f<10;f++)
c[i][f]=0;


for (i=0; i<s; i=i+1){
v=i+1;
printf("%d numero: ",v);
scanf("%ld",&n[i]);
}

printf("le cifre :0 1 2 3 4 5 6 7 8 9  \n");

i=0;
v=0;

while (i<s){
v=i+1;
printf("nel %d  numero ripetute, rispettivamente :\n",v);
    while (n[i]>0){
   
	b=n[i]%10;

    if(a[i][b])
      c[i][b]= c[i][b]+1;

   a[i][b]=true;
   n[i]=n[i]/10;
   
   }
for (d=0;d<10;d++)
 
printf("%d ",c[i][d]);
printf("\n");

i=i+1;
}


return 0;

}

claudio862
int main()
{
int s; // 's' non è inizializzato
bool a[10][10]={false};
long n[s]; // 's' non è inizializzato, non puoi usare il suo valore.
int b; 
int c[s][10]; // 's' non è inizializzato, non puoi usare il suo valore.
...


Una soluzione è spostare la dichiarazione di n e c dopo aver letto s.

int main()
{
int s; // 's' non è inizializzato

printf("inserisci quanti numeri si vuole inserire:");
scanf("%d",&s); // Ok, ora 's' è inizializzato

bool a[10][10]={false};
long n[s]; // 's' è inizializzato, ok
int b; 
int c[s][10]; // 's' è inizializzato, ok
...


Tieni presente che stai usando array a lunghezza variabile. Sono stati introdotti con la versione C99 del C, mentre non esistono in C++.

nadia891
perchè il mio compilatore non riconosce la scrittura
printf( "%d",i++) ? come se considera il primo valore (i=1) ma non i seguenti..

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.