ОАиЯП кр1
.docxМинистерство образования и науки
Томский государственный университет систем управления и
радиоэлектроники
Кафедра экономики
Контрольная работа №1
по дисциплине «Основы алгоритмизации и языки программирования/Объектно-ориетированное программирование-1»
Учебное пособие П.С. Мещеряков, С.В. Сметанин, С.В. Тимченко «Информатика. Часть 2. Программирование на языке Паскаль»
Вариант № 7
ВВЕДЕНИЕ
Основная цель - изучить язык высокого уровня Pascal, научиться формулировать несложные алгоритмы, реализовывать их в виде программ и отлаживать при помощи существующего программного обеспечения.
Задание 1
Вычислить значение функции f в точке x. Значение x должно вводиться с клавиатуры. Вывести полученный результат на экран.
Решение
var
x, f: real;
begin
write ('Введите число x='); readln (x);
if x<1 then f:=arctan(1/(x-1))
else
if x=1 then f:=ln(8*sqr(x)+x+3)
else
f:=abs(cos((sqr(x-3))/(sqr(x)+10)));
writeln ('f=', f:5:3);
readln;
end.
1) В каком порядке происходит вычисление значений выражений?
Группа |
Тип действий |
Операции или элементы |
1 |
Вычисление в круглых скобках |
( ) |
2 |
Вычисление значений функций |
Функции |
3 |
Унарные операции |
Not, унарный +, унарный - |
4 |
Операции типа умножения |
*, /, Div, Mod, And |
5 |
Операции типа сложения |
+, -, Or, Xor |
6 |
Операции отношения |
=, < >, <, <=, >, >= |
2) Запишите порядок вычисления значений во всех выражениях, встречающихся в Вашей программе.
Задание 2
Вычислить сумму s значений функции f в точках xi, которые берутся с заданного интервала [a; b] через равные отрезки длиной h. Длина отрезка рассчитывается по формуле . Здесь i = 1, 2, 3 ... n — номер точки; n — задаваемое количество точек; a — начало и b — конец интервала изменения x. Вывести на экран результаты вычислений, полученные при помощи следующих циклов:
While логическое_выражение Do тело_цикла;
Repeat тело_цикла Until логическое_выражение;
For параметр:=мин._значение To макс. Do тело_цикла;
For параметр:=макс._значение DownTo мин. Do тело_цикла;
Функция
Интервал
Количество точек n=20
Решение
const n=20;
var a, b, h, x, s, s1, s2, s3 :real;
i:integer;
begin
a:=12;
b:=21;
h:=(b-a)/(n-1);
x:=a;
s:=0;
s1:=0;
s2:=0;
s3:=0;
while x<=b do begin
s:=s+exp((-2/3)*ln(x));
x:=x+h;
end;
writeln('s=',s:5:3);
x:=a;
repeat
s1:=s1+exp((-2/3)*ln(x));
x:=x+h;
until x>=b;
writeln('s1=',s1:5:3);
x:=a;
for i:=1 to 20 do
begin
s2:=s2+exp((-2/3)*ln(x));
x:=x+h;
end;
writeln('s2=',s2:5:3);
x:=a;
for i:=20 downto 1 do
begin
s3:=s3+exp((-2/3)*ln(x));
x:=x+h;
end;
writeln('s3=',s3:5:3);
readln;
end.
1) Опишите оператор While.
Оператор цикла While содержит в себе выражение, которое управляет повторным выполнением оператора (который может быть составным оператором).
WHILE выражение DO
BEGIN
Внутренний оператор;
END;
Выражение, с помощью которого производится управление повторением оператора, должно иметь булевский тип. Вычисление его производится до того, как внутренний оператор будет выполнен. Внутренний оператор выполняется повторно до тех пор, пока выражение принимает значение True. Если выражение с самого начала принимает значение False, то оператор, содержащийся внутри оператора цикла while, не выполняется ни разу, поэтому этот цикл называют ещё циклом с предусловием.
2) В чём его основные отличия от остальных циклов Pascal?
от цикла Repeat…until :
- в операторе While…do проверка условия выхода выполняется в начале цикла, а не в конце цикла;
- в операторе While…do условие выхода удовлетворяется, если выражение ложно, а в операторе Repeat…until – если истинно;
- в операторе While...do тело цикла должно содержать только один оператор (либо использоваться составной оператор), а между ключевыми словами Repeat и Until можно поместить любое количество операторов (без использования составного оператора).
от цикла For
- оператор While..do организуется выполнение одного оператора неизвестное заранее число раз, а в операторе цикла For организует выполнение одного оператора заранее известное число раз.
Задание 3
Найти суммы компонент вещественной матрицы m[n,k] по строкам и записать их в одномерный массив v[n].
Заменить значения компонент в строках матрицы m[n,k] на 1, если сумма соответствующей строки окажется больше 0, на −1, если сумма меньше 0, на 0, если сумма равна 0.
Найти минимальное значение компонент массива v[n]. Если минимумов в массиве несколько, то запомнить индекс первого встреченного при переборе из минимумов.
На экран вывести исходную матрицу m[n,k], массив v[n], изменённую матрицу m[n,k], первую встреченную минимальную компоненту с индексом.
Решение
program
input_matrix
show_array
show_matrix
work1
work2
work3
const min=2;
max=10;
Type matrix = Array [1..max, 1..max] Of real;
Type vector = Array [1..max] Of real;
Procedure input_matrix (Var m: matrix; Var n, k: integer);
Var a, b, p1, p2, i, j: Integer;
Begin
repeat
Write ('Введите количество строк от ',min,' до ',max,' n = ');
ReadLN (n);
until n in [min..max];
repeat
Write ('Введите количество столбцов от ',min,' до ',max,' k = ');
ReadLN (k);
until k in [min..max];
repeat
Writeln('Введите границы диапазона значений компонент матрицы a<b');
ReadLN (a,b);
until a<b;
Randomize;
For i:=1 To n Do
begin
For j:=1 To k Do
begin
m[i,j]:=a+(b-a)*random;
end;
End;
end;
Procedure show_array (v: vector; n: integer);
var
i:integer;
begin
for i:=1 to n do
write(v[i]:5:1);
writeln;
end;
Procedure show_matrix (Var m: matrix; n, k: integer);
var
i,j:integer;
begin
for i:=1 to n do
begin
for j:=1 to k do
begin
write(m[i,j]:5:1);
end;
writeLn;
end;
end;
Procedure work1 (Var m: matrix; n, k: integer;var v: vector);
var
i,j:integer;
begin
for i:=1 to n do
begin
v[i]:=0;
for j:=1 to k do
begin
v[i]:=v[i]+m[i,j];
end;
end;
end;
Procedure work2 (Var m: matrix; n, k: integer;v:vector);
var
i,j:integer;
begin
for i:=1 to n do
begin
for j:=1 to k do
begin
if v[i]>0 then m[i,j]:=1
else if v[i]<0 then m[i,j]:=-1
else m[i,j]:=0;
end;
end;
end;
Procedure work3 (v: vector; n: integer);
var
i,imn:integer;
begin
imn:=1;
for i:=1 to n do
begin
if v[i]<v[imn]-0.0001 then imn:=i;{//-0.0001 для сравнения вещественых чисел}
end;
writeln('Минимальный элемент массива V=',v[imn]:0:1,' индекс первого=',imn);
end;
var a:matrix;
n,k: integer;
v:vector;
begin
input_matrix(a,n,k);
writeln('Исходная матрица');
show_matrix(a,n,k);
work1(a,n,k,v);
writeln('Массив сумм в строках');
show_array(v,n);
work2(a,n,k,v);
writeln('Измененная матрица');
show_matrix(a,n,k);
work3(v,n);
readln;
end.
ЗАКЛЮЧЕНИЕ
Изучил язык высокого уровня Pascal, научился формулировать несложные алгоритмы, реализовывать их в виде программ и отлаживать при помощи Borland Pascal.
ЛИТЕРАТУРА
1. Мещеряков П.С. Информатика. Часть 2. Программирование на языке Паскаль: Учебное пособие. – Томск: Факультет дистанционного обучения, ТУСУР, 2011.
2. Епанешников А.М. Программирование в среде Turbo Pascal 7.0 / А.М. Епанешников, В.А. Епанешников. — 3-е изд., стер. — М.: ДИАЛОГ-МИФИ, 1996.
3. Культин Н.Б. Turbo Pascal в задачах и примерах / Н.Б. Культин. — СПб.: БХВ-Петербург, 2000.
4. Шпак Ю.А. Turbo Pascal 7.0 на примерах / Ю.А. Шпак; под ред. Ю.С. Ков-танюка. — Киев: Юниор, 2003.