From 5d294755542190ac5135af8e120e313b55828625 Mon Sep 17 00:00:00 2001 From: justanothercatgirl Date: Tue, 15 Oct 2024 01:59:49 +0300 Subject: I want to fucking die --- 6_1.c | 206 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 6_2.c | 68 +++++++++++++++++++++ Makefile | 27 +++++--- README.md | 9 ++- gen.c | 34 ++++++++--- 5 files changed, 326 insertions(+), 18 deletions(-) create mode 100644 6_2.c 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 #include +#include +#include + +#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 +#include +#include +#include + +#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 #include +#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, -- cgit v1.2.3-70-g09d2