Tags:
tag this topic
create new tag
view all tags
---++ Domande (e risposte) sull' HomeWork3aa0203 * Vedi anche HomeWork3aa0203, SoluzioneHomework3aa0203, RisultatiHomework3aa0203. * Inserite le vostre domande usando la form [[#form][in fondo alla pagina]] ---- %TOC% ---- ---+++ 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 Users.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 Users.AndreaSterbini on 04 Nov 2002 ---- ---+++ Uso di istruzioni non ancora spiegate a lezione: è possibile usare puntatori e liste? -- Comment added by Users.AndreaPrincipi on 04 Nov 2002 Come preferisci (ma così non fai pratica di matrici) -- Users.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 Users.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 Users.AlessandroCamillo on 05 Nov 2002 ---- grazie 1000, la libreria è string giusto? -- Comment added by Users.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 Users.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 Users.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 Users.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: <verbatim> void * memset(void * s,char c,size_t count) { char *xs = (char *) s; while (count--) *xs---++ = c; return s; } </verbatim> a me quel char non mi sconfinfera tanto.. -- Users.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 è: <verbatim> 530 84 10 12 1 14 86 300 531 200 32 31 45 25 4 0 5 8 7 6 </verbatim> l'output deve essere: <verbatim> 0 1 4 5 6 7 8 10 12 14 25 31 32 45 84 86 200 300 530 531 </verbatim> oppure: <verbatim> 0 1 4 5 6 7 8 10 12 14 25 31 32 45 84 86 200 300 530 531 4 </verbatim> con il 4 finale per indicare il numero di passate. 2)lo zero ci deve essere in questa lista di numeri? -- Comment added by Users.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 Users.LauraRavagli on 05 Nov 2002 Esatto -- Users.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 Users.CristianoMarra on 05 Nov 2002 Ho inserito una limitazione nelle dimensioni degli interi (che saranno tra 0 e 10^9). -- Users.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 Users.CristianoMarra on 05 Nov 2002 ---- credo che se lo zero non andava bene lo avrebbe detto esplicitamente. cmq aspettiamo lui.. Users.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 Users.LauraRavagli on 05 Nov 2002 Lo zero è non negativo, quindi ci può essere. -- Users.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 Users.SalvatoreFerrucci on 05 Nov 2002 ---- grazie x la sfacchinata ma su questa cosa ci sbattero la testa fino alla morte ;) 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 Users.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 Users.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 Users.LauraRavagli on 05 Nov 2002 ---- Ciao Laura, puoi trovare nel file limits.h i valori minimi/massimi per i vari tipi di dati: <verbatim> [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]$ </verbatim> 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 Users.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 Users.AndreaSterbini on 05 Nov 2002 ---- giusto, mi ero spiegata male :) Users.LauraRavagli on 06 Nov 2002 ---- Se possibile ci sentiamo da Boston. -- Comment added by Users.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 Users.AlessandraRizzuti on 05 Nov 2002 Pensaci ... prova a farlo con la calcolatrice. -- Comment added by Users.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ò? :) Se mi illuminate vi regalo la maglietta di Della Spigola con firma originale UAHuaHUAhU :) -- Comment added by Users.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 Users.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 Users.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 ... -- Users.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 Users.LauraRavagli on 06 Nov 2002 ---- Cmq il ragionamento che ho fatto e' giusto sull'utilizzare un controllo del genere vero? -- Comment added by Users.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) ;) 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 Users.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 Users.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! -- Users.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: <verbatim> { int varbool = 0; if (numero > 100 ) {varbool = 1} istruz istruz if {varbool == 1} {continua il ciclo con una potenza di 10 maggiore a 2 } } </verbatim> 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 Users.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 :) ) - 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. Users.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 Users.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 Users.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 -- Users.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 :) -- Comment added by Users.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! :) -- Comment added by Users.DavidCordella on 06 Nov 2002 Non definire tu INT_MAX, ma usa ==#include <limits.h>== -- Users.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 :) . Nel momento in cui si affrontano certi argomenti, e' anche giusto accettare il confronto che ne segue ;) . Users.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! :) ;) . Users.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 Users.LeonardoParisi on 06 Nov 2002 ---- No personal e-mail, thanks. Comunque, spero di non farti ridere per i miei commenti tecnici :p Users.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 Users.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. -- Users.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 Users.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 ;) -- Comment added by Users.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 Users.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 Users.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 Users.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 Users.LauraRavagli on 07 Nov 2002 ---- Chi ha mai detto questo. -- Comment added by Users.SalvatoreFerrucci on 07 Nov 2002 ---- <verbatim> 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% </verbatim> -- Comment added by Users.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 Users.LauraRavagli on 07 Nov 2002 ---- ma per uno non è imprevedibile... :( 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 Users.SalvatoreFerrucci on 07 Nov 2002 ---- appunto ho detto sottolineo diciamo :) comunque credo (spero) di aver capito. ti ringrazio. -- Comment added by Users.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 -- Users.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 Users.ArcangeloTripi on 07 Nov 2002 Bravo! -- Users.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 Users.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 ..... -- Users.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 Users.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. -- Users.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 Users.DavideSammartino on 08 Nov 2002 ---- in effetti la parola 'sondagggio' e' molto corretta :-) -- Comment added by Users.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* ....) -- Users.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 Users.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 ;-) cioè... 10^10. E ho avuto la conferma da quanto lei ha detto. Ho effettuato le giuste modifiche e ora va tutto bene... spero :-) Ho bisogno di urgenti chiarimenti riguardo a limits.h e a IntMax, a che servono? che ci devo fare? grazie. -- Comment added by Users.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 Users.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 :-) 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. -- Users.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!). -- Users.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 .... -- Users.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! -- Users.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 Users.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 Users.MauroFerrara on 10 Nov 2002 ---- Ho risolto grazie, (pow e' una funzione del C)! -- Comment added by Users.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 Users.EnricoDiPaolantonio on 10 Nov 2002 ---- Enrico come hai dichiarato le variabili in cui è compreso il vettore??? risp urgente! -- Comment added by Users.AndreaSantoro on 10 Nov 2002 ---- ---+++ ultimi minuti -5 -4 -3 -2 -1 -- Comment added by Users.AlessandroInnocenti on 10 Nov 2002 ---- ---+++ cavolo..scusa Andrea stavo studiando logica e solo ora ho letto il messaggio. :( sorry! ehm...non ho capito la domanda comunque...in che senso le variabili in cui e' compreso il vettore? -- Comment added by Users.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 Users.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 Users.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 :) -- Comment added by Users.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 :) -- Comment added by Users.EnricoDiPaolantonio on 11 Nov 2002 ---- <b><font size= 30>BEATO TE CHE HAI FINITO!!!!</font></b> -- Comment added by Users.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). -- Users.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 Users.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 Users.LauraRavagli on 11 Nov 2002 da Roma ... (sigh :( ) %COMMENT{button=" Aggiungete la domanda " mode="before" lines="5"}% <a name="form"> * Ricordatevi di dare un titolo alla vostra domanda come segue: <verbatim> <tre spazi>---+++<spazio>Titolo della domanda Testo della domanda </verbatim>
E
dit
|
A
ttach
|
Watch
|
P
rint version
|
H
istory
: r117
<
r116
<
r115
<
r114
<
r113
|
B
acklinks
|
V
iew topic
|
Ra
w
edit
|
M
ore topic actions
Topic revision: r117 - 2003-09-30
-
AndreaSterbini
Log In
or
Register
Programmazione1/AA0506/PZ Web ...
Programmazione1/AA0506/PZ Web
Programmazione1/AA0506/PZ Web Home
Users
Groups
Index
Search
Changes
Notifications
Statistics
Preferences
User Reference ...
User Reference
ATasteOfTWiki
TextFormattingRules
TWikiVariables
FormattedSearch
TWikiDocGraphics
TWikiSkinBrowser
InstalledPlugins
ChangeEmailAddress
ChangePassword
ResetPassword
Prenotazioni esami
Laurea Triennale ...
Laurea Triennale
Algebra
Algoritmi
Introduzione agli algoritmi
Algoritmi 1
Algoritmi 2
Algoritmi per la
visualizzazione
Architetture
Prog. sist. digitali
Architetture 2
Basi di Dati
Basi di Dati 1 Inf.
Basi di Dati 1 T.I.
Basi di Dati (I modulo, A-L)
Basi di Dati (I modulo, M-Z)
Basi di Dati 2
Calcolo
Calcolo differenziale
Calcolo integrale
Calcolo delle Probabilitą
Metodi mat. per l'inf. (ex. Logica)
canale AD
canale PZ
Programmazione
Fond. di Programmazione
Metodologie di Programmazione
Prog. di sistemi multicore
Programmazione 2
AD
EO
PZ
Esercitazioni Prog. 2
Lab. Prog. AD
Lab. Prog. EO
Lab. Prog. 2
Prog. a Oggetti
Reti
Arch. di internet
Lab. di prog. di rete
Programmazione Web
Reti di elaboratori
Sistemi operativi
Sistemi Operativi (12 CFU)
Anni precedenti
Sistemi operativi 1
Sistemi operativi 2
Lab. SO 1
Lab. SO 2
Altri corsi
Automi, Calcolabilitą
e Complessitą
Apprendimento Automatico
Economia Aziendale
Elaborazione Immagini
Fisica 2
Grafica 3D
Informatica Giuridica
Laboratorio di Sistemi Interattivi
Linguaggi di Programmazione 3° anno Matematica
Linguaggi e Compilatori
Sistemi Informativi
Tecniche di Sicurezza dei Sistemi
ACSAI ...
ACSAI
Computer Architectures 1
Programming
Laurea Magistrale ...
Laurea Magistrale
Percorsi di studio
Corsi
Algoritmi Avanzati
Algoritmica
Algoritmi e Strutture Dati
Algoritmi per le reti
Architetture degli elaboratori 3
Architetture avanzate e parallele
Autonomous Networking
Big Data Computing
Business Intelligence
Calcolo Intensivo
Complessitą
Computer Systems and Programming
Concurrent Systems
Crittografia
Elaborazione del Linguaggio Naturale
Estrazione inf. dal web
Fisica 3
Gamification Lab
Information Systems
Ingegneria degli Algoritmi
Interazione Multi Modale
Metodi Formali per il Software
Methods in Computer Science Education: Analysis
Methods in Computer Science Education: Design
Prestazioni dei Sistemi di Rete
Prog. avanzata
Internet of Things
Sistemi Centrali
Reti Wireless
Sistemi Biometrici
Sistemi Distribuiti
Sistemi Informativi Geografici
Sistemi operativi 3
Tecniche di Sicurezza basate sui Linguaggi
Teoria della
Dimostrazione
Verifica del software
Visione artificiale
Attivitą complementari
Biologia Computazionale
Design and development of embedded systems for the Internet of Things
Lego Lab
Logic Programming
Pietre miliari della scienza
Prog. di processori multicore
Sistemi per l'interazione locale e remota
Laboratorio di Cyber-Security
Verifica e Validazione di Software Embedded
Altri Webs ...
Altri Webs
Dottorandi
Commissioni
Comm. Didattica
Comm. Didattica_r
Comm. Dottorato
Comm. Erasmus
Comm. Finanziamenti
Comm. Scientifica
Comm Scientifica_r
Corsi esterni
Sistemi Operativi (Matematica)
Perl e Bioperl
ECDL
Fondamenti 1
(NETTUNO)
Tecniche della Programmazione 1° modulo
(NETTUNO)
Seminars in Artificial Intelligence and Robotics: Natural Language Processing
Informatica generale
Primo canale
Secondo canale
II canale A.A. 10-11
Informatica
Informatica per Statistica
Laboratorio di Strumentazione Elettronica e Informatica
Progetti
Nemo
Quis
Remus
TWiki ...
TWiki
Tutto su TWiki
Users
Main
Sandbox
Home
Site map
AA web
AAP web
ACSAI web
AA2021 web
Programming web
AA2021 web
AN web
ASD web
Algebra web
AL web
AA1112 web
AA1213 web
AA1920 web
AA2021 web
MZ web
AA1112 web
AA1213 web
AA1112 web
AA1314 web
AA1415 web
AA1516 web
AA1617 web
AA1819 web
Old web
Algo_par_dis web
Algoreti web
More...
PZ Web
Create New Topic
Index
Search
Changes
Notifications
RSS Feed
Statistics
Preferences
View
Raw View
Print version
Find backlinks
History
More topic actions
Edit
Raw edit
Attach file or image
Edit topic preference settings
Set new parent
More topic actions
Account
Log In
Register User
Questo sito usa cookies, usandolo ne accettate la presenza. (
CookiePolicy
)
Torna al
Dipartimento di Informatica
E
dit
A
ttach
Copyright © 2008-2025 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki?
Send feedback