Nokioteca [Nokia] Forum: [mshell] Le Matrici Impazzite - Nokioteca [Nokia] Forum

Salta al contenuto

Pagina 1 di 1
  • Non puoi iniziare una nuova discussione
  • Non puoi rispondere a questa discussione

[mshell] Le Matrici Impazzite Vi piacciono i giochetti strani?

#1 L   lento 

  • Senior Member
  • PuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 637
  • Iscritto: 03 settembre 2008
  • Cellulare:E72

Inviato 15 luglio 2009 - 19:31

Salve a tutti....nonostante la crisi economica del settore in cui opero oggi sono riuscito a rosicchiarmi una mezzoretta di spensieratezza...

Come molti sanno in mShell gli array possono diventare bidimensionali sfruttando la capacità del semplice array di incorporare altri array.
(E' la stessa cosa che fà Java per gestire gli array a più dimensioni.)

Ovvero:
Se dichiaro un array: primo=[0,1,2] e successivamente lo inglobo in un altro secondo=["ciao",primo]
il secondo è diventato un array quasi bidimensionale infatti posso scrivere: print secondo[1][1] e stamperà 1 che è il valore
contenuto in primo[1] .

Bene! ora date un occhiata a questo:
m=null
p=null
m=["ciao",p]
p=[0,1,m]
m[1]=p
print p[2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1] <-- potete allungarlo quanto volete!
Stamperà -> [0,1,[...<2>]]


Ma cosè una matrice a dimensione infinita? chi sa rispondere?..... :thumbs:
Si accettano anche cavolate, banalità ecc..L'importante è partecipare....

Messaggio modificato da lento il 16 luglio 2009 - 07:32

0

#2 L   madhacker 

  • Senior Member
  • PuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 527
  • Iscritto: 16 settembre 2006
  • Cellulare:N95-2,5800

Inviato 16 luglio 2009 - 09:47

lo vuoi sapere perchè non lo sai o per metterci alla prova??
se non lo sai ti spiego che hai messo su una specie di matrice intrecciata andando a richiamare dall'inizio il 3o elemento, ovvero p[2] che corrisponde ad un'altra matrice. andando poi a richiamare [1] di p[2] che è uguale a m andrai a richiamare l'elemento 2, ovvero m[1], che è uguale nuovamente a p e così via fino all'infinito ...
se il tutto lo inserissi in un while infinito incepperesti in un ciclo di ridondanza che molto probabilmente verrebbe stoppato dal sistema stesso.

ps: che bel buon giorno che dai :thumbs:

Messaggio modificato da madhacker il 16 luglio 2009 - 09:47

0

#3 L   xMetallicax 

  • Senior Member
  • Gruppo: Developer
  • Messaggi: 953
  • Iscritto: 24 luglio 2006
  • Località:Saporito (CS)
  • Cellulare:6720
  • Firmware:031.022

Inviato 16 luglio 2009 - 09:58

su una qualunque macchina (che sia un pc o un cellulare non cambia niente :thumbs:) ricorda che la parola 'infinito' non esiste :)
come ha detto madhacker puoi fare una cosa del genere mettendo tutto in un ciclo ma dopo qualche secondo riceverai sicuramente l'errore OutOfMemory :)
0

#4 L   madhacker 

  • Senior Member
  • PuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 527
  • Iscritto: 16 settembre 2006
  • Cellulare:N95-2,5800

Inviato 16 luglio 2009 - 10:47

abbiamo superato il test? :o
0

#5 L   memoryn70 

  • Millennium Member
  • Gruppo: Developer
  • Messaggi: 2112
  • Iscritto: 02 maggio 2007
  • Cellulare:Nokia N70
  • Firmware:5.0609.2.0.1

Inviato 16 luglio 2009 - 12:31

Visualizza MessaggixMetallicax, il 16/07/2009 - 10:58, ha scritto:

su una qualunque macchina (che sia un pc o un cellulare non cambia niente :thumbs:) ricorda che la parola 'infinito' non esiste :D
come ha detto madhacker puoi fare una cosa del genere mettendo tutto in un ciclo ma dopo qualche secondo riceverai sicuramente l'errore OutOfMemory :D


Infatti in una macchina non esiste l'infinito...è ovvio che con la ram di un telefono hai voglia quante matrici crei...ma non saranno mai infinite

Però aspetta..magari trattandosi di un linguaggio flessibile, magari ...cioè aspetta mi collego ad una cosa.

In python esiste range e xrange. range crea proprio una lista di numeri da, a, per. Mentre xrange è una cosa virtuale, usata nei cicli for per ottimizzarli. Se si fa xrange(28328382283) non crea tutta una lista ma rimane una cosa virtuale...Forse quel array p è anch'esso gestito cosi.

FAKE: Va bene ho detto una cavolata e me ne rendo conto!! :D

Messaggio modificato da memoryn70 il 16 luglio 2009 - 12:34

0

#6 L   xMetallicax 

  • Senior Member
  • Gruppo: Developer
  • Messaggi: 953
  • Iscritto: 24 luglio 2006
  • Località:Saporito (CS)
  • Cellulare:6720
  • Firmware:031.022

Inviato 16 luglio 2009 - 14:24

Visualizza Messaggimadhacker, il 16/07/2009 - 11:47, ha scritto:

abbiamo superato il test? ;)

se si allora lento ci offre un caffè fatto dal suo cell :shifty: (tanto è infinito, sicuramente saprà fare il caffè :crying_anim02:)
0

#7 L   madhacker 

  • Senior Member
  • PuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 527
  • Iscritto: 16 settembre 2006
  • Cellulare:N95-2,5800

Inviato 16 luglio 2009 - 15:31

@memory: credo che l'esempio al primo post di lento sia più un richiamo ad un array che in quella posizione richiamata va a richiamare un altro array che a sua volta, nella posizione richiamata, va a richiamare il precedente array e così via; quindi credo che sia qualcosa di diverso rispetto a range e xrange.
0

#8 L   lento 

  • Senior Member
  • PuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 637
  • Iscritto: 03 settembre 2008
  • Cellulare:E72

Inviato 16 luglio 2009 - 20:37

Visualizza MessaggixMetallicax, il 16/07/2009 - 15:24, ha scritto:

se si allora lento ci offre un caffè fatto dal suo cell :thumbs: (tanto è infinito, sicuramente saprà fare il caffè :D)

Con molto piacere eccovi il caffè:
 
caffeallinfinito=true;

while caffeallinfinito do
  print "Ecco una tazza fumante di caffe' per xMetallicax.";
  print "Ecco una tazza fumante di caffe' per madhacker.";
  print "Altro caffe? Ok ora vi servo:";
end;

Bè non proprio all'infinito....Finchè vi regge la batteria del cell.!. :rolleyes:

0

#9 L   lento 

  • Senior Member
  • PuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 637
  • Iscritto: 03 settembre 2008
  • Cellulare:E72

Inviato 16 luglio 2009 - 21:08

Visualizza Messaggimadhacker, il 16/07/2009 - 10:47, ha scritto:

ps: che bel buon giorno che dai :)

Prima di tutto grazie di aver risposto, Scusa! non era mia intenzione diffonndere pessimismo.

Quote

lo vuoi sapere perchè non lo sai o per metterci alla prova??

Non è mia intenzione Mettere alla prova nessuno, Per concepire una cosa del genere dovrei avere la presunzione di saperne di più!.
In verità Alter come al solito, se trova un modo per incasinarsi, o ingarbugliare le cose ci si butta a capo fitto!. poi spetta a mè capirci qualcosa! :thumbs: .
Personalmente mi sono fatto un idea su come funziona ste cosa, ma volevo sentire il parere di altri, senza annoiarli rendendo il tutto più stimolante e magari ci nasce qualche spunto utile a tutti :D .

Quote

se non lo sai ti spiego che hai messo su una specie di matrice intrecciata andando a richiamare dall'inizio il 3o elemento, ovvero p[2] che corrisponde ad un'altra matrice. andando poi a richiamare [1] di p[2] che è uguale a m andrai a richiamare l'elemento 2, ovvero m[1], che è uguale nuovamente a p e così via fino all'infinito ...

Concordo con tè su questa logica, ma quello che chiedevo è: Perchè permette di scrivere la matrice (in realtà a due dimensioni) come se fosse
una matrice a dimensioni (quasi!! :rolleyes: xMetallicax) infinite?.

Quote

se il tutto lo inserissi in un while infinito incepperesti in un ciclo di ridondanza che molto probabilmente verrebbe stoppato dal sistema stesso.

Questa non lò capita dove lo piazzi il ciclo while per incrementare la lunghezza delle parentesi quadre?

A presto...
0

#10 L   lento 

  • Senior Member
  • PuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 637
  • Iscritto: 03 settembre 2008
  • Cellulare:E72

Inviato 16 luglio 2009 - 21:53

Visualizza MessaggixMetallicax, il 16/07/2009 - 10:58, ha scritto:

su una qualunque macchina (che sia un pc o un cellulare non cambia niente :lol:) ricorda che la parola 'infinito' non esiste :)
come ha detto madhacker puoi fare una cosa del genere mettendo tutto in un ciclo ma dopo qualche secondo riceverai sicuramente l'errore OutOfMemory :D

Ciao xMetallicax' Grazie di aver risposto.
Come hò appena risposto a 'madhacker' Questa non lò capita dove lo piazzi il ciclo while per incrementare la lunghezza delle parentesi quadre?
Per via dell'infinito non ne sò molto....Diciamo che essendo legato al ragionamento, e non al mondo fisico...secondo mè ci può stare....o almeno rende bene
l'idea di una cosa che sia estensibile e non si vede la fine.

Già che ci sono ti bombardo! così impari... :lol:
p=null
m=["a",p]
m[0]=m
print m
[[...<2>],null]
->m[0]=0
print m
->[0,null]

Come mai nell'assegnare a m lo 0 la matrice m non è stata distrutta?
Risposta : La matrice non è stata distrutta perchè in m[0] si è copiata una matrice nuova? perciò lo 0 ha distrutto solo la copia?

Allora perchè in questo esempio non vale la stessa regola?
m=null
p=null
m=["ciao",p]
p=[0,1,m]
m[1]=p
print p[2][1]
->0,1,[...<2>]]
p[2][0]="a"
print p
->[0,1,[...<2>]]
print m
->[a,[...<3>]]  <----Perchè ha modificato la matrice m di origine?

Domande inquietanti!!!! :wacko:

Messaggio modificato da lento il 16 luglio 2009 - 22:07

0

#11 L   lento 

  • Senior Member
  • PuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 637
  • Iscritto: 03 settembre 2008
  • Cellulare:E72

Inviato 16 luglio 2009 - 22:03

Visualizza Messaggimemoryn70, il 16/07/2009 - 13:31, ha scritto:

Però aspetta..magari trattandosi di un linguaggio flessibile, magari ...cioè aspetta mi collego ad una cosa.
Se si fa xrange(28328382283) non crea tutta una lista ma rimane una cosa virtuale...Forse quel array p è anch'esso gestito cosi.
FAKE: Va bene ho detto una cavolata e me ne rendo conto!! :lol:


'memoryn70' Ben vengano cavolate come queste!, E' l'idea che mi son fatto anchio!

credo che mShell print p[2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1] legga il tutto ed elimini le parentesi quadre
ridondanti trasformando il tutto nella sua logica trascrizione print p[2][1]

O se sbaglio..... potremo spartirci la medaglia di cartone! :wacko: .
0

#12 L   madhacker 

  • Senior Member
  • PuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 527
  • Iscritto: 16 settembre 2006
  • Cellulare:N95-2,5800

Inviato 17 luglio 2009 - 09:08

Visualizza Messaggilento, il 16/07/2009 - 23:03, ha scritto:

'memoryn70' Ben vengano cavolate come queste!, E' l'idea che mi son fatto anchio!

credo che mShell print p[2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1][2][1] legga il tutto ed elimini le parentesi quadre
ridondanti trasformando il tutto nella sua logica trascrizione print p[2][1]

O se sbaglio..... potremo spartirci la medaglia di cartone! :lol: .


esattamente... credo che mshell non stampi volta per volta tutti i valori nelle parentesi quadre, ma va a stampare solo l'ultimo, in quanto quelli di prima sono tutti "richiami" ad altre matrici. trovandosi di fronte all'ultima parentesi, lui si aspetterebbe di dover stampare un valore tipo numero o testo, ma invece si trova a dover stampare un oggetto che in realtà richiama ad un altro array.

Quote

Già che ci sono ti bombardo! così impari... laugh.gif
CODICE
p=null
m=["a",p]
m[0]=m
print m
[[...<2>],null]
->m[0]=0
print m
->[0,null]

Come mai nell'assegnare a m lo 0 la matrice m non è stata distrutta?
Risposta : La matrice non è stata distrutta perchè in m[0] si è copiata una matrice nuova? perciò lo 0 ha distrutto solo la copia?

perchè credo che vada distrutta così
m=0

e non
m[0]=0
che invece assegna il valore 0 al primo elemento dell'array

Messaggio modificato da madhacker il 17 luglio 2009 - 09:17

0

#13 L   lento 

  • Senior Member
  • PuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 637
  • Iscritto: 03 settembre 2008
  • Cellulare:E72

Inviato 18 luglio 2009 - 16:44

Visualizza Messaggimadhacker, il 17/07/2009 - 10:08, ha scritto:

perchè credo che vada distrutta così
m=0

e non
m[0]=0
che invece assegna il valore 0 al primo elemento dell'array

Non mi sembra completa la tua spiegazione: Dato che non stiamo parlando di problemi spirituali dove Fede, e l'inspiegabile padroneggiano.

Si tratta di capire come l'interprete considera e risolve le istruzioni che gli passiamo,
Solo riuscendo a comprendere la logica matematica del'algoritmo potremo dire: Io con gli Array e le matrici di mShell ci faccio quello che voglio!. :thumbs:

Altrimenti siamo dei maghetti che buttano lì delle parole magiche, perché l'abbiamo visto fare ad altri e a volte fanno quello che ci si aspetta.
Allora ripartendo da questo esempio fatto a suo tempo, facciamo queste variazioni:
m=["a","b"]
m[0]=m
m[0]=0
print m
->[0,"b"]


Ripartiamo con modifiche....
m=["a","b"]
m[0]=1 questa istruzione sembra che la veda così:
La presenza delle parentesi quadre dopo il nome del'array e la seguente presenza del'Uguale
Indica a mShell la volontà di assegnare un valore ad un elemento del'array.
O meglio indica che le operazioni seguenti sono assegnazioni applicate agli elementi del'array

m[0]=1
Distruggi l'attuale valore e tipizzazione contenuto nella locazione m[0] e sostituiscilo con il valore e la tipizzazione presenti dopo il segno uguale
Distrugge "a" elimina tipizzazione carattere e pone 1 e lo tipizza a numerico

m[0]=m
In questo caso: distrugge 1 e la tipizzazione numerica nel voler assegnare il nuovo valore e tipo
si accorge che è un puntatore alla matrice m perciò assegna il valore numerico che punta a m e pone la tipizzazione a puntatore.

m[0]=0
In questo caso come detto sopra cé il nome del'array seguito dalle parentesi quadre e dal segno uguale
quindi lo interpreta come un azione di assegnazione da svolgere sul singolo elemento del'array.
Perciò: distrugge il puntatore e la tipizzazione esistente alla cella 0 e vi assegna il nuovo
valore 0 (Senza andare a vedere a cosa puntava detto puntatore! il che avrebbe portato a distruggere la matrice m).
print m
->[0,"b"]


In questa altra situazione:
p=null
m=["ciao",p]
p=[0,1,m]
m[1]=p
print p[2][1]
->0,1,[...<2>]]
p[2][0]="a"
print p
->[0,1,[...<2>]]
print m
->[a,[...<3>]]
<----Perchè ha modificato la matrice m di origine?

p[2][0]="a"
Nome array seguito da parentesi quadra non indica a mshell di eseguire un assegnazione in un suo elemento
perché dopo la parentesi quadra di chiusura non cè il segno = ma un ulteriore parentesi quadra aperta!
che indica solo una cosa...alla locazione p[2] cè un puntatore ad un altro array!!

Perciò: preleva il puntatore va a vedere che matrice è (m) a la sostituisce nel'espressione diventando così:
p[2][0]="a" -> diventa m[0]="a" e qui esegue quanto esposto sopra assegnando la lettera "a".

Vi sembra logico il tutto? sono riuscito a capire l'algoritmo che mShell applica agli array? :sad:

che dite?

Ovviamente:
m=0 penso che non sia indispensabile spiegare cosa fà in mshell.

Se vi ho annoiato chiedo Venia. :(

Anche se ritengo fondamentale padroneggiare gli array in mShell essendo una delle parti più potenti di questo linguaggio.
Se non capisco i meccanismi sopra riportati, mi ci vedete a gestire una matrice multidimensionale che al suo interno contiene dati,funzioni,altri array che richiamano altre funzioni e dati????. ;)

In caso non foste d'accordo e mi chiamaste in giudizio come direbbe Perry Mezzon (Un Perry Mason poco sveglio!) Signor Giudice.....MI OPPONGO!..... :mumble:

Messaggio modificato da lento il 18 luglio 2009 - 16:51

0

#14 L   Nick_7 

  • Senior Member
  • PuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 339
  • Iscritto: 20 novembre 2008
  • Località:Luna
  • Cellulare:Omnia HD
  • Firmware:I8910XXJB1

Inviato 09 maggio 2010 - 10:43

ragazzi, avrei bisogno di una mano con queste matrici che fanno impazzire me... :angel:
Vorrei creare una matrice quadrata di ordine n ed inserire i valori all'interno di essa per farle trovare il valore del determinante...


use array as a, ui

n=ui.query("di ordine:","matrice",0);

a=a.create(n,n,0);

 for i=0 to n*n do
   e=ui.query("a"+i,"ins",0);
   a=a.insert(a,i,e);
print a;
 end;

0

#15 L   Nick_7 

  • Senior Member
  • PuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 339
  • Iscritto: 20 novembre 2008
  • Località:Luna
  • Cellulare:Omnia HD
  • Firmware:I8910XXJB1

Inviato 26 maggio 2010 - 19:51

Ho finalmente risolto il mio problema facendogli considerare le matrici quadrate come lineari ed inserendo le formule per trovare il determinante fino all'ordine 4...non è il massimo della compattezza ma per ora per me è già un gran bel risultato :shifty: Vi allego lo script:

Download file


0

Condividi questa discussione:


Pagina 1 di 1
  • Non puoi iniziare una nuova discussione
  • Non puoi rispondere a questa discussione