Ciao amici,
scusate il titolo, non mi è venuto niente di meglio, un piccolo tributo a Fedez.
Prima cazzeggiavo con i miei amici di chat qui sul forum quando qualcuno (arow?) ha cominciato a scrivere al contrario, allora io che non mi tiro indietro ho cominciato a farlo a mia volta, dopo di che mi sono detto "perchè non scrivere un programma che lo faccia lui?".
Cosi mentre gli altri continuavano a cazzeggiare sulla chat ho messo giu qualche riga di codice al volo.
Perchè posto? perchè secondo me anche in un programmino cosi piccolo ci possono essere degli spunti interessanti per imparare qualcosa sul C++ visto che di solito non lo usiamo per farci niente se non le hacks.
E dato che non so mai che cosa postare sul C++ mi pareva una buona occasione.
Ecco il source, sotto i commenti alle parti piu interessanti (working in progress);
C++ Programming
#include <iostream>
#include <string>
#include <windows.h> // serve alle funzioni chiamate in CopyToClipboard()
using namespace std;
void CopyToClipboard(string source)
{
if(OpenClipboard(NULL))
{
HGLOBAL clipbuffer;
char * buffer;
EmptyClipboard();
clipbuffer = GlobalAlloc(GMEM_DDESHARE, source.length()+1);
buffer = (char*)GlobalLock(clipbuffer);
strcpy(buffer, LPCSTR(source.c_str()));
GlobalUnlock(clipbuffer);
SetClipboardData(CF_OEMTEXT,clipbuffer);
CloseClipboard();
}
}
int main()
{
string line, result; // definisco 2 variabili stringa
cout << "Invio su nuova linea per uscire" << endl; // printo a video il messaggio
do // inizio ciclo
{
result.clear(); // cancello contenuto stringa "result"
line.clear(); // cancello contenuto stringa "line"
getline(cin,line); // acquisisco input da tastiera dall' utente
for (int i=line.length()-1; i>=0; i--) // ciclo for per tutta la lunghezza della string digitata
result.push_back(line[i]); // aggiungo in coda alla variabile "result" la iesima lettera
// partendo dal fondo tornando verso l'inizio
cout << result << endl; // printo a video la var. "result" ovvero l'input
// letto al contrario
CopyToClipboard(result); // e per comodità lo copio nella clipboard
}while(line.length()); // il ciclo continua fintanto che è vera la condizione
// che la var. "line" ha una lunghezza != 0
}
Prima di tutto la spiegazione breve, il programma prende in input quello che l'utente scrive su tastiera, lo salva in una stringa, poi legge la stringa al contrario partendo dalla fine e i caratteri che trova man mano li mette in un'altra stringa.
Alla fine stampa a video questa ultima stringa (quindi la digitazione letta al contrario) e la copia nella clipboard per essere poi incollata dall'utente da qualche parte.
Ora passiamo alla spiegazione dettagliata...
Allora, innanzitutto lasciate perdere la prima funziona in alto , CopyToClipboard, quella l'ho copiata pari pari da internet, mi serviva a copiare nella clipboard il risultato del programma, ma per chi è agli inizi è troppo complesso.
Tenetela solo presente come esempio di chiamata a funzione
C++ Programming
#include <iostream>
#include <string>
Queste istruzioni sono usate dal preprocessore per "includere" nella compilazione altri files contenenti istruzioni C++ di cui abbiamo bisogno nel nostro programma.
Ad esempio senza "iostream" non potremmo usare "cout"
Ad esempio senza "string" non potremmo usare il tipo "string" (mavà!?)
In poche parole dovete immaginare che al posto della riga #include <iostream> ci sia tutto il file che si chiama iostream, senza che però sia stato necessario riscriverlo tutto all'interno del nostro programma.
Questo serve a darci la possibilità di utilizzare tutto ciò che fa parte del namespace "std" senza dover scrivere std:: davanti.
Spiego...
Per usare il cout dovrei scrivere cosi:
std::cout << "esempio";
e cosi per tutto ciò che fa parte del namespace "std". Allora per semplificarmi la vita metto using namespace std; all'inizio e da li in avanti posso scrivere semplicemente:
cout << "esempio" ;
In un altro topic magari affronteremo meglio il discorso namespace, immagino che ora non sia molto chiaro spiegato cosi.
questo (main) in C++ è il corpo principale di dove parte l'esecuzione del nostro programma, quindi appena lanceremo l'esecuzione verrà eseguito tutto ciò che si trova tra le due parentesi graffe {}
In realtà la dichiarazione del main sarebbe cosi:
int main(int argc, char* argv[])
{
}
ma adesso noi non ci complichiamo la vita.
C++ Programming
string line, result; // definisco 2 variabili stringa
come dice il commento, qui dichiaro/definisco 2 variabili di tipo string in cui metterò dopo il testo digitato dall'utente ed il risultato dell'inversione
C++ Programming
cout << "Invio su nuova linea per uscire" << endl; // printo a video il messaggio
questo è un semplice comando di stampa a video (cout è lo stream di output al dispositivo console predefinito, ovveo il video) che dice "invio su nuova linea per uscire" a video, seguito da endl che altro non è che il fine linea, l' a capo
C++ Programming
do // inizio ciclo
{
... istruzioni
... istruzioni
}while(line.length());
questo è un "ciclo" ovvero il programma continua ad eseguire le istruzioni che si trovano tra {} fintanto che sono verificate le condizioni che si trovano nella linea while(condizione)
Appena le condizioni non sono verificate (in questo caso la variabile "line" risulta essere vuota) esce dal ciclo e prosegue in quello che c'è dopo il while
C++ Programming
result.clear(); // cancello contenuto stringa "result"
line.clear(); // cancello contenuto stringa "line"
come dice il commento, svuoto le due variabili string in modo che non contengano niente e siano pronte a quello che ci devo mettere io dopo.
C++ Programming
getline(cin,line); // acquisisco input da tastiera dall' utente
acquisisco l'input dall'utente, ovvero lui scrive sulla tastiera (vedendo a video quello che sta scrivendo) e tutto quello che scrive va a finire nella variabile stringa "line"
"cin" è ConsoleInput, ovvero l'input da console, la tastiera.
C++ Programming
for (int i=line.length()-1; i>=0; i--) // ciclo for per tutta la lunghezza della string digitata
result.push_back(line[i]); // aggiungo in coda alla variabile "result" la iesima lettera
Questo è il cuore del programma.
Un ciclo per tutta la lunghezza della stringa acquisita dalla digitazione dell'utente (quindi la variabile "line"),
però partendo dall'ultima lettera digitata tornando indietro fino alla prima, e per ogni lettera che troviamo facciamo cosi:
result.push_back(line[i])
questo aggiunge (appende) alla variabile "result" una lettera, dove la lettera è presa dalla variabile "line" indicizzata usando "i" che è la variabile che viene decrementata ad ogni esecuzione del ciclo for.
C++ Programming
cout << result << endl; // printo a video la var. "result" ovvero l'input
facile, stampiamo a video il risultato, ovvero il contenuto della variabile stringa "result" ovvero la frase scritta dall'utente, ma al contrario
C++ Programming
CopyToClipboard(result); // e per comodità lo copio nella clipboard
chiamiamo la nostra funzione CopyToClipboard precedentemente definita all'inizio del programma passandogli come parametro la stringa "result", tipico esempio di chiamata a funzione con passaggio di parametro
Tutto chiaro no?