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
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
-- 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
)
-- 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
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!
-- 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
-- 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
)
-- 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
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"
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
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
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?
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
-- 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
-- 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??
-- 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?
-- 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
-- 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
) 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:
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
- ) 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.....??
- ) ho fatto una chiamata alla funzione isdigit() che fa parte penso di ctype.h si puó usare?
- ) se quando ha tempo mi risponde pure alla domanda "Errori.... " mi fa un piacere....
-- Comment added by
LeonardoParisi on 30 Nov 2002
- compattate la agenda ad ogni add
- 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?
(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!!!!!!!!
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...
-- 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
- ) x la stampa devo usare come parola chiave "print" o "stampa"?
- ) x la data se io inserisco 02-02-1961 in output è giusto avere 2-2-1961 ???
- ) 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]=
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]=
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
-- 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!
- )nel comando "prox" la stampa va effettuata subito o devo ridigitare il comando print???
- )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???
- )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
- la prima che hai detto (rileggiti il testo)
- 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 ).
- se nessuna voce corrisponde al nome da cancellare devi stampare nessuna (rileggiti il testo )
--
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
, 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
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
[ma pensate che mi diverta a farvi impazzire? siete masochisti? ]
-- 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'
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:
- array da ordinare
- numero di elementi dell'array
- dimensione di un elemento in bytes (usate sizeof)
- 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
-- 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!!!
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 ...
-- 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) ?
Al prox Homework Seven!
ciao laura
Che bello
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");
-- 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"...)
-- Comment added by
TizianoMorgia on 04 Dec 2002
Mi sono arresa... SI !
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
-- 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
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
!!! 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
... 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'è?
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
-- 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 ...
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!
-- Comment added by
AndreaSterbini on 05 Dec 2002
Dico la mia !
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 ...
-- 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! ). Concludo associandomi all'idea di fare solo altri due ex con un po' piu' di tempo, specialmente se servono per l'esame!
-- 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 ? ... 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' .
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'
-- 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
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
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! 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 '&' !
-- Comment added by AndreaSterbini on 06 Dec 2002
grazie
-- 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 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 ).
-- 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
-- Comment added by AndreaSterbini on 07 Jan 2003
dont' worry, l'importante è partecipare alle battaglie e vincere la guerra
-- 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 ).
(ho spostato la domanda )
-- Comment added by MauroFerrara on 07 Jan 2003
No such template def TMPL:DEF{PROMPT:before}
- Ricordatevi di dare un titolo alla vostra domanda come segue:
<tre spazi>---+++<spazio>Titolo della domanda
Testo della domanda