Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практикум Фортран и С++.pdf
Скачиваний:
17
Добавлен:
23.03.2015
Размер:
1.39 Mб
Скачать

Е. Л. Гарт

ПРОГРАМУВАННЯ НА МОВАХ ФОРТРАН І С/С++

Практикум

Навчальне видання

Етері Лаврентіївна Гарт, канд. фіз.-мат. наук, доцент

Програмування на мовах Фортран і С/С++ Практикум

Редактор А. П. Дзюба Техредактор І. А. Сафронова Коректор Л. М. Машталір

Підписано до друку 31.10.2012. Формат 60×84/16. Папір друкарський. Друк плоский. Ум. друк. арк. 4,1. Ум. фарбовідб. 3,9. Обл.-вид. арк. 4,2.

Тираж 50 пр. Зам. №___.

ММФ ДНУ, пр. К. Маркса, 35, к. 3/41, м. Дніпропетровськ, 49050

64

Міністерство освіти і науки, молоді та спорту України Дніпропетровський національний університет імені Олеся Гончара

Кафедра обчислювальної механіки і міцності конструкцій

Е. Л. Гарт

ПРОГРАМУВАННЯ НА МОВАХ ФОРТРАН І С/С++

Практикум

Дніпропетровськ

ДНУ

2012

УДК 681.3.06 Г 21

Г 21 Гарт Е. Л. Програмування на мовах фортран і С/С++: Практикум /

Е. Л. Гарт. – Д.: ДНУ, 2012. – 64 с.

Рецензенти:

д-р техн. наук, проф. Байбуз О. Г. д-р фіз.-мат. наук, доц. Говоруха В. Б.

Практикум містить матеріал, необхідний для виконання студентами лабораторних робіт з програмування. Наведені приклади розв`язання типових задач на мовах Фортран і С/С++, дані варіанти індивідуальних завдань, означення та основні конструкції алгоритмічних мов.

Для студентів першого курсу механіко-математичного факультету та факультету прикладної математики.

Рекомендовано науково-методичною радою механіко-математичного факультету ДНУ як навчальний практикум з курсу “Основи програмування та алгоритмічні мови” для студентів, які навчаються за напрямом підготовки “ Механіка”

(протокол № 9 від 20 вересня 2012 р.)

© Гарт Е. Л.

A(L)=A(L)+PIVI*A(LL)

TB=ABS(A(L)) IF(TB-PIV)15,15,14

14PIV=TB

I=L

15CONTINUE

DO 16 L=K,NM,M

LL=L+J

16R(LL)=R(LL)+PIVI*R(L)

17LST=LST+M

18IF(M-1)23,22,19

19IST=MM+M

LST=M+1

DO 21 I=2,M

II=LST-I

IST=IST-LST

L=IST-M

L=A(L)+.5

DO 21 J=II,NM,M

TB=R(J)

LL=J

DO 20 K=IST,MM,M

LL=LL+1

20TB=TB-A(K)*R(LL) K=J+L

R(J)=R(K)

21R(K)=TB

22RETURN

23IER=-1

RETURN

END

2

63

Лістинг підпрограми GELG

SUBROUTINE GELG(R,A,M,N,EPS,IER)

DIMENSION A(1),R(1)

IF(M)23,23,1

1IER=0

PIV=0.

MM=M*M

NM=N*M

DO 3 L=1,MM TB=ABS(A(L)) IF(TB-PIV)3,3,2

2PIV=TB

I=L

3CONTINUE TOL=EPS*PIV LST=1

DO 17 K=1,M IF(PIV)23,23,4

4IF(IER)7,5,7

5IF(PIV-TOL)6,6,7

6IER=K-1

7PIVI=1./A(I) J=(I-1)/M I=I-J*M-K J=J+1-K

DO 8 L=K,NM,M LL=L+I TB=PIVI*R(LL) R(LL)=R(L)

8R(L)=TB

IF(K-M)9,18,18

9 LEND=LST+M-K

IF(J)12,12,10 10 II=J*M

DO 11 L=LST,LEND TB=A(L)

LL=L+II

A(L)=A(LL)

11A(LL)=TB

12DO 13 L=LST,MM,M LL=L+I TB=PIVI*A(LL) A(LL)=A(L)

13A(L)=TB

A(LST)=J

PIV=0.

LST=LST+1

J=0

DO 16 II=LST,LEND

PIVI=-A(II)

IST=II+M

J=J+1

DO 15 L=IST,MM,M

LL=L-J

62

 

ЗМІСТ

 

ВСТУП ..............................................

 

4

Лабораторна робота № 1 ОБЧИСЛЕННЯ СУМИ

 

НЕСКІНЧЕННОГО РЯДУ ЗІ ЗАДАНОЮ ТОЧНІСТЮ ........

5

Лабораторна робота № 2

ДІЇ НАД МАТРИЦЯМИ ................

20

Лабораторна робота № 3 ЗАСТОСУВАННЯ ПРОЦЕДУР І ФУНКЦІЙ ..

26

Лабораторна робота № 4

ДІЇ НАД РЯДКАМИ ..................

34

Лабораторна робота № 5

ЗАСТОСУВАННЯ СТАНДАРТНИХ

 

ПІДПРОГРАМ ДЛЯ РОЗВ’ЯЗУВАННЯ СИСТЕМ

 

ЛІНІЙНИХ АЛГЕБРАЇЧНИХ РІВНЯНЬ ................

45

Список рекомендованої літератури ..........................

48

Додаток А. Зразок оформлення звіту

 

про виконання лабораторних робіт .............

49

Додаток Б. Завдання для розрахункової роботи .............

52

Додаток В. Методичні вказівки щодо виконання

 

розрахункової роботи .........................

58

Додаток Г. Опис стандартних підпрограм SIMQ і GELG .......

60

3

ВСТУП

Сучасному механіку-досліднику часто приходиться мати справу із задачами, що жадають від нього гарної комп’ютерної підготовки і твердих навичок і умінь у застосуванні різноманітних математичних методів при використанні комп’ютерної техніки. При формуванні у майбутніх фахівців в галузі механіки професійних навичок та умінь самостійного розв`язання складних практичних і наукових задач за допомогою персонального комп’ютера (ПК) на лабораторний практикум з програмування та алгоритмічних мов накладаються такі задачі:

закріплення знань по лекційному курсу з основ програмування та алгоритмічних мов;

формування практичних навичок по розробці та програмної реалізації проектів розв’язування задач на ПК;

навчання роботі з науково-технічною літературою і технічною документацією, а також формування навичок розробки і оформлення окремих розділів програмної документації;

набуття знань про сучасні методи розв’язування задач за допомогою ПК.

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

Виконання кожного завдання складається із:

аналізу поставленої задачі та визначення вимог щодо програми;

розробки алгоритму розв’язування задачі на ПК, складання структурних блок-схем;

програмної реалізації алгоритму, тестування та відлажування розробленої програми та складання інструкції по її експлуатації;

аналізу результатів розрахунків;

підготовки та оформлення звіту.

Звіт виконується на папері формату А4 і повинен мати наскрізну нумерацію (титульний лист входить до наскрізної нумерації, але не нумерується). Зразок оформлення звіту наведено у додатку А.

Базові мови виконання лабораторних робіт – Visual Fortran 6.6, С/С++.

4

SAVE=B(IMAX)

B(IMAX)=B(J)

B(J)=SAVE/BIGA

IF(J-N)55,70,55 55 I=N*(J-1)

DO 65 IX=JY,N I1=I+IX IT=J-IX

DO 60 JX=JY,N

IJ=N*(JX-1)+IX I2=IJ+IT

60 A(IJ)=A(IJ)-(A(I1)*A(I2))

65 B(IX)=B(IX)-(B(J)*A(I1))

70JY=N-1 IT=N*N

DO 80 J=1,JY I=IT-J I1=N-J

I2=N

DO 80 JJ=1,J

B(I1)=B(I1)-A(I)*B(I2)

I=I-N

80I2=I2-1 END

Підпрограма GELG розв’язує систему N лінійних алгебраїчних рівнянь Ax = B ітераційним методом. За один виклик підпрограми можливо розв’язати декілька систем з однією тією ж матрицею коефіцієнтів, але з різними правими частинами.

Виклик підпрограми має вигляд

CALL GELG (R, А , М, N, ЕРS , IER),

де R – матриця N правих частин у вигляді масиву МхN. При виході із підпрограми в цьому масиві містяться розв’язки системи, тобто вектори x ;

A – масив, який містить матрицю коефіцієнтів системи рівнянь М-го порядку, розташовану по стовпчикам;

М – кількість рівнянь системи і змінних (M>1);

N – кількість правих частин системи (N>=1);

EPS – вхідна константа, яка використовується для оцінки відносної похибки при перевірці втрати точності;

IER – індикатор помилки, який може приймати наступні значення: IER=0 означає, що помилок немає; IER=1 означає, що матриця А системи рівнянь особлива або M<1; IER=К означає, що на k-ому кроці ітераційного можлива втрата точності, оскільки головний елемент матриці виявився меншим за добуток точності EPS і найбільшого за модулем елементу матриці А.

61

Додаток Г. Опис стандартних підпрограм SIMQ і GELG

Підпрограма SIMQ розв’язує систему N лінійних алгебраїчних рівнянь Ax = B методом виключення з обранням головного елемента по стовпчику. Змінну xN отримують при прямому ході розв’язання за N кроків. Решту змін-

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

Виклик підпрограми має вигляд

CALL SIMQ (A, B, N, KS),

де A – масив, який містить матрицю коефіцієнтів системи рівнянь N -го по-

рядку, розташовану по стовпчикам;

В – масив довжини N , який містить праві частини системи рівнянь. При виході із підпрограми у ньому міститься розв’язок системи, тобто вектор x ;

N – кількість рівнянь системи і змінних (N>1);

KS – індикатор помилки, який може приймати наступні значення: KS=0 означає, що помилок немає; KS=1 означає, що матриця А системи рівнянь особлива.

Лістинг підпрограми SIMQ

SUBROUTINE SIMQ(A,B,N,KS)

REAL A(1), B(1), TOL, BIGA, SAVE

TOL=0.0

KS=0

JJ=-N

DO 65 J=1,N

JY=J+1

JJ=JJ+N+1

BIGA=0.0

IT=JJ-J

DO 30 I=J,N

IJ=IT+I

IF(ABS(BIGA)-ABS(A(IJ)))20,30,30

20BIGA=A(IJ)

IMAX=I

30 CONTINUE IF(ABS(BIGA)-TOL)35,35,40

35 KS=1 RETURN

40I1=J+N*(J-2) IT=IMAX-J DO 50 I=J,N I1=I1+N I2=I1+IT SAVE=A(I1)

A(I1)=A(I2)

A(I2)=SAVE

50 A(I1)=A(I1)/BIGA

60

Лабораторна робота № 1

ОБЧИСЛЕННЯ СУМИ НЕСКІНЧЕННОГО РЯДУ

ЗІ ЗАДАНОЮ ТОЧНІСТЮ

Мета завдання:

освоєння правил організації циклічного процесу з невідомою кількістю повторень;

оволодіння навичками побудови структурних схем алгоритмів з використанням рекурентних залежностей та інших ефективних прийомів програмування;

придбання умінь роботи з різними наборами даних.

Теоретичні відомості

Цикл – це багаторазове виконання групи операторів у програмі. Для організації циклічних структур на мові Фортран використовуються оператори умовного (IF) і безумовного (GOTO) переходу, оператори циклу:

1)з параметром (DO),

2)з передумовою (DO WHILE).

Блоковий умовний оператор IF мови Фортран служить для розга-

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

вигляді:

 

 

IF (<логічний вираз>) THEN

або

IF (<логічний вираз>) THEN

<оператор_1>

 

<оператор_1>

ELSE

 

ENDIF

<oператор_2>

 

 

ENDIF

 

 

Блоковий оператор IF працює в такий спосіб:

1)Обчислюється логічний вираз в дужках. Цей логічний вираз може бути істиним й мати значення .TRUE., або може бути помилковим і мати логічне значення .FALSE..

2)Якщо логічний вираз в дужках істиний, то виконується оператор_1; якщо – ложний, то виконується oператор_2.

3)Як у першому, так і в другому випадку після IF виконується наступний за ним по тексту програми оператор.

Для безумовного переходу в програмі на Фортрані служить оператор GOTO. Записується у вигляді:

GOTO <мітка>

де <мітка> – це невід’ємне ціле число в діапазоні 0..99999.

5

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

<мітка> <оператор>

Оператор циклу DO мови Фортран призначений для створення циклів, в яких зарані відома кількість повторень. Оператор DO у порівнянні c IF є більш зручнішим та ефективнішим для організації циклів.

Форма запису наступна:

 

 

DO i = i1, i2 [, i3]

або

DO m i = i1, i2 [, i3]

<оператори>

 

<оператори>

ENDDO

m

CONTINUE

Тут m – мітка оператора, що є останнім в області циклу DO; i – змінна циклу, що змінюється від початкового значення i1 до кінцевого значення i2 із кроком i3. Параметр циклу i3 не є обов’язковим, якщо він відсутній, то його значення дорівнює 1. Змінна циклу може приймати тільки цілі або дійсні значення.

Оператор циклу DO працює в такий спосіб: змінної циклу i привлас-

нюється початкове значення i1, потім виконуються всі оператори в області циклу, включаючи й останній з міткою m. Потім до величини змінної i додається величина кроку i3 і отримане нове значення змінної циклу порівнюється з кінцевим значенням i2. Якщо нове значення змінної циклу більше, чим значення i2, то здійснюється вихід із циклу й керування передається операторові, що розташований після мітки m. Якщо значення змінної циклу i менше ніж i2, то повторюються обчислення в області циклу, починаючи з оператора, що знаходиться після DO.

Зауваження. Після закінчення циклу змінна циклу зберігає завжди значення більше, ніж кінцеве значення параметра циклу i2. У випадку виходу із циклу до його завершення змінна збереже своє поточне значення. Якщо крок циклу зробити від’ємним (i3<0), то початкове значення i1 повинне бути більшим ніж кінцеве (i1>i2).

Як оператор, що є останнім у циклі DO, переважніше ставити оператор CONTINUE, що не виконує ніяких дій, а просто показує, що на ньому закінчився цикл. Оператор CONTINUE найчастіше є останнім оператором циклу DO у тих випадках, коли останнім оператором циклу DO може виявитися один з операторів: IF (арифметичний), PAUSE, STOP або інший керуючий оператор.

Декілька циклів DO можуть мати однаковий останній оператор. Наприклад,

 

DO

10

I=1, 10

 

DO

10

J=1, 5

 

……………………

10

x=1.0

 

Примітка. Якщо оператор DO перебуває усередині IF-блоку, ELSEIFблоку, або ELSE-блоку, то тіло такого оператора повинне повністю знаходитися усередині відповідного блоку.

6

OpenFileRead відкрити файл для читання; OpenFileWrite відкрити файл для запису;

ReadPersons читати записи з файлу і помістити їх в групу; WritePersons зберегти групу у файлі;

CloseFile закрити файл.

6.Приклад побудови основної програми: uses Unit1,Unit2,Unit3;

Type TProc=procedure(person:TPerson); Var p:PPerson;

а,b:TGroup; f:TFile;

Procedure Show(person:PPerson;age1:integer);far; {Показує студентів, чий вік більше age1}

begin

if person^.age>age1 then PersonShow(person); end;

Begin

AssignFile(f1,'person1.dat');

AssignFile(f2,'person2.dat');

GroupCreate(а,'ГРУПА А');

GroupCreate(b,'ГРУПА Б'); p:=PersonCreate('Іванов',25); GroupInsert(а,p); p:=PersonCreate('Петров',35); GroupInsert(а,p); p:=PersonCreate('Сидоров',45); GroupInsert(а,p);

{аналогічно для групи b} GroupShow(a); OpenFileWrite(f1); WritePersons(f1,a); CloseFile(f1); GroupDestroy(a);

GroupShow(a);{показуємо групу, щоб переконатися, що вона порожня}

{аналогічно для групи b } OpenFileRead(f1); ReadPersons(f1,a); GroupShow(a);

{аналогічно для групи b } GroupIter(а,Show,35); GroupDestroy(a); GroupDestroy(b);

End.

59

DO m WHILE (<логичний вираз>) <оператори>
m CONTINUE

Додаток В. Методичні вказівки щодо виконання розрахункової роботи

1. Модуль unit1 містить визначення структури, а також процедури і функції для роботи з нею. У Pascal структура – це запис (record). Наприклад, структура ПЕРСОНА визначається так:

TPerson=record

name:string; {ім'я} age:integer; {вік}

end;

Слід визначити також тип вказівника на структуру: PPerson=^TPerson;

2.Для роботи зі структурою слід описати наступні процедури і функції:

функцію, яка розміщує структуру в пам'яті і повертає вказівник на неї, наприклад:

function PersonCreate(name1:string;age1:integer):PPerson;

процедуру, що видаляє структуру з пам'яті, наприклад (р – вказівник на структуру, що видаляється):

procedure PersonDestroy(Var p:PPerson);

процедури для ініціалізації даних структури, наприклад:

procedure PersonInit(p:PPerson;name1:string; age1:integer); procedure SetName(p:PPerson;name1:string);

procedure SetAge(p:PPerson;age1:integer);

функції, що повертають значення структури, наприклад: function GetName(p:PPerson):string;

function GetAge(p:PPerson):integer;

процедуру для перегляду структури (виведення її значень),

наприклад: procedure PersonShow(p:PPerson);

3.Другий модуль (unit2) містить визначення типів, процедур і функцій для організації роботи з групою.

4.Слід визначити процедуру, яка включає структуру в групу:

procedure GroupInsert(var group:TGroup;p:PPerson);

Слід визначити також процедури для створення (ініціалізації) групи, її перегляду і видалення: GroupCreate, GroupShow, GroupDestroy.

5.Третій модуль (unit3 ) містить процедури, необхідні для збереження групи

уфайлі і завантаження її з файлу. Тут необхідно визначити наступні процедури: AssignFile зв’язати файлову змінну із зовнішнім файлом;

58

Якщо в тілі оператора DO перебуває блоковий оператор IF, то відповідний йому оператор ENDIF повинен перебувати усередині тіла цього оператора DO.

Значення змінної циклу не повинне зміняться усередині тіла DO. Передача керування в тіло циклу DO ззовні заборонена.

Оператори CYCLE, EXIT можна використовувати тільки в тілі циклу. Оператор CYCLE передає керування кінцевому оператору циклу. Оператор EXIT – вихід із циклу.

Оператор циклу DO WHILE мови Фортран використовується, коли зарані невідома кількість повторень групи операторів.

Форма запису наступна:

DO WHILE (<логичний вираз>) або <оператори>

ENDDO

Тут m – мітка оператора, що є останнім в області циклу DO.

Оператор циклу DO WHILE працює в такий спосіб: обчислюється зна-

чення логічного виразу. Якщо логічний вираз істиний, то виконуються оператори тіла циклу, якщо – ложний, то здійснюється вихід із циклу.

Для організації циклічних структур на мові С/С++ використовуються оператори умовного (IF) і безумовного (GOTO) переходу, оператори циклу:

1) з параметром (FOR); 2) з передумовою (WHILE); 3) з післяумовою

(DO…WHILE)

Умовний оператор IF мови С/С++ має таку форму запису:

IF (<вираз>) <оператор_1>; [ELSE <оператор_2>;]

де IF, ELSE – зарезервовані слова; <вираз> має арифметичний тип; <оператор_1> і <оператор_2> можуть бути як простими, так і блоками.

Блок може містити будь-які оператори, у тому числі опису й інших умовних операторів.

Умовний оператор IF працює в такий спосіб: спочатку обчислюється значення виразу, якщо воно має значення «істина», то керування передається на оператор_1, якщо – «лож», то на <оператор_2>, а далі на оператор що випливає за умовним.

Зауваження. Одна з гілок оператора може бути відсутню (порожній оператор).

Оператор безумовного переходу GOTО мови С/С++ записується у вигляді:

GOTО <мітка>;

де <мітка> – ідентифікатор, область видимості якого є функція, у тілі якої він заданий.

7

Оператор безумовного переходу GOTО працює в такий спосіб: переда-

Описи структур

 

 

ється керування на позначений оператор. У тілі функції повинна бути конс-

1. СТУДЕНТ

2. СЛУЖБОВЕЦЬ

3. КАДРИ

трукція виду:

<мітка>: <оператор>;

ім'я : string

ім'я : string

ім'я : string

курс : integer

професія : string

номер цеху : іnteger

Примітка. Використання оператора GOTO виправдано в двох ви-

стать : char

робочий стаж : integer

розряд : integer

 

 

 

падках:

4. ЦЕХ

5. БІБЛІОТЕКА

6. ІСПИТ

- примусовий вихід вниз по тексту програми з локальних вкладених

ім'я : string

ім'я : string

ім'я студента : string

циклів або перемикачів;

шифр : string

автор : string

дата : integer

- перехід з декількох місць функції в одне.

кількість : integer

вартість : real

оцінка : integer

Оператор GOTO не рекомендується використати без особливої не-

 

 

 

обхідності, тому що порушуються принципи структурного й модульного про-

7. АДРЕСА

8. ТОВАР

9. КВИТАНЦИЯ

грамування.

ім'я : string

ім'я : string

номер : integer

Оператор SWICH (перемикач) мови С/С++ призначений для розга-

вулиця : string

кількість : integer

дата : integer

будинок : integer

вартість : real

сума : real

луження процесу обчислень на декілька напрямків.

 

 

 

Синтаксис:

 

 

 

SWICH (<вираз>){

 

 

 

case <константний вираз_1>:[<оператор _ 1>;]

 

 

 

case < константний вираз_2>:[<оператор _ 2>;]

 

 

 

case < константний вираз_n>:[<оператор _ n>;]

 

 

 

[default: <оператори>;]

 

 

 

}

 

 

 

Вирази мають цілий тип.

 

 

 

Семантика. Виконання оператора починається з обчислення виразу.

 

 

 

Потім керування передається першому операторові зі списку, позначеного

 

 

 

константним виразом, значення якого збіглося з обчисленим. Після цього,

 

 

 

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

 

 

 

інші гілки. Якщо збіг не відбувся, виконуються оператори, розташовані після

 

 

 

слова default.

 

 

 

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

 

 

 

break, return.

 

 

 

Зауваження. Всі константні вирази повинні мати різні значення, але

 

 

 

повинні бути того самого цілого типу.

 

 

 

Приклад 1. Програма виводить на екран значення виразу із двох ве-

 

 

 

личин в залежності від знаку введеної операції.

 

 

 

include <iostream>

 

 

 

int main (){

 

 

 

int a,b, rez;

 

 

 

char op;

 

 

 

cout<<”\n vvedite 1-i operand:”; cin>>a;

 

 

 

cout<<”\n vvedite znak operazii:”; cin>>op;

 

 

 

cout<<”\n vvedite 2-i operand:”; cin>>b;

 

 

 

bool f=true;

 

 

 

8

 

57

 

Варіанти завдань

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

Таблиця Б.1

Варіант

Структура

 

Ітератор

 

1

СТУДЕНТ

Імена всіх хлопців (дівчат)

 

 

2

СТУДЕНТ

Імена студентів вказаного курсу

 

3

СТУДЕНТ

Кількість хлопців (дівчат)

 

 

4

СТУДЕНТ

Кількість студентів на вказаному курсі

 

5

СЛУЖБОВЕЦЬ

Імена службовців зі стажем не менше заданого

6

СЛУЖБОВЕЦЬ

Імена службовців заданої професії

 

7

СЛУЖБОВЕЦЬ

Кількість службовців зі стажем не менше

 

 

заданого

 

 

 

8

СЛУЖБОВЕЦЬ

Кількість службовців заданої професії

 

9

КАДРИ

Імена робітників в заданому цеху

 

10

КАДРИ

Імена робітників заданого розряду

 

11

ЦЕХ

Кількість продукції заданого найменування

 

12

ЦЕХ

Найменування продукції, кількість якої не менш

 

 

заданої величини

 

 

 

13

БІБЛІОТЕКА

Найменування книг, вартість яких

вище

 

 

заданої величини

 

 

 

14

БІБЛІОТЕКА

Кількість книг вказаного автора

 

15

ІСПИТ

Імена студентів, які склали іспит на відмінно

16

ІСПИТ

Імена студентів, які складали іспит в заданий

 

 

день

 

 

 

17

ІСПИТ

Кількість студентів, які не склали іспит

 

18

АДРЕСА

Імена тих, хто мешкає на заданій вулиці

 

19

АДРЕСА

Імена тих, хто мешкає на парному боці заданої

 

 

вулиці

 

 

 

20

АДРЕСА

Кількість мешканців заданої вулиці

 

21

ТОВАР

Кількість товару заданого найменування

 

22

ТОВАР

Найменування

товару,

кількість

якого

 

 

перевищує задану величину

 

23

ТОВАР

Найменування

товару

вартістю не

вище

 

 

заданої величини

 

 

 

24

КВИТАНЦІЯ

Номери квитанцій вказаної дати

 

25

КВИТАНЦІЯ

Загальна сума всіх квитанцій вказаної дати

 

56

switch (op){

case ”+”: res=a+b; break; case ”-”: res=a-b; break; case ”*”: res=a*b; break; case ”/”: res=a/b; break;

default: cout<<”\n neizvestnaya operatciya”; f=false;

}

if (f) cout<<”rezultat:”<<rez; return 0;

}

Оператор циклу з передумовою WHILE мови С/С++ має таку фо-

рму запису:

WHILE (<вираз>) <оператор>;

Особливості циклу із передумовою: якщо вираз відразу істиний, то цикл не виконується жодного разу.

Приклад 2. Дано функцію y=x2+1. Необхідно надрукувати її таблицю значень на заданій ділянці [xn, xk] із кроком Dx.

#include <stdio.h> using namespace std; int main (){

float xn,xk, Dx;

printf (“vveite diapozon i shag izmeneniya argumenta: \n”); scanf (“%f %f %f”, &xn, &xk, &Dx);

printf (“| x | y |\n“); //шапка табл. float x=xn; //установлення початкового значення while (x<=xk){

printf (“|%5.2f |%5.2f |\n”, x, x*x+1);

x+=Dx;

}

return 0,

}

Оператор циклу з післяумовою DO…WHILE мови С/С++ має таку форму запису:

DO <оператор> WHILE (<вираз>);

де <оператор> – простий або складовій ({ }).

Семантика. Спочатку виконується оператор, а потім обчислюється значення виразу:

true (= 0), то виконується оператор

Якщо <вираз>=

false (= 0), то вихід із циклу

Особливістю є те, що незалежно від значення виразу (true або false) цикл виконується хоча б один раз.

Приклад 3.

#include <stdio.h> int main (){

float xn, xk, Dx;

printf (“vveite diapozon i shag izmeneniya argumenta:”);

9

scanf (“%f %f %f”, &xn, &xk, &Dx); printf (“| x | y |\n“);

float x=xn; do {

printf(“|%5.2f |%5.2f |\n”, x, x*x+1); x+=Dx;

}

while (x<=xn); return 0;

}

Оператор циклу з параметром мови С/С++ має таку форму запису:

FOR ([<ініціалізація змінної>]; [<умова>]; [<модифікація>]) <оператор>;

Тут [<ініціалізація змінної>]] використовується для присвоєння початкових значень величинам із циклу. Можна використати декілька операторів, розділяючи їх «,» ;

[<умова>] – вираз, що визначає умову виконання циклу. Якщо цей вираз «true», то цикл виконується, інакше – вихід;

[<модифікація>] виконується після кожної ітерації. Служить для зміни параметра циклу. У частині модифікації можна записувати декілька операторів через кому.

Зауваження. Цикл із параметром реалізований як цикл із передумовою. Будь-який цикл із передумовою (while) може бути наведений до циклу з параметром (for) і навпаки за наступною схемою:

b1;

for (b1; b2; b3) <оператор>; while (b2){ <оператор>;

b3;

}

Примітка. Розповсюдженими помилками при програмуванні циклів є:

1)використання в тілі циклу неініційованих змінних;

2)невірний запис умови виходу із циклу.

Оператори циклу взаємозамінні, однак при виборі варто мати на увазі наступне:

оператор do while (з постумовою) звичайно використається, коли цикл потрібно обов'язково виконати хоча б один раз. Наприклад, при введенні даних;

оператор while (із передумовою) зручно використати, коли число ітерацій заздалегідь невідомо.

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

10

begin

for X := 1 to W do Write(Operation(X,Y):5); Writeln;

end;

Writeln;

end;

begin PrintTable(10,10,Add); PrintTable(10,10,Multiply); PrintTable(10,10,Funny);

end.

В даному випадку процедура PrintTable є загальною дією, що виконується над функціями Add, Multiply і Funny.

Порядок виконання роботи

1.Визначити структуру (відповідно до варіанту завдання), а також процедури і функції для роботи з нею. Помістити визначення в модуль unit1.

2.Визначити типи, процедури і функції для організації роботи з групою. Помістити визначення в модуль unit2.

3.Визначити типи, процедури і функції для організації роботи з файлом (збереження групи у файлі і завантаження її з файлу). Помістити визначення

вмодуль unit3.

4.Визначити ітератор (відповідно до варіанту завдання) і помістити визначення в модуль unit2.

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

6.Відлагодити розроблену програму.

7.Написати звіт.

Зміст звіту

1.Титульний аркуш.

2.Постановка завдання згідно з варіантом (тип структури і ітератор).

3.Інтерфейсні частини всіх модулів.

4.Пояснити виконання наступних процедур:

перегляд структури;

перегляд групи;

включення структури в групу;

видалення структур з групи;

завантаження групи з файлу.

5.Пояснити виконання реалізованого ітератора.

6.Додаток (на диску):

а) лістинг всіх модулів і основна програма : pas-файлы; б) exe-файл програми.

55

Proc = procedure;

SwapProc = procedure(var X, Y: Integer);

StrProc = procedure(S: String);

MathFunc = function(X: Real): Real;

DeviceFunc = function(var F: text): Integer;

MaxFunc = function(A, B: Real; F: MathFunc): Real;

В змінній процедурного типу можна зберігати процедурні значення, які можуть бути наступними:

значеннями nil;

вказівником на змінну процедурного типу;

ідентифікатором процедури або функції.

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

Параметри процедурного типа. Оскільки процедурні типи допускається використовувати в будь-якому контексті, то можна описувати процедури або функції, які сприймають процедури і функції як параметри.

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

program Tables; type

Func = function(X,Y: integer): integer;

function Add(X,Y: integer): integer; far; begin

Add := X + Y; end;

function Multiply(X,Y: integer): integer; far; begin

Multiply := X*Y; end;

function Funny(X,Y: integer): integer; far; begin

Funny := (X+Y) * (X-Y); end;

procedure PrintTable(W,H: integer; Operation: Func); var

X,Y : integer; begin

for Y := 1 to H do

54

Постановка задачі

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

S = un

n=0

зі заданою точністю ε, з урахуванням того, що задана точність вважається досягнутою, якщо чергова складова за абсолютним значенням стане менше, ніж ε, тобто un < ε .

Вид складового un обирається із табл. 1.1 згідно шифру.

Для написання програми на мові Фортран використати: 1) оператор циклу DO; 2) оператор циклу DO WHILE; 3) оператор безумовного переходу

GOTO.

Для написання програми на мові С/С++ використати: 1) оператор циклу з параметром (FOR); 2) оператор циклу з передумовою (WHILE); 3) оператор циклу з післяумовою (DO WHILE); 4) оператор безумовного перехо-

ду (GOTO).

Зауваження. При обчисленні членів ряду не використовувати операцію возведення в ступінь, а застосовувати рекурентні залежності. В ітераційному циклі не обчислювати функції для незалежних від параметру циклу аргументів. Такі засоби дозволяють суттєво зменшити витрати машинного часу. Якщо не вдається отримати загальний для усіх складових un коефіцієнт ре-

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Таблиця 1.1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

un

С1

С2

 

С3

 

 

С4

x

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C C

n

 

 

 

 

 

 

 

 

0.12; 0.22;

 

1

 

 

 

1 3

 

 

 

 

( 1) x

n!

 

sinn2 x

thn+1 x

0.32; 0.42

 

 

 

 

C2 +C4

 

 

 

 

 

 

( 1)n+1 x2

 

 

 

 

 

 

 

 

 

2

 

 

 

C1 +C3

 

( 2n +1)!

 

arcsin

2n

x

2

2n1

0.61; 0.72;

 

 

 

nC2 +C4

( 1)n1 x3

 

 

 

 

0.83; 0.94

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

 

 

C1C3

 

( n +2 )!

 

n cos

n1

x

2n1

0.53; 0.63;

 

 

C2 +n2C4

 

 

 

 

 

3

 

0.73; 0.83

 

 

 

 

 

 

 

 

 

 

 

 

 

4

 

C1C3 +C3

 

 

( x )n+1

( 3n )!

 

arc cosn+2 x

cth2n+1 x

0.31; 0.35;

 

 

C4 +n2C2

 

0.39; 0.43

 

 

 

 

 

 

 

 

 

 

 

 

 

5

 

 

 

C1

 

( x )2n1

( 2n +2 )!

 

tg2n2 x

 

32n+1

0.11; 0.32;

 

 

C2C3 +C4

 

 

 

0.43; 0.54

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

11

 

 

 

 

 

 

 

Продовження таблиці 1.1

 

 

 

un

С1

С2

С3

 

 

С4

 

x

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6

 

 

C1 +C3

 

( x )3n+1

( 4n )!

ctgn1 x

 

chn x

 

0.25; 0.35;

 

C4C3 +C2

 

 

0.45; 0.55

 

 

 

 

 

 

 

 

 

 

 

 

 

7

 

 

C1 +C3

 

( x )n+2

( 2n +3 )!

arctg

n1

x

2

n

 

0.16; 0.26;

 

n2C4

+C2

 

 

 

 

 

 

0.46; 0.66

 

 

 

 

 

 

 

 

 

 

 

8

 

 

 

 

C3

( 1)n xn2

( n +3 )!

arcctg

n

x

sh

2n1

x

0.17; 0.27;

 

2

C4

+C2C1

 

 

n

 

 

 

 

 

0.37; 0.47

9

 

 

C1 +C3

 

( 1)n xn+1

n( 2n )!

cos

n+1

x

e

2nx

 

0.38; 0.48;

 

 

n2C4C2

 

 

 

 

 

 

 

0.58; 0.68

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

 

C1 +nC3

( 1)n+1 xn

( n +1)( 4n )!

sin

n3

x

 

nx

 

0.21; 0.33;

 

 

 

 

 

 

 

 

 

 

 

3

 

 

0.45; 0.56

 

n2C4

+C2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Зміст звіту

1.Постановка задачі.

2.Аналіз задачі (описання алгоритму, який містить рекурентні залежності та структурну блок-схему).

3.Виконані за допомогою калькулятора 4 шага ітераційного процесу, які демонструють його збіжність.

4.Протокол роботи програми (наведення вхідних і вихідних даних). Результати розрахунків оформити у вигляді таблиці для різних значень ε

(0,001; 0,0001; 0,00001; 0,000001) (див. додаток А). 5. Лістинг програм.

Приклад 4. Заданий ряд, що збігається

 

x

2

 

x

3

x

n

 

 

S =1+ x +

 

+

 

+...+... =

 

.

(1)

 

 

 

 

n!

2!

3!

n=0

 

 

Необхідно обчислити суму цього ряду зі заданою точністю ε. Написати структурну блок-схему алгоритма і програму на мовах Фортран і С/С++ з використанням оператора циклу з передумовою.

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

 

n

Отже

n! =1 2 ... n = i . За означенням 0! =1.

 

i =1

Факторіал деяких чисел: 0! = 1; 1! = 1; 2! = 1·2 = 2; 3! = 1·2·3 = 6; 4! = 1·2·3·4 = 24.

Для обчислення членів ряду (1) застосуємо рекурентну залежність

12

Ітератори дозволяють виконувати деякі дії для кожного елемента певного набору даних.

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

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

Type TProc=procedure(p:PObject);

Процедура-ітератор може оголошуватися таким чином:

Procedure GroupIter(group:TGroup;proc:TProc);

Процедура або функція, що передається ітератору, має будти відкомпільована з атрибутом far.

Procedure MyProc(p:PObject);far;

Ітератори можна зробити зручнішим, якщо передавати йому вказівник на процедуру:

Procedure GroupIter(group:TGroup;proc : pointer);

Процедурні типи. У Borland Pascal допускається інтерпретація процедур і функцій, як об'єктів, які можна зберігати в змінних і передавати як параметри. Такі дії можна виконувати за допомогою процедурних типів.

У описі процедурного типу задаються параметри, а для функції – ще і результат функції.

Формат опису процедурного типу: procedure <список формальних параметрів> або

function <список формальних параметрів>:тип результату

Синтаксис запису процедурного типу в точності збігається із записом заголовку процедури або функції, лише опускається ідентифікатор після ключового слова procedure або function. Наведемо деякі приклади описів процедурного типу:

type

53