Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Формирование таблицы идентификаторов
В задании упоминаются: двумерный массив вещественного типа, количество строк ( М < =7), количество столбцов ( N < =7), входной текстовый файл, номер столбца с минимальным элементом, одномерный массив вещественного типа. Кроме того, так как придется перебирать элементы двумерного массива, потребуется использовать текущий номер строки ( i ) и текущий номер столбца ( j ) элемента массива, а при поиске минимального элемента – использовать переменную для найденного минимума. Сортировка пересчетом потребует заводить счетчик ( ki ) числа элементов, меньше рассматриваемого " i -го" элемента сортируемого столбца, признак незанятого места в выходном массиве ( Pr ), дополнительные счетчики в циклах перебора элементов при подсчете и записи ( i1, i2 ). Еще можно упомянуть имя программы и выходного файла для результатов. На основании перечисленных объектов таблица будет содержать:
Таблица 19. Идентификаторы программы 31 варианта
Алгоритм Должен содержать следующие шаги:
a) Цикл расчета числа элементов, меньших " i -го". Перед циклом ki делаем равным не нулю, а единице, т.к. после подсчета числа элементов, меньших данного, его выходной номер должен стать на единицу больше этого числа. b) Поиск места в выходном массиве, для рассматриваемого элемента. Если найденное место уже занято, следует двигаться дальше по массиву, пока не встретится незанятое место. Этот процесс необходим, если в сортируемом ряду несколько одинаковых чисел, претендующих, на одно и тоже место.
При оформлении лабораторной работы, алгоритм следует изобразить в форме блок-схемы.
Текст программы. PROGRAM SortNum; { Программа Лабораторной работы N 5 Вариант N 31. А.Я.Умненькая, ст. гр. Я-007 } VAR M, N, Jmin, i, j, i1, ki: integer; Amin, Pr: real; A: array [1..7, 1..7] of real; B: array [1..7] of real; Fin, Fout: text; LABEL Vvod_M, Vvod_N; BEGIN { Открытие входного и выходного файлов } assign(Fout, 'UMNIK5.RES'); rewrite(Fout); assign(Fin, 'D: \LAB1\DATF.TXT'); reset(Fin); { Ввод количества строк массива } Vvod_M: writeln ('Введите число строк массива'); readln(M); if (M < 2) or (M > 7) then begin writeln('Недопустимое значение! '); goto Vvod_M; end; { Ввод количества столбцов массива } Vvod_N: writeln ('Введите число столбцов массива'); readln(N); if (N < 2) or (N > 7) then begin writeln('Недопустимое значение! '); goto Vvod_N; end; { заполнение массива числами из файла } for i: =1 to M do for j: =1 to N do read(Fin, A[i, j]); { Закрытие входного файла } close(Fin); { Распечатка исходного массива } Writeln(Fout, ' Исходный массив из ', M, 'x', N, ' элементов'); for i: =1 to M do begin for j: =1 to N do Write(Fout, A[i, j]: 8: 2); {печать текущей строки } Writeln(Fout); end; Writeln(Fout); { Поиск столбца с минимальным элементом } Amin: = A[1, 1]; Jmin: = 1; for i: =1 to M do for j: =1 to N do if A[i, j] < Amin then begin Amin: = A[i, j]; Jmin: = j; end; { Определение признака незанятого места } Pr: = Amin - 1.0; { Очистка выходного массива } for i: =1 to M do B[i]: = Pr; { сортировка " Jmin-го" столбца в выходной файл пересчетом } for i: = 1 to M do begin ki: = 1; for i1: =1 to M do if A[i1, Jmin] < A[i, Jmin] then ki: = ki+1; { сдвиг дальше, если элемент уже занят } while B[ki] < > Pr do ki: = ki+1; B[ki]: = A[i, Jmin]; end; { Печать номера столбца c минимальным элементом } Writeln(Fout, 'Результаты работы': 30); Writeln(Fout); Writeln(Fout, ' Минимальный элемент находится в ', Jmin, ' столбце'); { Печать отсортированного массива } Writeln(Fout, 'Сортированный массив': 30); for i: =1 to M do Write(Fout, B[i]: 8: 2); Writeln(Fout); { Закрытие выходного файла } close(Fout); END.
Содержимое файла результатов UMNIK5.RES
Исходный массив из 7x7 элементов -2.20 -6.93 0.20 8.97 8.09 5.38 7.82 5.43 15.33 13.60 9.32 17.38 17.70 16.26 13.13 13.78 20.59 17.91 15.16 19.02 21.66 18.71 17.73 20.59 21.77 22.49 21.99 19.42 15.68 17.73 21.90 13.50 17.68 18.50 15.51 11.54 19.04 17.86 13.20 10.25 10.44 8.46 11.92 5.60 5.75 2.69 8.51 0.52 3.61
Результаты работы Минимальный элемент находится в 2 столбце Сортированный массив -6.93 5.60 13.78 15.33 17.73 17.73 19.04
Варианты заданий Таблица 20 Варианты заданий лабораторной работы №5
Лабораторная работа N 6 Программирование итерационных циклов (использование рекуррентных формул для расчета функций) Задачи лабораторной работы Вопросы, изучаемые в работе · Изучение понятия рекуррентных соотношений. · Применение алгоритмов вычисления элементарных функций как сумм бесконечного числа слагаемых. · Продолжение изучения организации итеративных циклов с помощью операторов условных переходов, операторов с пост- и предусловием. · Вывод результатов в табличной форме (с использованием форматов). Задание (общее ко всем вариантам) Для всех значений X, задаваемых параметрами из набора: начальное значение A, конечное значение В, шаг Dx, количество шагов Nx, ограничение на число итераций Nmax, вычислить функцию F(x) как сумму S бесконечного числа слагаемых, заканчивая суммирование для каждого значения x при достижении заданной точности EPS. Вывести в выводной текстовый файл исходные данные A, B, Dx, EPS и результаты расчета: значения x, F(x), S и количество слагаемых K, обеспечивающих требуемую точность. Результаты выводить в форме таблицы с рамками. Оформить отчет по лабораторной работе. Требования к программе
· Если вариант задания содержит Nmax в качестве исходных данных, внешний цикл по X будет тоже итеративным и значение Nx в этом случае не рассчитывается. Цикл можно делать как с пред- так и с постусловием, с окончанием по выполнению условия (K > Nmax) or (i > 30) { второе условие – ограничение размера таблицы }. · В варианте №3 Arcsin выразить через другие функции (см. в лаб. 1) Arcsin(x)=Arctan(x/sqrt(1-x*x)). · В варианте №15 учесть, что sin(X)/X при Х=0 равен 1. · В варианте №21 учесть, что cos(X)/X при Х=0 не существует, поэтому такое значение Х в таблице пропускать. Содержание программы
Общие пояснения Для приближенных вычислений значений некоторых функций используется метод представления этих функций в виде ряда бесконечного числа слагаемых. Если неизвестная функция разложена в ряд F(x) = C1x1 + C2x2 + C3x3 + … + Cnxn +…, то приближенно можно положить F(x) = Fn(x) = C1x1 + C2x2 + C3x3 + … + Cnxn, и поправка на отбрасывание остальных членов ряда выразится остатком Cnxn = Cn+1xn+1 + Cn+2xn+2 + … При достаточно большом n эта погрешность станет сколь угодно малой, так что Fn(x) воспроизведет F(x) с любой наперед заданной точностью. Вопрос оценки остатка Cnxn для получения требуемой точности вычисления требует особенного внимания. Если рассматриваемый ряд оказывается знакопеременным, и притом с монотонно убывающими по абсолютной величине членами, то остаток имеет знак своего первого члена и по абсолютной величине меньше его. В случае положительного ряда необходимо выполнить такую оценку при помощи методов математического анализа, кроме того, следует отметить, что далеко не всякий ряд, имеющий суммой интересующую нас функцию F(x), пригоден для фактического вычисления этой функции (даже если его члены просты и оценка остатка производится легко). Вопрос – в быстроте сходимости, т.е. в быстроте приближения частичной суммы к функции F(x). Для исследования сходимости ряда также рекомендуется применять методы математического анализа. В вариантах задания к лабораторной работе диапазоны вычислений приближенных значений и задаваемая точность оценок выбраны из вышеприведенных соображений. Разбор контрольного варианта Задание Рассчитать и построить таблицу точных и приближенных значений функции начальное значение X: A=-0.05, конечное – B=0.04, шаг X – Dx=0.01 (вводится с клавиатуры), требуемая точность EPS = 1e-6 (вводится с клавиатуры), тип циклического оператора – repeat (постусловие). Рассмотрение метода решения Расчет суммы будем проводить по рекуррентной формуле: S=S+C, т.е. новое значение суммы S есть старое значение суммы S + очередное слагаемое C. Чтобы получить рекуррентное соотношение для расчета слагаемых, поделим последующее слагаемое на предыдущее. Получим: и т.д. Отсюда можно получить для расчета очередного слагаемого по предыдущему формулу: C = - C*X*J/(J+1), в которой J каждый раз увеличивается на два. Последняя рекуррентная формула (для J ): J=J+2. Очевидно, что все эти операторы должны выполняться в цикле с заранее неизвестным числом шагов. Для начала расчета необходимо задать исходные значения для J, C и S. Вполне естественно начальными значениями C и S взять первое слагаемое, т.е. единицу, а величину J подобрать такой, чтобы на первом шаге вычислить второе слагаемое по первому, т.е. J перед входом в цикл тоже сделать равным единице. Окончание цикла осуществим, когда очередное слагаемое станет по модулю меньше EPS, но не более чем после сотого слагаемого. Последнее ограничение вводим для предотвращения возможности бесконечного цикла в случае возможных ошибок программирования. В задании для организации итеративного цикла предложено использовать оператор repeat, поэтому условие выхода запишется: ... until (abs(C) < EPS) or (K > 100); Полученные значения S, K , а также вычисленное выражение F(X) и величину аргумента X будем печатать с учетом размеров возможных значений в следующем порядке: X, F(x), S, K, разделяя их вертикальной чертой: writeln('|', X: 6: 2, '|', 1.0/Sqr(1.0+X): 10: 7, '|', S: 10: 7, '|', K: 3, '|'); Значения не подписываем, так как расчет придется повторить несколько раз и насчитанные значения образуют таблицу, которую и озаглавим один раз до начала расчета по всем значениям X, например: writeln('| X | F(x) | S | K |'); Так как в данном варианте нам даны начальное и конечное значения X и шаг его изменения, необходимо сначала вычислить, сколько будет значений X (и строк в таблице): Nx: = Trunc((B - A)/Dx) +1; {функция Trunc отбрасывает дробную часть аргумента } Добавляется единица, так как число точек всегда на один больше числа интервалов между ними. Это, кстати, следует помнить при вычислении Dx по Nx: Dx: = (B - A)/(Nx - 1); Таблица идентификаторов Таблица 21. Идентификаторы программы 31 варианта
Алгоритм Должен содержать следующие шаги: 1. Задание исходных данных в разделе констант (для A и B ); 2. Ввод исходных данных ( Dx и EPS ); 3. Определение длины внешнего (по X ) цикла; 4. Печать заголовка таблицы; 5. Внешний цикл ( for ) по X; 1) вычисление X; 2) задание начальных значений J, С и S; 3) внутренний цикл вычисления S; a) расчет С; б) расчет S; в) расчет J; г) проверка условия окончания цикла; 4) печать строки таблицы с результатами; 6. Завершение программы (печать нижней рамки таблицы, задержка). Текст программы.
program Tabl_Of_Fx; { Программа Лабораторной работы N 6 Вариант N 31. Использование рекуррентных формул в итеративных циклах. А.Я.Умненькая, ст. гр. Я-007 } CONST {при описании переменным зададим исходные значения } A: real = -0.05; B: real = 0.04; VAR X, Dx, S, C, EPS: real; Nx, J, K, i: integer; {I – для счетчика цикла по X } fout: text; { для выходного файла } LABEL Vvod_Dx, Vvod_EPS; BEGIN assign(fout, 'Umnik6.res'); rewrite(fout); { Ввод исходных данных (Dx и EPS) } Vvod_Dx: writeln ('Для X на отрезке[-0.05, 0.04]введите шаг счета'); readln(Dx); if (Dx < 0.002) or (Dx > 0.04) then begin writeln('Недопустимое значение! '); goto Vvod_Dx; end; Vvod_EPS: writeln('введите минимальный размер слагаемого); readln(EPS); if (EPS < 1e-9) or (EPS > 1e-2) then begin writeln('Недопустимое значение! '); goto Vvod_EPS; end; { Определение длины внешнего (по X) цикла } Nx: = Trunc((B-A)/Dx) + 1; { печать исходных данных } writeln(fout, ' Исходные данные'); writeln(fout, ' Интервал X: [', A: 5: 2, B: 5: 2, ']); writeln(fout, Шаг X: ', Dx: 5: 3, ', шагов: ', Nx: 3, ', точность: ', EPS: 1); { Печать заголовка таблицы } writeln(fout, ' Результаты расчетов': 30); writeln(fout, '| X | F(x) | S ', ' |Слагаемых|'); writeln(fout, '|-------|-----------|-----------|', '---------|'); { Внешний цикл (for) по X } for i: =1 to Nx do begin { вычисление X } X: = A + Dx*(i-1); if X > B then X: = B; { уточнение на конце интервала} { задание начальных значений J, C, S и числа слагаемых K} J: = 1; C: = 1; S: = C; K: = 1; Repeat { внутренний цикл вычисления S } C: = -C * X*J/(J+1); S: = S + C; K: = K + 1; J: = J + 2; until (abs(C) < EPS) or (K > 100); { печать строки таблицы с результатами } write(fout, '| ', X: 5: 2, ' |', 1.0/Sqr(1.0+X): 10: 7, ' |'); writeln(fout, S: 10: 7, ' |', K: 6, ' |'); end; { Завершение программы (печать нижней рамки таблицы, закрытие файлов, задержка) } writeln(fout, '|---------------------------------', '--------|'); close(fout); readln; END. Результаты расчета Файл UMNIK6.RES будет в этом случае содержать: Исходные данные Интервал X: [-0.05 0.04], Шаг X: 0.010, шагов: 9, точность: 1.0E-0006 Результаты расчетов | X | F(x) | S |Слагаемых| |-------|-----------|-----------|---------| | -0.05 | 1.1080332 | 1.0259783 | 6 | | -0.04 | 1.0850694 | 1.0206207 | 5 | | -0.03 | 1.0628122 | 1.0153462 | 5 | | -0.02 | 1.0412328 | 1.0101525 | 5 | | -0.01 | 1.0203041 | 1.0050378 | 4 | | 0.00 | 1.0000000 | 1.0000000 | 2 | | 0.01 | 0.9802960 | 0.9950372 | 4 | | 0.02 | 0.9611688 | 0.9901475 | 5 | | 0.03 | 0.9425959 | 0.9853293 | 5 | |-----------------------------------------| Варианты заданий Таблица 22. Варианты заданий лабораторной работы N6
Таблица 23. Виды представления функций Популярное:
|
Последнее изменение этой страницы: 2016-05-30; Просмотров: 1114; Нарушение авторского права страницы