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:
- 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.
- 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). - 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.
ricerca
(punto 4), che cerca se nel secondo array è presente una associazione nome-tripletta - Si implementi la funzione
ricerca
. Tale funzione prende come parametri- una associazione nome-tripletta
- un array di strutture
- 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);
}