Numeri primi da 1 a 100 con Scratch

Numeri primi da 1 a 100 con Scratch

In questa lezione calcoleremo i numeri primi da 1 a 100 con Scratch.

I numeri primi sono i numeri interi positivi che hanno solo due divisori: 1 e il numero stesso. I divisori non devono coincidere, quindi 1 non è primo.

Dunque prendiamo in considerazione i numeri nell’intervallo da 1 a 100 e calcoliamo con un algoritmo quali sono i numeri primi e quali no.

Codice a blocchi per il calcolo dei numeri primi da 1 a 100 con Scratch

Per sviluppare questo algoritmo questa volta utilizziamo Scratch. Ricordiamo che l’abbiamo già risolto con algobuild, al seguente link: numeri primi da 1 a 100 con algobuild.

Scegliamo uno sfondo e uno sprite qualsiasi.

numeri primi da 1 fino a 100

Serviranno le variabili: conta per contare i divisori, div che rappresenta il divisore e num la variabile per i numeri che facciamo partire da 2 fino ad arrivare a 100.

variabili primi

Ecco dunque lo script completo per il calcolo dei numeri primi da 1 a 100 con Scratch.

numeri primi da 1 a 100

Innanzitutto partiamo da num uguale a 2.

Poi ripetiamo, finché num non diventa maggiore di 100, queste istruzioni:

conta=0 inizializziamo cioè il contatore dei divisori.

div=2 portiamo il divisore (ovvero il numero per cui inizieremo a dividere) a 2.

Realizziamo un altro ciclo che si fermerà se conta diventerà maggiore di 1 (cioè avrà trovato più divisori) oppure finché il divisore non supera num/2. Il ciclo avrà le seguenti istruzioni:

istruzione condizionale: controlla se il resto della divisione di num per div è uguale a zero, se si aumenta il conta di 1. Quindi il numero non sarà primo.

in ogni caso si incrementa la variabile div di 1 per cercare altri divisori.

Dopo aver cercato tutti i divisori possibili controlla se la variabile conta è uguale a zero. Se si stampa il numero in quanto vuol dire che è primo.

In ogni caso si incrementa num di 1 per valutare il numero successivo.

Chiaramente questa è una possibile soluzione all’algoritmo con Scratch per cercare i numeri primi da 1 a 100.


Provate a variare l’algoritmo partendo da 1.

Provate anche a variare l’algoritmo chiedendo in input un intervallo di numeri che l’utente dovrà inserire, ovviamente inserendo anche i controlli dell’input.

Alcuni link utili

Divisori di un numero con scratch

Multipli di un numero con scratch

Numeri pari con scratch

Esercizi con scratch

Potenze con scratch

Quoziente potenze stessa base con scratch

Palindroma con scratch

Storiella con scratch

Serie buffa con scratch

Operazioni matematiche con scratch

Come sommare un intervallo di numeri con scratch

Anno bisestile con scratch

Selezione con scratch

Olimpiadi di informatica con scratch

Olimpiadi di matematica con scratch

Figure equivalenti con scratch

Come riconoscere gli angoli con scratch

Morra cinese con scratch

Giochi matematici autunno 2018

Esempi di giochi matematici Bocconi

Gioco della tabellina con scratch

Disegnare poligoni regolari con scratch

Numeri primi in Scratch

Numeri primi da 1 a 100

Numeri primi da 1 a 100

Calcoliamo i numeri primi da 1 a 100 con Algobuild.

Supponiamo quindi di voler chiedere al programma di calcolare i numeri primi in questo intervallo e di visualizzarli.

Per trovare i numeri primi da 1 a 100 dobbiamo controllare se ciascun numero di questo intervallo abbia dei divisori oltre 1 e se stesso.

Se non si trovano altri divisori allora il numero è primo, altrimenti non lo è.

Facciamo un esempio: 2 ha come divisore 1 e 2, dunque è primo.

E così troviamo gli altri, pertanto i numeri primi da 1 a 100 sono:

2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97.


Calcolo dei numeri primi da 1 a 100 con Algobuild

Per realizzare l’algoritmo servono le seguenti forme:

Ellisse per l’inizio e per la fine;

Parallelogramma in questo caso solo per visualizzare l’output;

Rettangolo per inizializzare le variabili e incrementarle;

Rombo per effettuare un test che può essere vero o falso e per la struttura ciclica. In questo caso abbiamo due cicli e due if.

Bene consideriamo adesso i numeri a partire da 2 fino al numero 100 compreso (potremmo fare a meno di considerare 100 perchè già sappiamo che non è un numero primo).

Ciascun numero verrà diviso per numeri che inizieranno da 2 e termineranno fino ad n/2.

Perché? Partiamo a dividere da 2 perché sappiamo già che tutti i numeri sono divisibili per 1. Arriviamo ad n/2 perché sappiamo anche che dividere un numero per un valore maggiore della sua metà mi darà sempre un numero con la virgola. Quindi ecco che basta restringere questo intervallo per avere maggiore velocità di elaborazione.

Dunque ecco il diagramma di flusso che rappresenta l’algoritmo per il calcolo dei numeri primi da 1 a 100.

diagramma di flusso numeri primi

Nella versione non ottimizzata potremmo mettere semplicemente div<num e togliere anche conta<2.

Questo è solo un esempio di implementazione del diagramma di flusso per il calcolo dei numeri primi da 1 a 100.

Provate anche a variare l’algoritmo partendo da 1, io tra non molto pubblicherò la soluzione.

Un’altra possibile variazione potrebbe essere quella di chiedere in input un intervallo di numeri che l’utente dovrà inserire. Dopo quindi si calcolano i numeri primi tra l’intervallo preso in input. Ovviamente in questo caso occorrono i controlli dell’input.

Alcuni link utili

Indice argomenti diagramma a blocchi

Numeri primi da 1 a 100

Array con algobuild

Divisori di un numero con algobuild

Algoritmi di selezione sugli angoli

Algoritmi di selezione

Triangoli con algobuild

Fibonacci con algobuild

Serie buffa con algobuild

Numeri amicabili con algobuild

Numeri perfetti con algobuild

Massimo fra tre numeri

Minore fra tre numeri

Equazioni di secondo grado in C++

Equazioni di secondo grado in C++

In questa lezione risolveremo le equazioni di secondo grado in C++.

Affronteremo questo esercizio per approfondire ancora le funzioni in C++.

Abbiamo già proposto lo stesso esercizio in C, se volete potete seguire il link: equazioni in C.

Equazioni di secondo grado

Un’equazione di secondo grado scritta nella forma canonica è:

ax2+bx+c=0

Per risolvere questa equazione occorre conoscere i valori dei coefficienti a, b e c.

Dopo occorre trovare il delta o determinante utilizzando questa formula: b*b-4*a*c.

In base al risultato potremmo trovarci in tre situazioni distinte:

nel caso in cui il determinante è minore di zero, allora non esistono soluzioni reali;

se invece il determinante è uguale a zero, l’equazione ammette due soluzioni reali coincidenti;

infine, se il determinante è maggiore di zero, l’equazione ammette due soluzioni reali distinte.

Inoltre osserviamo che, se il coefficiente a è uguale a zero, non ci troveremmo più di fronte ad un’equazione di secondo grado ma ovviamente di primo grado: bx+c. Dunque non si potrà applicare la formula.

Quando le soluzioni esistono si ottengono con questa formula:

x1=(-b+sqrt(determinante))/2*a

x2=(-b-sqrt(determinante))/2*a

utilizziamo sqrt (dalla libreria cmath) come funzione per il calcolo della radice quadrata.

Strutturiamo il programma scomponendolo in sottoprogrammi:

funzione coefficienti() per prendere in input i coefficienti.

funzione determinante() per il calcolo del determinante.

funzioni soluzioni() per il calcolo delle soluzioni.

funzione equazione_primo() nel caso in cui l’equazione sia di primo grado.

Ecco il listato completo del programma in C++ per il calcolo delle equazioni di secondo grado.

#include <iostream>
#include <cmath>

using namespace std;

float a, b, c;
double x1,x2,d;

void coefficienti() 
{
   cout<<"coefficiente a:\t";
   cin>>a;
   cout<<"coefficiente b:\t";
   cin>>b;
   cout<<"coefficiente c:\t";
   cin>>c;
}

void determinante()
{
   d=b*b-4*a*c;
}

void soluzioni()
{ 
   if(d<0)
      cout<<"non possono esserci soluzioni reali"<<endl;
   else if(d==0) {
      x1=(-b)/(2*a);
      cout<<"Due soluzioni reali coincidenti x1 e x2: "<<x1;
  }
   else
   {
      x1=(-b-sqrt(d))/(2*a);
      x2=(-b+sqrt(d))/(2*a);
      cout<<"Due soluzioni reali distinte x1: "<<cout<<x1<<" e x2"<<cout<<x2;
   }

}

void equazione_primo()
{
    if((b==0)&&(c==0))
	cout<<"\nequazione indeterminata";
    else if(b==0)
	cout<<"\nequazione impossibile";
    else {
	x1=-c/b;
	cout<<"x: "<<x1;
	 }
}

main()
{
   coefficienti();
   if(a==0) 
       equazione_primo();
   else {
        determinante();
        soluzioni();
    }
system("pause");	
}

Chiaramente questo è solo un esempio di possibile risoluzione di un’equazione di secondo grado in C++.

Alcuni link utili

Passaggio di parametri per valore o per riferimento

Come usare il for in C++

Ciclo while in C++

Ciclo do while

Iterazioni con il ciclo for in C++

Operatori logici in C++

Esercizi con switch case in C++

Come utilizzare lo switch case in C++

If else in C++

Casting in C++

Tutorial C++

Successione di Fibonacci in C++