diff --git a/2025.05.09/12Ex/Makefile b/2025.05.09/12Ex/Makefile index 590d992..ec51082 100644 --- a/2025.05.09/12Ex/Makefile +++ b/2025.05.09/12Ex/Makefile @@ -20,7 +20,7 @@ else CLEAN = rm -f endif -TARGET = a08.$(EXE) +TARGET = a12.$(EXE) OBJ = main.o solve.o %.o: %.c diff --git a/2025.05.09/12Ex/main.c b/2025.05.09/12Ex/main.c index 5af4a17..58012bf 100644 --- a/2025.05.09/12Ex/main.c +++ b/2025.05.09/12Ex/main.c @@ -6,29 +6,30 @@ #include "init_f.h" #include "solve.h" -/* ./a08.out a b eps k */ +/* ./a12.out a b eps k_x k_y */ int main (int argc, char *argv[]) { double t, integral, a, b, eps; - int k, n, calls, task = 8; + int x, y, n, calls, task = 12; double (*f_lst[]) (double) = {f0, f1, f2, f3, f4, f5, f6}; int len_f = sizeof(f_lst) / sizeof(f_lst[0]); if ( - !((argc == 5) && + !((argc == 6) && sscanf(argv[1], "%lf", &a) == 1 && sscanf(argv[2], "%lf", &b) == 1 && ((sscanf(argv[3], "%lf", &eps) == 1) && (eps > 0)) && - ((sscanf(argv[4], "%d", &k) == 1) && ((0 <= k) && (k < len_f)))) + ((sscanf(argv[4], "%d", &x) == 1) && ((0 <= x) && (x < len_f))) && + ((sscanf(argv[5], "%d", &y) == 1) && ((0 <= y) && (y < len_f)))) ) { - fprintf(stderr, "Usage: %s a b eps k\n", argv[0]); + fprintf(stderr, "Usage: %s a b eps k_x k_y\n", argv[0]); return -1; } t = clock(); - n = t8_solve(f_lst[k], a, b, eps, &integral); + n = t12_solve(f_lst[x], f_lst[y], a, b, eps, &integral); t = (clock() - t) / CLOCKS_PER_SEC; calls = get_call_count(); diff --git a/2025.05.09/12Ex/solve.c b/2025.05.09/12Ex/solve.c index aeea51e..d75d2e3 100644 --- a/2025.05.09/12Ex/solve.c +++ b/2025.05.09/12Ex/solve.c @@ -5,42 +5,49 @@ #define MAX_ITER 30 -int t8_solve ( - double (*f) (double), +int t12_solve ( + double (*xt) (double), + double (*yt) (double), double a, double b, double eps, double *res ) { int it; - double n = 1; - double h = (b - a); - double integ_n = (f(a) + f(b)) * h*0.5; + int n = 1; + double h = (b - a) * 0.5; + double x = xt(b) - xt(a); + double y = yt(b) - yt(a); + double len_n = sqrt(x * x + y * y); for (it = 1; it <= MAX_ITER; ++it) { - double x = a + h*0.5; - double integ_2n = 0; + double t = a; + double tn = a + h; + double len_2n = 0; for (int i = 0; i < n; i++) { - integ_2n += f(x); - x += h; + x = xt(tn) - xt(t); + y = yt(tn) - yt(t); + len_2n += sqrt(x * x + y * y); + + t = tn; + tn += h; } h *= 0.5; - integ_2n = integ_2n * h + integ_n * 0.5; - if (fabs(integ_2n - integ_n) < eps) + if (fabs(len_2n - len_n) < eps) break; - integ_n = integ_2n; - n *= 2; + len_n = len_2n; + n <<= 1; } if (it > MAX_ITER) return -1; - *res = integ_n; + *res = len_n; return n; } diff --git a/2025.05.09/12Ex/solve.h b/2025.05.09/12Ex/solve.h index 8a997b4..f5b3183 100644 --- a/2025.05.09/12Ex/solve.h +++ b/2025.05.09/12Ex/solve.h @@ -1,8 +1,9 @@ #ifndef SOLVE_H #define SOLVE_H -int t8_solve ( - double (*f) (double), +int t12_solve ( + double (*x) (double), + double (*y) (double), double a, double b, double eps, double *res );