PDA

View Full Version : [C] da int a char


white05
05-10-2007, 14:35
il problema è questo:

io ho un int per esempio 350
devo portarlo in un array di char dove ogni elemento dell'array è un numero decimale cioè '3' '5' '0'

ora il mio problema non è isolare i singoli numeri perché dividendo per migliaia, centinaia ecc ci riesco ma il mio problema è creare l'array di char perché se per esempio scrivo

char array[0] = 350/100 (quindi mi darebbe 3 essendo divisione tra interi)

quel 3 lui nell'array[0] me lo scrive come il carattere corrispondente all'int 3 ma invece deve scrivermi proprio 3
non so se ho fornito una chiara spiegazione...
:mbe:
qualche idea?

andbin
05-10-2007, 14:47
quel 3 lui nell'array[0] me lo scrive come il carattere corrispondente all'int 3 ma invece deve scrivermi proprio 3Gli aggiungi '0' (che ha valore 48).

Ziosilvio
05-10-2007, 14:49
Se stai usando il set di caratteri ASCII, le cifre decimali sono una dopo l'altra, per cui, se n è una variabile int il cui contenuto è compreso tra i valori 0 e 9, allora il carattere corrispondente è
n + '0'
Mi raccomando: fa' attenzione a non confondere '0' (la cifra 0) con '\0' (il carattere nullo).

white05
05-10-2007, 15:13
chiedo scusa ma non credo di aver capito...:mbe:

considerando il mio esempio dovrei scrivere

char array[0] = 350/100 + '0'

???

ma se per esempio io ho 3 lui non mi deve scrivere il carattere corrispondente a 3....mi deve scrivere proprio 3!!!!

andbin
05-10-2007, 15:18
ma se per esempio io ho 3 lui non mi deve scrivere il carattere corrispondente a 3....mi deve scrivere proprio 3!!!!Allora: 3 è un numero, '3' è un carattere ASCII che ha valore 51.

Quindi che tu scriva:
char c = 51;
char c = '3';
char c = 3 + '0';

è la stessa cosa.

white05
05-10-2007, 15:20
ok ma non funziona...:rolleyes:

ho scritto
char array[0];

array[0]=(350/100)+48;

printf("%c",array[0]);

e mi stampa un carattere diverso a caso ogni volta...

andbin
05-10-2007, 15:23
char array[0];Array di lunghezza zero .... utilissimo. ;)

white05
05-10-2007, 15:30
ops scusa ho sbagliato a digitare è

char array[10] :D

ad ogni modo ho riavviato il compilatore e ora funziona (il visual C fa spesso cosi non so perché)ma quello era un programma esempio per capire il concetto che ora grazie a voi ho capito, solo che l'originale è in un ciclo for e di tutto il ciclo funziona solo con il primo int per esempio 350, 3 me lo scrive bene e gli altri due li mette a caso immagino sia un problema dovuto al ciclo for...

for(i=k;i>=1;i=i/10){

if((somma/i) != 0) {

decimali[j] = (somma/i)+48;

j++;
decimali = (char *)(realloc(decimali,j+1*sizeof(char)));
}
}

dove k viene precedentemente calcolato come 1000000000
e somma è l'int in questione (per esempio 350)

quando vado a stampare

for(i=0;i<j;i++){

printf("%c",decimali[i]);
}

mi viene bene solo il primo carattere...

sirus
05-10-2007, 15:32
:sofico:

Vediamo di capire meglio quello che chiedi...
supponiamo per semplicità che tu abbia un intero n = 3 ed un carattere c. Tu vuoi fare in modo che dopo l'assegnamento di n a c l'utilizzo di putchar(c)stampi a video 3? Se si quello che devi fare èc = n + '0'e procedendo in questo modo, se dovessimo visualizzare il contenuto ASCII di c vedremmo 51. ;)

white05
05-10-2007, 15:38
grazie sirus con le vostre spiegazioni questo mi è chiaro...
ma come ho scritto nel mio post precedente nel for che ho fatto non so perché questa operazione mi va bene sempre e solo con il primo carattere...ci deve essere uno di quegli errori assurdi che mi sfugge

sirus
05-10-2007, 15:41
grazie sirus con le vostre spiegazioni questo mi è chiaro...
ma come ho scritto nel mio post precedente nel for che ho fatto non so perché questa operazione mi va bene sempre e solo con il primo carattere...ci deve essere uno di quegli errori assurdi che mi sfugge
Provato a debuggare il programma?
Comunque posta il codice del for che hai scritto.

white05
05-10-2007, 15:43
Comunque posta il codice del for che hai scritto.


è subito prima del tuo precedente post ;)

andbin
05-10-2007, 15:44
Se ad esempio volessimo (per semplificare) trattare solo numeri positivi e di 6 digit, basterebbe una cosa del tipo:

int num = 123456;
char digit[10];
int d = 100000, i;

for (i = 0; num != 0; i++, num %= d, d /= 10)
digit[i] = num / d + '0';

digit[i] = '\0';
printf ("%s\n", digit);

white05
05-10-2007, 15:47
e che differenza c'è con il mio??:mbe: a parte il modo di scrivere più abbreviato ovvio...

andbin
05-10-2007, 15:51
e che differenza c'è con il mio??Che nel tuo non vedo l'uso del modulo %, vedo un if che non capisco a cosa serve, vedo una realloc di cui non capisco la necessità.

white05
05-10-2007, 15:56
dunque il realloc si riferisce al fatto che non so in partenza di quanto devo allocare l'array....(è ovvio che questa è solo una parte di un codice di un programma...)

l'uso del modulo non serve a mio avviso perché il ciclo si ferma quando i = 1 cioè 10/10...

l'if serve a dire che mi deve stampare nell'array solo i caratteri diversi da zero perché come ben sai se faccio 350/1000000000 mi verranno prima un sacco di zeri (essendo divisione tra interi) prima di arrivare a 3 e di acquisire quegli zeri non mi interessa..

se ti sei offeso scusa ma io non ho l'abitudine di copiare ciò che mi scrivono gli altri ma di capire i miei errori altrimenti come divento esperto come te??
graize cmq...

ad ogni modo il ciclo for funziona per quantità di elementi da memorizzare...per esempio 350 lui me ne memorizza proprio 3... è solo che 3 me lo stampa ma gli altri due li stampa a caso..

sirus
05-10-2007, 16:00
e che differenza c'è con il mio??:mbe: a parte il modo di scrivere più abbreviato ovvio...
Che il tuo codice non può funzionare, perché è l'algoritmo ad essere sbagliato.
Nel primo ciclo valido (credo che l'if che hai introdotto serva a quello) prendi la cifra corretta, nel secondo ciclo (supponiamo 350 come valore da inserire in una stringa) esegui 350 / 10 che da 35, 35 al quale viene sommato 48 e da li l'errore. E così per tutte le divisioni successive. Nel secondo ciclo valido dovresti fare 50 / 10 e non 350 / 10, è per questo che il modulo è necessario. :p

andbin
05-10-2007, 16:08
dunque il realloc si riferisce al fatto che non so in partenza di quanto devo allocare l'array....Mazza .... è un gran spreco di memoria allocare un array fisso di una decina di char ...... :fagiano: :fagiano:

l'uso del modulo non serve a mio avviso perché il ciclo si ferma quando i = 1 cioè 10/10...Hai 123456, dividi per 100000 e hai 1, poi dividi per 10000 e ottieni .... 12. Il resto della divisione ti serve!

l'if serve a dire che mi deve stampare nell'array solo i caratteri diversi da zero perché come ben sai se faccio 350/1000000000 mi verranno prima un sacco di zeri (essendo divisione tra interi) prima di arrivare a 3 e di acquisire quegli zeri non mi interessa..Allora devi fare un test in più, non credo che basti.

white05
05-10-2007, 16:15
grazie sirus ora ho capito l'errore, in pratica usavo sempre la stessa somma...
ho provato con il modulo e mi sorge un altro errore...se per esempio mi deve inserire 1023.. lo 0 non lo inserisce e mi inserisce solo 123

white05
05-10-2007, 16:16
Mazza .... è un gran spreco di memoria allocare un array fisso di una decina di char ......

oh my god non capisco l'ironia....se il programma richiede allocazione dinamica che vuoi da me??? :mbe: e poi se sforo con l'array[10] che faccio??? si tratta di int possono essere 2^32 numeri ricordi?? da qui la necessità dell'allocazione dinamica

sirus
05-10-2007, 16:20
grazie sirus ora ho capito l'errore, in pratica usavo sempre la stessa somma...
ho provato con il modulo e mi sorge un altro errore...se per esempio mi deve inserire 1023.. lo 0 non lo inserisce e mi inserisce solo 123
Sempre colpa dell'algoritmo, prima di utilizzare il % c'è l'if che fa saltare il ciclo. :(
Visto che devi utilizzare l'allocazione dinamica della memoria, IMHO è meglio che prima tu scopra l'ordine di grandezza del numero da inserire nell'array, allochi l'array senza doverlo riallocare tutti i clici e poi utilizzi l'algoritmo di andbin. ;)

andbin
05-10-2007, 16:21
oh my god non capisco l'ironia....se il programma richiede allocazione dinamica che vuoi da me??? :mbe:Ah, se ti è stato espressamente richiesto così, ok. Ma ti è stato chiesto di riallocare proprio di 1 char per volta??

white05
05-10-2007, 16:26
si perché è stato chiesto di allocare la quantità di memoria esatta, quindi 3 numeri char[4] non di più...e non c'è modo di saperlo in partenza visto che in input c'è una stringa di bit (il numero in binario che poi viene convertito in decimale e messo in somma) che è arbitraria a scelta di chi lo inserisce. Ma poi questa parte mi funziona bene quindi dove è il problema?

ma dove è il problema nell'if?? non capisco...
io ho per esempio il num 1023...

if(1023/1000) !=0) (si)

lo inserisce nell'array..

chiudo if }

faccio il modulo somma%i

e mi lascia 023.. quindi secondo me il problema è nel modulo...perché ovviamente lo 0 di 023 non me lo considera...

sirus
05-10-2007, 16:29
si perché è stato chiesto di allocare la quantità di memoria esatta, quindi 3 numeri char[4] non di più...e non c'è modo di saperlo in partenza visto che in input c'è una stringa di bit (il numero in binario che poi viene convertito in decimale e messo in somma) che è arbitraria a scelta di chi lo inserisce. Ma poi questa parte mi funziona bene quindi dove è il problema?

ma dove è il problema nell'if?? non capisco...
io ho per esempio il num 1023...

if(1023/i) !=1000) (si)

lo inserisce nell'array..

chiudo if }

faccio il modulo somma%i

e mi lascia 023.. quindi secondo me il problema è nel modulo...perché ovviamente lo 0 di 023 non me lo considera...
La condizione che hai inserito nel codice per operare è la seguente (almeno stando a quello che hai scritto prima):if((somma / i) != 0)ora quando somma è 023 e tu effettui la divisione l'if fa saltare l'inserimento.

white05
05-10-2007, 16:35
si scusa ho modificato e tu stavi scrivendo quindi non hai visto che ho corretto l'errore

ora quando somma è 023 e tu effettui la divisione l'if fa saltare l'inserimento

ma perché lui 023 non lo considera direttamente 23?? quindi nell'if non mi arriva 023 ma 23...

sirus
05-10-2007, 16:41
si scusa ho modificato e tu stavi scrivendo quindi non hai visto che ho corretto l'errore

ma perché lui 023 non lo considera direttamente 23?? quindi nell'if non mi arriva 023 ma 23...
Nel ciclo in cui devi inserire il carattere 0 nell'array tu esegui l'operazione 23 / 100 (i in quel momento vale 100) quindi il tuo risultato è 0. Secondo l'algoritmo che hai postato direi che viene saltato l'inserimento del carattere.
Comunque prova a postare (con il tag CODE) il codice che stai provando in questo momento.

white05
05-10-2007, 16:49
ho provato a togliere l'if e porre il modulo come termine del ciclo for e il risultato è lo stesso...lo zero non lo scrive...del resto se come dici 023 mi passa nell'if come 23 e me lo divide per 100 e dovrebbe venire zero ed è giusto...dopo con il modulo il numero si riduce a 2/10 ed avviene uno sfalsamento..

il testo è questo ma la prima parte fino a quel famoso ciclo for cosi pure l'allocazione dinamica è intoccabile perché viene da precise richieste

void converti2 () {

short int j;

unsigned int somma, save_somma;

int i,k;

char *decimali;

short int *bin;

short int len = sizeof(unsigned int)* CHAR_BIT;

bin = (short int *)(malloc(len*sizeof(short int)));

printf("inserire il numero binario da convertire (%hd bit): \n",len);

for(i=0;i<len;i++) {

scanf("%hd",&bin[i]);
}


j = 0;

somma = 0;

for(i=len-1;i>=0;i--) {

if(bin[i] == 1) {

somma = somma + bin[i] * pow(2,j);
}

j++;
}

save_somma = somma;

decimali = (char*)(malloc(sizeof(char)));

if (len == 16) {

k = 10000;
} else {

k = 1000000000;
}

j = 0;

for(i=k;i>=1;i=i/10){

if((somma/i) != 0) {

decimali[j] = (somma/i)+48;

j++;

decimali = (char *)(realloc(decimali,j+1*sizeof(char)));


}
somma = somma % i;

}

decimali[j]='\0';

printf("la conversione in intero positivo e' %u\n",save_somma);

printf("la stringa di caratteri contenente i decimali e': " );

printf("%s",decimali);


}

sirus
05-10-2007, 16:59
Il pezzo che ci interessa è:
for(i = k; i >= 1 ;i = i / 10) {
if((somma / i) != 0) {
decimali[j] = (somma / i) + 48;
j++;
decimali = (char *)(realloc(decimali, j + sizeof(char)));
}
somma = somma % i;
}
(a parte il fatto che non sono molto convinto sulla validità di quella realloc) prendiamo il numero 1023 e proviamo a vedere cosa succede.
k = 10000, al primo ciclo 1023 / 10000 = 0 quindi l'if viene saltato e si passa ad eseguire somma = somma % i che lascia 1023 in somma (non mi piace questo passaggio in quella posizione).
Secondo ciclo, 1023 / 1000 = 1 != 0 si entra nell'if e tutto dovrebbe funzionare, si esegue poi 1023 % 1000 ed otteniamo 23 che viene posto in somma.
Terzo ciclo 23 / 100 = 0 ed il codice di inserimento all'interno dell'if viene saltato; ecco l'errore che ti dicevo in precedenza.
Il problema è l'algoritmo!

PS: il debugger non vi hanno fatto imparare ad usarlo?! :mbe:
EDIT: questo esercizio ha un testo?

white05
05-10-2007, 17:06
superiamo il problema di una realloc che funziona perfettamente ed è richiesta... almeno questo!! Anche perché alternativa non credo ci sia...

io ho capito dove è l'errore...ma il problema è che con il vostro codice mi stampa una serie infinita di zeri prima dei numeri interessati ed invece il prof vuole che l'array di char contenga solo i decimali che interessano ( e quindi non tutti gli zeri precedenti) in un array di quella esatta lunghezza...

non mi piace questo passaggio in quella posizione
se il risultato è lo stesso che cambia la posizione?? è solo una questione di leggibilità personale no?

grazie comunque per la pazienza...mi scervellerò ancora, voglio dire..impossibile non sarà!! :D

sirus
05-10-2007, 17:09
superiamo il problema di una realloc che funziona perfettamente ed è richiesta... almeno questo!!

io ho capito dove è l'errore...ma il problema è che con il vostro codice mi stampa una serie infinita di zeri prima dei numeri interessati ed invece il prof vuole che l'array di char contenga solo i decimali che interessano ( e quindi non tutti gli zeri precedenti) in un array di quella esatta lunghezza...

grazie comunque per la pazienza...mi scervellerò ancora, voglio dire..impossibile non sarà!! :D
Posto che l'allocazione della memoria la si può fare dinamica ma in modo molto più elegante, l'operazione che devi fare è quella di scoprire l'ordine di grandezza del numero che devi inserire nel vettore di char e fare solo le divisioni necessarie. ;)

L'esercizio è quasi un classico... credo (almeno a me era stato richiesto in 3° superiore) e ti assicuro che è fattibilissimo. ;)

white05
05-10-2007, 17:12
purtroppo l'eleganza del codice è una cosa che credo si acquisti con gli anni...
a differenza tua io non ho studiato programmazione alle superiori...

se l'esercizio è fattibilissimo perché sia il mio codice che il vostro non lo soddisfa??...

so che in confronto a voi sono ignorante in programmazione...ma non lo sottolineate sempre..sono qui per capire non per avere giudizi

sirus
05-10-2007, 18:01
se l'esercizio è fattibilissimo perché sia il mio codice che il vostro non lo soddisfa??...
Quello che ha scritto andbin non lo soddisfa perché andbin non è a conoscenza dell'intera richiesta dell'esercizio ed ha costruito una sola parte dell'algoritmo che risolve il problema.

PS: cosa indica CHAR_BIT? Il numero di bit che compone il numero da inserire nel vettore?