Выражения и условный оператор IF. Операторы циклов. Массивы и подпрограммы
Томский межвузовский центр дистанционного образования
Томский государственный университет систем управления и радиоэлектроники (ТУСУР)
Кафедра экономика
Контрольная работа №1
по дисциплине «информатика»
автор пособия Тимченко С.В., Сметанин С.И.
вариант №1
Выполнила
Студентка гр.З-828-Б
Специальности 080105
Афонина Юлия Владимировна
Г. Нефтеюганск
2009 г.
Задание №1. «Выражения и условный оператор IF»
1. Вычислить значение функции f в точке x.
Решение :
Program prog1;
Var
f,x: real ;
Begin
writeln ('Расчет значения функции в заданной точке');
write (' Введите число x: ');
readln (x);
if x
begin
if x
else f:=SQRT (x-4);
end ;
writeln (' Значение f(',x:0:8,') = ',f:0:8);
readln ;
end .
Тестирование программы:
1. X=-1 (выполнено первое условие, x
Расчет значения функции в заданной точке
Введите число x: -1
Значение f(-1.00000000) = 4.00000000
2. X=3 (выполнено второе условие, 0
Расчет значения функции в заданной точке
Введите число x: 3
Значение f(3.00000000) = -0.12021014
3. X=5 (выполнено третье условие, x>=4):
Расчет значения функции в заданной точке
Введите число x: 5
Значение f(5.00000000) = 1.00000000
Программа дает верные результаты, отладка завершена.
2. Какие типы использовались при описании переменных в программе?
При описании данной программы использовались переменные вещественного типа.
3. Чем определяется выбор того, или иного типа?
Типом данных называется множество допустимых значений этих данных, а также совокупность операций над ними. Типы делятся на следующие группы: простые, структурированные, указатели, процедурные, объекты. Есть стандартные (предопределенные) и определяемые программистами в разделе, начинающемся со слова 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. «Операторы циклов»
1. Задание:
Вычислить сумму 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 тело _цикла ;
При выполнении задания сначала в программе требуется задать значение исходных данных: границы интервала 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:=(b-a)/(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
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
Результаты вычислений, полученные при помощи различных циклов:
1. Цикл While:
1. Цикл "while"
Значение s: 0.15809431
2. Цикл repeat:
2. Цикл "repeat"
Значение s: 0.15809431
3. Цикл For … To … Do:
3. Цикл "for ... to ... do"
Значение s: 0.15809431
4. Цикл For … DownTo … Do:
4. Цикл "for ... downto ... do"
Значение s: 0.15809431
Программа дает одинаковые результаты для всех циклов, отладка завершена.
2. Опишите оператор While.
Оператор While имеет следующую структуру:
While логическое выражение do оператор ;
Работает этот оператор очень просто. Вычисляется значение логического выражения. Если получается истина (True), то выполняется оператор, а затем снова вычисляется значение логического выражения. Если снова получается истина, то опять выполняется оператор, и т.д. Так продолжается до тех пор, пока при вычислении логического выражения не получится ложь (False). После этого оператор While заканчивает свою работу и передает действие следующему оператору.
В частности, если в самом начале работы While при вычислении логического выражения получается ложь, то оператор не выполнится ни разу. Как обычно, в качестве оператора может выступать некоторый составной оператор. Может показаться странным, что оператор While вообще когда-нибудь заканчивает свою работу. В самом деле, почему одно и то же логическое выражение сначала было истинным, а потом, после нескольких выполнений оператора, стало ложным? Логическое выражение зависит от нескольких переменных, значение которых меняется во время выполнения оператора, что влечет за собой изменения значения логического выражения. В принципе, это вовсе не означает, что каждый оператор While когда-нибудь заканчивает работу. То есть, не исключена ситуация, когда логическое выражение всегда будет истинным, и оператор While будет работать вечно. Такая ситуация называется зацикливанием. Таким образом, при использовании оператора While и вообще других циклических операторов нужно быть аккуратным и стараться избегать зацикливаний. Это значит, что при программировании любого цикла нужно стараться всегда объяснить самому себе, почему этот цикл не будет вечным, а когда-нибудь закончит свою работу.
3. В чем ее основные отличия от остальных циклов Turbo Pascal?
Цикл while имеет следующие отличия от оператора repeat :
1) В операторе while проверка условия выхода выполняется в начале выхода, а у repeat в конце.
2) Тело цикла может выполняться ни разу в while , а в repeat всегда выполняется хотя бы один раз;
3) Условие выхода удовлетворяется, если выражение ложно, repeat – если истинно;
4) Тело цикла должно содержать только один оператор, а в repeat можно поместить любое количество операторов.
Оператор For: Если значение условного выражения истинно, то цикл продолжает выполняться, а если значение условного выражения ложно, то происходит выход из цикла. После выхода из цикла идет переход к следующему оператору программы. Изменение – это выражение, определяющее, как будет меняться параметр цикла. В операторе for сначала проверяется условие и если значение условия "истинно", то идёт выполнение тела цикла (блока операторов или простого оператора).
Задание №3. «Массивы и подпрограммы»
Результатом выполнения третьего задания должна быть программа, написанная с использованием подпрограмм – не менее 2 процедур и 1 функции.
Задание связанно с действиями над квадратной матрицей m[n,n], у которой количество строк и столбцов равно n (2 ? n ? 10). Матрицы могут быть либо вещественного, либо целого типа. Значения компонентов матрицы следует задавать случайным образом и в таком диапазоне, чтобы полученные данные были нетривиальными, т.е. неочевидными, не лежащими на поверхности.
Задание:
1) Найти минимальное и максимальное значение компонентов квадратной вещественной матрицы m [n ,n ].
2) Поменять местами в матрице m [n ,n ] компоненты строки, содержащей минимум, с компонентами столбца, содержащего максимум. Если минимумов или максимумов в матрице несколько, то взять строку и столбец первых встречных при переборе из минимумов и максимумов соответственно.
3) В одномерный массив v [n ] записать компоненты главной диагонали измененной матрицы m [n ,n ] (индексы строки и столбца главной диагонали равны).
4) Вычислить сумму компонентов полученного массива v [n ].
5) На экран вывести исходную матрицу 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 (n10) 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:=b-a; p2:=a; end ;
{p1 - расстояние между левой и правой границей}
{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] 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 Результаты тестирования: - сгенерированные элементы матрицы не выходят за границы заданного диапазона; - минимальное и максимальное значения определены верно; - вектор диагональных элементов составлен правильно; - изменены местами нужные строка и столбец. Отладка завершена.