Homepage  Il progetto dsy.it è l'unofficial support site dei corsi di laurea del Dipartimento di Scienze dell'Informazione e del Dipartimento di Informatica e Comunicazione della Statale di Milano. E' un servizio degli studenti per gli studenti, curato in modo no-profit da un gruppo di essi. I nostri servizi comprendono aree di discussione per ogni Corso di Laurea, un'area download per lo scambio file, una raccolta di link e un motore di ricerca, il supporto agli studenti lavoratori, il forum hosting per Professori e studenti, i blog, e molto altro...
In questa sezione è indicizzato in textonly il contenuto del nostro forum


.dsy:it. .dsy:it. Archive > Didattica > Corsi A - F > Fondamenti di architettura e programmazione
 
[Indentazione] Problema!!!
Clicca QUI per vedere il messaggio nel forum
dany12185
Qualcuno è riuscito ad allineare correttamente queste maledette stringhe???...anche quando metti degli if annidati o degli if dentro un while???

SpiritKJ
Forse. Devo solo vedere se quello che ho pensato è implementabile :D

spenk.85
ahe hai pensato?+ teste sono meglio di una

spenk.85
da un'analisi approfondita del main l'indentazione esatta dovrebbe essere:
code:
DECLARE s; DECLARE arg1; arg=n; IF(arg1<=0) .....PRINT "Primo argomento invalido"; ELSE .....DECLARE ag2; .....arg2=y; .....IF(arg2<=0) ..........PRINT "Secondo argomento invalido"; .....ELSE ..........WHILE(arg1!=0) ...............arg1-=1; ...............s+=1; ..........WHILE(arg2!=0) ...............arg2-=1; ...............s+=1; ..........PRINT s;

Giusto?!

sandrino83
teoricamnte si ma come si fa a ordinare al programma di lasciare tot spazi ogni volta?

Drowne
niente, edit

ARIEL
Originally posted by Drowne
code:
DECLARE s; DECLARE arg1; arg=n; IF(arg1<=0) ..PRINT "Primo argomento invalido"; ELSE ..DECLARE ag2; ..arg2=y; IF(arg2<=0) ..PRINT "Secondo argomento invalido"; ELSE ..WHILE(arg1!=0) ....arg1-=1; ....s+=1; WHILE(arg2!=0) ..arg2-=1; ..s+=1; ..PRINT s;


x me è cosi...


Io metterei il PRINT finale sotto al WHILE.....

ARIEL
ah mi sono accorta anche i WHILE tutti allineati

spenk.85
Originally posted by sandrino83
teoricamnte si ma come si fa a ordinare al programma di lasciare tot spazi ogni volta?

questo è il problema! non mi viene in mente nulla per il momento! dai ragazzi...manca l'ultima cosa!

Lyanne
Aspettiamo tutti fiduciosi qualche ispirazione....

ARIEL
il tempo stringe!!!!!!

Skioda86
:pc:
Ragazzi....Oggi mentre cazzeggiavo, mi è venuta una brillante idea e...
Io ve la butto lì...poi vediamo se qualcuno ci arriverà....


Prof Malchiodi :teach: - Non c'è scritto esplicitamente dove utilizzarlo, ma questo non significa che non vada utilizzato...
leggi bene qual'è il compito attribuito al metodo clone() e poi rileggi
tutto il testo del progetto
fino a che non trovi i punti in cui IMPLICITAMENTE viene chiesto di
usarlo.


Sapete quel bellissimo metodo che non serve ad un pip ma che ci ha fatto creare dicendomi di usarlo....QUANDO MEGLIO VI SEMBRA...?!!!?
ecco....:whisper:Mi sembra arrivato il momento di tirarlo fuori dal cilindro....!!!! :)


GOOD WORK!!!!:D:D:D

ARIEL
No scusa ma il clone() guarda che va usato nei costruttori! Non serve per l'indentazione.....

spenk.85
Originally posted by SpiritKJ
Forse. Devo solo vedere se quello che ho pensato è implementabile :D

Dicci che hai pensato, magari tutti riusciamo a farlo! Anche perchè il tempo è tiranno.

Skioda86
IL TEMPO STRINGE....E.....MANCA SOLO QUELLA MALEDETTA IDENTAZIONE!!!!

SE ANDIAMO AVANTI DI QUESTO PASSO, MI SA' CHE RIMANIAMO FERMI!!!

NON HO ASSOLUTISSIMAMENTE IDEA DA DOVE PARTIRE, ANCHE PERCHE' NE HO GIA' PROVATE MOLTE E IL RISULTATO SEMPRE QUELLO!! SE CREO UN METODO NUOVO PER AGGIUSTARLE, ME LE SPOSTA UN PO' COME VUOLE LUI. AVEVO AVUTO UNA BRILLANTE IDEA STAMATTINA, VOLENDO CONFRONTARE LE PAROLE CHIAVE DELLA PROGRAMMAZIONE E IL PUNTO IN CUI ARRIVA LA COMPILAZIONE, MA....SONO SORTI ALCUNI PROBLEMI CON LE IDTRUZIONI SEMPLICI!!!

MANNAGGIA!!

PENSATE,.....PENSATE......PENSATE...!!!

Drowne
scusate... per l'identazione:

Non basta mettere una variabile nell'hashtable che possa valere 0, 2, 4 o 6 e poi fare un for con quella variabile di spazi vuoti in ogni toString? Quando lanciamo un if o un while incrementiamo di 2 la variabile nell'hashtable, ecc...

Skioda86
Drowne

scusate... per l'identazione:

Non basta mettere una variabile nell'hashtable che possa valere 0, 2, 4 o 6 e poi fare un for con quella variabile di spazi vuoti in ogni toString? Quando lanciamo un if o un while incrementiamo di 2 la variabile nell'hashtable, ecc...


Sono d'accordo con te. Anche io l'avevo pensato di inserire delle variabili String di spazi, ma il proble ma sorge, non quando si inizia a mettere gli spazi, ma quando è ora di smettere di usarli!!!!
Come fai a sapere quante istruzioni metterà dentro ad un if o ad un while?? Se vogliamo identare il nostro programma, ok, si può fare perchè sappiamo la lunghezza di tutte le istruzioni, ma se dobbiamo estenderlo a qualsiasi programma, penso che il ragionamento non tenga più...!!! Almeno......x la mia piccola testolina con poco cervello!!!! :roll:

spenk.85
Esatto! il problema è creare qualcosa di utilizzabile per qualsiasi main!
Il problema più grosso sorge quando ad esempio, mi becco una Itarazione.
Quasta stampa :
code:
WHILE (cazzi e mazzi) ....istr

questo perchè il toString di Iterazione e di Selezione prevedono che vengano aggiunti due spazi.
Però se l'istruzione corpo di Iterazione per esempio, è composta da una Sequenza(quindi più istruzioni) il risulatato sarebbe questo:
code:
WHILE (ricazzi e rimazzi) .....istr1; istr2;

questo è il vero macello!

Skioda86
Esatto! il problema è creare qualcosa di utilizzabile per qualsiasi main!
Il problema più grosso sorge quando ad esempio, mi becco una Itarazione.
Quasta stampa :

code:
WHILE (cazzi e mazzi)
....istr


questo perchè il toString di Iterazione e di Selezione prevedono che vengano aggiunti due spazi.
Però se l'istruzione corpo di Iterazione per esempio, è composta da una Sequenza(quindi più istruzioni) il risulatato sarebbe questo:

code:
WHILE (ricazzi e rimazzi)
.....istr1;
istr2;


questo è il vero macello!


COMPLIMENTS X LA SPIEGAZIONE! SON CON TE!
MAGARI SONO ANCOR PIU' CON TE SE SAPESSI COME RISOLVERE IL PROBLEMA!!!:)

SE ALMENO CI AVESSE LASCIATO USARE LE PARENTESI GRAFFE!!! Inizio e fine cliclo delimitate dallo stringTokenizer e/o dalla subString!!!!:(

Ho provato ad utilizzare i 2 metodi sopraelencati nel nostro caso, ma il problema di DOVE FARLI FINIRE non si risolve!!!
Quasi quasi lo consegno così e basta!

Drowne
Dopo mangiato provo quello che ho pensato, e dovrebbe andare anche quando c'è sequenza :D

lucafiamma
aiuto!sono nella me*da..sono rimasto da solo e devo assolutamente finire questo progetto!!qualcuno che ha già finito ed è di animo veramente buono potrebbe aiutarmi...Io ho già scritto tutto ma correggo un errore e ne spunta un altro...Vi prego una mente illuminata potrebbe darmi qualche dritta! Grazie Mille ve ne sarò grato per sempre!!

Skioda86
Drowne

Dopo mangiato provo quello che ho pensato, e dovrebbe andare anche quando c'è sequenza :D


...Pendo dalle tue labbra come la birra DUFF...

PRIMA: :birrozza: DOPO: :pazzo:

Vorgoth
A me invece da:

code:
DECLARE s; DECLARE arg1; arg1 = 5; IF (arg1<=0) PRINT "Primo argomento invalido"; ELSE DECLARE arg2; arg2 = 10; IF (arg2<=0) PRINT "Secondo argomento invalido"; ELSE WHILE (arg1!=0) arg1 -= 1; s += 1; WHILE (arg2!=0) arg2 -= 1; s += 1; PRINT s; 15


con tutte quelle righe vuote....o_____o boh.

sg693322
confrontandomi con qualche compagno di corso ho capito come indentare... solo che nel mio programma indenta in maniera sbagliata... se non riesco a risolvere mi sa che faccio \n(spazio)(spazio)... e se alla discussione mi chiede qualcosa gli rispondarò: e chi ha mai detto di usarlo con altri main???

Drowne
avevo pensato a cose del genere:

if (PIGLIA DALL'HASH == null) nspazi=0; else nspazi=CARICA DALL'HASH;
for(int i=0; i<nspazi; i++){ spazio = spazio + " "; }

return spazio+"DECLARE "+variabile+";\n";

in ogni tostring...


e fare dei put nell'hashtable con "spazio",nspazi+2 negli if e nei while...

sg693322
io l'avevo pensato con un ciclo for e una variabile statica...

sg693322
Ragazzi ero davanti alla soluzione corretta da ore ma pensavo fosse sbagliata... stasera festeggiamo con birra a volontà e r***o libero... alla fantozzi

Drowne
Qualcuno mi conferma se è corretta?


sbrandu
Secondo me il secondo if deve essere allineato sotto arg2=5 per il resto è corretta.. ci dici come hai fatto ad arrivare a quell'output che è già un enorme passo avanti?

Drowne
si hai ragione:

code:
DECLARE s; DECLARE arg1; arg1 = 10; IF(arg1<=0) PRINT ''Primo argomento invalido''; ELSE DECLARE arg2; arg2 = 5; IF(arg2<=0) PRINT ''Secondo argomento invalido''; ELSE WHILE(arg1!=0) arg1 -= 1; s += 1; WHILE(arg2!=0) arg2 -= 1; s += 1; PRINT s; 15

Drowne
Allora...

si possono usare o l'hashtable o una variabile statica.

a uno dei due fai contenere un int che è il numero di spazi che deve dare davanti ad ogni istruzione.

una nuova string, ad esempio SPAZIO=SPAZIO+" "; da mettere in ogni toString tranne in quello di Sequenza, e dovrà essere riempita tramite un ciclo for(int i=0; i<INTdicuiparlavamoprima; i++)

esce una cosa bella complicata...

a seconda delle necessità si fa Nspazi+1 o -1 oppure si lascia pulito e si rimette con un put ( in caso dell'hashtable ) oppure con un'assegnazione ( variabile statica ).

ciauz :D

Skioda86
SI, MA IL PROBLEMA PERSISTE!!!
DEVI SAPERE DOVE METTERE GLI SPAZI!!! E QUINDI DEVI SAPERE IL PROGRAMMA COME VIENE SVOLTO!!!!

SONO DACCORDO CON TE CHE VA BENE CON QUESTO PROGRAMMA, MA SE LO ESTENDIAMO AD UN ALTRO MAIN CON MOLTE PIU' ISTRUZIONI NON VA PIU' BENE!!!

E' QUESTO IL VERO PROBLEMA!!!
PERCHE' ALTRIMENTI BASTAVA METTERE SPAZI OGNI QUAL VOLTA SAPEVI CHE ANDAVANO MESSI!!!!

sbrandu
Grande!
Sarà un lavoraccio ma grazie!

Drowne
Originally posted by Skioda86
SI, MA IL PROBLEMA PERSISTE!!!
DEVI SAPERE DOVE METTERE GLI SPAZI!!! E QUINDI DEVI SAPERE IL PROGRAMMA COME VIENE SVOLTO!!!!

SONO DACCORDO CON TE CHE VA BENE CON QUESTO PROGRAMMA, MA SE LO ESTENDIAMO AD UN ALTRO MAIN CON MOLTE PIU' ISTRUZIONI NON VA PIU' BENE!!!

E' QUESTO IL VERO PROBLEMA!!!
PERCHE' ALTRIMENTI BASTAVA METTERE SPAZI OGNI QUAL VOLTA SAPEVI CHE ANDAVANO MESSI!!!!


...

veramente no... se mi passi un altro main con queste istruzioni te lo dimostro ^_^

Skioda86
Se io al posto di dichiarare 2 variabili in un ciclo while ne dichiaro 5 come fa il tuo programma a sapere quando deve smettere di metterne o meglio...quanti metterne se tu non sai a priori quante istruzioni ci sono dentro ad un while!!!??!!

Drowne
basta mettere un nspazi+2 ad inizio while ed un nspazi-2 a fine while :D semplice

Skioda86
Ma appunto!!! Devi cambiare il codice del programma per farlo andare!!!! Invece 1 kosa fatta per bene è che fai tutte le tue classi e identano da sole senza piu' bisogno di toccare niente!!

Drowne
................ mi sa che non hai capito

il cambio di nspazi lo fai nella classe iterazione e selezione. e glielo fai fare a lui in base alla posizione identata in precedenza.

Skioda86
ok!


facciamo che io dico mentre (....) se(....) 3 istruzioni altrimenti se(...)
alreimenti(...)altre 5 istruzioni

code:
while() e spostati di 2 if() e spostati di 2 ciao ----> ciao ----> come fai a fargli capire che sono 3 che deve identare ciao ----> else <---- while ----> bla ----> bla ----> bla ----> bla ----> bla ----> <---


voresti dirmi che senza toccare il progetto posso anche passargli un main in cui dico
mente (....) fammi solo questo e poi fammi 1altra cosa

code:
while() ciao ----> ciao <----

:)

spenk.85
drowne sei troppo un grande! anche io pome avevo pensato a una cosa simile con il mio amico, ora sappiamo che funza e lo faremo andare!grande!

Ma quando li togli gli spazi?

Drowne
quando chiudi un while, quando c'è l'IF o l'ELSE

Drowne
@ SKIODA:







cosi, no?

ARIEL
scusa ma se hai una sequenza di istruzioni (tipo nella istrSe) come fai a leggere una istruzione alla volta?

Drowne
la sequenza non è da identare infatti.

se fai spazio+sequenza identa solo il primo.

ma una sequenza è composta da un tot numero di istruzioni? Basta identare le istruzioni correttamente ed anche la sequenza sarà identata :D

ARIEL
ok ma come fai a indentare le istruzioni della sequenza?

Vorgoth
Io ho provato il metodo di Drowne (usando una variabile statica) e :evil: come output mi esce:

code:
DECLARE s; DECLARE arg1; arg1 = 5; 15


...e basta :shock:

Non riesco a capire perche' non return proprio, anche sel codice sembra (almeno a me o_o) corretto.

eg. Stampa.toString():
code:
String s = ""; for(int i=0; i<indent; i++) { s = s + " "; } return s+"PRINT "+messaggio+";\n";



Drowne
Esempio

sequenza: {
while quello
if questo
s++
else
s--
}

identi cosi:

spazio=""
if(nspazi!=0) ciclofor di nspazi spazio = spazio+" "

sequenza: {
nspazi + while quello
nspazi=nspazi+2 if questo
nspazinspazi+2 s++
nspazi=nspazi-2 else
nspazi=nspazi+2 s--
nspaziINIZIALI+2 s--
}

la sequenza non è identata, ma il while ( e quello che tira fuori dopo ), l'IF/ELSE, le operazioni di incrementa e decremente, ecc... SI, quindi risulterà identata anche l'intera sequenza.

Questo MOLTO in sintesi... Cmq il succo è questo. :D

Personalmente ho usato l'hashtable, xo si può fare anche con una variabile statica

Drowne
Originally posted by Vorgoth
Io ho provato il metodo di Drowne (usando una variabile statica) e :evil: come output mi esce:

code:
DECLARE s; DECLARE arg1; arg1 = 5; 15


...e basta :shock:

Non riesco a capire perche' non return proprio, anche sel codice sembra (almeno a me o_o) corretto.

eg. Stampa.toString():
code:
String s = ""; for(int i=0; i<indent; i++) { s = s + " "; } return s+"PRINT "+messaggio+";\n";


E' sicuramente un problema dato dalla variabile INDENT.
fai un system out di ident e vedi se varia o meno come vuoi tu...

Vorgoth
Ma è strano che return non dia proprio niente no? Al max dovrebbe darlo con la indentazione sbagliata O_O;

Drowne
più che altro dovrebbe darti errore in compilazione o in esecuzione... Magari vedi con Eclipse in modalità debug cosa e come viene riempito dal tuo programma, cosi vedi se c'è l'errore o meno...

Vorgoth
Ora provo :\ thanks

Vorgoth
Sembra che il toString() non venga mai chiamato, ho provato un temporaneo
code:
public String toString() { return "Hello"; }

e cmq non esce a schermo O_O....boooh.

Drowne
O_O

controlla il toString di sequenza...

SpiritKJ
Ok, quello che ho pensato pare che sia effettivamente implementabile, si tratta di un metodo ricorsivo che necessita di una variabile che definisce il numero degli spazi da lasciare per l'indentazione. Quando una serie di istruzioni è indentata, tutta la serie si sposterà dello stesso numero di spazi + gli spazi della serie stessa, e questo è il concetto di base. In questo modo se la variabile col numero degli spazi da lasciare varia, varierà anche il numero di spazi da lasciare per ogni serie. Sembra complicato perchè a quest'ora è normale che non riesca a esprimermi correttamente. Ah, sembra che questo metodo a lungo andare faccia anche scadere lo yogurt.

EDiT: azz, non avevo visto le 4 pagine di risposte :D

Drowne
Ah, sembra che questo metodo a lungo andare faccia anche scadere lo yogurt.


Concordo, in via preventiva ho prontamente eliminato tutto lo yogurt che avevo in casa...

Mi ha sgasato la coca cola!!!

Vikyg13
A me stampa così:

else
..while(...)
....arg1 -= 1
..s += 1
.while(...)
.....arg1 -= 1
...s += 1
.Print s

I puntini indicano gli spazi, come mai mi risulta così???

Vikyg13
risolto

m410
Drowne ci sei vero...

m410
avrei bisogno di qualche chiarimento

m410
va be la variabile che definisce il numero degli spazi da lasciare per l'indentazione...è una variabile comune a tutte le classi quindi la definisco statica in Istruzione in modo da poter essere modificata da tutte le classi?Poi come li tolgo gli spazi?Insomma non ci ho capito una mazza...per while e if else soprattutto...abbiate pazienza sono un pò lenta...se qualcuno è cosi gentile da spiegarmi bene come si fa sta identazione...

Drowne
io ho usato l'hashtable che, per sua stessa natura nel nostro progetto, è comune a tutte le classi. Allo stesso modo puoi tenere una variabile statica...

in pratica ad ogni riga dopo IF/ELSE fai un for con la variabile statica che ti riempie gli spazi... Devi solo sbatterci un po' ( un bel po' ) la testa contro :(

Powered by: vbHome (lite) v4.1 and vBulletin v2.3.1 - Copyright ©2000 - 2002, Jelsoft Enterprises Limited
Mantained by dsy crew (email) | Collabora con noi | Segnalaci un bug | Archive | Regolamento |Licenze | Thanks | Syndacate