Domande (e risposte) sull' HomeWork6aa0203



Pulizia

Mi sono permesso di fare pulizia in questa pagina e lasciare questo spazio per le Domande dell Homework 6 visto che è stato messo on line! BUON LAVORO A TUTTI .. io gia non c'ho capito niente!

-- Comment added by MatteoLaBella on 25 Nov 2002


... ma se non l'ho ancora finito di scrivere!!!!

-- Comment added by AndreaSterbini on 25 Nov 2002


"Bersaglio mobile" e "non dico altro"

Stavolta cercate di essere educati.

-- Comment added by AndreaSterbini on 25 Nov 2002


Scusi ma una settimana.....

...mi pare un po poco. Solo per il fatto che ci sta' gente che lavora, o che magari ha da prepararsi qualche esonero.... per non parlare di chi ha l'uni il pomeriggio. Spero che non voglia fare come Bill e costringerci a fare la lunga marcia smile Quindi non si potrebbe spostare la consegna a venerdi' 5 ??

-- Comment added by LeonardoParisi on 26 Nov 2002


No

-- Comment added by AndreaSterbini on 26 Nov 2002


Ok come non detto non fa nulla ... cmq finalmente qualcosa di serio

-- Comment added by LeonardoParisi on 26 Nov 2002


Buon lavoro!

-- Comment added by AndreaSterbini on 26 Nov 2002


al solito

...nessun controllo sulla correttezza dell'input?

-- Comment added by LauraRavagli on 26 Nov 2002


nella parte facoltativa vengono citati i controlli da effetturare
pero' estendo la domanda: per quanto riguarda la data bisogna controllarla
solo al momento dell'inserimento o anche nella ricerca??

-- TizianoMorgia - 26 Nov 2002


...non l'avevo letto... ma non dirlo a nessuno smile

-- Comment added by LauraRavagli on 26 Nov 2002


librerie

quali librerie (oltre alla stdlib.h e alla stdio.h)si possono usare?

-- Comment added by CristianoMarra on 26 Nov 2002

Date voi dei suggerimenti, io li vaglierò.

-- Comment AndreaSterbini - 26 Nov 2002


scusate, eh..

la mia domanda è la seguente:

struct prova
  {
  int numprova;
  ...
  };
...
struct prova myprova;
...
visto che mi piacerebbe usare direttamente la struttura per l'input della scanf

(invece di usare una variabile di appoggio)
c'è modo di fare una cosa del genere:

scanf("%d",myprova.&numprova);

ossia come mi ritorno l'indirizzo di una variabile in una struct??

grazie a chi prova a rispondermi (ho già in mente un paio di persone smile )

-- Comment added by LauraRavagli on 26 Nov 2002

forse

scanf("%d",&myprova.numprova);
ti viene meglio

-- ArcangeloTripi - 26 Nov 2002

grazie c'avevo provato, ma chissà che avevo scritto e non mi funzionava smile


Giustificare l' output

Scusi prof. Sterbini, ma nell' output che lei ci ha mostrato, il nome, il cognome e i vari dati sono divisi da barre verticali ( tipo |....................|) ma quelle barre dobbiamo fare si che compaiano nello stampare la tabella di output? Eppoi non riesco a chiarire i tipi di controlli; nella parte base (non facoltativa) è necessario implementare qualche controllo? ad esempio sull' errato formato della data o su date inesistenti? Grazie Diego

-- Comment added by DiegoPacifici on 26 Nov 2002


per le || la risposta è sì (guarda il paragrafo stampa)

è facoltativo gestire gli errori (ossia la gestione fa parte dell'implementazione facoltativa)

-- Comment added by LauraRavagli on 26 Nov 2002


print o stampa?

scusi prof lei ci ha detto che con la parola "stampa", stampa tutto il contenuto, ma sull' esempio c'è la parola "print", quale dobbiamo usare?

-- Comment added by CristianoMarra on 26 Nov 2002

print

Attenti! il bersaglio ha cominciato a muoversi! smile

-- Comment AndreaSterbini - 26 Nov 2002


Grazie Laura

Diego
-- Comment added by DiegoPacifici on 26 Nov 2002


Domanda importante

Non ho capito molto bene come deve funzionare l'inserimento delle voci nella rubrica e cioè: L'inserimento deve funzionare a coda?? quando aggiungo, aggiungo alla fine,
oppure inserisco la voce al primo elemento vuoto che incontro?

-- Comment added by MarcoEsposito on 26 Nov 2002

Alla fine.

La rubrica non deve avere buchi.

-- Comment AndreaSterbini - 26 Nov 2002


no comment

... mi boccio da sola: ho passato mezza giornata a fare questa cosa:

rubrica.cognome = nominativo.cognome ;

...incompatible type assignment

con cognome ovviamente char e a bestemmiare xchè pensavo dipendesse da un passaggio errato delle strutture alla funzione

GRRR!

mi sa che è meglio se x oggi lascio stare

-- Comment added by LauraRavagli on 26 Nov 2002


ma le solite 6 righe che fine hanno fatto?

-- Comment added by LeonardoParisi on 26 Nov 2002

Ti mancano?

-- Comment AndreaSterbini - 26 Nov 2002

Si mi mancano...:) piu' che altro vorrei sapere se ci vanno messe o no.... ma da quanto ho capito no.

-- Comment added by LeonardoParisi on 26 Nov 2002


Mi manca qualcosa o il mio degrado mentale avanza?

E' da stasera appena tornato a casa che provo a far funzionare
quella maledetta scanf per farle ricevere argomenti diversi,
o anche tutta la riga di input in alternativa, o perlomeno
bloccarsi quando premo "invio"...ora la domanda e' la seguente:
c'e' qualcosa sul funzionamento della scanf che chi non puo'
venire a lezione deve sapere o sono io che sono entrato in un loop
mentale cronico??

-- Comment added by TizianoMorgia on 27 Nov 2002

La scanf (come le sue sorelle fscanf e sscanf) e' una brutta bestiaccia. Soprattutto, tratta gli errori in un modo molto poco intuitivo, come ho gia' avuto modo di spiegare a qualcuno, e se non si conosce bene il meccanismo ci si trova tranquillamente in un loop infinito. Se posso permettermi di darti un consiglio, assumi sempre che gli input siano di tipo corretto.

-- ArcangeloTripi - 27 Nov 2002

Il mio problema pero' e' il seguente:

char pippo[400], paperino[200], pluto[200];

Scrivo --> Inserisco --> Ho

scanf( "%s", pippo ); --> Pape Rino --> Pape

scanf( "%s %s", paperino, pluto ); --> Pape Rino --> Pape Rino (Ok!)

scanf( "%s %s", paperino, pluto ); --> Pape (invio) --> nella linea di comando va a capo!
La domanda e' quindi: come faccio a fare in modo che la scanf "si fermi" quando premo invio anche se non ho "riempito/fornito" tutti i valori!?

-- Comment added by TizianoMorgia on 27 Nov 2002

scanf considera come separatori di stringa sia il carattere blank che il ritorno a capo. Quindi, quando hai inserito Pape ed hai premuto invio ha letto la prima variabile, non ha ancora terminato la sua esecuzione, ed aspetta che tu inserisca un valore per la seconda variabile. Nel frattempo, puoi premere invio tutte le volte che vuoi, finche' non metti un carattere non considera iniziata la seconda stringa. Questa verra' poi letta normalmente. scanf funziona cosi', che piaccia o no la storia e' questa. Ma in realta' ha in serbo ben altre delizie....

-- ArcangeloTripi - 27 Nov 2002

Ok, come avevo immaginato/capito...ora devo solo trovare il modo per leggere un numero diverso di parametri a seconda del comando ovvero:

add pippo pluto 01-01-1500 tel blablabla <-- n parametri
prox 01-01 <-- m parametri

n <> m come si puo notare :-)
Io volevo cavarmela con una scanf singola, ma credo che dovro' "aggirare" il problema. Grazie comunque per avermi tolto qualche dubbio.

-- Comment added by TizianoMorgia on 27 Nov 2002


Il controllo

Scusate ma per il controlo degli errori della data si intende un giorno che non esiste tipo il 35 oppure il 31 novembre e anche immagino se uno digita un mese numero 15 e un anno 2050...... credo che siano errori accettabili... ma spero solo questi! O anche se la data non e'numerica ovvero scrivo come mese gen ecc...?

-- Comment added by LeonardoParisi on 27 Nov 2002


librerie2

le librerie in questione sono la limits.h, la string.h e la errno.h si possono usare?

-- Comment added by CristianoMarra on 27 Nov 2002


segmentation fault

sto facendo delle prove, ma non capisco perchè se in una struct in cui c' è il suo puntatore ed un char * , quando inizio a far ciclare la lista inserendo le stringhe, dopo la prima stringa nel momento che inserisco la seconda mi da segmentation fault, da cosa è dovuto? p.s.: premetto che ho provato anche a dargli subito una dimensione oppure ad inizializzarle con il tappo "\0" help frown

-- Comment added by CristianoMarra on 27 Nov 2002


char * vuol dire 'puntatore ad un carattere' (o ad un array di caratteri ... ma non alloca la memoria necessaria a contenere i caratteri ... per quello devi usare l'allocazione statica (definisci un array di caratteri) oppure quella dinamica (usi malloc, ma poi ti devi ricordare di deallocare la memoria)

-- Comment added by AndreaSterbini on 27 Nov 2002


include e librerie

ok per limits, string ed errno ...

-- Comment added by AndreaSterbini on 27 Nov 2002


scanf

Le stringhe conteneti lo spazio vanno circondate da doppi apici (vedi testo dell'esercizio)

La scanf (se mi ricordo bene) torna come risultato il numero di direttive che sono state trovate nell'input.

-- Comment added by AndreaSterbini on 27 Nov 2002

Non vorrei fare il pedantic, ma scanf restituisce il numero di input letti ed assegnati correttamente.

-- Comment added by ArcangeloTripi on 27 Nov 2002

Giusto.

-- AndreaSterbini - 27 Nov 2002


Nomi composti

Professore dobbiamo gestire anche i nome complessi? Es: NOME: Gianni Maria Cognome: Pluto ?????????'

-- Comment added by MatteoLaBella on 27 Nov 2002

Certo, come scritto nel testo i nomi/cognomi con spazio saranno racchiusi da doppi apici.

-- Comment added by TizianoMorgia on 27 Nov 2002

E comunque basta dare un'occhiata agli esempi, uno dei quali tratta proprio questo caso!

-- Comment added by ArcangeloTripi on 27 Nov 2002


segmentation fault-la vendetta

ho provato in tutte e due i modi non c'è niente da fare, ancora sta benedetta segmentation fault(e pensare che in C---++ c'è tanto quella bella classe String sigh frown )

-- Comment added by CristianoMarra on 27 Nov 2002

Non so se la cosa puo' esserti utile, io la butto li'. In fase di debugging, puoi controllare anche i valori dei puntatori prima di usarli, in modo da essere sicuri che puntino effettivamente dove ti aspetti. L'indicatore di conversione di printf per le variabili puntatore e' %p.

Comunque, tieni presente che, tanto per fare un esempio, il kernel di Linux e' scritto in C, non in C---++. Non vorrei sbagliarmi, ma l'impressione e' che in giro ci sia molto piu' codice scritto in C che in C++. La programmazione ad oggetti ha sicuramente dei vantaggi nel campo delle interfacce grafiche, e per alcuni tipi di database, ma l'impressione e' che in generale il gioco non valga la candela.

-- Comment added by ArcangeloTripi on 27 Nov 2002


sono ancora all'inizio...

son stata out per un giorno per l'installazione del dual boot sul mio portatile..sgrunt... mTRANQUILLI!!! rieccomi smile prima domandina di approccio: si possono annidare le struct? ho visto di si.. ma in questo casa e' conveniente? mi riferisco alla data di nascita ed eventualmente all'email/telefono...

-- Comment added by ElisabettaDAiutolo on 27 Nov 2002


Certo! L'esercizio è proprio sulle struct/enum/union annidate ...

-- Comment added by AndreaSterbini on 27 Nov 2002


ed ora sono io a salutarvi x un pò (almeno di giorno)

Il lavoro chiama... UFF!

-- Comment added by LauraRavagli on 27 Nov 2002


GRAZIE ARCANGELO

Ti ringrazio per la dritta, sul c---++ stavo scherzando, lo so che il kernel di linux è scritto in C (come quello di windows e dei MacOs), anzi ti dirò di più il 90 % è scritto in C l'altro 10 % è in assembly(la parte del master boot record di un OS solo così la puoi controllare e creare), anche se poi alla fin fine codice assembly si può scrivere anche nel codice(con la funzione asm(...) ) tenterò il tuo consiglio

-- Comment added by CristianoMarra on 27 Nov 2002


Spazi

Prof. ma nell'input delle linee di comando che inserira'(add Marco ...), lei separera' gli argomenti con un unico ed un solo spazio?

-- Comment added by MarcoEsposito on 27 Nov 2002

Il numero di spazi non dovrebbe essere un problema.

Se lo fosse (fatemi sapere) darei un solo spazio.

-- Comment added by AndreaSterbini on 27 Nov 2002


"two or more data declarations" ...

Ho provato a dichiarare la struct per la data in questo modo:
struct data
{
  int gg;
  int mm;
  int aa;
}
poi ho usato un ciclo for per inserire le date. Ma alla compilazione, il terminale mi "two ore more data declaration" Che vuol dire?

-- Comment added by DanieleComandini on 27 Nov 2002

che ci sono due dichiarazioni delle struct data ... controlla se l'hai ridefinita per sbaglio.

-- Comment added by AndreaSterbini on 27 Nov 2002


Del

ma quando eseguo la DEL e ci sono piu` persone con lo stesso nome e cognome devo eliminarle entrambe o solo il primo che incontro????

-- Comment added by EmanuelePiersanti on 27 Nov 2002

tutte (rileggi il testo)

-- Comment added by AndreaSterbini on 27 Nov 2002


Input

c'é un modo per prendere come input su stdin un array di caratteri di lunghezza variabile? Ho provato con gets(char *s) ma si incavola subito e con altri metodi la situazione non cambia in quanto alla fine fanno la stessa chiamata al sistema...... cme si fa?

-- Comment added by LeonardoParisi on 27 Nov 2002


re: Input

se intendi---+ o - meno quello che cercavo io qualche msg sopra,
no (o almeno non ci sono riuscito!). Se ci riesci fammi sapere! :-)
Cmq io ho risolto in questo modo:
linea di comando: pippo pluto
scanf( "%s", var1 );
/*
...codice...
(non sono sicuro e non ti dovrebbe servire, ma io non farei nessun output
nel codice tra le due scanf)
*/
scanf( "%s", var2 );

var1 <-- "pippo"
var2 <-- "pluto"

-- Comment added by TizianoMorgia - 28 Nov 200


Controllo degli errori (facoltativo)

Il controllo dovrebbe segnalare un errore se il dato:
  • non segue la sintassi data
  • non ha senso (ad esempio una email con due @ oppure una data inesistente)

-- Comment added by AndreaSterbini on 27 Nov 2002


Magica apparizione...

In fase d'inserimento dei dati assegno il campo del tipo(cioè la parola email o tel) ad una variabile d'appoggio fittizia per non considerlo pero' nella stampa dei dati inseriti "magicamente" nel campo della data viene accodata l'email/telefono in questo modo:

|........................Andrea|......................Sterbini|02-02-
1961sterbini@dsi.uniroma1NOSPAM.it|sterbini@dsi.uniroma1NOSPAM.it....
................|
Da cosa può dipendere????Cosa posso fare per non considerare quelle "maledette" smile parole Grazie...

-- Comment added by AndreaArtibani on 28 Nov 2002


Non so se questo e' il caso, ma tieni presente che il C, quando si dichiara un vettore di una certa dimensione si limita a riservare lo spazio in memoria, ed in seguito non fara' alcun controllo sugli indici, che potranno anche uscire dai limiti dichiarati. Ad esempio, se dichiaro

char stringa[100];
e nel programma scrivo qualcosa come
stringa[200] = 'a';
lui non batte ciglio, si limita a 1)andare all'indirizzo di stringa 2)spostarsi di 200 posizioni, ottenendo un nuovo indirizzo 3) in quell'indirizzo inserire il carattere 'a'. Le conseguenze dipendono da quale ruolo svolge l'indirizzo a cui si e' acceduto. Se si finisce in un'area al di fuori dei range di memoria virtuale che il sistema operativo aveva assegnato al programma, quest'ultimo (il sistema operativo) protesta in qualche modo, nel nostro caso dando luogo ad un messaggio del tipo "segmentation fault". Se invece quello spazio era stato riservato ad un'altra variabile del programma ecco che opla', come per magia ci si trova un valore apparentemente inspiegabile per quella variabile.

Questo e' C, non Visual Basic smile

P.S. Questo comportamento non e' sbagliato, e' una caratteristica voluta del C. Le motivazioni di tutto cio' risulteranno chiare a chi sopravvivera' (metaforicamente parlando)

P.P.S. Perche' non levi un po' di puntini dal tuo esempio? Senno' allarghi eccessivamente la pagina a tutti. Lo farei io, ma non tocco i messaggi degli altri.

-- Comment added by ArcangeloTripi on 28 Nov 2002


Ho anche un'altra possibile spiegazione. Quando si chiede al C il valore di una stringa specificandogli la sua posizione di memoria, lui si comporta in questo modo: 1) va all'indirizzo indicato 2) si sposta di un carattere alla volta (per carita' di Dio, non consideriamo il caso dei caratteri multibyte!) fino a che non trova un terminatore di stringa, nel nostro caso il carattere '\0'. Se per qualche motivo questo carattere e' stato eliminato o sovrascritto nella mia stringa a lui non frega niente, va avanti finche' lo trova, anche se originariamente apparteneva ad un'altra stringa o ha raggiunto una posizione di memoria che lo conteneva casualmente. Anche questo puo' dare luogo ad effetti apparentementi magici (ma puo' essere anche usato per scrivere del codice piu' efficiente)

-- Comment added by ArcangeloTripi on 28 Nov 2002


scanf(2)

Non ricordo esattamente la dicitura del libro, cmq se la memoria non mi inganna
se si vuole usare il formato %s per salvare una stringa di n caratteri, bisogna
associare un vettore di n---+1 elementi poiche' imposta l'ultimo al famoso '\0'.
Anche io ho fatto una cosa del genera ma a me veniva (sbagliando) cosi':
char
  gg[2], mm[2], aa[4];
/*leggo data*/
...

/*stampo lettura*/
printf( "Giorno: %s", gg ); --> Output: 01012002
printf( "Mese: %s", mm ); --> Output: 012002
printf( "Anno: %s", aa ); --> Output: 2002
Soluzione:
char
  gg[3], mm[3], aa[5];
la fortuna ha voluto che ho trovato un '\0' in memoria dopo anno e non ha scritto "altro"!

-- Comment added by TizianoMorgia on 28 Nov 2002


Domanda importante (aggiunta)

Non ho capito bene, la rubrica non deve avere buchi si intende che gli elementi
della rubrica oltre che continui devono essere anche contigui??
O si intende che nella stampa non ci siano buchi?
Inoltre: aggiungendo alla fine bisogna "scalare" gli elementi precedenti per rispettare
l'ordine di inserimento? E per la cancellazione di un elemento? Bisogna ricompattare le schede?

-- Comment added by TizianoMorgia on 28 Nov 2002


Gruppi di scansione (scanf)

Ho notato che sul libro ("Deitel & Deitel" "C Corso Completo ..."), che nella scanf si possono usare i gruppi di scansione, ed ho visto che possono essere molto utili, ma si possono usare tranquillamente? o creano problemi?

-- Comment added by MarcoEsposito on 28 Nov 2002


Domanda e Risposta

la mia domanda è questa: con il comando "del" se si hanno più nomi e cognomi uguali, devono essere cancellati tutti, oppure, solo il primo che s'incontra?

Risposta per Marco Esposito: Non penso che in questa circostanza servano a molto i gruppi di scansione, perchè grazie a questi, puoi prendere un ben preciso numero di caratteri e quindi, nel caso del nome, cognome, email o tel, non sapresti a quanto impostare gli n caratteri, avendo ciascun individuo bisogno di diverse quantità di n caratteri; In compenso, subito dopo, a pag 342 troverai molto interessante il "carattere di soppressione dell'assegnamento" utile, per gestire i "-" delle date (ma forse questo lo sapevi già).

-- Comment added by AndreaBandino on 28 Nov 2002


Dangerous

Se provo a usare gets su gcc mi risponde cosi' :

"the 'get' function is dangerous and should not be used" e non me lo vuole compilare... anche se su altri sistemi funziona perfettamente e cmq e' una funzione di C di libreria. che gli devo fare?

-- Comment added by LeonardoParisi on 28 Nov 2002

Effettivamente è vero! Mi hanno spiegato in laboratorio che tutti i compilatori di LINUX non accettano questa funzione.. se hai un problema per quanto riguarda la stringa con degli spazi, fai in questo modo


scanf("%[^\n]", &nomevariabile)

In questo modo prende tutti i caratteri, compresi gli spazi finche non dai il comando di invio!!

-- Comment added by MatteoLaBella on 28 Nov 2002

scanf....

quando iserisco un comando es: add,il mio programma può andare a capo e chiedermi nome cognome ecc ecc...oppure deve farsì che io possa scrivere tutto su una stessa riga???? se deve scrivere tutto su una riga mi sorge un dubbio:la scanf come fa a riconoscere add,fine,print,del e prox e permettermi di scrivere tutto il resto senza andare accapo??? c'è un uso particolare della scanf che permette tutto ciò? ciao 0;)

-- Comment added by FabioQuarta on 28 Nov 2002

Devi compiere tutte le operazioni su UNA RIGA quindi sia comando che immissione.. la scanf funziona come la printf cioè ti permette di inserire più input in una sola riga ES:

scanf("%s %s", &nomecomando, &input) 
In questo modo se scrivi ADD matteo saprai che ADD sta dentro alla variabile nomecomando (con una semplice IF te le cavi) e poi sai che in input ci va matteo L'esempio è solo con due ma se vuoi puoi mettere altre variabili.. ciao

-- Comment added by MatteoLaBella on 28 Nov 2002



Un consiglio

Solo un consiglio... vedo che si gira intorno alla questione smile I comandi e i dati personali vengono immagazzinati tramite una sola

scanf? oppure tramite piu' scanf? In ogni modo mi potete dare qualche informazione(anche qualche dritta), magari anche dandomi(se ci sono) indicazioni su dove poterle trovare su Deitel&Deitel. Grazie. (mamma mia che mal di testa a scrivere con una casella di testo così larga!!! tra un po' devo adottare la risoluzione 8000X6000 :-))

-- Comment added by DavideSammartino on 28 Nov 2002


INFORMAZIONE IMPORTANTE!

si puo usare una switch x fare questo programma o nn è possibile? es. posso scrivere:
char opzione[5];
scanf("%s", &opzione);
switch (opzione)
{
 case 'add': ........................ break;
}
è possibile? o c'è qualke altro modo x implementare la switch senza dover usare tutti quegli if? il prog risulterebbe anche---+ leggibile! o sbaglio? risp grazie!

-- Comment added by AndreaSantoro on 28 Nov 2002


switch ?

l'istruzione switch prende come argomento un numero intero e tutte le seguenti istruzioni case devono avere valori costanti al momento della compilazione ... vedi tu se questo ti aiuta.

-- Comment added by AndreaSterbini on 28 Nov 2002


allora nn posso usare la switch e devo fare tutta la serie di if! grazie prof!

-- Comment added by AndreaSantoro on 28 Nov 2002


Del e buchi ...

  • Del: In caso di omonimie vanno cancellati tutte le voci trovate.
  • Buchi: fate come vi pare, ma una nuova aggiunta va fatta in fondo (e NON nella prima voce vuota)

-- Comment added by AndreaSterbini on 28 Nov 2002


Quindi

quindi la data 1982 é sbagliata sarebbe giusta 982 ...? controliamo pure se l'anno é bisestile?

-- Comment added by LeonardoParisi on 28 Nov 2002

Mi sono sbagliato a mettere solo 3 a nell'esercizio ... correggo subito.

-- AndreaSterbini - 30 Nov 2002


a leo mi sa ke pure l'anno bisestile dobbiamo controllare!

-- Comment added by AndreaSantoro on 28 Nov 2002


Gestione degli errori ...

Ragazzi ... non ho il tempo per rifiatare e mi volete far implementare anche il controllo dell'anno bisestile? ... ma mi avete preso per Stakanov? smile

Facciamo così:

  • gli errori di sintassi vanno controllati
  • tutti i mesi hanno 31 giorni
  • l'anno ha 12 mesi
  • l'anno ha 4 cifre (va da 0 a 9999)
  • un indirizzo email ha un solo '@' ed almeno un '.' (ed esempio xxxx@yyyy.zzz oppure uuuu@ttt.rrr.eee.www)

... se me ne sono sfuggiti di clamorosi ditelo ...

-- Comment added by AndreaSterbini on 28 Nov 2002


re: Gestione degli errori ...

Grazie del chiarimento e della semplificazione smile

-- Comment added by LeonardoParisi on 29 Nov 2002


Scanf (prova Prof)

Ho fatto un paio di prove con la scanf ...

Come notato da altri, la direttiva %s va bene solo se il nome (o il cognome) non contengono spazi.

Se invece li contengono dovete usare la direttiva %[] e ricordare che il nome (cognome) saranno circondati da doppi apici.

-- Comment added by AndreaSterbini on 28 Nov 2002


Scanf (testata dal prof)

Professore ne è sicuro? mi puo fare un esempio?
scanf("%[]", nomevar) ?
Può andar bene? Se si, a me NON VA frown

-- Comment added by MatteoLaBella on 28 Nov 2002


Meglio gets()

forse conviene usare gets() mi sono fatto un calcolo e contando gli spazzi al massimo la stringhe possono essere lunghe 180 caratteri. quindi se uno dichiara Char InLine[180] e poi esegue il gets(InLine) non si hanno problemi di sorta con le " o cose simili si ha tutta la linea.... basta fare poi un parsing su essa e gestirla nel modo opportuno a me mi pare piu'facile e sicuro cosi'

-- Comment added by LeonardoParisi on 29 Nov 2002


Scanf ...

Possibile che non vi venga in mente di leggere il manuale di scanf? (fate man scanf)

La direttiva %[] serve a raccogliere una sequenza di caratteri appartenenti all'elenco scritto tra le due parentesi (oppure NON appartenenti). Esempi:

  • %[abcd]: una sequenza di 1 o piú caratteri a,b,c o d (anche mescolati)
  • %[a-d]: la stessa cosa
  • %[^abcd]: una sequenza di caratteri diversi da a,b,c,d
  • %[^a-d]: la stessa cosa

-- Comment added by AndreaSterbini on 29 Nov 2002


re: Scanf ...

Si l'ho letto ma mi piace piú l'idea di gets e di un bel parsing......

-- Comment added by LeonardoParisi on 29 Nov 2002

scanf e gets e sscanf

allora puoi usare
   scanf("[^\n]",riga);
per leggere tutta la riga (al posto della gets). Poi sei libero di parserti la stringa con sscanf

-- AndreaSterbini - 30 Nov 2002


Ordinamenti vari

Mi sono accorto che gli ordinamenti da implementare per la versione facoltativa potrebbero ottenere risultati diversi se:
  • si ordina per nome ed esistono diverse persone con lo stesso nome
  • si ordina per cognome ed esistono diverse persone con lo stesso cognome
  • si ordina per mese-giorno ed esistono diverse persone nate nello stesso mese-giorno

Per evitare che la correzione non funzioni sappiate che nei test NON inseriró voci che possano portare a questi casi

-- Comment added by AndreaSterbini on 29 Nov 2002


Nota...

Salve prof., quindi(se ho capito bene!!!) mi conferma che la nota presente nel testo dell'esercizio:
NOTA: è possibile aggiungere più schede con lo stesso nome e cognome
non e' piu' valida????Se si, vale anche per le date??? Grazie mille.

-- Comment added by AndreaArtibani on 29 Nov 2002

E' possibile ma io non le inserirò

-- AndreaSterbini - 30 Nov 2002


A nome di tutti

La prego prof a nome di tutti è possibile allungare il tempo di consegna?? frown frown frown frown frown frown frown frown frown frown frown frown frown

-- Comment added by CristianoMarra on 29 Nov 2002


re: A nome di tutti

Non penso che sará d'accordo.... la vedo dura....

-- Comment added by LeonardoParisi on 29 Nov 2002


slittamento della consegna?

Mi rendo conto che soprattutto gli studenti del venerdì hanno meno tempo a disposizione tra la lezione (in cui posso dare parecchi chiarimenti) e la consegna.

Per evitare di accavallare consegna e spiegazione della soluzione, posso far slittare la consegna di tutti i prossimi esercizi al al massimo alla notte di martedì.

Voi, però, siete disposti a consegnare l'ultimo esercizio martedì 24 Dicembre?

Preferite invece qualche giorno di più per programmare anche a Natale? smile

-- Comment added by AndreaSterbini on 29 Nov 2002


Spostiamo a martedi

Io ho perso due giorni per l'installazione del dual boot sul portatile... sono ancora al carissimo amico.... roba che una scanf di una stringa[5] predichiarata mi da se cerco di stampare il contenuto della variabile segmentatin faulT..PERCHE????? e sto ancora alla function di ADD.... a lei 24 ore non cambiano nulla.. e a me si.. non consegnare perche' incompleto mi dispiacerebbe.. su su.. le diamo tante soddisfazioni poi smile

-- Comment added by ElisabettaDAiutolo on 29 Nov 2002

OK

-- AndreaSterbini - 29 Nov 2002


parsing ...

Potete usare la scanf anche per leggere tutta una riga:
  • scanf("%[^\n]",riga) legge una sequenza di caratteri diversi da \n

Ricordatevi che riga dev'essere abbastanza grande da accogliere tutti i caratteri letti e lo '\0' finale

-- Comment added by AndreaSterbini on 29 Nov 2002


re: parsing ...

Si cosi'funzionerebbe solo che messo in un ciclo do-while o in for il prog si rincoglionisce in quanto legge la riga esegue il blocco di codice e quando priprova a re la scanf rilegge automanicamente dal stdin da solo sensa aspettare che gli venga dato un input e cosi' il prog va in un ciclo infinito..... ora non so se questo problema lo da solo a me o no....

-- Comment added by LeonardoParisi on 29 Nov 2002

   sscanf(riga,"testo da trovare con direttive per ricavare gli elementi",elemeno1, elemento2, elemento3);

-- AndreaSterbini - 30 Nov 2002


Sull' input

Prof, scusi siccome ci sto poco forse (di tempo ma anche di testa smile ) o mi sono persa qualcosa oppure ho già la mia soluzione.

circa l'input secondo me basta fare la scanf sul primo comando e poi differenziare le altre scanf in base a questo.

Dormo o son desta?

-- Comment added by LauraRavagli on 29 Nov 2002

Non mi dai abbastanza dettagli da capire ... potresti aver ragione.

-- AndreaSterbini - 30 Nov 2002


Un consiglio

Solo un consiglio... vedo che si gira intorno alla questione I comandi e i dati personali vengono immagazzinati tramite una sola scanf? oppure tramite piu' scanf? In ogni modo mi potete dare qualche informazione(anche qualche dritta), magari anche dandomi(se ci sono) indicazioni su dove poterle trovare su Deitel&Deitel. Grazie. (mamma mia che mal di testa a scrivere con una casella di testo così larga!!! tra un po' devo adottare la risoluzione 8000X6000 :-))

-- Comment added by DavideSammartino on 29 Nov 2002

credo che con 1 o 2 scanf (o sscanf) si riesca a parsare tutto un comando.

-- AndreaSterbini - 30 Nov 2002


Errori....

Se quando controlliamo che l'email o la data o il tel sono giusti o no, e ci accorgiamo che é un errore.... che cosa dobiamo stampare o fare?

-- Comment added by LeonardoParisi on 29 Nov 2002

Leggi il testo dell'esercizio (la gestione degli errori è opzionale)

-- AndreaSterbini - 30 Nov 2002


Sort Compleanno

Salve prof, vorrei sapere se con il comando sort compleanno, si devono stampare in ordine, le persone, seguendo solo il giorno ed il mese oppure, seguendo in ordine il giorno il mese e l'anno; cioè qual'è corretto tra i due esempi?

sort compleanno

nome cognome 12-01-1982 ......

nome cognome 01-12-1960 ......

oppure

sort compleanno

nome cognome 01-12-1960 ......

nome cognome 12-01-1982 ......

-- Comment added by AndreaBandino on 29 Nov 2002

Leggi il testo, non bisogna stampare nulla, ma riordinare le voci in ordine crescente di:

  • mese
  • anno

poi se eseguo il comando print le voci verranno stampate nell'ordine in cui sono nell'agenda (in questo caso in ordine di compleanno)

-- AndreaSterbini - 30 Nov 2002


Seri problemi con SCANF

Ho seri problemi con la scanf.. anche la soluzione
scanf("%[^\n]", nomevar) non mi va bene
infatti se la metto dentro ad un ciclo, mi viene eseguita solo una volta.. come posso fare visto che gets mi dice che è pericolosa (dangerosa) per il PC?

ATTENZIONE QUANDO USATE TWIKI, NON CANCELLATE LE DOMANDE POSTE PRIMA DI VOI!!

-- Comment added by MatteoLaBella on 29 Nov 2002


re: Meglio gets()

La funzione gets(3) e` da evitare come la peste. Non effettua nessun tipo di controllo sul numero dei caratteri presi in input lasciando cosi` all' utente la possibilita` di andare a scrivere oltre i limiti del buffer. Uno dei principali attacchi informatici che minano la sicurezza del software scritto in C, il cosidetto "buffer overflow", si ottiene proprio sfruttando lacune messe a disposizione da funzioni come gets(3). Non c'e` da meravigliarsi quindi se alcuni compilatori (seri) si "rifiutano" di andare avanti. Se non ti va di usare scanf, potresti provare con fgets(3), es: fgets(stringa, 180, STDIN) mette dentro stringa al massimo 179 caratteri provenienti dallo standard input (l'ultimo viene posto automaticamente a '\0').

-- Comment added by AlessandroCavagni on 29 Nov 2002

gets lasciatela stare.

-- AndreaSterbini - 30 Nov 2002


re:Meglio gets()

Si puo usare anche gets() basta passagli per evitare casini appunto una variabile dichiareta come char nomevar[180]; in questa maniera si evitano problemi di buffer overflow

-- Comment added by LeonardoParisi on 30 Nov 2002

anche per la scanf dovete passare array di caratteri abbastanza grandi da contenere le stringhe lette ... state attenti!

-- AndreaSterbini - 30 Nov 2002


F1! F1!

a me sembra che ci stiamo incasinando (o almeno io) un po troppo con l'input composto da nomi quali Pape Rino ...,

per esempio:

scanf("%[^\n]",riga) legge una sequenza di caratteri diversi da \n

quando si accorge che ha finito di leggere ?

solo quando l'input è > della sua largezza? se sì se uno mette un input corto?

il nome e cognome sono sempre contenuti tra " " o solo se sono composti?

va be insomma come cazzarola si prende sto input??

che la notte vi porti consiglio (e che voi lo portiate a me domani)

-- Comment added by Laura on 01 Dicembre 2002

Se ne accorge dal carattere \n di fine riga

i " servono per i nomi (cognomi) composti (i nomi semplici possono essere sia senza che con ")

-- AndreaSterbini - 30 Nov 2002


F1!F1!

io mio é quello che ho scritto in re:Meglio gets()..... leggi tutta la riga e poi la gestisci come ti pare..

-- Comment added by LeonardoParisi on 30 Nov 2002


Cmq avevo altro da chiedere

  1. ) lei dice che quando uno fa add non deve metterlo nel primo libero ma accodarlo in fondo (vedi "Del e buchi") ma il mio dubbio é questo: se lei fa un paio di volte del di alcuni nome inseriti, si formano dei buchi. E seguendo le sue direttive quando lei poi continuerá a fare add la lista di 20 nomi risulterá piena anche se in realtá non lo é perche dei nomi sono stati concellati....... come ci dobbiamo comportare.....??
  2. ) ho fatto una chiamata alla funzione isdigit() che fa parte penso di ctype.h si puó usare?
  3. ) se quando ha tempo mi risponde pure alla domanda "Errori.... " mi fa un piacere....

-- Comment added by LeonardoParisi on 30 Nov 2002

  1. compattate la agenda ad ogni add
  2. credo di sì

-- AndreaSterbini - 30 Nov 2002


Input

Scusi prof ma ho un grosso problema con l'input non riesco a gestire una volta che ho preso la riga, come la posso gestire?

-- Comment added by DomenicoBoiano on 30 Nov 2002

Usa sscanf .

-- AndreaSterbini - 30 Nov 2002


Re: Meglio gets()

Ma nessuno di voi ha usato readline?

-- Comment added by SalvatoreFerrucci on 30 Nov 2002


algoritmo

qualcuno è così gentile da scrivere l'algoritmo dell'homework??? grazie mille ciao a tutti... sto rimbambendo con questa rubrica!!!!!!!!!!!!!!!!!!

-- Comment added by FabioQuarta on 30 Nov 2002

Qualcuno vuol mandare la sua soluzione a FabioQuarta che non sa risolvere l'esercizio? smile (ma sei matto?)

-- AndreaSterbini - 30 Nov 2002


SCusate ma...

Scusate ma su quanto per esempio ha detto Matteo, di usare scanf(%[^\n], &var), ma quando da input arriva un nome con spazi in mezzo, e quindi lo dobbiamo racchiudere tra apici o doppi apici, vengono registrati anche quelli, quindi come si può fare in modo che venga preso solo il nome? Diego

-- Comment added by DiegoPacifici on 30 Nov 2002

leggi meglio il manuale di scanf

-- AndreaSterbini - 30 Nov 2002


Sort Compleanno

Salve prof, vorrei sapere se con il comando sort compleanno, si devono stampare in ordine, le persone, seguendo solo il giorno ed il mese oppure, seguendo in ordine il giorno il mese e l'anno; cioè qual'è corretto tra i due esempi? sort compleanno

nome cognome 12-01-1982 ......

nome cognome 01-12-1960 ......

oppure

sort compleanno

nome cognome 01-12-1960 ......

nome cognome 12-01-1982 ......

-- Comment added by AndreaBandino on 30 Nov 2002


Un aiutino....

Ho notato che molte persone hanno problemi con la scanf e non si fidano ad usare la gets,
ma allora ho pensato... ma perche' non fare io una funzione che legge una stringa???
Per quanto riguarda il mio canale(E-O) il prof. Tronci ha spiegato come farne una (getline),
la mettero' up al piu' presto (guardate gli appuntidel prof. Tronci su Twiki)...

-- Comment added by MarcoEsposito on 30 Nov 2002

copiare? no grazie

Non copiate che vi annullo il compito.

-- AndreaSterbini - 30 Nov 2002


Segmentation fault

Nei precedenti programmi abbiamo preso l'input dalla riga di comando con char *arg[], ovvero un "vettore di stringhe", di conseguenza ho pensato di utilizzarlo nella scanf,ma quando vado a copiare le varie parti nella mia struct mi da sto segnale di errore maledetto!

ho provato di tutto:strcpy,sprintf,=;

esempio r[1].nome=input[1];

mi da errore!!!!!!!! frown

come posso fare..dove sbaglio?

-- Comment added by DarioLatini on 30 Nov 2002

argv riceve le stringhe dalla riga di comando.

i comandi invece li devi leggere da stdin!

-- AndreaSterbini - 30 Nov 2002


Perch'è non esiste string var?

Mi chiedo, perchè in C non è possibile dichiarare una variabile di tipo stringa? in modo che prenda la stringa inserita senza problemi? Ho deciso! Questo homework lo lascio stare.. Chi mi vuole dare una mano a lezione? La mia email sta sull HP di TWiki.. VI PREGO

-- Comment added by MatteoLaBella on 30 Nov 2002


Enum e union

Scusate, io devo definire la data di nascita solo ke non so bene se è giusto quello ke faccio. Il professore dice di usare enum per la data ma non ho capito bene come...ho visto l'esempio sul Deitel ma centra poco e niente e quindi ho pensato di usare la union con dentro giorno mese e anno, solo ke mi sorge un dubbio...in fase di print mi da la somma dei numeri ke metto? Li appiccita tutti e 3? Come faccio a far venire un output tipo quello dell'esempio con i trattini tra i vari numeri?

-- Comment added by DavidVulpetti on 01 Dec 2002



Un aiuto per le righe di comando

Se qualcuno potesse avere la pazienza di spiegarmi brevemente come usare i parametri argv e argc (es. l'esercizio 4 quando si faceva il controllo argv!=3),e magari anche cosa scrivere da prompt , per dare direttamente i parametri al programma ,gli sarei molto grato.

Vi prego aiutatemi !!!!!!!!!!!!1

-- Comment added by RuggeroTinaburri on 01 Dec 2002


string var

Che vuol dire non esiste string var ... non ti va bene scrivere così?
   char nome[31];

-- Comment added by AndreaSterbini on 01 Dec 2002


enum e union

come fai a usare la union per la data? se fai così verrà usato lo stesso spazio per giorno, mese e anno... col risultato di saperne solo uno dei tre.

Per la data casomai serve una struct (l'abbiamo fatto per esercizio a lezione!)

La enum può servire per l'elenco dei giorni e per l'elenco dei mesi ... ma potete anche non usarla.

-- Comment added by AndreaSterbini on 01 Dec 2002


Un aiuto per le righe di comando

Perchè non fai invece come è scritto nel testo dell'esercizio e leggi i comandi da stdin?

-- Comment added by AndreaSterbini on 01 Dec 2002


Comando print

Come devo gestire il comando print se la rubrica è vuota? Lo 0 davanti al prefisso ci deve stare solo se il prefisso è di 2 cifre (es.06 e non 0212)? Non riesco proprio a stampare il telefono in un campo di 50 caratteri. Inoltre la mia scanf non vuole proprio accettare nomi con spazi! (Penso che dovrei dirgli di accettare tutto quello che è compreso fra i doppi apici incluso lo spazio, ma non so come). Ringrazio chiunque può sfoltire la selva di dubbi che mi assale di fronte al programma che maledizione va ma non proprio come vuole il prof.

-- Comment added by GiovanniColombi on 01 Dec 2002

Se la rubrica è vuota non stampi nulla

Per stampare qualcosa in un campo largo 50 caratteri devi usare i modificatori delle direttive di printf .... leggi il manuale.

Per leggere stringhe con spazi guarda le risposte precedenti a proposito della scanf.

-- AndreaSterbini - 02 Dec 2002


re: Un Aiutino...

e adesso come mi comporto.... quella funzione io l'ho usata....
la devo togliere?? uffa... wink

-- Comment added by MarcoEsposito on 01 Dec 2002

Visto che non l'hai fatta tu ... dresi che hai copiato ... a buon intenditor ...

-- AndreaSterbini - 02 Dec 2002


DOMANDA PER STERBINI E PER TUTTI GLI ISCRITTI AL CORSO DI PROGRAMMAZIONE

So benissimo che questo spazio è riservato alle domande per

l'esercizio 6 ma sto con l'acqua alla gola. Linux non ne vuole sapere di partire e quindi SAPETE UN SITO DA DOVE SCARICARE UNA VERSIONE EFFICIENTE DEL LINGUAGGIO C COMPRENSIVO DEL COMPILATORE E DEL DEBUGGER? Per favore aiutatemi sto diventando matto!!!!!

-- Comment added by DanieleComandini on 01 Dec 2002

Perchè non leggi le pagine del corso che suggeriscono di usare Cygwin o Dev-C---++ o Mingw?

-- AndreaSterbini - 02 Dec 2002


Il sito che fa per te è http://www.linuxiso.org/ ma devi avere almeno un 'ADSL sennò ci metti un mese....

-- Comment added by LorenzoLivi on 01 Dec 2002


Prof puo rispondere ad un paio di domande??? grazie

  1. ) x la stampa devo usare come parola chiave "print" o "stampa"?
  2. ) x la data se io inserisco 02-02-1961 in output è giusto avere 2-2-1961 ???
  3. ) x il telefono se inserisco il numero---+39-06-111111 posso avere in output +39-6-111111 ??? x risolvere questo problema e visto ke sul telefono nn si deve fare nessun controllo posso dichiarare char telefono[18]??? ciao a tutti!

-- Comment added by AndreaSantoro on 01 Dec 2002

Mi pareva di aver corretto il testo: print

-- AndreaSterbini - 02 Dec 2002

grazie professore ma ha risposto solo ad una delle 3 domande! vorra dire ke terrò i miei dubbi tutti per me!


Risposta al prof. per STRING

Quello che volevo dire era questo: in C per passare una stringa funziona in questo modo char var[3]=

C I A O

quindi il numero 3 sta per le celle di memoria.. Secondo me sarebbe più comodo poter trattare anche le stringhe come unico elemento: char var[3]=

CIAO
PIPPO
CASA
PLUTO

In questo modo il 3 significherebbe solo il numero di "righe"

-- Comment added by MatteoLaBella on 01 Dec 2002


cioè char *stringhe[3]?

oppure char stringhe[3][20]?

-- Comment added by LauraRavagli on 02 Dec 2002

Se scrivi char var[3] stai devinendo un vettore di 3 caratteri , per cui sicuramente la parola "ciao" non c'entra.

Se vuoi scrivere un vettore di stringhe puoi usare i due suggerimenti di LauraRavagli

-- AndreaSterbini - 02 Dec 2002


oltre le due stringhe non ce la fa

ho un problema grosso, per l'esercizio ho optato per la lista concatenata, i fatti mi hanno dato ragione facendo esperimenti sul nome e cognome con tutti i comandi: add del prox print sort; non mi sembrava neanche vero fino a che non ho scoperto una cosa moooolto brutta: poco poco si inserisce un altro elemento nella lista in fase di stampa non me lo visualizza e a questo punto penso che neanche me lo inserisce cosa posso fare? ho già provato con un' array di stringhe e niente(sto facendo la data), ho provato con tre interi e niente, ho provato con le enum e niente, anche con una sotto struttura, vi prego aiutooooooooo!

-- Comment added by CristianoMarra on 02 Dec 2002

Usa un array di struct ... (che vi ho detto a fare che si possono inserire solo 20 elementi?)

-- AndreaSterbini - 02 Dec 2002

Certo che pero' la gestione dinamica della memoria e' molto piu' bella (e direi molto molto piu' difficile). Io ci tento, speriamo di riuscirci.

-- ArcangeloTripi - 02 Dec 2002


grazie

per aver spostato la scadenza smile

-- Comment added by ElisabettaDAiutolo on 02 Dec 2002


scanf dannata >:-|

qualcuno sa spiegarmi perche' la scanf mi funziona con i campi char ed int di una struttura e non per i campi struttura struttura intero? cerco di essere meno criptica: la scanf al "primo livello" ossia per il cognome mi funziona mentre quella al "secondolivello" non mi funziona tipo per la data di nascita

typedef struct persona{

char nome[DIMNOME];

.... struct data nascita;

-- Comment added by ElisabettaDAiutolo on 02 Dec 2002


gli passi l'indirizzo?

&nominativo.datanascita.giorno

-- Comment added by LauraRavagli on 02 Dec 2002

Ti sei ricordata la '&' davanti al campo intero?

-- AndreaSterbini - 02 Dec 2002


Giustificare testo.....

per giustificare il nominativo a destra bisogna metterci degli spazi davanti.. bene mi dico: se faccio n volte strcat(stringona,spazio); mi accodo lo sapzio n volte alla stringona... se metto la strcat dento un for per i che va da zero a n mi da segmentation fault.... perche'?

-- Comment added by ElisabettaDAiutolo on 02 Dec 2002

Guarda meglio i modificatori delle direttive della printf ... a giustificare le stringhe ci pensano loro.

-- AndreaSterbini - 02 Dec 2002


avrei altre domande da fare, basta ke questa volta risponde a tutte le domande e nn ad una sola come prima! GRAZIE!

  1. )nel comando "prox" la stampa va effettuata subito o devo ridigitare il comando print???
  2. )se io inserisco con "add" due personecon data di nascita uguale a: 11-10-1983 e 13-12-1983, se vado a cercare la data 10-09 il programma deve stampare tutte e 2 le persone inserite o solo la prima???
  3. )nel comando "del" se dopo aver inserito una persona es. andrea santoro e vado a cancellare ciccio franco ke nn è presente, in otput il programma deve stamparmi solo andrea santoro o che la persona da cancellare nn è stata trovata xke nn presente?? risp e grazie ancora x il disturbo!

-- Comment added by AndreaSantoro on 02 Dec 2002

  1. la prima che hai detto smile (rileggiti il testo)
  2. come fa a stamparle tutte e due se hanno mese-anno di nascita diverso? vanno stampate tutte le righe corrispondenti al giorno dato o al prossimo compleanno dopo il giorno dato (rileggiti il testo smile ).
  3. se nessuna voce corrisponde al nome da cancellare devi stampare nessuna (rileggiti il testo smile )

-- AndreaSterbini - 02 Dec 2002


data ....

combatto con la data: dunque... la mia struct e' del tipo struct data { int giorno[2], mese[2], anno[4]; };

mentre la sscanf nella funzione di inserimento che prende il pasto lo stringone....

sscanf(rigaint,"%2d%c%2d%c%4d %s", &R[dim].nascita.giorno, trattinoint, &R[dim].nascita.mese, trattinoint, &R[dim].nascita.anno, scelta);

sbaglio col trattino??? e' un char....

-- Comment added by ElisabettaDAiutolo on 02 Dec 2002


data ...

Non capisco a che ti servono due interi per il giorno, due per il mese e 4 per l'anno ... non sono mica caratteri ...

Se non metti il trattino nella stringa di controllo il numero viene interpretato come numero negativo .... cambia il %c in un '-'

-- Comment added by AndreaSterbini on 02 Dec 2002


RE: data....

1. xche' scrivi "int giorno[2]" e non "int giorno" e basta??
2. Perche' "trattinoint"?? Se non vuoi salvare il carattere trattino al posto
di %c scrivi %*c, comunque il formato della data viene passato come:
gg-mm-aaaa e non viene citato un caso tipo gg/mm/aaaa. Nel secondo caso
io lo considero errato e infatti scrivo "%d-%d-%d". Spero di aver capito quello che ti serviva sapere...

-- Comment added by TizianoMorgia on 02 Dec 2002


printf...

che dire.... sono senza parole... era molto piu' facile di quanto pensassi.. quando e' scontata una cosa la vedo sempre per ultima :(( grazie prof !

-- Comment added by ElisabettaDAiutolo on 02 Dec 2002


ancora printf...

se voglio stampare stringa dopo 83 caratteri faccio una cosa del genere: printf("%83s\n", stringa);

ma se 83 ce l'ho in un int???

-- Comment added by ElisabettaDAiutolo on 02 Dec 2002


invece della data il colore degli occho no???

Ebbene si mi sto impiccando sulla data...la struttura della data la ho cosi' modificata...

struct data { int giorno, mese, anno; }; nella subroutine di inserimento... sscanf(rigaint,"%d-%d-%d %s", &R[dim].nascita.giorno, &R[dim].nascita.mese, &R[dim].nascita.anno, scelta); printf("%d-%d-%d %s", R[dim].nascita.giorno, R[dim].nascita.mese, R[dim].nascita.anno, scelta);

in esecuzione come data mi viene: 1-0-22473635

il colore degli occhi era piu' semplice.. sgrunt

-- Comment added by ElisabettaDAiutolo on 02 Dec 2002


Una domenda ed una richiesta...

Domanda: E'lecito usare la fflush()? Richiesta: Lei ci aveva chiesto, di farle presente se l'inserimento di più spazi tra gli argomenti della riga di comando(add etc...)ci potevano dar problemi. Beh, a me ne danno, quindi se potesse inserire un solo spazio tra gli argomenti quando testa il programma... Grazie

-- Comment added by FabianoFerrazza on 02 Dec 2002


oltre le due stringhe2:la vendetta

fare una cosa come quella che mi ha detto lei significa ricominciare da capo e rendere vane tutte le ore che potevo impiegare per studiare altro, ho scelto la lista per il semplice motivo che la trovavo più flessibile di un' array di strutture smile , anche perchè a questo punto potevo fare tranquillamente un' array di stringhe e gestivo i dati in base a quale pipe si trovavano, la mia domanda era questa: c'è un modo per far gestire più di 2 oggetti dentro una struttura inserita dentro una lista? p.s.: comunque la ringrazio lo stesso per il consiglio smile buono studio a tutti

-- Comment added by CristianoMarra on 02 Dec 2002


Sscanf

Non riesco ad usare la sscanf per prendere i nomi composti tra i doppi apici insieme alle altre parole contenute nella riga di cui fare il parsing... E il manuale non mi funziona su Cygwin... aiuto, davvero.

-- Comment added by DavideSammartino on 02 Dec 2002


telefono....

ma se lo trattassimo come stringa? che bisogno c'e' di averlo come int??

-- Comment added by ElisabettaDAiutolo on 02 Dec 2002


Cerca data....

Sulla ricerca dei record per giorno-mese,in caso di esito negativo, non ho capito bene se:
Bisogna incrementare solo il giorno(e il mese se e' il 31) o incrementare sia il giorno che il mese comunque??? Bisogna cercare(e quindi incrementare) finche' non si trova un record??? E se la ricerca comunque da sempre esito negativo?? Grazie mille.

-- Comment added by AndreaArtibani on 02 Dec 2002


Sorting

Ma nel sorting, il "case" deve essere ignorato oppure i caratteri devo essere "case sensitive"? questa domanda la faccio perche' ho notato che i caratteri maiuscoli sono minori dei minuscoli. 'A' < 'a'

-- Comment added by MarcoEsposito on 02 Dec 2002


sscanf

e se le virgolette le mettessi fuori dalla direttiva %[], più o meno così?
  • =="add \"%[ a-zA-Z']\" ..."

telefono ...

Infatti ... bisogna stare attenti al prefisso delle città (che inizia per 0)

cerca data

il comando prox cerca il prossimo compleanno .... per fallire non dev'esserci nessuna voce nell'agenda.

-- Comment added by AndreaSterbini on 02 Dec 2002


Sorting

Ignorare il case è più difficile che non ignorarlo ...

Per ordinare basta usare l'insertionsort visto a lezione ...

Oppure potete usare le funzioni di sort di sistema ....

-- Comment added by AndreaSterbini on 02 Dec 2002



ancora stringona iniziale....

scanf("%[\"a-zA-Z'1-10 @^\n]",riga);

non mi prende i nomi composti.. ci ho messo pure \ davanti ai doppi apici...

-- Comment added by ElisabettaDAiutolo on 02 Dec 2002


sono TUTTI interi

Ebbene si mi sto impiccando sulla data...la struttura della data la ho cosi' modificata... struct data { int giorno, mese, anno; }; nella subroutine di inserimento... sscanf(rigaint,"%d-%d-%d %s", &R[dim].nascita.giorno, &R[dim].nascita.mese, &R[dim].nascita.anno, scelta); printf("%d-%d-%d %s", R[dim].nascita.giorno, R[dim].nascita.mese, R[dim].nascita.anno, scelta);

in esecuzione il printf mi restituisce una cosa del genere: 1-0-22473635

-- Comment added by ElisabettaDAiutolo on 02 Dec 2002


re: sono TUTTI interi

cosa c'e' nella "rigaint"??? Perche' la sscanf a "occhio" (non ho nulla
per provarla) sembra giusta....

-- Comment added by TizianoMorgia on 02 Dec 2002


re: re: sono TUTTI interi .. (corretta)

add nome cognome data tel .tel. oppure con l'email.... la riga insomma che leggo fino al primo carriage return....

-- Comment added by ElisabettaDAiutolo on 02 Dec 2002


Professor Sterbini, sceglie la prima, la seconda o la terza?

Non sono ancora riuscito a capire quale di questi tre ordinamenti verra' considerato corretto

andrea
Armando
leopoldo
Luca

andrea
leopoldo
Armando
Luca

Armando
Luca
andrea
leopoldo
E' possibile saperlo (come al solito, prima della chiusura dell'HW)? Grazie.

-- Comment added by ArcangeloTripi on 02 Dec 2002


re: io sceglierei la terza.....

Armando
Luca
andrea
leopoldo

-- Comment added by LeonardoParisi on 02 Dec 2002


re(2): sono TUTTI interi

ogni elemento della stringa (un elemento e' diviso dagli spazi) deve avere una
referenza nella stringa di formato della scanf (o sscanf). Quindi se dentro rigaint
hai tutti quegli elementi, la sscanf legge da sinistra e prova
(almeno credo) a mettere nel primo intero "add", nel secondo "nome", nel terzo "cognome".
In piu' non trova i trattini e quindi ti da un po' di problemi....

-- Comment added by TizianoMorgia on 02 Dec 2002


ancora stringona iniziale....

Perchè non usi la versione %[^\n] per leggere la tringa fino al \n ...

... e poi %[a-zA-Z '] per leggere i nomi? (messa tra due " che devono essere presenti nell'input ...)

-- Comment added by AndreaSterbini on 02 Dec 2002


Ordinamento ...

Quello che deriva immediatamente dall'ordine dei codici ASCII ... ovvero quello che si deduce confrontando due caratteri come abbiamo fatto a lezione ... ovvero il più facile smile

[ma pensate che mi diverta a farvi impazzire? siete masochisti? smile ]

-- Comment added by AndreaSterbini on 02 Dec 2002

Quindi

Armando
Luca
andrea
leopoldo
che e' anche quello che si ottiene usando, ad esempio, strcmp.

Masochista credo proprio di esserlo, visto che ho deciso di implementare la gestione dinamica della memoria.

-- ArcangeloTripi - 02 Dec 2002


re(3): sono TUTTI interi

Tiziano, non è come dici tu.

La scanf esamina l'input controllando che vi appaiano:

  • i caratteri del parametro di formato
  • quando si arriva ad una direttiva (p.es. %d) viene cercato quel tipo di input.

Quindi la stringa di formato "add %s %s %d-%d-%d email %s" cerca di trovare:

  • add <stringa senza spazi> <stringa senza spazi> <intero>-<intero>-<intero> email <stringa senza spazi>
  • A seconda di quale punto riesce ad arrivare la scanf torne il numero di parametri che ha valorizzato
  • quindi, nell'esempio se si ottiene 6 vuol dire che tutta la stringa è stata letta correttamente

-- Comment added by AndreaSterbini on 02 Dec 2002


Ancora su Scanf e sscanf

C'e' qualcuno così gentile da farmi capire come si usano? Io con una scanf mi prendo tutta la riga di comando, poi? queste sscanf come si usano? c'ho provato ma non ci riesco...AIUTO

Io ho in RIGA = "add "Paolo Paolino" Rossi 12-01-1980 tel---+39-06-56546849", se ad esempio volessi prendere "Paolo Paolino" come debbo fare?

AIUTO!!!

-- Comment added by DavideSammartino on 02 Dec 2002


Maledetta gestione dinamica!

Il mio codice mi da un grosso problema che ho casualmente (e drammaticamente) scoperto oggi: se nella mia rubrica sono presenti 2 voci e faccio del sulla prima si impalla! In tutti gli altri casi (0, 1, 3,...1000! voci) è ok. Non riesco a capire a cosa sia dovuto! E' davvero strano.

-- Comment added by GiovanniColombi on 02 Dec 2002


Sort...

ma come si fa a distiguere la chiamata a sort tra quella del nome e quella del cognome? Una sará "sort nome pippo" e l'altra "sort cognome pappo"... oppure in un altra maniera?

-- Comment added by LeonardoParisi on 02 Dec 2002


Quali controlli sull'e-mail?

Immagino che oltre ai controlli sull'e-mail indicati nel testo, se ne debbano prevedere anche altri, perlomeno che non siano contenuti due caratteri'@', che non ci siano due punti non separati da almeno un carattere, che l'indirizzo non termini con un punto, e che invece sia permesso di avere piu' di un punto.

Bisogna anche tenere conto del fatto che i domini di primo livello (la stringa che segue l'ultimo punto, come "it" o "com") sono sempre composti di due o tre caratteri? (almeno cosi' mi pare, non vorrei sbagliarmi)

E' possibile chiarire quali di questi controlli vanno implementati esplicitamente?

-- ArcangeloTripi - 02 Dec 2002


Anche di 4 caratteri :P (vedi .info) e presto anche di piu' frown DANNATO ICANN!!!
Concordo con te Arcangelo, sarebbe utile una lista dei possibili errori (magari anche per il numero di telefono) o quantomento i piu' grossolani, perche' se ci mettiamo di impegno ne possiamo pensare migliaia :P poi professore come ha visto siamo molto fantasiosi !!

-- Comment added by MauroFerrara on 02 Dec 2002


Sort ...

i comandi sort XXX mica prendono un parametro ... ordinano tutta l'agenda in base al campo desiderato ...

Suggerisco di usare la funzione di libreria qsort che vuole come argomenti:

  1. array da ordinare
  2. numero di elementi dell'array
  3. dimensione di un elemento in bytes (usate sizeof)
  4. il nome di una funzione definita da voi:
    • con questo prototipo: int miosort(void * x, void * y)
    • x ed y sono puntatori a due elementi da confrontare (voi fatene il cast al tipo della vostra struct per poterne usare i campi nella funzione)
    • dovete far ritornare un intero:
      • negativo se volete che x<y
      • 0 se li considerate uguali
      • positivo se volete che x>y
E' chiaro che se volete implementare tutti e 3 i sort dovrete definire 3 funzioni

-- Comment added by AndreaSterbini on 02 Dec 2002


quali controlli?

  • date: <fino a 2 cifre>-<fino a 2 cifre>-<fino a 4 cifre>
  • telefoni:---+<fino a 3 cifre che non iniziano per 0>-<fino a 5 cifre che possono iniziare per 0>-<fino a 10 cifre che non iniziano per 0>
  • email:---+<caratteri senza spazio e @>@<caratteri senza spazio e @><punto><caratteri senza spazio, punto e @>
    • lasciamo stare i controlli sul tld o sulla distanza tra i punti ...

-- Comment added by AndreaSterbini on 02 Dec 2002


Ancora su Scanf e sscanf

dovresti usare:
   char nome[31] = {0};
   char cognome[31] = {0};
   char riga[] = "add \"Paolo Paolino\" Rossi 12-01-1980 tel---+39-06-56546849";
   sscanf(riga,"add \"%[^\"\n]\" %s ...",nome,cognome);

-- Comment added by AndreaSterbini on 03 Dec 2002


Domanda

Ma prendo invece per scontato che i comandi add email sort ecc... siano scritti nel modo giusto e che non posso capitare cose del genere emailPippo@38.com oppure addd ecc.... ?

-- Comment added by LeonardoParisi on 03 Dec 2002

Devi individuare gli errori solo se svolgi la parte facoltativa.

-- Comment added by AndreaSterbini on 03 Dec 2002


esempio errato

sulle specifiche del programma lei ha detto:

email/telefono questa parte della voce può contenere in alternativa: l'indirizzo email (una stringa di max 50 caratteri) altrimenti il numero di telefono diviso in: prefisso internazionale (max 3 cifre) prefisso (max 5 cifre) numero (max 10 cifre)

come mai invece in output comunque alla fin fine la pipe del tel compare allo stesso punto dell' output dell' email? quindi anch'esso deve finire a 50?

-- Comment added by CristianoMarra on 03 Dec 2002

email e telefono sono in alternativa e quindi debbono essere stampati nello stessa colonna.

-- Comment added by AndreaSterbini on 03 Dec 2002


Perdita zeri...

Ho difficolta' sulla conversione del numero di tel in interi, infatti (logicamente!!!) perdo gli zeri iniziali!!! Ogni suggerimento e' ben accetto, grazie mille.

-- Comment added by AndreaArtibani on 03 Dec 2002

Io li ho trattati come stringhe, non ho trovato nessun valido motivo per trasformarli in numeri

-- ArcangeloTripi - 03 Dec 2002

Solo per il prefisso della città

-- Comment added by AndreaSterbini on 03 Dec 2002


Inserimento

quando c'e' l'inserimento... si deve uscire solo se la rubrica e' piena? al primo inserimento se ne inseriscono 20 subito?

-- Comment added by ElisabettaDAiutolo on 03 Dec 2002

L'inserimento avviene comunque una riga per volta. La cosa che mi pare piu' logica e' che se ci sono gia' venti elementi in agenda e ne voglio aggiungere un altro, mi stampa "piena" (come da specifica) e torna ad aspettare un altro comando (che potrebbe essere anche un "del"). Nelle specifiche non e' detto che deve uscire.

-- ArcangeloTripi - 03 Dec 2002

Esatto

-- Comment added by AndreaSterbini on 03 Dec 2002


Come vengono effettuate le correzioni automatiche? x Sterbini

Ho realizzato una soluzione dell'homework che, prendendo le linee dell'esempio da tastiera, si comporta esattamente come indicato. Se pero' gli stessi comandi li inserisco in un file ed effettuo la redirezione dello stdin, con

./hw6 <in.txt >out.txt
continua a funzionare correttamente solo si aggiunge nell'ultima linea un comando "fine", altrimenti entra in un loop infinito. Spero che nelle correzioni automatiche venga inserito un'uscita finale.

-- Comment added by ArcangeloTripi on 03 Dec 2002

Certo

-- Comment added by AndreaSterbini on 03 Dec 2002


E' normale credo, se non metti il comando "fine" il programma non ha condizione di uscita... quindi semplicemente rimane in esecuzione smile

-- Comment added by MauroFerrara on 03 Dec 2002

Quello che mi succede non e' proprio normale. Il programma non si limita a rimanere in esecuzione, continua a sparare in out.txt gli ultimi due record. In pochi secondi out.txt e' arrivato a 4 MB. Invece, in modalita' interattiva resta semplicemente in attesa di un input. Se invece l'ultima riga contiene il comando "fine", tutto va regolarmente. Comunque, a me pare del tutto ragionevole che alla fine si fermi l'esecuzione del programma con un bel "fine", appunto.

-- Comment added by ArcangeloTripi on 03 Dec 2002


Motivo valido...

Non ho trovato neanch'io un motivo valido per trasformare il tel in num, forse il motivo valido è che nel testo dell'esercizio è implicitamente specificato!!! smile Quindi che fare???

-- Comment added by AndreaArtibani on 03 Dec 2002

Premesso che, come sempre, ognuno alla fine fa come gli pare, e nessuno si prende responsabilita' per le scelte degli altri, credo che si debba ragionare in termini di quello che e' chiesto esplicitamente nelle specifiche, e degli output attesi. Se rispetto le specifiche e ottengo l'output atteso, che problema c'e'?

-- Comment added by ArcangeloTripi on 03 Dec 2002

Nessuno vi ha chiesto di usare interi ... smile

-- Comment added by AndreaSterbini on 03 Dec 2002


Scanf

la scanf funziona una sola volta... ossia la seconda volta prende lo stesso input della prima.. pur avendo pulito i buffer fflus stdin oppure anche con fflush null... mi arrendo.... basta

-- Comment added by ElisabettaDAiutolo on 03 Dec 2002

Hai "consumato" il carattere \n per passare alla riga seguente?

Non ti arrendere!!!

-- Comment added by AndreaSterbini on 03 Dec 2002


Qualcuno.......

Qualcuno mi spiega meglio gli errori che ci possono essere sull'email? Che non l'ho capito da come l'ha detto il prof sopra.... grazie

-- Comment added by LeonardoParisi on 03 Dec 2002

basta che tu controlli che l'email contenga un solo '@' nessuno spazio e almeno un punto a destra dello '@'

-- Comment added by AndreaSterbini on 03 Dec 2002


SCUSATE ULTIMO DUBBIO!

Bisogna fare qualke controllo sul telefono? nn mi sembra ke sia scritto nel testo dell'esercizio! cmq sia io l'ho dichiarato tutto il telefono char!

-- Comment added by AndreaSantoro on 03 Dec 2002

guarda sulla domanda Quali controlli

uff.. niente sort 10 minuti sono proprio pochi!

che qualcuno mi spedisce la Qsort (velocemente) ? big grin

Al prox Homework Seven!

ciao laura


Che bello smile

Allora so giá che dei test non li supereró in quanto la parte di sort sotto win98 di m**** funziona mentre sotto linux no..... maledetto bill........ e con il sort non funziona manco una parte di prox......ora io con chi me la devo prendere con bill con me o con linux o con tutti quelli geniacci del cavolo che non sanno fare un cavolo di ansi C uguale su tutte le piattaforme!!!!! aaahhhhhhhhhhhhhh......... ok basta mi sono sfogato.... cmq prof quando arrivano i risultati del Hwork4?!

-- Comment added by LeonardoParisi on 03 Dec 2002


E dopo cosa ci aspetta?

Spero solo che l'argomento del prossimo homework non sia "Riscrivete il kernel di Linux"...

-- Comment added by ArcangeloTripi on 04 Dec 2002


ecco la mia soluzione:

printf("il kernel di Linux\n"); smile

-- Comment added by LauraRavagli on 04 Dec 2002


Speriamo che arrivi presto...

...l'hw7. Per fare questo, e non sono sicurissimo del funzionamento visto che
non ho potuto fare troppi test per esaurimento del tempo disponibile, ci ho messo
un po' pero' ho imparato molte cose (spero!).
Ringrazio il prof. per la correzione sul funzionamento della scanf (e mi scuso con
Elisabetta per averle fornito informazioni sbagliate) e ringrazio
Arcangelo che mi ha tirato fuori dall'autunnale torpore esponendo(e inplicitamente
suggerendomi) di effettuare i test con il buon vecchio file di testo (fino a quel
momento andavo "a mano"...) smile

-- Comment added by TizianoMorgia on 04 Dec 2002


Mi sono arresa... SI ! frown

sono stata fino alle 23 ieri sera a fare prove con questa maledetta scanf

nel main ho provato sia cosi'

main() { char riga[MAXLEN]; while(1) { scanf("%[^\n]\n",riga);

che cosi'..

scanf("%[^\n]",riga);

NON ESCE !! rimane appesa.... santi argv e arg......

-- Comment added by ElisabettaDAiutolo on 04 Dec 2002


Ciao Elisabetta, credo che il tuo problema sia che non scarichi STDIN, quindi rimane memorizzata l'ultima riga che hai fornito :\ ... alcune delle possibili soluzioni potrebbero essere: fflush(FILE *stream) che pero' sembra avere problemi con linux, alternativamente c'e' gets( char *buffer ) che pero' warna alla compilazione e poi fgets(char *string, int n, FILE *stream) che sembra assolvere il suo dovere... Mi dispiace averti potuto rispondere solo oggi frown

-- Comment added by MauroFerrara on 04 Dec 2002


scusa eli,

io non ho usato la scanf perchè la discussione andava troppo per le lunghe,

però credo che la tua scanf sia una specie di "non accettare il ritorno a capo"

(che poi credo ancora che sia giusto così: scanf("%[^\\n]",riga);)

è normale che rimane appesa , perchè non sa quando deve uscire visto che lo \n non lo considera

-- Comment added by LauraRavagli on 04 Dec 2002


Proroga

Avete consegnato veramente in pochi (57) ... per cui credo sia giusto darvi una proroga fino a venerdì.

scanf

Il problema è che ti rimane il carattere \n nell'input. Ti conviene usare (dalla seconda scanf in poi) scanf("\n%[^\n]",riga);

-- Comment added by AndreaSterbini on 04 Dec 2002


scanf ..the last...

quando ho detto che rimane appesa sono stat imprecisa... la successiva scanf mi prendeva il buffer della prima... (la scanf deve rimanere appesa).... ho provato con fflush(stdin) e con fflush(NULL)... poi vari mem set.. non credete che non ci abbia dedicato tempo.. non e' nel mio carattere vi assicuro... la delusione e' enorme ma non per il compito quanto per me... potevo usare altri 10.00 modi.. ma se si deve familiare con la struct, union e enum.... mi attengo... tutto qui.. scusate lo sfogo.. ho preferito non consegnare... pero' volevo testare a modo le functions a cui hoi dedicato maggior parte del mio we....

-- Comment added by ElisabettaDAiutolo on 04 Dec 2002


continuo allora...

all'inizio facio una SCANF per acquisire lo stringone....

while(1) { fflush(stdin); scanf("%[^\n]\n",riga);

poi eseguo successive SSCANF dello stringone da cui prendo le variabili...

sscanf(riga,"\n%s",comando);

mi succede che devo dare due volte il comando affiche' venga eseguito....

-- Comment added by ElisabettaDAiutolo on 04 Dec 2002


prova a scrivere:

scanf("%[^\n]",riga); // prima riga
while(1) {
   // processa le righe
   scanf("\n%[^\n]",riga);  // leggi le prossime
}

-- Comment added by AndreaSterbini on 04 Dec 2002


Homework Glasnost (semi-OT)

Visto che per risolvere questo hw (e molto probabilmente anche per i successivi)
si possono applicare moltissime soluzioni, per la scadenza del 6 e' possibile
aggiungere un check per autorizzare la pubblicazione del proprio esercizio?
Alcuni gia' li pubblicano sulla propria homepage, ma cercare in tutti gli user
diventa un'operazione abbastanza lunga...
PS: io da parte mia non li ho ancora pubblicati sulla mia hp sia perche' aspettavo
il famoso check sia per una questione di tempo (che cerco di recuperare in tutti i modi! :-)).
Cmq appena posso li pubblichero'...sempre che interessino a qualcuno! :-)
PPS: ci pensavo ora, se non si fa in tempo ad aggiungere il check si potrebbe
creare una pagina con la lista di chi pubblica i propri esercizi sulla propria hp?
Cosi chi vuole edita la pagina e si aggiunge alla lista.

-- Comment added by TizianoMorgia on 04 Dec 2002


Perche' cosi' pochi?

Voglio azzardare una risposta alla domanda posta nella pagina di Programmazione 1, ed e' una risposta molto semplice: questi esercizi mi sembrano un po' troppo difficili per dei principianti, (e diventano sempre piu' difficili) e l'ultimo in particolare era davvero impegnativo.

Parlo per me, anche se sono una matricola ho gia' una certa esperienza, a torto o ragione non mi considero un principiante, ma l'ultimo esercizio mi ha richiesto quasi quattro giorni a tempo pieno per essere risolto (lunedi' mi sono ritrovato a programmare fino alle tre e mezzo di notte), e non ho avuto nemmeno tempo per metterlo in bella copia o per effettuare dei test approfonditi (e per fortuna la mia esperienza mi aveva permesso di fiutare la faccenda, e di partire con il necessario anticipo). E' vero che ho scelto una soluzione piu' difficile di quella che impiegava un array di strutture, ma ripeto che secondo me questo homework era troppo difficile. E, se posso permettermi di formulare un giudizio, e' un peccato, perche' il meccanismo degli homework, unito a twiki, per il resto e' molto ben congegnato, e riesce a catturare l'attenzione. La mia domanda scherzosa piu' sopra sottintendeva proprio questo. Mi scuso con Sterbini se mi sono permesso di formulare dei giudizi, ma l'ho fatto con buone intenzioni.

-- Comment added by ArcangeloTripi on 04 Dec 2002


COME SARA LA PROVA SCRITTA DI PROGRAMMAZIONE???

chissa che esercizio dovremmo fare per la prova scritta di programmazione! ci vuole minimo una settimana per risolvere e nn del tutto gli homework del prof! avremo anke li tutto questo tempo x la consegna? nn abbiamo mica solo programmazione come esame!ma anche ARCHITETTURA, LOGICA E CALCOLO DIFFERENZIALE! che nn mi sembrano per niente facili! alla fine qualkuno dovremmo abbandonarlo e farlo---+ in la! e poi stiamo solo al 1 anno e mi sembra di aver iniziato gia a correre senza aver mai camminato! speriamo bene x i prossimi esercizi! CMQ VADA RIPETO KE NN ESISTE SOLO PROGRAMMAZIONE! CI SONO ANCHE ALTRE MATERIE! O SI FA L`UNA O SI FANNO LE ALTRE! e sentendo le voci di corridoio la gente adesso sta lasciando programmazione xke impiega troppo tempo a fare gli esercizi, cosa ke noi non abbiamo! oltre ad imaparare ci sono anche altri interessi! scusa prof del mio sfogo! era una cosa ke volevo dire! ciao

-- Comment added by AndreaSantoro on 04 Dec 2002


per andrea santoro

tra le materie che hai nominato ti sei scordato anche lingua inglese

-- Comment added by CristianoMarra on 04 Dec 2002


ci sono anch'io !

D'accordo con Arcangelo,

non faccio molto testo perchè non seguo e quindi molte cose mi risultano---+ difficili da capire (tipo fflush(stdin); chi l'aveva mai sentito??)

non conosco il C ma sono abituata a programmare e quindi posso riuscire a gestire meglio gli esercizi con i relativi test che devono superare.

però ci metto anch'io talmente tanto a fare gli homework che il libro non l'ho praticamente aperto ( e mi ritrovo a scrivere - compilare - correggere in un loop infinito e per niente educativo).

Credo che ogni esercizio dovrebbe avere una sola problematica per volta, in modo da capirla e poterne discutere.

-- Comment added by LauraRavagli on 04 Dec 2002


HomeworkGlasnostPoll ...

Mi piace l'idea di lasciare completamente libera la pubblicazione dei propri esercizi (il che risolve anche la questione della privacy perchè potete pubblicare gli esercizi dopo aver tolto i vostri dati) ...

Ecco pronta la pagina: HomeworkDegliStudenti

-- Comment added by AndreaSterbini on 04 Dec 2002


Difficoltà degli esercizi ...

OK, è chiaro che ho chiesto troppo (e me ne scuso).

Ho una proposta: per riuscire a fare un esercizio sulle liste linkate ed uno sugli alberi, vogliamo distribuire i prossimi 2 o 3 esercizi su un periodi di tempo più lungo? (arrivando se necessario fino a befana?)

Io farei in modo di seguirvi usando twiki.

-- Comment added by AndreaSterbini on 04 Dec 2002


Re: Difficoltà degli esercizi ...

Grazie smile !!! Anche io ho avuto problemi a risolvere gli esercizi, pur avendo accumulato un'esperienza nel campo della programmazione modesta in termini di tempo, seppur amatoriale. Infatti del 6 non sono riuscito a fare il sort della parte facoltativa proprio per mancanza di tempo, ero quasi giunto alla soluzione e la mezzanotte era passata da poco frown ... Colgo l'occasione per chiedere se posso ri-consegnare l'esercizio comprensivo di tutta la parte facoltativa entro il nuovo termine di consegna ...

-- Comment added by MauroFerrara on 04 Dec 2002


Davvero?

Ma che davvero c'è anche inglese? Cos'è? smile

Cmq professore mi sa che non è che vengono chiesti tempi più lunghi da quello che ho capito, ma esercizi un po più facilini perchè molta gente fino ad ora non ha mai usato neanche un linguaggio di programmazione, tipo me smile

-- Comment added by DavidVulpetti on 04 Dec 2002


Ri-consegnare

Dato che i termini di consegna sono stati etesi potete estendere e ri-consegnare il vostro esercizio

-- Comment added by AndreaSterbini on 05 Dec 2002


Esercizi più facili ...

Beh, la facilità di un esercizio dipende anche dal tempo che si ha a disposizione per svolgerlo ... smile

A parte scherzi ... cercherò di darvi un esercizio più facile. (anche se vorrei cercare di farvi usare una lista ed un albero, prima di finire il corso ...)

Ricordatevi, però, che le versioni facoltative sono ... facoltative! smile

-- Comment added by AndreaSterbini on 05 Dec 2002


Dico la mia ! smile

il tempo? considerando che lavoro, che seguo tre corsi, che ho una famiglia da mandare aventi e che devo stare attenta al bersaglio mobile il tempo non mi basta mai... Vorrei sottolineare un concetto in cui credo fermamente: se lo scopo di questi HW e' sviscerare e conoscere argomenti specifici sono disposta a continuare a farci mezzanotte tutti i giorni... ma se lo scopo e' superarli.. invece di questa str@@@ di scanf uso fgets e consegno stasera stessa....

altro suggerimento corretto e' allungare sicuramente i tempi.. ossia gli intervalli tra un compito e l'altro.. io rosico a non consegnare e a non fare un programma nel massimo delle mie possibilita'... ecco... ma oltre a tutto il resto e lavoro anche gli esoneri di logica pending... insomma!

-- Comment added by ElisabettaDAiutolo on 05 Dec 2002


... lo scopo degli esercizi

Effettivamente lo scopo degli esercizi è di farvi imparare cercando di svolgere qualcosa che sia anche un pochino interessante.

Mi viene spontaneo di darvi esercizi che coprano un paio di argomenti per volta (per esempio scanf e structs), anche se questo può sembrare a prima vista controproducente ...

Ciascuno degli obiettivi (ad. es. il riconoscimento dei comandi da stdin e la manipolazione dell'array delle voci) può essere affrontato separatamente (per esempio scrivendo prima lo scheletro del programma che riconosce solo i comandi e stampa solo cosa ha riconosciuto).

Spero che questo vi abbia fatto capire quanto sia importante riuscire a suddividere il problema in sottoproblemi più semplici da sviluppare e da testare.

Certo, il tempo a disposizione è stato insufficiente, e per questo l'ho immediatamente allungato non appena me ne sono accorto (e mi pare che gli esercizi prima del 6° non fossero poi così terribili).

Il tempo a disposizione si può allungare solo se gli esercizi vengono diminuiti in numero o ridotti di difficoltà.

Se siete d'accordo direi di finire il corso limitandoci a svolgere ancora solo 2 esercizi e di prenderci 2 settimane per ciascuno (questo necessariamente pone la consegna del'8° durante le feste).

Spero che il riconoscimento dei comandi da stdin ora sia chiaro ... visto che sarà necessario per gli esercizi 7° ed 8°.

-- Comment added by AndreaSterbini on 05 Dec 2002


obiettivi?

.. guardi dei 57 che hanno consegnato quanti hanno usato fgets.... e vediamo se l'obiettivo e' stato raggiunto....

-- Comment added by ElisabettaDAiutolo on 05 Dec 2002


Dipende ...

Sterbini docet: "Spero che questo vi abbia fatto capire quanto sia importante riuscire a suddividere il problema in sottoproblemi più semplici da sviluppare e da testare."

Verissimo ...... ma a volte, se i sottoprogrammi sono troppi (da fare in tot di tempo), nel singolo contesto, potrebbero funzionare benissimo ma uniti tutti in un programma potrebbero riscontrare diversi problemi d'incompatibilità tra di loro ..... come ad esempio mi è successo che c'ho messo un bel pò per fare interagire bene il programmino che gestisce il nome e cognome in input con gli altri ....

Per Elisabetta : io l'avevo consegnato unsando lo scanf .(meno male che è stato allungato il tempo .... avevo lasciato in sospeso , per mancanza di tempo, diversi bugs che avevo trovato)

-- Comment added by AndreaBandino on 05 Dec 2002


... obiettivi ...

Più o meno 12 su 57 hanno usato gets o fgets, e 9 getchar o getc e 44 scanf ... smile

-- Comment added by AndreaSterbini on 05 Dec 2002


Re: obiettivi

Mi aggiungo al commento di Elisabetta (sperando di non alzare polemiche o altro). Anche io lavoro e non mi e' molto facile riuscire a capire fino a che punto si e' arrivati a lezione, dico questo perche' e' normale che esistano diversi modi per implementare un algoritmo a seconda degli strumenti che si hanno. E qui che, almeno per me, nasce il problema. Infatti se non so dove si e' arrivati e' implicito il dubbio se sia "corretto" utilizzare strumenti che ancora non sono stati spiegati. Altre volte mi ritrovo che su twiki vengono citate cose tipo: fgets(appunto), fflush, etc... che mi lasciano quella sensazione tipo: <> oppure <>. Io alla fine mi concentro sul testo, e nello specifico sulla parte obiettivi, e cerco di utilizzare quello che viene citato seguendo il ragionamento: "Se il Prof. assegna un'esercizio dicendo di utilizzare queste funzioni/dati/etc.. allora significa che si puo' fare!". Quindi in questo caso, anche se non e' stata proprio una passeggiata, ho utilizzato solo scanf, sscanf, printf e mi pare di ricordare una sprintf (se mi ricordo bene e se esiste! smile ). Concludo associandomi all'idea di fare solo altri due ex con un po' piu' di tempo, specialmente se servono per l'esame! smile

-- Comment added by TizianoMorgia on 05 Dec 2002


Chiarimenti su fgets...

Deduco dal commento di Elisabetta che la funzione fgets() non e' vista di buon occhio. Inizialmente io per scaricare i dati da stdin usavo fflush(), poi pero' ne ho scoperto gli effetti negativi su linux (ho cercato su google e ho notato di non essere il solo ad avere il problema), allora sono arrivato alla conclusione di scaricarlo usando la fgets ed una variabile di appoggio. Per fare il parsing dell'input ho comunque usato sscanf/strtok ... Posso sapere cosa c'e' di male ? smile ... Comunque non mi costa niente provare a fare come ha indicato il professore ed eliminare quel metodo, forse poco ortodosso, di liberarsi dei dati di stdin. Io sto facendo questi esercizi per imparare il piu' possibile e non credo che usando un fgets() finale abbia rovinato questo 'goal' smile .
Concludo accodandomi alla proposta del professore di fare solo due esercizi, in modo che ci sia piu' tempo per discuterci sopra dato che l'esame e' alle porte.

-- Comment added by MauroFerrara on 05 Dec 2002


Sempre riguardo la fgets

Ok ho fatto l'hack al programma e ho rimosso la fgets..
Questo era prima
[supergate@mordor homework6]$ cat homework6.c | wc -l
    573
[supergate@mordor homework6]

Questo invece e' dopo
[supergate@mordor homework6]$ cat homework6-scanf.c | wc -l
    572
[supergate@mordor homework6]$ 

Insomma NON USANDO la fgets viene una riga in meno (spero comunque di ottimizzarlo dato che e' immenso). Ora sono proprio sicuro: usando quella fgets finale non ho imparato meno, ora pero' so una cosa in piu' smile

-- Comment added by MauroFerrara on 05 Dec 2002


Difficoltà esercizi e obiettivo

Vorrei esprimere il mio umile parere al riguardo. Innanzitutto sono pienamente d'accordo con l'idea del prof. di concederci 2 settimane per il 7 e l'8. (apprezzo la sua disponibilità "in rete" durante le feste. non tutti i prof. cercano di venire così incontro agli studenti).

Il 6 è stato bello duro e anche adesso ho qualche dubbio. Però credo che il tempo (molto!) che gli dedicato sia stato fruttuoso. Forse domani non consegnerò una versione perfetta e completa, ma adesso ne so ceratamente più di prima. Credo che l'obiettivo primario non dovrebbe essere quello di fare l'ex giusto così poi me becco 2 punti in---+, ma testare le nostre capacità e accrescere le conoscenze in vista dell'esame. Ci si preoccupa troppo di fare l'esercizio giusto, completo e ordinato.

Il livello di difficoltà credo che sia aumentato in modo esponenziale dopo il 3. Io informatica l'ho fatta a scuola e mi ricordo problemi molto---+ semplici.Mi immagino che quelli che un compilatore non sapevano cosa fosse abbiano lasciato stare e si siano messi a giocare a DOOMsmile!

Speriamo che i prossimi sia un po' più facili!

-- Comment added by GiovanniColombi on 05 Dec 2002


Logica

ok, qualcuno può spiegarmi il motivo logico del comportamento di questo pezzo di codice


char prova[100];

scanf("%[^\n]",prova);            //mi fa immettere stringa1
printf("hai immesso:%s\n",prova); //stampa stringa1

scanf("\n%[^\n]",prova);          //mi fa immettere stringa2
printf("hai immesso:%s\n",prova); //stampa stringa2

scanf("%[^\n]",prova);            //come se non esistesse   -> ho tolto lo \n davanti a %
printf("hai immesso:%s\n",prova); //stampa stringa2

grazie,

Laura


Indovina chi risponde smile

Dopo il secondo scanf NON hai letto il \n che si trova ancora nello stream di stdin (perche' glielo hai detto esplicitamente). Anche con la terza scanf gli dici esplicitamente di NON leggere quel carattere, quindi semplicemente non assegna nulla a prova e termina. (Con il \n che si trovava ancora sullo stdin, ma ormai non gliene frega piu' niente a nessuno).

-- ArcangeloTripi - 06 Dec 2002


ci avrei scommesso smile

vediamo se ho capito: lo \n della prima scanf viene rigurgitato dalla 2° scanf

grazie a quello \n messo prima di %,ok?

a questo punto mi chiedo: c'è un modo per pulire questo stream di stdin dopo ogni scanf per non avere sorprese nelle scanf successive?

laura


Non ho capito

la gets() si puo usare o no?

-- Comment added by LeonardoParisi on 06 Dec 2002


A proposito dello \n ... visto che la scanf precedente ha lasciato lo \n nell'input per leggere la riga successiva e' necessario consumarlo ... per cui basta che tutte le scanf successive alla prima abbiano come primo carattere lo \n. (Se invece si mettesse lo \n in fondo a tutte le scanf succederebbe che per leggere l'ultima riga ci sarebbe bisogno di un <enter> in piu' ... il che non andrebbe bene)

gets ... io ho usato scanf ma potete usare quello che volete ...

obiettivi e uso di argomenti non spiegati ... negli esercizi io do' dei punti di riferimento coi quali e' possibile svolgere l'esercizio ... ma naturalmente chi vuol usare altri strumenti e' libero di farlo (oppure di chiedere se ci sono controindicazioni).

-- Comment added by AndreaSterbini on 06 Dec 2002


x Laura

Se vuoi consumare l' ultimo \n che resta sullo stream stdin , probabilmente la cosa piu' semplice e' di usare un singolo getchar()

Avrei aggiunto il commento dopo il tuo, ma se ci prove twiki fa le bizze.

-- Comment added by ArcangeloTripi on 06 Dec 2002


Se vuoi inserire un commento vicino alla domanda basta che editi la pagina.

-- Comment added by AndreaSterbini on 06 Dec 2002


X il prof!

Scusi prof x la domand ake nn riguarda il 6 ex! volevo chiederle perche nella correzione del primo esercizio ha sistemato solo i programmi di quelli che non passavano la compilazione ed invece nn ha guardato x niente ki aveva messo uno \n in piu nella stampa dei dati personali? d'altronde era il primo esercizio! e x uno \n risultano tutti no! sia piu comprensivo grazie!

-- Comment added by AndreaSantoro on 06 Dec 2002


Per "sistemare" i programmi che falliscono per un \n li dovrei editare uno per uno ... sono troppi.

-- Comment added by AndreaSterbini on 06 Dec 2002

Capisco che saranno anche troppi come dice lei prof quei programmi ma si tratta sempre di un "innocuo" \n ! quanto tempo le puo togliere? al contrario invece a noi puo togliere qualcosa se dovessimo andare bene alla prova scritta! speriamo bene! smile ciao


sort compleanno

il sort del compleanno va stampato in questa maniera: mese-giorno o giorno-mese, cioè 10-31 oppure 31-10? grazie

-- Comment added by CristianoMarra on 06 Dec 2002


il sort del compleanno non va stampato, ma eseguito ...

devi ordinare le voci dell'agenda in ordine crescente di mese-giorno

sarà la stampa successiva a stampare le voci

-- Comment added by AndreaSterbini on 06 Dec 2002


vorrei consegnare ma...

con questo homework colleziono le cose piu' strane.... i nomi composti ad esempio..come detto e ridetto metto lo spazio tra le parentesi quadre.... tipo:

sscanf(rigaint," %[a-zA-Z ]", &R[dim].nome);

quando metto il comando in esecuzione

add "pape rino" pluto 12-12-1233 email eee

mi acquisisce i campi vuoti !

non ne posso piu'

-- Comment added by ElisabettaDAiutolo on 06 Dec 2002


vorrei consegnare ma (il ritorno)

come da suggerimento del Prof metto a zero i campi della struttura entro le functions... aggiungo un SOLO nome nella rubrica e quando stampo una serie di caratteri spuri escono come in un secondo record...

giuro che ho azzerato i campi

-- Comment added by ElisabettaDAiutolo on 06 Dec 2002


la stringa della scanf sopra è sbagliata ... ti sei dimenticata delle virgolette invece di sscanf(rigaint," %[a-zA-Z ]", &R[dim].nome); è meglio sscanf(rigaint," \"%[a-zA-Z ]\"", &R[dim].nome);

(hai anche messo uno spazio come primo carattere ... controlla se è necessario)

-- Comment added by AndreaSterbini on 06 Dec 2002


C'e' un altro errore ... dato che nome è (immagino) un array di caratteri, non ne devi calcolare il riferimento ... quindi TOGLI IL '&' ! smile

-- Comment added by AndreaSterbini on 06 Dec 2002


grazie

smile

-- Comment added by ElisabettaDAiutolo on 06 Dec 2002


ma l'apostrofo....

che voglio sia accettato lo metto nelle parentesi quadre.... nulla !!!

ho provato a metterci anche un back slash davanti..

-- Comment added by ElisabettaDAiutolo on 06 Dec 2002


vogliamo provare a usare una soluzione un po' radicale? prova "\"%[^\"\n]\"" (ovvero tutto tranne '"' e '\n')

-- Comment added by AndreaSterbini on 06 Dec 2002


ma così non funziona per i nomi senza spazi! Non ci sto capendo---+ nulla! Forse perchè è un po' tardino per togliersi gli ultimi dubbi... devo consegnare!!!

-- Comment added by GiovanniColombi on 06 Dec 2002


Urgente

scusate ma nel prox mi sono accorto che non quadra una cosa... almeno da come ho capito io che bisogna implementarlo!!!! se uno fa la chiamata a prox 11-10 e non ci sta nessuno che compie gli anni in quel giorno noi dobbiamo cercarlo in avanti quindi 12-10 poi 13-10 ecc... poi si cambia mese 1-11 , 2-11 ecc e bisogna considerare l'anno ciclico.... ma se uno alla fine compie gli anni il 9-10 in questo caso viene scarto e viene messo per ultimo.... e non sarebbe piu' giusto controllare in dietro fino al mese di gennaio e poi andare avanti

-- Comment added by LeonardoParisi on 06 Dec 2002


RE: urgente

credo (o almeno io l'ho pensata cosi') che un comando chiamato "prox" ritorni il primo compleanno che verra' da una data immessa. Calcolando che noi, non andiamo indietro nel tempo smile e che (almeno per quanto mi riguarda) non sappiamo prendere la data di sistema, il comando "prox" serva a simulare una sorta di "promemoria" per i compleanni che verranno. Spero di aver capito, e nel caso averti risolto, il problema...naturalmente se e' giusto quello che ho detto (non vorrei ripetere errori tipo la descrizione del funzionamento della scanf smile ).

-- Comment added by TizianoMorgia on 06 Dec 2002


Errore evitabile (me tapina) ?

seguendo le indicazioni della risposta Quali controlli per la parte facoltativa di controllo:

email:---+<caratteri senza spazio e @>@<caratteri senza spazio e @><punto><caratteri senza spazio, punto e @> 

avevo capito che dopo chiocciola e punto non ci potessero essere altri punti (non in realtà ma nell'esercizio)... risultato catastrofico perchè stampo email errata sull'email di sterbini...

e sgrunc!

-- Comment added by LauraRavagli on 07 Jan 2003


Dispiace anche a me frown

-- Comment added by AndreaSterbini on 07 Jan 2003


dont' worry, l'importante è partecipare alle battaglie e vincere la guerra smile

-- Comment added by LauraRavagli on 07 Jan 2003


... immagina che la guerra non esista ... (vedi "Imagine ..." di John Lennon)

-- Comment added by AndreaSterbini on 07 Jan 2003


però non è detto che:

it's easy if u try (...my war is the C examination...)

-- Comment added by LauraRavagli on 07 Jan 2003


Hwork6

scusi ma perche' in " 1-add-semplice.in " poi in out deve stampare a un certo punto piena?! non l'ho capito.... non doveva stampare piena solo quando la lista era piena ovvero 20 voci? e li sono invece solo 2 ?!

grazie e ciao

-- Comment added by LeonardoParisi on 07 Jan 2003


Ciao Leonardo!
Guarda la sequenza di input:

prima stampa ma la rubrica e' vuota..
adda due nomi e li stampa
poi ne adda 19... pero' al 21esimo add la rubrica ha gia' 20 voci... quindi stampa piena
poi stampa e vengono listate le prime 20 voci inserite

Quindi quando ha stampato piena era perche' ha provato ad inserire una 21esima voce...! Spero di esserti stato utile ( e spero di essere stato poco contorto smile ).
(ho spostato la domanda smile )

-- Comment added by MauroFerrara on 07 Jan 2003

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

<tre spazi>---+++<spazio>Titolo della domanda
Testo della domanda
Edit | Attach | Watch | Print version | History: r272 < r271 < r270 < r269 < r268 | Backlinks | Raw View | Raw edit | More topic actions
Topic revision: r272 - 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