Учебный курс Программирование на Delphi. Модуль 14: различия между версиями
(→Задание) |
|||
(не показано 17 промежуточных версий 7 участников) | |||
Строка 1: | Строка 1: | ||
− | < | + | <center>'''Использование функций'''</center> |
− | |||
− | |||
− | + | == Использование функций == | |
+ | Функция отличается от процедуры тем, что результат ее работы возвращается в виде значения этой функции и, следовательно, вызов функции может использоваться наряду с другими операндами в выражения. | ||
+ | Рекурсия - такой способ организации вычислительного процесса, при котором подпрограмма в ходе выполнения составляющих ее операторов обращается сама к себе. | ||
− | + | == Пример 1.== | |
+ | *'''Условие задачи:''' | ||
+ | Даны все действительные числа a,b,c.Вычислить | ||
+ | max(a,b,+c)+max(a+b,c)/1+max(a+bc,12) | ||
+ | *'''Использованные компоненты:''' | ||
+ | |||
+ | Label1 - используется для текстовых комментариев; | ||
+ | |||
+ | Label2 - используется для вывода суммы; | ||
− | + | edit1 - используется для ввода числа; | |
− | uses | + | edit2 - используется для ввода числа; |
+ | |||
+ | edit3 - используется для ввода числа; | ||
+ | |||
+ | BitBtn1 - запуск программы; | ||
+ | |||
+ | BitBtn2 - выход из программы; | ||
+ | |||
+ | *'''Программный код:''' | ||
+ | |||
+ | unit Unit2; | ||
+ | interface | ||
+ | uses | ||
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, | Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, | ||
Dialogs, StdCtrls, ExtCtrls, Grids, XPMan, Buttons; | Dialogs, StdCtrls, ExtCtrls, Grids, XPMan, Buttons; | ||
− | + | type | |
− | type | ||
TForm1 = class(TForm) | TForm1 = class(TForm) | ||
Edit1: TEdit; | Edit1: TEdit; | ||
Строка 26: | Строка 45: | ||
BitBtn1: TBitBtn; | BitBtn1: TBitBtn; | ||
BitBtn2: TBitBtn; | BitBtn2: TBitBtn; | ||
− | |||
procedure BitBtn2Click(Sender: TObject); | procedure BitBtn2Click(Sender: TObject); | ||
procedure BitBtn1Click(Sender: TObject); | procedure BitBtn1Click(Sender: TObject); | ||
Строка 34: | Строка 52: | ||
{ Public declarations } | { Public declarations } | ||
end; | end; | ||
− | + | var | |
− | var | ||
Form1: TForm1; | Form1: TForm1; | ||
− | + | implementation | |
− | implementation | + | {$R *.dfm} |
− | + | function max (x,y: real): real; | |
− | {$R *.dfm} | ||
− | function max (x,y: real): real; | ||
begin | begin | ||
if x > y | if x > y | ||
Строка 47: | Строка 62: | ||
else max:=y | else max:=y | ||
end; | end; | ||
− | + | var z, a, b, c: real; | |
− | + | procedure TForm1.BitBtn2Click(Sender: TObject); | |
− | + | begin | |
− | var z, a, b, c: real; | ||
− | procedure TForm1.BitBtn2Click(Sender: TObject); | ||
− | |||
− | |||
− | |||
− | |||
a:=strtoint(edit1.Text); | a:=strtoint(edit1.Text); | ||
b:=strtoint(edit2.text); | b:=strtoint(edit2.text); | ||
Строка 61: | Строка 70: | ||
z:=(max(a, b+c) + max(a+b, c*c))/(1+ max(a+b*c, 12)); | z:=(max(a, b+c) + max(a+b, c*c))/(1+ max(a+b*c, 12)); | ||
Label4.Caption:=floattostr(z); | Label4.Caption:=floattostr(z); | ||
− | end; | + | end; |
− | end; | + | procedure TForm1.BitBtn1Click(Sender: TObject); |
+ | begin | ||
+ | close; | ||
+ | end; | ||
+ | end. | ||
− | + | *'''Форма с результатом работы программы:''' | |
− | + | [[Изображение:-12-1.JPG]] | |
− | + | == Пример 2.== | |
− | + | *'''Условие задачи:''' | |
+ | Найти N число последовательности Фибоначчи. Использовать рекурсивную функцию. | ||
+ | Числа Фибоначчи образуют последовательность, у которой каждый очередной член равен сумме двух предыдущих: 0 1 1 2 3 5 8 13 . . . Обозначив N-й член ряда Фибоначчи F(N), можно записать следующую рекурсивную зависимость: F(N) = F(N - 1) + F(N - 2), n >= 3, F(1) = 1 и F(2) = 1 | ||
− | + | *'''Использованные компоненты:''' | |
− | |||
− | + | Label1 - используется для текстовых комментариев; | |
− | + | Label2 - используется для текстовых комментариев; | |
− | + | edit1 - используется для ввода числа; | |
− | + | BitBtn1 - запуск программы; | |
− | |||
− | |||
− | |||
− | + | BitBtn2 - выход из программы; | |
+ | *'''Программный код:''' | ||
+ | unit Unit1; | ||
+ | interface | ||
+ | uses | ||
+ | Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, | ||
+ | Dialogs, XPMan, StdCtrls, Buttons; | ||
+ | type | ||
+ | TForm1 = class(TForm) | ||
+ | Edit1: TEdit; | ||
+ | Label1: TLabel; | ||
+ | Label2: TLabel; | ||
+ | XPManifest1: TXPManifest; | ||
+ | Label3: TLabel; | ||
+ | BitBtn1: TBitBtn; | ||
+ | BitBtn2: TBitBtn; | ||
+ | procedure BitBtn1Click(Sender: TObject); | ||
+ | procedure BitBtn2Click(Sender: TObject); | ||
+ | private | ||
+ | { Private declarations } | ||
+ | public | ||
+ | { Public declarations } | ||
+ | end; | ||
+ | var | ||
+ | Form1: TForm1; | ||
+ | implementation | ||
+ | {$R *.dfm} | ||
+ | function F(k: integer): integer; | ||
+ | begin | ||
+ | if (k=1) or (k=2) | ||
+ | then F:=1 | ||
+ | else F:= F(k-1) + F(k-2) | ||
+ | end; | ||
+ | procedure TForm1.BitBtn1Click(Sender: TObject); | ||
+ | var N: integer; | ||
+ | begin | ||
+ | N:=strtoint(Edit1.Text); | ||
+ | label2.Caption:=inttostr(F(n)); | ||
+ | end; | ||
+ | procedure TForm1.BitBtn2Click(Sender: TObject); | ||
+ | begin | ||
+ | close; | ||
+ | end; | ||
+ | end. | ||
+ | |||
+ | *'''Форма с результатом работы программы:''' | ||
+ | [[Изображение:-12-2.JPG]] | ||
− | + | ==Задание== | |
− | + | {| border=1 | |
− | + | !Номер варианта||Условие | |
+ | |- | ||
+ | |<center>1</center>||Вычислить число сочетаний из n по m(n>m) по формуле:[[Изображение:Модуль14вар1.JPG]] | ||
+ | |- | ||
+ | |<center>2</center>||Вычислить: [[Изображение:Модуль14вар2.JPG]] | ||
+ | |- | ||
+ | |<center>3</center>||Вычислить: [[Изображение:Модуль14вар3.JPG]] | ||
+ | |- | ||
+ | |<center>4</center>||Найти все трехзначные числа, равные сумме факториалов своих цифр. | ||
+ | |- | ||
+ | |<center>5</center>||Два треугольника заданы координатами своих вершин. Вычислить площади треугольников с помощью формулы Герона и определить, какой треугольник имеет большую площадь. | ||
+ | |- | ||
+ | |<center>6</center>||Решить уравнение: ax + b = 0, где | ||
− | + | [[Изображение:Модуль14вар6.JPG]] | |
− | |||
− | |||
− | |||
− | + | Значения k, l, m вводятся. | |
+ | |- | ||
+ | |<center>7</center>||Даны действительные числа s,t. Вычислить: | ||
− | + | [[Изображение:Модуль14вар7(1).JPG]] | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | [[Изображение: | ||
− | |||
− | |||
− | + | где | |
− | + | [[Изображение:Модуль14вар7(2).JPG]] | |
+ | |- | ||
+ | |<center>8</center>||Вычислить число сочетаний с повторениями по формуле: | ||
− | + | [[Изображение:Модуль14вар8.JPG]] | |
− | + | |- | |
− | + | |<center>9</center>||Найти наибольший общий делитель целых положительных чисел a, b, c. | |
− | + | |- | |
− | + | |<center>10</center>||Даны действительные числа х, у. Вычислить: | |
− | |||
− | + | [[Изображение:Модуль14вар10(1).JPG]] | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | где | |
− | |||
− | |||
− | + | [[Изображение:Модуль14вар10(2).JPG]] | |
+ | |- | ||
+ | |<center>11</center>||Решить уравнение: [[Изображение:Модуль14вар11(1).JPG]] , где | ||
− | + | [[Изображение:Модуль14вар11(2).JPG]] | |
− | + | Значения r, m, n вводятся. | |
+ | |- | ||
+ | |<center>12</center>||Используя функцию нахождения наибольшего общего делителя, найти наименьшее общее кратное двух чисел. | ||
+ | |- | ||
+ | |<center>13</center>||Вычислить: | ||
+ | [[Изображение:Модуль14вар13.JPG]] | ||
+ | |- | ||
+ | |<center>14</center>||Вычислить: | ||
+ | [[Изображение:Модуль14вар14.JPG]] | ||
+ | |} | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | {| border=1 | |
− | + | ! Номер варианта|| Условие | |
− | m: | + | |- |
− | + | | <Center>1</Center>|| Найти НОД двух неотрицательных целых чисел m и n с использованием первого алгоритма Евклида: | |
− | + | [[Изображение:T14-1.jpg]] | |
− | + | |- | |
− | + | | <Center>2</Center>|| Найти НОД двух неотрицательных целых чисел m и n c использованием второго алгоритма Евклида: | |
− | + | [[Изображение:T14-2.jpg]] | |
− | + | |- | |
− | + | | <Center>3</Center>|| Вычислить функцию Аккермана A(n, m) для неотрицательных целых чисел m и n по формуле: | |
− | + | [[Изображение:T14-3.jpg]] | |
− | + | |- | |
+ | | <Center>4</Center>|| Вычислить числа Каталана K(n) для натурального n по формуле: | ||
+ | K(1) = K(2) = 1 | ||
+ | K(n) = K(n - 1)*(4*n - 6)/n, при n * 3 | ||
+ | |- | ||
+ | | <Center>5</Center>|| Вычислить n-ый член арифметической прогрессии. Заданы первый член а1 и разность d. | ||
+ | [[Изображение:T14-5.jpg]] | ||
+ | |- | ||
+ | | <Center>6</Center>|| Вычислить n-ый член геометрической прогрессии. Заданы первый член а1 и знаменатель геометрической прогрессии q. | ||
+ | [[Изображение:T14-6.jpg]] | ||
+ | |- | ||
+ | | <Center>7</Center>||Вычислить сумму n членов арифметической прогрессии. Заданы первый член а1 и разность d. Для вычисления члена арифметической прогрессии использовать формулу варианта 5. | ||
+ | [[Изображение:T14-7.jpg]] | ||
+ | |- | ||
+ | | <Center>8</Center>||Вычислить сумму n членов геометрической прогрессии. Заданы первый член а1 и знаменатель геометрической прогрессии q. Для вычисления члена геометрической прогрессии использовать формулу варианта 6. | ||
+ | [[Изображение:T14-8.jpg]] | ||
− | + | |- | |
+ | | <Center>9</Center>||Вычислить: | ||
+ | [[Изображение:T14-9а.jpg]] | ||
− | + | Для вычисления факториала воспользоваться формулой: | |
+ | [[Изображение:T14-9б.jpg]] | ||
− | + | |- | |
+ | | <Center>10</Center>||Найти максимум из двух величин НОД(a, b) и НОД(c, d). Для вычисления наибольшего общего делителя воспользоваться формулой варианта 1. | ||
+ | |- | ||
+ | | <Center>11</Center>||Вычислить a!+b!. Для вычисления факториала воспользоваться формулой варианта 9. | ||
+ | |- | ||
+ | | <Center>12</Center>||Вычислить F(k) -F(m), где F(k) - k-ый член последовательности Фибоначчи, F(m) - m-ый член последовательности Фибоначчи. | ||
− | + | F(1) = F(2) = 1 | |
+ | F(n) = F(n-1) + F(n-2) для n >= 3 | ||
− | + | |- | |
+ | | <Center>13</Center>||Вычислить: | ||
+ | [[Изображение:T14-13.jpg]] | ||
+ | |||
+ | Для вычисления наибольшего общего делителя воспользоваться формулой варианта 2. | ||
+ | |- | ||
+ | | <Center>14</Center>||Вычислить величину pow(x, n) для вещественного х<>0 и целого n по формуле: | ||
+ | [[Изображение:T14-14.jpg]] | ||
+ | |- | ||
+ | |} | ||
==Литература== | ==Литература== | ||
Строка 182: | Строка 263: | ||
#Бобровский С. Delphi 7. Учебный курс. – СПб: Питер, 2003 | #Бобровский С. Delphi 7. Учебный курс. – СПб: Питер, 2003 | ||
#Культин Н. Основы программирования в Delphi 7. СПб: БХВ-Петербург, 2005. | #Культин Н. Основы программирования в Delphi 7. СПб: БХВ-Петербург, 2005. | ||
− | |||
==Ссылки== | ==Ссылки== |
Текущая версия на 11:31, 20 мая 2008
Использование функций
Функция отличается от процедуры тем, что результат ее работы возвращается в виде значения этой функции и, следовательно, вызов функции может использоваться наряду с другими операндами в выражения. Рекурсия - такой способ организации вычислительного процесса, при котором подпрограмма в ходе выполнения составляющих ее операторов обращается сама к себе.
Пример 1.
- Условие задачи:
Даны все действительные числа a,b,c.Вычислить max(a,b,+c)+max(a+b,c)/1+max(a+bc,12)
- Использованные компоненты:
Label1 - используется для текстовых комментариев;
Label2 - используется для вывода суммы;
edit1 - используется для ввода числа;
edit2 - используется для ввода числа;
edit3 - используется для ввода числа;
BitBtn1 - запуск программы;
BitBtn2 - выход из программы;
- Программный код:
unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Grids, XPMan, Buttons; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; XPManifest1: TXPManifest; BitBtn1: TBitBtn; BitBtn2: TBitBtn; procedure BitBtn2Click(Sender: TObject); procedure BitBtn1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function max (x,y: real): real; begin if x > y then max:=x else max:=y end; var z, a, b, c: real; procedure TForm1.BitBtn2Click(Sender: TObject); begin a:=strtoint(edit1.Text); b:=strtoint(edit2.text); c:=strtoint(edit3.Text); z:=(max(a, b+c) + max(a+b, c*c))/(1+ max(a+b*c, 12)); Label4.Caption:=floattostr(z); end; procedure TForm1.BitBtn1Click(Sender: TObject); begin close; end; end.
- Форма с результатом работы программы:
Пример 2.
- Условие задачи:
Найти N число последовательности Фибоначчи. Использовать рекурсивную функцию. Числа Фибоначчи образуют последовательность, у которой каждый очередной член равен сумме двух предыдущих: 0 1 1 2 3 5 8 13 . . . Обозначив N-й член ряда Фибоначчи F(N), можно записать следующую рекурсивную зависимость: F(N) = F(N - 1) + F(N - 2), n >= 3, F(1) = 1 и F(2) = 1
- Использованные компоненты:
Label1 - используется для текстовых комментариев;
Label2 - используется для текстовых комментариев;
edit1 - используется для ввода числа;
BitBtn1 - запуск программы;
BitBtn2 - выход из программы;
- Программный код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, XPMan, StdCtrls, Buttons; type TForm1 = class(TForm) Edit1: TEdit; Label1: TLabel; Label2: TLabel; XPManifest1: TXPManifest; Label3: TLabel; BitBtn1: TBitBtn; BitBtn2: TBitBtn; procedure BitBtn1Click(Sender: TObject); procedure BitBtn2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function F(k: integer): integer; begin if (k=1) or (k=2) then F:=1 else F:= F(k-1) + F(k-2) end; procedure TForm1.BitBtn1Click(Sender: TObject); var N: integer; begin N:=strtoint(Edit1.Text); label2.Caption:=inttostr(F(n)); end; procedure TForm1.BitBtn2Click(Sender: TObject); begin close; end; end.
- Форма с результатом работы программы:
Задание
Номер варианта | Условие |
---|---|
Найти НОД двух неотрицательных целых чисел m и n с использованием первого алгоритма Евклида: | |
Найти НОД двух неотрицательных целых чисел m и n c использованием второго алгоритма Евклида: | |
Вычислить функцию Аккермана A(n, m) для неотрицательных целых чисел m и n по формуле: | |
Вычислить числа Каталана K(n) для натурального n по формуле:
K(1) = K(2) = 1 K(n) = K(n - 1)*(4*n - 6)/n, при n * 3 | |
Вычислить n-ый член арифметической прогрессии. Заданы первый член а1 и разность d. | |
Вычислить n-ый член геометрической прогрессии. Заданы первый член а1 и знаменатель геометрической прогрессии q. | |
Вычислить сумму n членов арифметической прогрессии. Заданы первый член а1 и разность d. Для вычисления члена арифметической прогрессии использовать формулу варианта 5. | |
Вычислить сумму n членов геометрической прогрессии. Заданы первый член а1 и знаменатель геометрической прогрессии q. Для вычисления члена геометрической прогрессии использовать формулу варианта 6. | |
Вычислить:
Для вычисления факториала воспользоваться формулой: | |
Найти максимум из двух величин НОД(a, b) и НОД(c, d). Для вычисления наибольшего общего делителя воспользоваться формулой варианта 1. | |
Вычислить a!+b!. Для вычисления факториала воспользоваться формулой варианта 9. | |
Вычислить F(k) -F(m), где F(k) - k-ый член последовательности Фибоначчи, F(m) - m-ый член последовательности Фибоначчи.
F(1) = F(2) = 1 F(n) = F(n-1) + F(n-2) для n >= 3 | |
Вычислить:
Для вычисления наибольшего общего делителя воспользоваться формулой варианта 2. | |
Вычислить величину pow(x, n) для вещественного х<>0 и целого n по формуле: |
Литература
- Архангельский. Программирование на Delphi 6. – М: БИНОМ, 2002
- Бобровский С. Delphi 7. Учебный курс. – СПб: Питер, 2003
- Культин Н. Основы программирования в Delphi 7. СПб: БХВ-Петербург, 2005.