Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

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



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

Вызов функции осуществляется по ее имени с указанием в круглых скобках списка аргументов, которого может и не быть. При этом аргументы должны попарно соответствовать параметрам, указанным в заголовке функции, и иметь те же типы. В отличие от процедуры, имя функции может входить как операнд в выражения. Например, T:=Factor(n)/(n-k); где Factor(n) вызов функции для вычисления факториала. Функция Factor(n) должна быть описана примерно таким заголовком:

Function Factor(i:Integer):Int64;

Задача

Текст модуля

unit Unit1;

………………….

var

Form1: TForm1;

implementation

{$R *.dfm}

{процедура выделяет из угла в градусах целые градусы, целые минуты и секунды}

procedure GMS(Ugol:real;var G,M:Integer; S:Real);

begin

G:=Trunc(Ugol+0.1);

M:=Trunc((Ugol-G)*60);

S:=((Ugol-G)*60-M)*60;

end;

procedure TForm1.Button1Click(Sender: TObject);

Var a,b,c: Real;

p: Real;

G,M: Integer;

S: Real;

Tan_Pol_Ugla, Ugol_b_Rad,Ugol_b_Grad:Real;

begin

a:=StrToFloat(Edit1.Text);

b:=StrToFloat(Edit2.Text);

c:=StrToFloat(Edit3.Text);

p:=(a+b+c)/2;

If (a+b>c) and (a+c>b) and (b+c>a) Then begin

Tan_Pol_Ugla:=Sqrt((p-a)*(p-b)/(p*(p-c)));

Ugol_b_Rad:=Arctan(Tan_Pol_Ugla)*2;

Ugol_b_Grad:=Ugol_b_Rad/pi*180;

GMS(Ugol_b_Grad,G,M,S);

Label5.Caption:='Угол, противолежащий стороне c, равен'+#13+IntToStr(G)+'гр. '

+IntToStr(M)+'мин. '+FloatToStrF(S,ffFixed,3,1)+'сек.'

end

Else Label5.Caption:='ТРЕУГОЛЬНИК НЕ СУЩЕСТВУЕТ';

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

Edit1.Text:=' ';

Edit2.Text:=' ';

Edit3.Text:=' ';

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

Form1.Close

end;

end.

Возможный результат решения:

Задача

Текст модуля

unit factor_;

……………………………

var

Form1: TForm1;

implementation

{$R *.DFM}

// рекурсивная функция

function factorial(n: integer): integer;

begin

if n > 1

then factorial:= n * factorial(n-1) // функция вызывает сама себя

else factorial:= 1; // факториал 1 равен 1

end;

procedure TForm1.Button1Click(Sender: TObject);

var

k:integer; // число, факториал которого надо вычислить

f:integer; // значение факториала числа k

begin

k:= StrToInt(Edit1.Text);

f:= factorial(k);

label2.caption:='Факториал числа '+Edit1.Text

+' равен '+IntToStr(f);

end;

end.

Возможный результат решения:

Задача

Составить программу для вычисления значений выражений P=(x1+y1)/2 и Q=(x2+y2)/2, где x1 и x2 — корни квадратного уравнения с коэффициентами A, B, C, а y1 и y2 — корни квадратного уравнения с коэффициентами D, F, G. Если хотя бы одно из уравнений не имеет действительных корней выдать на экран сообщение об этом и прекратить выполнение программы.

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

Компоненты

Имя компонента Свойства компонента Значение Назначение
Form1 Caption Выражение Заголовок формы
Label1 Caption     WordWrap Программа вычисляет значение выражений: P=(X1+Y1)/2 и Q=(X2+Y2)/2, где X1 и X2 – корни квадратного уравнения с коэффициентами A, B, C, а Y1, Y2 – корни квадратного уравнения с коэффициентами D, F, G True Справочная информация для пользователя программы   Перенос не уместившихся слов на новую строку
Label2 Caption   WordWrap Если хотя бы одно из уравнений не имеет действительных корней, то об этом выдается сообщение и выполнение программы прекращается   True Подсказка пользователю     Перенос не уместившихся слов на новую строку
Label3 Caption Уравнение 1 Подсказка пользователю
Label4 Caption Уравнение 2 Подсказка пользователю
Label5 Caption A= Подсказка пользователю
Label6 Caption B= Подсказка пользователю
Label7 Caption C= Подсказка пользователю
Label8 Caption D= Подсказка пользователю
Label9 Caption F= Подсказка пользователю
Label10 Caption G= Подсказка пользователю
Label11 Caption   Поле для вывода результата
Label12 Caption Для ввода чисел нажимайте клавишу ENTER Подсказка пользователю
Edit1 Text ….. Поле для ввода коэффициента A
Edit2 Text ….. Поле для ввода коэффициента B
Edit3 Text ….. Поле для ввода коэффициента C
Edit4 Text ….. Поле для ввода коэффициента D
Edit5 Text ….. Поле для ввода коэффициента F
Edit6 Text ….. Поле для ввода коэффициента G
Button1 Caption ВЫЧИСЛИТЬ Кнопка для вычисления
Button2 Caption ВЫХОД Кнопка закрытия формы и выхода из программы

Переменные

Обозначение в программе Содержание Тип
A Коэффициент первого квадратного уравнения Вещественный
B Коэффициент первого квадратного уравнения Вещественный
C Коэффициент первого квадратного уравнения Вещественный
D Коэффициент второго квадратного уравнения Вещественный
F Коэффициент второго квадратного уравнения Вещественный
G Коэффициент второго квадратного уравнения Вещественный
S Строка символов, передаваемая из поля ввода Строковый
i Номер по порядку символа в строке символов Локальная переменная. Целый
Z Счетчик запятых Локальная переменная. Целый
DT Дискриминант Локальная переменная. Вещественный
R Признак решения уравнения Локальная переменная. Логический
R1 Признак решения уравнения 1 Логический
R2 Признак решения уравнения 2 Логический
Key Ключ — какая клавиша нажата Слово, целый беззнаковый
X1 1 корень уравнения 1 Вещественный
X2 2 корень уравнения 1 Вещественный
Y1 1 корень уравнения 2 Вещественный
Y2 2 корень уравнения 2 Вещественный
P P=(X1+Y1)/2 Вещественный
Q Q=(X2+Y2)/2 Вещественный

Проект формы

Текст модуля

unit Unit1;

………..

var

Form1: TForm1;

A,B,C:Real;// коэффициенты первого квадратного уравнения

D,F,G:Real;// коэффициенты второго квадратного уравнения

implementation

{$R *.dfm}

{Функция проверяет, является ли введенное значение числом. Допустимыми значениями в числе являются цифры от 0 до 9, минус в качестве первого символа, одна десятичная запятая. Функция принимает значение Истина, если в строке встретился запрещенный символ.}

function CheckEdit(s:string):boolean;

// s строка символов, передаваемая из поля ввода

Var i:integer;// номер по порядку символа в строке символов

Z:integer;// счетчик запятых

begin

CheckEdit:=False;// значению функции присваивается ЛОЖЬ

Z:=0;// обнуление счетчика десятичных запятых

// цикл выполняется столько раз, сколько символов

// во введенной строке

for i:=1 to Length(S) do

Begin

// если в строке встречается запятая, счетчик увеличивается на 1

if s[i]=',' Then Z:=Z+1;

// если символ не относится к числу допустимых, значение

// функции принимает значение ИСТИНА

if not(s[i] in ['0'..'9','-',','])Then CheckEdit:=True

//иначе, если не первый символ равен минусу или счетчик

// запятых больше или равен 2,

// значение функции принимает значение ИСТИНА

else if ((i<>1) and (S[i]='-')) or (Z>=2) Then CheckEdit:=True

end;

end;

// процедура вычисления корней квадратного уравнения

procedure Root(A,B,C:Real;Var R:Boolean;Var X1,X2:Real);

Var DT:Real;//дискриминант

begin

// признак действительных решений у уравнения

// принимает значение ИСТИНА

R:=True;

DT:=sqr(B)-4*A*C;

if DT>0 Then begin

X1:=(-B-sqrt(DT))/(2*A);

X2:=(-B+sqrt(DT))/(2*A);

end

else

// признак действительных решений у уравнения

// принимает значение ЛОЖЬ

R:=False;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

Form1.Close

end;

// процедура обработки события — переход вниз из поля ввода

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

begin

// если была нажата клавиша «ENTER», то если значение вызванной

// функции проверки допустимости символов в строке, которой
// в качестве фактического параметра передается содержимое поля

//ввода, равно истине (символ недопустим), то поле ввода

// очищается и фокус остается в нем

if Key=VK_RETURN

then if CheckEdit(Edit1.Text) Then begin

Edit1.Clear;

Edit1.SetFocus

end

// иначе фокус переносится в следующее поле ввода

Else

Edit2.SetFocus;

end;

// процедура аналогична процедуре

// procedure TForm1.Edit1KeyDown

procedure TForm1.Edit2KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

begin

if Key=VK_RETURN

then if CheckEdit(Edit2.Text) Then begin

Edit2.Clear;

Edit2.SetFocus

end

Else

Edit3.SetFocus;

end;

// процедура аналогична procedure TForm1.Edit1KeyDown

procedure TForm1.Edit3KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

begin

If Key=VK_RETURN

then if CheckEdit(Edit3.Text) Then begin

Edit3.Clear;

Edit3.SetFocus

end

Else

Edit4.SetFocus;

end;

// процедура аналогична procedure TForm1.Edit1KeyDown

procedure TForm1.Edit4KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

begin

If Key=VK_RETURN

then if CheckEdit(Edit4.Text) Then begin

Edit4.Clear;

Edit4.SetFocus

end

Else

Edit5.SetFocus;

end;

// процедура аналогична procedure TForm1.Edit1KeyDown

procedure TForm1.Edit5KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

begin

If Key=VK_RETURN

then if CheckEdit(Edit5.Text) Then begin

Edit5.Clear;

Edit5.SetFocus

end

Else

Edit6.SetFocus;

end;

// процедура аналогична procedure TForm1.Edit1KeyDown

procedure TForm1.Edit6KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

begin

If Key=VK_RETURN

then if CheckEdit(Edit6.Text) Then begin

Edit6.Clear;

Edit6.SetFocus

end

Else

Button1.SetFocus;

end;

// процедура связанная с кнопкой вычислить

procedure TForm1.Button1Click(Sender: TObject);

Var R1,R2:Boolean;{признаки решения первого и второго квадратных уравнений }

P,Q:Real;// значения вычисляемых выражений

X1,X2:Real;// корни первого уравнения

Y1,Y2: Real;// корни второго уравнения

begin

// инициализация переменных

X1:=0;X2:=0;

Y1:=0;Y2:=0;

// ввод из полей ввода коэффициентов уравнений

A:=StrToFloat(Edit1.Text);

B:=StrToFloat(Edit2.Text);

C:=StrToFloat(Edit3.Text);

D:=StrToFloat(Edit4.Text);

F:=StrToFloat(Edit5.Text);

G:=StrToFloat(Edit6.Text);

// вызов процедуры вычисления корней квадратного уравнения

// (для двух уравнений), если уравнение не имеет

// действительных корней, признак решения

// принимает значение ложь

Root(A,B,C,R1,X1,X2);

Root(D,F,G,R2,Y1,Y2);

if not(R1) Then begin

ShowMessage('Уравнение 1 действительных корней не имеет');

Exit // прекращение выполнения программы

end

else

if not(R2) Then begin

ShowMessage('Уравнение 2 действительных корней не имеет ');

Exit

end

// если оба уравнения имеют действительные решения,

// то вычисляются значения P и Q, их значения выводятся

// на форму в поля вывода

else

begin

P:=(X1+Y1)/2;

Q:=(X2+Y2)/2;

Label11.Caption:='P= '+FloatToStrF(P,Fffixed,10,2)+

' Q= '+FloatToStrF(Q,Fffixed,10,2);

end;

end;

end.

Результаты работы программы





Дата публикования: 2014-11-02; Прочитано: 276 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.027 с)...