Выражения и условный оператор IF. Операторы циклов. Массивы и подпрограммы                          
		Выражения и условный оператор 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<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.00000000) = 4.00000000 
2. X=3 (выполнено второе условие, 0<=x<4): 
Расчет значения функции в заданной точке 
Введите число 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<=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 
Результаты вычислений, полученные при помощи различных циклов: 
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 (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:=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  
Результаты тестирования: 
- сгенерированные элементы матрицы не выходят за границы заданного диапазона; 
- минимальное и максимальное значения определены верно; 
- вектор диагональных элементов составлен правильно; 
- изменены местами нужные строка и столбец. 
Отладка завершена. 
	
	
					
							 |