aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjustanothercatgirl <sotov2070@gmail.com>2024-10-15 01:59:49 +0300
committerjustanothercatgirl <sotov2070@gmail.com>2024-10-15 01:59:49 +0300
commit5d294755542190ac5135af8e120e313b55828625 (patch)
tree5284ef2f99b4ea7ebe987b87ee3600c7cad22262
parent0a10914e4f3c5e11f192e6b541ba9cebb3efd679 (diff)
I want to fucking dietask6
-rw-r--r--6_1.c206
-rw-r--r--6_2.c68
-rw-r--r--Makefile27
-rw-r--r--README.md9
-rw-r--r--gen.c34
5 files changed, 326 insertions, 18 deletions
diff --git a/6_1.c b/6_1.c
index f612329..25c61b5 100644
--- a/6_1.c
+++ b/6_1.c
@@ -1,3 +1,209 @@
#include <stdio.h>
#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#define SIZEOFBUF 1024
+#define reset(bufsz) bufsz = SIZEOFBUF
+
+// копирует n линий из файла in в файл out
+void copy_n_lines(char **buf, size_t *bufsz, FILE *in, FILE *out, int n) {
+ for (int i = 0; i < n; ++i) {
+ getline(buf, bufsz, in);
+ fputs(*buf, out);
+ }
+}
+
+// комирует первые n столбцов из фала in в out
+void copy_n_words(char **buf, size_t *bufsz, FILE *in, FILE *out, int n, char delim) {
+ ssize_t cursz;
+ for (int i = 0; i < n; ++i) {
+ if ((cursz = getdelim(buf, bufsz, delim, in)) < 0) return;
+ fputs(*buf, out);
+ }
+}
+
+// пропускает первые n слов в файле in
+void skip_n_words(char **buf, size_t *bufsz, FILE *in, int n, char delim) {
+ for (int i = 0; i < n; ++i)
+ getdelim(buf, bufsz, delim, in);
+}
+
+// вариант 1
+void change_surnames(FILE *in, FILE *out) {
+ char *buf = malloc(SIZEOFBUF);
+ size_t bufsz = SIZEOFBUF;
+ ssize_t cursz;
+ // первые 2 строки такие же
+ copy_n_lines(&buf, &bufsz, in, out, 2);
+ while (!feof(in)) {
+ // получаем первое слово
+ if ((cursz = getdelim(&buf, &bufsz, '\t', in)) < 0) break;
+ buf[cursz-1] = '\0'; // убираем '\t' в конце
+ fprintf(out, "%s%c\t", buf, rand() % ('z'-'a'+1)+'a');
+ // копируем оставшуюся линию
+ if (getline(&buf, &bufsz, in) < 0) break;
+ fputs(buf, out);
+ }
+ free(buf);
+}
+
+// вариант 2
+void change_birth_dates(FILE *in, FILE *out) {
+ char *buf = malloc(SIZEOFBUF);
+ size_t bufsz = SIZEOFBUF;
+ // первые 2 строки должны быть такими же
+ copy_n_lines(&buf, &bufsz, in, out, 2);
+ while (!feof(in)) {
+ // и первые 3 слова тоже
+ copy_n_words(&buf, &bufsz, in, out, 3, '\t');
+ // меняем дату :devil:
+ if (getdelim(&buf, &bufsz, '\t', in) < 0) break;
+ int bd = atoi(buf);
+ if (!bd) break;
+ fprintf(out, "%i\t", bd + rand()%11-5);
+ // выписываем оставшуюся строку
+ if (getline(&buf, &bufsz, in) < 0) break;
+ fputs(buf, out);
+ }
+ free(buf);
+}
+
+// вариант 3
+void avg_score(FILE *in, FILE *out) {
+ char *buf = malloc(SIZEOFBUF);
+ size_t bufsz = SIZEOFBUF;
+ size_t counter = 0;
+ long marks[3] = {0};
+ // первые 4 столбца
+ skip_n_words(&buf, &bufsz, in, 4, '\t');
+ // комируем оставшуюся линию
+ copy_n_lines(&buf, &bufsz, in, out, 1);
+ while (!feof(in)) {
+ // первые 4 столбца не интересуют
+ skip_n_words(&buf, &bufsz, in, 4, '\t');
+ if (getline(&buf, &bufsz, in) < 0) break;
+ // здесь и в цикле выделяем 3 числа и прибавляем их к
+ // оценкам по правильному индексу
+ // strotok, а не getdelim, потому что доходим до конца строки
+ strtok(buf, "\t\n");
+ int index = 0;
+ do {
+ int tmp = atoi(buf);
+ if (!tmp) break;
+ marks[index] += tmp;
+ ++index;
+ } while ((buf = strtok(NULL, "\t\n")));
+ ++counter;
+ }
+ // выводим результат
+ fprintf(out, "%lf\t%lf\t%lf\n",
+ (double)marks[0] / counter,
+ (double)marks[1] / counter,
+ (double)marks[2] / counter);
+ free(buf);
+}
+
+// вариант 4
+void switch_marks(FILE *in, FILE *out) {
+ char *buf = malloc(SIZEOFBUF);
+ size_t bufsz = SIZEOFBUF;
+ // первые 2 линие такие же
+ copy_n_lines(&buf, &bufsz, in, out, 2);
+ while (!feof(in)) {
+ copy_n_words(&buf, &bufsz, in, out, 4, '\t');
+ if (getline(&buf, &bufsz, in) < 0) break;
+ // здесь и в цикле выделяем 3 числа и изменяем их по заданию
+ // strotok, а не getdelim, потому что доходим до конца строки
+ strtok(buf, "\t\n");
+ do {
+ int tmp = atoi(buf);
+ if (!tmp) break;
+ fprintf(out, "%i\t", 5-tmp+2); // о неет, кто поменял все оценки...
+ } while ((buf = strtok(NULL, "\t\n")));
+ fputc('\n', out); // не забываем newline
+ }
+ free(buf);
+}
+
+// вариант 5
+void excellents(FILE *in, FILE *out) {
+ char *buf = malloc(SIZEOFBUF);
+ size_t bufsz = SIZEOFBUF;
+ ssize_t cursz;
+ // возьмём столбцы из оригинального файла и скопируем нужные
+ copy_n_lines(&buf, &bufsz, in, out, 1);
+ copy_n_words(&buf, &bufsz, in, out, 1, '\t');
+ skip_n_words(&buf, &bufsz, in, 3, '\t');
+ copy_n_lines(&buf, &bufsz, in, out, 1);
+ while (!feof(in)) {
+ if ((cursz = getdelim(&buf, &bufsz, '\t', in)) < 0) break;
+ // сохраняем фамилию на потом;
+ char *lname = malloc(sizeof (char) * cursz);
+ char *marks = NULL; // понадобится позже
+ strncpy(lname, buf, cursz);
+ // пропускаем 3 колонки (имя, отчество, дата рождения)
+ skip_n_words(&buf, &bufsz, in, 3, '\t');
+ // сохраняем строку оценок
+ if ((cursz = getline(&buf, &bufsz, in)) < 0) goto free; // чтобы не было утечек памяти
+ marks = malloc(sizeof (char) * cursz);
+ strncpy(marks, buf, cursz);
+ // цикл, в котором считаем кол-во пятёрок
+ int fives_count = 0;
+ strtok(buf, "\t\n");
+ do {
+ int tmp = atoi(buf);
+ if (!tmp) break;
+ if (tmp == 5) ++fives_count;
+ } while ((buf = strtok(NULL, "\t\n")));
+ if (fives_count >= 2)
+ fprintf(out, "%s%s", lname, marks);
+free:
+ free(lname);
+ free(marks);
+ }
+}
+
+// массив функций для более простого выбора варианта
+void (*variants[5])(FILE *, FILE *) = {
+ change_surnames,
+ change_birth_dates,
+ avg_score,
+ switch_marks,
+ excellents
+};
+
+int main(int argc, char *argv[]) {
+ srand(0xB19B00B5);
+
+ // стандартный цикл обработки аргументов argv
+ if (argc != 6) {
+ fprintf(stderr, "usage: \n" "%s -i INPUT -o OUTPUT variant\n", *argv);
+ return 1;
+ }
+ const char *in, *out;
+ int var = 0;
+ for (int i = 0; i < argc; ++i) {
+ if (!strcmp(argv[i], "-i"))
+ in = argv[++i];
+ else if (!strcmp(argv[i], "-o"))
+ out = argv[++i];
+ else
+ var = atoi(argv[i]);
+ }
+ if (var < 1 || var > 5) {
+ fprintf(stderr, "Неправильный вариант: %i\n", var);
+ return 1;
+ }
+ // открытие файлов
+ FILE *f_in = fopen(in, "r");
+ FILE *f_out = fopen(out, "w+");
+ if (!f_in || !f_out) {
+ fprintf(stderr, "Не удалось открыть файл: %s\n", strerror(errno));
+ return 1;
+ }
+ // сам вызов функции
+ variants[--var](f_in, f_out);
+ return 0;
+}
diff --git a/6_2.c b/6_2.c
new file mode 100644
index 0000000..77b0a9d
--- /dev/null
+++ b/6_2.c
@@ -0,0 +1,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;
+}
diff --git a/Makefile b/Makefile
index 397b412..710a9d8 100644
--- a/Makefile
+++ b/Makefile
@@ -1,16 +1,25 @@
-all: 5_1 5_2 5_3
+VAR ?= 1
-5_1: 5_1.c matrix.c
- cc -o $@ $^ -lm
+all: 6_1 6_2
-5_2: 5_2.c matrix.c
- cc -o $@ $^ -lm
+gen: gen.c
+ $(CC) -o $@ $<
-5_3: 5_3.c matrix.c
- cc -o $@ $^ -lm
+6_1: 6_1.c gen
+ $(CC) -o $@ $<
-.PHONY: clean
+6_2: 6_2.c
+ $(CC) -o $@ $< -lm
+
+.PHONY: clean run1 run2
+
+run1: gen 6_1
+ ./gen 100 in.1
+ ./6_1 -i in.1 -o out.1 $(VAR)
+
+run2: 6_2
+ ./6_2 -1 t2.1 -2 t2.2 -a 0 -b 3.141592657 -x 0.1
clean:
- rm -f 5_1 5_2 5_3
+ rm -f gen 6_1 6_2 in.1 out.1 t2.1 t2.2
diff --git a/README.md b/README.md
index 8b13789..cd489ed 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,8 @@
-
+# задания 6.1 и 6.2
+# Я заебался
+если есть вопросы - лс
+## 6.1
+Сделано для всех вариантов. Для каждого варианта своя функция с комментами
+## 6.2
+Просто сделано 2 пункта в 1 файле. Я не вижу смысл создавать 2 программы, когда можно
+создать одну, выполняюшую оба из них
diff --git a/gen.c b/gen.c
index 0de52cc..44c3d9b 100644
--- a/gen.c
+++ b/gen.c
@@ -1,10 +1,19 @@
#include <stdlib.h>
#include <stdio.h>
+#define vowsz (sizeof vows)
+#define consz (sizeof cons)
+
+char vows[] = {'a', 'e', 'i', 'o', 'u'};
+char cons[] = {
+ 'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm',
+ 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z'
+};
+
int main(int argc, char *argv[]) {
srand(69420);
if (argc != 3) {
- fputs("Error: usage: provide number of arguments and outpit filename\n"
+ fputs("Error: usage: provide number of arguments and output filename\n"
"./a.out 69 amogus\n", stderr);
return 1;
}
@@ -17,16 +26,25 @@ int main(int argc, char *argv[]) {
name[8] = {0},
mname[8] = {0};
int byear = rand()%125+1900,
- scphy = rand() % 5 + 1,
- scmat = rand() % 5 + 1,
- scinf = rand() % 5 + 1;
+ scphy = rand() % 4 + 2,
+ scmat = rand() % 4 + 2,
+ scinf = rand() % 4 + 2;
lname[0] = rand() % ('Z'-'A'+1)+'A';
name[0] = rand() % ('Z'-'A'+1)+'A';
mname[0] = rand() % ('Z'-'A'+1)+'A';
- for (int j = 1; j < 7; ++j) {
- lname[j] = rand() % ('z'-'a'+1)+'a';
- name[j] = rand() % ('z'-'a'+1)+'a';
- mname[j] = rand() % ('z'-'a'+1)+'a';
+ char llastvow = 0;
+ char lastvow = 0;
+ char mlastvow = 0;
+ for (int j = 1; j < 6; ++j) {
+ if(llastvow) lname[j] = cons[rand() % consz];
+ else lname[j] = vows[rand() % vowsz];
+ if(lastvow) name[j] = cons[rand() % consz];
+ else name[j] = vows[rand() % vowsz];
+ if(mlastvow) mname[j] = cons[rand() % consz];
+ else mname[j] = vows[rand() % vowsz];
+ llastvow = !llastvow;
+ lastvow = !lastvow;
+ mlastvow = !mlastvow;
}
fprintf(f, "%s\t%s\t%s\t%i\t%i\t%i\t%i\n",
lname, name, mname,