Android-приложение для поиска дешевых авиабилетов: play.google.com
Главная -> Справочник по алгоритмам

0 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

/оп для ПЭВМ

Операция

Электроника-ДЗ-28

FX-702P

Обратные гиперболи-

ческие функции

Функции int {X), abs (д:)

0,025

0,04

Функция у

0,08

0,33

Безусловный переход

0,01

0,03

Условный переход

0,04

0,06

Обращение к подпро-

грамме и выход из нее

0,02

0,04

Один цикл (/ц)

0,012

0,02

В данном случае арифметические операции сложения, вычитания, умножения и деления выполняются почти за одинаковое время. Это не общее правило. У многих ПЭВМ операция деления производится медленнее, чем операция умножения, а последняя, в свою очередь, выполняется медленнее, чем операции сложения и вычитания. Самой медленной обычно является операция возведения в степень {у).

Сложность подсчета числа операций, особенно если число циклов в программе не фиксировано, а задается погрешностью вычислений, делает целесообразным определение общего времени выполнения вычислений по данным решения типового контрольного примера. Исключения возможны, если время выполнения всей программы менее 5-10 с.

Оптимизация программ проводится с целью сокращения времени их исполнения и объема памяти ПЭВМ, придания программам компактности и алгоритмической ясности. Поскольку эти качества часто взаимо-противоречивы, то процесс оптимизации носит субъективный характер.

Для большинства пользователей ПЭВМ вполне справедливо правило - составляйте программу так, как это вам нравится и как это вам удобно. Это правило справедливо, если вычисления по программе носят единичный или эпизодический характер. В этом случае большие затраты времени на тщательную оптимизацию программы нерациональны. Тем более, что нередко программу, составленную за десяток минут, можно оптимизировать многие дни, хотя конечный результат остается тем же. Большинство начинающих пользователей, как правило, размещают в каждой строке один оператор. Выше отмечались недостатки таких программ: чрезмерная длина листинга программы, неэкономное использование ОЗУ, трудность обозрения сразу всей программы, большой расход бумаги при распечатке программ принтером. Поэтому лучше сразу привыкнуть к размещению в строке нескольких простых операторов, если к иному не обязывает алгоритм вычислений. Программы, рассчитанные на многократное использование, желательно тщательно оптимизировать.

Несмотря на субъективный характер подготовки программ, есть ряд приемов, которые следует использовать при составлении и оптимизации программ. Прежде всего необходимо особо внимательно отнестись к выбору алгоритма. Порой затрата на это в 10-20 мин в дальнейшем сокращает время массовых вычислений на многие часы, сутки и даже месяцы. Например, переход от обычного спектрального анализа к процедуре быстрого преобразования Фурье (БПФ) часто ведет к уменьшению времени счета в десятки и даже сотни раз.

В программах надо учитывать реальное время выполнения операций (см. выше). Например, если ПЭВМ выполняет деление медленнее, чем умножение, то операцию вида В=А/2 лучше записать как В = .5*А. Возведение в малую целую степень у" (при х = 2,3,...) !учше заменить умножением, например Y-.2 (или У2) следует заменить операцией Y*Y. При табуляции функций иногда полезно использовать не полностью завершенные циклы следующей конструкции:

FOR 1=А ТО 1Е99 STEP H:...:NEXT I

Цикл практически не завершается, так как конечное значение управляющей переменной I задано очень большим (10®). Такой цикл аналогичен цепочке операторов

HCI LET 1=А

нем LET I = I + H HCN GOTO HCI

HO выполняется существенно быстрее (выигрыш во времени до 3-5 раз при пустом цикле, т. е. учете затрат времени только на выполнение операторов в строках НСМ и HCN). Выход из цикла, если он нужен, задается рабочими операторами, записанными вместо многоточия.

Арифметические выражения в программах целесообразно приводить к виду, позволяющему уменьшить число операций. Например, вычисление значения c=a-2ab-\-b при обычной записи c=a-a-\-2-a-b - b-b требует четырех операций умножения и по одной операции сложения и вычитания. Представив с = а - b и с = С4-с, т. е. учитывая соотношение (а* - 2аЬ-\-b) = {a - Ь), . получим тот же результат всего при одной операции вычитания и одной умножения. Аналогичным образом вычисление г/=е/елучше выполнить в виде у = е°~, что уменьшит число обращений к микропрограммам вычисления функций. В простых программах такие преобразования опускаются, если они идут в ущерб наглядности программы или приводят к отказу от общепринятой формы записи вычисляемого арифметического выражения. Эффективным приемом упрощения вычислительных операций и придания им более общего вида является нормирование арифметических выражений.

Следует по возможности убирать повторяющиеся фрагменты вычислений и сосредоточивать их в одном месте. Особое внимание необходимо уделять «чистке циклов», т. е.



выносу за пределы циклов всех повторяющихся фрагментов вычислений. Например, выражение

30 100 . .

<=1 /=1

требует вычисления In а, и е 3000 раз. Между тем, представив это выражение в виде

30 100

можно сразу сократить число вычислений In а, до 30. Если позволяет память ЭВМ, можно отдельно сформировать массив экспонент E(J)-e и сократить до 100 число вычислений е. Однако при этом будет иметь место обращение к массиву £(/) 3000 раз. Тем не менее последний вариант по затратам машинного времени будет лучшим.

При использовании переменных из массивов нередко повторяются их индексы. Например, при каждом использовании выражения

A(J.K+1)=(J.K+1)+R

к переменной A(J*K-fl) прибавляется значение R. Однако индекс (J*K+l) вычисляется при этом дважды - в левой и в правой частях равенства. Замена этого выражения фрагментом программы

I=J.K-M:A(i)=A(I)-f R

ведет к экономии памяти (выражение стало короче) и сокращению времени счета (индекс I=J*K--.l вычисляется один раз). Эта эко номия будет еще существеннее, если переменные A(J*K+1) используются в программе более двух раз, например в циклических фрагментах.

Часто полезно заменять индексированную переменную простой переменной. Например, вычисление арифметического выражения

Y=A(I.K-fl).A(I.K+l)+X

можно выполнить в виде

Z=A(I.K-fl): Y=Z.Z + X

Сокращение времени вычислений в этом случае связано и с тем, что ЭВМ опознает простую переменную быстрее, чем индексированную.

Иногда, в какой-то мере копируя подход, принятый при составлении программ на языке фортран, программы составляются по блочному принципу: делается основная программа, в которой обеспечивается обращение к вспомогательным подпрограммам. Если последние снабжены комментариями, в целом программа оказывается очень наглядной. Однако в общем случае не следует злоупотреблять обращениями к подпрограммам, так как на них затрачиввется дополнительное время (особенно, когда обращения идут из циклов).

Необходимо также отметить, что использование особых «программных трюков» в настоящее время считается недостатком, а не достоинством Программ. Сокращение времени вычислений не является самоцелью. В правильно составленных программах принимаются меры по устранению неоправданных потерь машинного времени. Поэтому рекомендации по составлению программ не следует абсолютизировать.

В некоторых версиях языка бейсик имеются специальные операторы для включения в программы фрагментов, выполняемых на других языках, например на машинно-ориентированном языке конкретной ПЭВМ. Последнее позволяет уменьшить время выполнения программ (иногда в десятки раз), сохранить присущий бейсику диалог ПЭВМ с пользователем и заметно расширить круг решаемых на данной ПЭВМ задач [29]. Однако этот прием носит частный характер, при его применении теряется наглядность самих программ, усложняется их отладка и исключается применение программ для ПЭВМ с другим машинно-ориентированным языком.

§2.5. Специальные вопросы программирования на языке бейсик

Описанные в § 2.4 приемы программирования направлены на решение простых вычислительных задач. Рассмотрим некоторые специальные вопросы программирования, выявляющие более полно возможности языка бейсик.

Организация диалога с пользователем. Простейший диалог с пользователем заложен в самой программе-интерпретаторе. Так, у большинства ПЭВМ загрузка этой программы (с ПЗУ или магнитной ленты) сопровождается начальным диалогом: подтверждается загрузка интерпретатора, у пользователя запрашивается, с каким оборудованием он будет работать, будут ли использованы внешние подпрограммы и т. д. (см. Приложения 1 и 3).

Комментарии могут вводиться пользователем в составе операторов INPUT (при вводе), PRINT (при выводе результатов вычислений) и REM (внутри программы). Характер комментариев всецело задается пользователем. Он может быть очень кратким, например

10 INPUT D

(при этом индицируется лишь знак ?), или детальным:

10 INPUT ВВЕДИТЕ ЧИСЛЕННОЕ ЗНАЧЕНИЕ ДИАМЕТРА ОКРУЖНОСТИ D = D

Следует помнить, что слишком подробные комментарии удлиняют программу, увеличивают время счета, загружают память ЭВМ, затрудняют чтение программ. Такие комментарии оправданы лишь в отдельных случаях -



когда программа рассчитана на пользователя, который не понимает сути вычислений. Специалист может довольствоваться короткими комментариями, например

10 INPUT D = D (если он знает, что речь идет о площади круга, то вряд ли нужно особо указывать, что D - это диаметр окружности).

Индикация ошибок предусмотрена у боль-щинства ПЭВМ. Сложные ПЭВМ дают подробное указание об ошибке, например такое:

НЕТ ЗАКРЫВАЮЩЕЙ СКОБКИ В ОПЕРАТОРЕ LET В СТРОКЕ 150

Более простые ПЭВМ дают указания вида ОШИБКА <Номер) В СТРОКЕ <Номер)

При этом характер ошибок определяется по их номеру с помощью специальных таблиц (см. Приложения 2 и 4).

Вывод простых графиков. Многие ПЭВМ способны формировать сложные многоцветные графические изображения. Однако даже те ПЭВМ, у которых нет специальных команд построения графиков, могут создавать простые графические изображения с помощью операторов PRINT и TAB.

Рисунки с помощью оператора PRINT формируются с помощью знаков, помещенных в апострофы или кавычки. Так, из знаков - можно создавать штриховые горизонтальные прямые, из знаков ! - вертикальные линии и т. д. Ниже дана программа построения стилизованной .электрической схемы. Она строится из различных знаков, присущих ПЭВМ без графики.

Схема, сформированная в поле комментариев PRINT, будет выведена на экран дисплея или печать после исполнения оператора RUN.

Оператор TAB может использоваться для графического отображения решений; построения графиков функций, колебательных процессов и т. д. При этом функция Y(X) строится с осью Y поперек, а с осью X - вдоль направления печати. Зона печати при использовании оператора TAB разбивается на Л„акс (Лнакс - обычно 80 или 100) позиций, каждая из которых задается целой частью арифметического выражения. Так, приведенная ниже программа обеспечивает построение графика функции Y = X который строится с помощью знаков *.

В этой программе изменение аргумента X от значения -6 до +6 задаетвя адклом с началом в строке 10 и концом в строке 60. Если ХтО, осуществляется печать значений У = Х с помощью операторов PRINT TAB в строке 35 знаками *. Одновременно печатается знак I, образующий горизонтальную ось графика. При Х = 5 и Х=-5 (см. строки 40 и 50) вместо знака ! печатаются численные значения Х = 5! и Х = - 5! на оси X, т. е. осуществляется масштабирование оси X. При Х = 0 вместо печати значения Y = X = 0 в строке 25 задана печать оси У знаками - и цифрами О, 10, 20 и 30, обеспечивающими ее масштабирование. График функции Y = X, формируемый этой программой, дан на рис. 2.9.

У ПЭВМ, рассчитанных на вывод графической информации, имеются специальные" операторы для построения графиков. Так, оператор PLOT X, Y, Z обеспечивает вывод точки с координатами X и У (используются целые части значений переменных X и У). Если Z = 0, точка погашена, если Z = l, она высвечивается. С помощью оператора PLOT можно по точкам строить сложные графики, например, если У и X связаны соотношением У = Х, то будет построена линия, подобная приведенной на рис. 2.9 (однако график при

С2 =

<-!====!-i R11

R12 ! I.

01 PRINT-ПРИМЕР ПОСТРОЕНИЯ ЭЛЕКТРОННОЙ СХЕМЫ

ег PRIя

ез PRINT

04 PRINT

05 PRINT

06 PRINT

07 PRINT

03 PRINT

04 PRINT

10 PRINT

11 PRINT

12 PRINT

13 PRINT 20 END

= !-ж----! +

C4 ===

. I !

05 PRINT«lnPHMEP ПОС:ТРОЕНИЯ ГРАФИКА ФУНКЦИИ Y=X"2 10 FOR X=-6 TO 6 STEP .5 20 IF XO0 THEN 35

25 PRINT0--------le--------20-------30-V=X2

30 GOTO 60

35 PRINT !ТАВ«2>ж 40 IF X=-5 THEN PRINT!><=-5; 50 IF X=5 THEN PRINT!«:=5; 60 NEXT XsENIi



0 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



0.006
Яндекс.Метрика