Gestione di una coda in C

Gestione di una coda in C

In questa lezione studieremo la gestione di una coda in C.

Una coda (o queue) è una struttura dati astratta che, al contrario della pila, utilizza una politica di tipo FIFO. Ovvero il primo elemento ad entrare è anche il primo ad uscire.

Nella coda quindi l’inserimento avviene ad una estremità (coda), mentre la cancellazione e il prelievo dei dati avvengono all’altra estremità, cioè dalla testa.

Gestione di una coda in C mediante un array

Anche la gestione della coda può essere realizzata appoggiandosi ad un array.

Utilizzeremo inoltre una variabile fine per indicare l’ultima posizione occupata.

Dunque per inizializzare o svuotare la coda assegniamo all’indice fine il valore -1.

Quando facciamo l’operazione Pop dobbiamo spostare di una posizione a sinistra gli altri elementi.

La funzione Push aggiunge un nuovo elemento in coda e aggiorna l’indice fine.

Ecco dunque il semplice algoritmo che realizza le operazioni di inserimento ed estrazione di un elemento in un coda in c. Inoltre implementeremo le operazioni di stampa e svuotamento della coda.

Anche in questo esercizio, proposto principalmente a scopo didattico, facciamo uso delle variabili globali.

Ecco dunque il listato completo sulla gestione di una coda in C:

#include <stdio.h>

#define MAX 3

int fine;
int Coda[MAX];

int menu_scelta(void)
{
  int selezione = 0;
  do
    {
    printf("\n" );
    printf("\n1 -> Aggiungi un dato" );
    printf("\n2 -> Estrai un dato");
    printf("\n3 -> Svuota pila");
    printf("\n4 -> Stampa pila");
    printf("\n5 -> Esci");
    printf("\n" );
    printf("\nEffettua una scelta: " );
    scanf("%d", &selezione );
    }
    while (selezione<1 || selezione>5);
  return selezione;
}

void Push() {
	int n;
	
	if(fine==MAX) 
	         printf("\n -> Coda piena" );
	else {
		 printf("\nInserisci un dato: " );
		 scanf("%d", &n);
		 Coda[fine++]=n;
	}		
}

void Pop() {
	int i;
	if(fine==-1) 
	     printf("\n - Coda vuota" );
	else {
		 printf("%d", Coda[0]);
		 for(i=1;i<=fine;i++)
		 	Coda[i-1]=Coda[i];
		fine--;
	}			
}

void Clear() {
	fine=-1;
	printf("\n -> Coda svuotata" );			
}

void Print() {
	int i;
	if(fine==-1) 
	       printf("\n -> Coda vuota" );
	else 
              for(i=0;i<fine;i++)	
                  printf("indice i: %d elemento %d\n", i, Coda[i]);			

}

int main(){
	int scelta;
	
	while((scelta=menu_scelta())!=5){
             switch(scelta){
                   case 1: 
			Push();
                        break;
                   case 2:
			Pop();
               	        break;
                   case 3:
			Clear();
            	        break;
                   case 4: 
			Print();
			break;
	        case 5: 
		        break;
             }
    }             
    return 0;
}

Chiaramente questo è solo un esempio di gestione di una coda in C, prossimamente proporrò altri esercizi.

Alcuni link utili

Indice argomenti linguaggio C

La funzione fopen

La funzione fclose

Funzione fprintf

Funzione fscanf

Allocazione dinamica della memoria con malloc

Strutture in C

Typedef struct in C

Esercitazione sulle struct in C

Realizzare un menù di scelta in C

Strutture complesse in C

Come sommare gli elementi della cornice esterna

Come sommare due matrici

Matrice trasposta

Prodotto tra matrici

Ricerca elementi in una matrice

Tavola pitagorica in C

Array multidimensionali

Quick sort in C

Selection sort in C

Merge sort in C

Insertion Sort in C

Precedente e successivo di un numero in Scratch

Precedente e successivo di un numero in Scratch

Continuiamo ad esercitarci proponendo un algoritmo per il calcolo del precedente e successivo di un numero in Scratch 3.

L’algoritmo è stato già svolto con i diagrammi a blocchi: precedente e successivo di un numero con algobuild.


Precedente e successivo di un numero in Scratch 3

Vi mostro adesso lo stesso procedimento con Scratch 3:

precedente e successivo

Quindi innanzitutto, dopo il blocco di inizio, chiediamo in input un numero. Dopo memorizziamo nella variabile numero la risposta, stiamo cioè assegnando un valore inserito da tastiera alla variabile numero.

Poi creiamo una variabile precedente e gli assegniamo il valore di numero – 1. Poi una variabile successivo e gli assegniamo il valore di numero +1.

Infine con il blocco dire visualizziamo in output i risultati così ottenuti.

Non dimentichiamoci di inserire il blocco ferma tutto per terminare l’algoritmo.

Per chi volesse visionare il codice in C++, può notare come non sia per niente difficile tradurre un diagramma a blocchi.

#include <iostream>

using namespace std;

main() {
	int n,s,p;
		
	cout<<"Inerisci il numero: ";
	cin>>n;

	s=n+1;
	p=n-1;
	
	cout<<"Il successivo e': "<<s<<endl;
	cout<<"Il precedente e': "<<p;
	
}

Secondo esempio sui successivi di un numero

Realizziamo un altro esempio di algoritmo, molto simile al precedente, che calcola i successivi tre numeri di un numero preso in input.

numeri successivi

L’esempio utilizza quattro variabili:

numero il numero preso in input

successivo il numero +1

successivo_due il numero +2

successivo_tre il numero +3

Dopo averli calcolati, visualizziamo in output il risultato.

Lo stesso programma lo sviluppiamo in C++:

#include <iostream>

using namespace std;

main() {
	int n,s1,s2,s3;
		
	cout<<"Inerisci il numero: ";
	cin>>n;

	s1=n+1;
	s2=n+2;
	s3=n+3;
	
	cout<<"I tre numeri successivi sono: "<<s1<<"\t"<<s2<<"\t"<<s3<<"\t"<<endl;	
}

In queste lezioni abbiamo approfondito l’uso delle variabili, nelle prossime lezioni presenteremo degli elementi nuovi. In particolare impareremo a inserire degli sfondi e ad utilizzare altri sprite.

Alcuni link utili

Indice tutorial scratch 3.0

Indice argomenti scratch 2.0

Numeri primi in Scratch

Massimo fra tre numeri in Scratch

Minimo tra 3 numeri in Scratch

Numeri perfetti con algobuild

Numeri amicabili

Selecion sort in Scratch

Esempio di successione di Fibonacci con Algobuild

La successione di Fibonacci in C++

Sviluppo con Algobuild della successione di Fibonacci

Area del cerchio in Scratch 3

Area del cerchio in Scratch 3

In questa lezione proponiamo un semplice esercizio per lo sviluppo dell’area del cerchio in Scratch 3.

L’algoritmo è molto semplice, ed è stato già sviluppato con i diagrammi a blocchi, se volete potete consultarlo al seguente link: area del cerchio.

Quindi prendiamo in input il raggio e calcoliamo l’area con la formula: areaCerchio = raggio * raggio * piGreco.

Script per il calcolo dell’area del cerchio in Scratch 3

Ecco dunque il diagramma a blocchi completo:

area del cerchio

I passaggi da seguire per il calcolo dell’area del cerchio in Scratch 3, sono questi:

1 Inizio: andiamo su situazioni e scegliamo quando si clicca sulla bandiera verde.

2 – Istruzione: andiamo su sensori e scegliamo il blocco chiediCome ti chiami?’ e attendi. Sostituiamo al posto di Come ti chiami? il testo Inserisci il raggio.

3 – Creazione di una variabile: andiamo su variabili e creiamo la variabile di nome raggio.

4 – Istruzione: trasciniamo il blocco porta raggio a.

5 – Risposta: inseriamo il blocco risposta che si trova nella sezione sensori.

6 – Creazione di una variabile: andiamo su variabili e creiamo la variabile di nome piGreco. In realtà piGreco in questo caso è una costante, ma in Scratch vengono creati allo stesso modo.

7 – Istruzione: trasciniamo il blocco porta piGreco a 3.14

8 – Creazione di una variabile: andiamo su variabili e creiamo la variabile di nome areaCerchio.

9 – Istruzione: trasciniamo il blocco porta areaCerchio a.

10 – Operatore: trasciniamo due volte l’operatore con il *.

11 – Variabili: trasciniamo le variabili raggio e piGreco all’interno degli spazi vuoti del blocco operatore *.

12 – Istruzione: andiamo su sensori e scegliamo il blocco chiediCome ti chiami?’ e attendi. Sostituiamo al posto di Come ti chiami? il testo con la variabile area.

13 – Fine: andiamo su controllo e scegliamo ferma tutto

Modifichiamo adesso l’algoritmo includendo anche il calcolo della circonferenza in Scratch 3 e inserendo le unità di misura.

pi greco

Programma C++

Allego il programma per il calcolo dell’area e della circonferenza del cerchio in C++, per chi volesse consultarlo.

#include <iostream>

using namespace std;

#define piGreco 3.14 

main() {
	float raggio,area,circonferenza;
		
	cout<<"Inerisci il raggio: ";
	cin>>raggio;

	area=raggio*raggio*piGreco;
	circonferenza=2*raggio*piGreco;
	
	cout<<"l'area e': "<<area<<endl;
	cout<<"la circonferenza e': "<<circonferenza;
	
}

Alcuni link utili

Indice tutorial scratch 3.0

Indice argomenti scratch 2.0

Numeri primi in Scratch

Massimo fra tre numeri in Scratch

Minimo tra 3 numeri in Scratch

Numeri perfetti con algobuild

Numeri amicabili

Selecion sort in Scratch

Esempio di successione di Fibonacci con Algobuild

La successione di Fibonacci in C++

Sviluppo con Algobuild della successione di Fibonacci