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:

File 3.3_perfect_numbers.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
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

File 3.4_amicable_numbers.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
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