summaryrefslogtreecommitdiffstats
path: root/fiz/naloga/podatki-obdelani/obdelaj.c
diff options
context:
space:
mode:
Diffstat (limited to 'fiz/naloga/podatki-obdelani/obdelaj.c')
-rw-r--r--fiz/naloga/podatki-obdelani/obdelaj.c142
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);
+}