Выражения и условный оператор IF. Операторы циклов.
Массивы и подпрограммы
Работает этот оператор очень просто. Вычисляется значение логического выражения. Если получается истина (True), то выполняется оператор, а затем снова вычисляется значение логического выражения. Если снова получается истина, то опять выполняется оператор, и т. д. Так продолжается до тех пор, пока при вычислении логического выражения не получится ложь (False). После этого оператор While… Читать ещё >
Выражения и условный оператор IF. Операторы циклов. Массивы и подпрограммы (реферат, курсовая, диплом, контрольная)
Томский межвузовский центр дистанционного образования
Томский государственный университет систем управления и радиоэлектроники (ТУСУР)
Кафедра экономика
Контрольная работа № 1
по дисциплине «информатика»
автор пособия Тимченко С. В., Сметанин С.И.
вариант № 1
Выполнила Студентка гр. З-828-Б Специальности 80 105
Афонина Юлия Владимировна Г. Нефтеюганск
2009 г.
Задание № 1. «Выражения и условный оператор IF»
1. Вычислить значение функции 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.
Тестирование программы:
1. X=-1 (выполнено первое условие, x<0):
Расчет значения функции в заданной точке Введите число x: -1
Значение f (-1.0) = 4.0
2. X=3 (выполнено второе условие, 0<=x<4):
Расчет значения функции в заданной точке Введите число x: 3
Значение f (3.0) = -0.12 021 014
3. X=5 (выполнено третье условие, x>=4):
Расчет значения функции в заданной точке Введите число x: 5
Значение f (5.0) = 1.0
Программа дает верные результаты, отладка завершена.
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<=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.77 777 778
Результаты вычислений, полученные при помощи различных циклов:
1. Цикл While:
1. Цикл «while»
Значение s: 0.15 809 431
2. Цикл repeat:
2. Цикл «repeat»
Значение s: 0.15 809 431
3. Цикл For … To … Do:
3. Цикл «for … to … do»
Значение s: 0.15 809 431
4. Цикл For … DownTo … Do:
4. Цикл «for … downto … do»
Значение s: 0.15 809 431
Программа дает одинаковые результаты для всех циклов, отладка завершена.
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 (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:=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:=100 000;
for i:=1 to n do
for j:=1 to n do
if m[i, j]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:=-100 000;
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:
Введите левую 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
Результаты тестирования:
— сгенерированные элементы матрицы не выходят за границы заданного диапазона;
— минимальное и максимальное значения определены верно;
— вектор диагональных элементов составлен правильно;
— изменены местами нужные строка и столбец.
Отладка завершена.