Lezione del 3/3/2014

Identificatori di variabili `costanti`:

File ex2.1_costanti.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
15# Identificatori di variabili "costanti"
16
17#
18# creazione di una costante
19#
20Pippo = "Pippo e` amico di Topolino" # definisco la costante Pippo
21 
22#
23# Provo a riassegnarla
24#
25Pippo = "Pippo NON e` amico di Topolino" # errore cerco di assegnare un valore ad una costante

Il problema 3n+1

File ex2.2_problema_3npiu1.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
15#
16# Esempio, funzione 3n+1 di Collatz
17#
18# definisco la funzione collatz che accetta un solo
19# argomento n
20def collatz(n)
21  if n.even? then
22    # blocco eseguito se n e` numero pari
23    return n/2 # esco restituendo il valore n/2
24  else
25    # blocco eseguito se n e` numero dispari
26    return 3*n+1 # esco restituendo il valore 3*n+1
27  end
28end
29 
30n = ARGV[0].to_i ; # primo argomento per inizializzare n
31k = 0 ;
32while n > 1 do
33  k = k+1
34  n = collatz(n)
35  puts "k = #{k}, n = #{n}"
36end
37
38=begin
39Per ottenere il grafico eseguire lo script e salvare l'output su file.
40Ad esempio su Linux e OSX ruby ex2.3.rb > a.dat su WINDOWS ruby ex2.3.rb e poi
41copiare l'output su un file. Usando gnuplot dare il comando:
42
43    plot [2:] 'a.dat' u 1:2 with lines
44=end

Esempio di ``if’’ multipli

File ex2.3_if_multipli.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
15#
16# Esempio, funzione 3n+1 di Collatz
17#
18# definisco la funzione collatz che accetta un solo
19# argomento n
20def collatz(n)
21  if n.even? then
22    # blocco eseguito se n e` numero pari
23    return n/2 # esco restituendo il valore n/2
24  else
25    # blocco eseguito se n e` numero dispari
26    return 3*n+1 # esco restituendo il valore 3*n+1
27  end
28end
29#
30# dato n conta le iterate fatte con Collatz
31#
32def iter(n)
33  k = 0
34  while n>1 do
35    k = k+1
36    n = collatz(n)
37  end
38  return k
39end
40 
41n = ARGV[0].to_i ; # primo argomento per inizializzare n
42#
43# ciclo per j da 1 a n
44#
45puts "n\titer"
46for j in (1..n) do
47  it = iter(j)
48  puts "#{j}\t#{it}"
49end

Stesso esempio ma usando `elsif`

File ex2.4_elsif.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
15#
16# funzione a tratti, modo 1
17#
18def funz(x)
19  if x <= 1 then
20    return 1
21  else
22    if x <= 2 then
23      return 2
24    else
25      if x <= 4 then
26        return 3
27      else
28        if x <= 6 then
29          return 4
30        else
31          if x <= 8 then
32            return 5
33          else
34            return 6
35          end
36        end
37      end
38    end
39  end
40end
41#
42# funzione a tratti, modo 2
43#
44def funz2(x)
45  if x <= 1 then
46    return 1
47  elsif x <= 2 then
48    return 2
49  elsif x <= 4 then
50    return 3
51  elsif x <= 6 then
52    return 4
53  elsif x <= 8 then
54    return 5
55  else
56    return 6
57  end
58end
59 
60for i in (0..100) do
61  x = i/10.0
62  puts "x = #{x}, funz(x) = #{funz(x)}, funz2(x) = #{funz2(x)}"
63end

Esempio verifica se un numero é primo

File ex2.5_numero_primo.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
15#
16# funzione che verifica se un numero intero e` primo
17#
18def isprime?(n)
19  for i in (2..n-1) do
20    if (n%i) == 0 then # divisione senza resto -> non primo!
21      return false ;
22    end
23  end
24  return true ;
25end
26 
27nmax = ARGV[0].to_i
28nmax = 2 if nmax < 2
29 
30for i in (2..nmax) do
31  if isprime?(i) then
32    puts "i=#{i} e` primo"
33  else
34    puts "i=#{i} NON e` primo"
35  end
36end

Calcolo dei numeri primi: il crivello di Eratostene:

File ex2.6_crivello_erastotene.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
15#
16# Programma crivello di Eratostene per 
17# la ricerca dei numeri primi
18#
19n = ARGV[0].to_i # leggo da linea di comando n
20n = 2 if n < 2   # trucchetto per evitare n < 1
21 
22# alloco vettore con n+1 elementi
23okprime = Array.new(n+1)
24 
25# riempio vettore con booleani = true
26for i in (0..n) do
27  okprime[i] = true
28end
29 
30k = 2 ; # parto con 2 e` numero primo
31while k < n do
32  # elimino tutti i multipli di k come numeri primi
33  i = 2
34  while i*k <= n do
35    okprime[i*k] = false
36    i = i+1 ;
37  end
38  # cerco prossimo numero primo
39  k = k+1 ;
40  while (k < n) and not okprime[k] do
41    k = k+1
42  end
43end
44#
45# stampo numeri primi
46#
47for i in (0..n) do
48  puts "#{i}" if okprime[i]
49end