Salta ai contenuti. | Salta alla navigazione

Strumenti personali

7 gennaio 2010 - compito A

Fondamenti di Informatica 1 - Compito A

Prof. Marco Gavanelli

7 gennaio 2010

Esercizio (punti 16)

Adenina (a), citosina (c), guanina (g), uracile (u) sono dette "basi" dell'RNA. Ogni sequenza di tre basi (tripletta) codifica uno e un solo amminoacido (per esempio ccu codifica la prolina), ma un amminoacido può essere codificato da più triplette (per esempio la prolina è codificata da ccu ma anche da ccc). Un laboratorio ha memorizzato su un file di testo  esperimento.txt una sequenza di amminoacidi (massimo 100) sintetizzata con un esperimento assieme alle corrispondenti triplette codificanti (per ciascun amminoacido una di quelle possibili). In particolare, per ogni amminoacido, il file contiene le seguenti informazioni:

  • nome: stringa contenente al più 10 caratteri, senza spazi
  • tripletta: stringa contenente 3 caratteri

Purtroppo nel file esperimento.txt vi sono degli errori e alcuni degli amminoacidi sono associati con una tripletta errata (che non appartiene, cioè, all'insieme di quelle che lo codificano). Si ha però a disposizione un file di testo  associazioni.txt, che contiene le corrette associazioni (massimo 100) fra un amminoacido e le possibili triplette. Questo file ha la stessa struttura del precedente (contiene per ogni amminoacido nome e tripletta).

Si scriva un programma che identifichi le associazioni sbagliate nel file esperimento.txt e le stampi a video.

Per esempio se il file esperimento.txt contiene

 

lisina aca
prolina ccu
lisina aaa
prolina ccc
prolina auc

e il file associazioni.txt contiene

 

lisina aaa
prolina ccu
prolina ccc

si produca in output

 

ASSOCIAZIONI ERRATE:
lisina aca
prolina auc

Si utilizzi il seguente algoritmo:

  1. Si scriva una procedura o funzione di lettura, che legge uno dei file e ne porta il contenuto in un opportuno array di strutture. Si mostri a video il contenuto del file.
  2. Nel main, si invochi la procedura o funzione del punto 1 per ciascuno dei due file; si invochi poi una procedura o funzione di elaborazione (punto 3).
  3. Si implementi la procedura o funzione di elaborazione, che
    • prende come parametri i due array di strutture (ed eventualmente altri parametri)
    • e visualizza in output le associazioni del primo array che non compaiono nel secondo array.
    Per fare questo, si invochi, per ogni elemento del primo array, una funzione ricerca (punto 4), che cerca se nel secondo array è presente una associazione nome-tripletta
  4. Si implementi la funzione ricerca. Tale funzione prende come parametri
    • una associazione nome-tripletta
    • un array di strutture
    più, eventualmente, altri parametri e fornisce come risultato
    • 1 se l'associazione nome-tripletta compare nell'array
    • 0 altrimenti

Facoltativo (3 punti)

Invece di stampare a video le triplette errate, si produca un ulteriore array che contiene

  • il nome dell'amminoacido
  • la tripletta errata
  • un array contenente le possibili correzioni

ovvero, per ciascuna associazione errata, si aggiunga un array che contiene le triplette corrette. Nel main, si stampi questo array.

Soluzione

#include <stdio.h>
#define DIM 100

typedef struct
{	char nome[10];
	char tripl[4];
} amino;

int leggi_file(char nomefile[], amino A[])
{
	FILE *fp;
	int i;
	fp = fopen(nomefile,"rt");
	while (!feof(fp))
	{	fscanf(fp,"%s %s",A[i].nome,A[i].tripl);
		i++;
	}
	return i;
}
int ricerca(amino A[],int n, amino x)
{
	int trovato=0,i=0;
	while (i<n && !trovato)
		if (strcmp(A[i].nome,x.nome)==0 && strcmp(A[i].tripl,x.tripl)==0)
			trovato=1;
		else i++;
	return trovato;
}

void stampa_errate(amino esp[],int Nesp, amino assoc[], int Nassoc)
{
	int i;
	printf("ASSOCIAZIONI ERRATE:\n");
	for (i=0;i<Nesp;i++)
		if (!ricerca(assoc,Nassoc,esp[i]))
			printf("%s %s\n",esp[i].nome,esp[i].tripl);
}

main()
{
	amino esp[DIM],assoc[DIM];
	int Nesp,Nassoc;
	Nesp=leggi_file("esperimento.txt",esp);
	Nassoc=leggi_file("associazioni.txt",assoc);
	stampa_errate(esp,Nesp,assoc,Nassoc);
}