aboutsummaryrefslogtreecommitdiffstats
path: root/6_2.c
blob: 77b0a9d21c05a669b7ae4f39d4a9cc608d881ef5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>

#define SIZEOFBUF 1024

// какую функцию будем дифференцировать
double (*const func)(double) = sin;

// пункт 1
void generate_file1(FILE *f, double min, double max, double dx) {
	for (double i = min; i < max; i += dx) {
		fprintf(f, "x = %lf\tf(x) = %lf\t f'(x) = %lf\n",
				i, func(i), (func(i+dx) - func(i)) / dx
		       );
	}
}

void generate_file2(FILE *in, FILE *out) {
	char *buf = malloc(SIZEOFBUF);
	size_t bufsize = SIZEOFBUF;
	const char *delim = "xf()'= \t\n";
	while (!feof(in)) {
		getline(&buf, &bufsize, in);
		char * p = strtok(buf, delim);
		do fprintf(out, "%s\t", p);
		while ((p = strtok(NULL, delim)) != NULL);
		fputc('\n', out);
	}
}

int main(int argc, char *argv[]) {
	// стандартный цикл обработки аргументов argv
	if (argc != 5*2 + 1) {
		fprintf(stderr, 
			"usage: \n" "%s -1 FILE1 -2 FILE2 -a MIN -b MAX -x DX\n"
			"\t FILE1: пункт 1, FILE2: пункт2\n"
			"\tMIN: нижняя граница дифференцирования, MAX: верхняя\n"
			"\tDX: шаг дифференцирования\n", 
			*argv);
		return 1;
	}
	const char *f1, *f2;
	double min, max, dx;
	for (int i = 0; i < argc; ++i) {
		if (!strcmp(argv[i], "-1"))
			f1 = argv[++i];
		if (!strcmp(argv[i], "-2")) 
			f2 = argv[++i];
		if (!strcmp(argv[i], "-a"))
			min = atof(argv[++i]);
		if (!strcmp(argv[i], "-b"))
			max = atof(argv[++i]);
		if (!strcmp(argv[i], "-x"))
			dx = atof(argv[++i]);
	}

	FILE *f1f = fopen(f1, "w+");
	if (!f1f) return 1;
	generate_file1(f1f, min, max, dx);
	fclose(f1f);
	f1f = fopen(f1, "r");
	FILE *f2f = fopen(f2, "w+");
	if (!f2f) return 1;
	generate_file2(f1f, f2f);
	return 0;
}