Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка курсові роботи.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
203.78 Кб
Скачать

6. Методичні вказівки до виконання курсової роботи

Рекомендується послідовне, поетапне виконання основних розділів пояснювальної записки курсової роботи.

Оформленню розділу повинно передувати детальне вивчення літератури та методики побудови алгоритмів розв’язання задач.

Виконання курсової роботи починається з постановки задачі.

Кожна з представлених тем курсової роботи є відображення матеріалу, який вивчається на лекціях та лабораторних заняттях. На першому етапі слід чітко уявити собі предмет поставленої задачі. Це може бути робота з масивом, чи робота з файлом, чи робота з графічними процедурами і т.п.

Необхідно після вивчення лекційного матеріалу та додаткової літератури визначити можливості вибраної структури даних та після того приступити до розробки математичної моделі (якщо це можливо) задачі і розробки алгоритму.

При описуванні математичної моделі використовуються довідники з вищої математики та фізики.

Розробка алгоритму повинна виконуватися методом програмування зверху-вниз.

При цьому виконується поетапне деталювання алгоритму.

Після розробки алгоритму треба описати алгоритм мовою програмування Pascal або С. Програму тестують на всій множині значень вхідних даних.

Результати виконання програми аналізують на можливість алгоритмічних похибок.

Після виконання кожного етапу студент повинен консультуватися у керівника курсової роботи.

7. Рекомендації до створення програми

Курсова робота розробляється на базі отриманого завдання.

Практична частина курсової роботи повинна складатися з головної програми та підпрограм або модулів, що деталізують весь обчислювальний процес. Програму рекомендується організувати в режимі діалогу. Для цього необхідно створити меню програми, за допомогою якого доступ до окремих підпрограм або модулів. Приклад використання програми "Меню" наведено нижче.

Введення символу з клавіатури.

Функція ReadKey (читати клавішу) очікує натискання клавіші на клавіатурі, після чого повертає символ (тип CHAR),відповідний натиснутій клавіші. При цьому символ клавіші на екран не виводиться. Використовуючи цю функцію, можна обробляти натискання службових клавіш, таких як - <F1 - F12>, клавіш переміщення курсора і гортання тексту сторінками. При натисканні службових клавіш ReadKey повертає 0. Щоб отримати номер службової клавіші, потрібно ще раз викликати ReadKey.

Нижче наведена програма, яка дозволяє визначити код натиснутої клавіші. Програма завершує роботу при натисканні клавіші <Esc>.

Program tt;

Uses crt;

Var ch: char;

Begin

repeat

ch: = ReadKey;

if ch: = chr (0) then {натиснута службова клавіша}

begin

writeln ('Службова кавіша');

ch: = ReadKey;

end;

writeln (ord (ch));

until ord (ch) = 27; {поки НЕ натиснута клавіша <Esc>}

End.

Приклад програми «МЕНЮ».

Функція ReadKey зручна при організації меню програми. Наступна програма виводить список завдань (пунктів меню), виділяє перший кольором. При натисканні клавіші "стрілка вниз" виділяє наступний пункт меню, при натисканні клавіші "стрілка вгору" – попередній. Натискання клавіші <Enter> активізує відповідну процедуру (в даному випадку – процедуру-заглушку).

Program mm;

Uses crt;

Const norm = $ 17; {колір невиділеного пункту}

sel = $ 70; {колір виділеного пункту}

n = 3;

Var menu: array [1 .. n] of string [12]; {назви пунктів меню}

punkt: integer; {номер веделенного пункту}

ch: char; {введений символ}

x, y: integer; {координати першого рядка меню}

Procedure Menutoscr; {виведення меню на екран}

var i: integer;

begin clrscr;

for i: = 1 to n do begin

gotoxy (x, y + i-1);

write (menu [i]);

end;

{Textattr - зумовлена змінна, що відповідає за колір фону і символів}

textattr: = sel; gotoxy (x, y + punkt-1);

write (menu [punkt]); {виділимо рядок меню}

textattr: = norm;

end;

Procedure Punkt1;

begin clrscr;

writeln ('Процедура 1. Натисніть <Enter> для продовження'); readln;

end;

Procedure Punkt2;

begin clrscr;

writeln ('Процедура 2. Натисніть <Enter> для продовження'); readln;

end;

{Основна програма}

Begin

menu [1]: = 'Дія 1';

menu [2]: = 'Дія 2';

menu [3]: = 'Вихід';

punkt: = 1; x: = 5; y: = 5; textattr: = norm;

Menutoscr;

repeat

ch: = ReafKey;

if ch = chr (0) then

begin

ch: = ReadKey;

case ch of

chr (80): {стрілка вниз}

if punkt <n then begin

gotoxy (x, y punkt +-1);

write (menu [punkt]);

punkt: = punkt +1;

textattr: = sel;

gotoxy (x, y + punkt-1);

write (menu [punkt]);

textattr: = norm;

end;

chr (72): {стрілка вгору}

if punkt <n then begin

gotoxy (x, y + punkt-1);

write (menu [punkt]);

punkt: = punkt-1;

textattr: = sel;

gotoxy (x, y + punkt-1);

write (menu [punkt]);

textattr: = norm;

end;

end; {case ... of}

end

else

if ch = chr (13) then {натиснута клавіша <Enter>}

begin

case punkt of

  1. : Punkt1;

  2. : Punkt2;

  3. : Ch: = chr (27); {вихід}

end;

Menutoscr;

End;

until ch = chr (27); {27 - код <Esc>}

End.

Зчисленні та інтервальні типи. Типи користувача.

Складемо програму, зміст якої стосується правил дорожнього руху. Можна створити такий власний тип:

type color=(red, yellow, green) .

Тепер у цій програмі можна використовувати змінні типу color так само, як і типу integer або boolean. Наприклад, можна організувати такий цикл:

var i: color;

for i:=red to green do {тіло циклу}

Нехай ми працюємо з програмою нарахування заробітної платні. Логічно було б створити такий тип:

type month = (jan, feb, math, aprl, may, June, July, aug, sep, oct, nov, dec).

Якщо ми маємо справу з розкладом занять, то наш власний тип виглядатиме таким чином:

type day = (sunday, monday, tuesday, Wednesday, thursday, friday, Saturday).

Отже, з наведених прикладів слідує, що елементами власного типу користувача можуть бути створені ним ідентифікатори на зразок імен змінних. Відмінність лише в тому, що в даному випадку ці ідентифікатори самі є значеннями, в той час як змінні набувають деяких значень. У переліку елементів власного типу користувача є чіткий порядок, що дає змогу використовувати їх в якості лічильника в циклі. Саме тому такі типи носять назву зчисленних.

Зі зчисленних типів можна утворювати похідні типи, які визначають підмножину підряд розміщених елементів стандартного або вже описаного зчисленного типу і носять назву інтервальних або обмежених.

Слід зазначити, що при утворенні із попереднього описаного зчисленного типу похідного від нього інтервального значення його лівої межі повинно бути меншим від значення правої.

Наприклад, в тому ж розділі типів можна описати ще такий тип:

work_day = monday.. friday.

Наприклад інтервального типу, створеного з підмножини стандартних типів:

type mark=1..12 .

Цей тип створено з підмножини елементів цілого типу, він дозволяє вводити лише числові значення шкільних балів. На введення будь-яких інших цілих значень програма видаватиме повідомлення про помилку.

Елементи зчисленного типу розміщуються в чіткому порядку. Найменшим за величиною є перший записаний елемент, найбільшим – останній, другий елемент більший, ніж перший і т.д. Одна незручність – всі значення власних типів існують лише в самій програмі ще й у закодованому вигляді, а ввести їх з клавіатури або вивести па екран монітора неможливо. В цьому полягає найбільший секрет власних типів користувача. Обійти цю незручність можна лише створивши процедури-перекладачі. Наведемо приклад такої процедури.

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

program rating;

type science=(physics, mathematics, informatics, english);

month=(jan ,feb, march, aprl, may, June, July ,aug, sep, octt nov, dec);

marks =1. 12;

var subject: science; semestr: sep..dec;

result: array[science, sep..dec] of marks;

sum: integer;

procedure OutPutScience;

begin

case subject of

physics: write ('фізика');

mathematics: write('математика');

informatics: write ('інформатика');

english: write ('англійська мова');

end

end;

procedure OutPutMonths;

begin

case semestr of

sep: write('Bepeceнь');

oct: write('Жовтень');

nov: write('Листопад');

dec: write('Грудень');

end

end;

begin

for subject:=physics to english do

for semestr:=sep to dec do

begin

writeln ('Введіть бал з '); OutPutScience; write (' за ');

OutPutMonths;

write (' місяць');

read (result[subject,semestr]);

end;

for subject:=physics to english do

begin

writeln ('Рейтинг за семестр з предмету:');

OutPutScience; sum:=0;

for semestr:=sept to dec do

sum:=sum+result[subject,semestr];

write (sum);

end;

for semestr:=sep to dec do

begin

writeln ('Рейтинг з усіх предметів за '); OutPutMonths;

write (' місяць:'); sum:=0;

for subject:=physics to english do

sum:=sum+result[subject,semestr];

write (sum);

end;

end.

Можна передбачити одну помилку на початку роботи з власними типами. Не можна використовувати ідентифікатор типу (наприклад, science або month) як ім'я змінної. Тобто тип – це лише образ. Типам не відводиться місце в пам'яті комп'ютера, на них можна лише посилатися.

Використання масивів як формальних параметрів функцій та процедур.

Введення поняття власних типів дозволяє організувати роботу процедур та функцій, де як формальні параметри використовуються масиви.

Створіть, наприклад, такий тип:

type A=array[1 ..100] of integer.

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

Наведемо приклад фрагменту програми, що знаходить значення:

R=max(a1,a2,...,an)+max(b1,b2,...,bm).

type mas=array[1..100] of real;

var a,b: mas;

function max_mas(k: integer; x: mas): real;

var i: integer; max: real;

begin

max:=x[1]; for i:=2 to k do

if x[i]>max then max:=x[i];

max_mas:=max;

end;

begin

read(n.m);

{введення значень масивів а та b}

R:=max_mas(n,a)+max_mas(m,b);

end.

Записи.

Розглянемо новий тип – record – компактний у записі, зручний у користуванні.

Загальний вигляд опису записів

<ім'я змінної>: record

<список ідентифікаторів полів із зазначенням їх типів> end;

Приклади:

type

person=record

name, surname: string;

end;

man=record

name: string; age: integer;

birth_day: record

j day, month, year: integer;

end;

end;

var

list: array [1..50] of man; student: record

school, class,group: integer;

end,

a,b,c: person;

Звернення до даних типу record:

list[i].name, list[i].birth_day.year, student.school і т.д.

Ідентифікатори типів не можна використовувати як імена змінних. Тобто ви не повинні писати таким чином:

person.surname.

У даному випадку person – це деякий образ, на який можна лише посилатися, описуючи змінні.

Записи є структурованими типами, оскільки вони, в свою чергу, складаються з елементів певного типу. (Нагадаємо, що типи Паскаля, які в свою чергу, складаються з інших типів, вва­жаються структурованими.) Елементи, з яких складаються записи, називаються його полями. Вони визначаються ідентифікаторами за правилами найменування змінних величин. У наведених прикладах поля, в свою чергу, можуть бути записами, тобто розбиватися на свої поля.

Щоб дістатися до значення якогось поля запису, необхідно вказати спочатку ім'я змінної типу record і через крапку ім'я необхідного поля. Якщо воно має наступну вкладеність, то через крапку — ім'я його внутрішнього поля і т.д.

Тип «запис» це об’єднана під одним іменем наперед визначена сукупність змінних різного типу.

Такий тип даних використовується тоді, коли маємо справу з кількома масивами різних типів змінних, над якими одночасно необхідно виконувати певні дії. Наприклад, у задачі обробки інформації про продукцію деякого підприємства – назву виду продукції, його вартість, вироблену кількість.

Змінна типу record може брати участь лише в операторі присвоювання, якщо їй присвоювати значення іншої змінної такого ж типу. Не можна змінні цього типу множити, додавати тощо. Зовсім інша справа – поля змінної типу «запис». Якщо вони не є типом «запис», то над ними можна виконувати всі дії, які дозволяє їх тип.

Для того, щоб позбутися незручностей при «глибоких» вкладеностях записів, у Паскалі введений ще один оператор – оператор приєднання

with <ім'я змінної типу record > do P, де Р – оператор.

Використовуючи оператор приєднання для змінних масиву list з попереднього прикладу можна записати:

with list[i] do

begin

readln(name);

readln(age);

with birth_day do

begin readln (day);

readln(month);

readln(year);

end

end

Нижче наведено приклад програми з використанням змінних типу record, що дозволяє визначити телефон абонента за прізвищем і адресою.

program telefon;

type S1=string[20]; S2=string[40];

abonent=record

name: S1;

adress: S2;

tel: integer;

end;

var list: array[1 ..500] of abonent;

person: S1; adr: S2;

i,n: integer;

begin

repeat

writeln ('Задайте кількість абонентів телефонної мережі');

readln(n);

until (n>=1) and (n<=500);

writeln ('Задайте інформацію про абонентів:');

for i:=1 to n do with list[i] do

begin

writeln('Прізвище:');

readln(name);

writeln('Мешкає:');

readln(adress);

writeln('Teлeфoн:');

readln(tel);

end;

writeln ('Назвіть прізвище абонента, чий телефон вас цікавить: ')

readln (person);

writeln ('Де він мешкає:'); readln (adr);

і:=1;

while (i<=n) and (list[i].name.person) and

(list[i].adress.adr) do inc(i);

if i<=n then

writeln ('Телефон абонента: ', list[i].tel);

else

writeln ('Абонент з такими даними в довіднику відсутній');

end.