Esercizi in C
Salve a tutti stavo cercando qualcuno che mi possa suggerire dove posso trovare esercizi da fare in C per preparare un esamino di laboratorio di fondamenti di informatica del primo anno del politecnico di milano per ingegneria informatica su questi argomenti
Programma del corso
1. Concetti introduttivi:
Algoritmi, programmi e linguaggi - Struttura di massima di un calcolatore e di un sistema informatico (hardware, software, Sistema Operativo, reti) - Catena di programmazione.
2. Logica e codifica binaria dell'informazione:
logica proposizionale, operatori logici AND, OR, NOT, leggi di De Morgan - Rappresentazione dei numeri interi (base 2, 8, 16, complemento alla base 2: codifica e aritmetica), codifica dei numeri reali, codifica di caratteri e dati multimediali) - Cenni di aritmetica binaria
3. Aspetti fondamentali della programmazione (con riferimento al linguaggio C):
il linguaggio di programmazione e le esigenze di astrazione, la sintassi dei linguaggi, struttura di un programma monomodulo, astrazione sui dati (concetto di tipo e tipi base del linguaggio, operatori e compatibilità, i costruttori di tipo array, struct, puntatori), astrazione sul controllo dell'esecuzione (strutture di controllo condizionali, di selezione, iterative).
4. Sottoprogrammi e ricorsione:
sottoprogrammi come astrazione sul controllo a livello di unità, passaggio dei parametri, dati locali, regole di visibilità, sviluppo top down per raffinamento, ricorsione, supporto a run-time per la gestione della chiamata e ritorno da sottoprogramma (record di attivazione, stack e stack pointer).
5. Strutture dati dinamiche, liste collegate a puntatori.
6. Strutture dati persistenti:
i file (concetti, operazioni, organizzazione logica), integrazione tra strutture dati in memoria centrale e su file.
7. I processi e le funzioni per la loro gestione (solo per Fondamenti di Informatica):
creazione dei processi, spazio di memoria e contesto di un processo (semplificato), esecuzione programmi e controllo variabili e sincronizzazione padre e figli.
grazie a tutti dell'attenzione
Programma del corso
1. Concetti introduttivi:
Algoritmi, programmi e linguaggi - Struttura di massima di un calcolatore e di un sistema informatico (hardware, software, Sistema Operativo, reti) - Catena di programmazione.
2. Logica e codifica binaria dell'informazione:
logica proposizionale, operatori logici AND, OR, NOT, leggi di De Morgan - Rappresentazione dei numeri interi (base 2, 8, 16, complemento alla base 2: codifica e aritmetica), codifica dei numeri reali, codifica di caratteri e dati multimediali) - Cenni di aritmetica binaria
3. Aspetti fondamentali della programmazione (con riferimento al linguaggio C):
il linguaggio di programmazione e le esigenze di astrazione, la sintassi dei linguaggi, struttura di un programma monomodulo, astrazione sui dati (concetto di tipo e tipi base del linguaggio, operatori e compatibilità, i costruttori di tipo array, struct, puntatori), astrazione sul controllo dell'esecuzione (strutture di controllo condizionali, di selezione, iterative).
4. Sottoprogrammi e ricorsione:
sottoprogrammi come astrazione sul controllo a livello di unità, passaggio dei parametri, dati locali, regole di visibilità, sviluppo top down per raffinamento, ricorsione, supporto a run-time per la gestione della chiamata e ritorno da sottoprogramma (record di attivazione, stack e stack pointer).
5. Strutture dati dinamiche, liste collegate a puntatori.
6. Strutture dati persistenti:
i file (concetti, operazioni, organizzazione logica), integrazione tra strutture dati in memoria centrale e su file.
7. I processi e le funzioni per la loro gestione (solo per Fondamenti di Informatica):
creazione dei processi, spazio di memoria e contesto di un processo (semplificato), esecuzione programmi e controllo variabili e sincronizzazione padre e figli.
grazie a tutti dell'attenzione
Risposte
Che genere di esercizi avevi in mente? Di programmazione? Su tutto il programma?
sisi di programmazione e si se possibile su tutto il programma. Gli esercizi dovrebbero essere "stupidi" ma difficili da scrivere in C del tipo "completare il programma in modo che fornito un numero n esso restituisca se è scrivibile come somma di quadrati" oppure "completare il programma in modo che dati n1,n2,n3 e la base b, esso restituisca la cifra più alta dei numeri n1,n2,n3 scritti in base b" oppure "completare il programma in modo che, dati 2 numeri n e b(base), restituisca il numero di cifre diverse del numero n scritto in base b" robe così che sembrano banali ma poi sono un pò difficili concettualmente da scrivere ma su tutto il programma
Ma scusa, perché mai gli esercizi dovrebbe comprendere solo il completamento di un programma? In modo che il programma contenga anche la correzione dei risultati? È molto più comune trovare esercizi in cui venga richiesta la scrittura dell'intero programma o di una singola funzione (ma senza fornire il resto del programma).
In ogni caso, quasi qualsiasi manuale sul C contiene esercizi di quel tipo e non è difficile inventarsi decine di problemi da fare. Per esempio:
1. Scrivere una funzione che preso un intero \(k\), restituisca il numero minimo di tagli necessari per dividere una torta in \(k\) parti (non necessariamente uguali). Sono ammessi solo tagli perpendicolari alla base della torta (devi quindi interpretare il problema in due dimensioni). E se fossero ammessi anche i tagli che non sono perpendicolari alla base della torta?
2. Scrivere una funzione che date due successioni di interi \(a_1, \dotsc, a_n\) e \(b_1, \dotsc, b_n\) (memorizzati in due array), restituisca il valore
\[ \max_{1 \le i < j \le n} \; \Bigl| \sum_{k=i}^j \,a_k\,b_k \Bigr|. \]
3. Scrivere una funzione che dato un numero \(n\) e una base \(b\), restituisca il numero di multipli o sottomultipli del numero ottenibili a partire da una rotazione delle cifre del numero nella base \(b\). Se abbiamo ad esempio il numero \(1234_{10}\) (e la base \(10\)) devi prendere in considerazione i numeri \(4123_{10}, 3412_{10}\) e \(2341_{10}\). Di questi, nessuno è un multiplo o sottomultiplo tranne ovviamente il numero stesso per cui devi restituire \(1\). Prendendo però il numero \(142857_{10}\) si ottengono invece tutti multipli del numero e quindi la funzione deve restituire \(6\).
4. Scrivere una funzione che, dato un insieme \(A = \{a_1, \dotsc, a_n\}\) di interi restituisca il valore:
\[ \max_{B \in \mathcal P(A)} \; \frac{1}{|B|} \sum_{b \in B} \, b - \frac{1}{|A| - |B|} \sum_{c \notin B} \, c \]
dove \( \mathcal P(A) \) è l'insieme dei sottoinsiemi di \(A\) e \(|B|\) e \(|A|\) sono rispettivamente il numero di elementi in \(B\) e \(A\).
5. Infine un problema forse più semplice degli altri. Scrivere una funzione che dati due interi \(a\) e \(b\) restituisca il numero di divisori comuni tra i due numeri.
In ogni caso, quasi qualsiasi manuale sul C contiene esercizi di quel tipo e non è difficile inventarsi decine di problemi da fare. Per esempio:
1. Scrivere una funzione che preso un intero \(k\), restituisca il numero minimo di tagli necessari per dividere una torta in \(k\) parti (non necessariamente uguali). Sono ammessi solo tagli perpendicolari alla base della torta (devi quindi interpretare il problema in due dimensioni). E se fossero ammessi anche i tagli che non sono perpendicolari alla base della torta?
2. Scrivere una funzione che date due successioni di interi \(a_1, \dotsc, a_n\) e \(b_1, \dotsc, b_n\) (memorizzati in due array), restituisca il valore
\[ \max_{1 \le i < j \le n} \; \Bigl| \sum_{k=i}^j \,a_k\,b_k \Bigr|. \]
3. Scrivere una funzione che dato un numero \(n\) e una base \(b\), restituisca il numero di multipli o sottomultipli del numero ottenibili a partire da una rotazione delle cifre del numero nella base \(b\). Se abbiamo ad esempio il numero \(1234_{10}\) (e la base \(10\)) devi prendere in considerazione i numeri \(4123_{10}, 3412_{10}\) e \(2341_{10}\). Di questi, nessuno è un multiplo o sottomultiplo tranne ovviamente il numero stesso per cui devi restituire \(1\). Prendendo però il numero \(142857_{10}\) si ottengono invece tutti multipli del numero e quindi la funzione deve restituire \(6\).
4. Scrivere una funzione che, dato un insieme \(A = \{a_1, \dotsc, a_n\}\) di interi restituisca il valore:
\[ \max_{B \in \mathcal P(A)} \; \frac{1}{|B|} \sum_{b \in B} \, b - \frac{1}{|A| - |B|} \sum_{c \notin B} \, c \]
dove \( \mathcal P(A) \) è l'insieme dei sottoinsiemi di \(A\) e \(|B|\) e \(|A|\) sono rispettivamente il numero di elementi in \(B\) e \(A\).
5. Infine un problema forse più semplice degli altri. Scrivere una funzione che dati due interi \(a\) e \(b\) restituisca il numero di divisori comuni tra i due numeri.
"apatriarca":
Ma scusa, perché mai gli esercizi dovrebbe comprendere solo il completamento di un programma? In modo che il programma contenga anche la correzione dei risultati? È molto più comune trovare esercizi in cui venga richiesta la scrittura dell'intero programma o di una singola funzione (ma senza fornire il resto del programma).
non ho capito bene cosa vuoi dire
In tutti i tuoi esempi hai scritto "completare il programma in modo che...", ma per diverse ragioni è decisamente raro trovare un esercizio di questo tipo in un qualche libro perché richiede molta più fatica da parte della persona che prepara gli esercizi. Esercizi di questo tipo li ho visti solo in compiti di esame. È molto più comune trovare esercizi in cui si chiede la scrittura completa di un programma o, nel caso in cui si richieda l'implementazione di funzioni, si lasci allo studente l'onere di scrivere anche un programma che permetta di testare tale funzione.
infatti sono testi presi da un vecchio esame di laboratorio...mi spiego meglio. Al Politecnico per quello che ho vissuto io in questo esame di laboratorio venivano implementate già delle funzioni che venivano passate al compilatore "senza che io me ne accorgessi" io dovevo implementare solo alcune funzioni secondo la mia logica e questo strumento chiamato verificatore passava dei vaolri e appunto verificava che la mia funzione fosse giusta passando prima tra le altre funzioni già implementate in qualche modo strano nel file che io non potevo modificare...non so se sono stato chiaro
Certo che sei stato chiaro, ma è più istruttivo se impari a scrivere l'intero programma. Inoltre, non sono a conoscenza di siti (perché ovviamente non ci può essere un verificatore su un libro) che propongono esercizi di questo tipo. Ci sono siti come projecteuler e topcoder che propongono un verificatore ma propongono esercizi MOLTO difficili (sono dopotutto praticamente competizioni) e quindi non sono particolarmente adatti per imparare (c'è poi forse qualcosa collegato a qualche competizione tipo le olimpiadi di informatica). In ogni caso, tutti questi siti richiedono l'implementazione di un intero programma (con input da console normalmente). Ma se riesci a scrivere un intero programma, dovresti anche essere in grado di completarne un altro seguendo delle istruzioni. Per cui perché non inizi a provare a risolvere uno dei problema che ti ho dato oppure uno di quelli nel tuo manuale C? Se ci tieni ad avere un "verificatore" posso provare a scrivere dei codici di test.
inizierò con quelli che mi hai proposto te e quelli sul manuale che ho che è "C corso completo di programmazione" di H.M. Deitel & P.J.Deitel