Иностранные инвестиции в России: основные доноры, масштабы, направления и перспективы
Томский межвузовский центр дистанционного
образования
Томский государственный университет
систем управления и радиоэлектроники (ТУСУР)
Кафедра экономика
Контрольная работа №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;
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:
Значение 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
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);
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
Результаты тестирования:
-
сгенерированные
элементы матрицы не выходят за границы заданного диапазона;
-
минимальное
и максимальное значения определены верно;
-
вектор
диагональных элементов составлен правильно;
-
изменены
местами нужные строка и столбец.