регистрация / вход

Выражения и условный оператор IF. Операторы циклов. Массивы и подпрограммы

Особенности использования переменных вещественного типа в программе. Основные виды типов данных: простые, структурированные, указатели, процедурные, объекты. Работа и структура оператора while. Характеристика основных отличий while от оператора repeat.

Томский межвузовский центр дистанционного образования

Томский государственный университет систем управления и радиоэлектроники (ТУСУР)

Кафедра экономика

Контрольная работа №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

Результаты тестирования:

- сгенерированные элементы матрицы не выходят за границы заданного диапазона;

- минимальное и максимальное значения определены верно;

- вектор диагональных элементов составлен правильно;

- изменены местами нужные строка и столбец.

Отладка завершена.

ОТКРЫТЬ САМ ДОКУМЕНТ В НОВОМ ОКНЕ

Комментариев на модерации: 2.

ДОБАВИТЬ КОММЕНТАРИЙ  [можно без регистрации]

Ваше имя:

Комментарий