Upload
phungkhanh
View
213
Download
0
Embed Size (px)
Citation preview
Scopi del mini-corso
● Imparare un po' di programmazione C++● Diventare un po' autonomi ● Fare conoscenza con alcuni strumenti di
Computer Vision e Robotica (OpenCV, ROS)● + Ubuntu● + Acquisire competenze professionalizzanti
Ubuntu o Windows (o altro..)
● Linux based● Open source● Molte librerie scientifiche e
tools di sviluppo
● Molto diffuso● Fancy● Molte librerie e tools, ma
spesso a pagamento
File system
All'interno della directory root (/) è presente un insieme di directory comuni a tutte le distribuzioni Linux. Quello che segue è un elenco delle directory più comuni presenti nella directory root (/):
/bin: applicazioni binarie importanti
/boot: file necessari per il boot (avvio) del computer
/dev: file dei device (dispositivi)
/etc: file di configurazione, script di avvio, etc...
/home: directory home degli utenti
/lib: librerie di sistema
/media: dispositivi rimovibili (media) montati (caricati) come CD, fotocamere digitali, ecc... .
/mnt: filesystem montati
/opt: posizione dove vanno installate le applicazioni opzionali (optional)
/usr: file e applicazioni che sono per la maggior parte disponibili a tutti gli utenti (users)
Cosa ci servirà su Ubuntu
● Ubuntu o Kubuntu● I pacchetti “build-essential”● Un IDE, es NetBeans o Eclipse● Librerie: OpenCV, GSL
>> sudo apt-get install build-essential
Cos'è il linguaggio C
● Linguaggio inventato negli anni '70 da Dennis Ritchie
● Legato a Unix sin dalle origini● Compilato● Molto comune: presente su la stragrande maggioranza delle CPU = uno
dei linguaggi più universali● Nato per sostituire l'Assembly, ma più cross-platform● Molti linguaggi hanno ereditato la sintassi dello C (es. C++, Java, PHP,
C#...) e alcuni sono influenzati da essa (es. Javascript)● low overhead: permette implementazioni efficienti, ma diminuisce la
capacità di cestire la complessità● Sistemi embedded
Cos'è il linguaggio C(++)
C++● Compilato
● È object-oriented ma permette anche functional programming e altro
● Controllo di puntatori e references e permette pass-by-value
● Gestione della memoria generalmente lasciata al programmatore
● C'è una libreria standard, STL
● ...
Java● Interpretato (JVM)
● Object-oriented
● Ammette solo pass-by-reference
● Garbage collection
● Libreria standard molto potente
● ...
La sintassi è simile, ma ci sono alcune cose a cui fare attenzione...
Source files
● Tipicamente .c o .cpp. Più raro .c++
● Contengono la definizione, cioè l'implementazione delle funzioni e classi che realizzerete
● Sono come “ricette” che la CPU esegue
Header Files
● Estensioni tipiche: .h o .hpp● Sono un modo di organizzare il
codice in maniera modulare● Di solito specificano delle
interfacce a funzioni e classi● Dichiarare vs Definire● Qualche volta contengono anche
definizioni
tipi di base:● int, char, float, double
array:
● int my_array[10];
● double my_double_array[] = {1.0, 2.3, 4.1};
Syntax pill
● Le istruzioni sono sempre terminate da “;”
● I blocchi di codice sono identificati da “{ }”
● Le parentesi graffe si digitano: Alt Gr + Shift + “[” o “]”
Syntax pill
int add(int a, int b)
{
return a + b;
}
FUNZIONI
[out type] function_name( … parameters … )
{
//this is an inline comment
code...
/* Also this is a comment */
}
Compilatore
add.o
int add(int a, int b){ return a + b;}
int add(int, int);
int triple(int x) { return add(x, add(x, x));}
triple.o
add.c
triple.c
Compilatore
● GCC = Gnu Compiler Collection● g++=compilatore C++ (e C)● MingGW = Minimalist GNU for Windows
>> g++ -c add.cpp
Linker
● I file .o vanno assemblati per creare l'applicazione, o la libreria
● Il linker è il programma che fa questo
● Sempre contenuto in gcc
Syntax pill 2
int main(int argc, char *argv[])
{
//some code here
//...
return 0;
}
int main()
{
//some code here
//...
}
int main()
{
int x = 10;
int y = 2;
Return add(x,y);
}
linker
● Questa volta uniamo i file oggetto con l'opzione -o
>> g++ add.o main.o -o myapp
oppure
>> g++ add.c main.c -o myapp
tipi di base:● int, char, float, double
array:
● int my_array[10]; double my_double_array[] = {1.0, 2.3, 4.1};
stringhe:● char my_string[10];
● char* my_string;
● char* my_string = “Questa è una costante stringa”;
Variabili e costanti in C
Un po' di i/o
La funzione per dare del feedback tramite il terminale (o console) in C è printf()
int printf ( const char * format, ... );
int c = a + b;
printf(“Il risultato è: %d”, c);
Printf codes
● d o i: integer● f: decimal floating point● e: scientific notation● c: character● …
http://www.cplusplus.com/reference/cstdio/printf/
Un po' di i/o (2)
int printf ( const char * format, ... );
int a = 3; double b = 2.4e3;
printf(“Questo è un intero: %d, e questo un double: %f\n”, a, b);
librerie standard
#include <stdio.h>
int add(int,int);
int main()
{
int a = 10;
int b = 5;
int c = add(a,b);
printf("Result = %d\n", c);
return 0;
}
● stdio.h è un file header che appartiene allo standard del C (C99 o C11)
● di solito non dovete dire nulla a g++ che lo troverà da solo
Esempio concreto: Mat
#include <stdio.h>#include "opencv2/opencv.hpp"
int main(){ cv::Mat image; return 0;}
Questo è già C++
cv è un namespace:: è chiamato “risolutore di campo di azione”
Homework 1
Obiettivo: set-up di un ambiente di sviluppo integrato →Far girare il semplice hello world con opencv
● Vi richiederà:– Installare gcc o MinGW– Installare Netbeans– Installare OpenCV– Creare un nuovo progetto C++ con i file in dotazione– Impostare directory di inclusione e librerie – Compilare e testare!
tipi di base:● int, bool, char, float, double...
tipi complessi ma utili:● string, sstream, vector
Variabili e costanti C++
Output a console C++
#include: header file
cout class
std è il namespace della
lib standard
header della libreria standard in C++ non hanno il .h
std is a namespace nad its equivalent in Java is a “package name” like, for example, java.util
Output a console in C++
std::cout è un oggetto della classe ostream che rappresenta lo standat output stream(di solito la console)
Cosa sono gli ostream?
“ostream objects are stream objects used to write and format output as sequences of characters”
Che cos'è “<<” ?
<< è un operatore (come “+”,”-”) un tipo di metodo, o funzione, che scrive testo formattato sullo stream
Syntax pill
while(condizione)
{//modify condition eventually
}
for( espressione1; espressione2; espressione3)
{...}
Esempi
bool operations_finished = false;
while(operations_finished == true)
{//modify condition eventually
…
operation_finished = true;}
for(int i=0; i< limit; i++){ … }
Equivale a
int i=0;
while(i<limit){ ... i++;}
Operatori di incremento e decremento unari
++,--,+=,-=,*=,/=
i+=1 equivale a i=i+1i++ e ++i sono leggermente diversi
Tic-Tac-Toe
Proviamo a realizzare un semplice gioco
Scopo del gioco: mettere tre simboli uguali in una fila orizzontale, verticale o diagonale
Scopo dell'esercizio: Prendere dimestichezza con i costrutti sintattici di base del C e C++
Player Input
//wait for inputint input = false;int count = 0;
while (count < 3) {
cin >> input;
if (cin.fail()) { cout << "bad input!" << endl; cin.sync(); cin.clear(); //clear bad input flag cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); count++; } else {
//Distinguere tra input valido e non valido /* Your code here */ }}
Board State
int board_state[3][3];
//set up initial game stateinit(board_state);...void init(int (&state)[3][3]){ // set all the board cells to the EMPTY_CELL state for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { state[i][j] = EMPTY_CELL; } }}
Draw Screen function
void drawBoard(){ cout << " a b c" << endl; cout << " - - -" << endl; cout << "1 | | | |" << endl; cout << " - - -" << endl; cout << "2 | | | |" << endl; cout << " - - -" << endl; cout << "3 | | | |" << endl; cout << " - - -" << endl;}
Homework 2
Cercare di far funzionare TicTacToe
➔ Gestire lo user input
➔ Sviluppare l'aggiornamento dello stato del gioco
➔ Stampare a schermo il risultato del ciclo di gioco