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

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

1.Бартеньев О. В. Современный Фортран. М.: Диалог-МИФИ, 2005. – 400 с.

2.Лабораторний практикум із програмування та застосування алгоритмі-

чних мов / Укл. Е. Л. Гарт, Ю. О. Лецер. – Дніпропетровськ: РВВ ДНУ, 2009. – 48 с.

3.Немнюгин С. А. Современный Фортран: Самоучитель / С. А. Немнюгин, О. Л. Стесик. – СП6: БХВ–Петербург, 2004. – 496 с.

4.Павловская Т. А. С/С++. Программирование на языке високого уровня / Т. А. Павловская. – СПб.: Питер, 2009. – 461 с.

5.Павловская Т. А. С/С++. Структурное программирование: Практикум / Т. А. Павловская, Ю.А. Щипак. – СПб.: Питер, 2002. – 240 с.

6.Подбельский В. В. Язык Си++: Учебное пособие / В.В. Подбельский. – М.: Финансы и статистика, 1996. – 560 с.

7.Страуструп Б. Язык программирования С++ / Б. Страуструп. – СПб.:

БИНОМ, 1999. – 992 с.

8.Страуструп Б. Дизайн и эволюция языка С++ / Б. Страуструп. – М.:

ДМК, 2000. – 448 с.

48

Лістинг програми (мова Фортран)

*Застосування оператора GOTO

Program SUMM

*Надання константи, що обмежує кількість ітерацій

PARAMETER (M=100) WRITE(*, *)‘Введіть x i eps’ READ(*, *) x, eps

N=0 A=-X*X B=1. CS=COS(X) C=CS*CS D=3.

U=(A*C)/((N+1)*B+N*N*D)

S=S+U

*Перевірка умови виходу із циклу

22 IF (ABS(U).LT.EPS) THEN WRITE(*, 33) S, N

33FORMAT(‘Cума ряду S=’, F15.9, ‘при n=’, I3) STOP

ENDIF

N=N+1

*Запобігання “зациклювання”

IF (N>M) THEN

WRITE(*, *) ‘Точність не досягнута за’, m, ‘ітерацій’

STOP ENDIF A=-A

B=2*n*(2*n-1)*B C=CS*C

D=9.*D U=(A*C)/((n+1)*B+n*n*D) S=S+U

GOTO 22 STOP END

Лістинг програми (мова С/С++)

//Застосування оператора goto

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

//Надання константи, що обмежує кількість ітерацій const int m=100;

double x, eps;

//Підключення кирилиці

setlocale(LC_ALL, “rus”); // Введення-вивід в стилі С

printf("Введіть X i eps: "); scanf(“%lf %lf \n”,x,eps);

double u, s=0, a=-x*x, b=1, cs=cos(x), c=cs*cs, d=3;

17

int n=0; u=(a*c)/((n+1)*b+n*n*d);

//Перевірка умови виходу із циклу

L:if(fabs(u)<eps) {

printf(" Сума ряду s= %15.8lf при n= %3d \n", s, n); return 0

}

n++;

// Запобігання «зациклювання» if (n>m) {

printf("Точність не досягнута за %3d ітерацій \n",n); return 0;

}

a*=-1; b*=2*n*(2*n-1); c*=cs;

d*=9;

u=(a*c)/((n+1)*b+n*n*d);

s+=u; goto L; return 0;

}

Приклад 6. Обчислити суму нескінченного ряду

shx = x +

x3

+

x5

+

x7

+...

x2n+1

+...+

3!

5!

7!

2n +1!

 

 

 

 

 

із с заданою точністю | un |< eps .

Для організації циклічної структури алгоритму застосуємо оператор циклу з параметром (for) і оператор циклу з післяумовою (do…while).

Запишемо ряд у компактному вигляді:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x

2n+1

 

 

 

 

 

 

 

x

2n+1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

shx =

 

 

 

 

 

,

un

=

 

 

 

 

 

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(

2n +1)!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n=0 ( 2n +1)!

 

 

 

 

 

 

 

 

 

 

Знайдемо рекурентні формули:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1)

A = x2n+1 , A = A

 

 

k

A

,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n

 

 

n

 

 

n1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

k

A

=

 

 

An

 

=

 

 

 

x2n+1

 

=

 

x2n+1

=

x2n+1

= x

2n+1( 2n1 )

= x

2

,

 

 

 

 

A

 

 

x2( n1 )+1

x2n2+1

x2n1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

тоді рекурентна формула для обчислення An

примет вид

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

A

 

= õ2

A

1

,

A

= x,

n =1,2,...

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

n

 

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2) Bn =( 2n +1)!,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

kB

=

 

 

( 2n +1)!

 

 

 

=

 

( 2n +1)!

 

=

( 2n +1)!

=

( 2n +1)2n( 2n 1)!

=( 2n +1)2n ,

( 2( n 1) +1)!

( 2n 2 +1)!

 

 

 

 

 

 

 

( 2n 1)!

 

 

 

 

( 2n 1)!

 

 

 

тоді рекурентна формула для обчислення Bn

примет вид

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Bn =( 2n +1)2nBn1 ,

 

B0 =1,

n =1,2,...

 

 

З урахуванням введених означень загальний член ряду имеет вид un = An Bn .

18

6.різності ri2 і середнього арифметичного елементів i -ого стовпчика матриці D;

7.додатку елементів i -ого рядка матриці D, поділеному на ri2 ;

8.додатку елементів i -ого стовпчика матриці D, поділеному на ri2 ;

9.сумі елементів i -ого рядка матриці D, поділеної на 2ri ;

0. сумі елементів i -ого стовпчика матриці D, поділеної на 4ri ;

Зміст звіту

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

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

3.Опис параметрів використаних підпрограм.

4.Протокол роботи програми (вхідні дані, матриця А, вектор В, розв’язок СЛАР при використанні підпрограм SIMQ і GELG, вектор нев′язки R=AX-B).

4.Лістинг програми.

Приклад 1. Ввести з файлу матрицю А та вектор вільних членів В, розв’язати систему АХ=В за допомогою стандартної підпрограми SIMQ.

Лістинг програми (мова Фортран)

PROGRAM SLAR; PARAMETER (N=5); DIMENSION A(N, N), B(N)

OPEN(3, FILE=’DATA.TXT’, STATUS=OLD) READ(3, 10) ((A(I, J), I=1,N), J=1,N) READ(3, 20) (B(I), I=1,N)

CLOSE(3, STATUS=KEEP)

CALL SIMQ(A, B, N, KS) IF (KS.NE.0)

WRITE(*,*) ‘Система не має розв′язків’

GOTO 40 ENDIF

WRITE(*, 30) (B(I), I=1,N) 10 FORMAT (<N>(<N>F10.4)) 20 FORMAT (<N>F10.4)

30 FORMAT (<N>(F10.4, 2X))

40CONTINUE END

47

У табл. 6.2 позначено:

N1, N2 – номери рядка і стовпчика відповідно, яки треба вилучити із матриці С для отримання проміжної матриці D, яка використовується для формування вихідної матриці А;

N3 – номер стовпчика матриці С, за виключенням елемента у рядку N1, який приймається за проміжний вектор R, що використовується для формування вихідного вектора В;

N4 – варіант перетворення матриці D в матрицю А;

N5 – варіант перетворення вектора R в вектор В.

І. Варіанти перетворення матриці D в матрицю А:

1.елементи рядків матриці D розташовуються у порядку зростання;

2.елементи рядків матриці D розташовуються у порядку спадання;

3.елементи стовпчиків матриці D розташовуються у порядку зростання;

4.елементи стовпчиків матриці D розташовуються у порядку спадання;

5.елементи усіх рядків матриці А отримують як полусуму двох сусідніх елементів того ж рядка матриці D (у першого і останнього елементів рядка змінюють знак);

6.елементи усіх стовпчиків матриці А отримують як полусуму двох сусідніх елементів того ж стовпчика матриці D (у першого і останнього елементів стовпчика змінюють знак);

7.елементи матриці А отримують при діленні відповідних елементів матриці D на суму елементів рядка, у якому вони знаходяться;

8.елементи матриці А отримують при діленні відповідних елементів матриці D на суму елементів стовпчика, у якому вони знаходяться;

9.елементи матриці А отримують при діленні відповідних елементів матриці D на середнє геометричне модулів елементів рядка, у якому во-

ни знаходяться;

0.елементи матриці А отримують при діленні відповідних елементів матриці D на середнє геометричне модулів елементів стовпчика, у якому вони знаходяться;

ІІ. Варіанти перетворення вектора R в вектор В

Складові bi вектора В дорівнюють:

1.сумі ri та мінімального елемента i -ого рядка матриці D;

2.сумі ri та мінімального елемента i -ого стовпчика матриці D;

3.подвійному максимальному елементу i -ого рядка матриці D, поділеному на ri ;

4.подвійному максимальному елементу i -ого стовпчика матриці D, поділеному на ri ;

5.різності ri2 і середнього арифметичного елементів i -ого рядка матриці D;

46

Лістинг програми (мова С/С++)

//Застосування оператора for

#include <iostream> #include <math.h> #include <locale> using namespace std; int main () {

const int m=100;

//Підключення кирилиці setlocale(LC_ALL, “rus”); n=0;

double x, eps, un, An, Bn=1, s=0; bool flag=true; cout<<”vvedite x i eps”;

cin >>x>>eps; double x2=x*x; An=x; un= An/Bn; s+=un; for (int n=1; n<m; n++){

if (fabs(un)<eps){flag=true; break;} An*=x2; Bn*=(2*n+1)*2*n; un=An/Bn;

s+=un;

}

if (flag) cout << “\n S= ” << s<<” при n= “; else cout <<”\n Ряд розбігається\n”;}

return 0;

}

Лістинг програми (мова С/С++)

//Застосування оператора do…while

#include <iostream> #include <math.h> #include <locale> using namespace std; int main () {

const int m=100;

//Підключення кирилиці

setlocale(LC_ALL, “rus”); n=0;

double x, eps, un, An, Bn=1, s=0; bool flag=true; cout<<”vvedite x i eps”;

cin >>x>>eps; double x2=x*x; An=x; un= An/Bn; s+=un; do {

n++;

if (n>=m){flag=true; break;} An*=x2; Bn*=(2*n+1)*2*n; un=An/Bn;

s+=un;

} while (fabs(un)>eps);

if (flag) cout << “\n S= ” << s<<” при n= “; else cout <<”\n Ряд розбігається\n”;}

return 0;

}

19

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

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

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

освоєння правил організації масивів;

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

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

Масив – це упорядкований набір однотипних даних, які пов’язані одним ім’ям. На мові Фортран масиви можуть бути описані:

1)операторами опису типів (integer, real, complex, character та інш.);

2)оператором DIMENSION;

3)оператом COMMON.

DIMENSION <ім'я> ([<нижня границя>:] <верхня границя>[,...])[,...]

Тут <ім'я> – ім'я масиву; [<нижня границя>:] – нижня границя вимірів; <верхня границя> – верхня границя вимірів.

Параметри виду [<нижня границя>:], <верхня границя> називаються

описом виміру. Описи вимірів розділяються комами. Є обмеження на кількість вимірів – не більше 7 . Границі вимірів можуть приймати будь-яке значення: «-», «+» або нульове. Причому, значення верхньої границі повинне бути більше або дорівнювати значенню відповідної нижньої границі. Якщо нижня границя не задана, вона дорівнює 1. Границя виміру може бути задана одним з наступних способів:

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

2.Формальним параметром цілого типу або змінної цілого типу із загального блоку. Значення вимірів у цьому випадку визначається під час виконання при вході в підпрограму. Такий масив називається масивом

з регульованим розміром.

3.Символом «*» може бути задана тільки верхня границя останнього виміру. У цьому випадку масив називається масивом з передбачуваним розміром і його розмір установлюється рівним розміру відповідного масиву із головної програми.

4.Арифметичним виразом. Вираз не повинний містити звертань до функції й елементи масивів. Тільки в масивах з регульованим і передбачуваним розміром вираз може містити змінні. Значення виразу перетворюється до цілого типу.

20

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

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

ДЛЯ РОЗВ’ЯЗУВАННЯ СИСТЕМ ЛІНІЙНИХ АЛГЕБРАЇЧНИХ РІВНЯНЬ

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

розвиток навиків використання стандартних підпрограм;

закріплення навиків роботи з масивами.

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

Написати процедуру перетворення заданої у табл. 5.1 матриці С 5-го порядку у матрицю А 4-го порядку і вектор вільних параметрів В системи лінійних алгебраїчних рівнянь (СЛАР) і основну програму, яка викликає згадану процедуру і розв’язує СЛАР Ax = B , де x =( x1 , x2 , x3 , x4 , ) – вектор невідомих

системи, – за допомогою стандартних підпрограм SIMQ і GELG. Зробити перевірку отриманого розв’язку.

Варіанти завдань обираються із табл. 6.2 згідно номеру шифру (кожна цифра шифру – це номер у першому стовпчику, згідно якого обираються послідовно значення N1, N2, N3, N4, N5 як цифри на перехресті відповідних стовпчика і рядка).

 

 

 

 

 

Таблиця 5.1

N

1

2

3

4

5

 

 

 

 

 

 

1

5.3

1.4

-0.5

6.1

-7.3

 

 

 

 

 

 

2

1.5

-2.5

6.4

5.3

-1.6

 

 

 

 

 

 

3

-8.4

5.6

-1.3

7.7

1.5

 

 

 

 

 

 

4

4.7

-1.8

7.2

-3.6

3.4

 

 

 

 

 

 

5

-3.1

2.9

0.9

-4.2

8.7

 

 

 

 

 

 

 

 

 

 

 

 

Таблиця 5.2

N1

N2

 

N3

N4

N5

1

5

1

 

3

1

0

 

 

 

 

 

 

 

2

4

3

 

2

2

9

 

 

 

 

 

 

 

3

3

5

 

1

3

8

4

2

4

 

5

4

7

5

1

2

 

4

5

6

6

5

1

 

3

6

5

 

 

 

 

 

 

 

7

4

2

 

1

7

4

 

 

 

 

 

 

 

8

3

5

 

2

8

3

9

2

4

 

5

9

2

0

1

3

 

4

0

1

 

 

 

45

 

 

Лістинг програми (мова C/C++)

#include "stdafx.h" #include <iostream> #include <locale> #include <stdlib.h> using namespace std; int main () {

const int n=6;

char s[n]; char**end=new char*[n]; long y;

//підключення кирилиці setlocale(LC_ALL, "rus");

//cout<< “Введите текст”;

//введення рядка

for (int i=0; i<n; i++){ cin>>s[i];

// перевірка на допустимість символів if (!(s[i]>='0' && s[i]<='4')){ cout <<"NULL \n";

return 0;}

}

//переведення рядка в число з урахуванням с.с. y=strtol(s, end, 5);

//переведення числа із 10-ої с.с. в 9-ную с.с.; for (int i=0; i<n; i++)

s[i]=' '; int i=n-1; while (y>0){

int x=y%7; s[i]=(char)x+'0'; y/=7;

i--;

}

cout<<"Новое число"; for (int i=0; i<n; i++)

cout<<s[i];

cout<<endl; return 0;

}

44

Примітка. Масиви з регульованим і передбачуваним розміром можуть бути тільки формальними параметрами. Елементи масиву на мові Фортран розташовуються послідовно в пам'яті комп’ютера таким чином, що значення самого лівого індексного виразу збільшується першим, тобто двовимірні ма-

сиви розташовуються по стовпцях.

Щоб звернутися до певного елемента масиву, необхідно вказати його ім'я й індекс цього елемента в круглих дужках:

<ім'я> (<індекс>[,...])

Індекс в одновимірному масиві – це порядковий номер елемента масиву, для двомірного – номер рядка й номер стовпця. Як індекс може виступати константа цілого типу, змінна цілого типу або арифметичний вираз, бажано цілого типу.

Приклад 1.

DIMENSION A(10), В(5,5) K=4

M=3

A(1)=2.5 A(3)=1.7E-7 A(K+M)=D+A(1)

A(4) =A(M)+A(K+1) ! Цей рядок аналогічний виразу: А(4) =А(3) +А(4+1)

В(1,1)=А(1)+2*Ф(2)

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

Одновимірні масиви на мові С/С++ можуть бути описані так:

<тип> <ім’я> [<вимірність>];

Тут <тип> – тип елементів масиву; <ім’я> – ідентифікатор, що визначає ім’я масиву; [<вимірність>] – ціла невід’ємна константа або константний вираз.

Особливістю використання масивів в С/С++ є те, що елементи нумеру-

ються з нуля.

Наприклад,

float a[10]; // опис масиву із 10 дійсних чисел

int b[5]={3,2,1};//опис цілого масиву із 5-ти елементів з присвоюванням початкових значень

// b[0]=3, b[1]=2, b[2]=1, b[3]=0, b[4]=0

21

Для доступу до елементу одновимірного масиву в С/С++ після його імені вказується номер елемента (індекс) в квадратних дужках:

<ім'я> [<індекс>]

Багатовимірні масиви в С/С++ задаються при записи кожного виміру у квадратних дужках

<тип> <ім’я> [<вимірність>][<вимірність>];

Наприклад,

float a[10][10];; // опис двовимірного масиву із 100 дійсних чисел

int b[][]={{3,2,5},{1,4,6},{1,0,3}};//опис цілого масиву із 9-ти елементів з присвоюванням

//початкових значень

b[0][0]=3, b[0][1]=2,

b[0][2]=5,

//

b[1][0]=1, b[1][1]=4,

b[1][2]=6,

//

b[2][0]=1, b[2][1]=0,

b[2][2]=3

Примітка. Елементи масиву

мові на С/С++ розташовуються послі-

довно в пам'яті комп’ютера таким чином, що значення самого правого індексного виразу збільшується першим, тобто двовимірні масиви розташову-

ються по рядкам.

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

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

 

1.6

3.4

5.2 3.2

4.1

 

 

 

1

1

1

1

1

 

 

2.1 3.3

4.5 5.0

7.4

 

 

 

 

2

2

2

2

2

 

 

 

 

 

XX

 

 

 

A =

3.0 8.1 2.2

1.3

5.0

 

+

 

3

3

3

3

3

 

,

 

 

7.2

9.0 1.3

4.0

1.0

 

 

10

2

2

2

2

2

 

 

 

 

 

 

 

 

 

 

5.5

3.4

7.2

5.0

4.3

 

 

 

 

1

1

1

1

1

 

 

 

 

 

 

 

 

 

де ХХ – перші дві цифри шифру у відповідності з нижченаведеними пунктами.

І. Знайти і видати на екран і в файл значення:

1.сум модулів елементів кожного стовпчика;

2.сум модулів елементів кожного рядка;

3.сум елементів кожного стовпчика;

4.сум елементів кожного рядка;

5.добутків елементів кожного стовпчика;

6.добутків елементів кожного рядка;

7.квадратних коренів із сум квадратів елементів кожного стовпчика;

8.квадратних коренів із сум квадратів елементів кожного рядка;

9.квадратів сум квадратних коренів із модулів елементів кожного стовпчика;

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

22

Лістинг програми (мова C/C++)

#include "stdafx.h" #include <iostream> #include <locale> #include <ctype.h> using namespace std; int main () {

const int n=20; char s[n];

int k[10]={0,0,0,0,0,0,0,0,0,0};

//підключення кирилиці setlocale(LC_ALL, "rus"); cout<< "Введите текст\n";

//введення рядка

for (int i=0; i<n; i++){ cin>>s[i];

//перевірка на цифру if(isdigit(s[i])){

//переведення символа в цифру int x= s[i]-'0';

k[x]++; // збільшення лічильника на 1

}

}

// пошук цифри, яка зустрілася максимальну кількість разів int max=k[0];

int im=0;

for (int i=1; i<9; i++) if (k[i]> max) { max= k[i];

im=i;

}

cout<<"Цифра "<<im<< " встретилась максимальное количество раз max="<<max;

cout<<endl; return 0;

}

Приклад 8. Дано рядок із 6 символів в 5-річної системі счислення, перевести його в 9-річну систему счислення, перевірив на допустимість символів. Видати “NULL”, якщо рядок не є правильним записом числа в 5-річній системі счислення.

Алгоритм:

1.Введення рядка і перевірка на допустимість {0..4};

2.Якщо зустрічаємо недопустимий символ - “NULL”- вихід, інакше – перетворюємо рядок в число с урахуванням системи счислення;

3.Перевід числа із 10-ой с.с. в 9-ную с.с.;

4.Виведення на друк отриманого числа;

5.Стоп. Кінець алгоритму.

43

Лістинг програми (мова Фортран)

PROGRAM Z_KR7

PARAMETER (N=6) CHARACTER S(N),MOD

WRITE(*,*)'VVEDITE STROKY IZ',N,'SYMVOLOV' READ(*,1)(S(I),I=1,N)

1 FORMAT(<N>A1) SUM=0.

DO I=1,N

IF (.NOT.(S(I)>='0'.AND.S(I)<='9')) THEN WRITE(*,*)"NO"

STOP

ENDIF L=ICHAR(S(I))-ICHAR('0') SUM=SUM+L

ENDDO IF(MOD(SUM,7).EQ."0") THEN WRITE (*,*)"YES"

ELSE

WRITE (*,*)"NO" ENDIF

END

Приклад 7. Написати програму для введення із клавіатури тексту з 20 символів і виводу на екран цифру, яка входить у цей текст максимальну кількість разів.

Лістинг програми (мова Фортран)

PROGRAM Z_MAX

PARAMETER (N=20)

CHARACTER S(N)

INTEGER K(0:9)/10*0/

WRITE(*,*)'VVEDITE STROKY IZ',N,'SYMVOLOV'

READ(*,1)(S(I),I=1,N)

1FORMAT(<N>A1) DO I=1,N

IF (S(I)>='0'.AND.S(I)<='9') THEN L=ICHAR(S(I))-ICHAR('0') K(L)=K(L)+1

ENDIF ENDDO MAX=K(0) IM=0

DO I=1,9 IF(K(I)>MAX) THEN MAX=K(I)

IM=I ENDIF ENDDO

WRITE(*,2) IM, MAX

2FORMAT('CIFRA', I3, 'VSTRECHAETSYA MAX KOLLICHESTVO RAZ MAX= ',I3) END

42

ІІ. Знайти і видати на екран і в файл значення:

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

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

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

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

5.добуток найбільших елементів головної діагоналі і третього рядка;

6.суми найменших елементів головної діагоналі і третього рядка

7.найбільшого за модулем елемента матриці (при цьому надрукувати його координати);

8.найменшого елемента матриці (при цьому надрукувати його координати);

9.суми квадратів найбільшого елемента першого стовпчика і найменшого

за модулем елемента останнього рядка;

0.добутку найменшого за модулем елемента третього рядка і найбільшого елемента другого стовпчика.

ІІІ. Обчислити матрицю В, яка визначається за формулами:

1.

B = A AT A ;

6.

B =( AT A ) AT ;

2.

B = A AT A ;

7.

B = AT AT A A ;

3.

B = AT A A AT ;

8.

B =( A AT ) A ;

4.

B = AT A AT ;

9.

B =( AT A ) ( A + AT ) ;

5.

B = A AT A ;

0.

B = A ( AT A ) .

Тут AT – транспонована матриця А. При транспонуванні вихідної матриці розмірності mхn потрібно отримати матрицю розмірності nхm, в якій елементи рядків і елементи стовпчиків відповідно міняються місцями.

ІV. Провести над матрицею А вказані нижчі операції :

1.замінити усі від’ємні елементи їх модулями;

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

3.поміняти місцями елементи симетричні відносно побічної діагоналі;

4.поміняти місцями найбільший елемент першого рядка і найменший елемент останнього стовпчика;

5.поміняти місцями найбільший за модулем елемент останнього рядка і найменший за модулем елемент першого стовпчика;

6.поміняти місцями найбільший і найменший елементи матриці;

7.поміняти місцями третій рядок і третій стовпчик;

8.поміняти місцями діагоналі матриці;

9.замінити другій рядок сумою першого і останнього стовпчика;

0.замінити останній стовпчик часткою першого і третього рядків.

23

Зміст звіту

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

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

3.Виконані дії над вихідною та тестовою матрицями, які задані:

у файлі;

у програмі як константи.

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

5.Лістинг програми.

Приклад 1. Написати програму перемноження двох дійсних матриць А іВ 3-го порядку.

 

a11

a12

a13

b11

C = A B =

a

21

a

 

a

b

 

 

 

22 13

21

 

a

a

a

b

 

 

31

 

32

33

31

C ={cij }, cij = N aik bkj , N = 3.

k =1

b12

b13

 

 

b

b

 

,

22

13

 

 

b

b

 

 

32

33

 

 

Лістинг програми (мова Фортран)

*Перемноження двох матриць А і В

PROGRAM MULT

*Надання константи, що визначає порядок матриць

PARAMETER (N=3)

REAL A(N,N), B(N,N), C(N,N)

*Визначення вихідних матриць

 

DATA ((A(I,J),J=1,N),I=1,N)/ 1.1, 1.1, 1.1, 2.1, 2.1, 2.1, 3.1,

*

 

3.1, 3.1/

 

DATA ((B(I,J),J=1,N),I=1,N)/ 4.1, 4.1, 4.1, 3.1, 3.1, 3.1, 4.1,

*

 

4.1, 4.1/

 

DO 20

I=1,N

 

DO 20

J=1,N

 

S=0.

 

 

DO 30

K=1,N

 

S=S+A(I,K)*B(K,J)

30

CONTINUE

 

C(I,J)=S

20

CONTINUE

 

WRITE(*, 100) ((A(I,J),J=1,N),I=1,N)

100FORMAT(‘Матриця A’ /(3X,<N>F4.1, 2X)) WRITE(*, 200) ((В(I,J),J=1,N),I=1,N)

200 FORMAT(‘Матриця В’ /(3X,<N>F4.1, 2X)) WRITE(*, 300) ((C(I,J),J=1,N),I=1,N)

300FORMAT(‘Результат перемноження матриць С=AB’/(3X,<N>F4.1, 2X)) END

24

Зміст звіту

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

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

3.Протокол роботи програми (набір вхідних тестових даних і результати розрахунків).

4.Лістинг програми.

Приклад 5. Дано рядок із 100 символів. Визнати кількість входжень у цю строку рядка ‘abc’.

Лістинг програми (мова Фортран)

PROGRAM STROKA; PARAMETER (N=100); CHARACTER B(N) WRITE(*,*) ‘Введіть строку’

READ (*, 10) (B(I), I=1,N) 10 FORMAT (<N>A1)

М=0

DO 20 I=1, N-2

IF (B(I)=’A’.AND. B(I+1)=’B’.AND.B(I+2)=’C’) M=M+1

20CONTINUE WRITE (*, 30) M

30FORMAT (5X, ‘Кількість входжень "abc" у рядок m=’, I3) END

Лістинг програми (мова C/C++)

#include <iostream> using namespace std; int main () {

const int n=100; char s[n];

cout<<"Введіть рядок \n"; for (int i=0; i<n; i++)

cin >> s[i]; int m=0;

for (int i=0; i<n-2; i++)

if (s[i]==’a’&& s[i+1]==’b’&& s[i+2]==’c’) m=m+1; cout<<”Новий рядок \n”;

for (int i=0; i<n; i++) cout >> s[i];

cout >> " Кількість входжень \"abc\" у рядок m=" >> m; return 0;

}

Приклад 6. Написати програму для введення із клавіатури тексту з 6 символів і виводу на екран рядка 'YES', якщо цей текст є правильним записом цілого десяткового числа без знака, кратного 7. У противному випадку на екран виводиться рядок 'NO'.

41

ковій системі числення, то вивести на екран це число у вісімковій системі числення. Інакше на екран виводиться рядок 'NULL'.

42.Написати програму для введення з клавіатури тексту з 50 символів і виводу на екран цього тексту, замінивши повторні входження кожної парної цифри пропусками.

43.Написати програму для введення з клавіатури тексту з 50 символів і виводу на екран “ущільненого” тексту в зворотному порядку, усунувши пропуски

44.Написати програму для введення з клавіатури тексту з 50 символів і виводу на екран середнього геометричного всіх парних цифр, що входять в текст. Якщо в тексті відсутні цифри, то на екран виводиться ря-

док 'NULL'.

45.Написати програму для введення з клавіатури тексту з 50 символів і виводу на екран середнього арифметичного всіх непарних цифр, що входять в текст. Якщо в тексті відсутні цифри, то на екран виводиться рядок 'NULL'.

46.Написати програму для введення з клавіатури тексту з 20 символів і виводу на екран рядка 'YES', якщо сума числових значень парних і непарних цифр, що входять в цей текст рівна 18 . Інакше на екран виводиться рядок 'NO'.

47.Написати програму для введення з клавіатури тексту з 50 символів і виводуна екран всіх літер, які входять в текст непарну кількість разів.

48.Написати програму для введення з клавіатури тексту з50 символів і виводуна екран «середнього зваженого» значення (всіх цифр, що входять в текст, обчисленогоза правилом: відношеннясуми добутків цифр на кількість їх входжень в текст до суми цифр. Якщо в тексті відсутні цифри, то на екран виводиться рядок 'NULL'.

49.Написати програму для введення з клавіатури тексту з 50 символів і виводуна екран цілого числа, отриманого як сума добутків непарних цифр, що входять в текст, на їх порядкові номери. Якщо в тексті відсутні цифри, то на екран виводиться рядок 'NULL'.

50.Написати програму для введення з клавіатури тексту з50 символів і виводу на екран всіх парних цифр, що входять в текст, в зворотному порядку. Якщо в тексті відсутні цифри, то на екран виводиться рядок 'NULL'.

40

Лістинг програми (мова С/С++)

#include <stdio.h>

using namespace std; int main(){

const int n=3;

float a[n][n] = { {1.1, 1.1, 1.1}, {2.1, 2.1, 2.1}, {3.1, 3.1, 3.1}};

float b[n][n]={ {4.1, 4.1, 4.1}, {3.1, 3.1, 3.1}, {4.1, 4.1, 4.1}};

//Виведення на екран матриці А printf("Матриця А: \n "); for(int i = 0; i < n; i++){

for(int j = 0; j < n; j++) printf("%5.1f", a[i][j]);

printf("\n”);

}

//Виведення на екран матриці B printf(" \n Матриця B: \n "); for(int i = 0; i < n; i++){

for(int j = 0; j < n; j++) printf("%5.1f", b[i][j]);

printf("\n”);

}

//Перемноження матриць

for(int i = 0; i < n; i++) for(int j = 0; j < n; j++){

float s=0;

for(int k = 0; i < n; k++) s+=a[i][k]*b[k][j];

c[i][j]=s;

}

// Виведення на екран матриці C=AB printf("Матриця C=AB: \n"); for(int i = 0; i < n; i++){

for(int j = 0; j < n; j++) printf("%5.1f", c[i][j]);

printf("\n”);

}

return 0;

}

25

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

ЗАСТОСУВАННЯ ПРОЦЕДУР І ФУНКЦІЙ

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

розвиток навиків структурного програмування;

вивчення різних аспектів використання процедур і функцій в практиці програмування.

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

Процедури і функції служать для здійснення однотипних дій. Процедура мови Фортран – це програмна одиниця, яка винесена із

основної програми і оформлена окремо за правилом:

SUBROUTINE <ім’я_процедури> [(<список формальних параметрів>)] < оператори>

END

Процедура не має типу, список формальних параметрів не є обов’язковими. Об’єкти, що входять у список формальних параметрів, відокремлюються один від одного «,».

Для виклику процедури із тіла основної програми використовується оператор CALL :

CALL < ім’я_процедури > ([<список фактичних параметрів>])

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

Функція мови Фортран – це програмна одиниця, яка винесена із основної програми і оформлена окремо за правилом:

[<Тип>] FUNCTION <ім’я_функції > ([<список формальних параметрів>]) < оператори>

END

Тип і список формальних параметрів функції не є обов’язковими, але дужки необхідно залишити. Об’єкти, що входять у список формальних параметрів, відокремлюються один від одного «,».

Обов’язкові елементи процедур і функцій – заголовок (SUBROUTINE або FUNCTION), тіло и оператор END. Процедури і функції можуть мати параметри, мітки переходу всередині себе і свої, локальні, змінні.

Для виклику функції із тіла основної програми використовується конструкція:

< ім’я_змінної >= < ім’я_функції >([<список фактичних параметрів>])

Тип змінної і тип функції повинні бути узгоджені.

Програма на мові С/С++ складається із 3-х основних частин:

1)функція,

2)опис,

3)директиви препроцесора.

26

32.Написати програму для введення з клавіатури тексту з 50 символів і виводу на екран найменшої кількості повторних входжень літер. Якщо в тексті відсутні літери, то на екран виводиться рядок 'NULL'.

33.Написати програму для введення з клавіатури тексту з 50 символів і виводу на екран довжини найменшого рядка в цьому тексті, що складається лишез цифр. Якщо в тексті відсутні цифри, то на екран виводиться рядок 'NULL'.

34.Написати програму для введення з клавіатури тексту з 8 символів і виводу на екран рядка 'YES', якщо цей текст є правильним записом непарного числа без знаку в системі числення з основою 6. Інакше на екран виводиться рядок 'NO'.

35.Написати програму для введення з клавіатури тексту з 12 символів і виводу на екран рядка 'YES', якщо цей текст складається лишез цифр, причому їх числові значення утворюють геометричну прогресію. Інакше на екран виводиться рядок 'NO'.

36.Написати програму для введення з клавіатури тексту з 10 символів і виводу на екран подвоєного значення цілого числа, складеного з послідовності цифр, що входять у введений текст. Якщо в тексті відсутні цифри, то на екран виводиться рядок 'NULL'.

37.Написати програму для введення з клавіатури тексту з 20 символів і виводуна екран потрійного значення цілого числа, складеного з послідовності цифр, що входять у введений текст. Порядок цифр в числі змінений на зворотний в порівнянні з вхідним текстом. Якщо в тексті відсутні цифри, то на екран виводиться рядок 'NULL'.

38.Написати програму для введення з клавіатури тексту з 30 символів і виводуна екран цілого числа, складеного з послідовності цифр, що входять у введенийтекст. Цифри в числі упорядкувати за збільшенням. Якщо в тексті відсутні цифри, то на екран виводиться рядок 'NULL'.

39.Написати програму для введення з клавіатури тексту з 20 символів і виводуна екран цілого числа, складеного з послідовності цифр, що входять у введенийтекст. Цифри в числі упорядкувати по убуванню. Якщо в тексті відсутні цифри, то на екран виводиться рядок 'NULL'.

40.Написати програму для введення з клавіатури тексту з50 символів і виводуна екран всіх цифр, які входять в текст непарну кількість разів.

41.Написати програму для введення з клавіатури тексту з10 символів. Якщо введенийтекст є правильним записом цілого числа без знаку в двій-

39

ка, що закривається, причому між ними можуть знаходитися літери, відмінні від круглих дужок). Інакше на екран виводиться рядок 'NO'.

22.Написати програму для введення з клавіатури тексту з 50 символів і виводу на екран рядка 'YES', якщо в цей текст послідовно (але не обо- в'язково безпосередньо один після одного) входять літери ′a′, ′b′, ′c′, ′d′, ′e′. Інакше на екран виводиться рядок 'NO'.

23.Написати програму для введення з клавіатури тексту з 50 символів і виводу на екран щонайдовшого рядка з цього тексту, що не містить пропусків

24.Написати програму для введення з клавіатури тексту з50 символів і виводуна екран всіх цифр, які входять в цей текст по два рази.

25.Написати програму для введення з клавіатури тексту з10 символів. Якщо введений текст є правильним записом цілого числа без знаку в трійковій системі числення, то вивести на екран це число в п'ятірковій системі числення. Інакше на екран виводиться рядок 'NULL'.

26.Написати програму для введення з клавіатури тексту з50 символів і виводу на екран цього тексту, замінивши повторні входження рядка ′abc′ пропусками.

27.Написати програму для введення з клавіатури тексту з50 символів і виводу на екран цього тексту, замінивши всі входження рядка ′abc′, крім третього, пропусками.

28.Написати програму для введення з клавіатури тексту з50 символів і виводу на екран цього тексту, замінивши повторні входження кожної парної цифри пропусками

29.Написати програму для введення з клавіатури тексту з 50 символів і виводу на екран середнього арифметичного кількостей входжень парних і непарних цифр.

30.Написати програму для введення з клавіатури тексту з 10 символів і виводуна екран рядка 'YES', якщо різниця сум числових значень парних і непарних цифр, що входять в цей текст дорівнює 6. Інакше на екран виводиться рядок 'NO'.

31.Написати програму для введення з клавіатури тексту з 10 символів. Якщо введенийтекст є правильним записом цілого числа без знаку в п'ятірковій системі числення, то вивести на екран це число в системі числення з основою 11. Інакше на екран виводиться рядок 'NULL'.

38

Одна із функцій повинна мати ім’я main. Виконання програми починається з першого оператора цієї функції.

Синтаксис функції мови С/С++: <тип>< ім’я >([<параметри>];

Оператори, що знаходяться в { } називаються тілом функції.

Правила використання:

1)якщо функція не повинна повертати числове значення, то указують тип

«void»;

2) тіло функції є блоком і береться в { };

3)функції не можуть бути вкладеними;

4)кожний оператор закінчується «;».

Приклад (структура програми, що містить функції main, f1, f2).

<директиви препроцесора> <опис>

int main () {

<оператори головної функції>

}

int f1 () {

<оператори функції f1 >

}

int f2 () {

<оператори функції f2 >

}

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

1.Оформити завдання лабораторної роботи № 2 у вигляді двох процедур і двох функцій з параметрами. Організувати виклик цих підпрограм із однієї основної програми.

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

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

Ічастина

1.Процедура maxmin(x,y) присвоює параметру x більше із дійсних чисел x, y, а параметру y – менше. Описати таку процедуру й застосувати її для перерозподілення значень дійсних змінних a,b,c так, щоб стало a≥b≥c.

2.const n=10;

type vector=array[1..n]of real; var a,b,c: vector;

Процедура sum(x,y,z) присвоює вектору z суму векторів x, y. Описати таку процедуру й застосувати її для обчислення d=a+b+c.

27

3. Використовуючи

задані

дійсні

числа

a0 ,a1 ,...,a10 ; b0 ,b1 ,...,b10 ;

c0 ,c1 ,...,c10 ; x, y,z

обчислити величину

 

 

 

 

( a x10 +a x9 +...+a

)2 ( b y10 +b y9 +...+b )

.

0

1

10

0

1

10

 

 

 

 

 

c ( x + z )10

+c ( x + z )9

+...+c

 

 

 

 

 

0

 

1

10

 

 

 

Описати процедуру для введення вектора й функцію для обчислення полінома з коефіцієнтами di ( i = 0,10 ) в точці t.

4.По заданим 10-елементним цілим масивам x, y обчислити

10

5

 

 

xi2

при xi

yi

> 0,

i =1

i =1

 

 

u = 10

5

 

 

yi2

при xi

yi

0.

i =1

i =1

 

 

Обчислення організувати за допомогою процедури.

5.По заданим 10-елементним дійсним масивам a,b,c обчислити

 

min( bi )

 

+

max( ci )

 

при

min( a ) < max( b ),

 

 

 

 

 

 

 

 

min( bi +ci )

 

i

i

t = max( ai )

 

 

 

 

max( b +c ) +min( c )

при

min( a ) max( b ).

 

i

i

i

 

i

i

Обчислення організувати за допомогою процедури.

6.Дано три дійсні матриці 4-го порядку. Надрукувати ту з них, норма якої найменша (вважати, що така матриця одна). За норму матриці взяти максимум абсолютних величин її елементів.

7.Дано дві квадратні дійсні матриці 5-го порядку. Надрукувати квадрат той з них, в якої найменший слід (сума діагональних елементів), вважаючи, що така матриця одна.

8.Дано координати вершин двох трикутників. Визначити який з них має більшу площу.

9.Два простих числа називаються «близнюками», якщо вони відрізняються

друг від друга на 2 (наприклад, 41 і 43). Надрукувати усі пари «близнюків» із відрізка [n,2n] , де n – задане ціле число, більше 2.

10.Дано коефіцієнти поліномів P(x) і Q(x) 15-го ступеня і дано дійсне число a. Обчислити величину P( a +Q( a )P( a +1)) .

11.Дано три цілі матриці розміром 9×4. Надрукувати ту з них, де більше нульових рядків (якщо таких матриць декілька, надрукувати їх усі).

12.Дано натуральне число р і дійсні квадратні матриці А,В,С 4-го порядку.

Отримати (ABC )p .

28

13.Написати програму для введення з клавіатури тексту з 6 символів і виводу на екран рядка 'YES', якщо цей текст є правильним записом парного числа без знаку в семерковій системі числення. Інакше на екран виводиться рядок 'NO'.

14.Написати програму для введення з клавіатури тексту з 10 символів і виводу на екран рядка 'YES', якщо сума числових значень цифр, що входять в цей текст, дорівнює 20. Інакше на екран виводиться рядок 'NO'.

15.Написати програму для введення з клавіатури тексту з 20 символів і виводу на екран рядка 'YES', якщо цей текст починається з деякої ненульової цифри, за якою слідують лише цифри, і їх кількість дорівнює числовому значенню цієї цифри. Інакше на екран виводиться рядок 'NO'.

16.Написати програму для введення з клавіатури тексту з 20 символів і виводу на екран рядка 'YES', якщо цей текст починається з k цифр, причому числове значення k-ой цифри дорівнює k. Інакше на екран виводиться рядок 'NO'.

17.Написати програму для введення з клавіатури тексту з 8 символів і виводу на екран рядка 'YES', якщо цей текст складається лише з цифр, причому їх числові значення утворюють арифметичну прогресію. Інакше на екран виводиться рядок 'NO'.

18.Написати програму для введення з клавіатури тексту з 20 символів і виводу на екран рядка 'YES', якщо числові значення цифр, що входять в цей текст, утворюють арифметичну прогресію. Інакше на екран виводиться рядок 'NO'.

19.Написати програму для введення з клавіатури тексту з 10 символів і виводу на екран цілого числа (integer), складеного зпослідовності цифр, що входять у введений текст. Якщо в тексті відсутні цифри, то на екран виводиться рядок 'NULL'.

20.Написати програму для введення з клавіатури тексту з 10 символів і виводу на екран цілого числа (integer), складеного з послідовності цифр, що входять у введений текст. Порядок цифр в числі змінений на зворотний в порівнянні з вихідним текстом. Якщо в тексті відсутні цифри, то на екран виводиться рядок 'NULL'.

21.Написати програму для введення з клавіатури тексту з20 символів і виводу на екран рядка 'YES', якщо у введеному тексті правильно розставлені круглі дужки (тобто кожній дужці, що закривається, в тексті передує відкриваюча дужка, а за кожною дужкою, що відкривається, слідує дуж-

37

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

1.Написати програму для введення з клавіатури тексту з 50 символів і виводу на екран всіх цифр, які входять в цей текст по одному разу.

2.Написати програму для введення з клавіатури тексту з 50 символів і виводу на екран цього тексту, замінивши повторні входження кожної літери пропусками.

3.Написати програму для введення з клавіатури тексту з 50 символів і виводу на екран загальної кількості літер, які входять в цей текст по одному разу.

4.Написати програму для введення з клавіатури тексту з 50 символів і виводу на екран цього тексту, замінивши повторні входження кожної цифри пропусками.

5.Написати програму для введення з клавіатури тексту з 50 символів і виводу на екран найбільшої кількості повторних входжень літер.

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

7.Написати програму для введення з клавіатури тексту з 50 символів і виводу на екран кількості входжень в цей текст рядка ′abc′.

8.Написати програму для введення з клавіатури тексту з 50 символів і виводу на екран цього тексту, замінивши всі непарні цифри на парні, наступні по порядку.

9.Написати програму для введення з клавіатури тексту з 50 символів і виводу на екран довжини найбільшого рядка в цьому тексті, що складається лише з цифр.

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

11.Написати програму для введення з клавіатури тексту з 15 символів і виводу на екран рядка 'YES', якщо цей текст є правильним записом дійсного числа з плаваючою точкою мови Паскаль. Інакше на екран виводиться рядок 'NO'.

12.Написати програму для введення з клавіатури тексту з 6 символів і виводу на екран рядка 'YES', якщо цей текст є правильним записом цілого десяткового числа без знаку, кратного 7. Інакше на екран виводиться

рядок 'NO'.

36

13.Дано дві цілі квадратні матриці 6-го порядку. Визначити, можна лі відображеннями відносно головної і побічної діагоналей перетворити одну з них в другу.

14.Дано коефіцієнти поліномів P(x) і Q(x) 10-го ступеня і дано дійсне число b. Обчислити величину Q( a P( a )Q( 2a +1)) .

15.Дано координати вершин двох рівнобічних трапецій. Визначити яка з них має меншу площу.

16.Дано три цілі квадратні матриці 5-го порядку. Надрукувати ту з них, у якої більше від’ємних елементів.

17.Дано три дійсні квадратні матриці 4-го порядку. Надрукувати середнє арифметичне значення максимальних елементів головних діагоналей.

18.По заданим 10-елементним цілим масивам x, y обчислити

10

5

 

 

2xi

при xi

+ yi

0,

i=1

i=1

 

 

u = 10

5

 

 

2 yi

при xi

+ yi

< 0.

i =1

i =1

 

 

Обчислення організувати за допомогою процедури.

19.Процедура mult(x,y,z) присвоює вектору z добуток векторів x, y. Описати таку процедуру й застосувати її для обчислення вектора q=abc, де a, b, c – задані векторі із 15-ті елементів.

20.Дано натуральне число n і дійсні квадратні матриці А, В, С 3-го порядку. Отримати (A + B +C )2n .

ІІчастина

1.Надрукувати в оберненому порядку заданий у вхідному файлі текст (за текстом слідує точка).

2.Обчислити значення виразу

5+1( 3 +1( 3 +1( 3 +1( 3 +1( 3 +1( 3 +13 )))))) .

3.У вхідному файлі записано (без помилок) таку формулу: <формула>::=<цифра> | (<формула><знак><формула>); <знак>::= + | – | *; <цифра>::=0|1|2|3|4|5|6|7|8|9.

Ввести цю формулу и обчислити її значення. (Наприклад, 6→6, ((3-1)*5)→10, ((2-7)*(4+5))→-45).

4.Дана послідовність ненульових цілих чисел, за якої слідує 0. Надрукувати спочатку усі від’ємні числа цієї послідовності, а потім – усі додатні (у любому порядку).

29

5.У вхідному файлі дано текст, за яким слідує точка. Перевірити, чи є цей текст правильним записом «формули»:

<формула>::=<цифра> | (<формула><знак><формула>); <знак>::= + | – | *; <цифра>::=0|1|2|3|4|5|6|7|8|9.

(Наприклад, 5; (5+2); ((5-30)*4)).

6.type stroka=array[1..100]of char;

Описати рекурсивну логічну функцію sum(s,i,j), яка перевіряє, чи є симетричною частина строки s, яка починається i-м елементом і закінчується j-м її елементом.

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

<текст>::=<елемент> | <елемент> <текст>; <елемент>::=а|в|(<текст>)| [<текст>]| {<текст>}|.

8.Існує n населених пунктів, перенумерованих від 1 до n (n=10). Деякі пари пунктів поєднані дорогами. Визначити, чи можна попасти по цім дорогам із 1-го пункту в n-й. Інформація про дороги дається у вигляді послідовності пар чисел i, j (i<j), яки указують, що i-й та j-й пункти поєднані дорогою; признак кінця цієї послідовності – пара нулів.

9.Дано n різних натуральних чисел (n=5). Надрукувати усі перестановки цих чисел.

10.У вхідному файлі записано без помилок логічний вираз такого вигляду: <логічний вираз>::=true | false | <операція >( <операнди>); <операція >::=not| and|or; <операнди>::=<операнд>|<операнд>,<операнди>; <операнд>::=<логічний вираз>;

(У операцій and та or може бути довільна кількість операндів, у not – тільки один). Ввести цей вираз і обчислити його значення. (Наприклад, not(or(false, not(false)), true, not(true)) → false).

11.Заданий дійсний масив із n різних елементів (n=100) упорядкувати за зростанням методом швидкого сортування: обрати деякий (наприклад, середній) елемент масиву та переставити елементи масиву так, щоб зліва від обраного елемента оказалися тільки менші елементи, а справа – тільки більші (таким чином, обраний елемент опиниться на своєму кінцевому місці), після чого рекурсивно застосувати цей метод до лівої і правої частин масиву.

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

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

30

Функції роботи з рядками

Підключається заголовний файл <stdlib.h>.

1. atоf – перетворення рядка символів у дійсне число: double atof (<рядок>);

Приклад 3. char s[5]; double y; y=atof (s);

2.atoi – для перетворення рядка в ціле число: int atoi (<рядок>);

3.atol – для перетворення рядка в довге ціле число: long atol (<рядок>);

4.strtol – для перетворення рядка в число з урахуванням системи числення:

long strtol (<рядок>, char**end, <осн. с.з.>)

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

У програмі повинна бути присутня конструкція char**end=new char*[n]; (оголошення змінної-покажчика на покажчик типу char і виділення пам'яті під масив покажчиків на елементи рядка).

Приклад 4. (перетворення рядка з 5-ти символів в 7-ричной с.с. у число десяткової с.с.).

const int n=5;

char s[n]; char**end=new char*[n]; long y;

y=strtol (s, end, 7);

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

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

35

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

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

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

оволодіння правилами використання символьних масивів.

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

Рядок мови C/C++ – це масив символів, що закінчується нульсимволом.

Нуль-символ – символ з кодом, який дорівнює 0 і записується у вигляді керуючої послідовності '\0'. По положенню нуль-символу визначається фактична довжина рядка.

Приклад 1.

char str[10]=”Рядок”; ‘Р’ ‘я’ ‘д’ ‘о’ ‘к’ ‘\0’

6 байт Операція присвоювання одного рядка іншому не визначена і може ви-

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

Функції роботи із символами

Підключається заголовний файл <ctype.h>.

1.перевірка чи є символ буквою або цифрою (A-z, a-z,0-9): int isalnum (<символ>);

char

Результат дії: true (істина), якщо <символ> - буква або цифра;

2.перевірка чи є символ буквою (A-z, a-z): int isalpha (<символ>);

char

Результат дії: true (істина), якщо <символ> - буква;

3.перевірка чи є символ цифрою: int isdigit (<символ>);

char

Приклад 2.

Фортран:

if (s(i).ge.'0'.and.S(i).le'9') then ...

C/C++:

if (digit(s[i]))...

34

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

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

16.Рекурсивно описати функцію C(m,n), де 0mn, для обчислення біноміального коефіцієнта Cnm за такою формулою:

C0 = Cn =1, Cm = Cm+Cm1 , 0 < m < n .

n n n n 1 n 1

17.Описати функцію min(x) для визначення мінімального елемента вектора x, вводячи допоміжну рекурсивну функцію min1(k), яка знаходить мінімум серед останніх елементів вектора x, починаючи з k-ого.

18.Процедура Sk(a,b,p,q) від цілих параметрів (b≠0) приводить дріб a/b до нескороченого вигляду p/q. Описати таку процедуру й застосувати її для приведення дробі 1+1/2+1/3+…+1/20 до нескороченого вигляду c/d.

19.Написати рекурсивну функцію без параметрів, яка підраховує кількість літер ‘a’ в тексті, який задано у вхідному файлі (за текстом слідує точка).

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

Зміст звіту

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

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

3.Протокол роботи програми (набір вхідних тестових даних і результати розрахунків).

4.Лістинг програми.

Приклад 1. Обчислити площу чотирикутника АВСD, для якого задані довжини його сторін.

Представимо площу чотирикутника АВСD як суму площин двох трикутників АВС і АСD. За формулою Герона площа трикутника АВС дорівнює

S ABC = p( p a )( p b )( p c ) ,

де p =( a +b +c ) / 2 , a = AB, b = BC, c = AC .

Тоді S ABC = S ABC + S ACD .

Лістинг програми (мова Фортран)

PROGRAM S

WRITE(*,*) ‘Введіть довжини сторін’

READ(*,*) AB, BC, CD, DA, AC PL=TR(AB, BC, AC)+TR(CD, DA, AC) WRITE (*, 10) PL

31

10FORMAT(10X, ‘Площа чотирикутника АВСD дорівнює’, F8.2) END

*Підпрограма визначення площі чотирикутника

FUNCTION TR (A, B, C) P=(A + B + C)/2.

TR=SQRT (P*(P–A)*(P–B)*(P–C)) RETURN

END

Лістинг програми (мова С/С++)

#include <iostream> #include <math.h> using namespace std;

// Оголошення функції

float function TR(float, float, float); int main(){

float AB, BC, CD, DA, AC, Pl; cout<< ”Введіть довжини сторін”; cin >>AB, BC, CD, DA, AC;

// Виклик функції

PL=TR(AB, BC, AC)+TR(CD, DA, AC); cout << “Площа трикутника:">> PL; return 0;

}

//Опис функції для визначення площі чотирикутника float function TR(float A, float B, float C){

float P=(A + B + C)/2.; TR=SQRT(P*(P–A)*(P–B)*(P–C)); return (TR);

}

Приклад 2. Написати функцію з параметрами для обчислення значень сум модулів елементів кожного стовпця квадратної дійсної матриці n-го порядку. Написати основну програму для введення з файлу a:\b.txt елементів квадратної дійсної матриці В 5-го порядку, виклику зазначеної вище процедури й видачі результатів на екран (використати форматний вивід).

Лістинг програми (мова С/С++)

#include <stdio.h> #include <math.h> using namespace std;

//Оголошення функції

void sum_str (float[n][n], float[n], int); int main () {

const int n=5; float B[n][n], St[n]; File*fi;

fi=fopen("a:\b.txt ", "rt"); for (int i=0; i<n; i++)

for(int j=0; j<n; j++) fscanf(fi, "%f", &B[i][j]); fclose(fi);

//Виклик функції sum_str(B, St, n);

//Виведення результатів printf("Vektor-stolbec:\n"); for (int i=0; i<n; i++)

32

printf ("%5.1f", St[i]); return 0;

}

//Опис функції для обчислення суми модулів елементів кожного рядка матриці void sum_str(float B[n][n], float St[n], int n) {

for (int i=0; i<n; i++){ float S=0;

for(int j=0;j<n;j++) S+=fabs(B[i][j]);

St[i]=S;

}

}

Приклад 3. Написати функцію з параметрами для обчислення середнього арифметичного значення найбільших елементів кожного стовпця квадратної дійсної матриці n-го порядку. Написати основну програму для введення з файлу с.txt елементів квадратної дійсної матриці С 4-го порядку, виклику зазначеної вище підпрограми-функції й видачі отриманого значення на екран (використати форматний вивід).

Лістинг програми (мова С/С++)

#include<stdio.h> using namespace std;

//Оголошення функції

float sr_arifm (float[n][n], int); int main () {

const int n=4; float C[n][n]; File*fi;

fi=fopen("c.txt","rt"); for (int i=0; i<n; i++)

for(int j=0; j<n; j++) fscanf(fi, "%f", &C[i][j]);

fclose(fi); //Виклик функції

float Sa=sr_arifm(C, n); //Друк результатів

printf("srednee arifmeticheskoe: %5.1f", Sa); return 0;

}

//Опис функції для обчислення середнього арифметичного максимальних элементів // кожного стовпчика матриці

float sr_arifm(float C[n][n], int n) { float Sa=0, max;

for (int j=0; j<n; j++){ max=C[0][j];

for (int i=1; i<n; i++)

if (C[i][j]>max) max=C[i][j]; Sa+=max;

}

return (Sa/n);

}

33