Benvenuto! Per postare e godere delle funzionalità del forum registrati, occorrono pochi secondi ed è gratis!

[Guida] C++ tutto l'incontrario...
(Questo messaggio è stato modificato l'ultima volta il: 14/06/2012, 20:49 da digger.)

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
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
  1. #include <iostream>
  2. #include <string>
  3. #include <windows.h> // serve alle funzioni chiamate in CopyToClipboard()
  4.  
  5. using namespace std;
  6.  
  7. void CopyToClipboard(string source)
  8. {
  9. if(OpenClipboard(NULL))
  10. {
  11. HGLOBAL clipbuffer;
  12. char * buffer;
  13. EmptyClipboard();
  14. clipbuffer = GlobalAlloc(GMEM_DDESHARE, source.length()+1);
  15. buffer = (char*)GlobalLock(clipbuffer);
  16. strcpy(buffer, LPCSTR(source.c_str()));
  17. GlobalUnlock(clipbuffer);
  18. SetClipboardData(CF_OEMTEXT,clipbuffer);
  19. CloseClipboard();
  20. }
  21. }
  22.  
  23. int main()
  24. {
  25. string line, result; // definisco 2 variabili stringa
  26.  
  27. cout << "Invio su nuova linea per uscire" << endl; // printo a video il messaggio
  28. do // inizio ciclo
  29. {
  30. result.clear(); // cancello contenuto stringa "result"
  31. line.clear(); // cancello contenuto stringa "line"
  32.  
  33. getline(cin,line); // acquisisco input da tastiera dall' utente
  34.  
  35. for (int i=line.length()-1; i>=0; i--) // ciclo for per tutta la lunghezza della string digitata
  36. result.push_back(line[i]); // aggiungo in coda alla variabile "result" la iesima lettera
  37. // partendo dal fondo tornando verso l'inizio
  38.  
  39. cout << result << endl; // printo a video la var. "result" ovvero l'input
  40. // letto al contrario
  41.  
  42. CopyToClipboard(result); // e per comodità lo copio nella clipboard
  43.  
  44. }while(line.length()); // il ciclo continua fintanto che è vera la condizione
  45. // che la var. "line" ha una lunghezza != 0
  46. }



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 Smile

    C++ Programming
  1. #include <iostream>
  2. #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.

    C++ Programming
  1. using namespace std;



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.

    C++ Programming
  1. int main()
  2. {
  3. ...
  4. }



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
  1. 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
  1. 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
  1. do // inizio ciclo
  2. {
  3. ... istruzioni
  4. ... istruzioni
  5. }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
  1. result.clear(); // cancello contenuto stringa "result"
  2. 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
  1. 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
  1. for (int i=line.length()-1; i>=0; i--) // ciclo for per tutta la lunghezza della string digitata
  2. 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
  1. 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
  1. 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 Blush

Tutto chiaro no? Blush


digger
12/06/2012, 20:27
#1
Cerca

Amministratore
Messaggi: 2,338
Discussioni: 233
Registrato: 03-2011
Mix: 2,578.4
ahahahah io ci stavo pensando di farlo in vb.net


[Per vedere i link devi REGISTRARTI.]

Prima di aprire ogni contenuto scaricato su siti esterni ad HackMix, scansionatelo su VirusTotal.
12/06/2012, 21:38
#2
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
perchè no? in vb.net esce sicuramente piu "friendly" che questo, chi lo fa?


digger
12/06/2012, 21:39
#3
Cerca

Amministratore
Messaggi: 2,338
Discussioni: 233
Registrato: 03-2011
Mix: 2,578.4
Io dovrei reinstallarlo -_-


[Per vedere i link devi REGISTRARTI.]

Prima di aprire ogni contenuto scaricato su siti esterni ad HackMix, scansionatelo su VirusTotal.
12/06/2012, 21:43
#4
Cerca

maurow
Messaggi: 6,041
Discussioni: 2,066
Registrato: 03-2011
Mix: 8,107
io veramente scrivevo in russo antico Asd Asd
emoc erpmes omitto oroval Happywide


La libertà non si insegna, è una scelta individuale.
12/06/2012, 21:45
#5
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
ah era russo? non avevo capito Blush


digger
12/06/2012, 21:49
#6
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 13/06/2012, 20:12 da generalmistic.)

BF Master
Messaggi: 1,105
Discussioni: 179
Registrato: 03-2011
Mix: 0
ma lo hai finito?? potresti spiegare?? ci vorrebbe una di quelle faccine che si grattano la testa...

13/06/2012, 20:11
#7
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 14/06/2012, 20:49 da digger.)

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
certo che è finito, avevo scritto che se nessuno domandava niente non mi ci dedivavo Blush
visto che hai domandato metto giu qualche spiega...

[edit] ho spostato la spiegazione in cima, aveva piu senso


digger
13/06/2012, 20:17
#8
Cerca

йσѕσиє1 νι ѕσνяαѕтα
Messaggi: 1,093
Discussioni: 112
Registrato: 03-2011
Mix: 4
digger sei sempre cosi dettagliato che non ci ho capito niente rispiega ahahahahahah scherzo

13/06/2012, 23:50
#9
Cerca

Iscritto
Messaggi: 125
Discussioni: 16
Registrato: 04-2011
Mix: 0
Provo a farlo (tradurlo) in C! Happywide

23/06/2012, 12:47
#10
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
perchè in C?


digger
23/06/2012, 13:47
#11
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 25/06/2012, 10:43 da Marchrius.)

Iscritto
Messaggi: 125
Discussioni: 16
Registrato: 04-2011
Mix: 0
Perché è l'unico linguaggio che conosco... XD


-------- EDIT ----------


Ho buttato giù questo codice! Che ne dici?

Codice:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {
    
    char *line = (char*)malloc(sizeof(char*)); //definisco 1 variabile di tipo puntatore a char
    int i, count = 0;
    int len = 0;
    printf("Inserisci la frase.\n");
    fgets(line,1024,stdin);
    len = strlen(line);
    char line2[len];
    char t;
    line[len-1] = '\0';
    len = strlen(line);
    for (i = len-1; i>=0; i--) {
        line2[i] = line[count++];
    }
    printf("Frase>> %s\nReverse>> %s\n", line, line2);
    free(line);
    return 0;
}

Scusate il doppio post.

23/06/2012, 15:01
#12
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 23/06/2012, 16:18 da Marchrius.)

Iscritto
Messaggi: 125
Discussioni: 16
Registrato: 04-2011
Mix: 0
Ho buttato giù questo codice! Che ne dici?

Codice:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {
    
    char *line = (char*)malloc(sizeof(char*)); //definisco 1 variabile di tipo puntatore a char
    int i, count = 0;
    int len = 0;
    printf("Inserisci la frase.\n");
    fgets(line,1024,stdin);
    len = strlen(line);
    char line2[len];
    char t;
    line[len-1] = '\0';
    len = strlen(line);
    for (i = len-1; i>=0; i--) {
        line2[i] = line[count++];
    }
    printf("Frase>> %s\nReverse>> %s\n", line, line2);
    free(line);
    return 0;
}

Scusate il doppio post.

23/06/2012, 16:18
#13
Cerca

BF Master
Messaggi: 1,105
Discussioni: 179
Registrato: 03-2011
Mix: 0
no problem! puoi aggiustare: fai al primo odifica e ci aggiungi il secondo e l secondo fai modifica completa,elimina

23/06/2012, 17:09
#14
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 23/06/2012, 22:27 da digger.)

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
che ne dico? ... funziona? Asd
una cosa che noto subito che è allochi memoria per sizeof(char*) il che probabilmente allocherà 4 bytes... mi sa che non è la via giusta Wink
del resto bravo per la conversione Happywide

posso darti un consiglio?
abbandona il C, visto che lo conosci è il momento giusto per passare al C++ , non farai fatica, in C++ puoi scrivere praticamente tutto quello che già sai fare con il C quindi non butti via quello che hai imparato, solo che il C++ è un linguaggio piu solido e ti permette di fare piu cose, nonchè lavorare con gli oggetti che è una gran bella cosa Tounge


digger
23/06/2012, 22:24
#15
Cerca




Utenti che stanno guardando questa discussione: 1 Ospite(i)