Fondamenti di Programmazione (canale E-O) a.a. 2009-2010
Esercizi - 18 gennaio 2009
Avvertenze: non usare variabili globali; definire tutte le funzione ausiliarie usate; è
consentito usare le funzioni della libreria standard; se una soluzione non è scritta in modo
chiaro ed ordinato non sarà presa in considerazione.
Per chi fa solamente una parte: i punteggi degli esercizi
sono da intendersi raddoppiati.
Per chi fa entrambe le parti: per raggiungere la sufficienza
deve ottenere almeno 8 punti sulla Prima Parte e almeno 8 punti sulla Seconda Parte.
Prima parte
Esercizio 1 (max 6 punti)
- Scrivere una funzione
int nochar(char *str, char x)
che
ritorna la lunghezza della più lunga sottostringa (sequenza di caratteri
consecutivi) di str
che non contiene il carattere x
. Ad esempio,
se str = "stringa di esempio"
e x = 'i'
allora la funzione
ritorna 6
.
Esercizio 2 (max 8 punti)
- Scrivere una funzione
int eqfreq(int A[], int B[], int n)
che presi in input
due vettori A
e B
di eguale dimensione n
ritorna il numero di valori distinti
che hanno la stessa frequenza positiva sia in A
che in B
. Per frequenza
di un valore si intende il numero di volte che il valore appare nel vettore.
Ad esempio, se A = [3, 5, 3, 1, 2, 5, 5]
e B = [4, 3, 5, 2, 3, 5, 4]
allora la
funzione ritorna 2
perché il valore 3
ha frequenza 2 in entrambi i vettori,
il valore 2
ha frequenza 1 in entrambi i vettori e tutti gli altri valori hanno frequenze
differenti nei due vettori.
Esercizio 3 (max 10 punti)
- Scrivere una funzione
char *replacex(char *str, char *rep)
che ritorna una stringa allocata dinamicamente ottenuta sostituendo ogni occorrenza
del carattere 'X'
nella stringa str
con la stringa rep
.
Il blocco di memoria allocato per la stringa ritornata non deve essere più
grande del necessario. Ad esempio, se str = "XXena e Xla vuota"
e rep ="la pi"
allora la funzione ritorna la stringa "la pila piena e la pila vuota"
.
Seconda parte
Esercizio 4 (max 6 punti)
- Si consideri il seguente tipo:
typedef struct Elem {
int val;
struct Elem *next;
} Elem, *List;
Scrivere una funzione void fiblist(List L)
, che presa in input una lista
di interi L
aggiunge in coda alla lista un nuovo elemento con valore nel campo val
pari alla somma dei valori degli ultimi due elementi di L
. Se la lista ha meno di due elementi
la funzione non fa nulla. Ad esempio, se la lista L
è
3 -> 13 -> 11 -> 25
allora
la funzione modifica la lista così 3 -> 13 -> 11 -> 25 -> 36
.
Esercizio 5 (max 8 punti)
- Scrivere una funzione
void flines(char *infile, char *outfile)
che prende in input
il nome di un file di tipo testo (nella stringa infile
) che contiene linee di testo terminate dal carattere
newline '\n'
e crea un nuovo file di tipo testo, il cui nome è nella stringa outfile
, e
vi scrive, per ogni linea del file di input, una linea che contiene linea k: n
, dove
k
è l'indice di linea (la prima linea ha indice 1) e n
è il numero di caratteri
della linea k
. Si assume che le linee del file di input abbiano al più 100 caratteri. Ad esempio,
file di input file di output
Quant'è bella giovinezza linea 1: 24
che si fugge tuttavia! linea 2: 22
Chi vuol esser lieto, sia: linea 3: 26
di doman non c'è certezza. linea 4: 26
Esercizio 6 (max 10 punti)
- Si consideri il seguente tipo:
typedef struct Estr {
char * str; //stringa allocata dinamicamente
struct Estr *next;
} Estr, *Strlist;
Scrivere una funzione Strlist cutJoin(Strlist L, int (*cut)(char *))
che presa in input una
lista di stringhe rimuove da essa tutti gli elementi che hanno nel campo str
una stringa
tale che cut(str)
ritorna un intero diverso da zero, aggiunge in testa alla lista un
nuovo elemento che nel campo
str
ha una stringa formata concatenando tutte le stringhe rimosse e ritorna il puntatore
alla lista modificata. Ad esempio, se L
è
"verde" -> "rosso" -> "nero" -> "verde" -> "giallo" -> "viola"
e la funzione cut()
ritorna un intero diverso da zero quando la stringa contiene il
carattere 'e'
, allora la funzione cutJoin(L, cut)
modifica la lista così
"verdeneroverde" -> "rosso" -> "giallo" -> "viola"
.
int nochar(char *str, char x) {
int max = 0, i, k;
for (i = 0 ; str[i] != '\0' ; i++) {
k = 0;
while (str[i + k] != x && str[i + k] != '\0') k++;
if (k > max) max = k;
}
return max;
}
int freq(int X[], int n, int v) {
int f = 0, i;
for (i = 0 ; i < n ; i++) if (X[i] == v) f++;
return f;
}
int eqfreq(int A[], int B[], int n) {
int ef = 0, i;
for (i = 0 ; i < n ; i++)
if (freq(A, i, A[i]) == 0)
if (freq(A, n, A[i]) == freq(B, n, A[i]))
ef++;
return ef;
}
#include <stdlib.h>
#include <string.h>
char *replacex(char *str, char *rep) {
long lrep = strlen(rep), len = strlen(str);
long i, j, k;
for (i = 0 ; str[i] != '\0' ; i++)
if (str[i] == 'X') len += lrep - 1;
char *strep = malloc(len + 1);
for (k = i = 0 ; str[i] != '\0' ; i++)
if (str[i] == 'X') {
for (j = 0 ; rep[j] != '\0' ; j++)
strep[k++] = rep[j];
} else strep[k++] = str[i];
strep[k] = '\0';
return strep;
}
#include <stdlib.h>
typedef struct Elem {
int val;
struct Elem *next;
} Elem, *List;
void fiblist(List L) {
if (L == NULL || L->next == NULL) return;
Elem *e1 = L, *e2 = L->next;
L = e2;
while (L->next != NULL) {
e1 = e2;
e2 = L->next;
L = e2;
}
Elem *e = malloc(sizeof(Elem));
e->val = e1->val + e2->val;
e->next = NULL;
L->next = e;
}
#include <stdio.h>
#include <string.h>
void flines(char *infile, char *outfile) {
FILE *in = fopen(infile, "r");
FILE *out = fopen(outfile, "w");
char linea[101];
int k = 1;
while (fgets(linea, 101, in) != NULL) {
fprintf(out, "linea %d: %lu\n", k, strlen(linea)- 1);
k++;
}
fclose(in);
fclose(out);
}
#include <stdlib.h>
#include <string.h>
typedef struct Estr {
char * str;
struct Estr *next;
} Estr, *Strlist;
Strlist cutJoin(Strlist L, int (*cut)(char *)) {
Strlist *pL = &L;
char *concat = NULL;
while (*pL != NULL) {
char *str = (*pL)->str;
if (cut(str)) {
if (concat == NULL) {
concat = malloc(strlen(str) + 1);
concat[0] = '\0';
} else
concat = realloc(concat, strlen(concat) + strlen(str) + 1);
strcat(concat, str);
free(str);
Estr *next = (*pL)->next;
free(*pL);
*pL = next;
} else pL = &((*pL)->next);
}
if (concat != NULL) {
Estr *p = malloc(sizeof(Estr));
p->str = concat;
p->next = L;
L = p;
}
return L;
}