Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Panasonic, 30 anni di Toughbook: la "Bibbia" di mille regole dietro i nuovi G3 e 34
Panasonic, 30 anni di Toughbook: la "Bibbia" di mille regole dietro i nuovi G3 e 34
A Londra, per il trentennale dei Toughbook, Panasonic ha presentato il tablet G3 e il 2-in-1 34. Con Jon Tucker, a capo dell'ingegneria europea, abbiamo parlato di ciò che non si vede: batterie, antenne, porte seriali e accorgimenti nati sul campo
realme C100x, lo smartphone economico con la batteria da 7500 mAh. La recensione
realme C100x, lo smartphone economico con la batteria da 7500 mAh. La recensione
realme C100x scommette tutto, forse troppo, sulla batteria da 7500 mAh e sulla certificazione ArmorShell per farsi notare nella fascia più economica del mercato: lo abbiamo messo alla prova per capire a chi è rivolto questo smartphone che sacrifica un po' prestazioni, display e fotocamera per offrire l'autonomia migliore possibile a un prezzo decisamente contenuto
Star Wars Zero Company è l'erede di XCOM 2
Star Wars Zero Company è l'erede di XCOM 2
Bit Reactor porta nell’universo di Star Wars una struttura tattica che richiama apertamente XCOM 2, ma la arricchisce con legami tra i personaggi, progressione ruolistica, gestione della base e un sistema di combattimento costruito attorno a tre Punti Azione e alle risorse condivise della squadra
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 02-07-2006, 18:00   #1
Free/Sbin
Member
 
Iscritto dal: Jul 2006
Messaggi: 38
[C] Aiuto...scrivere una mia versione di itoa()

Ciao,
stò impazzendo con l'esame di laboratorio di programmazione...un esercizio è scrivere una propria versione di itoa....questo è il delirio di soluzione messa online dalla proff...che ovviamente non funziona....potete darmi una mano?!?! non capisco proprio la logica dietro all'itoa()....

Codice:
#include <stdio.h>
#include <string.h>
main()
(
       int err=O, n=13;
       char s[20];
       int itoa(int n,char s[]);
       err = itoa(n,s);
       s[20]=' ';
               \0
       printf ("n=%d, s=%s\n",n,s);
}

itoa(n,s)
char s[];
int n;
{
        int i, segno;
        if((segno = n) < 0) /* controllo segno */
                  n= -n; /* rende n positivo */
        i = 0;
        do
        {
                  /* genera le cifre in ordine inverso */
                  s[i++] = n % 10 + '0'; /* prende la cifra succ.*/
        }while(( n/= 10) > 0); /* la toglie */
        if (segno < 0)
                  s[i++] = ' ;
                            -'
        s[i]= ' ';
                \0
        reverse(s);
        return (0);
}

reverse(s) /*inverte la stringa s sul posto */
char s[];
{
        int c, i, j ;
        for (i = 0, j = strlen(s)-1, i < j; i++, j--)
        {
                  c=s[il;
                  s[i]=s[j] ;
                  s[j]=c;
        }
}
Vi prego aiutatemi...sono disperato
Free/Sbin è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2006, 19:40   #2
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16215
La soluzione sembra copiata dalla prima edizione del Kernighan&Ritchie, per cui mi pare strano che non funzioni.
Le uniche cose che mi danno da pensare sembrano tutte errori di battitura:
- alla riga 4, parentesi tonda aperta che dovrebbe essere graffa aperta;
- alla riga 5, "err=O" che dovrebbe essere "err=0";
- alla riga 10, quel "\0" non ha ragione di essere.

Ora esaminiamo itoa.
Anzitutto, ci si segna da una parte se il numero è negativo, e si lavora sul suo valore assoluto.
Poi, si genera la stringa che rappresenta il numero, ma scrivendo i caratteri in ordine inverso; dopodiché, se il numero era negativo, si aggiungere il carattere '-' in fondo alla riga. (Anche lì, ovviamente, c'è un errore tipografico.) Per cui, a questo punto, se n valeva 15 allora s contiene "51", mentre se n valeva -15, allora s contiene "51-".
A questo punto basta rovesciare s e il gioco è fatto.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2006, 21:44   #3
repne scasb
Bannato
 
Iscritto dal: Feb 2003
Messaggi: 947
Codice:
#include <stdio.h>

char * __itoa(char *,int,int);

void main(void)

{
	char string[(sizeof(int)<<3)+1];
	int num,base;

	printf("Inserire un numero da convertire: ");
	scanf("%19d",&num);
	printf("Inserire la base decimale da utilizzare: ");
	scanf("%2d",&base);

	if(__itoa(string,num,base));
		printf("%s\n",string);
}


char * __itoa(string,num,base)
char *string;
int num,base;

{
	char tmp_buf[sizeof(int)<<3];
	int ex,pos=sizeof(tmp_buf)-1;
	char *tmp_string=string;

	if((base>36)||(base<2))
		return(0);

	if(num<0)
	{
		*string++='-';
		num=-num;
	}

	do
	{
		ex=num%base;
		num/=base;
		*(tmp_buf+pos--)=ex<10?ex+'0':ex+'A'-10;

	} while (num);

	while (++pos!=(sizeof(int)<<3))
		*string++=*(tmp_buf+pos);

	*string=0x00;

	return(tmp_string);
}
repne scasb è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2006, 23:06   #4
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
è "pericoloso" scrivere cose come
Codice:
*string++
perché lo standard non definisce l'ordine di valutazione degli operatori unari
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 03-07-2006, 08:41   #5
Free/Sbin
Member
 
Iscritto dal: Jul 2006
Messaggi: 38
Quote:
Originariamente inviato da Ziosilvio
La soluzione sembra copiata dalla prima edizione del Kernighan&Ritchie, per cui mi pare strano che non funzioni.
Le uniche cose che mi danno da pensare sembrano tutte errori di battitura:
- alla riga 4, parentesi tonda aperta che dovrebbe essere graffa aperta;
- alla riga 5, "err=O" che dovrebbe essere "err=0";
- alla riga 10, quel "\0" non ha ragione di essere.

Ora esaminiamo itoa.
Anzitutto, ci si segna da una parte se il numero è negativo, e si lavora sul suo valore assoluto.
Poi, si genera la stringa che rappresenta il numero, ma scrivendo i caratteri in ordine inverso; dopodiché, se il numero era negativo, si aggiungere il carattere '-' in fondo alla riga. (Anche lì, ovviamente, c'è un errore tipografico.) Per cui, a questo punto, se n valeva 15 allora s contiene "51", mentre se n valeva -15, allora s contiene "51-".
A questo punto basta rovesciare s e il gioco è fatto.
Grazie...si effettivamente avevo fatto il copia e incolla fidandomi che la battitura della soluzione non contenesse errori di quel tipo...ora vedo di capire a fondo come funziona itoa()

Domanda stupidissima...ma itoa() in pratica prende un numero e lo mette in una stringa di char?
cioè se gli dò in input il numero intero 345 il 3 lo mette nella prima locazione dell'array, il 4 nella seconda, il 5 nella terza e lo \0 nella quarta? ho capito bene?
Free/Sbin è offline   Rispondi citando il messaggio o parte di esso
Old 03-07-2006, 08:49   #6
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da Free/Sbin
Domanda stupidissima...ma itoa() in pratica prende un numero e lo mette in una stringa di char?
cioè se gli dò in input il numero intero 345 il 3 lo mette nella prima locazione dell'array, il 4 nella seconda, il 5 nella terza e lo \0 nella quarta? ho capito bene?
esatto
itoa sta per Integer TO Array
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 03-07-2006, 09:35   #7
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da trallallero
Integer TO Array
Integer TO ASCII
__________________
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 03-07-2006, 10:09   #8
dnarod
Senior Member
 
L'Avatar di dnarod
 
Iscritto dal: Nov 2002
Messaggi: 4329
integer to alphanumeric?
__________________
|18k+|slk800|a7n8x|1Gb/ddr400|Gf4mx440|Pio108|WD 160Gb|Case|Uni|Album|AnimeClick|OneManga|
|ClassicThrash!|BNR Metal|TrueMetal|Dime|Chuck|
dnarod è offline   Rispondi citando il messaggio o parte di esso
Old 03-07-2006, 10:11   #9
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da andbin
Integer TO ASCII
é 6 anni che pensavo fosse Array

__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 03-07-2006, 10:41   #10
Free/Sbin
Member
 
Iscritto dal: Jul 2006
Messaggi: 38
scusate probabilmente sono stupido io ma non mi entra bene nella testa come itoa fà quello che fà...per favore ditemi se i passaggi che ho capito sono corretti e aiutatemi con quelli che non m'entrano...

in pratica:

Codice:
/* Riceve l'intero da convertire e  il puntatore alla stringa dove mettere la conversione e non ritorna alcun valore */
void itoa(int n, char *s)   

{

  int i, sign;



  if ((sign = n)<0)
   //imposta la variabile sign con il valore di n e se il numero è negativo
    n = -n;             // allora metti in n il suo modulo

  i = 0;

  do {

    s[i++] = n%10 + '0';//in s[0], s[1],etcetc metti... (che ci mette esattamente)? perchè+0? 

  } while ((n /= 10) > 0);  //finchè n!?!?! che condizione è (n /=10)>0 ?!?!?1   

  if (sign<0)    //se sign <0 ma non lo aveva già fatto questo controllo? o questo è alla fine? perchè lo rifà?

    s[i++] = '-';   //metti - alla fine (ma il carattere - serve ad indicare nella stringa che il numero è negativo?

  s[i] = '\0';    // metti il carattere di fine stringa

  reverse(s);  // inverti la stringa

}
Temo di aver fatto parecchia confusione...potete aiutarmi un po'?

Grazie
Free/Sbin è offline   Rispondi citando il messaggio o parte di esso
Old 03-07-2006, 11:29   #11
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da Free/Sbin
// in s[0], s[1],etcetc metti... (che ci mette esattamente)? perchè+0?
ci mette n%10 + '0' che significa il resto della divisione tra n e 10 + '0'
+ '0' provo a spiegarlo:

immagina di voler inserire in una stringa un '1'
Puoi scrivere s[0] = '1' ma anche s[0] = 1 + '0'
perché '0' e '1' sono contigui nella tabella ascii
quindi per comoditá parti da '0' e gli sommi i numeri
che ti arrivano.
Ovviamente do per scontato che tu sappia che '0' e 0 sono diversi
cosí come 1 e '1'. In pratica '1' + 1 = '2' perché sommi
1 al carattere '1'.
In ascii '1' é 49 quindi 49 + 1 = 50 e guarda caso 50 in
ascii corrisponde a '2'

Quote:
Originariamente inviato da Free/Sbin
//finchè n!?!?! che condizione è (n /=10)>0 ?!?!?1
corrisonde a:
n = n / 10
n > 0 ?

Quote:
Originariamente inviato da Free/Sbin
// se sign <0 ma non lo aveva già fatto questo controllo? o questo è alla fine? perchè lo rifà?
prima ha reso positivo il numero per poterlo convertire (memorizzando in sign il segno)
adesso controlla sign per sapere se deve mettere il carattere '-' nella stringa

comunque bravo! cosí si chiede aiuto
commentando quello che si é fatto (o tentato) e i dubbi.
Ciao
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 03-07-2006, 11:39   #12
Free/Sbin
Member
 
Iscritto dal: Jul 2006
Messaggi: 38
Quote:
Originariamente inviato da trallallero
ci mette n%10 + '0' che significa il resto della divisione tra n e 10 + '0'
+ '0' provo a spiegarlo:

immagina di voler inserire in una stringa un '1'
Puoi scrivere s[0] = '1' ma anche s[0] = 1 + '0'
perché '0' e '1' sono contigui nella tabella ascii
quindi per comoditá parti da '0' e gli sommi i numeri
che ti arrivano.
Ovviamente do per scontato che tu sappia che '0' e 0 sono diversi
cosí come 1 e '1'. In pratica '1' + 1 = '2' perché sommi
1 al carattere '1'.
In ascii '1' é 49 quindi 49 + 1 = 50 e guarda caso 50 in
ascii corrisponde a '2'


corrisonde a:
n = n / 10
n > 0 ?


prima ha reso positivo il numero per poterlo convertire (memorizzando in sign il segno)
adesso controlla sign per sapere se deve mettere il carattere '-' nella stringa

comunque bravo! cosí si chiede aiuto
commentando quello che si é fatto (o tentato) e i dubbi.
Ciao
ohh grazie mi hai veramente aiutato moltissimo...ora è tutto più chiaro anche se dovrò rivedermelo più volte prima di farmelo entrare nella testa...si ho abbastanza chiara la storia della tavola ASCII....ora che mi ci hai fatto pensare i ricordi di inizio corso riaffiorano :-P

Cmq quello di commentare riga per riga il codice e chiedere dovew non è chiaro è l'unico modo per capirci qualcosa...cioè se non mi commento anche le banalità le cose non mi entrano in testa...

Scusate se in questo periodo sono stressante ma tra una settimana esatta esame
Free/Sbin è offline   Rispondi citando il messaggio o parte di esso
Old 03-07-2006, 20:34   #13
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da andbin
Integer TO ASCII
veramente che io sappia è Integer TO ANSI...
71104 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Panasonic, 30 anni di Toughbook: la "Bibbia" di mille regole dietro i nuovi G3 e 34 Panasonic, 30 anni di Toughbook: la "Bibbia...
realme C100x, lo smartphone economico con la batteria da 7500 mAh. La recensione realme C100x, lo smartphone economico con la bat...
Star Wars Zero Company è l'erede di XCOM 2 Star Wars Zero Company è l'erede di XCOM ...
Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia) Test ride Can-Am Origin: la moto elettrica che f...
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco Logitech G325, G305 e G316 X: il tris per chi no...
Un utente Reddit perde un banco di DDR4 ...
TV Amazon Ember da 32, 40, 43 e 50'' in ...
Pixel 11a trapela in anticipo: design qu...
ECOVACS, sconti fino a 300€ su robot asp...
Modern Warfare 4, tutti i dettagli tecni...
Il Big Mac costa in base al quartiere: M...
Il riconoscimento facciale IA fa cilecca...
XBOX, la funzione disc-to-digital arriva...
Più unico che raro: mini PC con 3...
Cybersecurity proattiva: viaggio nel SOC...
I dispositivi Amazon più scontati: Fire ...
Nuvacore, dagli ex di Nuvia arriva un'id...
Microsoft porta i container Linux in Win...
Sonos Beam Ultra e Ace Ultra arrivano ne...
Cina, record mondiale per uno sciame di ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 10:48.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v