Equazioni di primo grado in Scratch
Oggi realizzeremo un semplice script che ci permetterà di risolvere le equazioni di primo grado in Scratch.
Partiamo dando una definizione.
Si dice equazione una uguaglianza tra due espressioni che si verifica solo per particolari valori assegnati alle variabili dette incognite in essa contenute.
Le equazioni di primo grado sono equazioni in cui l’incognita è elevata all’esponente 1.
Le equazioni di primo grado sono dunque quelle espresse ad esempio nella forma:
ax+b=0
Facciamo un esempio banale:
4x+8=0 è un’equazione di primo grado
4x2+8=0 non è ovviamente di primo grado
Algoritmo in Scratch per il calcolo delle equazioni di primo grado.
Realizziamo adesso il nostro algoritmo.
Prendiamo in input a, ovvero il coefficiente del termine di primo grado e b, il termine noto.
Dobbiamo calcolare il valore della nostra incognita x che facendo un semplice passaggio sarà:
ax+b=0 da cui ax=-b e da qui si ricava x=-b/a
È necessario fare un controllo sulle due variabili a e b perché se sono entrambe uguali a zero la nostra equazione è indeterminata, invece se solo la variabile a è uguale a zero l’equazione è impossibile, in quanto dovremmo dividere per zero.
Se una delle condizioni sopra non si verifica allora posso risolvere la mia equazione.
Infatti, anche se b fosse uguale a zero l’equazione si potrebbe risolvere, in questo caso la nostra x sarebbe uguale a zero.
Esempio:
Se ho questa equazione:
7x+5=0 la nostra x sarà uguale a 0,714528…
Sarebbe preferibile arrotondare il risultato a 0,714.
Ma la funzione arrotonda di Scratch porterebbe la variabile x a 1.
Con il semplice metodo che ho utilizzato invece ottengo un valore approssimato a 0,714. Come ho fatto?
Premettendo che è possibile trovare altre soluzioni, io ho agito in questo modo.
Ho creato una variabile che ho chiamato approssimazione per gestire l’arrotondamento. Dopo ho moltiplicato arrotonda di x per 1000 così da avere 714 e poi per avere come risultato 0,714 chiaramente ho diviso per 1000.
Allego lo script completo per il calcolo delle equazioni di primo grado in Scratch.
Potremmo anche pensare ad una soluzione che richieda di inserire nuovamente la variabile a se si inserisce da tastiera un valore uguale a zero.
Nei linguaggi di programmazione userei ad esempio il ciclo do-while.
Ecco quindi un’altra possibile soluzione nella quale chiedo l’inserimento di entrambi a e b, ma potrei chiedere anche solo a.
Chiaramente proponete pure la vostra soluzione nei commenti al fine di confrontarci.
Alcuni link utili
Disegnare poligoni regolari in scratch
La successione di Fibonacci in Scratch
Massimo fra tre numeri in Scratch
Minimo tra 3 numeri in Scratch
Prodotto tra matrici in C
Realizziamo un algoritmo che calcoli il prodotto tra due matrici in C.
Procediamo seguendo questi passi:
- Inseriamo i dati nella prima matrice
- Inseriamo i dati nella seconda matrice
- Calcoliamo il prodotto
- Visualizziamo la prima matrice
- Visualizziamo la seconda matrice
E’ utile sapere che il prodotto tra due matrici si può ottenere se il numero di colonne della prima matrice è uguale al numero di righe della seconda matrice.
Quindi ad esempio se ho:
a[M][N] e b[N][P] il prodotto è possibile.
a[M][N] e b[M][P] il prodotto non è possibile.
Algoritmo in linguaggio C per il calcolo del prodotto tra due matrici
Immaginiamo di poter utilizzare quindi queste due matrici, a[M][N] e b[N][P]. La matrice prodotto sarà quindi c[M][P].
Definiamo le dimensioni delle righe e delle colonne, ad esempio:
#define M 4
#define N 3
#define P 5
Quindi avremo una matrice a[4] [3] e una matrice b[3] [5].
Dapprima carichiamo i dati della prima matrice
printf("\nInseriamo i dati nella matrice \n");
for (i=0;i<M;i++)
for(j=0;j<N;j++) {
printf("Inserisci elemento di riga %d e colonna %d: ", i, j);
scanf("%d", &a[i][j]);
}
e poi i dati della seconda matrice
printf("\nInseriamo i dati nella seconda matrice \n");
for (i=0;i<N;i++)
for(j=0;j<P;j++) {
printf("Inserisci elemento di riga %d e colonna %d: ", i, j);
scanf("%d", &b[i][j]);
}
La matrice prodotto sarà dunque la matrice c[4][5]
Per ottenere il valore dell’elemento i, j della matrice prodotto si inizializza a zero c[i][j]=0;
Con un ciclo che scandisce la riga i di a e la colonna j di b, si accumula in c la sommatoria dei prodotti dei corrispondenti elementi di a e b.
La variabile k permette di scorrere contemporaneamente la linea i di a e la colonna j di b. Questo procedimento lo ripetiamo per ogni elemento della matrice prodotto.
Algoritmo completo del prodotto tra matrici in linguaggio C
#include <stdio.h>
#define N 3
#define P 5
#define M 4
int a[M][N];
int b[N][P];
int c[M][P];
main() {
int i,j,k;
printf("\nInseriamo i dati nella matrice \n");
for (i=0;i<M;i++)
for (j=0;j<N;j++) {
printf("Inserisci elemento di riga %d e colonna %d: ", i, j);
scanf("%d", &a[i][j]);
}
printf("\nInseriamo i dati nella seconda matrice \n");
for (i=0;i<N;i++)
for (j=0;j<P;j++) {
printf("Inserisci elemento di riga %d e colonna %d: ", i, j);
scanf("%d", &b[i][j]);
}
printf("\nCalcoliamo il prodotto \n");
for (i=0;i<M;i++)
for(j=0;j<P;j++) {
c[i][j]=0;
for(k=0;k<N;k++)
c[i][j]=c[i][j]+a[i][k]*b[k][j];
}
printf("\nStampiamo i dati della prima matrice \n");
for (i=0;i<M;i++) {
printf("\n");
for(j=0;j<N;j++)
printf("\t%d", a[i][j]);
}
printf("\nStampiamo i dati della seconda matrice \n");
for (i=0;i<N;i++) {
printf("\n");
for(j=0;j<P;j++)
printf("\t%d", b[i][j]);
}
printf("\nStampiamo i dati della matrice prodotto \n");
for (i=0;i<M;i++) {
printf("\n");
for(j=0;j<P;j++)
printf("\t%d", c[i][j]);
}
}
Ovviamente proponete pure il vostro metodo nei commenti sotto.
Alcuni link utili:
Media dei numeri in un array in C
Selection sort in linguaggio C
Insertion Sort in linguaggio C
Ricerca di un elemento in un array
In questa lezione vedremo come effettuare la ricerca di un elemento in un array.
Nella programmazione, spesso è necessario cercare un elemento all’interno di un array. In questo articolo, esploreremo due metodi per affrontare questo problema utilizzando il linguaggio C. Il primo metodo sarà implementato senza l’uso di funzioni, mentre il secondo sfrutterà funzioni per rendere il codice più modulare e leggibile.
Ricerca di un elemento in un array – Metodo Senza Funzioni
In questa prima soluzione, affronteremo il problema senza l’ausilio di funzioni.
Il programma consente all’utente di inserire una serie di numeri in un array e dopo di cercare un numero specifico all’interno di quell’array. Alla fine, viene visualizzato il numero di volte che il numero cercato compare nell’array.
Ecco in dettaglio i passaggi che effettueremo:
- Viene dichiarato un array
a
di interi con dimensioneMAX
. - Vengono dichiarate le variabili
n
(per memorizzare il numero di elementi dell’array),i
(per contare gli elementi durante il loop),x
(il numero da cercare nell’array) ecount
(per contare quante volte il numero compare nell’array). - Dapprima l’utente inserisce il numero di elementi dell’array tramite
scanf()
e lo memorizza nella variabilen
. - Dopo l’utente inserisce gli elementi dell’array utilizzando un loop
for
, dovei
varia da 0 an-1
. Ogni elemento viene memorizzato nell’arraya
. - L’utente inserisce il numero da cercare nell’array che sarà memorizzato in una variabile
x
. - Poi viene eseguito un loop
for
per attraversare tutti gli elementi dell’array. Ogni elemento viene confrontato con il numero cercatox
. Se l’elemento è uguale ax
, incrementacount
. - Alla fine del loop, il programma determina se
count
è uguale a zero. Se è così, il numero cercato non è stato trovato nell’array e viene stampato un messaggio appropriato. Altrimenti, viene stampato il numero di volte che il numero cercato appare nell’array. - Il programma restituisce
0
per indicare il completamento senza errori.
Algoritmo per la ricerca
Ecco dunque l’implementazione dell’algoritmo:
#include <stdio.h>
#define MAX 100
int main() {
int a[MAX];
int n, i, x, count = 0;
printf("Inserisci il numero di elementi nell'array: ");
scanf("%d", &n);
printf("Inserisci gli elementi dell'array:\n");
for (i = 0; i < n; i++) {
printf("Elemento %d: ", i + 1);
scanf("%d", &a[i]);
}
printf("Inserisci il numero da cercare nell'array: ");
scanf("%d", &x);
for (i = 0; i < n; i++) {
if (a[i] == x) {
count++;
}
}
if (count == 0) {
printf("Il numero %d non è stato trovato nell'array.\n", x);
} else {
printf("Il numero %d è stato trovato %d volte nell'array.\n", x, count);
}
return 0;
}
Questo metodo è semplice e diretto ma può diventare inefficiente per array molto grandi, poiché richiede un confronto con ogni elemento dell’array.
Potremmo infatti tener conto di varie ottimizzazioni, ad esempio potremmo utilizzare una tabella di frequenza, invece di attraversare l’array ogni volta per contare quante volte appare un numero. Inizializziamo un array di frequenza con dimensione pari al valore massimo possibile (ad esempio, se il massimo è 100, l’array di frequenza sarà di dimensione 101) e quindi attraversiamo l’array una volta sola, incrementando il contatore corrispondente all’indice dell’array di frequenza per ogni numero incontrato. Questo riduce la complessità temporale da O(n^2) a O(n).
#include <stdio.h>
#define MAX 100
int main() {
int a[MAX] = {0}; // Inizializza l'array con zeri
int freq[MAX] = {0}; // Tabella di frequenza
int n, i, x;
printf("Inserisci il numero di elementi nell'array: ");
scanf("%d", &n);
printf("Inserisci gli elementi dell'array:\n");
for (i = 0; i < n; i++) {
printf("Elemento %d: ", i + 1);
scanf("%d", &a[i]);
freq[a[i]]++; // Incrementa la frequenza del numero inserito
}
printf("Inserisci il numero da cercare nell'array: ");
scanf("%d", &x);
if (freq[x] == 0) {
printf("Il numero %d non è stato trovato nell'array.\n", x);
} else {
printf("Il numero %d è stato trovato %d volte nell'array.\n", x, freq[x]);
}
return 0;
}
Ricerca di un elemento in un array – Metodo con le Funzioni
Sviluppiamo adesso una soluzione, utilizzando le funzioni per suddividere il codice in blocchi più gestibili e leggibili.
Svilupperemo alcune funzioni:
- Funzione
inserisciArray
: Questa funzione consente all’utente di inserire elementi nell’array. Chiede all’utente quanti elementi vuole inserire, quindi utilizza un ciclofor
per leggere ciascun elemento dall’input e memorizzarlo nell’arraya[]
. Restituisce il numero totale di elementi inseriti. stampaArray
: Questa funzione stampa tutti gli elementi dell’array. Utilizza un ciclofor
per scorrere l’array e stampare ciascun elemento su una riga separata.- Funzione
ricercaElemento
: Questa funzione cerca quante volte un certo numero appare nell’array. Chiede all’utente di inserire il numero da cercare e quindi utilizza un ciclofor
per scorrere l’array e contare quante volte il numero cercato appare. Alla fine, stampa il numero di occorrenze del numero cercato nell’array. main
: La funzione principale del programma si occupa di dichiarare un arraya[]
di dimensioneMAX
e una variabilen
per memorizzare il numero di elementi inseriti. Dopo chiama la funzioneinserisciArray
per inserire gli elementi nell’array, quindi chiama la funzionestampaArray
per stampare gli elementi dell’array. Infine, chiama la funzionericercaElemento
per cercare il numero specificato nell’array e stampare il risultato.
Ecco dunque il codice completo:
#include <stdio.h>
#define MAX 100
int inserisciArray(int a[]) {
int n, i;
printf("Quanti elementi vuoi inserire nell'array?: ");
scanf("%d", &n);
for (i = 0; i < n; i++) {
printf("Inserisci elemento %d: ", i + 1);
scanf("%d", &a[i]);
}
return n;
}
void stampaArray(int a[], int n) {
int i;
printf("Elementi dell'array:\n");
for (i = 0; i < n; i++) {
printf("%d\t", a[i]);
}
printf("\n");
}
void ricercaElemento(int a[], int n) {
int x, i, count = 0;
printf("Inserisci il numero da cercare nell'array: ");
scanf("%d", &x);
for (i = 0; i < n; i++) {
if (a[i] == x) {
count++;
}
}
if (count == 0) {
printf("Il numero %d non è stato trovato nell'array.\n", x);
} else {
printf("Il numero %d è stato trovato %d volte nell'array.\n", x, count);
}
}
int main() {
int a[MAX], n;
n = inserisciArray(a);
stampaArray(a, n);
ricercaElemento(a, n);
return 0;
}
Quindi, questo programma fornisce un’interfaccia semplice per manipolare gli array, permettendo all’utente di inserire elementi, visualizzare gli elementi dell’array e cercare quanti volte un certo numero appare nell’array.
Ricerca di un elemento in un array – Tabella di frequenza
Possiamo usare una soluzione che utilizza una tabella di frequenza per tenere traccia delle occorrenze di ciascun elemento presente nell’array.
Introduciamo quindi un array di frequenza freq
, inizializzato con tutti gli elementi a 0. Ogni volta che incontriamo un elemento nell’array, incrementiamo il contatore corrispondente nell’array di frequenza. Alla fine, controlliamo il valore di frequenza per l’elemento cercato e stampiamo il risultato. Questo approccio riduce la complessità della ricerca a O(1), poiché stiamo semplicemente accedendo direttamente alla frequenza dell’elemento anziché scorrere l’intero array per contare le occorrenze.
Ecco dunque il codice completo:
#include <stdio.h>
#define MAX 100
#define MAX_ELEMENT 1000
int inserisciArray(int a[]) {
int n, i;
printf("Quanti elementi vuoi inserire nell'array?: ");
scanf("%d", &n);
for (i = 0; i < n; i++) {
printf("Inserisci elemento %d: ", i + 1);
scanf("%d", &a[i]);
}
return n;
}
void stampaArray(int a[], int n) {
int i;
printf("Elementi dell'array:\n");
for (i = 0; i < n; i++) {
printf("%d\t", a[i]);
}
printf("\n");
}
void ricercaElemento(int a[], int n) {
int freq[MAX_ELEMENT] = {0}; // Array di frequenza
int x, i;
printf("Inserisci il numero da cercare nell'array: ");
scanf("%d", &x);
// Calcola la frequenza di ciascun elemento nell'array
for (i = 0; i < n; i++) {
freq[a[i]]++;
}
// Controlla se l'elemento è presente e stampa la sua frequenza
if (freq[x] == 0) {
printf("Il numero %d non è stato trovato nell'array.\n", x);
} else {
printf("Il numero %d è stato trovato %d volte nell'array.\n", x, freq[x]);
}
}
int main() {
int a[MAX], n;
n = inserisciArray(a);
stampaArray(a, n);
ricercaElemento(a, n);
return 0;
}
Conclusioni
In questa lezione abbiamo esplorato un semplice programma in linguaggio C che consente agli utenti di ricerca elementi in un array. Nelle prossime lezioni continueremo a lavorare con gli array in C.
Link utili:
Inserire dati in una matrice
Realizziamo un algoritmo che permetta di inserire dati in una matrice, definita anche array bidimensionale, in cui le dimensioni sono definite dall’utente. Potete consultare un piccolo tutorial sulle matrici al seguente link.
Quindi i passaggi da seguire sono semplicemente questi:
- Richiesta delle dimensioni
- Inserimento dati
- Visualizzazione matrice
Algoritmo in linguaggio C per inserire i dati in una matrice
Per prima cosa includiamo la libreria stdio.h tramite il comando
#include <stdio.h>
Poi definiamo il numero massimo di righe e di colonne, impostandole ad esempio al valore 100.
#define N 100
#define M 100
Quindi procediamo chiedendo di inserire il numero di righe e controllando che il valore inserito non sia maggiore di 100 (come definito sopra) e non sia minore di 1.
In poche parole se inserisco un numero minore di 1 oppure maggiore della dimensione massima delle righe il valore viene scartato e si richiede di nuovo l’inserimento.
do {
printf("Dammi il numero di righe: ");
scanf("%d", &m);
} while ((m>M) || (m<1));
Lo stesso ragionamento lo facciamo pure per le colonne.
do {
printf("Dammi il numero di colonne: ");
scanf("%d", &n);
} while ((n>N)|| (n<1));
Un semplice controllo dell’input insomma.
Adesso possiamo inserire i dati nella nostra matrice.
Quindi utilizziamo due cicli, uno più esterno che scandisce mediante la variabile i le righe e un altro più interno che percorre per mezzo della variabile j le colonne.
Iniziamo allora ad inserire l’elemento di posto (0,0) ovvero di riga zero e colonna zero poi l’elemento di posto (0,1) e così via.
Cioè si riempie tutta la prima riga, poi si passa alla seconda riga e così via.
printf("\nInseriamo i dati nella matrice \n");
for (i=0;i<m;i++)
for (j=0;j<n;j++) {
printf("Inserisci elemento di riga %d e colonna %d: ", i, j);
scanf("%d", &a[i][j]);
}
Infine non ci resta che visualizzare la nostra matrice. Per fare ciò utilizzeremo sempre due cicli for annidati uno nell’altro.
printf("\nStampiamo i dati \n");
for (i=0;i<m;i++) {
printf("\n");
for(j=0;j<n;j++)
printf("\t%d", a[i][j]);
}
Programma completo per inserire e visualizzare i dati in una matrice.
#include <stdio.h>
#define N 100
#define M 100
int a[M][N];
main() {
int n,m,i,j;
do {
printf("Dammi il numero di righe: ");
scanf("%d", &m);
} while ((m>M) || (m<1));
do {
printf("Dammi il numero di colonne: ");
scanf("%d", &n);
} while ((n>N)|| (n<1));
printf("\nInseriamo i dati nella matrice \n");
for (i=0;i<m;i++)
for(j=0;j<n;j++) {
printf("Inserisci elemento di riga %d e colonna %d: ", i, j);
scanf("%d", &a[i][j]);
}
printf("\nStampiamo i dati \n");
for (i=0;i<m;i++) {
printf("\n");
for(j=0;j<n;j++)
printf("\t%d", a[i][j]);
}
}
Chiaramente ci possono essere altre soluzioni per implementare questo algoritmo, proponete pure la vostra.
Alcuni link utili:
Somma elementi diagonale principale di una matrice in C
Somma elementi cornice esterna in C
Sommare i numeri di una matrice in C
Ricerca elementi in una matrice in C
Inserire dati in una matrice in C
Commenti recenti