Articolo in evidenza

Tutorial C++ n.4

Argomenti

  • I sotto programmi in C++
  • Chiamata a sotto programma in C++ per valore e per riferimento
  • Buone pratiche per la scrittura di sotto programmi in C++
  • Array e Matrici e uso nei sotto programmi in C++
  • Le Stringhe con la libreria <string> in C++
  • Le enumerazioni e le struct in C++
  • Le tabelle in C++ – Caso di studio

Sorgenti GitHub del Tutorial 4 C++

Programmazione in C++ – Avanzata – Video 1

Nel video che segue, ti faccio vedere come realizzare un programma in C++ che usa dei sotto programmi con i puntatori. Inizialmente ti faccio vedere come scrivere con il bellissimo software Algobuild un programma con sotto programmi che ritornano array.
Il Video è consigliato a chi è già in possesso di competenze di base di programmazione.
Potrai scaricare il sorgente dei files dal mio github che ho linkato sotto il video.

Sorgenti: Link al mio Github

Video – Installare e testare Code::Blocks in Linux Ubuntu

Code::Blocks è un IDE Integrated Devolopmente Enviroment per tutti i sistemi operativi Linux/Windows/mac che consente lo sviluppo software in Linguaggio C/C++ e altro ancora.
Nel video Installiamo e testiamo con un semplice programma in C++ l’ambiente di sviluppo.
Ricordati, che per usare Code::Blocks in linux devi installare anche GCC.


Le strutture dati – Lettura n.1

Le strutture dati rivestono una grande importanza, nella scrittura di programmi per il calcolatore, in quanto permettono di creare dei dati strutturati organizzati secondo quelle che sono le richieste di progettazione del progetto software. Tali strutture dati possono essere derivate dai tipi di dati elementari o semplici o atomici disponibile in tutti i linguaggi di programmazione moderni dal C al C# passando per Java e Python.
E’ pertanto importante avere piena conoscenza e capacità di utilizzare tali strutture dati.

Strutture dati definizione

Strutture dati definizione

Per definizione una struttura dati è un Insieme di dati organizzati in modo collettivo a partire dai tipi di dati atomici o semplici.
Le strutture dati sono distinte in base al meccanismo di memorizzazione che può essere la Memoria RAM o una memoria di massa come un Hard Disk o una chiavetta USB.
Per tale motivo possono essere temporanee o permanenti a seconda se la memorizzazione avviene in RAM o su memoria di massa.
Le strutture dati, inoltre sono classificate in:
Statiche o dinamiche; nel primo caso la struttura mantiene le sue caratteristiche e dimensione, nel secondo caso può variare la dimensione e la struttura durante l’esecuzione del programma.
Analizziamo le strutture di dati temporanee, come già detto perché utilizzano la Memoria RAM per la loro memorizzazione, in un’altra lettura è discussa l’uso di struttura dati permanenti come i Files o in casi molto più complessi I Database, che rappresentano gli Archivi di dati.
Le strutture dati sono inoltre classificabili in:

  • Omogenee ovvero composte da dati dello stesso tipo; in queste rientrano:
    • gli array o vettori
    • le matrici
    • le tabelle
    • le enumerazioni o insiemi
  • Eterogenee
    • Record

Le Enumerazioni rappresentano un insieme ordinato di valori in numero finito ad esempio:
colore={rosso,verde,giallo,blu}
Sono strutture dati che sono di solito utilizzate per discriminare varie possibilità per certe tipologie di dati in modo da non consentire all’utente una scelta arbitraria. Ad esempio un programma che richieda l’ordine di un capo di abbigliamento da parte di un negoziante per una nuova fornitura può obbligare lo stesso a scegliere un insieme predefinito di colori disponibili e non tutti quelli possibili. Gli array o vettori sono strutture di dati identificate da un nome collettivo, le cui componenti sono dello stesso tipo e sono selezionate da un indice,
Ad esempio in C/C++ int x[]={1,-3,0,1,2}; float z[]={3.14,6.28,1.414}; in questo modo è dichiarato un array con il numero di elementi e la dimensione rimane fissa.
In Python per definire un Array è possibile utilizzare la notazione:
vet =[1.2,3,4] oppure cars=[“fiat”,”ford”,”opel”]
In Java gli array possono essere definiti con la seguente notazione:
int [] x ={1,2,3,4}; oppure string [] words =
{‘apple’, ‘banana’, cherry’};
In C# int[] numeri = {1,2,3,4};
In tutti questi casi si parla di dichiarazione di array come lista di elementi, è possibile dichiarare degli array in modo statico e dinamico a seconda delle necessità costituite da un numero di elementi predefinito o vuoto.

Prospetto riassuntivo per vari linguaggi di programmazione molto utilizzati.

Linguaggio di programmazioneDichiarazione statica
C++int x[10];
C#int [] x = new int[10];
Javaint [] = new int[10];
Pythondipende se trattato come lista o con la libreria NumPy
Definizione dell’array in vari linguaggi di programmazione

Come si può notare in Python non esiste una dichiarazione unica, è possibile dichiarare un array vuoto con la dichiarazione del tipo: lista =[] ho inserito la parola lista perché in Python l’array può essere trattato come lista o come array se uso la libreria Numpy. L’uso di Numpy sarà affrontato in una lettura a parte. Solo un esempio di come dichiarare un array con Numpy in Python:

import numpy as np
x=np.array([])
Queste due righe dichiarano un array con Numpy vuoto.

Nella prossima lettura esamineremo le altre strutture dati non discusse.


Video Lezione n.5 Creare un’applicazione WxWidgets

Video Lezione n.5 C++ – Creare un’applicazione WxWdigets

Sommario della lezione:

  • Creare una semplice applicazione in C++ che sfrutta le potenzialità dell’interfaccia grafica grazie all’uso dei GUI in C++.
  • Utilizzare le librerie open source WxWidgets in C++ per gestire un menu e gli eventi. Tutto in salsa OOP (Programmazione Orientata agli Oggetti)

Configurare Linux come server di Desktop remoto

In questo breve articolo, ti spiego come configurare Linux come server RDP per accettare connessioni a desktop remoto via client RDP (Remote Desktop Protocol) anche da sistemi Windows/ChromeOS/Android e Mac.
Nella sostanza potrai accedere al tuo desktop Linux via rete LAN o WLAN o Internet per usare il computer con Linux come se tu fossi davanti al Calcolatore.
Ed ecco l’articolo:

Configurare Linux come Server di Desktop Remoto

Il sistema Linux come il sistema operativo Windows, prevede la possibilità di attivare i servizi di Desktop Remoto, funzione molto utile quando è necessario

connettersi al proprio computer linux da un’altra postazione magari anche da un altro sistema operativo.

Lo standard TCP/IIP prevede un protocollo per il Destkotp Remoto chiamato Remote Desktop Protocol (RDP) realizzato da Microsoft e portato anche su

sistema Linux. Tale protocollo prevede che il server ascolto sulla porta TCP 3389 (la porta è comunque personalizzabile), e i client accedono al loro Desktop

Remoto e operano come se fisicamente fossero davanti a quel calcolatore.  L’aspetto più interessante è la possibilità di utilizzare anche le periferiche

connesse al server comprese le periferiche di riproduzione multimediale oltre che la possibilità di accedere dal sistema client alle unità di memorizzazione

remote come se fossero collegate alla macchina cliente.

Nella rete LAN e comunque sul Server se presente un firewall occorre permettere il traffico TCP sulla porta 3389. Per permettere l’accesso da rete Internet, ad

esempio da una macchina esterna alla nostra rete occorre utilizzare alcune procedure aggiuntive:

  • abilitare Port Forwarding sul Router/Firewall perimetrale ovvero quello connesso ad Internet
  • abilitare un servizio tipo dynadns e simili per permettere l’accesso a Router/Firewall che hanno IP pubblico dinamico. Questo capita molto spesso con accessi a Internet residenziali o domestici.
  • Abilitare la crittografia che il protocollo prevede per lavorare in sicurezza.

Una seconda soluzione più sicura potrebbe prevedere una macchina bastione agganciata ad Internet e da questa poi si accede all macchina reale via RDP.

Per realizzare tutto ciò stiamo dicendo che si accede ad esempio su un Raspberry PI 3/4 che è configurato come server di Desktop Remoto dove però sono

presenti solo l’applicazione Server e non i nostri dati personali, e il client RDP verso la macchina Server Reale.

In questo modo un potenziale attaccante può avere più difficoltà per raggiungere i nostri dati, poichè deve prima compromettere la macchina bastione e poi

eventualmente accedere alla macchina reale.

Cosa occorre per configurare il Server RDP

Sul nostro sistema Linux ad esempio Ubuntu possiamo eseguire la seguente sequenza per configurare un applicativo client-server chiamo XRDP.

E’ quindi necessario eseguire i seguenti comandi da terminale:

sudo apt- get install xrdp

Nel nostro utente dobbiamo scegliere quale desktop enviroment DE scegliere. Ubuntu installa Unity che a mio avviso è un pò pesante se per esempio si pensa di accedere da Internet.

E’ possibile installare ad esempio il DE Mate o Xfce4. Nell’ipotesi di installare Mate, occorre eseguire il comando:

sudo apt-get install mate-desktop

Saranno installati una serie di pacchetti una volta che l’installazione è completata, scegliamo gli utenti che dovranno accedere via RDP al Server.

La configurazione di RDP con XRDP è per utente quindi significa che per ogni utente occorre creare una configurazione specifica.

Per fare questo immaginiamo di essere nell’utente specifico, lanciamo da linea di comando i seguenti comandi che creano due file di configurazione, molto

semplici:

echo mate-session > ~/.xsession

echo mate-session > ~/.Xclient

chmod +x ~/.xsession

chmodo +x ~/.Xclient

 Io consiglio Raspberry PI 4 per attivare il client REDP Remuina su Macchina Raspberry PI 4. IO uso a casa un Raspberry con Servizio Desktop Remoto da Internet e poi da questo dispositivo bastione mi collego alla mia macchina Server RDP con le mie utente.

Questi comandi creano due file di configurazione nella Home Directory dell’utente prescelto come accessibile via RDP e rendono eseguibili i due file di configurazione.

Il Client 

Il client in Windows è Desktop Remoto di Windows, basta andare in Accessori -> Connessione Desktop Remoto

Utilizzando il client di Windows occorre digitare l’indirizzo IP del server o il suo nome. POi occorrono le credenziali di accesso al sistema server Linux.

Ecco alcuni screenshot di quello che avviene in Windows attiva la connesione a desktop remoto (la terza schermata) inserendo indirizzo IP e/o nome DNS del PC da raggiungere, poi configurare il l’accesso RDP sulla macchina Linux che risponde a quell’indirizzo IP e/o nome host e scegliere nel campo Sessione Xorg, e inserire il nome utente e password accreditati sulla macchina Linux (schermata numero 2) che funge da RDP Server. Se tutto è stato fatto visualizzerai il DE di Linux (scherma numero 1).

Uso delle struct in C/C++

Le struct in linguaggio C/C++

Cosa sono le Struct ? Sono modelli di strutture dati definite dall’utente in relazione alla rappresentazione dati che occorre nel problema; nel linguaggi di programmazione di qualunque tipo sono sempre ammessi come tipologia di struttura dati. 
E’ definita una struttura dati eterogenea in quanto può essere composta da tipi di dati semplici o strutturati come ad esempio un array. 
Per poter utilizzare tale strutture l’utente deve dichiarare nel programma la struct con la dichiarazione:

struct nome struttura

{  tuoi1 nome dato;

  tipo 2 nome dato 2;

  …..

 tipo n nome dato n;

};

ad esempio

struct alunno {char nome[20];

 char cognome[20];
 char classe[4];
 char sezione[2];
 int age;
 float media_voti;
};

In questo caso è dichiarata una struttura dati contenente tipi di dati diversi definiti dall’utente in relazione al suo problema. Tale dichiarazione, va effettuata prima che il programmatore definisca delle variabili statiche o dinamiche legate all’uso del nuovo modello dati. 
Infatti, fintantoché la struttura non è dichiarata come variabile non è utilizzabile all’interno del programma e di suoi eventuali sotto programmi. 
La dichiarazione avviene in modo generico con la dichiarazione tipica:

struct nome struttura nome variabile;

oppure se è necessario dichiarare un array di strutture è possibile utilizzare la sintassi:

struct nome struttura nome variabile[dimensione];

La clausola typedef

In entrambi i casi le variabili dichiarate sono statiche e non dinamiche (non si è fatto uso dei puntatori).

typedef struct{

Una variante della dichiarazione, può essere ottenuta con la clausola typedef, la quale dichiara il nuovo tipo con un alias della struttura; in questo modo l’utente non è costretto a dichiarare la parola chiave struct quando dichiara la variabile di quel modello dati. 
Ad esemoio la dichiarazione della struttura di esempio diventa:

 char nome[20];
 char cognome[20];
 char classe[4];
 char sezione[2];
 int age;
 float media_voti;
}  alunno ;

In questo modo, l’utente dichiara la sua variabile indicando direttamente il nome della struttura come nuovo tipo. Ad esempio:

alunno a;

alunno a[100];

la prima dichiara una variabile di tipo alunno e la seconda un array composto da tante strutture alunno dello stesso tipo. 

Uso e accesso ai dati delle strutture

Per prima cosa, una volata dichiarate le strutture e le relative variabili associate con essa, il programmatore per accedere ai dati detti anche “campi” utilizza la seguente sintassi:

nome_variabile.campo

per assegnare un valore al campo è possibile utilizzare ad esempio la sintassi seguente:

alunno.cognome[]=”rossi”; 

o

alunno.cognome={‘r’,’o’,’s’,’s’,’i’,};

E’ utile notare che nel momento in cui è opportuno definire delle stringhe; ogni stringa termina con un carattere di terminazione ‘\0’, il quale si aggiunge come numero ai caratteri della stringa. In altre parole se il cognome è “rossi” la stringa avrà 6 caratteri e non 5 in quanto la memorizzazione avverrà nella seguente forma “rossi\0”.

Se in blocco si vuole assengare a tutti i campi della struttura un valore è possibile utilizzare la sintesssi:

nome variabile={valore1, valore2, …,valoren);

attribuendo i valori nei formati opportuni; nel senso che se è un numero non sono necessari le veirgolette, se trattasi di una stringa invece le virgolette sono necessarie. 


 Uso delle strutture

Le strutture possono essere definite anche come record ovvero  “registrazione”, la cui parola indica un aggregato di dati composto da dati di tipo diverso ognuno dei quali è caratterizzato da una dimensione. 
I dati che compongono la struttura detti “campi” concorrono insieme alla definizione di un informazione. 
Tali informazioni, possono a loro volta essere aggregati in array di record dette tabelle che ben si prestano alla memorizzazione in memoria RAM oppure su memoria di massa sotto forma di file di record. 

Esercizio

Realizzare un programma in C con l’uso delle function, che permetta di creare una tabella con record informativo, che contiene per ogni studente, il nome, il cognome, l’età, e la media che ha conseguito a fine anno. 
L’utente, inizialmente deve inserire i dati e poi attraverso un menù deve consentire le seguenti operazioni:

1- Stampa media dei voti con i dati degli alunni;

2- Visualizzazione della media di un alunno specifico

3- Visualizzazione dei dati degli alunni con voto massimo e minimo

4- Uscita dal programma

Realizzare una codifica in C

Esercizio svolto sulle struct in C/C++