#include #include #include #define MIN 10 #define MAX 100000 #define M 5 int input(); void fill_sequence(char protein[M][M], double q); double energy(char protein[M][M]); int main() { int i, j, k; double q; char protein[M][M]; FILE *out = fopen("protein.dat", "w"); srand48(time(NULL)); int Np = input(); for(q = 0.0; q < 1.01; q += 0.1) { double E = 0.0; for(i = 0; i < Np; i++) { fill_sequence(protein, q); double E_i = energy(protein); E += E_i; if(i == 0) { printf("%lf ", q); for(j = 0; j < M; j++) { for(k = 0; k < M; k++) { printf("%c", protein[j][k]); } } printf(" %.2lf\n", E_i); } } fprintf(out, "%.1lf %.2lf\n", q, E / Np); } fclose(out); return 0; } int input() { int Np = 0; do { fprintf(stderr, "Inserisci il numero di sequenze da generare (compreso tra 10 e 100000)\n"); scanf("%d", &Np); } while(Np < 10 || Np > 100000); return Np; } void fill_sequence(char protein[M][M], double q) { int i, j; for(i = 0; i < M; i++) { for(j = 0; j < M; j++) { if(drand48() < q) { protein[i][j] = 'H'; } else { protein[i][j] = 'P'; } } } } double energy(char protein[M][M]) { int i, j, k; double E = 0; int coord_diff[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; for(i = 0; i < M; i++) { for(j = 0; j < M; j++) { for(k = 0; k < 4; k++) { int i_neigh = i + coord_diff[k][0]; int j_neigh = j + coord_diff[k][1]; if(i_neigh >= 0 && i_neigh < M && j_neigh >= 0 && j_neigh < M) { if(protein[i][j] == 'H' && protein[i_neigh][j_neigh] == 'H') { E += 1; } } } } } return -E / 2.0; }