Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
_230400_090303 ОПЯ рук-во по кр_2.doc
Скачиваний:
9
Добавлен:
01.03.2025
Размер:
133 Кб
Скачать
☆

Методические указания

Задание № 1

Задание заключается в манипулировании одномерным массивом. Если не оговорено отдельно, то заполнение массива можно провести любым способом. Например, случайными числами, с терминала и т. д.

Заполнение случайными числами подразумевает использование функции:

random(аргумент),

которая возвращает псевдослучайное целое число в интервале от 0 до значения «аргумент-1». Например в случае

random(50)

будет сгенерировано (возвращено) число в интервале от 0 до 49.

Число называется ПСЕВДОслучайным, т. к. на самом деле оно высчитывается по специальной формуле, т. е. последовательность таких чисел однозначно определена, что необходимо во многих случаях для отладки программы. Эта формула представляет собою арифметические манипуляции над некоторым значением. Этим значением всякий раз является число, сгенерированное на предыдущей итерации. Однако в самой первой итерации возможность такой подстановки отсутствует, т. к. отсутствует сама предыдущая итерация. Поэтому начальное значение определено в функции однозначно, а, следовательно, получим в итоге однозначно определенную (псевдослучайную), а не действительно случайную последовательность.

Для получения непредсказуемой последовательности чисел, следует использовать в программе еще процедуру

Randomize;

При использовании этой процедуры в формулу для вычисления псевдослучайного числа в качестве начального значения проставляется сумма час+минуты+секунды того момента, когда в программе была вызвана процедура Randomize. Поскольку данная сумма при всяком прогоне задачи имеет разное значение, то и последовательности случайных чисел не повторяются.

Очевидно, что при заполнении вышеописанным способом будут генерироваться только положительные целые числа. В тех случаях, когда по условию задачи требуется генерация и положительных и отрицательных чисел, следует прибегнуть к какому либо приему, чтобы часть чисел была отрицательной. Например, при присваивании отнимать константу, равную половине верхней границы диапазона генерируемых чисел. Т. е. присваивать не значение random(k), а значение random(k) – k div 2.

Понятно, что в этом случае диапазон присваиваемых значений будет не 0 .. (k-1), а ( -k div 2 ) .. (k div 2-1).

Для манипуляций с массивом целиком, например, для его заполнения, необходимо организовать цикл, в котором некоторая переменная на каждой итерации будет изменяться таким образом, чтобы соответствовать очередному значению индекса массива.

Поскольку диапазон индексов однозначно определен для любого массива при его описании, целесообразно использовать цикл for, в котором изменение переменной цикла ограничить диапазоном изменения индекса массива.

Пример заполнения массива случайными числами.

Допустим, надо заполнить случайными числами 3 массива. Массив А – только положительными, массив В- и положительными и отрицательными, массив С – только отрицательными

Const n=10;

Var A,В,С: array [1..n] of integer;

i : integer;

begin

randomize;

{Заполнение только положительными числами}

for i := 1 to n do

A[i]:= random(50);

{Заполнение и положительными и отрицательными

числами}

for i := 1 to n do

B[i]:= random(50)-25;

{Заполнение только отрицательными числами}

for i := 1 to n do

C[i]:= - random(50);

. . .

End.

Тот же эффект можно получить, заполняя массивы, используя 1 цикл:

for i := 1 to n do

begin

A[i]:= random(50);

В[i]:= random(50)-25;

С[i]:= - random(50);

end;

ВНИМАНИЕ!! Следует помнить, что если НЕ прибегнуть к созданию составного оператора при помощи операторных скобок begin … end;, в цикле будет выполняться только 1-й их операторов. Т. е. по окончании выполнения фрагмента программы заполненным окажется только массив А.

Массивы же В и С останутся пустыми. В принципе, в каждом из них может быть заполнено по 1 элементу, но нельзя сказать каковы их индексы. Поскольку их заполнение произойдет после окончания цикла for, и, значит, значение переменной этого цикла – i уже станет неопределенным.

После заполнения массива, надо выполнить действие, указанное в задании. Например, найти максимальный или минимальный элемент массива, произведение или количество тех его элементов, которые удовлетворяют некоторому условию и т. д.

Следует помнить, что решение многих задач требует предустановки начальных значений соответствующих величин. Например, для нахождения суммы или количества (что тоже по сути –сумма, которая образуется из суммирования единиц при нахождении всякого элемента массива, подлежащего подсчету), надо перед началом подсчета обнулить переменные, соответственно, суммы или количества.

Пример 1. Найти среднее арифметическое положительных элементов массива.

Для того, чтобы найти среднее арифметическое, надо знать, во-первых, сумму, а во-вторых, количество отрицательных элементов в массиве. Т. е. предполагается, что массив содержит и отрицательные и положительные элементы. Т. е. заполнить его надо, как массив В в предыдущем примере.

Затем в цикле подсчитать и сумму (пусть SUM) и количество (пусть KL) отрицательных элементов. Для чего надо сделать полный перебор всех элементов массива, т. е. опять удобнее всего использовать цикл for. А перед началом цикла обнулить и SUM, и KL

Const n=10;

Var A,В,С: array [1..n] of integer;

i : integer;

begin

randomize

{Заполнение и положительными и отрицательными

числами}

for i := 1 to n do

B[i]:= random(50)-25;

{Обнуление сумм, которые будут подсчитываться}.

KL:=0;

SUM :=0;

{Цикл для подсчета как общей суммы отрицательных элементов, так и их количества}

for i := 1 to n do

if В[i] < 0 then

begin

KL:= KL+1;

SUM := SUM +1;

end;

writeln (‘ среднеарифметическое отрицательных элементов массива =’,SUM/KL :7:2);

End.

Если в примере требуется не просто найти какой-то параметр массива, но и поменять найденное значение местами с другим элементом массива, то следует иметь в виду 2 момента:

  1. Надо знать индексы (номера) элементов, которые будут обменены местами. Т.е. если требуется поменять местами максимальный и минимальный элементы массива, то изначально следует найти не сами значения экстремумов, а номера ячеек, где они находятся.

  2. Для замены местами значений 2-х переменных, необходима третья, которой следует присвоить значение одной из переменных, таким образом это значение запоминается. Затем 1-й переменной надо присвоить значение 2-й переменной. При этом бывшее значение первой – теряется. Поэтому 2-й переменной присваивается то значение, которое было сохранено (запомнено) посредством 3-й переменной.

Т. е. если надо поменять местами значение 1-го и последнего элементов массива А, то вводится вспомогательная переменная wsp, после чего проводится обмен. Причем тип переменной wsp должен соответствовать типу элементов, которые меняются местами. Т. е выполняется след. фрагмент программы:

wsp := А[1];

А[1]:= А[n];

А[n]:= wsp;

И последнее: следует обеспечить вывод результата на экран, используя для этого процедуры write или writeln;

Задание № 2

Задание заключается в манипулировании двумерным массивом. Так же, как и в задании № 1, массив должен быть заполнен или тем способом, какой оговорен в задании, или любым способом, если не оговорено отдельно, то есть или случайными числами (используя функцию random(аргумент) ), или с терминала т. е. с использованием процедуры ввода (Read() ).

Следует помнить, что при указании индексов массива целесообразно использовать ранее описанные константы:

Const kstr=4;

kstb=5;

Var A: array [1.. kstr, 1.. kstb ] of integer;

i,j : byte;

Заполнение двумерного массива подразумевает полный перебор по обоим индексам для чего надо использовать 2 вложенных цикла. Наполнение заполнение описанного массива А:

Begin

Writeln ( ‘Введите ‘, kstr * kstb, ‘целых чисел’ );

For i := 1 to kstr do

For j := 1 to kstb do

Read (A[i,j]);

Ввод чисел можно осуществлять как через пробел в одной строке, так «в столбик», т. е. через «Enter». Но если использовать функцию ReadlnA[i,j]), то ввод можно осуществить только через «Enter».

После того, как массив заполнен, надо приступить к выполнению собственно задачи.

Если требуется провести манипуляции с матрицей целиком или ее фрагментом (например, половина матрицы, лежащая выше диагонали), то должно организовать 2 вложенных цикла, где изменение параметров цикла охватывает диапазон изменения индексов массива (пример 2). А если требуется провести манипуляции со строкой или диагональю матрицы, то есть один из индексов фиксируется, а изменяется только другой, то надо организовать 1 цикл для полного перебора этого второго индекса (пример 3).

Пример 2. Обнулить все элементы матрицы, лежащие выше главной, но ниже побочной диагонали.

Const k = 4;

Var A: array [1.. k, 1.. k ] of integer;

i : byte;

Begin

{Заполнение массива и печать его}

. . . . . . . . . . . . . .

{Обнуление элементов массива }

For i := 1 to k do

For j := 1 to k do

If (i>j) and (i+j<k +1) then

A[ i, j ] := 0;

{Печать преобразованного массива }

For i := 1 to k do

begin

For j := 1 to k do

Write (a[ i,j ]:5) ;

Writeln;

End;

Пример 2. Поменять местами 1 и последний столбцы матрицы.

Менять местами столбцы следует поэлементно (см. пояснения к примеру 1). У каждого элемента фиксированы индексы столбцов, а индексы строк должны изменяться (полный перебор). Поэтому после заполнения матрицы, организуется только 1 цикл, где переменная цикла изменяется в интервале изменения индекса строк матрицы, а номера столбцов оговорены условием задачи.

Const k = 4;

Var A: array [1.. k, 1.. k ] of integer;

i : byte;

wsp : integer;

Begin

{Заполнение массива и печать его}

. . . . . . . . . . . . . .

For i := 1 to k do

Begin

wsp := A[ i, 1 ];

A[ i, 1 ] := A[ i, k];

A[ i, k] := wsp;

End;

{Печать преобразованного массива }

. . . . . . . . . . .

End.

Задание № 3

Задание на вычисление суммы ряда. Это или конечное число слагаемых, или вычисление суммы убывающего ряда с заданной точностью.

Для организации вычисления суммы конечного числа слагаемых, каждое из которых тоже сумма или произведение, следует:

  1. Ввести такое количество переменных, сколько сумм (произведений) определено в условии.

  2. Для подсчета каждой суммы надо организовать цикл for, где переменная цикла меняется в соответствии с интервалом, определенным в условии (над и под значком суммы).

  3. В цикле происходит наращивание суммы, поэтому переменная, которая вводится для подсчета каждой суммы, должна обнуляться непосредственно ПЕРЕД соответствующим ей оператором for.

  4. К аждый цикл содержит вычисление очередного слагаемого, если это необходимо и заканчивается собственно наращиванием суммы.

Пример 4. Вычислить

С лагаемым 2-й суммы является факториал (а!) Заменим его:

a

а! = Π n и подставим в формулу

n=1

Введем 3 переменных: для 1-й суммы Sf, для 2-й суммы Sa, и для произведения Pn. И переменные циклов соответственно: f, a и n.

Var Sf, Sa, Pn : real;

f, a, n : byte;

begin

Sf :=0;

{Цикл для подсчета 1-й суммы}

For f := 1 to 4 do

begin

Sa :=0;

{Цикл для подсчета 2-й суммы}

For a := f to f+3 do

begin

Pn := 1;

{Цикл для подсчета факториала}

For n := 1 to a do

Pn:= Pn*n;

Sa:= Sa +Pn;

End;

Sf:= Sf +Sf;

End;

Writeln ( ‘Сумма= ' , Sf :6:0);

End.

Если же надо вычислить сумму бесконечного убывающего ряда с заданной точностью, то начинать надо с определения общего члена ряда, если он не оговорен в условии.

Затем следует ввести 2 переменных – для накопления суммы и для отслеживания номера слагаемого и обнулить их.

Вычисление суммы следует организовать с помощью циклов while или repeat.

Завершить циклы надо, когда очередное слагаемое станет меньше заданной точности.

Пример 5. Вычислить с точностью  = 10-3 сумму ряда с общим членом

аn= n / (n2) 

В данном примере общий член ряда задан уже в условии. Для вычисления факториала (n2)! см. пояснения к примеру 4.

З аменим (n2)! на

Const e = 0.001;

Var S, Fact : real;

к, n : byte;

begin

S :=0; n :=0

{Цикл для подсчета суммы}

Repeat

Inc(n);

Fact := 1;

{Цикл для подсчета факториала}

For k := 1 to n*n do

Fact := Fact * k;

S := S + 1/ Fact;

Until Fact <e;

Writeln (‘сумма = ‘, S:8:3);

End.

Библиографический список

    1. Попов, В. Б. Тurbo Pascal для школьников [Текст] /

В. Б. Попов. – М. : Финансы и статистика, 2006. – 525 с.

    1. Епанешников, А. М. Программирование в среде Turbo-Pascal 7.0. [Текст] / А. М. Епанешников, В. А. Епанешников. М. : Диалог МИФИ, 2006. – 288 с.

    2. Культин, Н. В. Tupbo-Pascal в задачах и примерах [Текст] / Н. В. Культин. – СПб. : БХВ Санкт -Петербург, 2007. –156 с.

    3. Марченко, А. И. Программирование в среде Turbo-Pascal 7.0. [Текст] / А. И. Марченко, Л. А. Марченко. – Киев : ВЕК+, М.: Бином Универсал, 2008. – 496 с.

Учебное издание