Controllo se ci sono cifre ripetute
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.
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
atrue non è una istruzione valida in C.. a restituisce invece il valore b-esimo dell'array a.
In C un'espressione vale "vero" se è diversa da zero, "falso" se è zero. Ad esempio puoi scrivere:
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 (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) { }
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:
Non capisco perchè il vettore a lunghezza variabile non si può inizializzare e poi quando eseguo è come se andasse in loop
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
Ho guardato di fretta il codice ma il seguente ciclo non fa probabilmente quello che desideri:
E' infatti equivalente a
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.
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.
effettivamente mi sono accorta che c'erano un bel pò di errori..
Ora l'ho riscritto ma continua a non andare:
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; }
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++.
perchè il mio compilatore non riconosce la scrittura
printf( "%d",i++) ? come se considera il primo valore (i=1) ma non i seguenti..
printf( "%d",i++) ? come se considera il primo valore (i=1) ma non i seguenti..