
- •1. Загальні положення
- •2. Завдання до виконання курсової роботи
- •2.1. Загальне завдання
- •2.2. Основні етапи виконання курсової роботи
- •2.3. Орієнтовні теми курсових робіт
- •3. Список літератури Основна література
- •Додаткова література
- •4. Структура курсової роботи
- •5. Правила оформлення
- •6. Методичні вказівки до виконання курсової роботи
- •7. Рекомендації до створення програми
- •8. Критерії оцінки курсового проекту
- •Додаток а Приклад виконання титульного аркуша пояснювальної записки до курсового проекту (роботи)
- •Обчислювальна техніка та алгоритмічні мови
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
: Punkt1;
: Punkt2;
: 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.