Математика та Delphi (вихідники) - Програмні продукти

Рідкісна програма обходиться без найпростіших алгебраїчних дій: "плюс", "мінус", "розділити", "помножити" - їх delphi розуміє і дбайливо виділяє синім кольором. Але потім починаються проблеми. Варто вам прописати щось на зразок

edit1.text:= 'Координати вікна: ' + form 1.left, + ', ' + form 1.top,

як компілятор видає повідомлення: "incompatible types: string and integer".

Що це за типи і чому вони несумісні?

Інформація може бути різною: текстовою, графічною, цифровою, в десяти, - восьми, - шістнадцятковою і т.п. системах. Щоб коректно сприймати її, у delphi, та й у всіх інших мовах, введені змінні, або типи (types).

У прикладі вище ми зіткнулися з двома найбільш поширеними. string - буквально "рядок", текстова інформація. integer - просте число в діапазоні -2147483648 ... 2147483647. Хоча з відра в сито перелити не можна, добрий Borland надав нам функції для перекладу з одного типу в інший (з модуля sysutils.pas):

function inttostr( value : integer): string;

function strtoint(const s: string): integer;

Зверніть увагу на значення функцій, що повертаються. Наш приклад має виглядати так:

edit1.text:= 'Координати вікна:' + inttostr(form 1.left), +', '+inttostr(form 1.top);

Подивіться на другий рядок коду. Значення edit2.text має бути ТІЛЬКИ числовим, інакше ви отримаєте повідомлення про помилку.

А якщо потрібно працювати з ірраціональними числами, наприклад, із числом "пі"?

Для таких даних є свій тип: real. Змінною такого типу можна привласнити значення параметра integer без будь-яких проміжних функцій, але навпаки зробити не можна. А щобпов'язати real з текстом, існують команди:

function floattostr( value : ext end ed): string;

function strtofloat(const s: string): ext end ed;

теж із модуля sysutils.pas. (Тому не забувайте декларувати цей модуль при створенні консольної програми з математичними діями.) Пропишіть що-небудь на зразок

щоб оцінити можливості змінної real. З її допомогою можна вже робити серйозніші обчислення, наприклад, зведення в квадрат за допомогою функції sqr(x: real) і вилучення квадратного кореня: sqrt(x: real), що у модулі system.pas. Там само можна знайти функції sin і cos з аналогічними параметрами. , arcsin, arccos, arccot, arcsec та інші в модулі math.pas. Цей модуль незамінний також, якщо ви хочете звести число в ступінь.

function power(const base: ext end ed; const exponent: ext end ed):ext end ed,

де base - число, яке зводиться до ступеня, exponent - показник ступеня.

form 1.caption:=power(2,3); //зведення числа 2 у куб

Ось ще деякі скарби модуля math:

hypot – обчислення гіпотенузи за довжиною катетів;

radtodeg, degtorad - перетворення радіанів на градуси і навпаки;

floor - округлення у меншу строну;

ceil - округлення у велику сторону;

sincos - обчислення синуса та косинуса;

mean - середнє арифметичне у комбінації чисел. (Наприклад: caption:=floattostr(mean([10,10,2]))) - знаходить середнє арифметичне трьох даних чисел, але, звичайно ж, шуканих чисел може бути і більше, і менше зазначених у прикладі трьох.)

Часто буває, що потрібнопрокреслити пряму точно по центру image1, що неможливо зробити діленням параметра image1.width на два, оскільки в результаті майже завжди виходить ірраціональне real-число.

Ми скористаємося командою div, яка обчислює результат поділу - ціле число - без залишку.

image1.canvas.moveto(image1.width div 2, 0);

image1.canvas.lineto(image1.width div 2, image1.height);

У цьому прикладі ширина полотна image1 ділиться без залишку на два. Зверніть увагу, що дільник пишеться не в дужках, а відразу після команди div.

Як написати на delphi генератор випадкових чисел? Командою random, після якої в дужках вказується максимальна величина генерованого числа.

edit1.text:=inttostr(random(100)); //генератор випадкових чисел у межах ста

А зараз ми застосуємо наші математичні знання і створимо утиліту для розв'язання квадратних рівнянь виду:

Якщо ви навчалися в школі, то пам'ятайте, що ці рівняння мають два коріння, які знаходяться за формулою

Так, страшна формула ... На форму кидайте компоненти trichedit, два button'a - countbutton і exitbutton - і три label ededit'а, в які вводяться, відповідно, параметри a, b, c. Знайдіть у label ededit'ів властивість label position і поставте його в lpleft.

Ми будемо працювати з параметрами a, b, з та дискримінантом (для тих, хто не знає, - сума квадрата b та вчетверного твору a та c). У delphi таких змінних немає, ми самі їх придумали, а тому потрібно продекларувати їх у var.

Утримуючи клавішу shift, виберіть всі три label ededit'a і за подією onkeypress поставте у всіх label ededit1keypress (і далі див. листинг):

procedure t form 1.labelededit1keypress(s end er: tobject; var key:char); begin if not (key in ['0'..'9','-', char(vk_back)]) then begin //вводити можна тільки числа beep; key:=#0; end; end;

procedure t form 1.closebuttonclick(s end er: tobject); begin application.terminate; //Гарантовано звільняє пам'ять - на відміну від close end;

procedure t form 1.countbuttonclick(s end er: tobject); var a, b, c, diskrim, x1, x2: real; begin //якщо а=0 - перериваємо процес if (labelededit1.text='0') or (labelededit1.text=emptystr) then abort; //якщо дані не введені - ставимо 0 if label ededit2.text=emptystr then label ededit2.text:='0'; if label ededit3.text=emptystr then label ededit3.text:='0'; //ініціалізуємо змінні a:=strtofloat(labelededit1.text); b:=strtofloat(labelededit2.text); c:=strtofloat(labelededit3.text); //знаходимо дискримінант diskrim:=sqr(b) + 4*a*c; if diskrim then begin //якщо він менший за нуль, рівняння не має сенсу richedit1.clear; richedit1.lines.add('d end ; b:=b*-1; / /х1 і х2=a*2; x1:=(b + sqrt(diskrim))/a; x2:=(b - sqrt(diskrim))/a; //виводимо результати richedit1.clear; richedit1.lines.add('Рішення:' + #10 + #10 +

'Знаходимо дискримінант: d = '+ floattostr(diskrim) + #10); if diskrim > 0 then richedit1.lines.add('d>0. Рівняння має 2 корені.'+ #10 + 'x1=' + floattostr(x1) + '; x2=' + floattostr(x2)) ; if diskrim = 0 then richedit1.lines.add('d=0. Рівняння має 1 корінь.' + #10 + 'x=' + floattostr(x1)); end;

От ми й познайомилися з деякими математичними можливостями.