Forum: Italian Ruby user group Consigli sugli array

12d5a4e7ab8e22907b4f712d7fa25041?d=identicon&s=25 Francesco Villafranca (pollopoop92)
on 2015-12-16 18:07
=begin
un saluto a tutti, da qualche giorno ho avuto dei problemi usando gli
array e vorrei avere qualche consiglio su come affrontarli al meglio.
Vorrei sapere se, passando come parametro di un metodo un elemento di un
array, ed elaborandolo all'interno del metodo, posso andare a sostituire
il valore ottenuto con il valore all'interno dell'array che ho preso
come parametro. Piu semplicemente Per esempio avendo una situazione del
genere:
=end

array = [10, 20, 30, 40]

def sommare primo_elemento

puts 'Inserire il numero da sommare al primo elemento'

richiesta = gets.chomp

somma = richiesta + primo_elemento

end

sommare 10

=begin
quindi devo andare a sostituire il valore del primo_elemento dell'array
"10"con il valore dato dalla variabile somma ( se per esempio avremmo
inserito "5") l'array dovra risultare modificato con questi elementi :

[15, 20, 30, 40]

spero di essere stato chiaro e ringrazio tutti quelli che mi daranno una
mano in questa piccola questione

=end
12d5a4e7ab8e22907b4f712d7fa25041?d=identicon&s=25 Francesco Villafranca (pollopoop92)
on 2015-12-16 18:30
=begin
Un altro problema sugli array che ho avuto è qst:
Ho bisogno di trovare un elemento specifico dell'array e trovata una
corrispondenza, lo faccio passare come parametro di un metodo
Esempio:
=end

prodotti = ['pasta', 'pane', 'farina', 'etc']
prezzi = [ 1.00, 2.00, 3.00, 4.00 ]


def spesa alimenti, prezzo

puts 'prezzo del ' + alimenti + ' = ' + prezzo.to_s

puts 'Quanto prodotto ti serve?'

richiesta = gets.chomp.to_i

totale = richiesta * (prezzo.to_i)

puts' Totale: $ ' + totale.to_s
end

# Apertura programma

puts 'Quali prodotti intendi acquistare ?'
operazione = gets.chomp

if operazione == 'pasta'

spesa prodotti[0], prezzi[0]

elsif operazione == 'pane'

spesa prodotti[1], prezzi[1]

elsif operazione == 'farina'

spesa prodotti[2], prezzi[2]

else

puts 'operazione non disponibile'

end


=begin
E' ovvio che così avro una ripetizione di codice assurda quindi devo
trovare il modo per far cercare uno specifico elemento nell'array, che
corrisponda al valore che inserisco nella variabile "operazione" e non
appena viene trovato lo deve passare come parametro del metodo.

Ho provato ad usare alcuni metodi della classe "enumerable"
ma senza successo, il metodo include non sembra essere utile in questo
caso e non so piu cosa fare. Ho cercato per giorni nei documenti ma non
riesco a trovare la soluzione sarei molto felice se qualcuno mi
aiutasse.
=end
12d5a4e7ab8e22907b4f712d7fa25041?d=identicon&s=25 Francesco Villafranca (pollopoop92)
on 2015-12-17 17:54
=begin Finalmente sto riuscendo a farcela ma ho un problema chiamando un
metodo che per il primo turno non da errore mentre se lo richiamo altre
volte da qst errore:

 no implicit conversion from nil to integer (TypeError)
 l'esempio è qst:

=end

def cercaprezzo prod, prezzo_reparto

trovaindice = @reparto1.index(prod)

@prezzo = prezzo_reparto [trovaindice]

end


@categoria = [ @reparto1 =['pasta', 'pane', 'farina', 'etc'], @reparto2
= ['carne', 'latte', 'uova'] ]


prezzi = [@prezzi_reparto1= [ 1.00, 2.00, 3.00, 4.00 ], @prezzi_reparto2
= [ 5, 6 ,7 ] ]

def spesa alimenti, prezzo

puts 'prezzo del' + alimenti + ' = ' + prezzo.to_s

puts 'Quanto prodotto ti serve?'

richiesta = gets.chomp.to_i

totale = richiesta * (prezzo.to_i)

puts' Totale: $ ' + totale.to_s
end

puts 'Quali prodotti intendi acquistare ?'
operazione = gets.chomp

if @reparto1.include? operazione

cercaprezzo operazione, @prezzi_reparto1
spesa operazione, @prezzo

elsif @reparto2.include? operazione

cercaprezzo operazione, @prezzi_reparto2
spesa operazione, @prezzo

puts 'ciao'

end


#non capisco perche si aspetta un NIL apposto di un intero
12d5a4e7ab8e22907b4f712d7fa25041?d=identicon&s=25 Francesco Villafranca (pollopoop92)
on 2015-12-18 17:55
Buona sera a tutti , a poco a poco sono riuscito a risolvere alcuni dei
tanti quesiti, uno di questi però non riesco proprio a risolverlo.

Devo far leggere al programma un file di testo contenente un elenco di
Array. Fin qui ci siamo, il problema è che leggendo il contenuto, il
programma non riesce ad interpretarlo per quello che è cioè una serie di
array.
Non capisco se lo vede come stringa oppure vede effettivamente gli
oggetti
che contiene. qualcuno saprebbe darmi una risposta?
12d5a4e7ab8e22907b4f712d7fa25041?d=identicon&s=25 Francesco Villafranca (pollopoop92)
on 2015-12-21 19:27
Salve a tutti qualcuno sà spiegarmi perchè il comando delete non prende
questo argomento

File.delete ('cartella/*.txt')

mentre se specifico il nome di ogni file lo prende come ad esempio:

File.delete ('cartella/file1.txt', 'cartella/file2.txt', etc ... )
D6a77703786410d59bb68696c3f5b9ac?d=identicon&s=25 Giuseppe Vetri (gvetri18)
on 2015-12-22 03:31
Francesco Villafranca wrote in post #1180113:
> Salve a tutti qualcuno sà spiegarmi perchè il comando delete non prende
> questo argomento
>
> File.delete ('cartella/*.txt')
>
> mentre se specifico il nome di ogni file lo prende come ad esempio:
>
> File.delete ('cartella/file1.txt', 'cartella/file2.txt', etc ... )


Ciao francesco! Anche io sto imparando Ruby non sono un senior developer
ma provero ad aiutarti mi sa che stai chiedendo alla funzione delete di
cercare un File chiamato "*.txt" Se questo file non si trova, non lo
prendera. Prova a fare una concatenazione in questa forma:

File.delete('cartella/file#{num}.txt")

Allora, questo #{num} indica una concatenazione in teoria quello che fa
e aggiungere un testo a un'altro, allora se abbiamo 2 file per essempio
facciamo uso delle strutture repetitive, che faranno la stessa cosa una
e un'altra volta finche finisce il ciclo o trova un errore.

Qua andiamo avanti dal'file numero 1 al file numero 2.

Prima cerca il file con il numero 1 la seconda volta cerchera un file
con il numero 2 e cosi via

class Leggi_file
  for num in 1..2
    File.delete("cartella/file#{num}.txt")
  end
end

Nel tuo caso puoi modificare il 2 per il numero che vuoi, spero ti aiuti
12d5a4e7ab8e22907b4f712d7fa25041?d=identicon&s=25 Francesco Villafranca (pollopoop92)
on 2015-12-22 13:10
Innanzitutto grazie mille per il consiglio mi può sempre tornare utile,
il problema xò è che i file non hanno un nome statico cioè :
File1, File2, File3 .

nel mio caso hanno questi nomi :

subtotale_2015-12-22_12-24-45_+0100, subtotale_2015-12-22_13-00-45_+0100

cambia sempre il timestamp.
a me basterebbe un metodo con il quale eliminare tutto il contenuto
della cartella .

Utilizzando File.delete nn funziona
Ho provato a eliminare l'intera cartella ma neanche questo funziona
perche  si tratta di una cartella piena.

Non so davvero piu cosa fare ho googlato in giro ma nessuno parla di
come svuotare una cartella.
12d5a4e7ab8e22907b4f712d7fa25041?d=identicon&s=25 Francesco Villafranca (pollopoop92)
on 2015-12-22 14:52
Ci sono quasi riuscito con il tuo script, guarda qui :

@lista_file = Dir['percorso/*.txt'] #cioè tt i file con estensione txt

@numero_file = @lista_file.map { |v| v.to_i }# cioè il n.dei file
presenti

def elimina

for num in 0..10  # ecco qui dovrei sostituire a 10 il numero_file

for num in 0..@numero_file # il metodo for xò accetta solo interi anche
se la variabile numero_file contiene un intero

File.delete("#{@lista_file[num]}")

# qui passo uno per uno il contenuto dell'array lista_file al metodo
delete solo che bisogna sapere il numero esatto delle posizioni
assegnate nell'array. Il problema è che nn riesco a far passare al
metodo for la variabile numero_file , cioè bisogna trasformare una
variabile in un intero per poi passarlo al metodo for.

end
end


elimina
D6a77703786410d59bb68696c3f5b9ac?d=identicon&s=25 Giuseppe Vetri (gvetri18)
on 2015-12-22 15:53
Ok, bravo a provarci. Allora, ti consiglio di utilizzare la struttura
while, questa continuara a ripetere la stessa azione mentre sia vero il
condizionale, la struttura generalmente e questa:

while condizionale do
  #Un paio di righe di codice
end

Nel tuo caso puoi provare a fare:

i=0 #Facciamo i=0 cosi sappiamo da dove iniziare
while i <= numero_file do #Continua a ripetere questo finche i e menore
o uguale a numero_file
File.delete("#{@lista_file[num]}")
end

Al momento non sono a casa percio non lo posso provare. Anche ti posso
consigliare questa pagina:

http://www.tutorialspoint.com/ruby/ruby_loops.htm

E questa : http://www.tutorialspoint.com/ruby/ruby_input_output.htm

Tanti saluti
This topic is locked and can not be replied to.