logo (068) 202 57 83     (095) 710 36 67
help
Заявка
help
Viber
help
Skype
email_icon
E-mail
Joomla Templates and Joomla Extensions by JoomlaVision.Com
Мы профессионально позаботимся о Вашей успешности 24 часа в сутки 7 дней в неделю

Контрольна робота з програмування

З М І С Т

1

Завдання…………………………………………………………..

2

2

Пояснювальний материал……………………………………….

3

3

Узагальнена блок-схема алгоритму ..............................………..

4

4

Базова програма реалізації алгоритму………………………….

5

5

Програма з використанням  процедур………………………….

6

6

Модуль глобальних описів………………………………………

8

7

Сервісний модуль обслуговування матриці……………………

8

8

Головна програма………………………………………………...

8

9

Результати  роботи програми……………………………………

10

10

Література………………………………………………………...

10

ЗАВДАННЯ

Загальне завдання

1.По функції f(i,j), що задана, необхідно сформувати квадратну матрицу   A = {aij}, i,j = 1,2, …,…, m, де aij = f(i,j). (Для демонстрації m =5. )

2.Після чого із цієї матриці  відповідно до заданого алгоритму необхідно отримати  компоненти вектора   X = {xi}, i = 1,2, … , n.

3. Після отримання компонентів вектора X обчисліти значення  функції  U.

Індивідуальне завдання

(Вар № 8)

1.Функція  f(i,j)= (j – 5,7)j-3 ( i - |j-7|4 ) (i +7,6) ln(|tg(i/2)|)

2. За xi прийняти скалярний добуток допоміжної діагоналі на i-й стовпчик, якщо сума першого і останнього елементів діагоналі від'ємна, інакше за вектор X взяти перший за порядком непарний стовчик, сума єлементів якого не перевищує суму елементів головної  діагноналі.

3.

ПОЯСНЮВАЛЬНИЙ  МАТЕРІАЛ 

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

З огляду на ту  обставину, що в мові Pascal відсутні убудовані функції: зведення в довільний ступінь і знаходження тангенсу, вихідний вираз для формування елемента матриці (блок №5) для використання  в програмі перетворено з урахуванням наступних властивостей:

1) j-3 представлено як  EXP(-3*Ln(j)) )), що випливає з розгляду наступного положення. Тому як існує убудована функція  exp(x) - експонента, то ми  маємо право записати для будь якого числа А таке співвідношення Ab=ex.  Далі, узявши логарифм по підставі e від правої і лівої частини цієї рівності, одержимо  x = b*ln(A). Отже,  Ab = exp( b*ln(A)).

2) tg(i/2) представлено як SIN(i/2)/COS(i/2), що випливає з основних тригонометричних тотожностей.

Елементи матриці будемо обчислювати у подвійному циклі, зовнішній цикл – рядки, внутрішній – стовпці. В блок-схемі блоки 3-5.

ІІ. Значення елементів вектора Х залежить від суми першого і останнього елементів допоміжної діагоналі. В таблиці допоміжна діагональ відмічена кольором, вона описується залежністю

a[i,n+1-i]

Тому перший її елемент a[1,n], а останній a[n,1]. Перевіряємо, чи буде сума цих елементів від’ємним числом(блок 9). Якщо так то за xi приймаємо скалярний добуток допоміжної діагоналі на i-й стовпчик(блок 10-13). Для цього використовуємо подвійний цикл, в зовнішньому циклі (10)

надаємо початкове значення елементу Х[i]=0, перебираємо  індекси вектора Х та номер стовпчику, а во внутрішньому(12) номер строки.

В противному випадку знаходимо суму елементів допоміжної діагоналі(блоки 14-16), потім знаходимо суму елементів непарних рядків до тих пір, поки не знайдемо рядок в якому сума елементів не перевищує суму елементів допоміжної діагоналі. Для цього в циклі перебираємо непарні рядки та знаходимо суму елементів кожного (блоки 18-22).

Ш. Щоб знайти значення функції U, знаходимо в циклі суму елементів вектора Х, та суму модулів цих елементів(блоки 29-31), потім знаходимо частку цих величин.(блок 32) і виводимо результат на екран (33)

БАЗОВА ПРОГРАМА РЕАЛІЗАЦІЇ АЛГОРИТМУ

program Bazova;

uses crt; {подключение стандартного модуля}

var i,j,m,n:integer;  {описание переменных}

s,s1,U:real;

a:array[1..100,1..100] of real;

x:array[1..100] of real;

begin

clrscr; {очистка экрана}

write('n='); {введение размерности матрицы}

readln(n);

for i:=1 to n do {заполнение матрицы в двойном цикле}

for j:=1 to n do

a[i,j]:=(j-5.7)*EXP(-3*Ln(j))*(i-ABS(j-7)*ABS(j-7)*ABS(j-7)*ABS(j-7))*(i+7.6)*Ln(ABS(SIN(i/2)/COS(i/2)));

writeln('Заполненная матрица:');

for i:=1 to n do {вывод сформированной матрицы на экран}

begin

for j:=1 to n do

write(a[i,j]:10:2,' ');

writeln;

end;

{Формирование вектора Х}

if a[1,n]+a[n,1]<0 then  {проверка, будет ли сумма первого и последнего э-та диагонали отрицательным числом}

begin

for i:=1 to n do {скалярное произведение дополнительной диаганали на i-й столбец}

begin

x[i]:=0;

for j:=1 to n do

x[i]:=x[i]+a[j,i]*a[j,n+1-j];

end;

end

else {если условие не выполнилось}

begin

s:=0;{обнуляем начальное значение суммы}

{находим сумму эл-тов дополнительной диагонали}

for i:=1 to n do s:= s+a[i,n+1-i];

i:=-1;{начальное значение i приймем -1}

{что бы при первом прохождении цикла получить 1}

repeat

s1:=0;

i:=i+2;{переход к следующему нечетному столбцу}

{нахождение суммы эл-тов этого столбца}

for j:=1 to n do s1:=s1+a[j,i];

until (i>n) or (s1<=s);{проверка условия выполнения цикла,}

{сумма эл-тов столбца не должна превышать сумму эл-тов диагонали}

if i<=n then

for j:=1 to n do x[j]:=a[j,i]; {заполнение эл-тов массива Х}

end;

{конец формирования массива Х}

writeln;

writeln('Вектор X:');

{вывод вектора Х на экран}

for i:=1 to n do writeln('X[',i,']=',x[i]:10:2);

{нахождение значения функции U}

s:=0;s1:=0;{обнуляем начальные значения сумм}

for i:=1 to n do {в цикле находим суммы эл-тов Х и их модулей}

begin

s:=s+x[i];

s1:=s1+ABS(x[i]);

end;

U:=s/s1; {находим частное этих сумм}

writeln;

writeln('U=',U:10:2); {вывод U на экран}

repeat until keypressed; {задержка до нажатия любой клавиши}

end.

ПРОГРАМА З ВИКОРИСТАННЯМ ПРОЦЕДУР

program Proc;

uses crt; {подключение стандартного модуля}

var i,j,m,n:integer;  {описание переменных}

s,s1,U:real;

a:array[1..100,1..100] of real;

x:array[1..100] of real;

procedure vvod;{процедура заполнения матрицы}

begin

for i:=1 to n do {заполнение матрицы в двойном цикле}

for j:=1 to n do

a[i,j]:=(j-5.7)*EXP(-3*Ln(j))*(i-ABS(j-7)*ABS(j-7)*ABS(j-7)*ABS(j-7))*(i+7.6)*Ln(ABS(SIN(i/2)/COS(i/2)));

end;

procedure vivod; {процедура вывода сформированной матрицы на экран}

begin

writeln('Заполненная матрица:');

for i:=1 to n do

begin

for j:=1 to n do

write(a[i,j]:10:2,' ');

writeln;

end;

end;

procedure vector; {процедура формирования вектора Х}

begin

if a[1,n]+a[n,1]<0 then  {проверка, будет ли сумма первого и последнего э-та диагонали отрицательным числом}

begin

for i:=1 to n do {скалярное произведение дополнительной диаганали на i-й столбец}

begin

x[i]:=0;

for j:=1 to n do

x[i]:=x[i]+a[j,i]*a[j,n+1-j];

end;

end

else {если условие не выполнилось}

begin

s:=0;{обнуляем начальное значение суммы}

{находим сумму эл-тов дополнительной диагонали}

for i:=1 to n do s:= s+a[i,n+1-i];

i:=-1;{начальное значение i приймем -1}

{что бы при первом прохождении цикла получить 1}

repeat

s1:=0;

i:=i+2;{переход к следующему нечетному столбцу}

{нахождение суммы эл-тов этого столбца}

for j:=1 to n do s1:=s1+a[j,i];

until (i>n) or (s1<=s);{проверка условия выполнения цикла,}

{сумма эл-тов столбца не должна превышать сумму эл-тов диагонали}

if i<=n then

for j:=1 to n do x[j]:=a[j,i]; {заполнение эл-тов массива Х}

end;

end;

procedure vivodX;{процедура вывода вектора Х на экран}

begin

writeln('Вектор X:');

for i:=1 to n do writeln('X[',i,']=',x[i]:10:2);

end;

procedure Fun_U;{нахождение значения функции U}

begin

s:=0;s1:=0;{обнуляем начальные значения сумм}

for i:=1 to n do {в цикле находим суммы эл-тов Х и их модулей}

begin

s:=s+x[i];

s1:=s1+ABS(x[i]);

end;

U:=s/s1; {находим частное этих сумм}

end;

begin

clrscr; {очистка экрана}

write('n='); {введение размерности матрицы}

readln(n);

vvod; {Вызов процедуры заполнения матрицы}

vivod;{Вызов процедуры вывода матрицы А на экран}

vector; {Вызов процедуры заполнения массива Х}

writeln;

vivodX; {Вызов процедуры вывода вектора Х на экран}

Fun_U;  {Вызов процедуры нахождения значения функции U}

writeln;

writeln('U=',U:10:2); {вывод U на экран}

repeat until keypressed; {задержка до нажатия любой клавиши}

end.

МОДУЛЬ ГЛОБАЛЬНИХ ОПИСІВ

unit Glob;

interface

type

Matr=array[1..50,1..50] of real;

Vect=array[1..50] of real;

implementation

end.

СЕРВІСНИЙ МОДУЛЬ ОБСЛУГОВУВАННЯ МАТРИЦІ

unit matrica;

interface

uses Glob;

procedure vvod(n:integer;var ma:matr);

procedure vivod(ma:matr;n:integer);

implementation

uses crt;

procedure vvod(n:integer;var ma:matr);

var i,j: integer;

begin

clrscr;

for i:=1 to n do {заполнение матрицы в двойном цикле}

for j:=1 to n do

ma[i,j]:=(j-5.7)*EXP(-3*Ln(j))*(i-ABS(j-7)*ABS(j-7)*ABS(j-7)*ABS(j-7))*(i+7.6)*Ln(ABS(SIN(i/2)/COS(i/2)));

end;

procedure vivod(ma:matr;n:integer);

var i,j:integer;

begin

writeln('Заполненная матрица:');

for i:=1 to n do {вывод сформированной матрицы на экран}

begin

for j:=1 to n do

write(ma[i,j]:10:2,' ');

writeln;

end;

end;

end.

ГОЛОВНА ПРОГРАМА

program glav;

uses crt,glob,matrica;

var i,j,m,n:integer;  {описание переменных}

s,s1,U:real;

a:matr;

x:vect;

begin

clrScr;

write('n='); {введение размерности матрицы}

readln(n);

vvod(n,a);

vivod(a,n);

{Формирование вектора Х}

if a[1,n]+a[n,1]<0 then  {проверка, будет ли сумма первого и последнего э-та диагонали отрицательным числом}

begin

for i:=1 to n do {скалярное произведение дополнительной диаганали на i-й столбец}

begin

x[i]:=0;

for j:=1 to n do

x[i]:=x[i]+a[j,i]*a[j,n+1-j];

end;

end

else {если условие не выполнилось}

begin

s:=0;{обнуляем начальное значение суммы}

{находим сумму эл-тов дополнительной диагонали}

for i:=1 to n do s:= s+a[i,n+1-i];

i:=-1;{начальное значение i приймем -1}

{что бы при первом прохождении цикла получить 1}

repeat

s1:=0;

i:=i+2;{переход к следующему нечетному столбцу}

{нахождение суммы эл-тов этого столбца}

for j:=1 to n do s1:=s1+a[j,i];

until (i>n) or (s1<=s);{проверка условия выполнения цикла,}

{сумма эл-тов столбца не должна превышать сумму эл-тов диагонали}

if i<=n then

for j:=1 to n do x[j]:=a[j,i]; {заполнение эл-тов массива Х}

end;

{конец формирования массива Х}

writeln;

writeln('Вектор X:');

{вывод вектора Х на экран}

for i:=1 to n do writeln('X[',i,']=',x[i]:10:2);

{нахождение значения функции U}

s:=0;s1:=0;{обнуляем начальные значения сумм}

for i:=1 to n do {в цикле находим суммы эл-тов Х и их модулей}

begin

s:=s+x[i];

s1:=s1+ABS(x[i]);

end;

U:=s/s1; {находим частное этих сумм}

writeln;

writeln('U=',U:10:2); {вывод U на экран}

repeat until keypressed; {задержка до нажатия любой клавиши}

end.

РЕЗУЛЬТАТИ РОБОТИ ПРОГРАМИ

n=5

Заполненная матрица:

-31646.20   -1500.55    -132.58     -11.05      -0.44

25866.01    1225.45     108.03       8.92       0.33

170465.82    8069.43     709.68      58.12       2.04

55058.18    2604.14     228.49      18.54       0.61

-22298.31   -1053.78     -92.24      -7.42      -0.23

Вектор X:

X[1]=761814375.87

X[2]=36017430.48

X[3]=3156484.87

X[4]=  255047.56

X[5]=       8086.87

U=      1.00

ЛІТЕРАТУРА

  1. В.Б. Попов Паскаль и Дельфи. Учебный курс,  Санкт-Питербург, Питер, 2005
  1. В.В. Фаронов Turbo Pascal , Санкт-Питербург, Питер, 2007
  1. Д.Б. Поляков, И.Ю. Круглов. Программирование в среде Турбо Паскаль , Москва , МАИ, А\О “РОСВУЗНАУКА”, 1992.
  1. Ф.Б. Бартків, Я.Т. Гринчишин, А.М. Ломакович, Ю.С. Рамский. TURBO PASCAL: Алгоритми и програми. Київ, «Вища школа», 1992.

База готовых работ: