summaryrefslogblamecommitdiffstats
path: root/fiz/naloga/podatki-obdelani/obdelaj.c
blob: 05241d798e166794a64b67f922afc3b687c555fc (plain) (tree)
1
2
3
                     

                 























                                                           
                                                              





                                                         
                                                                                    

                                   
                                    















                                                                                                    
                                                                                     





                                                                                                                 
                                                                                          

                                                   















                                                  
                                          















                                                                                                                    

                                                                                 



                                                              
                                                                              






                                                                                                                                             

                                                                                      

                                                                             



                                                                                                      



                                                                                                      


























                                                                                                                                                   


                               
                                                                                                             





                                                                                                                         
#define _XOPEN_SOURCE
#define PRAG 0.6
#define KOLNAZ 10
#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 > PRAG N */
};
long double /* liter */ h2v (long double /* meter */ x) {
	if (x > 0.245)
		return 1;
	if (x < 0.055)
		return 0;
	return 0.106 + (1000*(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-%08d.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) {
			fprintf(stderr, "ni uspelo odpreti %s ali %s\n", vagafn, videofn);
			if (vagaf) fclose(vagaf);
			if (videof) fclose(videof);
			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 = -1;
			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 > PRAG ? omer.F_m + omer.F_g : 0;
			fgets(buf, 256, videof);
		}
		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 < PRAG) {
				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 > PRAG) {
				intbuf /* pričetek intervala */ = j ? j - KOLNAZ : j;
				poskus[i].t_0 = poskus[i].meritev[j].t_alpha;
			}
			if (poskus[i].meritev[j].F_alpha == -1) {
				poskus[i].meritev[j].F_alpha = poskus[i].meritev[j].F_m - 0.0005*9.81;
				poskus[i].meritev[j].F_g = 0.0005*9.81;
			}
		}
		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);
		for (int odmislimo = 0; odmislimo < 2; odmislimo ++) {
			snprintf(outfn, 256, "%08d-%.1LfL-%dbar%s.csv", poskus[i].id, poskus[i].V_0, poskus[i].P_0, odmislimo ? "-odmislimo" : "");
			FILE * outf = fopen(outfn, "w");
			if (!outf) {
				fprintf(stderr, "ni uspelo odpreti za pisanje datoteke %s\n", outfn);
				continue;
			}
			t0 = -1;
			for (int j = 0; j < poskus[i].meritevn; j++) {
				if (poskus[i].meritev[j].F_m >= PRAG || (!odmislimo && (t0 != -1 && poskus[i].meritev[j].V_alpha > 0))) {
					if (t0 == -1)
						t0 = poskus[i].meritev[j].t_alpha;
					fprintf(outf, "%d,%Lf,%Lf,%Lf,%Lf,%Lf\n",
							poskus[i].meritev[j].t_alpha - t0,
							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
						);
				/*
					else
						fprintf(outf, "%d,,,,,\n", poskus[i].meritev[j].t_alpha);
				*/
				}
			}
			fclose(outf);
		}
		fclose(vagaf);
		fclose(videof);
		fprintf(stdout, "zabeležil %d: V_0: %.1Lf, P_0: %d, 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);
}