Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Міністерство освіти і науки, молоді та спорту України
Коледж Кременчуцького національного університету
імені Михайла Остроградського
Методичні рекомендації
до проведення лабораторних робіт
з дисципліни
«ПРОГРАМУВАННЯ ТА АЛГОРИТМІЧНІ МОВИ»
для студентів, які навчаються за спеціальністю
5.05010201 «Обслуговування компютерних систем і мереж»
(номер, назва спеціальності)
Відділення компютерних мереж та електропобутової техніки
Кременчук 2012р.
Методичні рекомендації до проведення лабораторних робіт з дисципліни «ПРОГРАМУВАННЯ ТА АЛГОРИТМІЧНІ МОВИ»
для студентів, які навчаються за спеціальністю
5.05010201 «Обслуговування компютерних систем і мереж»
Відділення компютерних мереж та електропобутової техніки
Укладач: Шинкаренко Л.М.
(прізвище викладача)
Розглянуто цикловою комісією з компютерної техніки
Протокол №__________ від «___»_______________ 20__ р.
Голова циклової комісії___________________С.І. Почтовюк
Затверджено методичною радою коледжу
Протокол № ____від «___»________________________р.
Голова методичної ради Левченко Р.В.
Зміст.
[1] TURBO PASCAL 7.0 [2] Лабораторна робота №1. [2.1] Тема: Програмування алгоритмів циклічної структури. Оператор циклу з параметром. Оператори циклу WHILE, REPEAT. [3] ХІД РОБОТИ
[4] [4.1] Тема: Робота з одновимірними масивами. [5] ХІД РОБОТИ [6] Лабораторна робота №3. [6.1] Тема: Сортування масивів. Робота з двовимірними масивами. [7] ХІД РОБОТИ [8] Лабораторна робота №4. [8.1] Тема: Процедури та функції. Рекурсивні функції. Відкриті масиви [9] ХІД РОБОТИ [10] Лабораторна робота №5. [10.1] Тема: Робота з даними рядкового типу. [11] ХІД РОБОТИ [11.0.1] Змінну рядкового типу оголошують за допомогою слова string так: [12] Лабораторна робота №6. [12.1] Тема: Модулі користувача. Модулі CRT і GRAPH. [13] ХІД РОБОТИ [14] Компіляція модулів [14.1] Стандартні модулі [14.1.1] Короткий опис модулів [15] Лабораторна робота №7. [15.1] Тема: Записи. Команда приєднання (WITH). [16] ХІД РОБОТИ [17] Лабораторна робота №8. [17.1] Тема: Робота з текстовими файлами. Використання типізованих файлів. [18] ХІД РОБОТИ [19] DELPHI 7. [20] Лабораторна робота № 1. [20.1] Тема: Створення форми «Анкета студента». [21] Лабораторна робота № 2. [21.1] Тема: Задача «Обмін валюти». [22] Лабораторна робота № 3. [22.1] Тема: Задача «Табулювання функції». [23] Лабораторна робота № 4. [23.1] Тема: Задача «Біржа цінних паперів». [24] Лабораторна робота № 5. [24.1] Тема: Задача «Телефонний довідник». [25] Лабораторна робота №6 [25.1] Тема: Створення програми: текстовий редактор «Блокнот». [26] DELPHI 7.0 [27] Лабораторна робота № 7. [27.1] Тема: Задача «ВИВЧЕННЯ АНГЛІЙСЬКОЇ МОВИ». [28] Лабораторна робота №8. [28.1] Тема: Програмування гри «О, щасливчик!». [29] Лабораторна робота № 9. [29.1] Тема: Проектування СУБД в середовищі DELPHI. [29.1.1] Завдання |
Мета роботи: навчитися створювати і виконувати програми по алгоритмах циклічної структури, використовуючи оператор з лічильником та оператори while, repeat.
program SUM;
{програма обчислення суми заданої кількості чисел}
uses crt;
var N, sum, I, Num:integer;
begin { - початок тіла головної програми}
clrscr; {- очищення екрану}
writeln; {- пропуск рядка}
writeln('<<< обчислення суми N чисел >>>');
writeln; {- пропуск рядка}
write ('Введіть кількість сумованих чисел N=?-> ');
readln(N);
sum:=0;
FOR I:=1 TO N DO
Begin
writeln('Введіть', I, '-е число Num=? -> ');
readln(Num);
sum:=sum + Num; {Додавання з накопиченням}
end;
writeln('сума ',N, ' чисел дорівнює ', sum);
end.
f(x)= sin2(πx+1) a=1; b=53;
program cikl_for;
const a=1;
b=53;
var x:word;
fx:real;
begin
writeln('Обчислення суми ряду в діапазоні від а до b ');
fx:=0;
for x:=a to b do
fx:=fx+sqr(sin(pi*x+1));
writeln('Сума ряду = ',fx:8:3)
end.
program SUM_While;
uses crt;
var N, sum, I, Num:integer;
begin { - початок тіла головної програми}
clrscr; {- очищення екрану}
writeln; {- пропуск рядка}
writeln('<< обчислення суми N чисел до певного значення >>');
writeln; {- пропуск рядка}
write (' Введіть кінцеве значення суми N = ? -> ');
readln(N);
sum:=0; I:=1;
WHILE (Sum< N) DO
Begin
writeln (' Введіть', I, -е число Num = ? -> ');
readln(Num);
sum:=sum+ Num; { Додавання з накопиченням}
Inc (I); {Збільшення і на 1}
end;
writeln(' було підсумовано', I, ' чисел, сума чисел дорівнює ', sum);
end.
program SUM_Repeat;
uses crt;
var sum, I, Num:integer;
Ch:Char;
begin { - початок тіла головної програми}
clrscr; {- очищення екрану}
writeln; {- пропуск рядка}
writeln(' обчислення суми чисел ');
writeln; {- пропуск рядка}
sum:=0; I:=1;
Repeat
writeln (' Введіть', I,-e число Num = ? -> ');
readln(Num);
sum:=sum+ Num; { Додавання з накопиченням}
Inc (I); {Збільшення і на 1}
writeln (' Закінчити процес Y (Так) ');
readln(Ch);
Until ( (Ch='Y') OR (Ch='y'));
writeln(' було підсумовано', I, ' чисел, сума чисел дорівнює ', sum);
end.
Program S_while;
Const
e=1E-3;
var
An, Num: real; n, i: Word;
Nfact, Pow2, N2fact: LongInt;
begin
WriteLn ( 'Обчислення суми ряду Аn з точністю е=10^-3' );
WriteLn;
Num:=1;
N2fact:=1;
Nfact:=1;
n:=1;
An:=0;
While ( Num >e) do
begin
for i:=1 to n do {Обчислення факторіалу n}
begin
Nfact := Nfact * i;
end;
Pow2:=2 SHL (n-1); {Піднесення 2 до степені n}
for i:=1 to Pow2 do {Обчислення факторіалу 2 в степені n}
begin
N2fact := N2fact * i;
end;
Num := SQR ( Nfact ) / N2fact; {Обчислення члена ряду}
An :=An + Num; {Обчислення суми ряду}
Inc(n);
Nfact:=1;
N2fact:=1;
end;
WriteLn ('Сума ряду = ',An);
WriteLn ( 'Останній член ряду = ', Num );
WriteLn ('підсумовано ', n,' членів ряду');
end.
Program S_Repeat;
uses crt;
var
sum, I, Num : integer;
Ch : Char;
Count : Word;
begin
Clrscr;
sum:=0;
I:=0;
Count:=0;
Repeat
write(' Введіть ', Count+1,' -е число Num = ? -> ');
readln(Num);
{Визначення парних чисел}
if Not ( odd (Num)) Then
Begin
sum:=sum+ Num; {Додавання з накопиченням}
{Збільшення лічильника парних чисел і на 1}
Inc (I);
end;
{Збільшення лічильника введених чисел count на 1}
Inc(Count);
write (' Закінчити Y (Так) / N(Ні) ' );
read(Ch);
Until ( (Ch = 'Y') OR (Ch = 'y') );
writeln('було введено чисел-', Count, ', підсумовано- ',I,', сума дорівнює ', sum);
end.
№ вар |
Задача |
|
Написати програму, яка виводить таблицю квадратів перших десяти цілих додатних чисел. Нижче представлений рекомендований вид екрану під час роботи програми. Таблиця квадратів Число Квадрат 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81 10 100 |
|
Написати програму, яка виводить таблицю квадратів перших п'яти цілих додатних непарних чисел. Нижче представлений рекомендований вид екрану під час роботи програми. Таблиця квадратів непарних чисел Число Квадрат 1 1 3 9 5 25 7 49 9 81 |
|
Написати програму, яка обчислює суму перших n членів ряду 1, 3, 5, 7 .... Кількість сумованих членів ряду задається під час роботи програми. Нижче представлений рекомендований вид екрану під час роботи програми. Обчислення часткової суми ряду: 1,3,5,7 ... Введіть кількість доданих членів ряду > 15 Сума перших 15 членів ряду дорівнює 330. |
|
Написати програму, яка обчислює суму перших n членів ряду Обчислення часткової суми ряду: 1+1/2+1/3+ ... Введіть кількість членів ряду > 15 Сума перших 15 членів ряду рівна 3.3182. |
|
Написати програму, яка виводить таблицю степенів двійки (від нульової до десятої). |
|
Написати програму, яка обчислює факторіал числа, введеного з клавіатури. (Факторіалом числа n називається добуток цілих чисел від 1 до n. Наприклад, факторіал числа 1 рівний 1, а числа 8 40320.) Обчислення факторіалу. Введіть число, факторіал якого треба обчислити -> 7 Факторіал 7 рівний 5040. |
|
Написати програму, яка вводить з клавіатури 5 дробових чисел і обчислює їх середнє арифметичне. Рекомендований вид екрану під час роботи програми приведений нижче. Обчислення середнього арифметичного послідовності дробових чисел. Після введення кожного числа слід натиснути <Enter> ->5.4 -> 7.8 -> 3.0 -> 1.5 -> 2.3 Середнє арифметичне введеної послідовності: 4.00 Для завершення роботи програми натисніть <Enter>. |
|
Написати програму, яка генерує 10 випадкових чисел в діапазоні від 1 до 10, виводить ці числа на екран і обчислює їх середнє арифметичне. Рекомендований вид екрану під час роботи програми приведений нижче. Випадкові числа 1 3 4 2 7 4 9 6 2 1 середнє арифметичне 3.9 |
|
Написати програму, яка виводить на екран квадрат Піфагора таблицю множення. Рекомендований вид екрану під час роботи програми приведений нижче. 1 2 3 4 5 6 7 8 9 10 1 1 2 3 4 5 6 7 8 9 10 2 2 4 6 8 10 12 14 16 18 20 3 3 6 9 12 15 18 21 24 27 30 4 4 8 12 16 20 24 28 32 36 40 5 5 10 15 20 25 30 35 40 45 50 6 6 12 18 24 30 36 42 48 54 60 7 7 14 21 28 35 42 49 56 63 70 8 8 16 24 32 40 48 56 64 72 80 9 9 18 27 36 45 54 63 72 81 90 |
|
Написати програму, яка перевіряє знання таблиці множення. Програма повинна вивести 10 прикладів і виставити оцінку: за 10 правильних відповідей "відмінно", за 9 і 8 "добре", за 7 і 6 "задовільно", за 6 і менш "погано". Нижче представлений рекомендований вид екрану під час роботи програми. *** Перевірка знання таблиці множення *** Після прикладу введіть відповідь і натисніть <Enter> 5 х 3 = 15 7 х 7 = 49 1 х 4 = 4 4 х 3 = 12 9 х 4 = 36 8 х 8 = 64 7 х 8 = 52 Ви помилилися! 7 х 8 = 56 4 х 7 = 28 3 х 5 = 15 2 х 5 = 10 Правильних відповідей: 9 Оцінка: Добре. |
|
Скласти програму з використанням циклу While знаходження суми ряду з точністю |
|
Написати програму, яка підсумовує непарні числа, що вводяться, до введення букви Y. |
|
Написати програму обчислення чисел, що вводяться, до введення числа 0. |
|
Написати програму обчислення різниці чисел, що вводяться, до введення букви P. Враховувати числа кратні 4. |
|
Написати програму обчислення добутку чисел, що вводяться, до введення від′ємного числа. |
Мета роботи: навчитися працювати з одновимірними масивами.
program lr6_1;
const n=10; { верхня межа масиву}
var i, k : integer;
а: array[1..n] of integer;
begin { заповнюємо масив випадковими відємними і додатними числами}
randomize;
for i:=1 to n do
begin
а[i]:=random(100)-40;
{виводимо елементи масиву на екран}
writeln('a[',i,']=',a[i]:4);
end;
{ перевіряємо елементи масиву і підраховуємо додатні}
k:=0; {обнуляємо лічильник додатних чисел}
for i:=1 to n do
if а[i]>0 then k:=k+1;
writeln('В масиві ',k, ' додатних елементів');
end.
i:=0; { номер елементів масиву }
Repeat
i:=i+1;
Until (а[i]=0) { знайшли } or (i=n) {масив кінчився };
if а[i]=0 then writeln ( 'Номер першого нульового элемента= , i)
else writeln ( 'Таких елементів немає');
max:=a[1]; k:=1; { пошук починаємо з першого елемента }
for i:=2 to n do {перебираємо елементи, починаючи з другого}
if а[i]>max then
begin
max:=a[i]; k:=i; {запам'ятовуємо значення і номер елемента, який більший за всі попередні}
end;
program pr;
var а, b: array[1..5] of integer;
с: array[1..10] of integer;
i, j, k: integer;
begin
for i:=1 to 4 do read(а[i]);
readln(а[5]);
for i:=1 to 4 do read(b[i]);
readln(b[5]);
i:=1; j:=1; к:=1;
repeat {цикл доки в обох масивах є дані}
if а[i]< b[j] then begin
с[k]:=a[i]; k:=k+1; i:=i+1;
end
else
if а[i]> b[j] then begin
с[k]:=b[j]; k:=k+1; j:=j+1;
end
else begin
с[k]:=b[j]; с[k+1]:=b[j];
k:=k+2; j:=j+1; i:=i+1;
end;
until (i>5) or (j>5);
{введення записів, які залишилися в одному з масивів}
while i<=5 do begin с[k]:=a[i]; k:=k+1; i:=i+1;
end;
while j<=5 do begin с[k]:=b[j]; k:=k+1; j:=j+1;
end;
for i:=1 to 10 do write(с[i],' ');
writeln;
end.
№ вар |
Задача |
|
Створіть (і вивести) новий масив, який складається з додатних елементів масиву у. |
|
Знайти суму третього і шостого додатних елементів. |
|
Другий відємний елемент замінити мінімальним. |
|
Скільки в масиві елементів з мінімальним значенням серед додатних? |
|
Ненульові елементи масиву занести в інший масив. |
|
Обчислити суму перших чотирьох відємних елементів. |
|
Вивести номер передостаннього додатного елемента. |
|
Створіть новий масив з відємних елементів масиву у. |
|
Знайти добуток другого і четвертого елементів, значення яких більш ніж 3. |
|
Максимальний елемент поміняти місцями з другим нульовим. |
|
Передостанній відємний елемент замінити максимальним. |
|
Обчислити добуток другого відємного і п'ятого елементів. |
|
Елементи масиву більші, ніж 1, занести в інший масив. |
|
Вивести номери і значення двох найбільших елементів. Обчислити їх суму. |
Теоретичні відомості до лабораторної роботи № 2 .
Масиви.
Масив (array) - це кінцевий набір елементів одного (базового) типу, які зберігаються в послідовно розміщених елементах оперативної пам'яті і мають загальне ім'я.
В математиці поняттю масив відповідають поняття вектора і матриці. Розрізняють одно- і багатовимірні масиви. Двовимірний масив даних це таблиця, яка складається з декількох рядків.
Загальний вид конструкції опису типу масиву такий:
array [<розмір>] of <імя базового типу >;
Розмір (кількість елементів) масиву частіше за все задають у вигляді діапазону або ім'ям деякого перелічуваного типу даних.
Описати масив можна в розділі опису типів type, в розділі констант const або в розділі оголошення змінних var. Імена типів масивів і змінних - масивів вказує користувач.
Приклад. Опишемо тип масиву mymasyv, оголосимо постійний масив (масив - константу) zatraty типу mymasyv і змінні - масиви а, al типу mymasyv і масив b, що складається з 7 елементів цілого типу, масив с з 100 елементів-символів.
type mymasyv = array [1.. 10] of real;
day = (mon, tue, wed, fri, sat, sun);
const zatraty: mymasyv = (1.2, 1, 1, 2, 8, 2.4, 8.7, 3, 7, 1.3);
var а, al : mymasyv;
b : array [day] of integer ;
с : array [1..100] of char ;
Над масивами визначена єдина команда присвоєння. Наприклад, команда а:= а1 всі значення масиву а1 привласнить відповідним елементам масиву а. Вся решта операцій визначена тільки над елементами масиву. Доступ до елементів масиву здійснюється так:
<імя масиву >[<номер елементу >]
Номер (його часто називають індексом) записують в квадратних дужках, наприклад, а[1] - перший елемент масиву а, b[tue] другий елемент масиву b.
Приклад. Елементам описаних вище масивів можна присвоїти значення так:
а[1]:= 15.1; b[tue]:= 3; с[1]:= 'а'; с[2]:= 'b'.
Елементи масиву zatraty мають такі значення: zatraty[l]= 1.2; zatraty[2]= 1; ...; zatraty[10]= 1.3.
Приклад. Створіть масив з перших ста позитивних цілих чисел і обчислити суму всіх його елементів:
s := 0;
for i := 1 to 100 do
begin
а[i]:= i; s := s + а[i]
end;
writeln(s);
Задачі пошуку в масиві конкретних даних вирішують методом сканування всіх елементів масиву за допомогою команд циклу for, while або repeat і команди розгалудження, в якій вказують умову пошуку.
Дії над масивами.
Заповнення масиву даними
Масив, описаний як константа, що типізується, вже містить дані. Масиви, оголошені в розділі опису змінних, необхідно заповнити даними, перш ніж виконувати з ними будь-які дії.
Значення елементів масиву також можна задати наступними способами:
Наприклад, "сліпий", без використання коментарів, введення з клавіатури:
for i:=l to 5 do readln(а[i]);
for i:=1 to 3 do
for j:=1 to 2 do
readln(а[i,j]);
Наприклад, фрагмент програми заповнення одновимірного масиву х з n елементів випадковими числами в діапазоні від 0 до 99 включно виглядає так:
randomize; { ініціалізація датчика випадкових чисел }
for i:=1 to n do x[i]:=random(100);
Наприклад, обнуління елементів двовимірного масиву а виглядає таким чином:
for i:=1 to n do
for j : =1 to m do а[i,j]:=0;
Виведення масиву.
Виведення значень елементів масиву також виконується в циклі for з використанням операторів write і writeln.
Наприклад, виведення вектора з 5 елементів:
for i:=1 to 5 do writeln(а[i]);
for i:=1 to 5 do write(а[i],' ');
for i:=1 to 5 do write(а[i]:4);
Виведення матриць в стандартній формі запису по рядках і стовпцях виконується за допомогою оператора writeln; (без параметра). Він використовується після виводу поточного рядка матриці для переміщення курсора в початок наступного рядка екрану:
for i:=1 to n do
begin
for j:=1 to m do
write(а[i,j]:4);
writeln;
end;
Дії з одновимірними масивами
Умовимося, що у векторі а міститься n елементів.
s:=0;
for i:=1 to n do s:=s+a[i]; { звичайне накопичення суми в s }
s:=1;
for i:=1 to n do s:=s*a[i]; { накопичення добутку в s }
Сортування масиву
Сортування і пошук є найважливішими поняттями інформатики. Сортування це процес впорядковування набору даних одного типу за збільшенням або зменшенням значення якої-небудь ознаки. З погляду програміста найбільший інтерес представляють: сортування масиву; сортування рядків; сортування елементів файлу. Саме ці сортування використовуються при розробці компіляторів, інтерпретаторів, баз даних, оформленні статистичних зведень, довідкових матеріалів і більшості прикладних пакетів.
Мета роботи: навчитися сортувати одновимірні масиви,
працювати з двовимірними масивами.
const count=20;
m: array [1.. count] of byte =
(9, 11, 12, 3,19, 1,5, 17, 10, 18, 3,19, 11, 9, 12, 20, 20, 19, 2,5);
var i, j, buf, n: byte; а: integer;
begin
writeln ( 'Вихідний масив: ');
for i:=1 to count do write (' ',m[i]); writeln; readln;
а:=0;
for i:=2 to count do
begin
for j : =count downto i do
begin
а: =a+l;
if m[j-1]<m[j] then {якщо елемент справа більше елемента зліва, то "витісняємо" його вліво - пухирець "спливає"}
begin
buf:=m[j-1]; { перестановка елементів }
m[j-1]:=m[j]; m[j]:=buf;
for n:=1 to count do write (' ',m[n]);
writeln('; ітерація # ', а);
end;
end;
end;
end.
Min:=a[1,1]; K:=1; L:=1;
For i:=1 to n do
Begin
for j:=1 to m do
if а[i, j]<min then
begin
min:=a[i, j] ;
K:=i; L:=j;
end;
end.
for i:=1 to n do
begin s:=0;
for j : =1 to m do s:=s+a[i, j]*x[j] ;
у[i]:=s;
end;
№ вар. |
Задача |
|
Знайти індекси мінімального елемента масиву. Обчислити добуток його відємних елементів. |
|
Обчислити кількість елементів масиву, для яких виконується нерівність |
|
Обчислити добуток значень тих елементів, для яких справедливі нерівності аkn < -1 або аkn > 1 |
|
Обчислити кількість додатних елементів і їх добуток. |
|
Обчислити суму квадратів елементів, більших за 1. |
|
Обчислити добуток тих елементів масиву, для яких виконується нерівність |аkn| < 3. |
|
Обчислити кількість тих елементів масиву, для яких виконується нерівність аkn > 3 і суму елементів, менших за 9. |
|
Обчислити добуток відємних елементів. Визначити індекси максимального елемента. |
|
Обчислити добуток тих елементів масиву, для яких виконується нерівність 2 < аkn < 10. |
|
Обчислити добуток елементів перших двох рядків. |
|
Обчислити суму елементів масиву над головною діагоналлю. Визначити індекси мінімального елемента. |
|
Обчислити суму відємних елементів масиву. Знайти максимальний елемент. |
|
Знайти добуток мінімального і максимального елементів масиву. |
|
Визначити індекси мінімального і максимального елементів масиву. |
|
Обчислити добуток матриці на вектор та максимальний елемент отриманого вектора. |
|
Знайти добуток двох матриць та мінімальний елемент отриманої матриці. |
|
Знайти суму двох матриць та обчислити слід (суму діагональних елементів) отриманої матриці. |
Мета роботи: Навчитися використовувати власні процедури та функції при створенні програм. Оволодіння практичними навиками роботи з процедурами: процедури без параметрів, з параметрами, відкриті масиви; функціями і рекурсією.
Program Bank;
var X0: real; {початкова сума}
n : Byte; {термін внесення}
Procedure Initialize;
begin
Write ('Введіть суму внеску '); ReadLn(X0);
Write ('Введіть термін внеску '); ReadLn(n);
end;
Procedure Calculate;
Const p=8; {відсоток річних}
var Xn: real;
begin
Xn:=X0*Exp(n*Ln(1+0.01*p));
Write ('Сума складе: ',Xn:10:3 );
ReadLn;
end;
{Основна програма}
BEGIN
Initialize;
Calculate;
END.
program stepen;
const row=9;
column=5;
var i, j: word;
а,b: array[1..row,1..column] of real;
{Процедура піднесення в раціональний степінь від′ємних і додатніх чисел}
procedure degree(x: real; n,m: byte; var rez: real);
begin
if x>0 then rez:=exp(n/m*ln(x));
if x<0 then
if m mod 2 = 0 then rez:=exp(n/m*ln(abs(x)))
else rez:=-exp(n/m*ln(abs(x)));
if x=0 then rez:=0;
end;
{процедура для виводу горизонтальної лінії}
procedure gorline;
var k:integer;
begin
write('|');
for k:=1 to 30 do write('-');
write('|');writeln;
end;
{процедура для виводу від′ємних чисел}
procedure vivod(n,m: word; x: real);
begin
if x>=0 then exit;
writeln('| ',n,' | ',m,' | ',x:5:3,' |');
gorline;
end;
{ Основна програма. Введення чисел в двовимірний масив a[row,column]}
begin
writeln('Введення початкового масиву по рядках через пробіл');
writeln('в кінці рядка натисніть ENTER');
for i:=1 to row do
begin
write('рядок з номером ',i,': ');
for j:=1 to column do read(а[i,j]);
writeln;
end;
{Від кожного елемента беремо корінь 5-го ступеня}
for i:=1 to row do
for j:=1 to column do degree(а[i,j],1,5,b[i,j]);
writeln('вивід отриманого масиву чисел по рядках');
for i:=1 to row do
begin
write('рядок з номером ',i,': ');
for j:=1 to column do write(b[i,j]:5:3,' ');
writeln;
end;
writeln('виведення від′ємних елементів масиву');
gorline;
writeln('| рядок | стовпець | елемент |');
gorline;
for i:=1 to row do
for j:=1 to column do vivod(i, j, a[i,j]);
end.
program pr;
procedure inpm(var m:array integer);
var i:integer;
begin
writeln('вводимо елементи масиву');
for i:=0 to high(m) do
begin m[i]:=random(100);
write(m[i]:4)
end; writeln;
end;
procedure sortm(var m:array integer);
var i,j,buf,n:integer;
begin
n:=high(m);
for i:=1 to n do
for j:=n downto i do
if m[j]<m[j-1] then
begin buf:=m[j];
m[j]:=m[j-1];
m[j-1]:=buf;
end;
end;
procedure outm(var m:array integer);
var i:integer;
begin
for i:=0 to high(m) do write(m[i]:4);
writeln;
end;
{основна програма}
var m1:array[1..10] integer;
m2:array[1..15] integer;
m_res:array[1..25] integer;
begin
randomize;
writeln('мас м1'); inpm(m1); sortm(m1); outm(m1);
writeln('мас м2'); inpm(m2); sortm(m2); outm(m2);
end.
Var al,a2,a3,a4,x,y: Integer;
Function Max2(а,b:Integer): Integer;
begin
if a>b then Max2:=a else Max2:=b
end;
BEGIN
Write ('Введіть чотири цілі числа ') ;
ReadLn (al,a2,a3,a4); {1- з використанням проміжних змінних}
х:=Мах2(а1,а2); у:=Мaх2 (а3,а4);
WriteLn (' 1: ',Мах2(х,у));
{2-з використанням тільки звернень до функції}
WriteLn('2: ',Max2(Max2(а1,а2),Max2(а3,а4)));
END.
program fibonachi;
uses crt;
function F(n:word): longint; {рекурсивна функція}
begin
if keypressed then halt;
if (n=0) or (n=1) then F:=1
else F:=F(n-2)+F(n-1);
end;
function G(n:word): longint; {ітераційний метод}
var x,y,t: longint; k: word;
begin
x:=1; у:=1;
for k:=2 to n do
begin
t:=y; у:=x+y; x:=t;
end;
G:=y;
end;
var n:word; {Основна програма}
begin
clrscr;
Writeln('Введіть номер числа Фібоначчі'); readln(n);
writeln('Рекурсивний алгоритм : F(',n,')= ',F(n));
writeln('Ітераційний алгоритм: F(',n,')= ',G(n));
end.
№ варіанту |
Задача |
|
Скільки чоловік в кожному з відділів працювало більше 15 днів? |
|
У кого якнайменший заробіток в кожному з відділів? |
|
Кому нараховано більше 100 у.о. в кожному відділі? |
|
Скільки людино-дня було відпрацьовано в кожному відділі? |
|
Який середній заробіток в кожному відділі? |
|
Скільки співробітників отримали більше 50 і менше 120 у.о.? |
|
Скількох чоловік працювало менше 10 днів? |
|
Яку суму податку заплатили в кожному відділі? |
|
Хто заплатив найбільший податок в кожному з відділів? |
|
У скількох співробітників податкові вирахування переважили 20 у.о.? |
|
Який середній податок був в кожному відділі? |
|
В якому відділі більший середній заробіток? |
|
Хто сплатив найменший податок в кожному відділі? |
|
Скільки чоловік в кожному відділі працювало тільки один день? |
|
У скількох чоловік заробіток вище середнього? |
|
В якому відділі менший середній заробіток? |
|
У скількох чоловік заробіток відхиляється від середнього менше ніж на 10% ? |
|
В якому відділі був зафіксований найбільший заробіток? |
|
Скільки співробітників відпрацювали більше 5 і менше 12 днів? |
|
Який середній заробіток перших п'яти співробітників в кожному відділі? |
|
У скількох чоловік заробіток був менше середнього? |
|
Який середній заробіток останніх чотирьох чоловік в кожному відділі? |
|
В якому відділі була відпрацьована більша кількість людино-дня? |
|
Хто заробив більше 100, але менше 200 у.о.? |
|
Скільки співробітників відпрацювали 2, 3 або 4 дні? |
Мета роботи: навчитися працювати з окремими символами рядкових змінних, стандартними процедурами і функціями для роботи з рядковими змінними.
const m=4; n=3;
а:array [l..m] string=('Андрєєв','Григорьєв','Іванов','Сидоров');
b:array [l..n] string=('Васильєв','Петров','Яковлев');
var з:array [l..m+n] string;
к,i,j:integer; {індекси трьох масивів}
begin
i:=1; j:=1;
for к:=1 to m+n do
if (i>m) or (b[j]<a[i]) then {якщо індекс i вийшов за межі масиву а або b[j]<a[i] }
begin
с[k]:=b[j]; j:=j+l;
end
else begin
с[k]:=a[i]; i:=i+1;
end;
writeln('Массив с:');
for к:=1 to m+n do write(с[k],' ');
end.
var text, word1, word2:string;
i,k:integer;
begin
write('введіть текст='); readln(text);
write('word1='); readln(word1); write('word2='); readln(word2);
к:=length(word1);
for i:=1 to length(text)-(k-1) do
if сору(text,i,k)=word1 then begin
delete(text,i,k);
insert(word2,text,i);
end;
writeln(text);
end.
{$V-} { відключили перевірку повної сумісності типів }
var s:string[80];{ формальний і фактичний параметри різних типів }
procedure delspace(var s:string);
begin
{пропуски видаляються до тих пір, поки функція роz видає ненульовий результат при пошуку}
while роs{' ',s)>0 do delete(s,роs(' ',s),l); {подвійного пропуску в рядку}
if s[l]=' ' then delete(s,l,l); { видаляємо з початку рядка }
if s[length(s)]=' ' then delete(s,length(s),1); { і кінця }
end;
procedure itd_itp(var s:string);
const а:array[1..4] string[15]=('і т. д.', 'і тому подібне','т. як.', 'т. т. ') ;
al:array[1..4] string[5]=('і т.д', 'і т.п', 'т.як', 'т.т');
var к,p: integer;
begin
for к:=1 to 4 do begin { скорочуємо кожну з 4 фраз }
while роs(а[k],s)>0 do
begin { поки зустрічається фраза }
p:=pos(а[k],s); {визначаємо номер першого символу фрази} delete(s,p,length(а[k])); { видаляємо фразу }
{ якщо після фрази стояла крапка, то не додаємо останню '.'}
if s[p]='.' then insert(a1[k],s,p)
else insert(a1[k]+'.',s,p);
end; end; end;
begin
writeln('Введіть рядок тексту:'); readln(s);
delspace(s); itd_itp(s);
writeln('Скорочений варіант:'); writeln(s)
end.
№ варіанту |
Задача |
|
Вивести ім'я і кількість букв в третьому слові. |
|
Визначити скільки букв 'а' є в прізвищі. |
|
Вивести три букви (свої ініціали) з крапками. |
|
Вивести довжини прізвища і імені. |
|
Вивести прізвище і ініціали. |
|
Вивести ім'я і кількість букв в прізвищі. |
|
Визначити скільки букв 'о' є в імені. |
|
Вивести найдовше слово. |
|
Вилучити всі букви 'а' і 'о' з прізвища. |
|
Вивести ім'я в стовпчик. |
|
Чи починається хоча б одне слово з букви 'М'? |
|
Всі букви 'и' в імені продублювати. |
|
Вивести прізвище і кількість букв в імені. |
|
Вивести ім'я в зворотному порядку. |
|
Вивести ім'я, по батькові і кількість букв в прізвищі. |
тексти задач і програм, створених на лабораторній роботі.
Теоретичні відомості до лабораторної роботи № 5 .
РЯДКИ (STRING)
Дані рядкового типу - це обмежена послідовність довільних символів (тобто елементів типу char). Постійні рядкового типу записують за допомогою двох штрих-символів (апострофів), що охоплюють текст. Рядок може мати від 0 до 255 символів. Наприклад, 'Україна', 'Львівська політехніка' " - порожній рядок нульової довжини, ' ' - рядок, що складається з одного символу-пропуску.
var <змінна> : string[n];
де п довжина рядка, n<256. Довжину рядка можна не вказувати. Наприклад
const slovo = 'University';
var frazal : string[45];
fraza2 : string;
Над змінними рядкового типу визначені операції об'єднання (символ операції +) і порівняння (< <= > >= = <>). Порівняння двох рядків здійснюється зліва направо до перших різних символів, причому 'А' < 'В', 'В' < 'С' і т.д. «Великим» вважається символ, який розміщений в алфавіті далі (він має більший номер в таблиці кодів комп'ютера ASCII). Числовий код символу дає функція ord, наприклад, ord('B')= 66, ord('A')= 65. Зворотну дію виконує функція chr: chr(66) дає 'В'.
Приклад. Хай tl = 'New', t2=' Year'. Тоді об'єднанням цих рядків буде
s := tl + t2 (результат: s = 'New Year').
Тут s > tl.
Приклад. Вивести на екран рядкові букви латинського алфавіту і їх коди можна таким чином:
for v := 'a' to 'z' do writeln(v, ord(v):5);
Для обробки даних рядкового типу призначені стандартні функції
Length (<рядок>) - визначає кількість символів в заданому рядку;
Сору (г, m, n) - дає п символів рядка r, починаючи з символа з номером т;
Concat (rl, r2 ..., гn) - об'єднує рядки rl ..., гn в один рядок;
Pos (rl, r2) - визначає № символу, з якого починається входження рядка rl в рядок г2.
і процедури
insert(rl <змінна>, n) - вставляє рядок rl в рядок, який заданий змінною, починаючи з позиції n;
delete(<змінна>, m, n) - видаляє n символів з рядка, який заданий зміною, починаючи з позиції m;
str(<число> <змінна>) - переводить числове дане в дане рядкового типу;
val(rl, si, s2) - засилає в числову змінну si числовий образ рядка rl. Якщо це можливо, то змінна s2 набуває значення 0, інакше - числове значення номера першого неприпустимого символу заданого рядка.
Вказана змінна передає в процедуру вхідне дане рядкового типу і одержує назад змінений рядок результат виконання процедури.
Приклад. Хай змінна Lvov має значення 'Львівська політехніка'. Розглянемо приклади функцій і їх значення:
Функція Значення
length(Lvov) 21;
сору(Lvov, 15, 11) 'техніка';
concat(Lvov,' - 2001') 'Львівська політехніка - 2001';
роs(V, Lvov) 15.
Наступні процедури присвоять змінній Lvov такі значення:
Процедура Значення змінної Lvov
Insert(Hy ', Lvov, 1) 'НУ Львівська політехніка'
delete(Lvov, 6, 16) 'Львів'
str(2001, Lvov) '2001'
val('1256', Lvovl, Ozn) Lvovl = 1256, Ozn = 0
Існує два способи обробки даних типу string. Перший: весь рядок користувач обробляє як єдине дане за допомогою описаних вище функцій і процедур. Другий: рядок розглядає як масив символів і обробляє її поелементно.
Приклад. Значення рядковим змінним frazal і fraza2 можна привласнити, а потім вивести їх на екран так:
frazal := 'Ви любите канікули?';
for i := 1 to 19 do read(fraza2[i]);
writeln(frazal); writeln(fraza2);
Задача. Кодування тексту. Видалити з деякої фрази а всі пропуски, коми і крапки, інші символи продублювати. Вивести результат.
program MyCode;
uses Crt;
var а, b, с : string;
i : integer;
begin
clrscr;
write('Введіть текст: '); readln(a); b:=";
for i := 1 to Length(a) do
begin
с := сору(а, i, 1); {або поелементно так: с := а[i];}
if (с <> ',') and (с <>'.') and (с <>' ' )then b := b + с + с
end;
writeln(b);
end.
Задача. Хай заданий рядок 'Я люблю Мерседес'. Визначити довжину рядка. Вивести на екран друге слово цього рядка.
program Stroka;
uses Crt;
const rl : string = 'Я люблю Мерседес';
var i, к, m, nl, n2 : integer;
begin
clrscr;
m := 0;
к:= length(rl); {Визначаємо довжину рядка}
writeln('Довжина рядка к =', к);
for i := 1 to к do {Перебираємо всі символи рядка}
if rl[i]= ' ' then begin {і шукаємо пропуск}
m := m + 1;
if m = 1 then nl := i; {Визначаємо номер першого пропуску}
if m = 2 then n2 := i {Визначаємо номер другого пропуску}
end;
for i := nl + 1 to n2 - 1 do write(rl[i]);
end.
Мета роботи: створювати і використовувати власні модулі, навчитися працювати із стандартними модулями Crt і GRAPH.
Unit КМ<№ групи >; { заголовок модуля }
interface { початок інтерфейсної частини }
var {оголошення загальнодоступних змінних )
procedure { заголовки загальнодоступних процедур }
implementation { початок виконуваної частини }
procedure { заголовки і тіла процедур }
end. { кінець модуля }
uses crt;
tуре direction=(right,down,left,up);
var с,x,y,h,k: integer;
procedure go(d:direction; n:integer);
begin
for к:=1 to n do
begin
case d
right: x:=x+2; down: у:=y+1;
left: x:=x-2; up: у:=y-1;
end;
с:=random(15)+l; textcolor(c);
gotoxy(x,y); write('*); delay(10000);
end;
end;
begin
clrscr; x:=39; у:=13; h:=1;
gotoxy(x, у); write('*');
repeat
go(right,h); go(down,h); h:=h+1;
go(left,h); go(up,h); h:=h+1;
until h>24;
end.
Program RisCircle10;
uses Crt,Graph;
var driver,mode,r,n:integer;
begin
clrscr; driver:=detect;
initgraph(driver,mode,' ');
r:=10;
while r<=100 do
begin
setcolor(r div 10);
circle(320,240,r); r:=r+10;
end;
setcolor(red);
rectangle(220,140,420,340); readln;
end.
program MySun;
uses Crt, Graph;
var driver, mode, i : integer;
begin
clrscr;
driver := detect;
initgraph(driver, mode ");
i := 0;
while i <= 750 do
begin
setcolor(14); setbkcolor(3); setfillstyle(l, 14); circle(i, 100, 50);
floodfill(i, 100, 14); delay(200); setfillstyle(l, 3); setcolor (3);
circle(i, 100, 50); floodfill(i, 100, 3);
i := i + 5
end; readln
end.
№ |
Частина екрану |
Фігура 1 |
Фігура 2 |
|
Верхня половина |
Коло |
Квадрат |
|
Нижня половина |
Прямокутник |
Коло |
|
Ліва половина |
Трикутник |
Еліпс |
|
Права половина |
Еліпс |
Прямокутник |
|
Верхня права чверть |
Квадрат |
Трикутник |
|
Нижня ліва чверть |
Коло |
Еліпс |
|
Нижня права чверть |
Прямокутник |
Коло |
|
Верхня ліва чверть |
Трикутник |
Прямокутник |
|
Весь екран |
Еліпс |
Трикутник |
Теоретичні відомості до лабораторної роботи № 6.
Модулі.
Процедури і функції для графічних побудов.
Розглянемо процедури модуля Graph, призначені для графічних побудов:
initgraph (driver, mode <шлях до драйвера>) - задає графічний режим. Шлях до файла-драйвера вказують (в апострофах), якщо його немає в каталозі, з якого запускається середовище програмування;
detectgraph (<драйвер> <режим>) - повертає значення характеристик дисплея;
setcolor (<колір>) - задає колір майбутнього зображення;
setbkcolor (<колір>) - задає колір фону;
putpixel (х, у <колір>) - висвічує точку (х, у) заданим кольором;
line (xl, yl, х2, у2) - малює лінію між двома заданими точками;
lineto (х, у) - малює лінію від поточної точки до точки (х, у);
linerel (dx, dy) - малює лінію від поточної точки із заданими приростами;
rectangle (xl, yl, x2, y2) - малює прямокутник із заданими координатами діагонально протилежних вершин (лівої верхньої і правої нижньої);
setviewport (xl, yl, x2, y2, true) - задає координати нового графічного вікна. Логічна постійна true задає режим відсікання зображення, яке виходить за рамки вікна;
bar (xl, yl, х2, у2) - малює зафарбований прямокутник;
bar3d (xl, yl, х2, у2 <обємна глибина>, true) - малює паралелепіпед;
circle (х, у, R) - малює коло радіусу R з центром в точці
arc (x, у <початковий кут> <кінцевий кут> <радіус>) - малює дугу;
pieslicc (х, у <початковий кут> <кінцевий кут> <радіус>) малює зафарбований сектор;
ellipse (х, у <початковий кут> <кінцевий кут> <горизонт. радіус> <вертик. радіус>) - малює еліпс або дугу еліпса;
setfillstyle (<заповнення> <колір>) - задає спосіб заповнення замкнутої області залежно від значення параметра заповнення: 0 - заповнення кольором фону, 1 суцільне заповнення, 2 заповнення товстими горизонтальними лініями, 3 - заповнення похилими лініями ..., 10 заповнення точками, 11 щільне заповнення точками;
floodfill (х, у <колір межі>) - заповнює замкнуту область, в якій знаходиться точка (х, у);
closegraph - закриває графічний режим;
outtext (<текст>) - виводить заданий текст з поточної позиції;
outtextxy (х, у <текст>) - виводить текст в заданому місці;
settextstyle (<шрифт> <напрямок> <розмір>) - задає вид символів, напрям виводу: 0 - горизонтально, 1 - вертикально, і розміри символів: 1, 2, 3.
Розглянемо деякі функції модуля Graph:
graphresult - повертає код помилки, якщо неможливо задати графічний режим, і 0 - у разі завдання;
getmaxx - повертає значення розміру екрану уздовж горизонталі;
getmaxy - повертає значення розміру екрану уздовж вертикалі;
getcolor - повертає значення поточного кольору;
getcolor(x.y) - повертає значення кольору точки (х, у);
getx, gety - повертають координати поточного пікселя.
Анімація.
Чергування засвічень і гасінь зображення використовують для імітації руху цього зображення на екрані. Перед черговим засвіченням об'єкт необхідно перемістити у напрямі його руху. Рух Зображення на екрані називають анімацією. Для імітації руху об'єкту на екрані потрібно виконати такий циклічний алгоритм:
Виведення тексту
Виведення тексту в графічному режимі виконується тільки засобами модуля graph. Зверніть увагу процедури модулів system і crt для виводу на екран не працюють коректно в графічному режимі, хоча і не видають ніяких помилок при виконанні. Це пояснюється різними принципами формування зображення в текстовому і графічному режимах. Не використовуйте в графічному режимі процедури write, writeln, clrscr, gotoxy і ін.
Процедури для виводу тексту приведені в таблиці.
Таблиця: вивід тексту.
Процедура |
Призначення |
OutText(Text) |
Виводить на екран рядок Text, починаючи з покажчика. Поточний покажчик переміщається в кінець рядка. |
OutTextXY(X, У, Text) |
Виводить на екран рядок Text, починаючи з точки (X, У). Положення поточного покажчика не змінюється. |
SetTextStyle(Font, Direction, CharSize) |
Встановлюється шрифт, напрям тексту (горизонтальний або вертикальний), розмір символів (коефіцієнт збільшення початкового розміру шрифту Font). |
SetTextJustify(Horiz, Vert) |
Способи вирівнювання тексту відносно заданої точки (X, У) для процедури OutTextXY. |
TextWidth(Stroka) |
Функція повертає ширину рядка тексту на екрані в пікселях, використовуючи встановлений шрифт. |
TextHeight(Stroka) |
Аналогічна функція, але повертає висоту рядка тексту. |
При виводі тексту необхідно пам'ятати, що всі шрифти, окрім DefauitFont (з номером 0), зберігаються в окремих файлах з розширенням chr. Стандартні варіанти цих файлів не містять російських букв, проте в даний час розповсюджуються перероблені файли з шрифтами, підтримуючі російський алфавіт. Більш того, є можливість створення своїх власних файлів з шрифтами, які реєструються в програмі за допомогою функції installUserFont, як параметр, який передається імені файлу з новим шрифтом (без розширення chr).
Таблиця: стандартні шрифти.
Позначення шрифту |
Значення (номер) |
Файл |
DefaultFont |
0 |
Ні |
TriplexFont |
1 |
Tripp.chr |
SmallFont |
2 |
Litt.chr |
SansSerifFont |
3 |
Sans.chr |
GothicFont |
4 |
Goth.chr |
Для того, щоб вивести в графічному режимі змінні числового типу, можна скористатися стандартною процедурою str, яка дозволить перетворити числове значення в рядок тексту, а потім вивести отриманий рядок за допомогою процедур OutText або OutTextXY.
Приклад виводу тексту.
uses graph;
var gd,gm:integer;
begin
gd:=detect;
initgraph(gd, gm, ' ');
settextstyle(DefaultFont,HorizDir,3);
settextjustify(CenterText,CenterText);
setcolor(red);
outtextxy(320,240,' Текст в центрі екрану'); end.
Поняття модуля
Бібліотечний модуль оформляється як окремо компільована програмна одиниця, що містить різні елементи розділу описів і, можливо, деякі оператори. До складу модуля входять описи констант, змінних, типів, процедур, функцій. На практиці часто користуються терміном модуль, опускаючи прикметник.
Процедури і функції, що містяться в модулі, підключаються до програми, яка їх використовує, на етапі компоновки. Зберігається модуль як в початковому, так і у вигляді, що відкомпілювався (файли з розширеннями .pas і .tpu відповідно).
Тепер, нарешті, можна дати відповідь на питання, що краще всього робити з тими підпрограмами універсального призначення, які могли б використовуватися неодноразово при вирішенні різних задач. Зручно оформити такі процедури і функції (а також необхідні для їх роботи типи, константи, змінні) у вигляді окремих модулів.
По ходу роботи будь-який програміст звичайно накопичує для себе цілу колекцію таких корисних модулів свою особисту бібліотеку. А це означає, що йому доведеться писати менше коду для нових програм, адже він може багато разів використовувати свої старі розробки.
Структура модуля
Схожий текст будь-якого модуля можна розділити на декілька розділів:
Власне програмний код розташовується у виконуючій частині, іноді в ініціюючій частині. Заголовок та інтерфейсна частина задають назву модуля і перелік всіх програмних елементів, які надає даний модуль тим програмам або іншим модулям, які будуть його використовувати. Якщо провести аналогію модуля з книгою, то заголовок і інтерфейсну частину можна розглядати як обкладинку і зміст. Відповідно весь основний текст розташовується у виконуючій і ініціюючій частинах (в загальному вигляді структура модуля виглядає так:
Unit <імя>; { заголовок модуля }
{$R+} { можливо, глобальні директиви компілятора}
interface { початок інтерфейсної частини }
uses { список модулів }
label { оголошення загальнодоступних міток }
const { оголошення загальнодоступних констант }
type { оголошення загальнодоступних типів } {
var {оголошення загальнодоступних змінних )
procedure { заголовки загальнодоступних процедур }
function ... { заголовки загальнодоступних функцій }
implementation { початок виконуючої частини }
uses { що використовуються при реалізації модуля }
label { оголошення прихованих глобальних міток }
const { оголошення прихованих глобальних констант }
type { оголошення прихованих глобальних типів }
var { оголошення прихованих глобальних змінних }
procedure { заголовки і тіла загальнодоступних і прихованих процедур }
function { заголовки і тіла загальнодоступних і прихованих функцій }
begin { початок ініціюючої частини }
..... { тут можуть розташовуватися будь-які оператори }
end. { кінець модуля }
На практиці звичайно відсутні які-небудь оголошення, і в цілому структура виходить простіше.
Слід знати:
В середовищі Turbo Pascal є засоби, за допомогою яких способом компіляції модулів і полегшують розробку крупних програмних проектів. Результатом компіляції модуля є файл з тим же самим ім'ям і розширенням tpu (Turbo Pascal Unit), який можна зберегти на диску так само, як і ехе-файл.
Меню Compile, що управляє процесом компіляції, містить наступні опції:
Compile (клавіші <Alt>+<F9>);
Make (клавіша <F9>); ...
Build;
Destination (Memory, Disk);
Primary file
Перші три опції це режими компіляції. При компіляції модуля або основної програми в режимі Compile всі згадувані в ньому модулі повинні заздалегідь відкомпілюватися. Якщо який-небудь файл tpu не знайдений, то система шукає подібний файл з розширенням .pas, тобто файл з початковим текстом модуля, і при виявленні компілює його.
В режимі Make система стежить за можливими змінами початкового тексту модуля. Якщо в текст модуля були внесені які-небудь зміни, то система наново його компілює і тільки тоді приступає до компіляції основної програми. Крім того, якщо були внесені зміни в інтерфейсну частину модуля, то будуть перекомпільовані і всі інші модулі, що звертаються до нього.
В режимі Build автоматично компілюються всі модулі, незалежно від часу їх оновлення. Це найнадійніший, але і найповільніший режим підготовки модульної програми.
Опція Destination потрібна для завдання можливості збереження файлів .tpu (а також і ехе) на диску. Для цієї мети потрібно встановити опцію Destination в значення Disk (за умовчанням її значення Memory). В середовищі Borland Pascal файли ехе і tpu автоматично зберігаються на диску, там немає цієї опції в меню Compile.
Нарешті, останній пункт Primary file... дозволяє задати файл, який автоматично додаватиметься в початок початкового тексту перед компіляцією. У такий спосіб зручно відладжувати модулі, підключаючи до них початкову програму як Primary file. При цьому в процесі відладки не доведеться постійно переміщатися між вікнами основної програми і модуля.
Якщо модуль повністю відладжений і протестований, то можна поширювати його у вигляді tpu-файлу, приклавши до нього заголовок і інтерфейсну частину початкового тексту модуля як інструкції по використанню з докладними коментарями. Проте початковий код обов'язково повинен зберігатися в надійному місці, оскільки з tpu-файлу його відновити неможливо. З початкового коду отримати tpu-файл можна в лічені секунди: компілятор Turbo Pascal один з найшвидших.
В Turbo Pascal є набір стандартних модулів, їх склад міняється в (різних версіях, тому розглянемо основні: system, crt, graph, dos, printer. Модуль graph виділений в окремий tpu-файл, а інші входять до складу бібліотечного файлу Turbo.tpl (tpl - Turbo Pascal Library, бібліотека Turbo Pascal).
Зверніть увагу лише один модуль system зважаючи на виняткову важливість підключається до будь-якої програми автоматично, всі інші необхідно підключати, указуючи їх за словом uses.
Модуль system. Представляє основну бібліотеку стандартних підпрограм Turbo Pascal, без якої не може бути виконана жодна програма. В звичайних умовах роботи можна навіть не підозрювати про існування цього модуля, проте у разі відсутності або пошкодження файлу Turbo.tpl при запуску будь-якої програми тут же з'являється повідомлення File not found (SYSTEM.TPU) це компонувальник не може знайти файл модуля system, щоб сформувати код, який можна здійснити.
В модуль system входять всі основні стандартні процедури і функції (процедури вводу-виводу, робота з рядками, математичні операції і функції і т. п.). Оскільки цей модуль підключається автоматично, то процедури і функції, що входять в нього, вважаються вбудованими в Turbo Pascal.
Модуль crt. В нього входять процедури і функції, що забезпечують управління текстовим режимом роботи екрану, а також управління клавіатурою і звуком. Підпрограми, що входять в модуль, можуть керувати переміщенням курсора в довільну позицію екрану, міняти колір фону екрану і символів, що виводяться, створювати вікна, керувати звуком, читанням кодів натискуваних клавіш.
Модуль graph. Містить обширний набір типів, констант, процедур і функцій для управління графічним режимом роботи екрану. За допомогою підпрограм, що входять в модуль, можна створювати різноманітні графічні зображення.
Модуль dos. В модуль входять процедури і функції, які організовують доступ до всіх засобів дискової операційної системи MS-DOS. Більшість з них правильно працює і під управлінням різних версій Windows.
Модуль printer. Надає простий спосіб для виводу інформації на друкуючий пристрій.
ГРАФІКА
Графічний режим. Графічний екран дисплея складається з крапок, які можна засвічувати певним кольором або гасити, внаслідок чого на екрані створюється деяке зображення. Крапки називають пікселями. Кількість крапок на екрані може бути різною. Це залежить від якості монітора. Розглянемо екран, який має 640 крапок в горизонтальному (х) напрямі і 480 - у вертикальному (у). Початок відліку крапок знаходиться в лівому верхньому кутку екрану. Кожна крапка характеризується двома координатами (х, у). Приклади розміщення деяких крапок на екрані показані на малюнку 3.
Для побудови зображень спочатку потрібно задати графічний режим. Це робиться так:
<разділи описів і оголошень конкретної програми>;
{Змінні для визначення характеристик дисплея}
var driver, mode : integer;
begin
driver := detect; {detect - стандартна постійна}
{завдання графічного режиму}
initgraph (driver, mode ");
if graphresult <> 0 then
begin
writeln('Графічний режим задати не вдалось');
halt
end;
<текст конкретної програми з графічними командами>
end.
Кольори.
Кольори задають числами або англійськими назвами:
black=0 - чорний;
blue=l - синій;
green=2 - зелений;
суап=3 - блакитний;
red=4 - червоний;
magenta=5 - фіолетовий;
brown=6 - коричневий;
lightgray=7 - світло-сірий;
darkgray=8 - темно-сірий;
lightblue=9 - яскраво-синій;
lightgreen=10 - яскраво-зелений
lightcyan=11 - яскраво-блакитний;
lightred=12 - яскраво-червоний;
lightmagenta=13 - яскраво-фіолетовий;
yellow=14 - жовтий;
white=15 -білий.
Мета роботи: навчиться оголошувати записи, звертатися до полів запису за допомогою складового імені і оператора with, використовувати масиви записів.
program pr10_1; {вводить 10 студентів із 3 групп}
uses crt;
type student = record {опис типу запису}
fam: string[20];
name: string[10];
otch: string[20];
grup:string[10];
birthday: record
year: 1975..1989;
month: 1..12;
day: 1..31;
end;
end;
const kol=10;
var texnikum:array[1..kol] of student;
n:byte; c: string[10];
procedure input_data;
{процедура вводу даних яка використовує складені імена}
begin
writeln('введите данные студента #', n,': ');
write('фамилия '); readln(texnikum[n].fam);
write('имя '); readln(texnikum[n].name);
write('отчество ');readln(texnikum[n].otch);
write('группа '); readln(texnikum[n].grup);
write('год рождения '); readln(texnikum[n].birthday.year);
write('месяц '); readln(texnikum[n].birthday.month);
write('день '); readln(texnikum[n].birthday.day);
writeln;
end;
procedure write_data;
{процедура виведення даних -використовуємо оператор with}
begin
with texnikum[n] do begin
writeln('Фамилия студента ',fam);
writeln('Имя ',name);
writeln('Отчество ',otch);
writeln('Группа ',grup);
with birthday do begin
writeln('Год рождения : ',year);
writeln('месяц : ',month);
writeln('день : ',day);
end;
end;
end;
{основна програма}
var ckey: char;
begin
clrscr;
for n:=1 to kol do input_data; writeln;
{Створення меню}
repeat
clrscr;
writeln('1. Виведення даних про студента за номером');
writeln('2. Виведення даних за назвою групи ');
writeln('3. Вихід з програми');
ckey:=ReadKey;
case ckey of
'1': begin
write('введіть номер студента-->'); readln(n);
write_data;
end;
'2': begin
write('введіть групу -->'); readln(c);
for n:=1 to kol do
if texnikum[n].grup=c then write_data;
end;
'3': exit;
end;
writeln('введіть яку-небудь клавишу'); readkey;
until ckey=char(27); {27-код клавіші ESC}
end.
№ |
Задача |
|
Організуйте запис, що містить відомості про книгу. Виконайте сортування назв книг за абеткою. |
|
Організуйте масив записів, що містить інформацію про висоту гірських вершин, вказавши її в метрах. Знайдіть найвищу вершину. |
|
Опишіть запис і помістіть в неї наступні анкетні дані: прізвище, ім'я, по батькові учня, місце навчання (школа, клас), оцінки по трьох предметах. Необхідно передбачити обчислення середнього бала учня. |
|
Опишіть запис і помістіть в нього наступні анкетні дані: прізвище, ім'я, по батькові учня, місце навчання (школа, клас), оцінки по трьох предметах. Необхідно передбачити створення меню на проглядання даних окремо на кожного учня. |
|
Приклад сюжету: Створіть і виведіть на екран масив записів про автомобіль (назва моделі, рік випуску, ціна, колір), а також знайдіть в масиві і виведіть на екран назви моделей червоного кольору, які випускалися в 1999 році. |
|
В записі повинні міститися наступні дані про студентів групи: прізвище, ім'я, по батькові, рік народження, адреса, номер школи, бали по спецпредметах. Визначіть, по яких предметах в групі найнижча успішність і виведіть їх на екран. Критерій оцінки середній бал не вище 3,5. |
|
В записі повинні міститися наступні дані про автомобілі: марка, країна-виробник, рік випуску, кілометраж, колір, об'єм двигуна, витрата палива, вартість. Складіть рейтинг автомобілів по наступних критеріях: марка, вік автомобіля, країна виробник, вартість. |
|
В записі повинні міститися наступні дані про апаратне забезпечення комп'ютерів учбового класу: фірма-виробник процесора, частота процесора, об'єм оперативної пам'яті, розмір жорсткого диска, мережна карта. Складіть статистику комп'ютерів по наступних критеріях: фірма-виробник процесора, об'єм оперативної пам'яті, розмір жорсткого диска. |
|
В записі повинні міститися наступні дані працівниках організації: прізвище, ім'я, по батькові, рік народження, адреса, спеціальність, стаж. Визначити середній вік працівників по спеціальностях. |
|
В записі повинні міститися наступні дані про товари, що знаходяться на складі: код виробу, найменування, країна-виробник, вага одиниці товару, кількість, ціна одиниці. Складіть статистику товару по його сумарній вартості. |
|
В записі повинні міститися наступні дані про студентів групи: прізвище, ім'я, по батькові, рік народження, адреса, номер школи, місце мешкання (село/місто). Визначіть, де проживає більшість студентів (село/місто) і виведіть їх на екран. |
|
В записі повинні міститися наступні дані про автомобілі: марка, країна-виробник, рік випуску, кілометраж, колір, об'єм двигуна, витрата палива, вартість, наявність аварій у автомобіля. Складіть статистику автомобілів, що побували в аварії, по марці автомобілів. |
|
В записі повинні міститися наступні дані про працівників організації: прізвище, ім'я, по батькові, рік народження, адреса, спеціальність, оклад. Складіть статистику спеціальностей по зарплаті і виведіть витрати на зарплату по самій високооплачуваній спеціальності. |
|
В записі повинні міститися наступні дані про телевізійні канали: назва, країна, тематичний напрям, наявність супутникового віщання, середній час роботи в добу. Складіть статистику телевізійних каналів по тематичному напряму. |
Теоретичні відомості до лабораторної роботи № 7.
Поняття запису
Запис це структура даних, що складається з фіксованого числа компонентів, які називаються полями запису. На відміну від масиву, компоненти (поля) запису можуть бути різного типу. Щоб можна було посилатися на той або інший компонент запису, поля іменуються.
Структура оголошення типу запису така:
<Імя типу> = RECORD <список полів> END
Тут <імя типу> правильний ідентифікатор;
RECORD, END зарезервовані слова (запис, кінець);
< список полів > список полів; є послідовністю розділів запису, між якими ставиться крапка з комою.
Кожний розділ запису складається з одного або декількох ідентифікаторів полів, які відокремлюються один від одного комами. За ідентифікатором (ідентифікаторами) ставиться двокрапка і опис типу поля (полів).
Приклад 1.
Type BirthDay = record
day,month : byte;
year : word
end;
var
a,b : Birthday;
В даному прикладі тип BIRTHDAY (день народження) є запис з полями DAY, MONTH і YEAR (день, місяць, і рік); змінні А і В записи типу BIRTHDAY.
Як і в масиві, значення змінних типу запису можна привласнювати іншим змінним того ж типу, наприклад
а := b;
До кожного з компонентів запису можна отримати доступ, якщо використовувати складове ім'я, тобто вказати ім'я змінної, потім крапку та ім'я поля:
a.day := 27;
b.year := 1939;
Приклад 2.
type
BirthDay = record
day,month: byte;
year : word
end;
begin
…
if BirthDay.year = 1939 then …
end.
Щоб спростити доступ до полів запису, використовується оператор приєднання WITH:
WITH <змінна > DO <оператор>
Тут WITH, DO ключові слова (з, робити);
<змінна > ім'я змінної типу запис, за яким можливо, слідує список вкладених полів;
<оператор> будь-який оператор TURBO PASCAL.
Приклад 3.
with c.bd do month:=9;
це відповідно
with с do with bd do month : = 9;
або
with c,bd do month := 9;
або
c.bd.month= 9;
Поле запису може мати практично будь-який тип: масив, множина, інші записи. В останньому випадку елементи (поля, полів) мають ім'я, що складається з трьох частин. На практиці частіше всього використовують масиви записів, оскільки записи відображають табличну форму зберігання даних і застосовуються в різних додатках - від бухгалтерських задач до задач системного програмування. Порядок опису полів у визначенні запису задає їх порядок зберігання в пам'яті, а необхідний для цього об'єм складається з довжин полів.
Новий тип можна використовувати і для введення в програму констант, що типізуються.
Приклад 4.
Type
Point = record x,y: Real;
Vector = Array [0..1) of Point end;
Const Origin : Point = (X: 0.0; Y: 0.0);
Line : Vector = ((X: -1.9; Y: 1.7), (X: 2.0; Y: 1.7));
или
Type
Month = (Jan,Feb,Mar,Apr,May,Jun,Jly,Aug,Sep,Oct,Nov,Dec);
Date == record D: 1..31; M: Month; Y: 1917..2017 end;
Const BirthDate: Date = (D: 26; M: Jun; Y: 1985);
Приклад 5.
Багаж пасажира характеризується кількістю речей і загальною вагою речей. Є інформація про багаж декількох пасажирів - відповідні пари чисел. Підрахувати загальну кількість речей і з'ясувати, чи є пасажир, у якого багаж складається з однієї речі вагою не менше 30кг.
Const z:String[3]=' не' ;
total:Byte=0;
Турe In£o = record
q: Byte;
w: Real;
end;
Var luggage: Info;
i,n : Byte;
BEGIN
Write ('Введіть число пасажирів ');
ReadLn(n);
WriteLn('Введіть пари чисел (кількість і вага) ');
for i:=1 to n do
begin
ReadLn(luggage.q, luggage.w) ;
Inc(total,luggage.q);
if (luggage. q=1) and (luggage.w>=30) then z:= ' ';
end;
WriteLn('Сумарна кількість речей: ', total);
WriteLn(Шуканий пасажир', z,' знайшовся;
ReadLn;
END.
Визначимо тип Info - запис з двома полями. Імена полів q (кількість речей одного пасажира) і w (загальна вага речей одного пасажира); типи полів Byte і Real. Luggage - ідентифікатор змінної введеного типу. Введемо дані з клавіатури і, використовуючи складові імена полів запису luggage.q і luggage.w, знайдемо величини.
Оператор with
В операціях над записами оператор with зручно використовувати для короткого звернення до полів запису. В операторі with до полів однієї або більш конкретних змінних типу запис можна звертатися, використовуючи тільки ідентифікатори полів. Оператор with має наступний синтаксис:
With ЗміннаТипуЗапис Do Оператор; {звичайно складовий оператор}
Візьмемо наступний опис:
type
TDate = record
Day : Integer:
Month : Integer;
Year : Integer:
end;
var OrderDate: TDate;
З урахуванням даного опису наведемо приклад оператора with:
with OrderDate do
if Month = 12 then
begin
Month := 1;
Year := Year + 1
end else
Month := Month + 1;
Це еквівалентно наступному:
if OrderDate.Month = 12 then
begin
OrderDate.Month := 1;
OrderDate.Year := TDate.Year + 1
end
else
Date.month := TDate.Month + 1;
В операторі with спочатку проводиться перевірка кожного посилання на змінну, а саме: чи можна її інтерпретувати, як поле запису. Якщо це так, то вона завжди інтерпретується саме таким чином, навіть якщо є доступ до змінної з тим же ім'ям.
Допустимий опис наступних змінних:
type
TPoint = record
x,y: Integer;
end;
var
x: Point;
у: Integer;
В цьому випадку і до x, і до у можна звертатися, як до змінної або як до поля запису. В операторі:
with x do
begin
x := 10;
у := 25;
end;
x між ключовими словами with і dо відноситься до змінної типу покажчик, а в складовому операторі x і у посилаються на x.x і y.y.
Оператор:
with V1,V2...Vn do s;
еквівалентний операторам:
with V1 do
with V2 do
...
with Vn do
S;
В обох випадках, якщо Vn є полем і v1, і v2, то вона інтерпретується як v2.Vn, а не як v1.Vn.
Якщо вибірка змінної типу запис пов'язана з індексацією масиву або «разименованием» покажчика, то ці дії проводяться до того, як виконуватиметься складовий оператор.
Мета роботи: навчитись працювати з текстовими і типізованими файлами, створювати файл записів.
const sum: word=0; {лічильник: скільки разів знайшли}
var f1,f2: text;
str,search: string[80];
begin
write('Введіть рядок пошуку: '); readln (search);
{ зв'язуємо fl і f2 з іменами файлів }
assign(f1, 'Lab12_1.txt'); assign(f2,'analys.txt');
{ відкриваємо f1 і створюємо f2 }
reset(f1); rewrite(f2);
writeln('Протокол пошуку:');
writeln(f2,'Протокол пошуку:');
while not eof(f1) do {доки не закінчиться файл fl, виконуємо цикл }
begin
readln(f1,str); { вводимо рядок str з файлу fl }
if роs(search,str)>0 then
begin { шукаємо search в str }
inc(sum);
writeln('Знайдено (раз):',sum);
writeln(str); {виведення на екран}
writeln(f2,str); { виведення у файл }
end;
end;
close(f1); close(f2); { закриваємо файли }
end.
№ |
Задача |
|
Проаналізувавши вхідний текстовий файл, створіть аналогічний йому файл, виключивши з нього всі символи цифр. |
|
Поміняйте вміст рядків вхідного текстового файлу справа-наліво. |
|
Зчитуючи вхідний текстовий файл, позбудьтеся від кожних 4-х символів в рядку. |
|
Маючи 2 різні текстові файли, створіть третій, вмістом якого будуть рядки вхідних текстових файлів, що чергуються. |
|
У вхідному текстовому файлі позбудьтеся всіх символів, що не входять в буквений і цифровий набори. |
|
В початковому текстовому файлі обріжте всі рядки до шостого символу, у випадку, якщо рядок закінчується цифрою. |
|
У вхідному текстовому файлі позбудьтеся всіх рядків, що починаються не на цифру. |
|
Маючи початковий текстовий файл, створіть два аналогічні файли, і винесіть всі голосні букви в перший файл (довжина рядка 60), приголосні букви в другий файл (довжина рядка 50). |
|
В початковому текстовому файлі замініть всі символи відповідними ASCII-кодами. |
|
У вхідному текстовому файлі позбудьтеся всіх розділових знаків. |
program lr12_2;
uses crt;
type student = record {опис типу запису}
fam: string[20];
name: string[10];
otch: string[20];
grup:string[20];
birthday: record
year: 1975..1989;
month: 1..12;
day: 1..31;
end;
end;
f_student=file student;
var f1: f_student;
f2: text;
texnikum: student;
n:byte;
grup1: string[20];
fam1:string[20];
{процедура введення даних - використовуємо складові імена}
procedure input_data;
var otv:string[3];
begin
repeat
write('прізвище '); readln(texnikum.fam);
write('імя '); readln(texnikum.name);
write('побатькові '); readln(texnikum.otch);
write('група '); readln(texnikum.grup);
write('рік народження '); readln(texnikum.birthday.year);
write('місяць '); readln(texnikum.birthday.month);
write('день '); readln(texnikum.birthday.day);
write(f1,texnikum);
write('вводити ще дані про студента ТАК або HІ?->');
readln (otv);
until otv = 'nі';
end;
{процедура виводу даних -використовуємо оператор with}
procedure write_data;
begin
with texnikum do begin
writeln('Прізвище студента ',fam);
writeln(' Імя ',name);
writeln('Побатькові ',otch);
writeln('Група ',grup);
with birthday do begin
writeln('Рік народження : ',year);
writeln('місяць : ',month);
writeln('день : ',day);
end;
end;
end;
{пошук в базі даних по прізвищу, по групі}
procedure find(strl:string;kluch:char);
begin
reset(f1);
while not eof(f1) do begin
read(f1,texnikum);
with texnikum do begin
case kluch
'1': if fam = strl then write_data;
'2': if grup = strl then
begin write_data;
writeln(f2,fam:20,name:10,otch:20,grup:20,birthday.year,' ',birthday.month,' ',birthday.day)
end;
end;
end;
end;
close(f1); close(f2);
end;
{основна програма}
var ckey: char;
begin
assign(f1,'c:\tp7\texnik.dat');
assign(f2, 'c:\tp7\ t_grup.txt');
rewrite(f1); input_data; close(f1); writeln;
repeat {Створення меню}
clrscr;
writeln('1.Виведення даних про студента по прізвищу');
writeln('2. Виведення даних за назвою групи ');
writeln('3. Вихід з програми);
ckey:=ReadKey;
case ckey
'1': begin
write('введіть прізвище студента -->'); readln(fam1);
find(fam1,'1');
end;
'2': begin
write('введіть групу -->'); readln(grup1);
rewrite(f2);
find(grup1,'2');
end;
'3': exit;
end;
writeln('Натисніть будь-яку клавішу'); readkey;
until ckey=char(27); {27-код клавіші ESC}
close(f2);
end.
Теоретичні відомості до лабораторної роботи № 8.
Файли і робота з ними.
Для роботи з файлами в програмі необхідно визначити файлову змінну. TURBO PASCAL підтримує три файлові типи: текстові файли, файли, що не типізуються, файли, що типізуються.
Опис файлових змінних текстового типу проводиться за допомогою службового слова Text, наприклад:
var tStory: Text;
Опис типізованих файлів має вигляд:
var fComp: File T;
де T - тип компоненти файлу. Приклади опису файлової змінної, що типізується:
type M= array[1..500] Longint;
var f1: File Real;
f2: File Integer;
fLi: File M;
Файли, що не типізуються, описуються за допомогою службового слова File:
var f: File;
Файлові змінні, які описані в програмі, називають логічними файлами. Всі основні процедури і функції, що забезпечують введення - виведення даних, працюють тільки з логічними файлами. Фізичний файл повинен бути пов'язаний з логічним до виконання процедур відкриття файлів.
TURBO PASCAL вводить ряд процедур і функцій, що застосовуються для будь-яких типів файлів: Assign, Reset, Rewrite, Close, Rename, Erase, Eof, IOResult.
Процедура Assign( var f; FileName: String ) зв'язує логічний файл f з фізичним файлом, повне ім'я якого задано в рядку FileName.
Процедура Reset( var f ) відкриває логічний файл f для подальшого читання даних або, як то кажуть, відкриває вхідний файл. Після успішного виконання процедури Reset файл готовий до читання з нього першого елемента.
Процедура Rewrite( var f ) відкриває логічний файл f для подальшого запису даних (відкриває вихідний файл). Після успішного виконання цієї процедури файл готовий до запису в нього першого елемента.
Процедура Close( var f ) закриває відкритий до цього логічний файл. Виклик процедури Close необхідний при завершенні роботи з файлом. Якщо із якоїсь причини процедура Close не буде виконана, файл все-ж буде створений на зовнішньому пристрої, але вміст останнього буфера в нього не буде перенесений. Для вхідних файлів використання оператора закриття файлу необов'язково.
Логічна функція EOF( var f ): Boolean повертає значення TRUE, коли при зчитуванні досягнутий кінець файлу. Це означає, що вже прочитаний останній елемент у файлі або файл після відкриття виявився порожній.
Процедура Rename( var f; NewName: String ) дозволяє перейменувати фізичний файл на диску, пов'язаний з логічним файлом f. Перейменування можливо після закриття файлу.
Процедура Erase( var f ) знищує фізичний файл на диску, який був пов'язаний з файловою змінною f. Файл до моменту виклику процедури Erase повинен бути закритий.
Функція IOResult: Integer повертає ціле число, відповідне коду останньої помилки введення - виведення. При нормальному завершенні операції функція поверне значення 0. Значення функції IOResult необхідно привласнювати якій - небудь змінній, оскільки при кожному виклику функція обнуляє своє значення. Функція IOResult працює тільки при вимкненому режимі перевірок помилок введення - виведення або з ключем компіляції {$I-}.
Текстові файли
Особливе місце в мові ПАСКАЛЬ займають текстові файли, компоненти, яких мають символьний тип. Для опису текстових файлів в мові визначений стандартний тип Тext: послідовність символів. Рядки мають змінну довжину, кожний рядок завершується знаком кінця рядка.
З ознакою кінця рядка пов'язана функція EOLn(var T:Text):Boolean
де Т - ім'я текстового файлу. Ця функція приймає значення TRUE, якщо досягнутий кінець рядка, і значення FALSE, якщо кінець рядка не досягнутий.
Для операцій над текстовими файлами, окрім перерахованих, визначені також оператори звернення до процедур:
ReadLn(T) - пропускає рядок до початку наступної;
WriteLn(T) - завершує рядок файлу, в який проводиться запис, знаком кінця рядка і переходить до початку наступної.
Для роботи з текстовими файлами введена розширена форма операторів введення і виведення. Оператор
Read(T,X1,X2...XK)
еквівалентний групі операторів
begin
Read(T,X1);
Read(T,X2);
...........
Read(T,XK)
end;
Тут Т - текстовий файл, а змінні Х1, Х2...ХК можуть бути або змінними цілого, дійсного або символьного типу, або рядком. При читанні значень змінних з файлу вони перетворяться з текстового представлення в машинне.
Оператор
Write(T,X1,X2...XK)
еквівалентний групі операторів
begin
Write(T,X1);
Write(T,X2);
...........
Write(T,XK)
end;
Тут Т - також текстовий файл, але змінні Х1,Х2...ХК можуть бути цілого, дійсного, символьного, логічного типу або рядком. При записі значень змінних у файл вони перетворяться з внутрішнього представлення в текстовий.
До текстових файлів відносяться стандартні файли INPUT, OUTPUT.
Розглянуті раніше оператори введення - виведення є окремим випадком операторів обміну з текстовими файлами, коли використовуються стандартні файли введення виведення INPUT, OUTPUT.
Робота з цими файлами має особливості:
- імена цих файлів в списках введення - виведення не вказуються;
- змінні процедур Reset, Rewrite і Close до стандартних файлів введення - виведення заборонено;
- для роботи з файлами INPUT, OUTPUT введений різновид функції EOLn без параметрів.
TURBO PASCAL вводить додаткові процедури і функції, що застосовуються тільки до текстових файлів, це SetTextBuf, Append, Flush, SeekEOLn, SeekEOF.
Процедура SetTextBuf( var f: Text; var Buf; BufSize: Word ) служить для збільшення або зменшення буфера введення - виведення текстового файлу f. Значення розміру буфера для текстових файлів за умовчанням дорівнює 128 байтам. Збільшення розміру буфера скорочує кількість звернень до диска. Рекомендується змінювати розмір буфера до відкриття файлу. Буфер файлу почнеться з першого байта змінної Buf. Розмір буфера задається в необов'язковому параметрі BufSize, а якщо цей параметр відсутній, розмір буфера визначається завдовжки змінній Buf.
Процедура Append( var f: Text ) служить для спеціального відкриття вихідних файлів. Вона застосовується до вже існуючих фізичних файлів і відкриває їх для дозапису в кінець файлу.
Процедура Flush( var f: Text ) застосовується до відкритих вихідних файлів. Вона примусово записує дані з буфера у файл незалежно від ступеня його заповнення.
Функція SeekEOLn( var f: Text ): Boolean повертає значення True, якщо до кінця рядка залишилися тільки пропуски.
Функція SeekEOF( var f: Text ): Boolean повертає значення True, якщо до кінця файлу залишилися рядки, заповнені пропусками.
Об'єкти: форма, текстове поле, зображення, кнопка. Програмування кнопок.
Мета роботи. Створити форму «Анкета студента» з даними про себе і двома фотографіями (портретної і художньої), які перекривають одна одну і повинні з'являтися в результаті натиснення на кнопки. Ознайомитися з такими об'єктами: форма (Form), текстове поле (Label), малюнок (Image), кнопка (Button) і їх основними властивостями: підпис (Caption), колір (Color), шрифт (Font), видимість (Visible), ширина (Width), висота (Height) і іншими.
ХІД РОБОТИ.
procedure TForml.ButtonlClick(Sender: TObject);
begin
{Портретна фотографія стає видимою}
Image I. Visible: =True;
{Художня фотографія стає невидимою}
Image2.Visible:=False;
end;
end;
procedure TForml .Button2Click(Sender: TObject);
begin
{Портретна фотографія стає невидимою}
Image1.Visible:=False;
{Художня фотографія стає видимою}
Image2. Visible: =True;
end;
end;
№ п/п |
Задача |
|
Вставте у форму третю фотографію (вашого будинку або машини) і ще одну кнопку з відповідним підписом. |
|
Поміняйте підписи на кнопках на такі: «Змінити фотографію» і «Забрати фотографію», перепрограмувавши кнопки. Виконайте програму і переконайтеся в правильності її роботи. Підказка. В тексті процедур, що описують роботу кнопок, можна скористатися командами типу: if Image 1. Visible = True then ... {Якщо видимість = True або рівносильною командою} if Image 1. Visible then [Тут умова істинна } {якщо видимість включена} |
|
Поміняйте сценарій роботи програми для задачі 1,2 на наступний: відразу після запуску програми фотографій на формі невидно, є дві кнопки «Портретна фотографія» і «Заховати фотографію». Доступною є перша кнопка; після клацання на кнопці «Портретна фотографія», з'являється портретне фото, текст на першій кнопці -зміниться на «Художня фотографія», кнопка «Заховати фотографію» стане доступною; після клацання на кнопці «Художня фотографія», фотографія у формі повинна помінятися на художню, а підпис на цій кнопці на «Третя фотографія»; після клацання на кнопці «Третя фотографія» фотографія у формі повинна помінятися на третю, а підпис на кнопці «Портретна фотографія»; після клацання на кнопці «Заховати фотографію», фотографія повинна зникнути, а ця кнопка стати недоступною. Підказка. В тексті процедур, що описують роботу кнопок, можна скористатися командами, які міняють їх властивості: Сaption (підпис), Visible (видимість), Enabled (доступність). |
|
Див. умову задачі 3. Запрограмуйте кнопку «Сховати фотографію» так, щоб клацнувши на ній, вона ставала не тільки недоступною, але і невидимою |
|
Змініть програмний код рішення задачі 4 так, щоб, відключаючи фотографії, напис на першій кнопці завжди відповідав фотографії, яка повинна з'явитися після її натиснення. |
|
Виходячи з умови задачі 5, зробіть так, щоб послідовність перемикання фотографій не порушувалася послідовність їх відключення, а також додайте текстовий напис з назвою фотографії, видимої у нинішній момент. |
DELPHI 7.0
Об'єкти: поля редагування, перемикачі і їх властивості. Програмування розгалужень.
Мета роботи. Створити форму «Обмін валюти» для моделювання відповідних операцій обмінного пункту. Застосувати поля редагування (Edit) і перемикачі (RadioButton, радіокнопка), а також кнопки для виконання обчислень і виходу з програми.
ХІД РОБОТИ.
.
procedure TForml.RadioButton2Click(Sender: Tobject);
begin
{Міняємо напрям стрілки}
Label3.Caption := '=>';
Edit3.SetFocus {Активізуємо поле Edit3}
end;
Скористайтеся процедурою закриття вікна програми Close:
procedure TForml.Button2Click(Sender: TObject);
begin
Close (Закриваємо вікно програми]
end;
procedure Tforml.ButtonlClick(Sender: TObject);
var kursl, kurs2, summa : real;
cod : integer; ed : string[9];
begin
{Набуваємо значення курсу покупки}
Val (Editl.Text, kursl, cod);
{Набуваємо значення курсу продажу}
Val (Edit2.Text, kurs2, cod);
{Набуваємо числове значення суми в USD}
Val (Edit3.Text, summa, cod);
if RadioButton2. Checked = True then
summa:= summa * kurs2
else
summa := summa * kursl;
Str(summa:9:2, ed);
Edit4.Text := ed;
{Отримане число суми в гривнах перетворюємо в текстовий формат і результат присвоюємо властивості Text поля виведення у Edit4}
end
Для переривання роботи програми у разі неправильного введення вхідних даних виконаєте пункт головного меню Run Program Reset.
Виконайте пункт головного меню Project Build All.
№ п/п |
Задача |
|
Вставте в створену форму ще одну кнопку для очищення полів грошових сум. Виконайте програму і переконайтеся в правильності її роботи Підказка, Для об'єктів Edit3, Edit4 в процедурі обробки події натиснення на кнопку очищення використовуйте команду присвоєння їх властивостям Text порожнього рядка (") |
|
Забезпечте появу підказки «Введіть курс купівлі» і «Введіть курс продажу» після переміщення покажчика миші до полів Editl і Edit2 відповідно |
|
В процедурі для кнопки «Обчислити» передбачите 1% збору до пенсійного фонду від операції продажу |
|
Модифікуйте програму, ввівши додаткову можливість: після клацання мишею на стрілці змінюється тип операції (купівля, продаж). Запишіть в звіт фрагмент програмного коду, що реалізовує цю можливість. Виконайте програму Підказка. Для цього двічі клацніть на текстовому полі стрілки. Відкриється вікно програмного коду із заготівкою процедури Label3Click (опис дій у разі клацання на об'єкті Label3). В тілі цієї процедури можна скористатися командами вигляду: if RadioButtonl.Checked=True then begin {Міняємо напрям стрілки на => для Label3.Caption} {Встановлюємо перемикач в праве положення, змінюючи значення властивостей Checked об'єктів RadioButtonl і RadioButton2} end else begin {Встановлюємо напрям стрілки <=} {Встановлюємо перемикач в ліве положення, міняючи значення властивостей Checked об'єктів RadioButtonl і RadioButton2} end; |
|
В створену для задачі 4. форму вставте об'єкт групу перемикачів (RadioGroup) для вибору типу милі з двох можливих значень: морської або звичайної (1 морська миля = 1,852 кілометрів). Підказка. Щоб ввести підписи до перемикачів використовуйте властивість Items групи перемикачів RadioGroup, а для контролю вибору певного перемикача скористайтеся властивістю ItemIndex (дорівнює -1, якщо жоден не вибраний, 0 - якщо вибраний перший перемикач групи, 1 - якщо другий і т.д.) |
Теоретичні відомості до лабораторної роботи.
Об'єкт поле редагування Edit використовують для введення рядка символів з клавіатури. У разі потреби для перетворення отриманого рядка (властивість Text) в число і навпаки застосовують стандартні функції мови Pascal Val і Str, або функції середовища Delphi StrToFloat і FloatToStr. Окрім вже відомих вам властивостей, поля редагування Edit володіють такими:
Властивість |
Опис властивості |
Приклади значень |
CharCase |
Вид символів, які вводитимуть в полі редагування |
ecNormal (звичайна), ecUpperCase (прописні букви), ecLowerCase (рядкові букви) |
Ctl3D |
Об'ємне зображення об'єкту |
True, False |
Pass-wordChar |
Символ для введення пароля |
#0 (звичайне відображення тексту) *(текст відображатиметься зірочками), 0 (текст відображатиметься нулями) |
Readonly |
Можливість міняти текст (доступність поля) |
True (текст не можна міняти), False (текст можна міняти) |
Hint |
Текст підказки, який з'являється при наведенні покажчика миші |
«Введіть суму» (довільний рядок символів) |
ShowHint |
Показувати/Не показувати підказку |
True, False |
Text |
Текст в полі редагування |
«0,0001» (довільний рядок символів) |
Об'єкт перемикач (RadioButton) використовують для вибору деякої дії серед декількох альтернатив. Розглянемо такі властивості перемикачів:
Властивість |
Опис властивості |
Приклади значень |
Checked |
Стан перемикача |
True (вибраний), False (не вибраний) |
TabOrder |
Порядок вибору об'єкту клавішею Tab |
0 (перший), 4 (п'ятий) |
TabStop |
Доступ до даного об'єкту табулятором |
True (доступний), False (не доступний) |
DELPHI 7.0
Мета роботи: Створити форму для вирішення задачі табулювання функції. Створити головне меню (об'єкт типу MainMenu), що містить команди: вийти з програми, табулювати функцію, очистити поля виведення результатів, а також контекстне меню (PopupMenu) з командою для очищення поля виведення. Результати табулювання вивести в багаторядкове поле редагування (об'єкт типу Memo). Передбачити можливість виведення результатів на екран, у файл, в масив. Напрям виведення задати за допомогою трьох прапорців (об'єктів типу CheckBox), розташованих на панелі групи об'єктів (типу GroupBox).
ХІД РОБОТИ.
Зауваження. Щоб швидко вставити у форму декілька однотипних об'єктів, клацніть на піктограмі цього об'єкту, утримуючи натиснутою клавішу Shift, а потім - на формі необхідну кількість разів. Якщо випадково вставите зайвий об'єкт, то видалити його можна за допомогою клавіші Delete. Для відмови від режиму вставки клацніть на зображенні стрілки на палітрі компонентів. Розмір, стиль і колір шрифту виберіть на свій розсуд так, щоб форма виглядала якнайкраще.
Компоненту GroupBox знаходиться на закладці Standard. Поміняйте значення властивості Caption (підпис) цього об'єкту на слово «Виведення» (без лапок). Розмір, стиль і колір шрифту виберіть на свій розсуд. Збільште панель групи.
Для цього використовуйте компоненту CheckBox закладки Standard палітри компонентів Delphi. Вирівняйте прапорці, виділивши їх завчасно. Поміняйте значення властивості Caption (підпис) цих об'єктів: На екрані, У файл, В масив. Стиль і колір шрифтів виберіть на свій розсуд.
Для цього виділіть ці об'єкти і змініть значення їх властивостей Checked (контроль вибору) на True.
Компонента Memo знаходиться на закладці Standard. Збільште розміри поля. Значення властивості ScrollBars (наявність смуг прокрутки) цього об'єкту задайте як ssBoth (наявність двох смуг - вертикальною і горизонтальною). File Save All.
Для цього поміняйте значення властивості Text цих об'єктів. Для введення символу десяткової крапки застосуєте символ, передбачений операційною системою комп'ютера.
Для цього у вікні Object Inspector змініть значення властивості Lines (рядки) об'єкту Memol. Викличте вікно редагування цієї властивості (вікно String list editor - редактор багаторядкового поля), натиснувши на кнопку … . Видаліть слово Memo1 і для завершення роботи з цим вікном клацніть на кнопці OК
Компоненти MainMenu і PopupMenu знаходяться на закладці Standard. Розташуйте їх піктограми в довільному місці форми (на етапі виконання програми вони будуть невидимими).
Виберіть об'єкт MainMenu1 і двічі клацніть на значенні його властивості Items. Інший спосіб - двічі клацніть на самому об'єкті. Введіть назви команд головного меню форми.
Закрийте вікно створення команд головного меню Form1. MainMenu1.
Для цього аналогічно як для головного меню поміняйте значення властивості Items об'єкту PopupMenu1 у вікні Form1.PopupMenu1. У вікні Object Ispector введіть значення властивості Caption - «Очистити поле виведення» (без лапок). Можете придумати і задати ще декілька команд. Закрийте вікно Form1.PopupMenu1. Збережіть форму (Save All).
Методи об'єкту - це набір процедур і функцій, які аналогічно властивостям застосовують до об'єкту. Як і у разі властивості, ім'я об'єкту від імені методу відділяється крапкою. Клацніть по команді меню «Очистити поле виведення». З'явиться заготівка процедури реакції на подію виклику цієї команди. У неї запишіть команду виклику методу Clear для очищення поля виведення об'єкту Memo1:
procedure TForm1.N3Click(Sender: Tobject);
{Тут N3 - ім'я команди «Очистити поле виведення», у Вас може бути інший номер, його не виправляйте}
begin
{ Викличемо метод об'єкту Memo1, що очищає багаторядкове поле редагування }
Memo1.Clear
end; {Тепер клацніть на формі}
procedure TForm1.N6Click(Sender: Tobject); {Тут N6 - ім'я команди «Вихід»}
begin
Close { Закриваємо вікно програми}
end; {Тепер клацніть на формі}
Збережіть виконану на даний момент форму в своїй папці (FileSave All).
Двічі клацніть на команді контекстного меню «Очистити Поле виведення» у вікні Form1.PopupMenu1 (виклик цього вікна див. в п. 14). Текст процедури очищення такий же, як і для команди головного меню: Memo1.Clear (див. п. 16).
Клацніть на формі і задайте властивість форми PopupMenu як PopupMenu1
Потренуйтеся з багаторядковим полем редагування Memo1, вводячи і коректуючи в ньому деякий текст. Зверніть увагу на те, що в цьому вікні можна виконувати такі ж дії з текстом, як і в текстовому редакторові: виділяти фрагмент тексту, копіювати, переносити або видаляти цей фрагмент. Витріть текст за допомогою команди головного меню «Очистити поле виведення». Ще раз введіть текст і витріть його за допомогою контекстного меню (для виклику контекстного меню форми потрібно клацнути правою клавішею миші на вільному місці форми). Закінчіть роботу програми, клацнувши на кнопці «Вихід».
Властивість Lines об'єкту типу Memo комплексна, тобто воно також є об'єктом з своїми властивостями і методами. Результат роботи даної програми - це таблиця, яка складається з декількох рядків. Щоб додати в полі Memo1 новий рядок таблиці, треба поміняти значення комплексної властивості Lines (рядки) за допомогою його методу Add (додати) з одним аргументом - символьним рядком: Memo1.Lines.Add('рядок символів'). Клацніть на команді «Табулювати» з головного меню один раз. З'явиться заготівка до процедури, яку заповните так:
procedure TForm1.N2Click(Sender: TObject);
var x,y,h,a,b: real; cod:integer; str1,str2:string;
begin
{B об'єкт Memo1 вставляємо рядок з підписами стовпців значень аргументу і функції}
Memo1. Lines. Add(' X F(X)');
Val(Edit1.Text, а, cod); { Набуваємо числового значення лівої межі}
Val(Edit2.Text, b, cod); { Набуваємо числового значення правої межі}
Val(Edit3.Text, h, cod); { Набуваємо числового значення кроку}
х:=а; {Табулюємо функцію}
while x<=b+h/2 do
begin
y:=sin(x)+1;
Str(x:8:2,str1);
Str(y:8:3,str2);
if CheckBox1.Checked then
Memo1. Lines.Add(str1+str2); { Вставляємо рядок в полі Memo1}
x:=x+h;
end
end;
№п/п |
Завдання |
|
Додайте до контекстного меню команду «Вихід» і запрограмуйте її |
|
Створіть і запрограмуйте ще одне контекстне меню, що містить команди "Прибрати всі прапорці", "Включити всі прапорці", "Включити інверсивно". Таке меню повинне з'являтися після клацання правою клавішею миші в будь-якій точці панелі з прапорцями. Не забудьте "прив'язати" це меню (PopupMenu2) до панелі з прапорцями (див. пункт 19). |
|
Модифікуйте програму, передбачивши можливість табулювання функції і її похідної. Вибір варіанту (з похідній або без неї) здійснити за допомогою додаткового прапорця. Підказка. Виконайте такі дії: вставте у форму об'єкт типу CheckBox (прапорець), його властивості Caption привласніть значення «Похідна», виберіть для підпису шрифт Кирилиця 12-го розміру, вирівняйте вставлений об'єкт. Поміняйте програмний код кнопки «Табулювати», використавши в тексті процедури Button1Click такі команди: {Оголосіть змінні str1, str2, str3 як string на початку процедури} if CheckBox. Checked then {якщо прапорець встановлений} Memo1.Lines.Add(' X F(X) F (X)') { Рядок містить підписи для стовпців значень аргументу, функції і її похідної} else { Інакше - якщо прапорець не встановлений} { Рядок містить лише підписи для стовпців значень аргументу і функції} Memo1.Lines.Add(' X F(X) ') { А в циклі задаємо:} y:=sin(x)+1; {Обчислюємо значення функції} y1:=cos(x); {Обчислюємо значення похідної} if CheckBox.Checked then {Якщо прапорець встановлений} begin Str(x:8:2, str1); Str(y:8:2, str2); Str(y1:8:2, str3); str3 := str1 + str2 + str3 end; {Формуємо символьний рядок із значень аргументу, функції і її похідної, між якими вставляємо декілька пропусків} else {Якщо прапорець не встановлений} begin Str(x : 8 : 2, str 1 ); {Формуємо символьний рядок} Str(y:8:2, str2); {із значень аргументу і функції} str3 :== str1 + str2 end; Зауваження. Номери об'єктів у Вашій програмі можуть відрізнятися від приведених вище. |
|
Визначте кількість елементів масиву більших 0,5 і менших 1. |
|
Передбачте в створеній програмі додаткову можливість для визначення максимального і мінімального значень функції Підказка. У тілі процедури Button1Click, що описує програмний код кнопки «Табулювати», скористайтеся такими командами: (На початку процедури:} max:=sin(a)+1; {У циклі:} if max<y then max:=y; {Після циклу:} Str(max:8:3, str1); Memo1.Lines.Add('max=' + str1); |
|
Поміняйте процедуру команди «Табулювати» так, щоб для включеного прапорця «В масив» виведення результатів виконувалося в одновимірний масив. |
|
З вкладки Samples додайте на форму компонент Graph (якщо ви не знайшли даний компонент то зверніться до викладача). Даний компонент створений для побудови графіків. Розмістіть його в будь якому місці форми і розтягніть його на стільки, на скільки дозволяє вам розмір форми. Тепер потрібно додати графік. Для цього виділіть компонент, в вікні Object Inspector виберіть вкладку Prorerties і змініть деякі властивості компонента. MinXValue=-20; мінімальне значення по осі Х MaxXValue=20; максимальне значення по осі Х MinYValue=0; мінімальне значення по осі У MaxYValu:=3; максимальне значення по осі У Curves= натисніть один раз на кнопку «…» і в зявившимуся вікні створіть новий графік(натисніть один раз по кнопці з намальованою папкою). Недалеко від графіка створіть кнопку і запрограмуйте її наступним чином: procedure TForm1.sButton1Click(Sender: TObject); var x:real; begin form1.GraphM1.Curves[0].ClearPoints; //Очищаємо попередній графік якщо він був //числу Х даємо значення мінімального значення графіка по осі Х x:=form1.GraphM1.MinXValue; // Доки Х менше максимального значення по осі Х виконуємо наступні дії while x<form1.GraphM1.MaxXValue do begin //Додаємо до графіка нову точку form1.GraphM1.Curves[0].AddPoint(x,sin(x)+1); // Збільшуємо Х (0,1 це крок з яким змінюється Х); x:=x+0.1; end; end; |
|
Сумістіть процеси табулювання функції і побудови графіка тобто в початок процедури натиснення на кнопку «Табулювати» треба додати наступні поля: form1.graphm1.Curves[0].ClearPoints;\\ очищюємо графік form1.graphm1.MinXValue:=strtofloat(form1.sedit1.Text);\\ мінімальне значення по осі ОХ form1.graphm1.MaxXValue:=strtofloat(form1.sedit2.Text);\\ максимальне значення по осі ОХ form1.graphm1.MinyValue:=-1;\\ мінімальне значення по осі ОУ form1.graphm1.MaxyValue:=3;\\ максимальне значення по осі ОУ А в циклі знаходження У (while x<=b do) у кінці додати наступні строки: form1.GraphM1.Curves[0].AddPoint(x,y); |
DELPHI 7.0
Мета роботи. Створити бізнес-гру «Біржа цінних паперів», що моделює щорічне інвестування капіталу в акції трьох різних підприємств. На момент інвестування відомо, що на кінець року ринок може знаходитися в одному з трьох можливих з деякою вірогідністю станів, від чого будуть залежати прибутки або збитки інвестора. У таблиці 3x3 приведені значення прибутків або збитків на кожен вкладений долар для трьох можливих станів ринку і трьох підприємств (наприклад, Hundai, Philips, Bosh). Конкретний стан ринку вирішується вже після інвестиції. Потрібно, враховуючи всі три можливі стани ринку, інвестувати капітал у всі три підприємства з метою здобуття максимального прибутку. Інвестиції треба робити впродовж декількох років. Якщо це робити вдало, можна чекати прибуток (збільшення капіталу), інакше - підприємство чекають збитки. Навчитися застосовувати таблицю текстових рядків StringGrid, а також кнопки типу BitBtn і SpeedButton для виконання обчислень або стандартних дій. Ознайомитися з поняттям події в Delphi.
ХІД РОБОТИ.
Для цього застосуєте компоненти SpeedButton і BitBtn із закладки Additional палітри компонентів. На кнопках SpeedButton можна розташувати піктограму із спеціального набору піктограм - графічних файлів формату bmр. Кнопки типу BitBtn володіють властивістю Kind (стандартна дія) з можливими значеннями bkClose (Закрити), bkCancel (Відмінити), bkYes (Так), bkNo (Немає), bkHelp (Допомога) і іншими. На них також можуть бути розташовані піктограми. Якщо задати стандартну дію, то дану кнопку програмувати не потрібно. Задайте наступні значення властивостей вставлених об'єктів.
Властивість |
Значення |
||
Name |
SpeedButton1 |
SpeedButton2 |
BitBtn1 |
Caption |
&Біржові результати |
&Наступний рік |
&Вихід |
Glyph(Файл з піктограмою) |
С:\Program Files\Common Files\Borland Shared\ Images\Buttons\check.bmp |
С:\Program Files\ Common Files\ Borland Shared\ Images\Buttons\arrow3r.bmp |
|
Kind |
BkClose |
Символ & у заголовку кнопки вказує на те, що цю кнопку можна нажимати також і за допомогою «гарячої» комбінації клавіш Alt + буква заголовка, перед якою стоїть цей символ.
Скористайтеся компонентой StringGrid на закладці Additional. Задайте наступні значення властивостей цих об'єктів.
Властивість |
Значення |
||
Name |
StringGird1 |
StringGird2 |
StringGird3 |
ColCount (кількість стовпців) |
4 |
1 |
4 |
FixedCols (кількість фіксованих стовпців) |
1 |
0 |
1 |
RowCount (кількість рядків) |
4 |
4 |
1 |
FixedRows (кількість фіксованих рядків) |
1 |
1 |
0 |
OptionsgoEditing (можливість редагувати) |
False (відсутній) |
True (є) |
False (відсутній) |
Задайте наступні значення властивостей цих об'єктів:
Для Label5, Label6, Label8:
Caption : (видаліть зміст)
Visible : True.
Для Label9, Label10, Label11:
Caption : (декілька знаків «мінус»)
Visible : False.
Для Label7:
Caption : (видаліть зміст)
Visible : False.
Для Label1
Caption : Стартовий капітал на початок року складає 1000 доларів
Для Label2
Caption : Прогноз прибутків на кожен вкладений долар на кінець року
Для Label3
Caption : На початок року Ваш капітал складає
Для Label4
Caption : Прибуток (збиток) на кінець року складає
const
N=5;
{ Масив прогнозу прибутку}
Р : array [O..N-1,1..3,1..3] of integer =
(((40, -40.30), (-20, 10, 10), (-10,40,-30)), {r=(0-l)}
((50-70,40), (-30, 70.-30), (-50,20, 30)), {r=(l-2)}
((30-70,70), (-30, 70-30), (20,10-50)), {r=(2-3)}
((-50,-30,70), (50-50, 70), (30,50-70)), {r=(3-4)}
((30-70,70), (-30, 70-30), ( 40, 0.-50))); {r=(4-5)}
{Масив вірогідності}
Prob : array [0..N-1,1..3] of integer= ((22,41,37),(27,34,39),(47,33,20),(10,53,37),(41,34,25));
var
Forml : TForml; { Цей запис вже є в заготівці модуля}
capital, year, profit, r : integer;
{Інвестовані суми}
money : array [0..2] of integer;
procedure TForml.SpeedButton1Click(Sender: Tobject);
{Кнопка результатів року}
vаг first, second, variant, i, code : integer;
s : string;
begin
randomize;
{ Випадковий вибір можливого стану ринку}
variant := random(100);
{ Перший і другий роздільники відрізка вірогідності}
first := Prob[r, 1];
second := first + Prob[r, 2];
{ Стартове значення прибутку перед підсумком}
profit := 0;
for i := 0 to 2 do
val(StringGrid2.Cells[0,i + 1], money[i], code);
{ Отримуємо числові значення для інвестицій і заповнюємо ними масив money}
{Обчислення прибутку для першого варіанту}
if variant < first then
begin
for i := 0 to 2 do
{ Підсумок по підприємствах}
profit := profit + money[i]* P[r, i+1, 1];
{ Підкреслення вибраного варіанту}
Label9.Visible := True;
{ Інформаційний рядок}
Label8.Caption := 'Зросло євро' end;
{Обчислення прибутку для другого варіанту стану ринку}
if (variant >= first) and (variant < second) then
begin
for i := 0 to 2 do
{Підсумок по підприємствах}
profit := profit + money[i]* P[r, i+1, 2];
{Підкреслення вибраного варіанту}
Label 10.Visible := True;
Label8.Caption := ' підвищилась ціна ' {Інформаційний рядок}
End;
if variant > second then
begin
for i := 0 to 2 do
profit := profit + money[i]* P[r, i+1, 3];
Label 11.Visible := True;
Label8.Caption := ' Підвищився долар '
End;
Str(profit, s);
Forml.Label7.Caption := s + ' доларів';
Label7.Visible := True;
Forml.SpeedButton2.Enabled := True;
Forml.SpeedButtonl.Enabled := False;
End;
procedure TForml.SpeedButton2Click(Sender: Tobject);
{Кнопка переходу наступного року}
begin
year := year + 1; {Наступний рік}
capital := capital + profit; {Оновлений капітал}
{ Прибуток до початку року рівний нулю}
profit := 0;
{ Викликаємо процедуру щорічного оновлення форми}
Refresh;
{ Вимикаємо підкреслення варіанту стану ринку }
Label9.Visible := False;
Label10.Visible := False;
Label11.Visible := False;
{ Гасимо інформацію про прибуток}
Label7.Visible := False;
end;
procedure TForml.Refresh;
var i, j : integer;
s : string;
begin
Str(capital, s);
Forml.Label6.Caption := s + ' доларів ';
Str(year, s);
Forml.Label5.Caption := s + ' рік ';
Str(profit, s);
Forml.Label7.Caption := s + ' доларів ;
Forml.Label8.Caption := ' Введіть суму ' ;
Forml.SpeedButton2.Enabled := False;
Forml.SpeedButtonl.Enabled := False;
randomize;
r := random(N);
{Вибір інвестиційного клімату г}
for i:=l to 3 do
for j := 1 to 3 do
begin
Str(P[r, j, i], s);
Forml.StringGrid1.Cells[i, j] := s + ' центів ';
end;
for i := 1 to 3 do
begin
Str(Prob[r, i], s);
Forml.StringGrid3.Cells[i, 0] := s + ' %';
Forml.StringGrid2.Cells[0, i] := ";
end
end;
Рядок procedure Refresh;вставьте у будь-якому місці розділу
type TForml = class(TForm)... у вікні модуля.
Для цього двічі клацніть на формі і одержану заготівку процедури FormCreate заповните таким чином:
procedure TForml.FormCreate(Sender: TObject);
begin
capital := 1000;
year := 2000;
profit := 0;
Refresh;
StringGrid1.Cells[l, 0] := ' Зросте євро ';
StringGrid1.Cells[2, 0] := ' Зросте ціна ';
StringGrid1.Cells[3, 0] := ' Зросте долар ';
StringGrid1.Cells[0, 1] := ' Hundai ';
StringGrid1.Cells[0, 2] := ' Philips';
StringGrid1.Cells[0, 3] := 'Bosh';
StringGrid2.Cells[0, 0] := ' інвестиції $';
StringGrid3.Cells[0, 0] := ' Вірогідність ';
end;
Активізуйте об'єкт StringGrid2 і у вікні Object Inspector відкрийте закладку Events цього об'єкту. Тут слід вибрати подію, для якої ви хочете описати послідовність дій - реакцію на подію. Виберіть подію OnSetEditText і двічі клацніть в полі праворуч від неї. Відкриється вікно програми із заготівкою процедури StringGrid2SetEditText. Заповніть її таким чином:
procedure TForml .StringGrid2SetEditText(Sender:TObject; ACol, ARow: Longint; const Value: string);
var i, code : integer; s : string;
begin
{ Прочитуємо числа з першого і другого елементів таблиці, інвестицій}
for i := 0 to 1 do
val(StringGrid2.Cells[0, i + 1], money[i], code);
{ Обчислюємо залишок капіталу і інвестуємо його в третє підприємство]
money[2]:= capital - money[0] - money[1];
Str(money[2], s);
StringGrid2.Cells[0, 3] := s;
SpeedButton1.Enabled := True;
end;
Зауваження. Заготівки для подій-процедур кожного об'єкту можна викликати, двічі клацаючи по об'єкту на макеті форми, як це робилося для кнопок. Для більшості об'єктів це подія OnClick, у тому числі і для StringGrid. Тому ми були вимушені «вручну» вибрати потрібний для нашого випадку тип події OnSetEditText.
Введіть грошові суми інвестицій в комірки для першого і другого підприємств і спостерігайте за зміною третьої суми. Переконайтеся в її правильності. Клацніть на кнопці «Біржові результати», прогляньте результати фінансового року, клацніть на кнопці «Наступний рік». Зіграйте в цю гру кілька разів і закінчіть роботу програми, клацнувши на кнопці «Вихід».
№ п/п |
Завдання |
|
Інформаційний напис «Прибуток (збиток) на кінець року складає» поміняйте на «Прибуток на кінець року складає» або «Збиток на кінець року складає» залежно від того зріс або зменшився капітал гравця в кінці року в порівнянні з стартовим. |
|
Забезпечте виведення грошової суми прибутку зеленим кольором, а збитку - червоним. |
|
Не дайте можливості гравцеві ввести негативні грошові суми в таблицю інвестицій. |
|
Обчисліть і виведіть у формі всі грошові суми з точністю до цента. |
DELPHI 7.0
Мета роботи. Створити програму для роботи з базою даних телефонним довідником, сформованим у вигляді файлу записів. У кожному записі визначені поля: прізвище і ім'я (рядки завдовжки по 20 символів кожна), адреса і номер телефону (рядки завдовжки 100 і 15 символів відповідно). Необхідно реалізувати наступні операції: створення і видалення запису, збереження і причитування файлу записів з диска, редагування, пошук і сортування даних в алфавітному порядку, проглядання записів і навігацію по базі. Ознайомитися з новими об'єктами: багатосторінковим блокнотом (PageControl), сторінкою блокнота (TabSheet), комбінованим списком (ComboBox), діалоговим вікном (AboutBox), стандартними діалогами відкриття і збереження файлів (OpenDialog і SaveDialog)
ХІД РОБОТИ.
Виконайте File NewOtherЗакладка Forms Tabbed Pages Ok.
Для цього спочатку у вікні Object TreeView виберіть об'єкт PagesDIg (вікно форми з багатосторінковим блокнотом). Тільки тепер можна поміняти його заголовок і стиль.
Будьте уважні і не видалите весь багатосторінковий блокнот - об'єкт PageControl1. У разі потреби Ви можете відмовитися від неправильної дії командою Edit Undelete. Додати нову сторінку в блокнот можна командою New Page контекстного меню об'єкту PageControl (блокнот) або TabSheet (сторінка блокнота).
Задайте такі значення властивостей об'єкту StringGrid1:
Властивість |
Значення |
ColCount |
4 |
FixedCols |
0 |
RowCount |
100 |
FixedRows |
1 |
Options goEditing |
True |
За допомогою миші задайте ширину стовпців таблиці, наприклад так, як показано на малюнку. Для цього мишею пересуньте межу між двома стовпцями в першому рядку таблиці StringGrid1.
He допускайте появи горизонтальної смуги прокручування в таблиці.
Для створення об'єкту Комбінований Список скористайтеся кнопкою (ComboBox) на закладці Standard палітри компонентів. Кнопки «Попередній» - «Наступний» називаються Button1 Button4 відповідно. Очистите поля властивості Text об'єктів Edit1 - Edit5 і ComboBox1. Встановіть властивість Style об'єкту ComboBox1 в csDropDownList (випадний список).
Додайте на форму команди головного меню і введіть назви його
команд, як показано на малюнку.
Для того, щоб провести розподільну смугу, між командами меню «Записати у файл» і «Вихід» створіть додатковий пункт із заголовком «____________» .
Зауваження. Підменю «А->Я» і «Я->А» команди «Упорядкувати за абеткою» створюють за допомогою комбінації клавіш Сtrl+<стрілка вправо> або використовують контекстне меню Create Submenu цієї команди. Видалення непотрібної команди виконують клавішею Delete.
Додайте до проекту нове вікно форми типу About box (File NewOtherЗакладка Forms About box Ok). Поміняйте тексти і заголовок форми, вказавши своє прізвище, наприклад, так, як показано на малюнку.
Поміняйте зображення у вікні на свій розсуд, змінивши властивість Picture об'єкту Programlcon
У заготівку процедури обробки цієї команди введіть рядок для виклику методу Show (показати) об'єкту AboutBox: AboutBox .Show
Для цього повернітьсяё до форми «Про програму» і в процедурі OKButtonClick кнопки Ok введіть команду закриття активної форми: Close.
Зауваження. Вікно форми «Про програму» знаходиться під іншими вікнами Delphi.
Для цього викличте менеджер проекту командою View => Project Manager. Виділіть рядок із значенням Form1 і натисніть клавішу Delete. Закрийте вікно менеджера проекту.
Переконайтеся в правильності роботи закладок, комбінованого списку, наявності можливості редагувати поля таблиці і переміщатися по ним за допомогою смуги прокручування. Викличте вікно «Про програму» і закрийте його клавішею Ok. Закінчіть роботу командою Файл => Вихід.
Для цього перед розділом реалізації implementation додайте такі команди:
info = record
familia, imja : string[20];
adres : string[100];
tel : string[15];
end;
var PagesDlg : TPagesDlg;
F : file of info;
г : info;
N : integer;
Кнопки (OpenDialog) і (SaveDialog) знаходяться на закладці Dialogs панелі компонентів Delphi. Ці об'єкти розташовані в правому верхньому кутку форми.
procedure TPagesDlg.N3Click(Sender: Tobject); { Тут N3 - номер команди «Прочитати з файлу», у Вас може бути інший номер}
var i : integer;
begin { Виконання стандартного діалогу «Open file»}
if OpenDialog1.Execute then
begin
{F назва вибраного діалогом файлу (властивість FileName об'єкту OpenDialogl)}
AssignFile(F, OpenDialog1.FileName); Reset(F);
N := 0; {Читаємо з початку файлу}
while not eof(F) do {Прочитуємо всі записи з файлу}
begin
Read(F, r); { У змінну г прочитуємо поточний запис}
StringGridl.Cells[0, N+l] := r.familia; { Прізвище - в перший стовпець таблиці}
StringGridl.Cells[l, N+l] := r.imja; { Ім'я - в другий стовпець таблиці}
StringGridl.Cells[2, N+l] := r.adres; { Адреса - в третій стовпець таблиці}
StringGridl.Cells[3, N+l] := р. tel; { Телефон - в четвертий стовпець таблиці}
N := N + 1; { Збільшуємо загальне число записів N}
end;
CloseFile(F);
{ Описана нижче процедура заповнює поля редагування другої сторінки форми} NewEdit(ComboBoxl);
{ Описана нижче процедура заповнює комбінований список другої сторінки форми}
NewComboBox;
end
end;
procedure TpagesDlg.N4Click(Sender: TObject); { Тут N4 - номер команди «Записати у файл», у Вас може бути інший номер}
var i : integer;
begin
if SaveDialogl.Execute then
begin
AssignFile(F, SaveDialogl.FileName); Rewrite(F);
i:=l;
while StringGridl.Cells[3, i] <> " do
begin
r.familia := StringGrid1.Cells[0, i];
r.imja := StringGrid1.Cells[l, i];
r.adres := StringGrid1.Cells[2, i];
r.tel := StringGrid1.Cells[3, i];
Write(F, r);
i := i + 1;
end;
CloseFile(F);
end
end;
У вікні інспектора об'єктів активізуйте об'єкт PagesDlg (вікно форми з багатосторінковим блокнотом) і двічі клацніть в рядку OnCreate закладки Events цього об'єкту.
Сформуйте процедуру створення головної форми програми:
procedure TpagesDlg.FormCreate(Sender: TObject);
begin { Заповнюємо заголовок таблиці}
StringGrid1.cells[0, 0] := 'Прізвище';
StringGrid1.cells[l, 0] := 'Ім'я';
StringGrid1.cells[2, 0] := 'Адреса';
StringGrid1.cells[3, 0] := 'Телефон';
ComboBox1. Items .Add("); { Створюємо порожній рядок в комбінованому списку}
ComboBox1.ItemIndex:=0; {Активізуємо цей рядок на випадок створення нового довідника}
end;
Виклик цієї процедури здійснюється, зокрема, у момент вибору прізвища для пошуку, тобто у момент зміни активного рядка в комбінованому списку. Тому для ініціалізації заготівки цієї процедури активізуйте на закладці Events вікна Object Inspector об'єкту ComboBoxl рядок OnChange (Момент заміни) і в правому стовпці вкажіть назву процедури реакції на цю подію: NewEdit. Двічі клацніть мишею на введеній назві і заповніть заготівку цієї процедури таким чином:
procedure TPagesDlg.NewEdit(Sender: Tobject);
var i : integer;
begin
i := ComboBox1.Itemlndex + 1; {i - номер рядка даних в таблиці}
if i > 0 then
begin {Для значущих позицій комбінованого списку}
Edit1.Text := StringGrid1.Cells[0, i]; { копіюємо дані i-го запису з}
Edit2.Text := StringGrid1.Cells[1, i]; { першої сторінки форми в}
Edit3.Text := StringGridl.Cells[2, i]; {відповідні поля на другій сторінці}
Edit4.Text := StringGridl.Cells[3, i];
end
end;
Спочатку до опису типу класу (об'єкту) TPagesDlg (багатосторінкової форми) в розділі interface додайте декларацію:
type
{ Цей запис вже є в заготівці модуля}
TPagesDlg = class(TForm)
....
{ Необхідно вставити}
procedure NewComboBox;
...
У розділ implementation додайте опис цієї процедури:
procedure TPagesDlg.NewComboBox;
var i, j : integer;
begin
j := ComboBox1.ItemIndex; {Запам'ятовуємо активну позицію комбінованого списку}
ComboBox1.Clear; { Очищаємо комбінований список}
for i := 1 to N do {Для всіх N записів...}
{ У оновлений комбінований список додаємо всі прізвища з першого стовпця таблиці}
ComboBox1.Items.Add(StringGrid1.Cells[0, I]);
ComboBox1.ItemIndex:= j; { Переходємо на позицію j}
end;
procedure TPagesDlg.N6Click(Sender: Tobject); {Тут N6 номер команди. «Записати у файл», у {Вас може бути іншій}
var i : integer;
begin
i := ComboBox1.ItemIndex + 1; {Визначуємо номер активного запису}
if PageControl1.ActivePage=TabSheet2 then
begin {Якщо активна друга сторінка}
StringGrid1.Cells[0, i ] := Edit1.Text; {то вносимо зміни до першої }
StringGrid1.Cells[1, i] := Edit2.Text;
StringGrid1.Cells[2, i] := Edit3.Text;
StringGridl.Cells[3, i] := Edit4.Text;
end
else NewEdit(ComboBox1); {Інакше вносимо зміни до другої сторінки}
NewComboBox; {У обох випадках оновлюємо комбінований список}
end;
procedure TpagesDlg.Button1Click(Sender: Tobject);
begin
if ComboBox1.ItemIndex = 0 then {Зациклюємо список}
ComboBox1.ItemIndex := N-1
Else {У середині списку показник зменшується на одиницю}
ComboBox1.ItemIndex := ComboBox1.ItemIndex - 1;
NewEdit(ComboBox1); { Оновлюємо панель «Знайдений запис»}
end;
Програмний код створеної процедури запишіть в звіт.
№ п/п |
Завдання |
|
Запрограмуйте кнопку «Видалити» так, щоб після натиснення на ній видалялися дані з панелі «Знайдений запис» і з комбінованого списку |
|
Запрограмуйте кнопку «Знайти» так, щоб на панелі «Знайдений запис» відображалася інформація про особу, прізвище якої вказане в полі редагування Edit5 «Введіть прізвище». Якщо такого прізвища немає, то виведіть повідомлення про це в окремому вікні. |
|
Запрограмуйте команди підміню «А>Я» і «Я>А» пункту головного меню «Сортувати» так, щоб прізвища в таблиці і комбінованому списку були відсортовані в алфавітному або зворотному порядку. |
|
Видаліть команду «Зберегти зміни в списку записів» з головного меню і забезпечте збереження змін у момент редагування таблиці і полів на панелі «Знайдений запис». |
|
У разі спроби відкрити неіснуючий файл телефонного довідника забезпечте появу вікна з відповідним повідомленням. |
|
У момент виходу з програми забезпечте появу вікна для збереження файлу телефонного довідника у випадку, якщо в нім були зроблені зміни |
Мета: Навчитись використовувати компоненти: MainMenu, панель інструментів (ToolBar), ImageList, RichEdit, OpenDialog, SaveDialog, FontDialog.
ХІД РОБОТИ.
В даній лабораторній роботі за допомогою програмного коду опишемо процеси копіювання тексту, загрузки тексту файла в редактор і т.д.
В цьому пункті лабораторної роботи створимо інтерфейс програми.
На мал. 1 зображений кінцевий вигляд програми. Він допоможе побудувати інтерфейс програми.
Мал.
Для створення головного меню нам знадобиться компонент MainMenu з вкладки Standart .
Вставте цей компонент на форму і клацніть по ньому 2 рази. Перед вами відкриється вікно редагування меню.
Мал.
Для створення пункту меню натисніть на пусту кнопку і в вікні інспектора обєктів, на вкладці «Properties» у полі «caption» введіть назву пункту і натисніть ENTER. Після цього назва нової кнопки фіксується а відразу за нею створюється нова кнопка. Даний редактор легкий в використанні і в ньому можна розібратись на інтуїтивному рівні. Для створення роздільника як показано на мал. 3 у полі Caption достатньо ввести символ «-» і пункт меню перетвориться на роздільник.
Мал.
Для створення підменю як показано на мал. 4 клацніть правою кнопкою миші на пункті меню і виберіть в списку, що ниспадає пункт «Create Submenu». Створіть пункти меню і підменю, як показано на схемі 1.
Мал.
Файл Правка Формат
|-Новый |-Выделить всё |-Шрифт
|-Открыть |-Очистить всё |-Размещение-> |-По левому краю
|-Сохранить |-Роздільник |-По центру
|-Роздільник |-Копировать |-По правому краю
(символ «-» |-Вырезать
У полі Caption) |-Вставить
|-Выход
Схема 1
Умовні позначення на схемі: «|-»- пункт меню, «->»-під меню
На даному етапі створення інтерфейсу пункти меню будуть без малюнків, їх ми додамо потім.
Мал.
Для того, щоб користувач знав яку функцію виконує та чи інша кнопка, на них потрібно додати малюнки. Для цього слід виконати наступні дії:
Мал.
. Остання частина інтерфейсу - це поле редагування блокноту.
Компонент RichEdit є удосконаленням компонента Мемо. В ньому додана можливість форматування тексту (вибір розміра шрифту, положення, коліру тексту і т. д.)
Name |
txt |
Align |
alClient(зайняти всю вільну область) |
Lines |
очистити |
Значок |
Дія |
Код |
Зберегти файл |
//Якщо користувач ввів імя файлу і натиснув Ок то //зберігаємо файл if sd.Execute then txt.Lines.SaveToFile(sd.FileName); |
|
Відкрити файл |
//Якщо користувач вибрав файл і натиснув ОК то відкриваємо //файл txt.SelAttributes:=txt.DefAttributes; if od.Execute then txt.Lines.LoadFromFile(od.FileName); |
|
Закрити програму |
MainForm.Close; |
|
Вирізати |
txt.CutToClipboard; |
|
Копіювати |
txt.CopyToClipboard; |
|
Вставити |
txt.PasteFromClipboard; |
|
Властивості шрифту |
//Загружаємо данні настройки шрифту fd.Font.Assign(txt.SelAttributes); //Якщо користувач змінив настройки шрифту і натиснув Ок то //змінюємо настройки шрифту if fd.Execute then txt.SelAttributes.Assign(fd.Font); |
|
Вирівнювання по лівому краю |
txt.Paragraph.Alignment:=taLeftJustify; |
|
Вирівнювання по центру |
txt.Paragraph.Alignment:=taCenter; |
|
Вирівнювання по правому краю |
txt.Paragraph.Alignment:=taRightJustify; |
|
Звичайний текст |
txt.SelAttributes:=txt.DefAttributes; |
|
Жирний текст |
txt.SelAttributes.Style:=txt.SelAttributes.Style+[fsBold]; |
|
Нахилений текст |
txt.SelAttributes.Style:=txt.SelAttributes.Style+[fsItalic]; |
|
Підкреслений текст |
txt.SelAttributes.Style:=txt.SelAttributes.Style+[fsunderline]; |
Мал. 7
В даному випадку ця процедура називається ToolButton15Click.
Мал. 8.
«Выделить всё»: txt.SelectAll;
«Очистить всё»: txt.Lines.Clear;
Детальніше про властивості компонента RichEdit ви можете прочитати у файлі «Про RichEdit.htm» який додається разом з лабораторною роботою.
Завдання на самостійне опрацювання
№ п/п |
Завдання |
|
Використовуючи властивість Visible компонента RichEdit напишіть код, щоб при запуску програми поле редагування не було видно. Воно повинно буди видимим тільки після відкривання файлу або після створення нового файлу. |
|
Створіть додатковий пункт головного меню «Про програму». Створіть додаткове вікно, і в ньому опишіть короткі відомості про програму (автор, група і т.д. і т.п.). При натисненні на кнопку «Про програму» повинно зявлятись ваше новостворене вікно. |
|
Створіть додаткову процедуру яка б перевіряла, чи зберіг користувач новий файл або відкритий. Дане повідомлення повинно зявлятись тільки якщо користувач змінив файл. Щоб вивісти повідомлення на екран використовуйте функцію MessageDLG (детальніше про функцію в файлі MessageDLG.html). |
|
Створити додаткову кнопку на панелі інструментів і у пункті головного меню, яка б дозволяла створювати маркеровані списки (детальніше про списки можна прочитати в файлі «Про RichEdit.htm»). |
Нові компоненти: геометричні фігури, таймер, мультимедійний програвач, двійні кнопки та індикатор стану.
Мета роботи: Розібрати програму для оцінки ступеня знання англійської мови. Користувач повинен перетягувати малюнки під відповідні англійські слова. Застосувати індикатор часу, звукові ефекти і аналіз тестування. Навчитись працювати з компонентами: геометрична фігура (Shape), таймер (Timer), мультимедійний програвач (Media Player), двійна кнопка с полем редагування (Spin Edit), індикатор стану (Progress Bar).
ХІД РОБОТИ.
Задайте такі властивості обєктів
Обєкт |
Властивість |
Значення |
Timer1 |
Interval |
500 |
Timer2 |
Interval |
100 |
Play |
Visible |
False |
SpinEdit1 |
EditorEnabled |
True |
MaxValue |
10 |
|
MinValue |
1 |
|
Value |
5 |
|
Ok |
Glyph |
Load C:\ Program Files\Common Files\ Borland Shared\ IMAGES \BUTTONS\ check.bmp\OK |
Caption |
Готово |
|
Ex |
Glyph |
Load C:\ Program Files\ Common Files\ Borland Shared\ IMAGES \BUTTONS\dooropen.bmp |
Caption |
Вихід |
|
P1, P2,P3 |
Shape |
stRoundRect |
Pen -> Width |
2 |
|
Im1, Im2, Im3 |
Stretch |
True |
Label4 |
Font-Color |
Red |
Font-Size |
10 |
|
Caption |
Обовязково натисніть на кнопку "Далі" після розміщення рисунків!! |
|
L1, L2, L3 |
Font-Color |
Olive |
Font-Size |
16 |
procedure TForm1.Timer1.Timer(Sender: Tobject);
begin
label4.Visible:=not label4.Visible;
end;
var
main: Tmain;
shiftX,shiftY:integer;
i,n,score:integer;
left1,left2,left3,Stop:integer;
dir:string;
Const
//координати розташування малюнків при перетаскуванні на геометричні фігури
Etop=56; Eleft1=24; Eleft2=200; Eleft3=376;
folder='\img\';
k = 4; {Кількість запитань}
a: array [1..k, 1..3] of string = ( {імена малюнків}
('car.jpg', 'money.jpg', 'bomb.jpg'),
('coins.jpg', 'clock.jpg', 'tennis.jpg'),
('brick.jpg', 'building.jpg', 'champagne.jpg'),
('dice.jpg', 'donkey.jpg', 'door.jpg'));
b: array [1..k, 1..3] of string = ( {підписи малюнків}
('car', 'money', 'bomb'),
('coins', 'clock', 'tennis'),
('brick', 'building', 'champagne'),
('dice', 'donkey', 'door'));
checkf: array [1..k, 1..3] of integer = (
(2, 1, 3), {позиції розміщення підписів малюнків}
(3, 2, 1),
(2, 1, 3),
(1, 3, 2));
procedure Tmain.FormCreate(Sender: TObject);
begin
left1:=im1.Left; // Зберігаємо позиції малюнків
left2:=im2.Left; left3:=im3.Left;
Stop:=im1.Top;
n:=0; // Обнуляємо номер питання score:=0; // обнуляємо результат тесту
dir:=GetCurrentDir; // взаємо місце знаходження нашої програми
showmessage('Як будете готові, натисніть клавішу "Ок"'); // чекаємо готовності //користувача
setpicture; // встановлюємо малюнки
end;
Procedure SetPicture;
var
s:integer;
begin
;//якщо малюнки були здвинуті то повертаємо їх на своє місце
main.Im1.Top:=Stop; main.Im2.Top:=Stop; main.Im3.Top:=Stop;
main.Im1.Left:=Left1; main.Im2.Left:=Left2; main.Im3.Left:=Left3;
;//якщо всі малюнки були виведені, переходимо на обробку результатів тесту//
if n=4 then
begin
main.ExClick(main); exit;
end;
//Встановлюємо максимальне значення і позицію прогресноі панелі
main.progr.Max:=main.SpinEdit1.Value*100;
main.progr.Position:=main.SpinEdit1.Value*100;
//Вибираємо наступне питання
n:=n+1;
//Виводимо першу картинку
i:=1;
s:=checkf[n,i];
main.Im1.Picture.LoadFromFile(dir+folder+a[n,i]);
main.L1.Caption:=b[n,s];
inc(i);
//Виводимо другу картинку
s:=checkf[n,i];
main.Im2.Picture.LoadFromFile(dir+folder+a[n,i]);
main.L2.Caption:=b[n,s];
inc(i);
//Виводимо третю картинку
s:=checkf[n,i];
main.Im3.Picture.LoadFromFile(dir+folder+a[n,i]);
main.L3.Caption:=b[n,s];
//корегуємо розмір поля картинки відповідно до розмірів самої картинки
main.Im1.Width:=main.Im1.Picture.Width;
main.Im2.Width:=main.Im2.Picture.Width;
main.Im3.Width:=main.Im3.Picture.Width;
main.Im1.Height:=main.Im1.Picture.Height;
main.Im2.Height:=main.Im2.Picture.Height;
main.Im3.Height:=main.Im3.Picture.Height;
end;
procedure Information;
begin
//Зупиняємо таймери
main.Timer1.Enabled := False; main.Timer2.Enabled := False;
//Знаходимо кількість зароблених балів
score := (score * 100) div k;
main.play.FileName := ' ';
//якщо користувач набрав більш ніж 100 балів то запускаємо файл //«applause.wav»
if score > 70 then
main.play.FileName := dir+'\applause.wav';
If main.play.FileName <>' ' then
begin
main.play.Open; {Відкриваємо мулът. плеєр}
main.play.Play; {Відтворюємо звук }
End;
//Виводимо повідомлення
MessageDlg('Ви набрали'+IntToStr(score)+' балів зі 100', mtInformation,[mbOk], 0);
//Виходимо з програми
main.close;
end;
procedure Tmain.ExClick(Sender: TObject);
begin
information;//викликаємо підпрограму опрацювання результатів тесту
end;
procedure TForml.ImlMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
Begin
//тимчасова змінна Tag=1 якщо клавіша миші натиснена
Iml.Tag := 1;
//запамятовуємо координати натиснення миші в середині малюнка
shiftY := Y;
shiftX := X;
end;
procedure TForml.ImlMouseMove(Sender: TObject;
Shift: TshiftState; X,Y: Integer);
begin
if Iml.Tag = 1 then //якщо натиснена клавіша миші то
begin
//змінюємо координати малюнка
Iml.Top := Iml.Top + Y - shiftY;
Iml.Left := Iml.Left + X - shiftX;
end;
end;
procedure TForml.ImlMouseUp(Sender : Tobject;Button : TMouseButton; Shift : TShiftState;
X, Y : Integer);
Begin
im1.Tag:=0;
//Якщо малюнок знаходиться повністю в першій фігурі то розміщуємо його по центру фігури//
if position1(im1,p1) then
begin
im1.Top:=Etop;
im1.Left:=Eleft1;
exit;
end;
//Якщо малюнок знаходиться повністю в другій фігурі то розміщуємо його по центру фігури//
if position1(im1,p2) then
begin
im1.Top:=Etop;
im1.Left:=Eleft2;
exit;
end;
//Якщо малюнок знаходиться повністю в третій фігурі то розміщуємо його по центру фігури//
if position1(im1,p3) then
begin
im1.Top:=Etop;
im1.Left:=Eleft3;
exit;
end;
//Якщо малюнок не розташований в жодній з фігур то повертаємо його на своє місце
im1.Top:=stop;
im1.Left:=left1;
end;
Зверніть увагу, що програма не перевіряє, якою клавішею користувач переміщає малюнок. Тому малюнок можна переміщати як правою так і лівою кнопкою. Перевірити клавіші миші можна проаналізувавши аргумент Button (типа TMouseButton) приведених процедур: Button = {mbLeft (ліва кнопка), mbRight (права), mbMiddle (середня)}. Координати миші передаються в процедуру за допомогою аргументів X и Y типа integer.
function position1(img:Timage;Shape:Tshape):boolean;
begin
//результат функції буде дорівнювати TRUE якщо малюнок буде знаходитись в середені фігури, інакше результат функуції буде FALSE
if ((img.Left>shape.Left)and(img.top>shape.top))and (((img.Left+img.Width)<(shape.Left+shape.Width))and((img.top+img.height)<(shape.top+shape.height))) then
position1:=true
else
position1:=false;
end;
procedure Tmain.OkClick(Sender: TObject);
var
check1,check2,check3:integer;
begin
check1:=0;
check2:=0;
check3:=0;
//Аналізуємо розташування малюнків
//Якщо перший мал. знаходиться на першій фігурі то запамятовуємо номер фігури
if position1(im1,P1) then check1:=1;
//Якщо перший мал. знаходиться на другій фігурі то запамятовуємо номер фігури
if position1(im1,P2) then check1:=2;
//Якщо перший мал. знаход. на третій фігурі то запамятовуємо номер фігури
if position1(im1,P3) then check1:=3;
//Аналогічно прораховуємо для двух інших малюнків
if position1(im2,P1) then check2:=1;
if position1(im2,P2) then check2:=2;
if position1(im2,P3) then check2:=3;
if position1(im3,P1) then check3:=1;
if position1(im3,P2) then check3:=2;
if position1(im3,P3) then check3:=3;
//якщо перший малюнок на своєму містці, то результат буде дорівнювати 0
if check1=checkf[n,1] then check1:=0;
//якщо другий малюнок на своєму містці, то результат буде дорівнювати 0
if check2=checkf[n,2] then check2:=0;
//якщо третій малюнок на своєму містці, то результат буде дорівнювати 0
if check3=checkf[n,3] then check3:=0;
//якщо всі малюнки розташовані правильно то добавляємо бал
if (check1=0)and(check2=0)and(check3=0) then
score:=score+1;
//генеруємо нові малюнки
SetPicture;
end;
Якщо користувач не встиг розмістити малюнки за даний йому проміжок часу то він повинен почути звук «Дзінь» і побачити повідомлення про закінчення часу.
procedure Tmain.Timer2Timer(Sender: TObject);
begin
if (position1(im1,P1)or position1(im1,P2)or position1(im1,P3))and
(position1(im2,P1)or position1(im2,P2)or position1(im2,P3))and
(position1(im3,P1)or position1(im3,P2)or position1(im3,P3))
//якщо всі малюнки розставлені , то дозволяємо використання кнопки «Далі »
then ok.Enabled:=true
//в іншому випадку забороняємо
else ok.Enabled:=false;
//вираховуємо данні для індикатора часу
timer2.Interval:=SpinEdit1.Value*100;
progr.Position:=progr.Position-1;
//якщо час закінчився то
if progr.Position=0 then
begin
//зупиняємо таймер
timer2.Enabled:=false;
//запускаємо звук
play.FileName:=dir+'\ding.wav'; play.Open; play.Play;
//виводимо повідомлення
messagedlg('Вибачте, але ви не вклалися у даний вам проміжок часу…'+#13+'Довчіть англійську мову і спробуйте ще раз!',mtInformation,[mbOk],0);
//вимикаємо програму
main.Close;
end;
end;
№ |
Задача |
|
Забезпечте можливість перетягування малюнка лише лівою кнопкою миші |
|
Збільшить частоту появи напису «Обовязково натисніть кнопку «далі» після розміщення малюнків » |
|
Забезпечте індикацію оцінки за пройдений тест. Диапазону 100-86 балів, поставте оцінку "5", диапазону 78-85 балов - оцінку "4", 51-77 - оцінку "3", менше 51 бала - оцінку "2". Підберіть звукові ефекти для різних випадків |
|
Підберіть нормальну швидкість для SpinEditl і зробіть його недоступним для внесення змін |
|
Видаліть обєкт SpinEditl і задайте саму вдалу швидкість в самому проекті |
|
Збільшить кількість питань з малюнками і підписів до них |
Delphi 7.
Мета роботи: Навчитись працювати з файлами.
ХІД РОБОТИ.
Всі питання, а також правильні і неправильні відповіді будуть зберігатися не в коді програми, а в зовнішньому INI-файлі, в якому всі дані розбиті на розділи.
; початок файлу
[num]
num=3
[Questions]
1=Скільки клавіш на клавіатурі?
2=Основна несправність миші?
3=Основні файлові системи:
[Answers]
1=101
2=забруднення
3=FAT, NTFS
[Wrong]
1=100
11=96
111=116
2 =зависання
22=залипання
222=заїдання
3=AFX, KFX
33=ATF,NFTS
333=TAF,TNFS
Перший рядок - це коментар. Тут можна писати все, що завгодно. Перший розділ num містить тільки один параметр з таким же ім'ям, який вказує на кількість питань в тесті. Цей параметр знадобиться для того, щоб питання задавалися в довільній послідовності. Наступний розділ - Questions. У ньому знаходяться всі питання. У розділі Answers знаходяться правильні відповіді. У розділі Wrong знаходяться неправильні відповіді.
Для того щоб не створювати три розділи, кожен з яких містить неправильний варіант відповіді, використовуємо ідентифікацію за номером питання. Неправильні відповіді до першого питання знаходяться в параметрах 1, 11 і 111, до другого - в параметрах 2, 22 і 222, до п'ятнадцятого - в параметрах 15, 1515, 151 515 і т.д.
Властивості форми гри "О, щасливчик"
Властивість |
Значення |
Пояснення |
BorderStyle |
bsSingle |
Тепер ніхто не зможе змінити розмір вікна і зробити нашу гру не привабливою. |
Caption |
Вітаємо вас на грі "О, счастливчик"! |
Заголовок вікна |
Height |
414 |
Висота |
Width |
380 |
Ширина |
Компонент |
Властивість |
Значення |
Пояснення |
Buttonl, Button2 |
Caption |
Наступне питання >>>> |
Кнопка використовується для переходу до слідуючого питання |
Left |
104 |
Відступ зліва |
|
Top |
356 |
Відступ зверху |
|
Button2 |
Visible |
False |
При запуску програми кнопка відповіді на друге питання не видна |
RadioGroupl |
Caption |
Варианты ответов |
Заголовок группи перемикачів |
Font.Style |
[fsBold] |
Шрифт напівжирний |
|
Font.Color |
clBlue |
Колір шрифта синій |
|
Height |
90 |
Висота |
|
Left |
12 |
Відступ зліва |
|
Top |
256 |
Відступ зверху |
|
Width |
348 |
Ширина |
|
RadioButtonl |
Name |
an1 |
Перший варіант відповіді |
Caption |
Без надпису |
||
Font.Style |
[fsBold] |
Шрифт напівжирний |
|
Font.Color |
clNavy |
Шрифт темно-сиій |
|
RadioButtonl |
Left |
24 |
Відступ зліва |
Top |
280 |
Відступ зверху |
|
Width |
160 |
Ширина |
|
RadioButton2 |
Name |
an2 |
Другий варіант відповіді |
Caption |
Без надпису |
||
Font.Style |
[fsBold] |
Шрифт напівжирний |
|
Font.Color |
clNavy |
Шрифт темно-синий |
|
Left |
192 |
Відступ зліва |
|
Top |
280 |
Відступ зверху |
|
Width |
160 |
Ширина |
|
RadioButton3 |
Name |
an3 |
Третій варіант відповіді |
Caption |
Без надпису |
||
Font.Style |
[fsBold] |
Шрифт напівжирний |
|
Font.Color |
clNavy |
Шрифт темно-синий |
|
Left |
24 |
Відступ зліва |
|
Top |
312 |
Відступ зверху |
|
Width |
160 |
Ширина |
|
RadioButton4 |
Name |
an4 |
Четвертий варіант відповіді |
Caption |
Без надпису |
||
Font.Style |
[fsBold] |
Шрифт напівжирний |
|
Font.Color |
clNavy |
Шрифт темно-синій |
|
Left |
192 |
Відступ зліва |
|
Top |
312 |
Відступ зверху |
|
Width' |
160 |
Ширина |
|
Memol |
Color |
clActiveBorder |
Замальовуєм поле питання |
Height |
90 |
Висота |
|
Lines |
Очистити вміст |
||
Left |
12 |
Відступ зліва |
|
Top |
156 |
Відступ зверху |
|
Readonly |
True |
Заборона на зміну вмісту поля |
|
Width |
348 |
Ширина |
|
Label1 |
Caption |
О, счастливчик! |
Назва гри |
Align |
a ITop |
Розміщення вздовж верхнього краю форми |
|
Alignment |
taCenter |
Вирівнювання тексту по центру |
|
Font.Style |
[fsBold] |
Шрифт напівжирний |
|
Font.Size |
12 |
Размер шрифта 12 |
|
Font.Color |
clRed |
Шрифт червоний |
|
Label2 |
Caption |
Первый вопрос: |
Відображає номер даного питання |
Font.Style |
[fsBold] |
Шрифт напівжирний |
|
Left |
16 |
Відступ зліва |
|
Top |
140 |
Відступ зверху |
Властивість |
Значення |
Пояснення |
AutoSize |
True |
Розмір компонену вибирається автоматично в залежності від властивостей Picture |
Тор |
32 |
Відступ зверху |
Cursor |
crHelp |
При разміщенні над рисунком показник миші набуває форму ? |
Компонент |
Властивість |
Значення |
Пояснення |
Image1 |
Name |
yes50 |
Малюнок, що відповідає не використаній підказці типу "50 на 50" |
Left |
16 |
Відступ зліва |
|
Picture |
Відповідний малюнок |
||
Image2 |
Name |
yesZvonok |
Малюнок, що відповідає не використаній підказці типу «Звонок другу» |
Left |
132 |
Відступ зліва |
|
Picture |
Відповідний малюнок |
||
Image3 |
Name |
yesZаl |
Малюнок, що відповідає не використаній підказці типу «Помощь зала» |
Left |
252 |
Відступ зліва |
|
Picture |
Відповідний малюнок |
||
Image4 |
Name |
no50 |
Малюнок, що відповідає використаній підказці типу "50 на 50" |
Left |
16 |
Відступ зліва |
|
Picture |
Відповідний малюнок |
||
Visible |
False |
Спочатку невидимий |
|
Image5 |
Name |
noZvonok |
Малюнок, що відповідає використаній підказці типу «Звонок другу» |
Left |
132 |
Відступ зліва |
|
Picture |
Відповідний малюнок |
||
Visible |
False |
Спочатку невидимий |
|
Image6 |
Name |
noZаl |
Малюнок, що відповідає використаній підказці типу «Помощь зала» |
Left |
252 |
Відступ зліва |
|
Picture |
Відповідний малюнок |
||
Visible |
False |
Спочатку невидимий |
var
Forml: TForml;
rang: boolean; // перевірка на наявність lucky.ini;
ss, dir: string; // для зберігання шляху до робочої папки і до файлу lucky.ini
i, a, n, pd: integer; // i - лічильник масивів;
// А - номер поточного питання;
// N - кількість питань у базі;
// Pd - для підказки 50/50, для того,
// Щоб випадково не прибрали 1 або 3 варіантів
win: TiniFile; // для роботи з ini-файлом
mass: array [1 .. 10] of integer; // масив містить номери питань, які вже були задані, щоб уникнути повторення питань
procedure TForml.FormCreate (Sender: TObject);
label ran ; // оголошуємо мітку
begin
Randomize; // дізнаємося поточний каталог, з якого запускається наша програма
dir: = GetCurrentDir;
ss: = dir + '\ lucky.ini'; // розміщення бази даних
// Перевіряємо чи існує файл з питаннями
rang: = FileExists (ss);
if rang = False
then begin // якщо файлу немає виводимо повідомлення про його відсутність
MessageDlg ('Файл не знайдений: lucky.ini!', MtError, [mbok], 0);
halt; // і виходимо з програми
end;
win: = TIniFile.Create (ss);
// З розділу num дізнаємося кількість питань
ss: = win.ReadString ('num', 'num', ss);
n: = strtoint (ss);
ran: / / мітка
a: = random (n) + 1;
for i: = l to n do // порівнюємо з усіма, що були задані раніше
if mass [i] = a then goto ran; //і якщо таке питання вже був заданий, то згенерувати новий
for i: = 1 to n do
if mass [i] = 0 then begin mass [i]: = а; // запам'ятати, що це питання вже задавалося
break;
end;
// Заносимо в Memol випадково згенерований питання
Memol.Text: = win.ReadString ('Questions', IntToStr (a), Memol.text);
// Правильну відповідь
anl.Caption: = win.ReadString ('Answers', IntToStr (a), anl.Caption);
// Перший варіант
an2.Caption: = win.ReadString ('Wrong', IntToStr (a), an2.Caption);
/ / Другий
аn3.Caption: = win.ReadString ('Wrong', IntToStr (a) + IntToStr (a),
аn3.Caption);
/ / І третій
an4.Caption: = win.ReadString ('Wrong', IntToStr (a) + IntToStr (a) + IntToStr (a), an4.Caption);
win.Free;
end;
unit Unitl;
interface
user Windows, Messages, ..., IniFiles;
procedure TForml.ButtonlClick (Sender: TObject);
label ran;
begin
Label2.Caption: = 'Друге питання:';
if anl.Checked
then begin // якщо відповідь правильна
Buttonl.Visible: = False; // прибираємо поточну кнопку
Button2.Visible: = True; // і показуємо наступну кнопку
anl.Checked: = False; // приберемо галочку від минулого відповіді
// Виставимо всі пункти заново, на випадок якщо
// Користувач скористався підказкою 50/50
an2.Enabled: = True;
апЗ.Enabled: = True;
an4.Enabled: = True;
Randomize;
// ... тут код ідентичний тому, що знаходиться в
// ... обробнику події OnCreate форми
win.Free;
end
else begin // якщо відповідь неправильна, виводимо повідомлення
// О неправильному відповіді і повідомляємо правильний
MessageDlg ('Да-а ... Не кожен зміг би на першому' +
'Питанні програти!' + # 13 # 10 +
'А правильну відповідь був "' + anl.Caption + '"',
mtError, [mbok], 0);
halt; // завершуємо гру
end;
end;
procedure TForml.Button2Click (Sender: TObject);
begin
if anl.Checked
then begin // якщо на питання відповіли вірно,
Hide; // ховаємо першу форму
Form2.Show; // показуємо другу форму
end
else begin // якщо неправильно
// Виводимо повідомлення з правильною відповіддю.
MessageDlg ('Треба ж! На останньому питанні погорів! "+# 13 # 10 + "А правильна відповідь була: '+ anl.Caption + '!', mtError, [mbok], 0);
halt;
end;
end;
Потім розмістіть на формі компонент Image із вкладки Additional, його властивості Picture призначте який-небудь "веселий" рисунок (наприклад такий, як показано на рис.2.7 Або придумайте свій), а властивості Align присвойте значення alClient.
procedure TForm2.ImagelClick (Sender: TObject);
begin
halt;
end;
Для компіляції програми з подальшим її виконанням можна натиснути клавішу <F9>, клацнути на кнопці Run панелі інструментів або виконати команду меню Run Run.
При спробі відкомпілювати програму з'явиться повідомлення про те, що форма Forml посилається на форму Form2, оголошену в модулі Lucky2, і що необхідно додати посилання на цей модуль в розділ uses.
Якщо в цьому вікні натиснути кнопку Yes, то в розділ реалізації (implementation) програмного модуля Luckyl.pas буде автоматично додана відповідна посилання:
implementation
uses Lucky2;
Створіть oбpобник події OnClick для компонентів yes50:
procedure TForml.yes50Click (Sender: TObject);
begin:
yes50.Visible: = False; // прибираємо підказку
no50.Visible: = True; // показуємо малюнок, який повідомляє, що підказка вже використана
win: = TIniFile.Create ('ss');
if anl.Caption <>
win.ReadString ('Answers', IntToStr (a), anl.Caption)
then begin // перевіряємо: якщо перший варіант, то це - неправильний варіант відповіді
anl.Enabled: = False; // прибираємо його
pd: = pd + 1; // збільшуємо лічильник прибраних варіантів
end;
if an2.Caption <>
win.ReadString ('Answers', IntToStr (a), an2.Caption)
then begin
an2.Enabled: = False;
pd: = pd + 1;
end;
if pd = 2
then
// Якщо два перші варіанти і є неправильні, то нема чого перевіряти далі
ShowMessage ('Тепер ви повинні вибрати з цих' +
'Двох варіантів!')
else begin
if аn3.Caption <>
Win.ReadString ('Answers', IntToStr (a), anl.Caption)
then begin
an3.Enabled: = False; pd: = pd + 1;
end;
if pd <> 2 then
// Якщо ми дійшли до 4 варіанти, а лічильник не дорівнює 2,
an4.Enabled: = False; // то прибираємо і четвертий варіант
end;
win.Free;
end;
procedure TForml.yesZalClick (Sender: TOtrject);
begin
yesZal.Visible: = False;
noZal.Visible: = True;
win: = TIniFile.Create (ss);
ss: = win.ReadString ('Answers', IntToStr (a), anl.Caption);
ShowMessage ("Зал переконаний, що правильна відповідь - '+ ss);
win.Free;
end;
procedure TForml.yesZvonokClick (Sender: TObject);
begin
yesZvonok.Visible: = False; noZvonok.Visible: = True;
win: = TIniFile.Create (ss);
ss: = win.ReadString ('Answers', IntToStr (a), anl.Caption);
ShowMessage ('Друг переконаний, що правильна відповідь -' + ss);
win.Free;
end;
procedure TForml.no50Click (Sender: TObject);
begin
MessageDlg ('Ви вже скористалися цією підказкою!'
mtError, [mbok], 0);
end;
procedure TForml.noZvonokClick (Sender: TObject);
begin
MessageDlg ('Ви вже скористалися цією підказкою!',
mtError, [mbok], 0);
end;
procedure TForml.noZalClick (Sender: TObject);
begin
MessageDlg ('Ви вже скористалися цією підказкою!',
mtError, [mbok], 0);
end;
Гра повністю написана, але, щоб правильно відповісти на питання, не обов'язково все знати. Що може перешкодити користувачеві відкрити файл lucky.ini і прочитати там правильну відповідь. Звідси висновок: базу даних відповідей необхідно зашифрувати! Ми не будемо використовувати складних шифраторів, а застосуємо просту операцію хоr. Отже, додамо на початку обробника події OnCreate форми Forml наступний код:
procedure TForml.FormCreate (Sender: TObject);
label ran;
begin
// Зіставимо змінну fl і повний шлях до файлу lucky.ini
AssignFile (fI, ss);
// Змінна f2 буде відповідати за файл C: \ xor.ini
AssignFile (f2, 'C: \ xor.ini');
Reset (fl); // відкриваємо файл на читання
Rewrite (f2); // відкриваємо файл на запис
while not eof (fl) do // поки не досягнуть кінець файла
begin
Read (fl, cop); // читаємо lucky.ini
cop: = chr (ord (сор) хог 123); // Дешифруючи дані
Write (f2, cop); // записуємо їх в xor.ini
end;
CloseFile (fl); CloseFile (f2); // Закриваємо файли
Randomize; // активізуємо генератор випадкових чисел
var
fl, f2: file of char;
cop: char;
ss: = 'c: \ xor.ini'; // розміщення бази даних
..І нарешті, зашіфруйте файл lucky.ini. Для цього на швидку руку створіть програму, скопіюйте з нашої гри фрагмент коду, який дешифрує базу питань. Так як хоr - абсолютно оборотна функція (тому й ненадійна) цим же способом можна зашифрувати і базу. Приклад зашифрованою бази питань зображений на рис. 2.11.
Відкомпілюйте і запустіть програму.
Delphi 7.
Мета: Ознайомитись з компонентами роботи з СУБД.
Постановка завдання:
У військкоматі ведеться облік юнаків допризовного та призовного віку. Є наступні дані: район, прізвище, рік народження, номер особової справи, придатність до служби ("придатний" або "не придатний"). Програма повинна відповідати наступним вимогам:
1. вивести список юнаків, призваних на службу в заданому році (після досягнення 18 років);
2. кількість придатних юнаків для кожного з районів;
3. вивести список юнаків, придатних до служби;
4. кількість юнаків, придатних і непридатних до служби;
5. відсортувати список за абеткою в порядку зростання і в порядку убування;
6. знайти самого «старого» і самого молодого юнака;
7. список юнаків, прізвище яких починається на задану букву;
8. створити таблицю archive аналогічної структури, скопіювати в неї всі дані з основної таблиці.
9. вивести до звіту відсортований за прізвищами список юнаків, придатних до служби.
Короткі теоретичні відомості.
Створення і перегляд псевдонімів баз даних
Створити або змінити шлях до існуючих псевдонімів БД можна двома способами.
Спосіб перший. Запустити утиліту BDE Administrator. Вибрати в меню Object - New. Визначити назву і шлях до файлів БД.
Спосіб другий. Запустити утиліту DataBase DeskTop. Вибрати в меню Tools - Alias Manager. Натиснувши кнопку New можна створити новий псевдонім, або змінити шлях до існуючого в області вікна Path.
Типи полей таблиці в Paradox 7
Тип |
Позначення |
Опис значення |
Alpha |
А |
Рядок символів. Довжина не більше 255 символів |
Number |
N |
Число з плаваючою крапкою. Діапазон -10307 ... 10308. Точність 15 цифр мантиси |
Money |
$ |
Грошова сума. Відрізняється від типу Number тим, що в значенні відображається грошовий знак. Позначення грошового знаку залежить від установок Windows |
Short |
S |
Ціле число. Діапазон -32 768 ... 32767 |
Longlnteger |
I |
Ціле число. Діапазон -2 147 483 648 ... 2 147483647 |
BCD |
# |
Число в двіково десятковому форматі |
Date |
D |
Дата. Діапазон 01.01.9999 до н. э. ... 31.12.9999 |
Time |
Т |
Час |
Timestamp |
@ |
Дата и час |
Memo |
M |
Рядок символів. Довжина не обмежена. Перші 240 символів зберігаються в файлі таблиці, інші в файлі з розширенням MB |
Formatted Memo |
F |
Рядок символів. Відрізняється від типу Memo тим, що рядок може містити форматований текст |
Graphic |
G |
Графічне зображення. Формати BMP, PCX, TIF, GIF і EPS. При завантаженні в поле зображення перетвориться до формату BMP. Для зберігання ізо-бражения використовується файл з розширенням MB |
OLE |
О |
Дані у форматі, який підтримується технологією OLE. Дані зберігаються у файлі з розширенням MB |
ХІД РОБОТИ.
Для створення таблиці скористаємося утилітою DataBase DeskTop. Вибрати шлях
(C :/ Program Files / Common Files / Borland Shared / DataBase DeskTop/Dbd32.exe
На екрані з'явиться вікно створення бази даних. У стовпці Field Name введіть ім'я поля (не повинно містити пробілів).
У стовпці Type виберіть з контекстного меню (правий клік миші) тип поля. Для строкових полів необхідно вказати розмір (стовпець Size).
Імя поля |
Тип поля |
Опис |
Nomer |
Longlnteger |
Key |
Rayon |
Alpha[20] |
Район проживания |
Surname |
Alpha[20] |
Прізвище ініціали |
DataBorn |
Date |
Дата народження |
Goden |
Logical |
На даному етапі вид форми повинен бути наступним:
Для того, щоб зробити шрифт жирним, використовуйте властивість Font компоненту. Щоб розмістити на кнопці малюнок використовуйте властивість Glyph. Стандартні заготовки Delphi розташовані в папці: С: \ Program Files \ Common Files \ Borland Shared \ Images. Виберіть каталог Buttons файл Chek.Возможни ваші варіанти.
На цьому «оформлювальна робота» закінчена. Приступимо до програмування.
procedure Tform1.RadioGroup1Click(Sender: Tobject);
var Kolp, Kolnp, I:integer;
begin
Case RadioGroup1.ItemIndex of
0 : begin {если выбран первый переключатель}
query1.SQL.Clear; {закрываем запрос}
query1.SQL.Add('Select *from MainTable'); {в лапках йде SQL запрос}
query1.Open;
end;
1 : begin
query1.SQL.Clear;
query1.SQL.Add(Select *from MainTable where goden = true);
query1.Open;
end;
2 : begin
Table1.First;
Kolp:=0;Kolnp:=0;
for I:=1 to Table1.RecordCount do
Begin
if (Table1.FieldByName(goden).AsBoolean = true) then
Kolp:=Kolp + 1
else KolnP:=KolnP + 1;
Table1.Next;
end;
Messagedlg(Кількість годних = '+IntToStr(KolP)+#13+
'Кількість негодних = '+IntToStr(KolnP),mtInformation,[mbOk],0);
end;
3 : begin
query1.SQL.Clear;
query1.SQL.Add(Select *from MainTable order by surname ASC);
query1.Open;
end;
4 : begin
query1.SQL.Clear;
query1.SQL.Add(Select *from MainTable order by surname DESC);
query1.Open;
end;
5 : begin
query1.SQL.Clear;
query1.SQL.Add(Select *from MainTable where databorn = (Select min(databorn) from MainTable));
query1.Open;
end;
6 : begin
query1.SQL.Clear;
query1.SQL.Add(Select *from MainTable where databorn = (Select max(databorn) from MainTable));
query1.Open;
end; end; end;
procedure Tform1.BitBtn1Click(Sender: Tobject);
var sData,S:AnsiString;
begin
sData:=Edit1.Text;
if sData= then
begin
ShowMessage(Рік не введен!);
exit
end;
S:=Select *from MainTable where databorn <= 01.01.+ IntToStr(StrToInt(Edit1.Text)-18)+;
query1.SQL.Clear;
query1.SQL.Add(S);
query1.Open;
end;
procedure Tform1.BitBtn3Click(Sender: Tobject);
var S,s1,s2 : AnsiString;
begin
s2:=%;
s1 := + Edit3.Text + s2 +;
S:=Select *from MainTable where surname Like+s1;
query1.SQL.Clear;
query1.SQL.Add(S);
query1.Open;
end;
procedure Tform1.BitBtn2Click(Sender: Tobject);
var KolP,I:integer;
begin
Table1.First;
KolP:=0;
for I:=1 to Table1.RecordCount do
Begin
if ((Table1.FieldByName(goden).AsBoolean = true) and (Table1.FieldByName(rayon).AsString = Edit2.Text)) then
KolP:=Kolp + 1;
Table1.Next;
end;
Messagedlg(Количество годных по району + Edit2.Text+ = +IntToStr(KolP),mtInformation,[mbOk],0);
Edit2.Text:=;
end;
procedure Tform1.N2Click(Sender: Tobject);
begin
Pagecontrol1.ActivePageIndex := 0;
end;
procedure Tform1.N3Click(Sender: Tobject);
begin
Pagecontrol1.ActivePageIndex := 1;
end;
procedure Tform1.N6Click(Sender: Tobject);
begin
Query1.Close; Query1.SQL.Clear;
Query1.SQL.Add(insert into ArhivTable select * from maintable);
Query1.ExecSQL; Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add(select * from ArhivTable);
Query1.Open;
ShowMessage('Архивная таблица создана!')
end;
procedure Tform1.N5Click(Sender: Tobject);
begin
close
end;
procedure Tform1.FormCloseQuery(Sender: Tobject; var CanClose: Boolean);
begin
if (Messagedlg(Выйти из программы?, mtConfirmation, [mbYes,mbNo], 0)=mrYes) then Canclose := true
else CanClose := false;
end;
Створення звітів
Клацнувши правою клавішею за звітом, можна вибрати пункт Preview і подивитися, що вийшло.
form2.Query1.Close;
form2.Query1.SQL.Clear;
form2.Query1.SQL.add('select * from MainTable where goden=true');
form2.Query1.Active:=true;
form2.QuickRep1.Preview
form2.Query1.Close; form2.Query1.SQL.Clear;
form2.Query1.SQL.add('select * from MainTable where goden=false');
form2.Query1.Active:=true; form2.QuickRep1.Preview
Варіант контрольного завдання:
№ вар. |
Завдання |
1 |
У каталозі студій звукозапису є такі дані: назва групи, назва альбому, рік випуску альбому, назва студії. Програма повинна відповідати наступним вимогам:
|