Fondamenti di Programmazione (canale E-O) a.a. 2009-2010
Docente: R. Silvestri Esercitatori: P. Wollan e T. Mancini
Prova intermedia - 11 novembre 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.
Esercizio 1 (max 8 punti)
- Scrivere un programma che prende in input un intero
n
e stampa
una matrice nxn
di caratteri 'X'
e 'O'
che si deduce dai seguenti esempi:
n = 1 n = 2 n = 3 n = 4 n = 5 n = 8 n = 9
X XX XXX XXXX XXXXX XXXXXXXX XXXXXXXXX
XO XXX XXXX XXXXX XXXXXXXX XXXXXXXXX
XXO XXOO XXXXX XXXXXXXX XXXXXXXXX
XXOO XXXOO XXXXXXXX XXXXXXXXX
XXXOO XXXXOOOO XXXXXXXXX
XXXXOOOO XXXXXOOOO
XXXXOOOO XXXXXOOOO
XXXXOOOO XXXXXOOOO
XXXXXOOOO
Esercizio 2 (max 11 punti)
- Scrivere una funzione,
int distinctsort(int A[], int n)
, che
preso in input un vettore A
di dimensione n
,
ordina i valori distinti di A
e ritorna il numero di valori distinti.
Ad esempio, se A = [7, 2, 3, 7, 1, 1]
(n = 6
) allora la funzione modifica il vettore così
[1, 2, 3, 7]
e ritorna 4
(i valori degli elementi oltre
i primi 4 possono essere qualsiasi).
Esercizio 3 (max 10 punti)
- Scrivere una funzione
int repstr(char *s, int k)
che ritorna
il numero di caratteri distinti che si ripetono almeno k
volte nella
stringa s
. Ad esempio, se s = "le mele non sono solo rosse"
e k = 3
, allora la funzione ritorna 6
. Infatti,
i caratteri che si ripetono almeno 3
volte sono ' '
, 'l'
,
'e'
, 'n'
, 'o'
, 's'
.
Esercizio 4 (max 9 punti)
- Scrivere una funzione
int strcnt(char *strA[], int n, char *s)
che ritorna il numero di volte che la stringa s
occorre nell'array
di stringhe strA
la cui dimensione è n
. Ad esempio, se
strA = ["rosso", "verde", "nero", "verde"]
(quindi n = 4
)
e s = "verde"
, allora la funzione ritorna 2
.
Esercizio 5 (max 11 punti)
- Scrivere una funzione
double *threshold(int n, double M[n][n], double t, int *pcnt)
che ritorna in un array, allocato dinamicamente, i valori contenuti nella matrice
M
che sono maggiori od uguali al valore t
e restituisce in
*pcnt
il numero di tali valori. Se non ci sono valori maggiori od uguali
a t
, allora ritorna NULL
e in *pcnt
restituisce
0
.
Ad esempio, se n = 3
, la matrice M
è
0.2 3 5
11.1 3 1.6
2.8 22 2.7
e t = 2.8
, allora la funzione ritorna un array che contiene
[3, 5, 11.1, 3, 2.8, 22]
(l'ordine dei valori non conta) e in *pcnt
restituisce il valore 6
.
#include <stdio.h>
int main() {
int r, c, n;
printf("Inserire un intero: ");
scanf("%d", &n);
for (r = 0 ; r < n ; r++) {
for (c = 0 ; c < n ; c++)
if (r <= (n - 1)/2 || c <= (n - 1)/2)
printf("X");
else
printf("O");
printf("\n");
}
return 0;
}
void bubblesort(int A[], int n) {
int i, change;
do {
change = 0;
for (i = 1 ; i < n ; i++)
if (A[i - 1] > A[i]) {
int x = A[i - 1];
A[i - 1] = A[i];
A[i] = x;
change = 1;
}
} while (change);
}
int distinctsort(int A[], int n) {
bubblesort(A, n);
int i, k = 0;
for (i = 1 ; i < n ; i++) {
if (A[i] > A[k]) {
k++;
A[k] = A[i];
}
}
return k + 1;
}
#include <string.h>
int nocc(char s[], int n, char c) {
int i, occ = 0;
for (i = 0 ; i < n ; i++)
if (s[i] == c) occ++;
return occ;
}
int repstr(char *s, int k) {
int nchars = 0;
int i, n = strlen(s);
for (i = 0 ; i < n ; i++) {
if (nocc(s, i, s[i]) == 0) {
if (nocc(s, n, s[i]) >= k)
nchars++;
}
}
return nchars;
}
#include <string.h>
int strcnt(char *strA[], int n, char *s) {
int i, count = 0;
for (i = 0 ; i < n ; i++)
if (strcmp(strA[i], s) == 0)
count++;
return count;
}
#include <stdlib.h>
double *threshold(int n, double M[n][n], double t, int *pcnt) {
int r, c, count = 0;
double *val = NULL;
for (r = 0 ; r < n ; r++) {
for (c = 0 ; c < n ; c++)
if (M[r][c] >= t) {
val = realloc(val, (count + 1)*sizeof(double));
val[count++] = M[r][c];
}
}
*pcnt = count;
return val;
}