Domande (e risposte) sull' HomeWork3aa0203



Sarebbe bene ritardare la consegna

Scusi prof:sono le 19.30 di lunedì e ancora non c'è il testo completo dell'esercizio 3.Calcolando che praticamente ormai abbiamo 4 giorni per prepararlo,e calcolando anche che noi del canale A-D venerdì 8 stiamo tutto il giorno all'università dalla mattina alla sera(mattina lezione e poi esonero di calcolo differenziale fino a pomeriggio tardo),non si potrebbe allungare la data di consegna a sabato 9 alle 24?Grazie,arrivederci.

-- Comment added by DavidCordella on 04 Nov 2002

[... ho rimosso un po' di commenti tutti sullo stesso tono]

Mi pare giusto. La consegna sarà ritardata alle ore 24 di domenica 10.

-- Comment added by AndreaSterbini on 04 Nov 2002


Uso di istruzioni non ancora spiegate a lezione:

è possibile usare puntatori e liste?

-- Comment added by AndreaPrincipi on 04 Nov 2002

Come preferisci (ma così non fai pratica di matrici)

-- AndreaSterbini - 05 Nov 2002


Pulizia matrice

in c esiste un modo più veloce per inizializzare una matrice o un vettore a 0 del dover scorrere le N*10 celle?

-- Comment added by LauraRavagli on 05 Nov 2002

Esiste la funzione memset(ptr_mem,value, size), che imposta una certa quantita' di bytes nella zone di memoria indicata dal puntatore parametro al valore inserito. Quindi x la tua matrice puoi usare, memset( matr, 0, sizeof(matr) );

-- Comment added by AlessandroCamillo on 05 Nov 2002


grazie 1000, la libreria è string giusto?

-- Comment added by LauraRavagli on 05 Nov 2002


Su memset

no... mi va in errore di access violation... mi sa che c'è qualcosa che non va...

ho verificato che per un VETTORE se uso memset( matr, 0, sizeof(matr)) tutto ok se uso memset( matr, 1, sizeof(matr)) e subito dopo provo a stampare gli elementi mi stampa 1o volte 16843009 e dopo ovviamente mi va in errore. qualche idea?dove sbaglio?

-- Comment added by LauraRavagli on 05 Nov 2002


Pulizia matrice

Ti consiglio di lasciare perdere l'uso di memset che puo' creare problemi e andare su una cosa piu' sicura del tipo... NomeArray[n]={valore che uno vuole}; Vale anche per arry multidimenzionali Ciao

-- Comment added by LeonardoParisi on 05 Nov 2002


Su memset

Questo perche in C, il nome dell'array e' sinonimo dell'indirizzo del primo elemento cio' vale l'euguaglianza v == &v[0], per le matrici e' diverso...prova memset( &matr, 0, sizeof(matr)). Per quando riguarda il valore che ci vuoi mettere dentro, la memset e' comoda solo x un'impostazione a 0.Considera una matr di int. Allora un int e' 4 bytes ad esempio, ok?. la memset(&matr,1, sizeof(matr)) inserira nei prima quattro byte, 0x01, 0x01, 0x01, 0x01, che diventeranno l'integer 0x01010101..fatti due conti e' vedi che e' 16843009 decimale. Chiaro?

-- Comment added by AlessandroCamillo on 05 Nov 2002


il problema me lo dava con un VETTORE che inizializzavo a 1... con la matrice non mi da problemi perchè inizializzo a 0. cmq la cosa non mi è ancora molto chiara...

questa è l'implementazione della memset:

void * memset(void * s,char c,size_t count)
{
   char *xs = (char *) s;
   while (count--)
      *xs---++ = c;
   return s;
}

a me quel char non mi sconfinfera tanto..

-- LauraRavagli on 05 Nov 2002


SPIEGAZIONI INSUFFICIENTI

Gentile prof.Sterbini, leggendo e rileggendo il duo ragionamento mi sono posto un paio di domande 1) se l'input è:
530
84
10
12
1
14
86
300
531
200
32
31
45
25
4
0
5
8
7
6
l'output deve essere:
0
1
4
5
6
7
8
10
12
14
25
31

32
45
84
86
200
300
530
531
oppure:

0
1
4
5
6
7
8
10
12
14
25
31
32
45
84
86
200
300
530
531
4
con il 4 finale per indicare il numero di passate.

2)lo zero ci deve essere in questa lista di numeri?

-- Comment added by CristianoMarra on 05 Nov 2002


l'output è il 2° perchè alla 57° riga devi inserire il numero di cicli. inoltre credo che lo 0 sia un valore accettabile xchè il prof ha escluso solo i negativi

-- Comment added by LauraRavagli on 05 Nov 2002

Esatto

-- AndreaSterbini - 05 Nov 2002


CHE TIPI DI INTERI ?

gli interi possono essere anche migliaia oltre che decine e centinaia? naturalmente è escluso l'uso dei milioni dato che quelli sono dei long, o tocca usare pure quelli?

-- Comment added by CristianoMarra on 05 Nov 2002

Ho inserito una limitazione nelle dimensioni degli interi (che saranno tra 0 e 10^9).

-- AndreaSterbini - 05 Nov 2002


grazie laura, però sul fatto dello zero sono insicuro dato che matematicamente parlando lo zero non è ne negativo ne positivo

-- Comment added by CristianoMarra on 05 Nov 2002


credo che se lo zero non andava bene lo avrebbe detto esplicitamente. cmq aspettiamo lui.. LauraRavagli

quando parla di interi credo che si riferisca al tipo di dato e non all'insieme infinito degli interi! l'intero unsigned arriva come minimo fino a 65535 (poi dipende dalla macchina) mentre l'intero signed (sempre come minimo)da -32768 a 32767.

-- Comment added by LauraRavagli on 05 Nov 2002

Lo zero è non negativo, quindi ci può essere.

-- AndreaSterbini - 05 Nov 2002


Su memset

Provo a farti un esempio: un byte può assumere valori da 0...255, in esadecimale 0xFF. Un intero in c viene rappresentato da 4 byte, quindi il numero 10 corrisponde a 0x0000000a. Nel momento in cui fai un assegnazione di questo tipo: mset(matr,0,sizeof(matr)); inizializzi tutti i byte degli elementi della matrice a 0 (in esa 0x00), cioè cosi: matr[0][0]=0x00-0x00-0x00-0x00; matr[0][1]=0x00000000; fino a matr[10][40]. se usi memset in questo modo: memset(matr,1,sizeof(matr)); inizializzi tutti i byte degli elementi della matrice a 1 ( in esa 0x01) quidi: matr[0][0]=0x01010101; matr[0][1]=0x01010101; fino a matr[10][40]. Quando usi printf con il flag %d (esempio: printf("%d\n",matr[0][1]); stampi il valore esadecimale converito in decimale che nel primo caso è 0 0x00000000(esadecimale) == 0(decimale) nel secondo caso è 16843009 0x01010101(esadecimale) == 16843009 (decimale)

Spero di non aver complicato le cose e di non aver detto cavolate.

p.s. ascolta il consiglio di alessandro.

-- Comment added by SalvatoreFerrucci on 05 Nov 2002


grazie x la sfacchinata ma su questa cosa ci sbattero la testa fino alla morte wink cmq ho capito che memset x interi va bene solo per 0. xò continuerò a pensarci su... (addio studio di logica ... gr...)

-- Comment added by LauraRavagli on 05 Nov 2002


Recupero cifre

C'è un modo veloce per recuperare ciascuna cifra(potenza di 10) dei numeri a partire dalle unità???

-- Comment added by AndreaArtibani on 05 Nov 2002


ancora sugli interi

per evitare altre 'sclerate': poichè il massimo valore(32767) di int è < 10^9 dobbiamo usare un tipo di dati '---+ largo' oppure va bene comunque int xchè sulla macchina su cui vengono effettuati i test int = long int ? (la pazienza è la virtù dei forti)

-- Comment added by LauraRavagli on 05 Nov 2002


Ciao Laura, puoi trovare nel file limits.h i valori minimi/massimi per i vari tipi di dati:

[supergate@mordor homework3]$ cat limits.c
#include <stdio.h>
#include <limits.h>
main(){printf("%d\n",INT_MAX);}
[supergate@mordor homework3]$ ./limits
2147483647
[supergate@mordor homework3]$ 

la dimensione della variabile integer dipende dal compilatore utilizzato: con gcc e visual c---++ viene considerata a 32bit... il limite quindi e' 2147483647 ossia poco piu' del doppio di 10^9

-- Comment added by MauroFerrara on 05 Nov 2002


Bravi ragazzi che mi avete trovato il numero massimo rappresentabile nel sistema, mi ricordavo maxint ma ora che ci penso si tratta di una variabile di sistema del Pascal.

Il numero massimo che verrà fornito al vostro programma sarà sicuramente rappresentabile in un int.

In poche parole, usate INT_MAX come limite superiore.

(chi ha mai detto che un int al massimo ha valore 32767? questo è vero solo se int è rappresentato con 16 bits)

-- Comment added by AndreaSterbini on 05 Nov 2002


giusto, mi ero spiegata male smile

LauraRavagli on 06 Nov 2002


Se possibile ci sentiamo da Boston.

-- Comment added by AndreaSterbini on 05 Nov 2002


SISTEMARE I VALORI PRENDENDO IN CONSIDERAZIONE SOLO LE UNITA'

Come faccio a prendere in considerazione solo le unità (o le decine o le centinaia) del numero inserito in input?

-- Comment added by AlessandraRizzuti on 05 Nov 2002

Pensaci ... prova a farlo con la calcolatrice.

-- Comment added by AndreaSterbini on 06 Nov 2002


Uhm...

Mi è leggermente oscuro tutta la parte del "Come funziona" nella spiegazione dell'esercizio 3. In pratica devo dichiarare una o due matrici di 10 righe ed N colonne, poi devi inserire da output 50 numeri e far si che la matrice venga letta 3 volte: la prima volta inserisco i numeri e li ordina nelle varie righe e colonne in corrispondenza della loro cifra delle unità, la seconda volta le piazza in tabella in corrispondenza della loro cifra delle decine e la terza volta le ordina tutte nella sola riga 0. Giusto o qualcosa di sbagliato? Che centra la potenza di 10 in tutto ciò? smile

Se mi illuminate vi regalo la maglietta di Della Spigola con firma originale UAHuaHUAhU smile

-- Comment added by DavidVulpetti on 06 Nov 2002


la matrice non deve essere letta 3 volte(sempre):

se sono inseriti numeri < 10 basta 2: la prima volta ordina per le unita e poi per le centinaia (che è 0) se sono inseriti numeri < 100 basta 3,<1000 4 etc etc fino a 10 elevato a 9


Ci ho provato e non ho risolto niente... come faccio? Aiuto!!!!!

-- Comment added by AlessandraRizzuti on 06 Nov 2002


DEVO USARE I BOOLEAN????

L'algoritmo backet sort finisce quando TUTTI gli elementi sono minori della potenza di dieci in considerazione... ok questo e' ovvio... La mia idea e' di utilizzare un ciclo con dentro un controllo e settare una variabile boolean a 'true' se tutti gli elementi sono minori della potenza presa in considerazione...Pero' i boolean ancora non sono stati accennati dal prof, quindi che diavolo devo fare???

-- Comment added by DavideSammartino on 06 Nov 2002

... hai il mio permesso di usare quello che vuoi ... sapere il C vuol dire sapere ben piu' di quello che possiamo farvi a lezione ...

-- AndreaSterbini - 7 Nov 2002


scusa, ma una variabile boolean te la puoi creare con qualsiasi tipo di dati: int varbool (vero = 1, falso = 0), char varbool (vero = 'X' falso = ' ')...

-- Comment added by LauraRavagli on 06 Nov 2002


Cmq il ragionamento che ho fatto e' giusto sull'utilizzare un controllo del genere vero?

-- Comment added by DavideSammartino on 06 Nov 2002


non lo so, la mia idea è che tutto è lecito se arrivi al fine, poi però esiste il codice scritto bene e quello scritto male,---+ o - funzionale. quindi la cosa potrebbe pure andare ma appunto non so quanto sia funzionale e in fin dei conti il corso serve soprattutto x imparare a programmare bene (almeno da quello che ha detto il prof il 1° giorno di lezione) wink sicuramente se ci pensi non serve fare il ciclo che dici---+ volte (sempre se ho capito quello che intendi fare).(quello che dico va preso sempre con il beneficio del dubbio)

-- Comment added by LauraRavagli on 06 Nov 2002


Esempio sbagliato

Laura, l'esempio che proponi char varbool (vero = 'X' falso = ' ') e' sbagliato. Bisogna tener presente che:

- char e' un tipo di intero, e nonostante il nome puo' essere usato per tutte le operazioni matematiche su interi

- una variabile intera laddove viene richiesta una espressione logica e' considerata falsa se il suo valore e' zero, e vera in ogni altro caso

- assegnare alla variabile varbool di tipo char il carattere spazio ' ' corrisponde, come per ogni altro carattere ascii, assegnarle il corrispondente valore numerico ascii, che nel caso dello spazio appunto e' 32 (se fra gli apici non ci fosse uno spazio, l'assegnazione sarebbe semplicemente sbagliata)

- essendo 32 diverso da zero, una variabile char a cui sia stato assegnato il carattere spazio ha valore logico vero.

Se ti interessa un esempio di una variabile char usata come intero, puoi dare un'occhiata alle mie soluzioni degli esercizi, nella mia homepage.

-- Comment added by ArcangeloTripi on 06 Nov 2002

Arcangelo, vedi di non postare le tue soluzioni prima che lo faccia io ... va bene aiutare, ma cosi' istighi alla copia!

-- AndreaSterbini - 7 Nov 2002


quello che intendevo io è che non c'è necessariamente bisogno di una variabile booleana (che poi il tipo boolean non so nemmeno se esiste in c) ma si può usare anche int o char, ossia una cosa del genere:

{
int varbool = 0;
if (numero > 100 )
{varbool = 1}
istruz
istruz
if {varbool == 1} {continua il ciclo con una potenza di 10 maggiore a 2 }
}

stessa cosa per la char. ed è ovvio che se uso char non posso fare un if del genere if (varchar)

se il mio ragionamento è ancora sbagliato, fammi sapere

-- Comment added by LauraRavagli on 06 Nov 2002


Visto che me lo chiedi, faccio un po' di commenti:

- ho detto che l'esempio specifico che facevi era sbagliato, non che e' sbagliato in generale l'uso di variabili intere per memorizzare valori logici. In realta' in c tipicamente si usano proprio le variabili intere per memorizzare i valori logici, con le convenzioni che ti ho detto e che sono state piu' volte ripetute a lezione.

- lasciando da parte il discorso di correttezza sintattica, dal punto di vista dello stile in c si tende ad usare le espressioni logiche dove servono, piuttosto che a memorizzare dei valori logici in delle variabili.

- per pura curiosita', nello standard ANSI99 e' stato effettivamente introdotto il tipo booleano, oltretutto con delle precauzioni per non farlo "collidere" con le implementazioni personalizzate gia' esistenti nei software realizzati finora. Noi pero', come e' stato spiegato chiaramente, dobbiamo riferirci allo standard ANSI originale, applicato in modo "pedante", dove tale tipo non esisteva. Conclusione: per noi il tipo booleano non esiste!

- nel tuo nuovo esempio, se usi varbool per memorizzare un valore logico con l'istruzione varbool = 1 (significa che varbool ha il valore logico "vero"), quando poi lo devi utilizzare e' del tutto inutile che lo contronti con 1, e' varbool stesso che ha il valore "vero". Quindi, dove e' richiesto un valore logico (come nella condizione di un if) invece di scrivere

if (varbool == 1) ....

puoi, anzi devi scrivere

if (varbool) ....

dico devi perche' nel tuo caso il test avrebbe successo solo se il valore di varbool fosse effettivamente 1, mentre come e' stato piu' volte detto il suo valore logico e' vero in ogni caso in cui e' diverso da zero. Oltretutto questa convenzione risulta spesso molto comoda, e ne puoi vedere un esempio guardando il mio esercizio homework2.c (giuro che non ci guadagno niente sul numero di volte che viene visto smile )

- perche' dici che non puoi usare una sintassi del tipo (varchar) ? E' una sintassi del tutto leggittima, e spesso molto comoda. Mi permetto di darti un piccolo consiglio: prima di fare una affermazione di cosa e' possibile o non e' possibile fare col c, scrivi un semplicissimo programmino di prova, se proprio non vuoi metterti ad esaminare manuali e libroni (che sarebbe comunque la cosa piu' corretta da fare). Col c si possono fare piu' cose di quante normalmente si riesca ad immaginare.

E se proprio voglio terminare facendo il grillo saggio, che ne diresti di una bella lettura approfondita del K&R (preferibilmente in inglese)? Io l'ho gia' fatto due volte, e non smetto di imparare cose nuove.

ArcangeloTripi


poichè di c ne so poco vorrei provare prima col deitel sempre che riesca a trovarlo. cmq sono d'accordo con quello che dici. so pure che si può usare (!) su un char proprio come usi tu sul codice. avevo fatto un bel commento ma chissa dov'è finito). cmq la domanda era semplice:posso usare i boolean? e la mia risposta voleva essere altrettanto semplice: usa un altro tipo di dato e assegna un valore che per te è vero ed un valore che per te falso. tu giustamente fai notare che già c ha i suoi valori di verità (0=falso, tutto il resto vero). ok, siamo d'accordo.

Pinocchio

LauraRavagli


PENSO CI SIA UN ERRORE NELLE SPECIFICHE DELL'ESERCIZIO

Il Prof nell'esercizio ha spiegato che il numero massimo immesso sarà INT_MAX,che dice valere 2147483647.Ma sul nostro libro di testo,a pagina 539-540,si spiega che INT_MAX vale---+32767. E'invece la costante simbolica LONG_MAX che vale 2147483647,e che costringera quindi a dichiarare non un normale int, ma un long int.Ora il problema è:dobbiamo usare un normale int nelle dichiarazioni(e quindi restringere il nostro "campo d'azione" ai primi 32767 numeri),o usare un long int(ampliando i numeri a 2147483647)?Chi lo sa risponda il prima possibile!

-- Comment added by DavidCordella on 06 Nov 2002

INT_MAX indica l'intero massimo ... non vi fissate su quale valore ha e usate la costante.

Io usero' dati compresi tra 0 e INT_MAX

-- AndreaSterbini - 7 Nov 2002


Nessun errore

Se leggi con attenzione il commento iniziale a limits.h a pag. 539, c'e' scritto che i limiti dell'implementazione devono essere maggiori o uguali a quelli elencati nella pagina non che devono essere uguali. In questo caso sono maggiori

Comunque, in realta' il problema non esiste, perche' il gcc che usiamo assegna 4 bytes sia al tipo int che al tipo long, pertanto nel nostro caso puoi dichiarare del tutto indifferentemente le variabili long o int. Visto che non si paga niente, io le ho dichiarate long.

In ogni caso, non riesco a capire quale problema ti causava di dichiarare le variabili long smile

-- Comment added by ArcangeloTripi on 06 Nov 2002


Risposta ad Arcangelo

Siccome non sapevo come gestisse il gcc il tipo long e int,volevo essere preciso nell'assegnare i valori necessari.Il problema è che pensavo che se avessi inserito define Int_max avrei dovuto considerare da 0 a 32767 e non da 0 a 2147483647.Comunque la spiegazione che giustamente citi dal libro non è molto chiara:se indica che per int_max si intende il VALORE MASSIMO per un oggetto del tipo int,in italiano non ha senso dire prima che i limiti dell'implementazione devono essere maggiori o uguali a quelli elencati.Infatti se si da un tetto massimo,vuol dire che NON lo si può superare.Cmq thanks! smile

-- Comment added by DavidCordella on 06 Nov 2002

Non definire tu INT_MAX, ma usa #include <limits.h>

-- AndreaSterbini - 7 Nov 2002


Giustamente se si mette un tetto massimo questo non si puo' superare. Il discorso e' che il tetto massimo varia da una implementazione all'altra. Mi spiego. Se implemento l'ANSI c su di un processore che tratta in hardware i numeri interi da 32 bit, e' abbastanza logico implementare gli int a 4 byte, mentre sarebbe poco conveniente implementarli a 8 byte, perche' dovrei effettuare delle operazioni in software. Invece, su di un processore che tratta in hardware gli interi a 64 bit puo' essere naturale implementarli ad 8 byte.

Quando implemento un compilatore su di un particolare processore devo fare quindi una scelta sul limite massimo degli int, dei long, dei float etc. etc. tenendo conto anche dell'hardware. Quello che dice il libro e' che quando si effettua questa scelta dei valori massimi, che vale per quel particolare compilatore e per quel particolare hardware, non posso comunque scendere al di sotto di certi limiti. Se voglio implementare un compilatore ansi su di un processore ad 8 bit (pessima idea), anche se mi farebbe comodo limitare i long a 2 byte, non lo posso fare, se voglio rispettare lo standard ansi. Questo e' il significato di quei numeri, il limite minimo dei valori massimi di ogni tipo se voglio rispettare lo standard ansi (ripeto, per una specifica implementazione dello standard). Cio' non toglie che, se l'hardware lo permette, posso anche fissare dei limiti piu' alti. Ci si puo' ragionevolmente aspettare che questi limiti possano essere diversi per un compilatore gcc che gira su pentium o per un compilatore gcc che gira su alpha (ammesso che continuino a produrli) o per uno che gira su Itanium.

Inutile dire che queste possibili differenze da una implementazione all'altra *possono* causare problemi di portabilita', e se si scrive del codice che deve essere portabile e che in qualche modo puo' dipendere da questi limiti, dovrebbe tra le prime cose andare proprio a controllare i valori definiti in limits.h, e comportarsi di conseguenza.

Comunque, non ti offendere smile . Nel momento in cui si affrontano certi argomenti, e' anche giusto accettare il confronto che ne segue wink .

ArcangeloTripi


Non mi ero per nulla offeso!la mia osservazione "critica" era nei confronti del libro che secondo me,per un principiante che inizia da zero con la programmazione,è poco chiaro in quele due pagine dove spiega Int_Max etc.La tua risposta è stata invece esauriente e mi ha tolto un dubbio che avevo!Tutto qua!La critica era a com'era spiegato il fatto sul libro,non certo a te!Bye! smile wink .

DavidCordella


Cerco Arcangelo

Arcangelo mandami una email.... ti prego.. mi fai morire dalle risate...e tra l'altro di devo chiedere doce hai preso la storiella che sta sulla tua homepage

-- Comment added by LeonardoParisi on 06 Nov 2002


No personal e-mail, thanks.

Comunque, spero di non farti ridere per i miei commenti tecnici stick out tongue

ArcangeloTripi


inizializzare una matrice

Ho provato ad inizializzare la matrice ad un numero, ad es -1 per es. se faccio int M[10][50]={-1}; mi viene inizializzato solo il primo valore della matrice a -1 e tutto il resto a 0.

Perchè? Come si inizializza un'intera matrice ad un unico numero?

-- Comment added by ClaudiaAgostinelli on 06 Nov 2002

Per inizializzare una matrice o un qualsiasi vettore, troppo grande da poter fare a mano, il metodo, è di fare un ciclo for che verrà eseguito tante volte, quant'è il prodotto delle righe per le colonne della matrice. In poche parole, dovrai mettere "n" for uno dentro l'altro che gestiscano gli "n" indici dela matrice.

-- AndreaBandino on 07 Nov 2002


OSSERVAZIONE: GIUSTA O SBAGLIATA?

Professore, ho notato che prima dell'ultima 'passata', se leggiamo i valori da sinistra verso destra, dall'alto verso il basso, sono gia' ordinati! Quindi io mi ritrovo nel vettore i valori ordinati prima dell'ultima passata. Questo succede solamente a chi usa un vettore e una matrice, o anche a chi usa due matrici? Lo si puo' vedere anche nel suo esempio, nella passata n°2. Se cosi' fosse, una 'passata' e' risparmiata giusto?

-- Comment added by DavideSammartino on 06 Nov 2002


anch'io ho notato questa cosa usando vettore e matrice e mi sono detta mi risparmio una passata. poi ho cambiato il codice per renderlo uguale all'esempio wink

-- Comment added by LauraRavagli on 07 Nov 2002


Sbagliato!

Nel momento in cui hai letto i valori, hai fatto una passata. L'hai fatta coi tuoi occhi e col tuo cervello, ma hai fatto una passata. E anche il calcolatore, poveraccio, come fa a sapere se i valori sono ordinati se non li legge? Dopo che li ha letti puo' controllare che finiscono tutti nella prima riga e concludere che l'algoritmo e' terminato, non prima.

-- Comment added by ArcangeloTripi on 07 Nov 2002


nel momento in cui stanno nel vettore e sono tutti < 100 nell'esempio la 2° passata sono già ordinati. e glielo dici tu che sono ordinati perchè appunto sono minori di cento. ho aumentato il ciclo di una passata portando tutti nella riga 0 perchè mi sembrava---+ logico nell'ottica dell'algoritmo.

-- Comment added by LauraRavagli on 07 Nov 2002


Inizializzare una matrice

Nel tuo caso puoi anche fare: memset(matrice,-1,sizeof(matrice)); Non dimenticare di usare la libreria string.h

-- Comment added by SalvatoreFerrucci on 07 Nov 2002


scusa, ma non abbiamo detto che la memset va bene solo per 0? o non ho capito?

-- Comment added by LauraRavagli on 07 Nov 2002


Chi ha mai detto questo.

-- Comment added by SalvatoreFerrucci on 07 Nov 2002


ghost@mocciosa% cat memset.c 
#include <stdio.h>
#include <string.h>

main()
{
        int i[1];
        memset(i,-1,sizeof(i));
        printf("%x\n",i[0]);
        printf("%d\n",i[0]);

}
ghost@mocciosa% gcc memset.c 
ghost@mocciosa% ./a.out
ffffffff
-1
ghost@mocciosa%

-- Comment added by SalvatoreFerrucci on 07 Nov 2002


sopra nessuno mi ha contrariato... effettivamente con -1 funziona. io mi aspettavo un output diciamo imprevedibile (e sottolineo diciamo) come per 1.

-- Comment added by LauraRavagli on 07 Nov 2002


ma per uno non è imprevedibile... frown se setti i byte di un int a 1 non hai un numero a caso ma 0x01010101 cioè 16843009 se setti i byte a -1 avrai 0xffffffff cioè -1.

-- Comment added by SalvatoreFerrucci on 07 Nov 2002


appunto ho detto sottolineo diciamo smile comunque credo (spero) di aver capito. ti ringrazio.

-- Comment added by LauraRavagli on 07 Nov 2002

Come vedete la memset vale anche per -1 dato che setta dei byte e che l'intero -1=FFFFFFFF ovvero 4 bytes tutti col valore FF=-1

-- AndreaSterbini - 7 Nov 2002


Soluzioni inserite (risposta a Sterbini)

Ho inserito la soluzione del secondo esercizio perche' la relativa consegna e' ampiamente scaduta. Pensavo che non ci fossero problemi. Quanto al terzo esercizio il file e' ancora vuoto. Provare per credere.

-- Comment added by ArcangeloTripi on 07 Nov 2002

Bravo!

-- AndreaSterbini - 8 Nov 2002


Problemino

Ho un problemino; Ho fatto il programma, anche usando i long int (tanto per gradire) e pare tutto funzionare ma sorpresa sorpresa, solo se i numeri inseriti, sono inferiori a 999999 funziona; oltre questo numero, prende i 50 elementi in input, ma da errore e non stampa niente in output. Qualcuno ha un idea? Premetto: non ho inserito nessuna limitazione

-- Comment added by AndreaBandino on 07 Nov 2002

Anche se nessuno mi ha risposto in 3 giorni, ho risolto il problema e mandato l'esercizio (almeno spero). Cmq, grazie tante dell'aiuto .....

-- AndreaBandino on 10 Nov 2002


Valori di input

Ci deve essere un controllo tra i dati di input? Che cosa fare nel caso che un numero è fuori intervallo? Ripetere la lettura del valore? Oppure basta che il programma funzioni per valori da 0 a INT_MAX compresi, non controllando l'input dell'utente?

-- Comment added by AngeloFerrantini on 07 Nov 2002

Non devi fare nessun controllo e gestione di errori, almeno così sterbini ha detto e scritto sul testo, in quanto, assumiamo che tutti i valori che s'inseriranno, saranno compresi tra 0 ed int_max e non oltre.

-- AndreaBandino on 07 Nov 2002


PICCOLO SONDAGGGIO

Volevo sapere quante 'passate' vi vengono se inserite tra gli elementi da ordinare il numero 2147483647. Grazie.

-- Comment added by DavideSammartino on 08 Nov 2002


in effetti la parola 'sondagggio' e' molto corretta smile

-- Comment added by DavideSammartino on 08 Nov 2002

Immagino che la tua domanda derivi dal fatto che la potenza di due successiva non entra in un int (ne' in un long, ne' in un unsigned long ....)

-- AndreaSterbini - 8 Nov 2002


diciamo che come da indicazioni un input errato non viene gestito (...risposta giusta?...->...il prg si arrabbia un pochino... )

ora mi hai fatto venire il dubbio:all'inizio si partava di input tra 0 e 10 alla nona... ad un certo punto è diventato tra 0 e 2147483647..., allora?? ok... x non saper ne legge ne scrive, ora accettiamo tutto...

-- Comment added by LauraRavagli on 08 Nov 2002


NON CAPISCO...

Dunque professore, innanzitutto volevo sapere, perche' bisogna includere il file limits.h? visto che non dobbiamo gestire alcun controllo, a che serve il limite INTMAX? e' solo un limite per 'NOI' che inseriamo i valori, o sbaglio?

Prima di aver modificato il programma, quando inserivo 2147483647, l'algoritmo non terminava mai, questo perche' per poter inserire tale numero nella prima riga, mi andavo a calcolare una potenza di dieci maggiore dei limiti di un intero wink cioè... 10^10. E ho avuto la conferma da quanto lei ha detto. Ho effettuato le giuste modifiche e ora va tutto bene... spero smile

Ho bisogno di urgenti chiarimenti riguardo a limits.h e a IntMax, a che servono? che ci devo fare? grazie.

-- Comment added by DavideSammartino on 09 Nov 2002


RE: PICCOLO SONDAGGIO

Intro: Scusate se non modifico la pagina ma l'ultima volta che ho provato ho fatto un casino (ancora non ho capito se sono stato io o IE!) A me funziona correttamente (a quanto pare il primo test da effettuare sugli HWs è utilizzare i valori limite proposti nel testo) se nel vettore da ordinare si trova il valore INT_MAX (2147483647). Questo xchè (credo) il calcolo della potenza lo eseguo utilizzando un double visto che poi per trovare l'indice casto tutto a int. Spero di essere stato chiaro. Ciao a tutti.

-- Comment added by TizianoMorgia on 09 Nov 2002

INT_MAX (e limits.h) serve solo se vuoi inserire un limite al numero di passate per essere che termini la sua esecuzione.

In particolare i casini smile nascono quando bisogna confrontare i numeri maggiori di 10^9 con la potenza di 10 successiva, che non entra in un int, long, unsigned long.

Credo che la precisione dei double in questo caso vada bene per cui un cast nel test dovrebbe bastare.

-- AndreaSterbini - 9 Nov 2002

Risposta a Tiziano - La soluzione e' pienamente legittima, anche se non molto elegante, in quanto si affida a proprieta' dei floating point per effettuare un'operazione relativa ad interi (l'estrazione di una cifra da un intero).

Pero', ripeto, e' pienamente legittima, e comunque il nostro compito principale e' scrivere dei programmi funzionanti, prima di essere eleganti (dopotutto studiamo da informatici, non da stilisti!).

-- ArcangeloTripi - 10 Nov 2002

Scusate, ma non capisco, dove stia il problema: il testo dell'esercizio, dice chiaramente che il rischio di inserire un numero superiore a 2147483647, che è poco più del doppio di 10^9, è nullo! Se ci preoccupassimo di questo, dovremmo anche andare ad inserire i controlli per gli errori, ed un minimo di grafica o ordine stilistico nel programma in esecuzione. Ma tutto ciò non è richiesto ....

-- AndreaBandino - 10 Nov 2002

Se inserisci il numero 2147483647 come fai a controllare se e' minore della potenza di 10 successiva, se essa non entra ne' in un int ne' in unsigned int ne' long ne' unsigned long? con i double!

-- AndreaSterbini - 11 Nov 2002 da Amsterdam aspettando l'aereo


elevare a potenza

esiste un comando che mi eleva un numero a potenza con un esponente variabile??? su internet ho trovato "pow" ma penso che sia un comando di c---++, grazie,

-- Comment added by RoccoPanduri on 10 Nov 2002


Si esiste ed e' proprio pow(). No, che io sappia e' un comando del c (ANSI C), per usarlo devi includere il file math.h e linkare con la libreria matematica: gcc -o esempio esempio.c -lm Credo pero' che alla correzione essa non venga inclusa, (perche' come ci e' stato detto i parametri di link sono solo --pedantic), ti conviene quindi crearti una piccola funzione per elevare a potenza

ciau:P.

-- Comment added by MauroFerrara on 10 Nov 2002


Ho risolto grazie, (pow e' una funzione del C)!

-- Comment added by RoccoPanduri on 10 Nov 2002


HO FINITO

Yeah...ci ho messo un sacco di tempo ma credo di aver finito anche questo esercizio. Sembra funzioni per tutti i numeri compresi tra 0 e 2147483647 contando le ripetizioni. Scusatemi ma alla fine ce l'ho fatta :). Speriamo che l'algoritmo sia almeno simile a quello ottimale, ho usato solo una matrice e un vettore. (piu' un po' di variabili).

Detto questo la mia domanda e': il numero massimo di passate e' 11 giusto?

-- Comment added by EnricoDiPaolantonio on 10 Nov 2002


Enrico come hai dichiarato le variabili in cui è compreso il vettore??? risp urgente!

-- Comment added by AndreaSantoro on 10 Nov 2002


ultimi minuti

-5 -4 -3 -2 -1

-- Comment added by AlessandroInnocenti on 10 Nov 2002


cavolo..scusa Andrea

stavo studiando logica e solo ora ho letto il messaggio. frown sorry! ehm...non ho capito la domanda comunque...in che senso le variabili in cui e' compreso il vettore?

-- Comment added by EnricoDiPaolantonio on 11 Nov 2002


Re: Cavolo...scusa andrea;

se vuoi domani o dopodomani (sempre se vengo..ho un po' di febbre addosso) mi porto il sorgente come l'ho fatto io e ce lo studiamo per trovare una soluzione ottimale...secondo me il mio non e' perfetto.

-- Comment added by EnricoDiPaolantonio on 11 Nov 2002


elevare a potenza

personalmente anche io ho usato la funzione pow(). Esisteva pero' anche la possibilita' di usare *= giusto?

-- Comment added by EnricoDiPaolantonio on 11 Nov 2002


Idea Mia pro studenti

raga', io stavo pensando di mettere su una mailing list di noi studenti malati. Chi e' interessato mi mandi una e-mail su gentaro@virgilio.it che gli mando l'invito appena raggiungiamo un numero ragguardevole di persone smile

-- Comment added by EnricoDiPaolantonio on 11 Nov 2002


Rettifico:

Per iscriversi alla mailing list ho messo un apposito box in basso alla mia home-page. Se vi volete iscrivere andate...

Ps: scusi professore per aver usato indebitamente questo spazio...ma e' il forum piu' letto smile

-- Comment added by EnricoDiPaolantonio on 11 Nov 2002


BEATO TE CHE HAI FINITO!!!!

-- Comment added by CristianoMarra on 11 Nov 2002

Ho intenzione di farvi discutere su twiki i vostri programmi ed errori ... secondo me c'e' da imparare per tutti (soprattutto per me).

-- AndreaSterbini da Amsterdam


Dubbi del giorno dopo...

Ieri notte (o questa mattina visto che era l'una) mi è venuto un dubbio: e se i 50 numeri in input sono ordinati!? Qualcosa come 50 volte 1200? Quante "passate" doveva effettuare l'algoritmo??Mah! qualcosa mi sfugge (io non ho inserito nessun controllo del genere all'interno dell'algoritmo), comunque ormai quel che è fatto è fatto o, per dirla in maniera "elegante", il dado è tratto... :-)))

-- Comment added by TizianoMorgia on 11 Nov 2002


che problema c'è ? (spero nessuno!) secondo l'algoritmo verranno messi a riga 0 ,poi ancora a riga 0, poi a riga 2, poi a riga 1, poi a riga 0: 5 passate e passa la paura!

-- Comment added by LauraRavagli on 11 Nov 2002 da Roma ... (sigh frown )

No such template def TMPL:DEF{PROMPT:before}

<tre spazi>---+++<spazio>Titolo della domanda
Testo della domanda
Edit | Attach | Watch | Print version | History: r117 < r116 < r115 < r114 < r113 | Backlinks | Raw View | Raw edit | More topic actions
Topic revision: r117 - 2003-09-30 - AndreaSterbini






 
Questo sito usa cookies, usandolo ne accettate la presenza. (CookiePolicy)
Torna al Dipartimento di Informatica
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2024 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback