diff options
Diffstat (limited to 'fiz/naloga/podatki-obdelani/obdelaj.c')
-rw-r--r-- | fiz/naloga/podatki-obdelani/obdelaj.c | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/fiz/naloga/podatki-obdelani/obdelaj.c b/fiz/naloga/podatki-obdelani/obdelaj.c new file mode 100644 index 0000000..bc855ae --- /dev/null +++ b/fiz/naloga/podatki-obdelani/obdelaj.c @@ -0,0 +1,142 @@ +#define _XOPEN_SOURCE +#include <stdio.h> +#include <dirent.h> +#include <time.h> +#include <unistd.h> +#include <string.h> +#include <stdlib.h> +struct meritev { + int t_alpha; /* milisekunde */ + long double F_m; + long double h_alpha; + long double F_alpha; + long double V_alpha; /* litri */ + long double F_g; +}; +struct poskus { + int id; + struct tm cas; + struct meritev meritev[256]; /* maks 256 meritev */ + int meritevn; + long double t_m; /* milisekunde */ + long double F_alpha_avg; + long double a_k; + int P_0; + long double V_0; + long double t_0; /* čas, ko je prvič F_m > 0.5 N */ +}; +long double /* liter */ h2v (long double /* meter */ x) { + if (x > 0.245) + return 1; + if (x < 0.055) + return 0; + return 0.106 + (0.001459010809 /* r^2 */ * 3.14159265 * (x - 0.055)); +} +int main (int argc, char ** argv) { + DIR * videod, * vagad; + struct dirent * dir; + struct poskus poskus[256]; /* maks 256 poskusov */ + int i = 0; + /* videod = opendir("../podatki-video"); */ + vagad = opendir("../podatki-vaga"); + if (/* !videod || */ !vagad) { + fprintf(stderr, "ni uspelo odpreti direktorija!\n"); + /* closedir(videod); */ + closedir(vagad); + return 1; + } + fprintf(stderr, "berem direktorij ... \n"); + while ((dir = readdir(vagad)) != NULL) { + strptime(dir->d_name, "%m%d%H%M", &poskus[i].cas); + sscanf(dir->d_name, "%d-%LfL-%dbar", &poskus[i].id, &poskus[i].V_0, &poskus[i].P_0); + char videofn[256], vagafn[256], buf[256], outfn[256]; + snprintf(videofn, 256, "../podatki-video/za-%d.csv", poskus[i].id); + snprintf(vagafn, 256, "../podatki-vaga/%s", dir->d_name); + if (strstr(dir->d_name, "slabfilm") || strstr(dir->d_name, "brezfilma") || dir->d_name[3] == '0') + continue; + FILE * vagaf = fopen(vagafn, "r"); + FILE * videof = fopen(videofn, "r"); + if (!vagaf || !videof) { + fclose(vagaf); + fclose(videof); + fprintf(stderr, "ni uspelo odpreti %s ali %s\n", vagafn, videofn); + continue; + } + int t0; + long double ldbuf; + char * cp; + fgets(buf, 256, vagaf); + poskus[i].meritevn = 0; + while (!feof(vagaf)) { +#define nmer poskus[i].meritev[poskus[i].meritevn] + ldbuf = strtold(buf, &cp); + if (!poskus[i].meritevn) + t0 = ldbuf; + nmer.t_alpha = ldbuf - t0; + cp++; + ldbuf = strtold(cp, &cp); + nmer.F_m = ldbuf*9.81; + nmer.F_alpha = 0; + fgets(buf, 256, vagaf); + poskus[i].meritevn++; + } + fgets(buf, 256, videof); + while (!feof(videof)) { + ldbuf = strtold(buf, &cp); + ldbuf = (ldbuf*1000); + int j = 0; +#define omer poskus[i].meritev[j] + for (j = 0; j < poskus[i].meritevn - 1; j++) + if (poskus[i].meritev[j].t_alpha <= ldbuf && poskus[i].meritev[j+1].t_alpha > ldbuf) + break; + cp++; + omer.h_alpha = strtold(cp, &cp); + omer.V_alpha = h2v(omer.h_alpha); + omer.F_g = 0.0005*9.81 /* teža plastenke */ + omer.V_alpha*9.81 /* teža vode */; + omer.F_alpha = omer.F_m + omer.F_g; + } + int intbuf = -1; + poskus[i].t_0 = 0; + for (int j = 0; j < poskus[i].meritevn; j++) { + if (intbuf != -1 && poskus[i].meritev[j].F_m < 0.5) { + poskus[i].t_m = poskus[i].meritev[j].t_alpha - poskus[i].meritev[intbuf].t_alpha; + poskus[i].F_alpha_avg = 0; + for (int k = intbuf; k <= j; k++) { + poskus[i].F_alpha_avg += poskus[i].meritev[k].F_alpha; + } + poskus[i].F_alpha_avg /= ((j-intbuf)+1) ? (j-intbuf)+1 : fprintf(stderr, "deljenje z nič pri %s\n", vagafn); + } + if (poskus[i].meritev[j].F_m > 0.5) { + intbuf /* pričetek intervala */ = j ? j - 1 : j; + poskus[i].t_0 = poskus[i].meritev[j].t_alpha; + } + } + poskus[i].a_k = 0; + for (int j = 0; j < poskus[i].meritevn; j++) /* poor man's integral function */ + poskus[i].a_k += poskus[i].meritev[j].F_alpha/(poskus[i].meritev[j].F_g/9.81); + snprintf(outfn, 256, "%08d-%LfL-%dbar.csv", poskus[i].id, poskus[i].V_0, poskus[i].P_0); + FILE * outf = fopen(outfn, "w"); + if (!outf) { + fprintf(stderr, "ni uspelo odpreti za pisanje datoteke %s\n", outf); + continue; + } + for (int j = 0; j < poskus[i].meritevn; j++) { + fprintf(outf, "%d,%Lf,%Lf,%Lf,%Lf,%Lf\n", + poskus[i].meritev[j].t_alpha, + poskus[i].meritev[j].F_m, + poskus[i].meritev[j].h_alpha, + poskus[i].meritev[j].F_alpha, + poskus[i].meritev[j].V_alpha, + poskus[i].meritev[j].F_g + ); + } + fclose(vagaf); + fclose(videof); + fclose(outf); + fprintf(stdout, "zabeležil %d: V_0: %Lf, P_0: %Lf, a_k: %Lf, t_m: %Lf, F_alpha_avg: %Lf\n", + poskus[i].id, poskus[i].V_0, poskus[i].P_0, poskus[i].a_k, poskus[i].t_m, poskus[i].F_alpha_avg); + i++; + } + /* closedir(videod); */ + closedir(vagad); +} |