Томський міжвузівський центр дистанційної освіти
Томський державний університет систем управління та радіоелектроніки (ТУСУР)
Кафедра економіка
Контрольна робота № 1
з дисципліни «інформатика»
автор посібника Тимченко С.В., Сметанін С.І.
варіант № 1
Виконала
Студентка гр.З-828-Б
Спеціальності 080105
Афоніна Юлія Володимирівна
Г. Нефтеюганськ
2009
Завдання № 1. «Висловлювання і умовний оператор IF»
Обчислити значення функції f в точці x.
Рішення:
Program prog1;
Var
f, x: real;
Begin
writeln ('Розрахунок значення функції в заданій точці');
write ('Введіть число x:');
readln (x);
if x <0 then f: = SQR (x +3) else
begin
if x <4 then f: = sin (x-2) / (SQR (x) -16)
else f: = SQRT (x-4);
end;
writeln ('Значення f (', x: 0:8, ') =', f: 0:8);
readln;
end.
Тестування програми:
X =- 1 (виконано першу умову, x <0):
Розрахунок значення функції в заданій точці
Введіть число x: -1
Значення f (-1.00000000) = 4.00000000
X = 3 (виконано друга умова, 0 <= x <4):
Розрахунок значення функції в заданій точці
Введіть число x: 3
Значення f (3.00000000) = -0.12021014
X = 5 (виконано третя умова, x> = 4):
Розрахунок значення функції в заданій точці
Введіть число x: 5
Значення f (5.00000000) = 1.00000000
Програма дає вірні результати, налагодження завершена.
Які типи використовувалися при описі змінних у програмі?
При описі даної програми використовувалися змінні дійсного типу.
Типом даних називається безліч допустимих значень цих даних, а також сукупність операцій над ними. Типи поділяються на такі групи: прості, структуровані, покажчики, процедурні, об'єкти. Є стандартні (зумовлені) і які визначаються програмістами в розділі, що починається зі слова Type. Прості типи визначають впорядкована множина значень елементів і діляться на речові, цілі, символьний, логічний, що перераховується і тип-діапазон. Речові типи визначають дробові числа і представлені 5 стандартними типами: real, single, double, extended, comp. Цілі типи визначають цілі числа і представлені 5 стандартними типами: integer, longint, shortint, byte, word, стандартний символьний тип char визначає повний набір допустимих символів. Стандартний логічний тип Boolean представляє собою тип даних, кожен елемент якого може приймати 1 з 2-х значень: False (брехня), True (правда). Перераховується тип не є стандартним і визначається набором ідентифікаторів, до яких може збігатися значення елемента даних.
У даній програмі вибір типу real для змінної x обумовлений тим, що функції sqrt (x), sin (x) і sqr (x) допускають аргументи такого типу. А так як значення функції sin (x) має тип real для аргументу типу real, то для змінної f необхідно також вибрати тип real.
Завдання № 2. «Оператори циклів»
Завдання:
Обчислити суму s значень функції f в точках x i які беруться з заданого інтервалу [a; b] через рівні відрізки довжиною h. Довжина відрізка розраховується за формулою . Тут i = 1,2,3 ... n - номер точки; n - задається кількість точок; a - начло і b - кінець інтервалу зміни x. Вивести на екран результати обчислень, отримані за допомогою наступних циклів:
While логіческое_вираженіе Do тіло _ циклу;
Repeat тіло _ циклу Until логічне _ вираз;
For параметр: = хв. _ Значення To макс. Do тіло _ циклу;
For параметр: = макс. _ Значення DownTo хв. Do тіло _ циклу;
При виконанні завдання спочатку в програмі потрібно задати значення вихідних даних: межі інтервалу a і b, кількість точок n. Це можна зробити, описавши відповідні константи в розділі оголошення констант Const.
Потім за допомогою операторів циклів, записуваних в програмі послідовно один за одним в будь-якому порядку проходження, необхідно в кожному з циклів обчислити суму s і вивести її на екран, тобто в одній програмі вирішити завдання 4-ма способами. Таким чином, в результаті виконання програми на екрані повинні бути 4 значення s, що збігаються між собою.
Рішення:
Program prog2;
const
a = 3;
b = 10;
n = 10;
var
s, x, h: real;
i: integer;
begin
writeln ('Обчислення суми значень функції');
h: = (ba) / (n-1);
writeln ('a =', a);
writeln ('b =', b);
writeln ('n =', n);
writeln ('h =', h: 0:8);
writeln;
{Цикл "while"}
writeln ('1. Цикл "while" ');
x: = a;
s: = 0;
i: = 1;
while i <= 10 do
begin
s: = s + sin (x +3) / exp (2 / 5 * ln (x +3));
x: = x + h;
i: = i +1;
end;
write ('Значення s:');
writeln (s: 0:8);
{Цикл "repeat"}
writeln ('2. Цикл "repeat" ');
x: = a;
s: = 0;
i: = 1;
repeat
s: = s + sin (x +3) / exp (2 / 5 * ln (x +3));
x: = x + h;
i: = i +1;
until i> 10;
write ('Значення s:');
writeln (s: 0:8);
{Цикл "for ... to ... do"}
writeln ('3. Цикл "for ... to ... do" ');
x: = a;
s: = 0;
for i: = 1 to 10 do
begin
s: = s + sin (x +3) / exp (2 / 5 * ln (x +3));
x: = x + h;
end;
write ('Значення s:');
writeln (s: 0:8);
{Цикл "for ... downto ... do"}
writeln ('4. Цикл "for ... downto ... do" ');
x: = a;
s: = 0;
for i: = 10 downto 1 do
begin
s: = s + sin (x +3) / exp (2 / 5 * ln (x +3));
x: = x + h;
end;
write ('Значення s:');
writeln (s: 0:8);
readln;
End.
Тестування програми:
Змінні a, b, h задані в розділі констант в програмі:
const
a = 3;
b = 10;
n = 10;
Результат роботи програми:
Обчислення суми значень функції
a = 3
b = 10
n = 10
h = 0.77777778
Результати обчислень, отримані за допомогою різних циклів:
Цикл While:
1. Цикл "while"
Значення s: 0.15809431
Цикл repeat:
2. Цикл "repeat"
Значення s: 0.15809431
Цикл For ... To ... Do:
3. Цикл "for ... to ... do"
Значення s: 0.15809431
Цикл For ... DownTo ... Do:
4. Цикл "for ... downto ... do"
Значення s: 0.15809431
Програма дає однакові результати для всіх циклів, налагодження завершена.
Опишіть оператор While.
Оператор While має наступну структуру:
While логічне вираження do оператор;
Працює цей оператор дуже просто. Обчислюється значення логічного виразу. Якщо виходить істина (True), то виконується оператор, а потім знову обчислюється значення логічного виразу. Якщо знову виходить істина, то знову виконується оператор, і т.д. Так продовжується до тих пір, поки при обчисленні логічного виразу не вийде брехня (False). Після цього оператор While закінчує свою роботу і передає дію наступному оператору.
Зокрема, якщо на самому початку роботи While при обчисленні логічного виразу виходить брехня, то оператор не виконається жодного разу. Як завжди, в якості оператора може виступати деякий складений оператор. Може здатися дивним, що оператор While взагалі коли-небудь закінчує свою роботу. Справді, чому одне і те ж логічне вираз спочатку було істинним, а потім, після декількох виконань оператора, стало хибним? Логічний вираз залежить від декількох змінних, значення яких змінюється під час виконання оператора, що тягне за собою зміни значення логічного виразу. У принципі, це зовсім не означає, що кожен оператор While коли-небудь закінчує роботу. Тобто, не виключена ситуація, коли логічне вираз завжди буде істинним, і оператор While працюватиме вічно. Така ситуація називається зацикленням. Таким чином, при використанні оператора While і взагалі інших циклічних операторів потрібно бути акуратним і намагатися уникати зациклення. Це означає, що при програмуванні будь-якого циклу потрібно намагатися завжди пояснити самому собі, чому цей цикл не буде вічним, а коли-небудь закінчить свою роботу.
У чому її основні відмінності від інших циклів Turbo Pascal?
Цикл while має наступні відмінності від оператора repeat:
У операторі while перевірка умови виходу виконується на початку виходу, а у repeat в кінці.
Тіло циклу може виконуватися жодного разу в while, а в repeat завжди виконується хоча б один раз;
Умова виходу задовольняється, якщо вираз помилково, repeat - якщо це правда,
Тіло циклу має містити тільки один оператор, а в repeat можна помістити будь-яку кількість операторів.
Оператор For: Якщо значення умовного виразу істинне, то цикл продовжує виконуватися, а якщо значення умовного вираження помилково, то відбувається вихід з циклу. Після виходу з циклу йде перехід до наступного оператору програми. Зміна - це вираз, що визначає, як буде змінюватися параметр циклу. У операторі for спочатку перевіряється умова і якщо значення умови "істинно", то йде виконання тіла циклу (блоку операторів або простого оператора).
Завдання № 3. «Масиви та підпрограми»
Результатом виконання третього завдання повинна бути програма, написана з використанням підпрограм - не менше 2 процедур і 1 функції.
Завдання пов'язане з діями над квадратною матрицею m [n, n], у якій кількість рядків і стовпців одно n (2 ≤ n ≤ 10). Матриці можуть бути або речового, або цілого типу. Значення компонентів матриці слід задавати випадковим чином і в такому діапазоні, щоб отримані дані були нетривіальними, тобто неочевидними, не лежать на поверхні.
Завдання:
Знайти мінімальне та максимальне значення компонентів квадратної речовій матриці m [n, n].
Поміняти місцями в матриці m [n, n] компоненти рядка, що містить мінімум, з компонентами стовпця, який містить максимум. Якщо мінімумів або максимумів в матриці кілька, то взяти рядок і стовпець перших зустрічних при переборі з мінімумів і максимумів відповідно.
У одновимірний масив v [n] записати компоненти головної діагоналі зміненої матриці m [n, n] (індекси рядка та стовпця головної діагоналі рівні).
Обчислити суму компонентів отриманого масиву v [n].
На екран вивести вихідну матрицю m [n, n], перші зустрінуті мінімальну і максимальну компоненти з індексами, змінену матрицю m [n, n], масив v [n], суму компонентів масиву v [n].
Рішення.
У наступній програмі використані 3 процедури:
input_matrix для введення n і заповнення матриці m [n, n];
output_matrix для виведення матриці на екран;
change_matrix для зміни елементів стоки і стовпця матриці;
і одна функція:
vector_v для виводу на екран вектора v [n] і підсумовування його елементів.
Формат виводу результатів розрахунку задається постійною digits:
const
digits = 3;
яка вказує, скільки знаків після коми відображати.
Програма:
program prog3;
const
digits = 3;
type
matrix = array [1 .. 10, 1 .. 10] of real;
vector = array [1 .. 10] of real;
var
m: matrix;
v: vector;
n: integer;
procedure input_matrix (var m: matrix; var n: integer);
var
p1, p2, a, b: real;
input: boolean;
i, j: integer;
begin
input: = false;
repeat
writeln ('Введіть розмір квадратної матриці n');
writeln ('не менше 2 і не більше 10:');
readln (n);
if (n <2) or (n> 10) then
begin
writeln ('Ви ввели неправильний розмір матриці,');
writeln ('n повинно бути не менше 2 та не більше 10. ");
end
else
begin
input: = true;
end;
until input;
writeln ('Введіть ліву a і праву b кордону ');
writeln ('діапазону значень компонент матриці:');
write ('a ='); readln (a);
write ('b ='); readln (b);
if a> b then
begin
p1: = a;
a: = b;
b: = p1;
end;
if a = b then begin p1: = 0; p2: = b; end
else if b = 0 then begin p1: = a; p2: = 0; end
else begin p1: = ba; p2: = a; end;
{P 1 - відстань між лівою і правою кордоном}
{P2 - ліва межа}
randomize;
for i: = 1 to n do
for j: = 1 to n do
m [i, j]: = p2 + random * p1;
end; {input_matrix}
procedure output_matrix (var m: matrix; n: integer);
var
i, j: integer;
begin
for i: = 1 to n do
begin
for j: = 1 to n do
begin
write (m [i, j]: 0: digits);
write ('');
end;
writeln;
end;
writeln;
end; {output_matrix}
procedure change_matrix (var m: matrix; n: integer);
var
i, j: integer;
min_r, min_c, max_r, max_c: integer;
min_z, max_z: real;
value: real;
begin
min_z: = 100000;
for i: = 1 to n do
for j: = 1 to n do
if m [i, j] <min_z then
begin
min_r: = i; min_c: = j; min_z: = m [i, j];
end;
writeln ('Мінімальне значення та індекси:');
write (min_z: 0: digits);
write ('; стовпчик:');
write (min_c);
write (', рядок: ");
writeln (min_r);
max_z: =- 100000;
for i: = 1 to n do
for j: = 1 to n do
if m [i, j]> max_z then
begin
max_c: = j; max_r: = i; max_z: = m [i, j];
end;
writeln ('Максимальне значення та індекси:');
write (max_z: 0: digits);
write ('; стовпчик:');
write (max_c);
write (', рядок: ");
writeln (max _ r);
{Зміна елементів рядка та стовпця}
write ('Зміна елементів');
write (min_r);
write ('рядка і');
write (max_c);
writeln ('стовбця');
for i: = 1 to n do
begin
value: = m [min_r, i];
m [min_r, i]: = m [i, max_c];
m [i, max_c]: = value;
end;
end; {change_matrix}
procedure vector_v (m: matrix; var v: vector; n: integer);
var
i: integer;
s: real;
begin
for i: = 1 to n do
v [i]: = m [i, i];
s: = 0;
for i: = 1 to n do
s: = s + v [i];
writeln ('Вектор v [n ]:');
for i: = 1 to n do
write (v [i]: 0: digits, '');
writeln;
write ('Сума компонентів вектора:');
writeln (s: 0: digits);
end; {vector_v}
begin
input_matrix (m, n);
writeln ('Первісна матриця ');
output_matrix (m, n);
change_matrix (m, n);
writeln ('Нова матриця ');
output_matrix (m, n);
vector_v (m, v, n);
readln;
end.
Тестування програми:
Введіть розмір квадратної матриці n
не менше 2 і не більше 10:
3
Введіть ліву a і праву b кордону
діапазону значень компонент матриці:
a = -5
b = 5
Первісна матриця
4.326 -3.582 -2.539
-2.236 -1.983 1.980
2.884 3.248 -1.216
Мінімальне значення та індекси:
-3.582; Стовпчик: 2, рядок: 1
Максимальне значення та індекси:
4.326; стовпчик: 1, рядок: 1
Зміна елементів 1 рядка і 1 стовпця
Нова матриця
4.326 -2.236 2.884
-3.582 -1.983 1.980
-2.539 3.248 -1.216
Вектор v [n]:
4.326 -1.983 -1.216
Сума компонентів вектора: 1.127
Результати тестування:
згенеровані елементи матриці не виходять за межі заданого діапазону;
мінімальне і максимальне значення визначені вірно;
вектор діагональних елементів складено правильно;
змінені місцями потрібні рядок і стовпець.
Налагодження завершена.