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
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
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