Equazioni di primo grado in Scratch

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.

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

equazioni scratch

Chiaramente proponete pure la vostra soluzione nei commenti al fine di confrontarci.

Alcuni link utili

Disegnare poligoni regolari in scratch

Numeri primi in Scratch

La successione di Fibonacci in Scratch

Massimo fra tre numeri in Scratch

Minimo tra 3 numeri in Scratch

Numeri perfetti con algobuild

Numeri amicabili

Selecion sort in Scratch


Prodotto tra matrici in C

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:

Array multidimensionali

Tavola pitagorica in C

Matrice trasposta in C

Array o vettori in C

Media dei numeri in un array in C

Array con numeri random in C

Quick sort in linguaggio C

Selection sort in linguaggio C

Merge sort in linguaggio C

Insertion Sort in linguaggio C


Ricerca di un elemento in un array

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:

  1. Viene dichiarato un array a di interi con dimensione MAX.
  2. 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) e count (per contare quante volte il numero compare nell’array).
  3. Dapprima l’utente inserisce il numero di elementi dell’array tramite scanf() e lo memorizza nella variabile n.
  4. Dopo l’utente inserisce gli elementi dell’array utilizzando un loop for, dove i varia da 0 a n-1. Ogni elemento viene memorizzato nell’array a.
  5. L’utente inserisce il numero da cercare nell’array che sarà memorizzato in una variabile x.
  6. Poi viene eseguito un loop for per attraversare tutti gli elementi dell’array. Ogni elemento viene confrontato con il numero cercato x. Se l’elemento è uguale a x, incrementa count.
  7. 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.
  8. 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:

  1. Funzione inserisciArray: Questa funzione consente all’utente di inserire elementi nell’array. Chiede all’utente quanti elementi vuole inserire, quindi utilizza un ciclo for per leggere ciascun elemento dall’input e memorizzarlo nell’array a[]. Restituisce il numero totale di elementi inseriti.
  2. stampaArray: Questa funzione stampa tutti gli elementi dell’array. Utilizza un ciclo for per scorrere l’array e stampare ciascun elemento su una riga separata.
  3. 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 ciclo for per scorrere l’array e contare quante volte il numero cercato appare. Alla fine, stampa il numero di occorrenze del numero cercato nell’array.
  4. main: La funzione principale del programma si occupa di dichiarare un array a[] di dimensione MAX e una variabile n per memorizzare il numero di elementi inseriti. Dopo chiama la funzione inserisciArray per inserire gli elementi nell’array, quindi chiama la funzione stampaArray per stampare gli elementi dell’array. Infine, chiama la funzione ricercaElemento 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:

Corso linguaggio C

Array o vettori

Selection sort

Merge sort

Insertion Sort

Inserire dati in una matrice

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 due matrici in C

Sommare i numeri di una matrice in C

Matrice trasposta in C

Prodotto tra matrici in C

Ricerca elementi in una matrice in C

Inserire dati in una matrice in C

Tavola pitagorica in C

Array multidimensionali in C

Programma sui triangoli in C

Media dei numeri in un array in C

Array con numeri random in C

Quick sort in C

Selection sort in C

Merge sort in C

Insertion Sort in C