Содержание
Постановка задания
Для заданного одномерного массива А из N элементов проверить, что существует хотя бы один элемент $A_i$, для которого выполняется условие $\sqrt[3]{A_i^2 + 2} \lt 10$. В рекурсивной функции каждый раз делить рассматриваемую часть массива на две части: одну треть и две третьих, проверяя условие с помощью этой же функции сначала в левой части ($\frac{1}{3}$), а затем при необходимости и в правой части. Рекурсивные вызовы заканчивать, когда останется только один или два элемента в рассматриваемой части массива.
Реализация задачи на языке C/C++
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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | #include <Windows.h> #include <math.h> #include <stdio.h> // считывание данных из текстового файла в массив double* Read_data_from_text_file(const char* const pname_in_file, const char* const pname_out_file, int* pn) { FILE* fin = fopen(pname_in_file, "r"); FILE* fout = fopen(pname_out_file, "w"); if(!fin) { fprintf(fout, "Ошибка открытия входного файла с данными! Программа аварийно завершается!\n"); fclose(fout); exit(1); } fscanf(fin, "%d", pn); if((*pn < 1) || (*pn > 20)) { fprintf(fout, "Количество элементов исходного массива должно быть из отрезка [1 .. 20]! Измените размер массива и повторите запуск программы.\n"); fclose(fout); exit(1); } double* tmp_a = new double[*pn]; for(int i = 0; i < *pn; i++) fscanf(fin, "%lf", &tmp_a[i]); fclose(fin); fclose(fout); return tmp_a; } // вывод массива в заданный текстовый файл + результата работы программы void Write_vector_to_text_file(const double* const pa, const int pn, const char* const pname_file, const bool presult) { FILE* f = fopen(pname_file, "w"); if(!f) { printf("Ошибка создания выходного файла с данными и результатами! Программа аварийно завершается!\n"); delete []pa; exit(1); } fprintf(f, "Количество элементов в массиве: %d\n", pn); for(int i = 0; i < pn; i++) fprintf(f, "%12.2lf", pa[i]); fprintf(f, "\nСуществует ли хотя бы один элемент, удовлетворяющий заданному условию: "); if(presult == true) fprintf(f, "да, существует"); else fprintf(f, "нет, не существует"); fclose(f); } // вычисление выражение заданного элемента массива А bool Expression(const double pvalue) { return pow(pvalue * pvalue + 2, 1.0/3.0) < 10; } // рекурсивная функция (ядро алгоритма программы) bool F_rec(const double* const pa, int pbegin_index, int pend_index) { const int DIVISOR = 3; int current_lenght = pend_index - pbegin_index + 1; if(current_lenght <= 2) { bool first, second = false; first = Expression(pa[pbegin_index]); if(current_lenght == 2) second = Expression(pa[pend_index]); return (first || second); } else { // делим подпоследовательность нацело на 3 и берем в отношениях 1/3 и 2/3 // деление целочисленное, поэтому, если длина подпоследовательности не кратна 3, то могут быть "перекосы" в отношении // например: длина = 9 ---> 3 и 6 (ок), длина = 7 ---> 2 и 5 (перекос); 2 = 7/3 (делим нацело) int center_index = current_lenght / DIVISOR; return (F_rec(pa, pbegin_index, pbegin_index + center_index - 1) || (F_rec(pa, pbegin_index + center_index, pend_index))); } } // главная функция программы (точка входа) int main(int argc, char* argv[]) { SetConsoleOutputCP(1251); int n; if(argc != 3) { printf("Неправильное количество входных параметров! Программа аварийно завершается.\n"); exit(1); } double* A = Read_data_from_text_file(argv[1], argv[2], &n); bool result = F_rec(A, 0, n - 1); Write_vector_to_text_file(A, n, argv[2], result); delete []A; printf("Обработка данных успешно проведена.\n"); return 0; } |
Отчет
Помимо программного кода к данной лабораторной работе был сделан небольшой отчет.
Заказать у нас работу по программированию
Очень часто нам на почту поступают письма от студентов, которым требуется реализовать похожее задание. То есть студент на сайте нашел пример лабораторной работы, которая почти на $100\%$ соответствует той, которую ему надо выполнить.
➡ Сразу хотим сказать, что бесплатно мы ничего не реализуем. Поэтому, если вам необходимо помочь в кодировании похожей работы, то пишите на наш электронный адрес proglabs@mail.ru.
💡 Хорошая новость для вас в том, что это задание является тривиальным и мы готовы предоставить качественное решение за небольшие деньги. Цена обговаривается в индивидуальном порядке. Ориентировочная стоимость задачи, показанной в этом примере, составляет $150 — 200$ рублей.
Добавить комментарий