Prima Lezione - Appunti corso di Programmazione in C

Contesto generale e Risorse didattiche

  • Benvenuto al corso di programmazione; istruttore: Fausto Sfoto.

  • Credenziali e accesso: provate a entrare con le vostre credenziali sul computer; login e password disponibili nella pagina Moodle del corso.

  • Registrazioni: la pagina Moodle contiene link alle registrazioni dell'anno scorso (equivalenti a quelle di quest'anno) per la parte teorica; le registrazioni di quest'anno saranno disponibili su Panotto (a destra nella pagina del corso).

  • Struttura del corso: corso annuale con due quadrimestri; l'insegnante coprirà teoria nel primo quadrimestre e parte di teoria del secondo; laboratorio del secondo quadrimestre affidato ad un altro docente.

  • Libro di riferimento consigliato: Steven Kochan, Programming in C (ultima edizione). Seguirlo per seguire fedelmente le lezioni.

  • Esame: corso annuale; esame finale all"anno; organizzazione tipica in due esami parziali (uno a febbraio e uno a giugno). Se si superano entrambi con una media ≥ 18/30, si sostiene l'esame finale; altrimenti si sostengono esami singoli a giugno, luglio, settembre e poi a febbraio 2023 (dettaglie storiche). Consiglio strategia: mirare a passare i 2 parziali a febbraio e giugno 2000.22 per avere materiale recente e programma più contenuto.

  • Orari di ricevimento: lunedì dalle 16:30 in poi nel studio al primo piano.

  • Materiali aggiuntivi: esami e compiti degli anni passati, con relative soluzioni, disponibili su Moodle; utili per esercitarsi prima dell’esame.

  • Esame in laboratorio: durante l’esame dovete usare le macchine del laboratorio (non potete portare il vostro computer di casa); è consentito portare libri e appunti ma non internet né telefoni/cellulari durante l’esame.

  • Pratica a casa: se avete un computer personale, potete installare Linux e ricreare un ambiente simile a quello del laboratorio per esercitarvi.


Concetti chiave: cosa è un computer e come si programma

  • Definizione sintetica: un computer è una macchina capace di eseguire calcoli e di essere programmabile tramite software.

  • Architettura di base (macchina di Fornoyman/von Neumann, come descritto nel testo):

    • CPU (unità di processo centrale): esegue i calcoli.

    • MEMORIA: ricorda informazioni temporanee; RAM è memoria elettronica ad accesso casuale, volatile (conserva dati fintanto che il sistema è acceso).

    • IO (input/output): comunica con l’esterno (tastiera, monitor, modem, stampante, ecc.).

    • Bus: insieme di collegamenti che permettono alle tre componenti di comunicare tra loro.

  • Architetture alternative (parallele, quantum) menzionate come tentativi, ma attualmente dominante è l’architettura di tipo Fornoyman (von Neumann).

  • RAM vs Disco:

    • RAM: memoria temporanea, molto veloce, perde i dati se si spegne il computer; usata per i dati dei programmi in esecuzione.

    • Disco: memoria permanente o a lungo termine; usato per dati stabili (foto, musica, programmi installati).

    • SSD (disco a stato solido): tecnologia moderna che sostituisce i dischi tradizionali; circuito elettrico che sostituisce la parte magnetica.

  • Informazione binaria: tutta l’informazione nel computer è ricondotta a bit; due stati fondamentali: 00 e 11; concetto chiave: informazione binaria può codificare numeri, testo, immagini, suoni, video, ecc.

  • Rapporto tra memoria e prestazioni: RAM è veloce per permettere un accesso rapido ai dati temporanei; disco è grande per dati permanenti, ma più lento.

  • Sistema operativo: programma che semplifica l’uso del computer; esempi comuni: Windows, macOS, Linux. Linux è particolarmente consigliato nel corso per lo sviluppo software e come ambiente di laboratorio; Android contiene Linux come componente di base.

  • Linguaggi e astrattizzazione:

    • Linguaggi di macchina (linguaggio macchina) sono di basso livello e molto vicini all’hardware.

    • Linguaggi ad alto livello permettono astrazioni (numeri interi, stringhe, variabili, ecc.). Esempi storici: Fortran, Cobol; linguaggio C (centrale nel corso) ha reso possibili sistemi operativi scritti in alto livello (es. Unix, poi Linux).

    • Compilatori vs interpreti:

    • Compilatore: trasforma l’intero programma in linguaggio macchina, eseguito successivamente come programma compilato.

    • Interprete: traduce ed esegue istruzione per istruzione durante l’esecuzione.

    • Il compilatore è uno strumento software, non un essere umano; nel corso utilizzerete compilatori C installati sul sistema.

  • Tipi di informazione memorizzabili (dati):

    • Numeri; stringhe (sequenze di caratteri); immagini (pixel); canzoni (audio); video (immagini+suoni in movimento).

    • Tutti questi dati, all’interno di un computer, devono essere rappresentati in forma binaria.


Linguaggi, compilatori e organi di elaborazione

  • Linguaggi di programmazione: sono linguaggi strutturati, semanticamente chiari e non ambigui; non si usano lingue naturali (italiano o inglese) per parlare al computer.

  • Linguaggio macchina: il più basso livello; comandi direttamente comprensibili dall’hardware della CPU (operazioni su zone di memoria, esecuzione di istruzioni, ecc.). Storicamente usato in sistemi di calcolo e in ambito bellico/spaziale.

  • Linguaggi di alto livello: permettono astrazione da dettagli hardware; esempi storici: Fortran, Cobol; linguaggio C come pietra miliare (centrale nel corso).

  • Unix e Linux: Unix come prima grande famiglia di sistemi operativi; Linux è derivato da Unix ed è ampiamente usato in laboratorio e in server di rete; Android contiene Linux come kernel in uso.

  • Traduzione dei programmi: il traduttore che trasforma dal linguaggio di alto livello al linguaggio macchina si chiama compilatore; permette di eseguire il programma tradotto sul computer.

  • Differenza tra compilatore e interprete (storicamente): differenze principali riguardano il punto in cui avviene la traduzione (tutto in una volta vs istruzione per istruzione). Oggi la distinzione è meno fondamentale per molti linguaggi, ma rimane didatticamente utile.


Dati, memorie e organizzazione dell’informazione

  • Informazione digitale: tutto è rappresentato come sequenze di bit; l’unità fondamentale è il bit: ext{bit} o ig{0,1\big}.

  • Tipi di dati comuni:

    • Numeri; stringhe (nomi, cognomi);

    • Immagini (pixel); canzoni (audio); video (immagini+suoni in movimento).

    • Dati conservati a lungo termine sul disco, dati temporanei in RAM durante l’esecuzione.

  • Memoria RAM vs disco: RAM è veloce ma volatile; disco è permanente o persistente ma più lento.

  • Struttura del disco (nella lezione si usa come esempio): vecchia tecnologia magnetica con testina di lettura/scrittura; oggi la maggior parte dei computer usa disco a stato solido (SSD).


Ambiente Linux e shell: navigazione e gestione dei file

  • Contesto operativo: laboratorio Linux; ambiente di sviluppo comune per i programmatori; Android ospita Linux come kernel.

  • Sistema di gestione file: si interagisce tipicamente tramite interfaccia grafica (esploratore file) o terminale (shell). Nell’esercizio si utilizza principalmente la shell.

  • Concetti di base della shell:

    • File vs directory (cartelle): cosa c’è dentro una directory si verifica con comandi come LS (ls).

    • Directory radice: "/"; dentro ci sono directory come /bin, /home, /lib, ecc.

    • Home directory: la directory personale dell’utente; nomi tipici: /home/spot, /home/teacher, ecc. Si può riferire a casa con la tilde: tilde = ~.

    • Prompt: visibile a sinistra del simbolo del dollaro ($); mostra la directory corrente.

    • User identity e percorsi: ls, cd, pwd, ecc. Forniti esempi con utenti come spot o teacher; su computer di rete l’organizzazione è simile ma varia a seconda della configurazione.

  • Comandi di base:

    • ls: elenca contenuti; ls -l fornisce dettagli (dimensione, data, proprietario, permessi).

    • cd: cambia directory; cd ~ torna alla home; cd .. torna alla directory padre; cd /path/alla/directory sposta dentro quella directory.

    • pwd: stampa la directory di lavoro corrente.

    • cat: stampa contenuto di un file; equivalente a visualizzare il contenuto del testo.

    • more: visualizza contenuto di file una pagina alla volta; premere Q per uscire.

    • grep: non menzionato esplicitamente, ma spesso presente; qui si usa principalmente cat/more/ls.

    • mkdir: crea nuove directory.

    • rm: rimuove file; rm -r rimuove directory ricorsivamente (non vuota richiede prima di svuotarla).

    • rmdir: rimuove solo directory vuote.

    • cp: copia file o directory.

    • mv: sposta o rinomina file o directory.

  • Esempi pratici mostrati:

    • Creare una directory dentro la home personale: mkdir Toto-Cutugno.

    • Creare una sottodirectory per un album: mkdir Toto-Cutugno/musica-Mediterraneo (rispettare l’uso di nomi senza spazi o utilizzare trattini).

    • Creare un file di testo con GEdit: gedit nomefile.txt; scrivere contenuto; salvare; chiudere.

    • Contenuti di una directory: ls Toto-Cutugno contiene due album; ls -l mostra dettagli come dimensione in byte, data di creazione, proprietario (es. teacher).

    • Apertura di file di testo: cat Pippo.txt mostra il contenuto; more Pippo.txt permette scorrimento.

    • Editor in uso: GEdit è un editor di testo grafico; è possibile aprire GEdit con un percorso file (es. GEdit bello.txt) o aprire una nuova finestra; usare Tab per autocompletamento quando si scrive i comandi.

    • Dettagli sull’uso di GEdit: quando si esegue GEdit, la shell resta disponibile; per riacquisire controllo e riprendere comandi, si aggiunge la E commerciale (&) alla fine del comando, ad es. GEdit bello.txt &, in modo da sganciare l’editor e liberare la shell.

  • Suggerimenti utili:

    • La freccia su / giù ricorda i comandi precedenti; premendo su o giù si riapre una riga di comando già usata.

    • Autocompletamento via Tab: digitare l’inizio di un comando o di un file e premere Tab per completare; se c’è ambiguità, premere Tab due volte per scegliere tra alternative.

    • Quando si crea nomi di file o directory con spazi, è consigliabile evitarli; se necessario, utilizzare doppi apici ("…") per includere spazi e slash nel nome.

  • Esempio pratico di esercizio guidato:

    • Creare una struttura Toto-Cutugno/Lamiamusica/Mediterraneo con due canzoni inside per ogni album, copiando contenuti da internet se necessario, incollandoli in GEdit, salvando, e organizzando con ls per verifiche; utilizzare TAB per autocompletamento e la freccia per richiamare comandi precedenti.

  • Note sulle operazioni di gestione file:

    • Per eliminare un file: rm nomefile.

    • Per eliminare una directory vuota: rmdir nome_dir.

    • Per eliminare una directory non vuota: prima svuotarla rimuovendo i file al suo interno (rm nomefile) e/o mv/cp come necessario, poi eseguire rm -r nomedir (attenzione: operazione pericolosa e irreversibile).

  • Manuali e aiuti:

    • Il comando man fornisce i manuali di uso dei comandi; esempio: man, poi digitare il comando (es. man ls); per uscire, premere Q.

  • Riferimenti utili sui nomi e referenze:

    • La directory di lavoro e la home sono spesso indicate come tilde (~); la cartella home è la "home" dell’utente e viene spesso usata come punto di partenza per i file personali.

    • La directory padre è denotata da ".."; la directory corrente è denotata da ".".

    • Per tornare rapidamente alla home si usa cd ~ oppure cd (senza path specifico).


Esercizio finale proposto dall’istruttore

  • Creare una struttura di directory come segue nella vostra home:

    • Toto-Cutugno/ (directory principale)

    • Dentro Toto-Cutugno, creare due album: musica e Mediterraneo (si può usare nomi con trattini al posto degli spazi).

    • Dentro ciascun album, creare due file che rappresentano canzoni (es. canzone1.txt, canzone2.txt).

    • Cercare due canzoni reali in internet, copiare/incollare il testo in GEdit e salvare come file dentro i rispettivi album.

    • Verificare con ls che la struttura sia stata creata correttamente: ls Toto-Cutugno; ls Toto-Cutugno/musica; ls Toto-Cutugno/Mediterraneo.

    • Esempio di file testo: dentro ciascun album creare file di canzone (es. canzone1.txt, canzone2.txt).

  • Nota pratica: l’esercizio è pensato per farvi praticare comandi base (mkdir, cd, ls, gedit, cp/mv, ecc.) e per farvi prendere confidenza con la gestione di percorsi, nomi di file e struttura a directory.


Note finali sull’utilità pratica

  • Il corso mira a fornire le basi per scrivere programmi in C, comprendere l’architettura informatica di base (CPU, RAM, IO, bus), apprendere a manipolare file e directory tramite la shell, utilizzare un compilatore, e comprendere l’interazione tra linguaggi di alto livello e linguaggio macchina.

  • Le abilità presentate sono trasferibili sia all’ambiente di laboratorio che a casa, grazie all’uso di Linux e di strumenti comuni.