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.
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.
Ecco dunque lo script completo per il calcolo dei numeri primi da 1 a 100 con Scratch.
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.
Per realizzare l’algoritmo servono le seguenti forme:
Ellisseper l’inizio e per la fine;
Parallelogrammain questo caso solo per visualizzare l’output;
Rettangoloper inizializzare le variabili e incrementarle;
Romboper 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.
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.
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.