Corso di Informatica 1 (IN1 - Fondamenti)

Testi e soluzioni di 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(1);
}

Per informazioni e commenti: liverani@mat.uniroma3.it - Torna alla Home page - Ultima modifica: 16 settembre 2001