Известно, что стоимость курса акций Фирмы Х за 13 недель составила следующие значения (см. Таблицу 2).
В соответствии с выданным преподавателем вариантом сделайте прогноз стоимости курса акций на 14-ю неделю торгов, постройте все рассмотренные виды математических моделей и выберите оптимальную.
Таблица 2. Стоимость курса акций
Стоимость курса акций
|
| | недели
|
№
| Название
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Фирма А
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Фирма Б
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Фирма В
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Фирма Г
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Фирма Д
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Фирма Е
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Фирма Ж
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Фирма З
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Фирма И
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Фирма К
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Фирма Л
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Фирма М
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Фирма Н
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Фирма О
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Фирма П
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Фирма Р
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Фирма С
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Фирма Т
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Символьні рядки
Для обробки текстів в Object Pascal використовуються символьні рядки таких типів:
· ShortString або String{N}, де N
255 – короткий рядок;
· String – довгий рядок;
· PChar – нуль-термінальний рядок,
· WideString –широкий рядок.
Приклади опису рядків у програмі:
Var Sk: ShortString; {короткий рядок максимальної}
{довжини 255 символів}
Sks: String[5]; {короткий рядок}
{ довжиною до 5 символів}
Ss1, Ss2: String; {довгий рядок}
Sp: Pchar; {нуль-термінальний рядок}
Sw: WideString; {широкий рядок}
Довжина короткого рядка від 0 до 255 байтів, а довгого, нуль-термінального і широкого рядків від 0 до 2 Гбайтів.
Для описаного в програмі короткого рядка Sk компілятор виділить у статичній пам’яті 256 байтів з номерами від 0 до 255, а для Sks відповідно 6 байтів. У нульовому байті буде міститися біжуча довжина рядка, а починаючи з першого байта буде розміщатися ланцюжок символів. Так як у байт можна записати максимальне число 255, то довжина короткого рядка не може перевищувати 255. При виконанні оператора Sk:=’Рядок символів’; у нульовий байт буде записана довжина – 14, а з першого байта розміститься ланцюжок символів. Якщо довжина рядка символів перевищує описану довжину, то лишні символи будуть відкидатися. Так, при виконанні оператора Sks:=’Рядок символів’; змінна Sks отримає значення – ’Рядок’
Описаний у програмі довгий рядок Ss1 буде розміщатися у динамічній пам’яті. При цьому, компілятор виділить для змінної Ss1 у статичній пам’яті 4 байти в яких буде міститися адреса виділеної динамічної пам’яті. Змінна Ss1 буде вказівником на цю пам’ять.
Динамічна пам’ять виділяється операційною системою під час виконання програми. У виділеній пам’яті, починаючи з першого байта, розміщується ланцюжок символів, термінальний нуль – #0, яким завершується рядок, і 4-байтовий лічильник посилань.
При виконанні оператора Ss1:=’Рядок символів’; програма визначить необхідний розмір пам’яті 14+5=19 байтів і звернеться до операційної системи. Операційна система виділить у динамічній пам’яті область із 19 байтів і у змінну Ss1 помістить її адресу. У виділеній пам’яті, починаючи з першого байта, розмістить символи – Рядок символів, термінальний нуль – #0, а в лічильник посилань занесе одиницю.
Лічильник посилань використовується для кешування пам’яті. Так, при виконанні оператора Ss2:=Ss1; пам’ять для розміщення змінної Ss2 не виділяється, а їй присвоюється значення вказівника Ss1 і лічильник посилань збільшується на одиницю. Таким чином, обидві змінні Ss1 і Ss2 будуть вказувати на одну і ту ж область пам’яті. При виконанні оператора Ss1:=’Це–’+’Рядок символів’; лічильник посилань зменшиться на одиницю, а операційна система виділить у динамічній пам’яті область із 19+5=24 байтів і у Ss1 помістить її адресу. У виділеній пам’яті, починаючи з першого байта, розмістить ланцюжок символів – ’Це – Рядок символів’, термінальний нуль – #0 і лічильник посилань із значенням – 1. Тепер змінні Ss1 і Ss2 будуть вказувати на різні області пам’яті, а лічильники посилань будуть містити по одиниці. Виділена для розміщення довгого рядка String область пам’яті звільняється, якщо лічильник посилань стає рівним нулю.
Подібним чином здійснюється робота з пам’яттю для нуль-термінальних рядків типу Pchar. Лічильник посилань тут не використовується, тому для кожного рядка виділяється окрема область пам’яті. Нуль-термінальні рядки використовуються при зверненні до API-функцій Windows (API – Application Program Interface – інтерфейс прикладних програм). Оскільки компоненти Delphi беруть на себе всі проблеми зв’язку з API-функціями, то програмісту рідко доводиться звертатися до нуль-термінальних рядків.
Однобайтові символи коду ANSI мають 256 можливих значень, достатніх для відображення будь-якої європейської мови, а для азіатських мов цього недостатньо. Тому міжнародна комісія виробила код Unicode, символи якого займають у пам’яті два байти і мають 65536 можливих значень. Цей код дозволяє представити всі символи всіх мов світу. Символи Unicode описуються стандартним типом WideChar, а складені з них рядки – типом WideString. Усі програми, що використовують OLE-технологію обміну рядками, повинні використовувати символи Unicode.
Звернення до окремих символів рядка здійснюється за допомогою індексу. При виконанні операторів
Ss1:=’Рядок символів’; Ss1[4]:=’к’; Ss1[5]:=’и’;
змінна Ss1 отримає значення – ’Рядки символів’. Нумерація символів у коротких і довгих рядках починається з одиниці, а в нуль-термінальних з нуля.
Над символьними рядками можуть виконуватися операції:
· конкатенація (зчіплення рядків) – (+);
· відношення – (=, <>, <, >, <=, >=).
Наприклад, при виконанні оператора
Ss1:=’Це – ’ + ’Рядок’ + ’символів’;
змінна Ss1 отримає значення – ’Це – Рядок символів’.
Операції відношення виконуються над двома рядками посимвольно, зліва направо з врахуванням внутрішнього кодування символів. Якщо один рядок коротший, то він доповнюється символами #0. Результат операції відношення бульового типу. Наприклад,
‘A’ < ‘B’ – true;
‘A’ < ‘1’ – false;
‘Object’ < ‘Object Pascal’ – true;
‘Пас’ > ‘Pascal’ – true.
Всі останні дії над рядками і символами реалізуються за допомогою стандартних процедур і функцій, які наведені в додатку.
Приклад. Задано текст, слова в якому розділені пробілами і розділовими знаками. Розробити проект програми, яка вилучає з цього тексту всі слова з подвоєнням літер.
Для розв’язку задачі командою File!New Application створимо новий проект. На екрані з’явиться чиста форма з заголовком Form1. Присвоїмо цій формі заголовок Caption = Символьні дані і програмне ім’я Name = FS. Тепер командою File!Save All запишемо програмний модуль під іменем ULABR7_1.pas, а проект – LABR7_1.dpr.
На формі розмістимо один компонент Edit для введення початкових даних і другий для виведення результатів. Присвоїмо цим компонентам програмні імена Edit1, Edit2, встановлені за замовчуванням (властивість Name) і очистимо їм значення властивості Text. Пояснення до цих компонентів зробимо за допомогою компонента Label (властивість Caption)
Крім цього, розмістимо на формі дві керуючих кнопки (компонент Button) з написами Виконати та Вихід (властивість Caption) і програмними іменами Button1, Button2 (властивість Name за замовчуванням) (Рис. 7.1).
Обробники кнопок Виконати та Вихід містяться у програмному модулі ULABR7_1 і мають вигляд:.
Рис. 7.1. Форма Символьні дані.
{ Обробник команди Виконати }
procedure TFS.Button1Click(Sender: TObject);
CONST m=[' ',',',';','.','!','?',':'];
VAR s: string;
p, i, j: integer;
f: boolean;
BEGIN
{Введення початкових даних}
s:=Edit1.Text;
{Пошук і вилучення слів з подвоєнням букв}
i:=1;
repeat
{Пошук початку слова}
while s[i] in m do i:=i+1;
p:=i;
{Пошук кінця слова}
while not (s[i] in m) and (i <= length (s)) do
i:=i+1;
{Перевірка умови подвоєння букв}
j:=p; f:=false;
while (j <= i-2) and (not f) do
if s[j]=s[j+1] then f:=true else j:=j+1;
{Вилучення слів з подвоєнням букв }
{Корекція параметра циклу і}
if f then begin delete (s, p, i-p); i:=p; end;
until i >= length (s);
{Виведення перетвореного тексту}
Edit2.Text:=s;
end;
{ Обробник команди Вихід }
procedure TFS.Button2Click(Sender: TObject);
begin
Close;
end;
Розробка проекту завершена. Тепер командою Run!Run проект можна запустити на виконання. По завершенню компіляції потрібно ввести початкові дані і натиснути кнопку Виконати. Для завершення роботи програми потрібно натиснути кнопку Вихід.