03. Raggi cosmici
L'Istituto Nazionale di Fisica Nucleare (INFN) di Napoli ha installato un telescopio nella stazione di Toledo della metropolitana di Napoli per rilevare raggi cosmici.
La relativa documentazione è disponibile al seguente link.
Ci si pone l'obiettivo di interpretare i file di log nei quali sono registrati gli eventi rilevati dal telescopio e riprodurre graficamente le traiettorie delle particelle intercettate dal telescopio.
Funzioni ausiliarie:
esa2bin()
prototipo:
void esa2bin(char x, char b[])
elaborazione:
la funzione riceve in input una cifra esadecimale nella variabile x (cioè uno dei caratteri: '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' '0' 'A' 'B' 'C' 'D' 'E' 'F') e riporta nell'array b di dimensione 4 la sua rappresentazione binaria in termini di '0' e '1' (caratteri) (b[0] rappresenta la cifra più significativa).
Esempio di elaborazione:
esa2bin('C', b) valorizza l'array b con i valori
b[0] vale '1'
b[1] vale '1'
b[2] vale '0'
b[3] vale '0'
wall()
prototipo:
void wall(char esa[], char bin[])
elaborazione:
la funzione riceve in input, nell'array esa, 30 caratteri, ciascuno dei quali rappresenta una cifra esadecimale; avvalendosi della funzione esa2bin(), riporta in output, nell'array bin di 120 caratteri, la rappresentazione binaria di ciascun carattere
Esempio di elaborazione:
wall(esa, bin) genera la seguente trasformazione:
input: esa[30]={'C', 'B', '9', ...., 'C', '3', '1'}
output:
bin[0] vale '1' bin[1] vale '1' bin[2] vale '0' bin[3] vale '0'
bin[4] vale '1' bin[5] vale '0' bin[6] vale '1' bin[7] vale '1'
bin[8] vale '1' bin[9] vale '0' bin[10] vale '0' bin[11] vale '1'
...
bin[108] vale '1' bin[109] vale '1' bin[110] vale '0' bin[111] vale '0'
bin[112] vale '0' bin[113] vale '0' bin[114] vale '1' bin[115] vale '1'
bin[116] vale '0' bin[117] vale '0' bin[118] vale '0' bin[119] vale '1'
stampa()
prototipo:
void stampa(char arr1[], char arr2[])
elaborazione:
la funzione riceve in input due array di 120 caratteri ciascuno; nell'array sono presenti esclusivamente i caratteri '0' ed '1'; occorre traslare i caratteri nel seguente modo '0'=>' ' (spazio) e '1'=>'X' e stampare gli array rispettando il format riportato in basso; ogni riga è costituita da 12 caratteri tuttavia i primi due caratteri di ciascuna riga non vanno stampati
1234567890 1234567890
-------------- --------------
10| X | 10| X |
9| X | 9| X |
8| X | 8| X |
7| X | 7| X |
6| X | 6| X |
5| X | 5| X |
4| X | 4| X |
3| | 3| X |
2| | 2| X |
1| | 1| X |
-------------- --------------
Funzioni già implementate (da riusare in modo integrale):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int evento(char *file)
{
char bin1[120], bin2[120], buff1[DIM], buff2[DIM], *ret;
int i, n_evento=0;
FILE *fd;
fd = fopen(file, "r");
if (fd==NULL) {
printf("\nFile degli eventi non trovato\n");
printf("Premere INVIO per terminare");
fflush(stdin); // svuota la coda di input
while ( getchar() != '\n');
return 0;
}
printf("Inserire il numero dell'evento da analizzare (-1 per terminare): ");
fflush(stdin);
scanf("%d", &n_evento);
if(n_evento <0)
return 0;
if(n_evento == 0)
return 1;
for (i=0; i<n_evento-1; i++) {
fgets(buff1, DIM, fd);
fgets(buff1, DIM, fd);
fgets(buff1, DIM, fd);
}
ret = fgets(buff1, DIM, fd);
if (ret==NULL){
printf("Evento non presente nel file\n");
return 1;
}
printf("\nEvento: ");
for (i=0; i<6; i++)
printf("%c", buff1[i]);
printf("\n");
fgets(buff1, DIM, fd);
wall(buff1, bin1);
fgets(buff2, DIM, fd);
wall(buff2, bin2);
for (i=0; i<30; i++) {
if (i%3 == 0 && i>0)
printf(" ");
printf("%c", buff1[i]);
}
printf("\n");
for (i=0; i<30; i++) {
if (i%3 == 0 && i>0)
printf(" ");
printf("%c", buff2[i]);
}
printf("\n\n");
stampa(bin1, bin2);
fclose(fd);
printf("\n\n\n");
return 1;
}
int main()
{
char data[100], file[100];
printf("ANALISI DEI MUONI RILEVATI DAL TELESCOPIO\n\n");
printf("Data di riferimento (aaaa/mm/gg): ");
scanf("%s", data);
data[4]=0;
data[7]=0;
strcpy(file, "Muoni_Eventi_");
strcat(file, data);
strcat(file,"_");
strcat(file,data+5);
strcat(file,"_");
strcat(file,data+8);
strcat(file,".txt");
printf("File degli eventi: %s\n\n", file);
while (evento(file));
return 0;
}
Sito: 7ecnologie
Sezione: 08. C language
Capitolo: 98. Esercizi
Paragrafo: 12. Progettazione guidata
Approfondimento: 03. Raggi cosmici
Indice dei capitoli: 00. Risorse - 01 Ambiente di sviluppo - 02. Introduzione al C - 03. Le librerie - 04. Tutorial - 05. Esercizi svolti - 98. Esercizi
Indice dei paragrafi: 01. Introduttivi - 02. Quesiti strutturati - 03. Interpretazione del codice - 04. Diagrammi di flusso - 05. Array - 06. Tipi numerici - 07. Programmazione strutturata - 08. Caratteri e stringhe - 09. File - 10. Numeri casuali - 11. Riepilogativi - 12. Progettazione guidata
Indice degli approfondimenti: 01. Corsa con i numeri - 02. Strike and balls - 03. Raggi cosmici