Lezione del 7/3/2014¶
Riassuntino `stringhe`:
File 3.1_intro_strings.rb
1#!/usr/bin/env ruby
2#-------------------------------------------------------------------------#
3# Esercitazioni in Laboratorio per il Corso di #
4# Fondamenti di Informatica e Calcolo Numerico, AA 2013/2014 #
5# #
6# Autori: Enrico Bertolazzi e Carlos Maximiliano Giorgio Bort #
7# Dipartimento di Ingeneria Industriale, Universita` di Trento #
8# Sito web: http://www.ing.unitn.it/~bertolaz/ #
9# #
10# Contatti: enrico.bertolazzi@unitn.it, cm.giorgiobort@unitn.it #
11# #
12# Copyright (c) 2014 E.Bertolazzi e C.M. Giorgio Bort #
13#-------------------------------------------------------------------------#
14
15str = "Ciao mondo!"
16puts str
17
18# stringhe interpolate e non
19str_ni = 'questa e` \n una stringa \t non interpolata'
20puts str_ni
21p str_ni # una stampa piu` completa
22# p str_ni equivale a puts str_ni.inspect
23puts str_ni.inspect
24puts ""
25str_i = "questa e` \n una stringa \t interpolata"
26puts str_i
27
28
29# interpolare variabili nelle stringhe
30eta = 5
31nome = 'rex'
32str_ni = 'il mio cane #{nome} ha #{eta} anni (non interpolata)'
33str_ni = "il mio cane #{nome} ha #{eta} anni (si interpolata)"
34puts ""
35
36# concatenare stringhe
37str = 'ora'
38puts str
39str += ' concateniamo' # equivale a str = str + ' sono'
40puts str
41str << " le"
42puts str
43str.concat " stringhe"
44puts str
45puts ""
46
47# il punto esclamativo: alcune funzioni sono disponibili ANCHE
48# nella forma con il punto esclamativo finale.
49# In tal caso, le operazioni effettuate sulla variabile sono
50# applicate direttamente su essa.
51# Convertiamo una stringa da minuscolo a maiuscolo
52str = "convertimi a maiuscolo"
53puts "str.upcase #{str.upcase}"
54puts "str #{str}" # str e` minuscola
55
56puts "str.upcase! #{str.upcase!}"
57puts "str #{str}" # str e` maiuscola
58puts ""
59# NOTA: per vedere le funzioni di default che e` possibile
60# usare con le stringhe e` possibile digitare nell'irb: puts String.methods.sort
61
62# ripetere una stringa
63str = "ciao "*5
64puts str
65puts "\n"*2
Riassuntino `Array`
File 3.2_intro_array.rb
1#!/usr/bin/env ruby
2#-------------------------------------------------------------------------#
3# Esercitazioni in Laboratorio per il Corso di #
4# Fondamenti di Informatica e Calcolo Numerico, AA 2013/2014 #
5# #
6# Autori: Enrico Bertolazzi e Carlos Maximiliano Giorgio Bort #
7# Dipartimento di Ingeneria Industriale, Universita` di Trento #
8# Sito web: http://www.ing.unitn.it/~bertolaz/ #
9# #
10# Contatti: enrico.bertolazzi@unitn.it, cm.giorgiobort@unitn.it #
11# #
12# Copyright (c) 2014 Universita` di Trento. Tutti i diritti riservati. #
13#-------------------------------------------------------------------------#
14
15puts 'INIZIALIZZAZIONE'
16
17# array vuoto
18ary = []
19ary1 = Array.new
20
21# visualizza tutti i metodi nativi degli array
22puts ary.methods.sort
23puts "\n"
24
25# controlla cos'e` ary
26puts "la variabile ary e` un #{ary.class}\n"
27
28# controlla se l'array e` vuoto
29puts "l'array ary e` vuoto? #{ary.empty?}\n"
30
31
32
33
34ary2 = Array.new(20)
35puts "ary2 e` un array di 20 elementi, tutti nulli:\n#{ary2}\n\n"
36
37# size / length (they are the same!)
38puts 'Posso controllare la dimensione di ary2 con:'
39puts "ary2.size ---> #{ary2.size}"
40puts "ary2.length ---> #{ary2.length}"
41puts ""
42
43
44
45ary3 = Array.new(6, 4)
46puts "ary3 e` un array di 6 elementi, tutti uguali a 4:\n#{ary3}"
47puts ""
48
49ary4 = Array.new(3, 'hello')
50puts "ary4 e` un array di 3 elementi, tutti uguali a 'hello':\n#{ary4}"
51puts ""
52
53
54puts "In alternativa, posso generare un array di 'n' elementi tutti uguali a X, con il comando: [X]*n
55se n=6 e X=2 scrivero` [2]*6:
56#{[2]*6}"
57puts ""
58
59ary5 = Array(0..6)
60puts "ary5 e` un array di una sequenza di numeri crescenti:\n#{ary5}"
61puts ""
62
63
64
65puts "_"*30
66puts "CICLI NEGLI ELEMENTI DELL'ARRAY"
67
68puts "a) ciclo 'for'"
69for i in 0 .. ary5.length-1
70 puts ary5[i]
71end
72
73puts "b) ciclo 'each'"
74ary5.each do |e|
75 puts e
76end
77puts "c) ciclo 'each' versione compatta"
78ary5.each{ |e| puts e }
79
80
81
82puts "_"*30
83puts 'COPIARE ARRAY'
84puts '>>> modo sbagliato:'
85puts "ary5 vale #{ary5}"
86
87copy_ary5 = ary5
88puts "copy_ary5 vale #{copy_ary5}"
89puts ''
90puts "Cambio il 4(to) elemento in copy_ary5 a 999"
91copy_ary5[4] = 999
92puts "copy_ary5 vale #{copy_ary5}"
93puts "ma ora ary5 vale #{ary5}"
94puts ''
95
96
97puts '>>> modo corretto:'
98ary5 = Array(0..6)
99puts "ary5 vale #{ary5}"
100
101copy_ary5 = ary5.dup
102puts "copy_ary5 vale #{copy_ary5}"
103puts ''
104puts "Cambio il 4(to) elemento in copy_ary5 a 999"
105copy_ary5[4] = 999
106puts "copy_ary5 vale #{copy_ary5}"
107puts "ora ary5 vale #{ary5}"
Problema 1¶
Trovare i numeri perfetti minori di 1000
Definizione
Un numero perfetto è un intero uguale alla somma dei suoi divisori (escluso se stesso). Ad esempio 6 è un numero perfetto infatti i suoi divisori 1, 2, 3 hanno somma 6.
Problema 2¶
Trovare le coppie di numeri amicabili minori di 10000
Definizione
Una coppia di numeri interi sono detti amicabili se la somma dei divisori di primo (escluso se stesso) è uguale al secondo e viceversa. Ad esempio
220 è divisibile per 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 e 110 e la loro somma risulta 284;
284 è divisibile per 1, 2, 4, 71, 142 e la loro somma risulta 220.
quindi 220 e 284 è una coppia di numeri amicabili. Altre coppie di numeri amicabili sono 184 e 1210, 2620 e 2924, 5020 e 5564, 17296 e 18416.
Soluzione al problema 1:
1#!/usr/bin/env ruby
2#-------------------------------------------------------------------------#
3# Esercitazioni in Laboratorio per il Corso di #
4# Fondamenti di Informatica e Calcolo Numerico, AA 2013/2014 #
5# #
6# Autori: Enrico Bertolazzi e Carlos Maximiliano Giorgio Bort #
7# Dipartimento di Ingeneria Industriale, Universita` di Trento #
8# Sito web: http://www.ing.unitn.it/~bertolaz/ #
9# #
10# Contatti: enrico.bertolazzi@unitn.it, cm.giorgiobort@unitn.it #
11# #
12# Copyright (c) 2014 Universita` di Trento. Tutti i diritti riservati. #
13#-------------------------------------------------------------------------#
14
15=begin
16
17Calcola i numeri perfetti minori di `10000`
18
19Un numero perfetto e` un intero uguale alla somma dei suoi divisori (escluso se stesso).
20Ad esempio 6 e` un numero perfetto infatti i suoi divisori 1, 2, 3 hanno somma 6.
21
22=end
23
24# numeri perfetti: 6, 28, 496, 8128, 33550336
25
26#____________________________
27def is_perfect?(n)
28 # accumulo i divisori
29 acc = 1 # 1 e` sicurmente un divisore
30 for i in 2..n/2 do # se i > n/2 di sicuro non divide n
31 acc += i if (n%i) == 0 # accumulo i divisori
32 end
33 return acc == n # se acc == n allora il numero e` perfetto
34end
35
36# cerco i numeri perfetti tra 1 e 10000
37(1..10000).each do |n|
38 puts n if is_perfect?(n)
39end
Soluzione al problema 2
1#!/usr/bin/env ruby
2#-------------------------------------------------------------------------#
3# Esercitazioni in Laboratorio per il Corso di #
4# Fondamenti di Informatica e Calcolo Numerico, AA 2013/2014 #
5# #
6# Autori: Enrico Bertolazzi e Carlos Maximiliano Giorgio Bort #
7# Dipartimento di Ingeneria Industriale, Universita` di Trento #
8# Sito web: http://www.ing.unitn.it/~bertolaz/ #
9# #
10# Contatti: enrico.bertolazzi@unitn.it, cm.giorgiobort@unitn.it #
11# #
12# Copyright (c) 2014 Universita` di Trento. Tutti i diritti riservati. #
13#-------------------------------------------------------------------------#
14
15=begin
16
17Calcola le coppie di numeri amicabili minori di `10000`
18
19Una coppia di numeri interi sono detti amicabili se la somma dei
20divisori di primo (escluso se stesso) e` uguale al secondo e viceversa.
21
22=end
23
24nmax = 10000
25
26#____________________________
27def divisor_sum(n)
28 # accumulo i divisori
29 acc = 1 # 1 e` sicurmente divisore
30 for i in 2..n/2 do # se i > n/2 di sicuro non divide n
31 acc += i if (n%i) == 0 # accumulo i divisori
32 end
33 return acc
34end
35
36divisor_table = Array.new(nmax+1) ;
37
38puts "costruisco tabella dei divisori"
39(1..nmax).each { |n| divisor_table[n] = divisor_sum(n) ; }
40
41puts "cerco numeri amicabilie perfetti"
42(1..nmax).each do |n|
43 m = divisor_table[n] ; # da n a m somma dei suoi divisori
44 if m == n then
45 puts "#{n} numero perfetto"
46 elsif m <= nmax then
47 n1 = divisor_table[m] ; # n1 e` somma dei divisori di m
48 # se n=n1 allora n e` somma dei divisori di m e viceversa
49 puts "#{n} -- #{m} amicabili" if n == n1
50 end
51end