Смекни!
smekni.com

Преломление света на границе раздела двух сред (стр. 4 из 4)

Str(n1: 6: 4, tempstr);

OutTextXY(3, round(2*my/3), concat('n1= ', tempstr));

Str(alpha1: 2: 0, tempstr);

OutTextXY(3, round(2*my/3+20), concat('alpha1= ', tempstr));

{выводим рамку}

SetColor(Yellow);

SetLineStyle(SolidLn, 0, NormWidth);

Line(0, round(my/3), mx, round(my/3));

Line(0, my, mx, my);

Line(0, round(my/3), 0, my);

Line(mx, round(my/3), mx, my);

{выводим границу между средами и нормаль}

SetColor(LightGray);

SetLineStyle(DottedLn, 0, NormWidth);

Line(round(mx/2), round(my/3), round(mx/2), my);

Line(0, round(2*my/3), mx, round(2*my/3));

{выводим стрелочки}

SetLineStyle(SolidLn, 0, NormWidth);

Line(round(mx/2) - 3, round(my/3) +10, round(mx/2), round(my/3));

Line(round(mx/2) +3, round(my/3) +10, round(mx/2), round(my/3));

{выводим падающий луч}

SetColor(Blue);

SetLineStyle(SolidLn, 0, NormWidth);

Line(round(mx/2), round(2*my/3), round(mx/2+delta), round(my/3));

{выводим преломленный луч}

SetColor(Red);

SetLineStyle(SolidLn, 0, NormWidth);

Line(round(mx/2), round(2*my/3), round(mx/2-delta1), round(my));

end;

procedure OutTextChangeAl; {выводит вспомогательный текст при смене значения угла}

begin

SetColor(White);

SetTextStyle(8, 0, 1);

OutTextXY(0,0, 'Значение угла падения меняется клавишами ');

OutTextXY(0, 20, '"вверх" и "вниз"');

OutTextXY(0,40, 'подтверждение - ENTER');

OutTextXY(0,60, 'отмена - ESC');

end;

function ChangeAl(n: real; n1: real; alpha: real): real;

var

ch: char;

alpha0: real;

begin

{запоминаем начальное значение угла на случай отмены}

alpha0: =alpha;

while (true) do

begin

ClearViewPort;

Paint(n,n1,alpha);

OutTextChangeAl;

ch: = readkey;

if (ch = #72) then alpha: =alpha-1;

if (ch = #80) then alpha: =alpha+1;

if (alpha = 90) then alpha: = 89;

if (alpha = - 1) then alpha: = 0;

if (ch = #13) then

begin

SaveData(n,n1,alpha); {сохраняем данные}

ChangeAl: = alpha;

break;

end;

if (ch = #27) then

begin

ChangeAl: = alpha0;

break;

end;

end;

end;

function ChangeN(flag: integer): real;

var

tempstr: string;

ch: char;

n: real;

code: integer;

begin

{переход в текстовый режим}

CloseGraph;

{принимаются только символы 1-9}

while ((ch<'1') or (ch>'9')) do

begin

ClrScr;

str(flag, tempstr);

writeln(concat('Выберите ',tempstr,'-ую среду: '));

writeln('1. Вода');

writeln('2. Глицерин');

writeln('3. Алмаз');

writeln('4. Воздух');

writeln('5. Полиэтилен');

writeln('6. Сапфир');

writeln('7. Хлористый натрий');

writeln('8. Сероуглерод');

writeln('9. Другая среда');

ch: =readkey;

end;

if (ch = '1') then ChangeN: =1.33;

if (ch = '2') then ChangeN: =1.47;

if (ch = '3') then ChangeN: =2.42;

if (ch = '4') then ChangeN: =1.0003;

if (ch = '5') then ChangeN: =1.52;

if (ch = '6') then ChangeN: =1.77;

if (ch = '7') then ChangeN: =1.53;

if (ch = '8') then ChangeN: =1.63;

if (ch = '9') then

begin

repeat

ClrScr;

write('Введите показатель преломления среды: ');

readln(tempstr);

val(tempstr, n, code);

until ((code = 0) and (n<=9) and (n>0));

ChangeN: =n;

end;

GraphMode;

end;

procedure LoadData(var n: real; var n1: real; var alpha: real); {загрузка данных из файла}

var

f: text;

begin

{открываем файл для чтения}

assign (f, 'data. txt');

reset (f);

{считываем по порядку значения n,n1,alpha}

readln(f, n);

readln(f, n1);

readln(f, alpha);

close (f);

SaveData(n,n1,alpha); {сохраняем данные}

end;

procedure Info;

var

f: Text;

n, i: Integer;

s, temp: String;

ch: Char;

priznak: Boolean;

const

st_length = 55;

ch_size = 20;

begin

n: = 0;

priznak: = false;

Assign(f, 'info. txt');

ClearViewPort;

SetTextStyle (1, 0, 1);

Reset (f);

while not Eof(f) do

begin

n: = n + 1;

if not priznak then ReadLn (f, s);

if Length(s) > st_length then

begin

priznak: = true;

temp: = s;

Delete (temp, st_length+1, Length(temp));

OutTextXY(0, ch_size * n, temp);

Delete (s, 1, st_length);

end

else

begin

priznak: = false;

OutTextXY (0, ch_size * n, s);

end;

if (n = 22) or Eof(f) then

begin

OutTextXY (200, 460, 'Нажмите любую клавишу... ');

repeat until keypressed;

ch: = readkey;

n: = 0;

ClearViewPort;

end;

end;

end;

procedure MainCycle; {основной цикл программы}

var

action: Integer;

n,n1,alpha,sinalpha1: real;

begin

{установка начальных значений}

n: =1.0003; {показатель воздуха}

n1: =1.33; {показатель воды}

alpha: =60; {начальное значение угла падения}

SaveData(n,n1,alpha);

action: =1; {курсор установлен на первом пункте меню}

GraphMode; {гр режим. }

ClearViewPort; {очищаем экран}

Recv; {выводим реквизиты пользователя}

SetTextStyle(1, 0, 1);

while (action<>6) do {6=выход}

begin

ClearViewPort; {очищаем экран}

Paint(n,n1,alpha); {выводим график}

action: =Menu(action); {считываем пункт меню}

if (action=1) then Info; {информация}

if (action=2) then LoadData(n,n1,alpha); {считываем из файла}

if (action=3) then

begin

n: = ChangeN(1); {изменяем показатель преломления 1}

SaveData(n,n1,alpha);

end;

if (action=4) then

begin

n1: = ChangeN(2); {изменяем показатель преломления 2}

SaveData(n,n1,alpha);

end;

if (action=5) then alpha: = ChangeAl(n,n1,alpha); {изменяем угол падения}

end;

CloseGraph; {закрываем графический режим}

end;

begin

MainCycle;

end.

ИСПОЛЬЗУЕМАЯ ЛИТЕРАТУРА

1. Фаронов В.В. "Турбо Паскаль 7.0. Начальный курс. " Учебное издание - М.: Нолидж, 2000, 575 с.

2. Н. Культин "TurboPascal в задачах и примерах" - С.: БХВ-Петербург, 2004,256 с.

3. Ахманов С. Г "Физическая оптика. Учебник (Ахманов)" - С.: МГУ, 2004, 213 с.

4. Федоров А. "Особенности программирования на BorlandPascal" - Киев: Диалектика, 1994, 144 с.