Gli esercizi
Testi e soluzioni di alcuni esercizi
Sottosequenze approssimate
/*
** sottosequenze.c
**
** Leggere in input 20 sequenze di numeri interi non negativi minori di 5,
** di lunghezza variabile, ma con al massimo 100 elementi. Leggere quindi
** in input due numeri interi h e k e generare in modo casuale un'altra
** sequenza S, composta da k interi non negativi minori di 5. Stampare in
** output le sequenze che contengono la sequenza S, a meno di h elementi
** al massimo.
**
** Marco Liverani (liverani@mat.uniroma3.it) - Luglio 2001
*/
#include <stdlib.h>
#include <stdio.h>
#define MAX_ELEM 100
#define MAX_SEQ 20
int leggi_sequenza(int mat[MAX_SEQ][MAX_ELEM], int i) {
int j, n;
printf("Numero di elementi: ");
scanf("%d", &n);
for (j=1; j<=n; j++)
scanf("%d", &mat[i][j]);
return(n);
}
void stampa_sequenza(int mat[MAX_SEQ][MAX_ELEM], int i) {
int j;
printf("Sequenza %d: ", i);
for (j=1; j<=mat[i][0]; j++)
printf("%d ", mat[i][j]);
printf("\n");
return;
}
int array_random(int seq[MAX_ELEM]) {
int n, i;
printf("Numero di elementi: ");
scanf("%d", &n);
for (i=1; i<=n; i++)
seq[i] = rand()%5;
return(n);
}
int verifica(int mat[MAX_SEQ][MAX_ELEM], int i, int seq[MAX_ELEM], int k, int h) {
int flag, err = 0, j, p;
for (p=1; p<mat[i][0]-k; p++) {
flag = 1;
for (j=p; j<=k && flag==1; j++)
if (mat[i][j] != seq[j]) {
err++;
if (err > h)
flag = 0;
}
}
return(flag);
}
int main(void) {
int M[MAX_SEQ][MAX_ELEM], S[MAX_ELEM], i, h, k;
for (i=0; i<4; i++) {
printf("Inserisci la sequenza n.%d:\n", i);
M[i][0] = leggi_sequenza(M, i);
}
printf("Inserisci la sequenza S:\n");
k = array_random(S);
printf("Numero di errori: ");
scanf("%d", &h);
for (i=0; i<4; i++)
if (verifica(M, i, S, k, h))
stampa_sequenza(M, i);
return(0);
}