[:it]TPSIT – Programmazione di rete – Realizzazione di una chat [:]

[:it]

Salvator Dalì

Costruire un’applicazione client/server che realizza una chat, consentendo di scambiare messaggi tra un client e un server. Il client può terminare la connessione inserendo la parola FINE.

La chat viene realizzata con due programmi di rete: un programma server e un programma client. Le due persone che vogliono partecipare alla chat devono disporre di uno dei due programmi. La persona che esegue il programma server resta in attesa che l’altra persona si colleghi usando il programma client. Quando la connessione è stata attivata, la chat può avere inizio.

Si suppone che la chat venga eseguita all’interno della finestra del Prompt dei comandi di Windows o nella finestra Terminale di Linux. I messaggi da inviare vengono letti da tastiera e i messaggi ricevuti vengono visualizzati all’interno della finestra. Dopo aver stabilito la connessione, la chat viene gestita in modo sequenziale, cioè le operazioni sono svolte nel seguente ordine, stabilendo un protocollo di comunicazione:

[client]: legge il messaggio da tastiera e lo invia al server.

[server]: riceve il messaggio e lo visualizza.

[server]: legge il messaggio da tastiera e lo invia al client.

[client]: riceve il messaggio e lo visualizza.

La sequenza precedente viene realizzata con un ciclo infinito sia sul client che sul server. Il ciclo nel programma client termina quando si inserisce da tastiera la parola FINE, come mostra il seguente frammento di codice.

while (true) {

// legge il messaggio da tastiera

msgDaInviare = tastiera.readLine();
// interrompe la chat

if (msgDaInviare.equals(“FINE”))

break;
// invia il messaggio al server
// riceve il messaggio e lo visualizza
}

Si osservi che anche la parola FINE rappresenta un elemento del protocollo di comunicazione.
Il ciclo nel programma server termina quando viene ricevuto il valore null dal flusso di input della socket. Questo indica che il client si è sconnesso.

while (true) {

// riceve il messaggio

msgRicevuto = sIN.readLine();

if (msgRicevuto == null)

{ System.out.println(“Il client ha chiuso la chat.”);

break; }
// visualizza il messaggio
// legge il messaggio da tastiera
// invia il messaggio al client
}

Sia il client che il server devono gestire tre flussi di dati: – flusso di lettura di dati da tastiera – flusso di lettura di dati dalla socket – flusso di scrittura di dati sulla socket.

Questi tre flussi sono gestiti usando i seguenti oggetti:

In particolare il server deve inizializzare i flussi nel seguente ordine:

// flusso in uscita su socket

out = connessione.getOutputStream();

sOUT = new PrintWriter(out);

// flusso in ingresso da socket

in = new InputStreamReader(connessione.getInputStream());

sIN = new BufferedReader(in);

// flusso in ingresso da tastiera

input = new InputStreamReader(System.in);

tastiera = new BufferedReader(input);

Il client deve inizializzare i flussi nel seguente ordine:

// flusso in ingresso da socket

in = new InputStreamReader(connessione.getInputStream());

sIN = new BufferedReader(in);

// flusso in uscita su socket out = connessione.getOutputStream();

sOUT = new PrintWriter(out);

// flusso in ingresso da tastiera

input = new InputStreamReader(System.in);

tastiera = new BufferedReader(input);

Come si può notare il server inizializza prima il flusso in uscita e poi il flusso in ingresso, mentre il client fa l’opposto.

Per fare in modo che l’invio dei messaggi avvenga immediatamente si devono usare le seguenti istruzioni:

sOUT.println(msgDaInviare);

sOUT.flush();

Il metodo flush serve per svuotare il buffer del flusso di output e inviare i dati. Di seguito sono riportati i programmi completi, lato server e lato client.

Ecco il sorgente sa parte server:

// chat con una sola connessione
import java.net.*;
import java.io.*;
public class ServerChat {
public static void main(String args[])
{
ServerSocket sSocket;
Socket connessione = null;
int port = 2345;
InputStreamReader in, input;
BufferedReader sIN, tastiera;
OutputStream out;
PrintWriter sOUT;
String msgDaInviare;
String msgRicevuto;
try
{
sSocket = new ServerSocket(port);
System.out.println(“In attesa di connessioni…”);
// ciclo infinito
while (true)
{
connessione = sSocket.accept();
// flusso in uscita su socket
out = connessione.getOutputStream();
sOUT = new PrintWriter(out);
// flusso in ingresso da socket
in = new InputStreamReader(connessione.getInputStream());
sIN = new BufferedReader(in);
// flusso in ingresso da tastiera
input = new InputStreamReader(System.in);
tastiera = new BufferedReader(input);
System.out.println(“Chat inizializzata.”);
while (true) {
// stampa il messaggio ricevuto
msgRicevuto = sIN.readLine();
if (msgRicevuto == null)
{
System.out.println(“Il client ha chiuso la chat.”);
break;
}
System.out.println(“>> ” + msgRicevuto);
// legge il messaggio da tastiera
msgDaInviare = tastiera.readLine();
// invia il messaggio
sOUT.println(msgDaInviare);
sOUT.flush();
}
}
}
catch (IOException e)
{ System.out.println(e); }
try { connessione.close(); }
catch (IOException e)
{ System.out.println(e); }
}import java.net.*;
import java.io.*;
public class ClientChat {
public static void main(String[] args)
{
Socket connessione = null;
String server = “localhost”;
int port = 2345;
InputStreamReader in, input;
BufferedReader sIN, tastiera;
OutputStream out;
PrintWriter sOUT;
String msgDaInviare;
String msgRicevuto;
try {
connessione = new Socket(server, port);
System.out.println(“Connessione eseguita.”);
}
catch (IOException e)
{
System.out.println(e);
System.exit(-1);
}
try {
// flusso in ingresso da socket
in = new InputStreamReader(connessione.getInputStream());
sIN = new BufferedReader(in);
// flusso in uscita su socket
out = connessione.getOutputStream();
sOUT = new PrintWriter(out);
// flusso in ingresso da tastiera
input = new InputStreamReader(System.in);
tastiera = new BufferedReader(input);
System.out.println(“Chat inizializzata.”);
while (true)
{
// legge il messaggio da tastiera
msgDaInviare = tastiera.readLine();
// interrompe la chat
if (msgDaInviare.equals(“FINE”)) break;
// invia il messaggio
sOUT.println(msgDaInviare);
sOUT.flush();
// stampa il messaggio ricevuto
msgRicevuto = sIN.readLine();
System.out.println(“>> ” + msgRicevuto);
}
}
catch (IOException e)
{
System.out.println(e);
}
try {
connessione.close();
}
catch (IOException e)
{
System.out.println(e);
}
}
}

Ecco il sorgente da parte client:

import java.net.*;
import java.io.*;
public class ClientChat {
public static void main(String[] args)
{
Socket connessione = null;
String server = “localhost”;
int port = 2345;
InputStreamReader in, input;
BufferedReader sIN, tastiera;
OutputStream out;
PrintWriter sOUT;
String msgDaInviare;
String msgRicevuto;
try {
connessione = new Socket(server, port);
System.out.println(“Connessione eseguita.”);
}
catch (IOException e)
{
System.out.println(e);
System.exit(-1);
}
try {
// flusso in ingresso da socket
in = new InputStreamReader(connessione.getInputStream());
sIN = new BufferedReader(in);
// flusso in uscita su socket
out = connessione.getOutputStream();
sOUT = new PrintWriter(out);
// flusso in ingresso da tastiera
input = new InputStreamReader(System.in);
tastiera = new BufferedReader(input);
System.out.println(“Chat inizializzata.”);
while (true)
{
// legge il messaggio da tastiera
msgDaInviare = tastiera.readLine();
// interrompe la chat
if (msgDaInviare.equals(“FINE”)) break;
// invia il messaggio
sOUT.println(msgDaInviare);
sOUT.flush();
// stampa il messaggio ricevuto
msgRicevuto = sIN.readLine();
System.out.println(“>> ” + msgRicevuto);
}
}
catch (IOException e)
{
System.out.println(e);
}
try {
connessione.close();
}
catch (IOException e)
{
System.out.println(e);
}
}
}

 [:]

Pubblicato in Senza categoria | Lascia un commento

[:it]TPSIT – Programmazione di rete – Esempio applicazione client-server[:]

[:it]

Hans Arp

Realizzare un’applicazione client/server utile ai client per sincronizzare la data e l’ora con quella di un server. Il programma client si collega al server per ottenere le informazioni sulla data e sull’ora correnti. Il server, ogni volta che riceve una richiesta di connessione, invia al programma client l’informazione richiesta.

Programma Server (ServerClock.java)

Programma client

Per eseguire la precedente applicazione si devono usare due finestre del Prompt dei comandi in Windows, oppure due finestre Terminale in Linux. Nella prima finestra si esegue il programma server. Il server si ferma in attesa di ricevere le connessioni. A questo punto, nella seconda finestra, si esegue il programma client. Il risultato è che il client si collega al server sulla porta 3333. Il server crea una nuova connessione e invia al client l’informazione sulla data corrente. Successivamente interrompe la connessione e si mette in attesa di una nuova richiesta. Il client legge i dati che sono stati inviati dal server, li mostra a video e poi termina la connessione. Per interrompere l’esecuzione del programma server si deve digitare la combinazione di tasti Ctrl + C.

Oppure usando eclipse si riesce a riesce a simulare il comportamento.

Se si dispone di una rete con almeno due computer collegati, si può eseguire l’applicazione C/S in modo distribuito. Il programma server può essere eseguito su un computer di cui si conosce l’indirizzo IP oppure il nome.

Prima di eseguire il programma client si deve impostare nel codice il corretto parametro di connessione per l’indirizzo del server.

Per esempio:

String server = “192.168.1.2”;

Il programma client ricompilato può essere eseguito su un computer diverso da quello del server.
Ricapitolando, le fasi che portano alla creazione di una connessione possono essere schematizzate con la seguente sequenza di operazioni.

• Lato server: il programma server resta in attesa di una connessione su una determinata porta, mediante il comando accept della ServerSocket.

• Lato client: il programma client avvia un tentativo di connessione.

• Lato server: il programma server accetta la connessione e crea un oggetto Socket per comunicare con il client.

• Lato client: quando la connessione viene accettata, il programma client crea un oggetto Socket per comunicare con il server

Dopo aver stabilito la connessione, il programma client e server possono comunicare scrivendo e leggendo dagli stream associati alle rispettive socket.

Al termine della comunicazione, entrambi chiudono il canale di connessione.

 [:]

Pubblicato in Senza categoria | Lascia un commento

[:it]TPSIT – Programmazione di rete – Applicazioni client/server[:]

[:it]

Hans Arp

La realizzazione di applicazioni client/server in Java si basa sulle classi contenute nel package java.net.

In quasi tutte le applicazioni di rete viene anche utilizzato il package java.io per gestire i flussi di comunicazione in input e output.

È quindi necessario importare i precedenti package in ogni programma in cui si vogliono eseguire operazioni con la rete.

import java.net.*;

import java.io.*;

I programmi client si differenziano dai programmi server per la loro struttura; la loro implementazione in Java è leggermente diversa. La comunicazione avviene tramite le entità chiamate socket (letteralmente, presa di corrente).
La socket è un punto da cui il programma può inviare i dati in rete e può ricevere i dati dalla rete.

Programma client

L’apertura di una connessione corrisponde a una richiesta inviata al programma server tramite la classe Socket.

connessione = new Socket(server, porta);

I due parametri da indicare al costruttore sono l’indirizzo del server, specificato come nome oppure come indirizzo IP del server, e la porta. Il risultato dell’apertura di una connessione è la creazione di una socket sul computer client che permette al programma di comunicare con la corrispondente socket presente sul computer server.

L’invio e la ricezione dei dati sono gestite in maniera simile alla scrittura e alla lettura dei file di dati, tramite uno stream. A ogni socket sono associati un flusso di input, da cui i programmi possono ricevere i dati, e un flusso di output, su cui i programmi possono inviare i dati in rete. Le seguenti istruzioni mostrano come viene impostato il flusso di input nel caso in cui la comunicazione avvenga con sequenze di caratteri:

InputStream in = connessione.getInputStream();

InputStreamReader input = new InputStreamReader(in);

BufferedReader sIN = new BufferedReader(input);

Il metodo getInputStream restituisce il flusso in input associato alla socket. Il programma utilizza il metodo readLine della classe BufferedReader per ricevere i dati.

Le seguenti istruzioni mostrano come viene impostato il flusso di output nel caso in cui la comunicazione avvenga con sequenze di caratteri:

OutputStream out = connessione.getOutputStream();

PrintWriter sOUT = new PrintWriter(out);

Il metodo getOutputStream restituisce il flusso in output associato alla socket.

Il programma utilizza il metodo println della classe PrintWriter per inviare i dati.

La chiusura della connessione viene eseguita quando si vuole interrompere la comunicazione di rete. Si deve richiamare il metodo close nel seguente modo:

connessione.close();

Programma server

I programmi server hanno la caratteristica di restare attivi in attesa di ricevere una richiesta di connessione da parte dei client. Questo comportamento viene realizzato con una socket particolare implementata con la classe ServerSocket.

La creazione di una socket di tipo server viene eseguita con la seguente istruzione:

ServerSocket sSocket = new ServerSocket(porta);

Il parametro indica la porta che viene riservata all’applicazione per ricevere le richieste dagli altri computer. Il numero di porta deve essere superiore a 1023.

Dopo aver creato la ServerSocket, il programma server si mette in attesa che un client si colleghi. Il metodo accept della classe ServerSocket è utilizzato per bloccare il programma server finché viene intercettata una richiesta di connessione. Quando giunge la richiesta, il metodo accept restituisce una socket che gestirà la connessione con il client.

Tramite questa nuova socket, il programma server potrà inviare e ricevere dati dal programma client.

La connessione viene chiusa con il metodo close. Il codice che riassume il comportamento del server è il seguente:

while (true) { Socket connessione = sSocket.accept();

// invio-ricezione dati tramite la connessione

connessione.close(); }

Tutte le operazioni eseguite con le socket possono generare delle eccezioni, principalmente eccezioni di tipo IOException. È quindi necessario racchiudere le istruzioni nei blocchi try…catch per evitare che il programma venga interrotto bruscamente.[:]

Pubblicato in Senza categoria | Lascia un commento

[:it]TPSIT – Programmazione di rete – programmi e applicazioni per le reti[:]

[:it]

Hans Arp

Java è un linguaggio nato per realizzare applicazioni in rete e quindi supporta tutte le funzionalità necessarie per gestire la programmazione distribuita tra i computer di una rete (network programming). Si possono creare programmi che utilizzano il modello client/server e che si basano sui protocolli di rete TCP/IP.

L’obiettivo della programmazione di rete è quello di far comunicare tra loro due o più programmi, in esecuzione su elaboratori differenti e collegati tra loro tramite i dispositivi di rete. Non importa se la rete è LAN, WAN oppure è Internet.

Per costruire un’applicazione in rete si devono realizzare almeno un programma server e un programma client. La comunicazione tra i due programmi viene gestita tramite un insieme ben definito di regole, chiamate protocolli.

In un’architettura TCP/IP, i programmi server e client si posizionano sul livello 5 e riescono a comunicare utilizzando i servizi offerti dagli altri livelli dell’architettura. I programmi si interfacciano direttamente solo con il livello 4, devono quindi conoscere come interagire con questo livello. Per quanto riguarda i livelli sottostanti, le applicazioni possono non interessarsi di come sono realizzati.

In un’architettura TCP/IP, le informazioni vengono spedite indicando il computer di destinazione con un indirizzo IP. Questa informazione non è però sufficiente per far comunicare tra loro due programmi client/server. Infatti su uno stesso computer potrebbero essere in esecuzione diverse applicazioni e quindi è necessario un modo per poter indicare quale di questi programmi è il corretto destinatario. Questo problema viene risolto dal livello 4 utilizzando le porte. Come abbiamo visto nei capitoli precedenti, una porta è un meccanismo utilizzato per identificare una specifica applicazione di rete su un computer. Si ricordi che le porte sono identificate con numeri da 0 a 65.535 e che le porte da 0 a 1023, dette well known ports, sono riservate per protocolli predefiniti e pertanto non possono essere utilizzate dalle applicazioni di rete.[:]

Pubblicato in Senza categoria | Lascia un commento

[:it]TPSIT – Windows: server per le reti e per il Web – Il trasferimento dei file [:]

[:it]Il protocollo che consente di trasferire i file in una rete si chiama FTP (File Transfer Protocol, protocollo per il trasferimento dei dati): esso viene utilizzato sia nelle reti locali che in Internet ed è solitamente associato alla porta 21.

L’operazione di trasferimento dei file da un computer host prende il nome di download (scaricare), mentre l’operazione opposta, con la quale si mandano i file ad un host, si chiama upload (caricare). Sul computer remoto deve essere attivo un server FTP, mentre l’utente effettua le operazioni di trasferimento da o verso il proprio computer attraverso un pogramma denominato client FTP.

Sono disponibili molti software con le funzionalità di client FTP, alcuni dei quali possono essere liberamente scaricati da Internet. Il browser Internet Explorer permette di trasferire file da una cartella remota a una locale, o viceversa, utilizzando un’interfaccia simile a quella che si utilizza per la gestione dei file sul disco del proprio computer (Esplora risorse).

Tuttavia, quando si devono eseguire operazioni complesse, è opportuno utilizzare uno specifico programma client FTP.

Installare il server FTP

Nel sistema operativo Windows Server il protocollo FTP dipende dal server Web IIS: quindi per attivare il servizio FTP è necessario che il server Web sia installato e correttamente configurato. La procedura da seguire comprende i seguenti passi:

1) Scegliere l’opzione Aggiungi ruoli e funzionalità (nella finestra Dashboard di Server Manager, oppure dal menu Gestione in alto a destra) che attiva la procedura guidata per l’installazione.

2) Nella finestra Selezione ruoli server, espandere la voce Server Web (IIS) (Installato), facendo clic sulla freccia bianca.

3) Selezionare Server FTP.

Dopo l’installazione, la configurazione e la gestione del server FTP avviene dallo stesso strumento Gestione Internet Information Services (IIS), nel menu Strumenti in alto a destra, utilizzato nel paragrafo precedente per il server Web. Nel pannello centrale è ora presente una nuova sezione di icone identificata con il nome FTP. In particolare l’opzione Autenticazione FTP consente di abilitare l’autenticazione dell’utente anonymous.

Vediamo ora come creare una cartella sul disco fisso e renderla disponibile attraverso il servizio FTP. Prima di tutto occorre creare la cartella, per esempio C:/FTP. Nel riquadro di spostamento Connessioni, a sinistra, facciamo clic con il tasto destro del mouse sul nome del server e, dal menu che si apre, scegliamo Aggiungi sito FTP.

Nelle finestre di dialogo successive per la creazione guidata del sito FTP, occorre effettuare le seguenti impostazioni:

• fornire un nome al sito, per esempio Default FTP;

• associare ad esso il percorso fisico di una cartella, per esempio la cartella C:/FTP, creata sul disco del server in precedenza;

• associare un indirizzo IP oppure un nome di host virtuale;

• mettere il segno di spunta all’opzione Avvia sito FTP automaticamente;

• impostare la connessione protetta SSL se si possiede un certificato oppure scegliere Nessuna connessione SSL;

• decidere il tipo di autenticazione (Anonimo e Di base);

• consentire l’accesso a tutti gli utenti o ad utenti specificati;

• impostare l’autorizzazione in lettura o anche in scrittura.

Dopo questa creazione, il sito FTP compare a sinistra nel riquadro di spostamento. Dopo averlo selezionato, si può scegliere l’opzione Esplora, nel riquadro Azioni a destra, per visualizzare il contenuto della cartella fisica associata al sito FTP.

Possiamo ora verificare il corretto funzionamento della condivisione, attraverso la seguente linea di comando, che specifica l’indirizzo del server sul quale è attivo il servizio FTP:

ftp IndirizzoServer

Inserendo il nome utente anonymous e la password anonymous, si ottiene l’accesso al sistema. La connessione termina con il comando quit.
L’accesso al servizio può essere fatto anche dal browser, scrivendo nella casella dell’indirizzo

ftp:// seguito dall’indirizzo del server; per esempio, per il server locale si deve scrivere:
ftp://localhost
Nel browser Internet Explorer, per visualizzare la barra dei menu occorre premere il tasto Alt. Nel menu Visualizza si può scegliere Apri sito FTP in Esplora file per ottenere la visualizzazione del sito FTP come se fosse una cartella del disco. Su di essa si possono fare le stesse operazioni che si fanno sulle normali cartelle di Windows.
Per avviare (o riavviare o arrestare) il server FTP, nella finestra di Gestione IIS, occorre selezionare il sito FTP nel riquadro di spostamento a sinistra e poi scegliere l’opzione Avvia (o Riavvia o Arresta) nella sezione Gestisci sito FTP nel riquadro Azioni a destra.

Principali comandi ftp[:]

Pubblicato in Senza categoria | Lascia un commento

[:it]TPSIT – Fisica – Scarica di un condensatore[:]

[:it]Dopo aver caricato un condensatore per mezzo di un generatore, si disinserisce il generatore. Il condensatore si scarica sulla resistenza R, dando origine per un intervallo di tempo, la cui durata dipende dai valori di R e C inseriti nel circuito, a una corrente d’intensità i variabile nel tempo. Contemporaneamente la carica sulle armature e la d.d.p. tra le stesse, diminuiscono dai valori massimi iniziali, Cf ed f rispettivamente, a zero.

In questo caso l’equazione del circuito risulta:

\cfrac{q}{C}=Ri

ed i=-\cfrac{\delta q}{\delta t}, il segno è negativo in quanto la carica del condensatore tende a diminuire;

per cui l’equazione differenziale diventa:

\cfrac{q}{C}=-R\cfrac{\delta q}{\delta t}

q'=-\cfrac{q}{RC}

applicando il metodo della separazione delle variabili si ha:

\cfrac{dq}{q}=-\cfrac{1}{RC}dt

integrando da entrambi i membri si ha:

\int \cfrac{dq}{q}=\int -\cfrac{1}{RC}dt

\ln q=-\cfrac{1}{RC}t+c

passando dal logaritmo all’esponenziale si ha:

q=ce^{-\frac{1}{RC}}

per calcolare la costante si si che quando tolgo il generatore di tensione la carica sulle armature del condensatore vale: Cf.

Per cui c=Cf.

q=Cfe^{-\frac{1}{RC}} (1)

sapendo sempre che q=CV la relazione precedente diventa:

V=fe^{-\frac{t}{\tau }}

inoltre derivando la (1) mi trovo la corrente che risulta:

i=\cfrac{f}{R}e^{-\frac{t}{\tau }}.

Conclusione

Tutte le grndezze q,V ed i, decrescono esponenzialmente col tempo. In pratica dopo un tempo \tau =RC sono pressoché nulle![:]

Pubblicato in Senza categoria | Lascia un commento

[:it]TPSIT – Fisica- Carica di un condensatore[:]

[:it]Collegando un condensatore di capacità C, inizialmente scarico, attraverso una resistenza R ai poli di una batteria (corrente continua) di f.e.m f, la carica q sulle armature, tende a raggiungere il valore nominale fC.

Tenendo conto che tra le armature del condensatore c’è una caduta i tensione q/C, si ha:

f-\cfrac{q}{C}=Ri

sapendo che:

i=\cfrac{\delta q}{\delta t}

si deve risolvere la seguente equazione differenziale:

f-\cfrac{q}{C}=R\cfrac{\delta q}{\delta t}

è un’equazione differenziale lineare completa che si può risolvere mediante il metodo di Lagrange ossia data:

y'+a(x)y=b(x)

essa ha soluzione generica:

y=e^{-\int a(x)dx}\cdot\left [ \int b(x)e^{\int a(x))dx}+c \right ]

applicandola alle variabili in gioco si ha:

q'+\cfrac{1}{RC}q=\cfrac{f}{R}

dove a(t)=\cfrac{1}{RC} e b(t)=\cfrac{f}{R}

applicando la soluzione generica si ha:

q=e^{-\int \frac{1}{RC}dt}\cdot \left [ \int \frac{f}{R}e^{\int \frac{1}{RC}dt}+c \right ]

q=e^{-\frac{1}{RC}t}\cdot \left [ \int \frac{f}{R}e^{\frac{1}{RC}t}+c \right ]=e^{-\frac{1}{RC}t}\cdot\left [ \frac{f}{R}\cdot RC e^{\frac{1}{RC}t}+c \right ]

q=fC+ce^{-\frac{1}{RC}t}

sapendo che all’inizio, ossia al tempo t, il condensatore è scarico allora q(0)=0 e sostituendo tale condizione all’equazione trovata si ha:

0=fC+c

c=-fC

in definitiva:

q=Cf\left ( 1-e^{-\frac{t}{RC}} \right ) (1)

e si indica con \tau =RC la costante di tempo.

sapendo che C=\cfrac{q}{V} la d.d.p. tra le armature del condensatore è perciò:

V=f\left ( 1-e^{-\frac{t}{\tau }} \right )

La corrente i=\cfrac{\delta q}{\delta t}

per cui derivando la (1) si ha:

i=\frac{Cf}{RC}e^{-\frac{t}{\tau }}=\cfrac{f}{R}e^{-\frac{t}{\tau }}

La rappresentazione grafica è la seguente:

 [:]

Pubblicato in Senza categoria | Lascia un commento

[:it]C++ Esercizi con le stringhe[:]

[:it]

  1. Balla

    inserire il proprio nome da tastiera

  2. inserire il proprio nome nel programma
  3. invertire il proprio nome e stamparlo
  4. concatenare due parole

[:]

Pubblicato in Senza categoria | Lascia un commento

[:it]C++ Dati strutturati: le stringhe[:]

[:it]

Balla

Introduzione

Una stringa è una sequenza finita di caratteri che generalmente viene racchiusa tra virgolette ed apici(” “).

La stringa è una sequenza di caratteri del tipo c1, c2, c3, c4, c5.

La stringa deve essere costituita da un numero finito di caratteri, che prende il nome di lunghezza della stringa.

Se la stringa non è composta da alcun carattere essa si dice vuota e ha lunghezza uguale a zero. Ogni carattere assume nella stringa una posizione d’ordine che, come nel caso di vettori, si chiama indice della stringa.

Per consentire al programmatore una più efficiente manipolazione delle stringhe, il C++ consente di interpretare una sequenza di caratteri come una singola unità, mettendo a disposizione l’apposita libreria standard, la string.h, contenente tutte le informazioni di utilità di frequente utilizzo.

Una caratteristica importante è che ad indicare il termine della sequenza di caratteri c’è un carattere terminatore ‘\0’.

Operare con le stringhe

Definizione di una stringa

char parola[20];  //dichiarazione di una stringa

per accedere a ogni carattere della parola è possibile accedere a ogni elemento dell’array singolarmente, quindi:

printf(“%c”,parola[4];  //visualizza il 5° elemento/carattere

Dovendo contenere il terminatore, è importante ricordarsi di dimensionare opportunamente l’array .

Inizializzazione di una stringa

char stringa1[]=”paolo”;

char stringa2[6]=”paolo”;

Igresso/Uscita di una stringa

Per visualizzare il contenuto di una stringa si deve utilizzare la specifica di formato %s:

printf(“%s”\n”, stringa1);

Con questa istruzione vengono stampati tutti i caratteri fino al primo ‘\0’.

Analoga specifica di formato si deve usare per l’input:

char stringa3[20];

scanf(“%s”,stringa3);

la funzione scanf() opera sulle stringhe nel seguente modo:

  • vengono letti i caratteri dalla tastiera e inseriti nel vettore finchè viene incontrato il primo carattere di spaziatura;
  • al posto della spaziatura viene inserito il terminatore di stringa ‘\0’;
  • il vettore deve avere una dimensione tale da contenere tutti i caratteri compreso il terminatore.

Manipolazione di una stringa

Nella libreria string.h sono disponibili molte funzioni per la manipolazione della stringhe, che realizzano operazioni di utilizzo frequente.

Ad esempio la funzione

int strlen(char[]) che restituisce il numero di caratteri presenti nella stringa ricevuta in ingresso come parametro e ci risparmia di contare il numero di caratteri.

Esempio:

 

 

 

 

 

 [:]

Pubblicato in Senza categoria | Lascia un commento

[:it]Python: verifica finale a/s 2017-2018[:]

[:it]

Giacomo Balla

Esercizio comune a tutte e tre le tipologie.

Creare una pagina web con indicato nel title il proprio nome.

Nel body inserire la scritta in rosso e grandezza 3 : “prova finale dell’anno scolastico 207/2018 ed andare a capo.

Scrivere sempre nel body andando opportunamente a capo la seguente poesia di Ungaretti

Si sta come

d’autunno

sugli alberi

le foglie

allineandolo al centro ed utilizzando il font times new roman

Esercizio per il 9/10

Creare un unico programma che utilizzando le funzioni ricorsive, implementi l’operazione somma, prodotto ed elevazione a potenza.

Il programma chiederà all’utente due numeri e le operazioni ammesse saranno la somma, il prodotto e l’elevazione a potenza.

Chiedere all’utente l’operazione da eseguire finchè esso non digita da tastiere lo zero.

Controllare che l’utente abbia inserito numeri interi compresi tra 0 e 3 in cui lo 0 esce dal menù, l’1 esegue la domma, il 2 il prodotto ed il 3 la potenza.

La funzione ricorsiva che calcola l’operazione di somma sfrutterà la seguente definizione induttiva:

  • somma(x,y)=x se y=0
  • somma(x,y)=1+(somma(x,y-1)) se y>0.

La funzione ricorsiva che calcola l’operazione prodotto sfrutterà la seguente definizione induttiva:

  • prodotto(x,y)=0 se y=0
  • prodotto(x,y)=somma(x,prodotto(x,y-1)) se y>0.

La funzione ricorsiva che calcola l’operazione di elevamento a potenza sfrutterà la seguente definizione induttiva:

  • esponente(x,y)=1 se y=0
  • esponente(x,y)=prodotto(x,esponente(x, y-1)) se y>0

Notare che la funzione ricorsiva esponente usa la funzione ricorsiva prodotto per il suo calcolo.

Esercizio per 8/9

Chiedere all’utente una lista di almeno 10 numeri dispari (11 numero, 13 o un’altra quantità) e calcolarne la media, la moda, la mediana.

Il programma dovrà stampare a video l’elenco dei numeri inseriti, e la loro media, moda e mediana.

Per l’inserimento dei numeri usare un cicli while, per l loro visualizzazione un ciclo for.

Verificare che i numeri immessi siano sempre positivi, in caso contrario, richiedere all’utente il numero immesso.

L’immissione dei numeri proseguirà finché l’utente non inserirà la cifra zero.

Esercizio per 6/7

Scrivere un programma che chiederà in input prima dieci numeri usando un ciclo while e li stampi con un ciclo for.

Calcolare la somma dei numeri immessi ed il loro prodotto con una funzione.

Verificare che siano stati immessi numeri e non lettere.[:]

Pubblicato in Senza categoria | Lascia un commento