ESERCITAZIONE RUBY - FOR
versione 25/05/2016

ESERCIZIO 1 (FOR)

Costruire un programma che dopo aver chiesto un intero n calcoli la somma Sn  dei primi n numeri interi

Sn=1+2+3+.. +(n-1)+n

SOLUZIONE
def is_integer?(object)
   object.to_i.to_s == object.to_s
end

print "Digita un intero n: "
n=gets.chomp
if (is_integer?(n)) then
	s=0
	for i in 0..n.to_i
		s=s+i
	end
	print "S(#{n})=#{s}"
else
	print "Non hai digitato un valore intero!"
end

Il ciclo for poteva essere implementato anche in questo modo:

for i in Array(0..n.to_i) # Scorre gli elementi di un array
	s=s+i
end
Array(0..n.to_i).each { |i| s=s+i } # Scorre gli elementi dell'array ...
# oppure
(0..n.to_i).to_a.each { |i| s=s+i } 
# oppure
(0..n.to_i).to_a.each  do |i| 
	s=s+i 
end
(n.to_i+1).times { |i| s=s+i } # ripete n volte un'operazione ...
# oppure
(n.to_i+1).times  do |i| 
	s=s+i 
end
0.upto(n.to_i) { |i| s=s+i } # da 0 a n esegue ...
# oppure
0.upto(n.to_i) do |i| 
	s=s+i 
end
0.step(n.to_i,1) { |i| s=s+i } # da 0 a n con passo 1 esegue ...
# oppure
0.step(n.to_i,1) do |i| 
	s=s+i 
end
ESERCIZIO 2 (FOR)

Costruire un programma che richiede un intero positivo n e un valore reale (float) x e  successivamente calcola, in modo iterativo, la potenza xn.

xn=x*x*...x

SOLUZIONE
def is_integer?(object)
   object.to_i.to_s == object.to_s
end
def is_number?(object)
  true if Float(object) rescue false
end

print "Digita un intero n: "
n=gets.chomp
print "Digita la base x: "
x=gets.chomp

if (is_integer?(n) && is_number?(x)) then
	n=n.to_i
	x=x.to_f
	p=1
	for i in 1..n
		p=p*x 
	end
	puts "#{x}^#{n} = #{p}"
else
	print "I valori non soddisfano i requisiti richiesti!"
end
ESERCIZIO 3 (FOR)

Costruire un programma che legge un intero n e restituisce il fattoriale n!

n!=1*2*:..*(n-1)*n

SOLUZIONE
def is_integer?(object)
   object.to_i.to_s == object.to_s
end

print "Digita un intero n: "
n=gets.chomp
if is_integer?(n) then
	n=n.to_i
	f=1
	for i in 1..n
		f=f*i 
	end
	puts "#{n}! = #{f}"
else
	print "Non hai digitato un intero!"
end
ESERCIZIO 4 (FOR)

Costruire un programma che legge un intero n e genera i primi n termini della sequenza di Fibonacci 

x1, x2, x3 ... xn-2, xn-1, xn

dove il termine i-esimo xi è così definito:

x1=1
x2=1  
xn=xn-1+xn-2

(nel nostro caso la sequenza sarà 1, 1, 2, 3, 5, 8, 13, ...)

SOLUZIONE
print "Dammi n: "
n=gets.to_i
x1=1
x2=1
puts "x_1=#{x1}"
puts "x_2=#{x2}"
for i in 3..n
   x3=x1+x2
   puts "x_#{i}=#{x3}"
   x1=x2
   x2=x3
end
ESERCIZIO 5 (FOR)

Costruire un programma che genera una sequenza di n numeri con decimali (n è richiesto all'utente). Al termine della lettura il programma mostra la lunghezza della sottosequenza crescente più lunga.

SOLUZIONE
print "Dammi n: " # Leggo la lunghezza della sequenza
n=gets.to_i
rnd=Random.new(Random.new_seed) # inizializzo il generatore di numeri casuale
pi=1
pf=1
maxSeq=0  # massima lunghezza sottosequenza
nrSeq=0   # lunghezza iniziale sottosequenza
xp=0      # valore fittizio di start
pi_max=pi
pf_max=pf
for i in 1..n
   xa=rnd.rand(1.0..10.0)       # genera un float in [1.0,10.0]
   print "#{"%.2f" % xa}; "     # stampa l'iesimo numero
   print "\n" if i % 10 ==0
   if (xp<xa) 
      nrSeq=nrSeq+1
      pf=i
   else
      if nrSeq>maxSeq
         maxSeq=nrSeq 
         pi_max=pi
         pf_max=pf
      end
      nrSeq=1
      pi=i
      pf=i
   end
   xp=xa
end
if (n>0)
   if nrSeq>maxSeq
      maxSeq=nrSeq 
      pi_max=pi
      pf_max=pf
   end
   print "\nMassima sequenza strettamente crescente: #{maxSeq} - dal #{pi_max}^ numero al #{pf_max}^ numero"
end
ESERCIZIO 6.a (FOR)

Costruire una breve applicazione che partendo da un intero n generi i primi n termini della sequenza composta dal numero 1 con segno alterno ovvero:

1, -1, 1, -1, 1 ... (-1)n+1

La lunghezza n della sequenza deve essere richiesta all'utente

SOLUZIONE
print "Digita n:"
n=gets.to_i

segno=1
for i in 1..n
   print segno.to_s + "; "
   segno=-segno
end

ESERCIZIO 6.b (FOR)

Costruire una breve applicazione che partendo da un intero n generi i primi n termini della sequenza che ciclicamente propone 1, 0, -1. Ad esempio per n=7 la sequenza che verrà visualizzata sarà la seguente:

1, 0, -1, 1, 0, -1, 0

La lunghezza n della sequenza deve essere richiesta all'utente

SOLUZIONE
print "Digita n:"
n=gets.to_i

for i in 1..n
   if (i % 3) == 1
      print "1, "
   elsif (i % 3) == 2
      print "0, "
   elsif (i % 3) == 0
      print "-1, "
   end
end
oppure
print "Digita n:"
n=gets.to_i

x=1
for i in 1..n
   print "#{x} "
   x=x-1
   x=1 if (x==-2)
end
ESERCIZIO 6.c (FOR)

Costruire un programma che visualizza la progressione aritmetica di ragione 1 a segni alterni ovvero:

1, -2, 3, -4, 5 ... n*(-1)n+1

La lunghezza n della sequenza deve essere richiesta all'utente

SOLUZIONE
print "Digita n:"
n=gets.to_i

for i in 1..n
   print ((-1)**(i+1)*i).to_s + "; "
end
oppure
print "Digita n:"
n=gets.to_i

segno=1
for i in 1..n
	print (i*segno).to_s + "; "
	segno=-segno
end

ESERCIZIO 6.d (FOR)

Costruire una breve applicazione che legge un intero n e restituisce i primi n termini della sequenza composta dalla successione dei simboli: "A" "B" "C" "D" ed "E". Ad esempio per n=9 la sequenza che verrà visualizzata sarà la seguente

A, B, C, D, E, A, B, C, D

La lunghezza n della sequenza deve essere richiesta all'utente

SOLUZIONE
print "Digita n:"
n=gets.to_i

for i in 1..n
	if (i % 5) == 1
		print "A; "
	elsif (i % 5) == 2
		print "B; "
	elsif (i % 5) == 3
		print "C; "
	elsif (i % 5) == 4
		print "D; "
	elsif (i % 5) == 0
		print "E; "
	end
end
oppure
print "Digita n:"
n=gets.to_i

s="ABCDE"
for i in 1..n
   print s[(i-1) % 5] +"; "
end
ESERCIZIO 7 (FOR)

Costruire un programma che visualizzi la tavola pitagorica nxn. Il valore n è richiesto e deve essere un numero intero compreso tra 5 e 25 (in caso contrario verrà dato un avviso di errore).

SOLUZIONE
def is_integer?(object)
   object.to_i.to_s == object.to_s
end

print "Digita un intero n: "
n=gets.chomp
if (is_integer?(n)) then
	n=n.to_i
	if (n>=5 && n<=25)
		for r in 1..n
			for c in 1..n
				v=r*c
				print "#{"%3d" % v}"
			end
			print "\n"
		end
	else
		print "La dimensione #{n} non e' valida - programma terminato"
	end
else
	print "Non hai digitato un valore intero!"
end
ESERCIZIO 8 (FOR)

Costruire un programma che visualizza una scacchiera n x n dove la dimensione n è richiesta all'utente. Il valore n deve essere un numero intero compreso tra 5 e 25. Per stampare i caratteri speciali ▓▓ e ▒▒ si utilizzino le stringhe "\u2588\u2588" e "\u2591\u2591".

 
SOLUZIONE
print "Digita un intero n: "
n=gets.to_i
if (n>=5) && (n<=25)
   for r in 1..n
      for c in 1..n
         if (r+c) % 2 ==0
            print "\u2588\u2588"
         else
            print "\u2591\u2591"
         end
      end
      print "\n" # va a capo dopo aver stampato la riga
   end
else
   print "Out of range - 5..25"
end
ESERCIZIO 9.0 (FOR-IF)

Costruire un programma che calcoli, nella tavola pitagorica 10x10, la somma dei numeri posizionati lungo la spirale evidenziata in azzurro. Suggerimento: analizzare lo script che disegna invece tale spirale.

1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
      
$N=10
def distanza(r, c)
   # Guardo la minima distanza dal bordo
   d = r - 1
   d = (d > c) ? c - 1 : d
   d = (d > ($N - c)) ? $N - c : d
   d = (d > ($N - r)) ? $N - r : d
   return d
end

for r in 1..$N
   for c in 1..$N
      if distanza(r,c) % 2 ==0
         print "\u2588\u2588"
      else
         print "\u2591\u2591"
      end 
   end
   print "\n"
end
Tabella 0

SOLUZIONE
$N=10
def distanzaMod(r, c)
   # Guardo la minima distanza dal bordo
   d = r - 1
   d = (d > c) ? c - 1 : d
   d = (d > ($N - c)) ? $N - c : d
   d = (d > ($N - r)) ? $N - r : d
   return d
end

s=0
for r in 1..$N
   for c in 1..$N
      if distanzaMod(r,c) % 2 ==0
         s=s+r*c
         print "\u2588\u2588"
      else
         print "\u2591\u2591"
      end 
   end
   print "\n"
end
print "Totale celle azzurre: #{s}"
ESERCIZIO 9.A.1 e 9.A.2 (FOR-IF)

Costruire un programma che calcoli, nella tavola pitagorica 10x10, la somma dei numeri posizionati:

(Attenzione: non è richiesta la visualizzazione della tabella!)

1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
Tabella 1 Tabella 2
SOLUZIONE
SOLUZIONE
$N=10
s=0
for r in 1..$N
   for c in 1..$N
      if r==c || (r+c)==($N+1)
         s=s+r*c
         print "\u2588\u2588"
      else
         print "\u2591\u2591"
      end 
   end
   print "\n"
end
print "Totale celle azzurre: #{s}"
$N=10
s=0
for r in 1..$N
   for c in 1..$N
      if r==$N/2 || c==$N/2 || r==($N/2+1) || c==($N/2+1)
         s=s+r*c
         print "\u2588\u2588"
      else
         print "\u2591\u2591"
      end 
   end
   print "\n"
end
print "Totale celle azzurre: #{s}"

ESERCIZIO 9.B.1 e 9.B.2 (FOR)

Costruire un programma che calcoli, nella tavola pitagorica 10x10, la somma dei numeri posizionati:

(Attenzione: non è richiesta la visualizzazione della tabella!)

1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
Tabella 1 Tabella 2
SOLUZIONE
SOLUZIONE
$N=10
s=0
for r in 1..$N
   for c in 1..$N
      if r<=c
         s=s+r*c
         print "\u2588\u2588"
      else
         print "\u2591\u2591"
      end 
   end
   print "\n"
end
print "Totale celle azzurre: #{s}"
$N=10
s=0
for r in 1..$N
   for c in 1..$N
      if (r+c)>=($N+1)
         s=s+r*c
         print "\u2588\u2588"
      else
         print "\u2591\u2591"
      end 
   end
   print "\n"
end
print "Totale celle azzurre: #{s}"
 
ESERCIZIO 9.C.1 e 9.C.2 (FOR-IF)

Costruire un programma che calcoli, nella tavola pitagorica 10x10, la somma dei numeri posizionati:

(Attenzione: non è richiesta la visualizzazione della tabella!)

1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
Tabella 1 Tabella 2
SOLUZIONE
SOLUZIONE
$N=10
def distanza(r, c)
   # Guardo la minima distanza dal bordo
   d = r - 1
   d = (d > (c - 1)) ? c - 1 : d
   d = (d > ($N - c)) ? $N - c : d
   d = (d > ($N - r)) ? $N - r : d
   return d
end
s=0
for r in 1..$N
   for c in 1..$N
      if distanza(r,c)==0
         s=s+r*c
         print "\u2588\u2588"
      else
         print "\u2591\u2591"
      end 
   end
   print "\n"
end
print "Totale celle azzurre: #{s}"
$N=10
def distanza(r, c)
   # Guardo la minima distanza dal bordo
   d = r - 1
   d = (d > (c - 1)) ? c - 1 : d
   d = (d > ($N - c)) ? $N - c : d
   d = (d > ($N - r)) ? $N - r : d
   return d
end
s=0
for r in 1..$N
   for c in 1..$N
      if distanza(r,c) % 2 == 0
         s=s+r*c
         print "\u2588\u2588"
      else
         print "\u2591\u2591"
      end 
   end
   print "\n"
end
print "Totale celle azzurre: #{s}"

ESERCIZIO 9.D (FOR-IF)

Costruire un programma che calcoli, nella tavola pitagorica 10x10, la somma dei numeri posizionati:

(Attenzione: non è richiesta la visualizzazione della tabella!)

1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
Tabella 1 Tabella 2
SOLUZIONE
SOLUZIONE
$N=10
s=0
for r in 1..$N
   for c in 1..$N
      cond=(r>=c || (r+c)>=($N+1))
      cond=cond && !(r>c && (r+c)>($N+1))
      if cond
         s=s+r*c
         print "\u2588\u2588"
      else
         print "\u2591\u2591"
      end 
   end
   print "\n"
end
print "Totale celle azzurre: #{s}"
$N=10
s=0
for r in 1..$N
   for c in 1..$N
      c1=(c+$N/2) % 10 # shift a destra di 5
      cond=(r>=c1 || (r+c1)>=($N+1))
      cond=cond && !(r>c1 && (r+c1)>($N+1))
      if cond
         s=s+r*c
         print "\u2588\u2588"
      else
         print "\u2591\u2591"
      end 
   end
   print "\n"
end
print "Totale celle azzurre: #{s}"

ESERCIZIO 10 (FOR)

Costruire una breve applicazione che mostra in una tabella 5x5 tutte le possibili coppie (X,Y) ottenibili con le lettere "A", "B", "C", "D" e "E". 

Variante: Leggere N caratteri e successivamente generare una tabella NxN con tutte le possibili coppie (X,Y) dei simboli appena acquisiti.

SOLUZIONE
for r in 0..4
   for c in 0..4
      # Sommo al codice Ascii di "A"
      # il progressivo rappresentato da c o r
      # in modo da ottenere i simboli successivi
      caratt1 = ("A".ord+c).chr
      caratt2 = ("A".ord+r).chr
      print "("+caratt1+", "+caratt2+") "
   end
   print "\n"
end
SOLUZIONE (variante)
print "Dammi la sequenza: "
s=gets.chomp
n=s.length-1
for r in 0..n
	for c in 0..n
		caratt1 = s[r]
		caratt2 = s[c]
		print "("+caratt1+", "+caratt2+") "
	end
	print "\n"
end

Il doppio ciclo NxN può essere sostituito con un singolo ciclo da 0 a N2-1.

print "Dammi la sequenza: "
s=gets.chomp
n=s.length
for i  in 0..(n*n-1)
   print "(#{s[i/n]}, #{s[i % n]}) "  
   if (i % n == (n-1))
      print "\n"
   end
end
ESERCIZIO 11 (FOR)

Costruire una breve applicazione che legge una frase s più tre caratteri a, b e c. Successivamente stampi il numero di occorrenze dei simboli registrati nelle variabili a, b e c all'interno della s.

SOLUZIONE
print "Dammi una stringa: "
s=gets.chomp
print "Dammi 1^ lettera: "
a=gets.chomp
print "Dammi 2^ lettera: "
b=gets.chomp
print "Dammi 3^ lettera: "
c=gets.chomp
nA,nB,nC = 0,0,0
for i in 0..(s.length-1)
	nA=nA+1 if s[i]==a
	nB=nB+1 if s[i]==b
	nC=nC+1 if s[i]==c
end
print "Numero di #{a}=#{nA} - #{b}=#{nB} - #{c}=#{nC}"
ESERCIZIO 12 (FOR)

Costruire una breve applicazione che legge un intero  n e restituisce la sua scomposizione in fattori primi

SOLUZIONE
# Questo esercizio andrebbe risolto con il WHILE
print "Dammi il numero: "
n=gets.to_i
print "1"
d=2
for i in 2..n
    if (n % d == 0)
		print "*#{d}"
		n=n / d
	else
		d=d+1
	end
end
ESERCIZIO 13 (FOR)

Costruire una breve applicazione che legge 2 interi a, b e restituisce minimo comune multiplo e il Massimo Comune Divisore tra a e b

SOLUZIONE
print "Dammi a: "
a=gets.to_i
print "Dammi b: "
b=gets.to_i

minAB=(a < b) ? a : b
maxAB=(a > b) ? a : b
# Minimo comune multiplodivisore
for mcm in maxAB..(a*b)
   break if (mcm % a == 0 and mcm % b == 0)
end

# Massimo comune divisore
for mcd in minAB.downto(2)
   break if (a % mcd == 0 and b % mcd == 0)
end

print "m.c.m = #{mcm} - M.C.D. = #{mcd}"
ESERCIZIO 14 (FOR)

Costruire una breve applicazione che legge un intero n e restituisce l'elenco di tutti i numeri primi minori o uguali di n [un numero è primo se risulta divisibile solo per 1 e per se stesso]

SOLUZIONE
print "Dammi n: "
n=gets.to_i
def ePrimo(n)
   for i in 2..(n-1)
      if (n % i == 0)
         return false
      end
   end
   return true
end

for i in 1..n-1
   print "#{i}; " if ePrimo(i)
end
ESERCIZIO 15 (FOR)

???

SOLUZIONE
???