28639

Процедуры и функции в Турбо Паскале

Лекция

Информатика, кибернетика и программирование

Концепция подпрограммы в Турбо Паскале. Концепция подпрограммы в Турбо Паскале. Понятие подпрограммы одно из фундаментальных понятий в программировании возникшее фактически вместе с понятием программы. Одна подпрограмма может включать в себя другие подпрограммы и т.

Русский

2013-08-20

90 KB

9 чел.

Лекции 12-14: Процедуры и функции.

1. Концепция подпрограммы в Турбо Паскале.

2. Процедуры: описания и вызовы.

3. Функции: описания и вызовы .

4. Особенности  использования параметров в процедурах и функциях.

5. Области действия имён в программах.

6. Особенности разработки программ с подпрограммами на Турбо Паскале.

1. Концепция подпрограммы в Турбо Паскале.

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

Ключевой идеей механизма подпрограмм является следующая идея: подпрограмма должна описываться один раз и иметь возможность многократных её вызовов из разных точек основной программы. В этом случае мы экономно записываем текст программы (без многократного дублирования одних и тех же фрагментов). Таким образом, в механизме подпрограмм следует различать

определение (описание) подпрограммы;

вызов подпрограммы для её выполнения.

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

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

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

Формальные параметры условно можно разделить на три вида:

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

выходные параметры, через которые подпрограмма выдает свои результаты в основную программу, и

смешанные параметры - используемые и как входные и как выходные.

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

     Замечание

Для экономной передачи данных через параметры-массивы лучше использовать формальные параметры-константы, отличающиеся от параметров-значений тем, что они не создают копий значений.

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

Формальные и фактические параметры указываются списком параметров.

В списке формальных параметров параметры описываются с указанием имени параметра и типа, причём параметры-переменные описываются с ключевым словом var, а параметры-константы - с ключевым словом const. Одна группа параметров отделяется от другой точкой с запятой. В группе параметров одного типа имена параметров отделяются запятой.

     Замечание

Поскольку описание одной подпрограммы может быть вложено в описание другой подпрограммы, следует различать вызывающую подпрограмму и вызываемую подпрограмму. Вызываемая подпрограмма вложена в вызывающую подпрограмму. Роль вызывающей подпрограммы может выполнять и основная программа.

Между списком формальных параметров и списком фактических параметров должно быть взаимно однозначное соответствие (при просмотре списка), причем тип фактического параметра должен точно совпадать с типом формального параметра.

     Замечание

В описании одной подпрограммы может содержаться вызов другой подпрограммы, а та в свою очередь может содержать вызов первой подпрограммы. Для возможности корректного описания таких подпрограмм используются опережающие описания с помощью директивы forward. Вначале записывается заголовок первой подпрограммы с директивой forward вместо тела подпрограммы. Затем дается полное описание второй подпрограммы и первой подпрограммы .

2. Процедуры: описание и вызовы процедур.

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

Синтаксическая форма описания процедуры имеет вид:

procedure  <имя процедуры> (< список формальных параметров >);

< описание локальных имен процедуры >

begin

< тело процедуры - последовательность операторов процедуры >

end;

Раздел описаний процедуры содержит описание всех локальных имён, используемых в разделе операторов процедуры. Локальными называются имена, которые объявлены в данной процедуре (эти имена теряют свои значения при выходе из процедуры). Часто локальными именами являются вспомогательные переменные, необходимые для выполнения вычислений в процедуре, ими могут быть и другие процедуры или функции.

Раздел операторов процедуры может содержать любую последовательность операторов, выполняющих необходимое действие. В этих операторах могут использоваться как формальные параметры, так и локальные имена, а также глобальные имена, т.е. имена, описанные вне данной процедуры. Глобальные имена представляют

собой еще один механизм передачи параметров между процедурой и внешней средой.  

Выполнение процедуры заканчивается либо при достижении слова end, завершающего раздел операторов, либо при выполнении оператора exit.

Вызов процедуры имеет следующую синтаксическую форму:

<имя процедуры>(<список фактических параметров>);

где фактические параметры перечисляются в списке через запятую.

Пример программы на Турбо Паскале, использующей процедуру:

       program triangle1;{Программа, вычисляющая длины сторон треугольника АВС}

       uses CRT;

       type point = array [1..2] of real; {тип- точка на плоскости}

       var A,B,C:point; {вводимые точки}

              AB,BC,AC:real; {стороны треугольника}

              ch:char;

       procedure d(X,Y:point; var r:real);{ расстояние между точками X и Y }

       begin r:= sqrt(sqr(X[1]-Y[1])+sqr(X[2]-Y[2]))  end { d};

 BEGIN TextBackground(cyan);TextColor(white);ClrScr;

             window(10,5,60,10);TextBackground(green); ClrScr;

               repeat

    writeln(' Введите координаты вершин A,B,C:');

    writeln('A[1]  A[2]    B[1]  B[2]    C[1]  C[2]  '); readln(A[1],A[2],B[1],B[2],C[1],C[2]);

    writeln(' Длины сторон треугольника АВС:');d(A,B,AB);d(B,C,BC);d(A,C,AC);

    writeln(' AB=', AB:2:2,' AC=', AC:2:2,' BC =', BC:2:2); readln(ch)

               until ch=' ';

END {triangle1}.

3. Функции: описания и вызовы функций.

В отличие от процедур, функции не являются отдельными операторами. Функции возвращают значения (результат обращения к ним) и предназначены для использования в составе выражений или в качестве выражений. Это накладывает определенный отпечаток на  синтаксическую структуру описания функций, которая имеет вид:

function < имя функции >[(<список формальных параметров>)]:<тип функции >;

< описание локальных имён >

begin

< тело функции - последовательность операторов >

end;

В заголовке описания функции обязательно указывается тип вырабатываемого функцией результата, которым может быть любой простой тип Турбо Паскаля, а также строковый тип и тип указатель.

Другое отличие описания функции состоит в необходимости присутствия в теле функции хотя бы одного оператора присваивания, левой частью которого является имя функции. Смысл этого оператора - в присваивании функции некоторого результата как итога выполнения функции. Заметим, что имя функции не должно присутствовать в правой части операторов присваивания.

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

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

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

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

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

     Замечание

Используя так называемый расширенный синтаксис, можно вызывать функцию как процедуру (т.е. как оператор). Для включения расширенного синтаксиса имеется директива компилятора {$X+}. Это находит применение при инициализации динамических объектов.

Приведем пример программы triangle2, отличающейся от triangle1 тем, что вместо процедуры d использована функция dist:

 

       program triangle2; {Программа, вычисляющая длины сторон треугольника АВС}

       uses CRT;

       type point = array [1..2] of real; {тип- точка на плоскости}

       var A,B,C:point; {вводимые точки}

             ch:char;

       function dist(X,Y:point):real;{ расстояние между точками X и Y }

       begin dist:= sqrt(sqr(X[1]-Y[1])+sqr(X[2]-Y[2]))

       end { dist};

 BEGIN TextBackground(cyan);TextColor(white);ClrScr;

             window(10,5,60,10);TextBackground(green); ClrScr;

              repeat

    writeln(' Введите координаты вершин A,B,C:');

    writeln('A[1]  A[2]    B[1]  B[2]    C[1]  C[2]  ');

    readln(A[1],A[2],B[1],B[2],C[1],C[2]);

    writeln(' Длины сторон треугольника АВС:');

    writeln(' AB=',dist(A,B):2:2,' AC=',dist(A,C):2:2,' BC =',dist(B,C):2:2);readln(ch)

              until ch=' ';

END {triangle}.

 4. Особенности использования параметров в процедурах и функциях.

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

Параметры-массивы. При использовании массивов в качестве параметров необходимо учитывать одно ограничение при описании формальных параметров: типом любого формального параметра может быть только либо стандартный тип, либо тип, который объявлен ранее в вызывающей подпрограмме. Это означает, что нельзя использовать описание типа array непосредственно в списке формальных параметров. Например:

procedure state(m:array [1..8] of byte); {Неправильное описание параметра m}

type byte_st = array [1..8] of byte;

. . . .

procedure state(m:byte_st);  {Правильное описание параметра m}

Это ограничение, конечно, справедливо и для строк. Для строк также важно, что объявленные длины формального и фактического строкового параметра-переменной должны совпадать (это ограничение, правда, можно обойти, если отключить контроль совпадения длин строк с помощью опции компилятора {$V-}).

Нетипизированные параметры-переменные. Формальный параметр-переменная может быть описан без указания типа. Такой параметр называется нетипизированным. Соответствующий ему фактический параметр может быть переменной любого типа.

Этот случай полезен, если тип данных несущественен, например, при копировании данных из одной области памяти в другую. Нетипизированные параметры можно использовать также для передачи в подпрограммы одномерных массивов переменной длины (до  64 КБайт).

Параметры - открытые массивы.  В качестве параметров подпрограмм можно использовать открытые массивы, т.е. одномерные массивы, указываемые без описания их размера (а только с указанием типа элементов). Открытые массивы позволяют передавать как параметры статические массивы любого размера.

Пример:   program  ............

type array10 = array[0..9] of integer;

var vect:array10; res0,res:real;

.........

  procedure compute(x:array of real; var r:real);

begin   { тело процедуры compute } .....    end;

BEGIN {раздел операторов основной программы}

.......................

compute( [1.0, 2.0, 4.0, 8.0, 16.0], res0);...... compute(vect, res);

................

END .

Параметры-процедуры и параметры-функции. Процедуры и функции также могут быть параметрами других процедур или функций, что часто используется, особенно в задачах вычислительной математики. В Турбо Паскале имеется весьма гибкий механизм передачи процедур и функций в качестве параметра. Он основан на введении процедурных типов.

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

type < имя процедуры-типа> = procedure ( <список формальных параметров>);

type < имя функции-типа> = function( <список формальных параметров>):<тип>;

Например: type fun =function (x:real):real;

При описании подпрограммы с процедурными параметрами такие параметры указываются формальным именем и соответствующим процедурным типом.

Пример процедуры, использующей описанный выше процедурный тип fun:

procedure print_f (n:byte; f:fun);

const count = 20;

var X:real; j:integer;

begin window(n, 1, n+20, 25);

for j:=1 to count do begin X:=j*(2*pi/count);writeln(X:5:3, f(x):5:5) end

end {print_f};

В программе, где описаны процедурные типы, могут быть объявлены переменные этих типов, которым можно присваивать имена соответствующих подпрограмм, описанных в данной программе, либо эти имена можно использовать как константы при вызове подпрограмм с процедурными параметрами. Стандартные процедуры и функции нельзя непосредственно передавать таким способом, но их можно "подменить" подпрограммами с другими именами, как показано в следующем примере программы на Турбо Паскале:

program grid_functions; { Печать таблицы значений 2-х функций }

uses CRT;

type fun =function (x:real):real;

function sint(x:real):real; {функция sin(x) }

begin sint:=sin(x)

end {sint};

function expcos(x:real); {функция (cos(x)+1)*exp(-x)}

begin expcos:= (cos(x)+1)*exp(-x)

end {expcos};

procedure print_f (n:byte; f:fun); { печать  значений функции f}

const count = 20;

var X:real; j:integer;

begin window(n, 1, n+20, 25);

for j:=1 to count do begin X:=j*(2*pi/count);writeln(X:5:3, f(x):5:5) end

end {print_f};

BEGIN { Основная программа } ClrScr;

print_f(1, sint); writeln;

print_f(30, expcos);writeln

END { grid_functions}.

5. Области действия имён в программах.

В программах, не использующих подпрограммы, имена, описанные в разделе описаний, действуют во всей программе, не вызывая каких-либо проблем. Совершенно иная ситуация имеет место, когда в программе используются подпрограммы. В подпрограммах могут использоваться свои локальные (внутренние) имена, и кроме того, она может также использовать глобальные (внешние) для неё имена из других подпрограмм или основной программы. Поскольку допустима иерархия подпрограмм в основной программе, необходимы чёткие правила действия имён в программах с подпрограммами. Рассмотрим эти правила, действующие в Турбо Паскале. Введём соответствующие определения.

Локальными именами подпрограммы называются те имена, которые описаны в этой подпрограмме (в её разделе описаний). Все остальные, используемые в подпрограмме имена, являются глобальными именами данной подпрограммы.

Правило действия локальных имён: все локальные имена доступны внутри подпрограммы и недоступны вне этой подпрограммы. Другими словами локальные имена теряют свои значения непосредственно при завершении подпрограммы. Пример: в процедуре  print_f имена count, X, j -  локальные имена.

Правило действия глобальных имён: все глобальные имена доступны внутри подпрограмм в том случае, если они отличны от локальных имён. В той же процедуре print_f глобальным именем является имя процедуры window  (из модуля CRT).

Правило коллизии имён: Если локальные и глобальные имена (и типы) совпадают, то действует локальное имя, (оно "закрывает" такое же глобальное имя внутри подпрограммы).

Правило коллизии имён введено таким образом, что локальным объектам можно давать любые имена, не заботясь об их возможном совпадении с глобальными именами. Подпрограмму можно представлять как некоторый "черный ящик с полупрозрачными стенками ": для внешнего окружения она "черный ящик", а  изнутри она прозрачна, так что "видит" всё внешнее окружение.

Формальные параметры подпрограммы локальны в этой подпрограмме, а фактические - глобальны.

Глобальные имена (не входящие в фактические параметры) в силу правила их действия могут выступать как ещё один механизм связи подпрограмм с внешним окружением (дополнительный к механизму параметров подпрограмм, который следует считать основным).

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

6. Особенности разработки программ с подпрограммами на Турбо Паскале.

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

При разработке проекта программы с подпрограммами обычно определяется и состав основных подпрограмм, предполагаемых для использования, хотя для программ с небольшим количеством подпрограмм состав подпрограмм часто определяется на этапе разработки алгоритма. В проекте программы состав основных подпрограмм может быть указан в разделе входных и выходных переменных, предназначенном также и для описания новых типов данных, используемых в этих переменных. В остальном проект программы с подпрограммами создается также, как и для программ без подпрограмм.

При разработке алгоритма на псевдокоде для программы с подпрограммами возможны две стратегии (или их сочетание).

Первая стратегия предполагает, что состав подпрограмм определяется раньше фактического использования этих подпрограмм в разделе операторов программы. Для таких подпрограмм вначале указывается их заголовок (в разделе описаний программы), возможно с необходимыми комментариями и возможно без расшифровки реализации этих подпрограмм. Затем в разделе операторов используются вызовы этих подпрограмм. Если тела подпрограмм ещё отсутствуют, то они создаются в процессе последующих уточнений.

Вторая стратегия предполагает, что вызовы подпрограмм использованы раньше, чем появилось описание подпрограмм (даже в виде заголовка). Эта стратегия естественна для случаев, когда состав подпрограмм не определён на этапе проекта программы, и подпрограммы "зарождаются" непосредственно при создании алгоритма задачи. Использование "опережающего" вызова предполагает, что после этого будет уточнен раздел описаний и в нём будет спроектировано тело подпрограммы.

Необходимо учесть также некоторые особенности проектирования подпрограмм по сравнению с обычными программами:

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

во-вторых, многие подпрограммы непосредственно не используют операторы вывода на экран. В этих случаях нет необходимости в описании экранной формы.

Таким образом, при разработке подпрограмм во многих случаях нет необходимости в оформлении проекта подпрограммы иначе, чем в это предусмотрено в самом заголовке подпрограммы.

Методика разработки алгоритма подпрограммы не отличается от разработки алгоритма программы. Приведем  пример разработки программы с  функцией:

program letters; {проект}

1.Постановка задачи:

Для вводимой строки символов определить и вывести на экран все

повторяющиеся латинские буквы (не различая большие и малые буквы).

2. Входные и выходные переменные:

str: string; {входная строка}

j:char; {текущая латинская буква}

3. Аномалии:

if <отсутствуют повтор. латинские буквы>  then  ‘Нет повторяющихся букв’

4. Экранная форма:

 begin

‘Введите строку:’

<str>

‘Повторяющиеся буквы:’

[ {<j>}]

[ Нет повторяющихся букв]

end.

       

       program letters; {0.1}

       {Нахождение повторяющихся латинских букв во вводимой строке}

       var str:string;j:char;alfa:Boolean;

       {0* function count(s:string;k:char):byte;}

       {число вхождений символа k в строку s}

       BEGIN writeln('Введите строку:');readln(str); writeln('Повторяющиеся буквы:');                   
       alfa:=true;
for j:='A' to 'Z' do if count(str,j)>1 then begin write(j,' ');alfa:=false end;

       if alfa then writeln('Нет повторяющихся букв');writeln;

       END.

       program letters;{0.2}

       {Нахождение повторяющихся латинских букв во вводимой строке}

       var str:string;j:char;alfa:Boolean;

       function count(s:string;k:char):byte;

           var c,j:byte;

           begin c:=0;for j:=1 to length(s) do

                 if upcase(s[j])=k then c:=c+1;count:=c

           end{count};

       BEGIN writeln('Введите строку:');readln(str); writeln('Повторяющиеся буквы:');
       alfa:=true;
for j:='A' to 'Z' do if count(str,j)>1 then begin write(j,' ');alfa:=false end;

       if alfa then writeln('Нет повторяющихся букв');writeln;

       END.


 

А также другие работы, которые могут Вас заинтересовать

28180. Поглощение (абсорбция) света веществом. Закон Бугера. Элементарная квантовая теория излучения и поглощения света. Спонтанные и вынужденные переходы. Коэффициенты Эйнштейна. Условие усиления света 165 KB
  Элементарная квантовая теория излучения и поглощения света. Условие усиления света Под действием электромагнитного поля световой волны проходящей через вещество возникают колебания электронов среды с чем связано уменьшение энергии излучения затрачиваемой на возбуждение колебаний электронов. Частично эта энергия восполняется в результате излучения электронами вторичных волн частично она может преобразовываться в другие виды энергии. Действительно опытным путем установлено а затем и теоретически доказано Бугéром что интенсивность...
28181. Лазеры. Принципиальная схема лазера. Основные структурные элементы лазера и их назначение. Типы лазеров. Основные характеристики лазеров 181 KB
  Каждому радиационному переходу между энергетическими уровнями и в спектре соответствует спектральная линия характеризующаяся частотой и некоторой энергетической характеристикой излучения испущенного для спектров испускания поглощенного для спектров поглощения или рассеянного для спектров рассеяния атомной системой. При этом распространение излучения в среде обязательно сопровождается уменьшением его интенсивности выполняется закон Бугера где интенсивность излучения вошедшего в вещество d толщина слоя коэффициент...
28182. Оптика движущихся сред. Эффект Доплера. Поперечный и продольный эффект Доплера 194 KB
  Он гласит: все физические законы независимы инвариантны по отношению к выбору инерциальной системы отсчёта. Это означает что уравнения выражающие законы физики имеют одинаковую форму во всех инерциальных системах отсчёта. Поэтому на основе любых физических экспериментов нельзя выбрать из множества инерциальных систем отсчёта какуюто главную абсолютную систему отсчёта обладающую какимилибо качественными отличиями от других инерциальных систем отсчёта. Она одинакова во всех направлениях в пространстве и во всех инерциальных системах...
28183. Поляризация света. Способы получения поляризованного света. Закон Малюса. Поляризационные призмы 238.5 KB
  Явление поляризации света было открыто Эразмусом Бартолинусом, датским учёным, в 1669 году. В своих опытах Бартолинус использовал кристаллы исландского шпата, имеющие форму ромбоэдра. Если на такой кристалл падает узкий пучок света, то, преломляясь
28184. Распространение света в изотропных средах. Отражение и преломление света на границе между диэлектриками. Основные законы геометрической оптики. Формулы Френеля 146 KB
  При этом падающий отражённый и преломленный лучи лежат в одной плоскости с перпендикуляром восстановленным к границе раздела сред в точке падения О. Углы соответственно углы падения отражения преломления волн. Амплитуду падающей волны разложим на составляющие Ер параллельную плоскости падения и Еs перпендикулярную плоскости падения. Для составляющих вектора Е перпендикулярных плоскости падения рисунок 3 выполняются условия в которых индексы при Е и p при Н опущены: .
28185. Линза как оптическая система. Аберрации линз 126 KB
  На рисунке 1 введены обозначения: a1 расстояние от вершины первой преломляющей поверхности до осевой точки A предмета; a´1 расстояние от вершины первой преломляющей поверхности до изображения A´ получаемого после преломления на ней; a2 расстояние от вершины второй преломляющей поверхности до точки A´; a´2 расстояние от вершины второй преломляющей поверхности до изображения A´´ построенного линзой. Для любой центрированной оптической системы выполняется условие Лагранжа Гельмгольца: ...
28186. Интерференция света. Условия возникновения стационарной интерференции света. Интерференционные схемы с делением волн по фронту (опыт Юнга, зеркало Ллойда, бизеркало Френеля, бипризма Френеля). Влияние размеров источника на интерференционную картину. Усло 159 KB
  Интерференционные схемы с делением волн по фронту опыт Юнга зеркало Ллойда бизеркало Френеля бипризма Френеля. Пусть в точках А и В рисунок 1 находятся два монохроматических источника волны от которых доходят до точки наблюдения С. Взаимное усиление или ослабление двух или большего числа волн при их наложении друг на друга при одновременном распространении в пространстве называется интерференцией волн. Интерференционная картина ИК распределение интенсивностей в области волнового поля где волны налагаются друг на друга.
28187. Интерференционные схемы с делением волн по амплитуде. Интерференция в тонких пленках. Полосы равной толщины и полосы равного наклона. Кольца Ньютона. Применение интерференции света 134 KB
  Пусть на тонкую прозрачную пластинку постоянной толщины рисунок 1 из вакуума падает волна с плоским фронтом ей соответствует пучок параллельных лучей сформированная с помощью точечного источника и линзы в фокусе которой источник находится. Так как условия распространения всех лучей падающих на пластинку в этом опыте одинаковы то для лучей и а также других пар лучей одинаковых с ними по происхождению оптическая разность хода будет одинаковой: 1 где n показатель преломления материала...
28188. Двухлучевые интерферометры. Интерферометры Рэлея, Жамена, Майкельсона, Линника. Многолучевые интерферометры (интерферометр Фабри-Перо, пластинка Люммера-Герке). Интерференционные фильтры 110 KB
  Если зеркало М1 расположено так что М´1 и М2 параллельны образуются полосы равного наклона локализованные в фокальной плоскости объектива О2 и имеющие форму концентрических колец. Если же М1 и М2 образуют воздушный клин то возникают полосы равной толщины локализованные в плоскости клина М2 М1 и представляющие собой параллельные линии. Если поверхность исследуемого образца имеет дефект в виде впадины или выступа высотой l то интерференционные полосы искривляются. Если то интерференционная полоса искривляется так что занимает...