Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Базовые алгоритмы обработки массивов




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

Вычисление суммы и произведения элементов массива.При нахождении суммы:

1) переменной суммирования S присваивается начальное значение, равное нулю;

2) при первом выполнении тела цикла к текущему значению переменной суммирования S прибавляется первое слагаемое суммы, и результат присваивается переменной суммирования S, т. е.

S:=S+<слагаемое>;

3) при каждом следующем выполнении тела цикла производится аналогичное действие.

Данный алгоритм при вычислении суммы элементов одномерного массива D размера n реализуется в виде следующего кода:

S:=0; {начальное значение суммы}

fori:=1tondoS:=S+D[i]; {вычисление суммы}

writeln('S=',S); {вывод суммы}

Для программирования нахождения произведения:

1) переменной произведения P присваивается начальное значение, равное единице;

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

P:=P*<множитель>;

3) при каждом следующем выполнении тела цикла производится аналогичное действие.

Данный алгоритм при вычислении произведения значений элементов одномерного массива D размера n реализуется в виде следующего кода:

P:=1; {начальное значение произведения}

fori:=1tondoP:=P*D[i]; {вычисление произведения}

writeln('P=',P); {вывод произведения}

Более сложный код применяется для вычисления произведения элементов двумерного массива W размером n × m:

P:=1; {начальное значение произведения}

fori:=1ton do

forj:=1tomdoP:=P*W[i,j]; { вычисление произведения}

writeln('P=',P); {вывод произведения}

Поиск максимального и минимального элементов массива. При нахождении минимального элемента массива:

1) скалярной переменной минимума, предназначенной для хранения максимального значения, присваивается значение первого элемента массива, выступающего в качестве начального приближения или гипотезы;

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

Код, реализующий данный алгоритм для одномерного массива D, состоящего из n элементов, имеет вид:

min:=D[1]; {первый элемент массива назначается минимальным}

fori:=2tondo

ifD[i]<minthenmin:=D[i];

{текущий минимальный элемент сравнивается с каждым элементом

 массива и переопределяется при выполнении условия}

writeln('min=',min); {вывод минимального элемента}

При нахождении максимального элемента массива:

1) скалярной переменной максимума, предназначенной для хранения максимального значения, присваивается значение первого элемента массива;

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

Программный код, реализующий данный алгоритм для одномерного массива D, состоящего из n элементов, имеет вид:

max:=D[1]; {первый элемент массива назначается минимальным}

fori:=2tondo

ifD[i]>maxthenmax:=D[i]; {текущий максимальный элемент сравнивается с каждым элементом массива и переопределяется при выполнении условия}

writeln('max=',max); {вывод максимального элемента}

Максимальный элемент двумерного массива W, состоящего из n × m элементов, определяется с использованием вложенного цикла:

max:=W[1, 1];{первый элемент массива назначается максимальным}

fori:=1ton do

forj:=1tomdo

ifW[i, j]>maxthenmax:=W[i, j]; {текущий максимальный элемент сравнивается с каждым элементом массива и переопределяется при выполнении условия}

writeln('max=',max); {вывод максимального элемента}

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

1) переменной-счетчику k присвоить начальное значение, равное нулю (k:=0);

2) в цикле вычислить значение логического выражения. Если это значение равно True, увеличить значение счетчика на единицу, т. е. выполнить оператор k:=k+1 или inc(k).

Данный алгоритм реализуется кодом

k:=0;

if<условие>thenk:=k+1;

где <условие> − условие, которому должны соответствовать элементы массива.

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

Programcount1;

Var

D:array[1..10]ofinteger;

{описание одномерного массива из десяти целых чисел}

i, k: integer;

Begin

fori:=1to10doreadln(D[i]);

{ввод десяти элементов одномерного массива}

k:=0; {начальное значение счетчика}

fori:=1to10 do

ifabs(D[i])<=3thenk:=k+1;

{значение счетчика увеличивается на единицу при выполнении условия}

writeln('k=',k);

{количество элементов, соответствующих условию}

End.

Решение задач обработки одномерных массивов

Пример 1. Ввести одномерный массив M из пятнадцати элементов и число v. Для каждого элемента массива вычислить

                                       .                                  (1)

Вывести полученный массив. Поменять местами второй и максимальный элементы массива MN. Найти среднее арифметическое элементов модифицированного массива MN, индексы которых при делении на три дают остаток 2. Заменить полученным значением отрицательные элементы массива MN. Если отрицательных элементов нет, вывести соответствующее сообщение.

Решение.

Programmass1;

Var

M, MN:array[1..15]ofreal;

{описание одномерных массивов, каждый из 15 вещественных чисел}

v, max, prom, S, Average: real;

i, k, n: integer;

Begin

writeln('Введите 15 элементов массива');

fori:=1to15do{цикл для ввода 15 элементов M}

Begin

write('M[',i,']=');

readln(M[i]); {ввод элемента с текущим индексом i}

end;

writeln('Введите значение переменной v');

readln(v); {ввод значения переменной v}

fori:=1to15do

{цикл для создания и вывода 15 элементов MN}

Begin

MN[i]:=sqrt(abs(sin(M[i])/cos(M[i])))-

(sqr(v)-ln(i)/ln(2))/(2+2*sin(M[i]));

writeln('MN[',i,']=',MN[i]:5:2);

end;

{поиск максимального элемента массива MN:}

max:=MN[1]; k:=1;

fori:=2to15do

ifMN[i]>maxthen

beginmax:=MN[i]; k:=i end;

writeln('max=',max:5:2);

{меняем местами второй и минимальный элементы массива MN:}

prom:=MN[2]; {промежуточной величине присваивается

         значение второго элемента массива MN}

MN[2]:=MN[k];

{второму элементу массива MN присваивается значение максимального

элемента, номер k которого найден выше}

MN[k]:=prom; {элементу под номером k присваивается значение

         второго элемента, хранящегося в переменной prom}

k:=0; S:=0; {начальное значение счетчика и суммы}

fori:=1to15do

if(i mod 3)=2then

begink:=k+1; {значение счетчика увеличивается на единицу,

                               если остаток от деления номера i на 3 равен 2}

S:=S+MN[i]

{суммирование элементов, соответствующих условию}

end;

Average:=S/k; {расчет среднего арифметического}

writeln('Average=',Average:5:2);

{вывод среднего арифметического}

k:=0; {начальное значение счетчика}

fori:=1to15do

ifMN[i]<0then

Begin

k:=k+1;

MN[i]:=Average;

end;

ifk>0then

fori:=1to15dowriteln('MN[',i,']=',MN[i]:5:2)

elsewriteln('Отрицательных элементов нет');

End.

Задание 1. Составить программу решения задачи из таблицы 1. Результаты вычислений распечатать.

Таблица 1 − Задачи по обработке одномерных массивов

Вариант Задача
1 Ввести одномерный массив D из семи элементов и число b. Для каждого элемента массива вычислить . Вывести полученный массив. Найти сумму элементов массива Z с нечетными индексами. Подсчитать количество отрицательных элементов Z
2 Ввести одномерный массив B из восьми элементов и число x. Для каждого элемента массива вычислить . Вывести полученный массив. Найти сумму элементов массива G с четными индексами. Подсчитать количество положительных элементов G
3 Ввести одномерный массив C из десяти положительных элементов и число a. Для каждого элемента массива вычислить . Вывести полученный массив. Найти максимальный элемент Y. Подсчитать количество элементов Y, больших числа 5
4 Ввести одномерный массив M из девяти элементов и число w. Для каждого элемента массива вычислить . Вывести полученный массив. Найти минимальный элемент X. Подсчитать количество элементов X, значение которых больше двух
5 Ввести одномерный массив D из шести элементов и число t. Для каждого элемента массива вычислить . Вывести полученный массив и найти среднее арифметическое его положительных элементов

Окончание таблицы 1

Вариант Задача
6 Ввести одномерный массив D из пятнадцати элементов и число b. Для каждого элемента массива вычислить . Вывести полученный массив. Заменить значение первого элемента массива V значением минимального элемента этого массива
7 Ввести одномерный массив F из одиннадцати элементов и число m. Для каждого элемента массива вычислить . Вывести полученный массив. Найти среднее арифметическое элементов массива G, больших числа четыре. Определить количество таких элементов
8 Ввести одномерный массив F из десяти элементов и число k. Для каждого элемента массива вычислить . Вывести полученный массив. Найти сумму отрицательных элементов массива G. Заменить модулем полученного значения элементы с четными индексами
9 Ввести одномерный массив H из тринадцати элементов и число a. Для каждого элемента массива вычислить . Вывести полученный массив. Найти максимальный отрицательный элемент массива K и заменить второй элемент массива K найденным значением
10 Ввести одномерный массив D из десяти элементов и число b. Для каждого элемента массива вычислить . Вывести полученный массив. Поменять местами минимальный и максимальный элементы R
11 Ввести одномерный массив U из десяти элементов и число n. Для каждого элемента массива вычислить . Вывести полученный массив. Определить произведение отрицательных элементов массива D. Поменять местами значения последнего и минимального элементов D
12 Ввести одномерный массив G из четырнадцати элементов и число h. Для каждого элемента массива вычислить . Вывести полученный массив. Найти среднее арифметическое элементов Y, значения которых по модулю не превосходят числа 2. Определить среди них минимальный элемент
   

Процедуры и функции

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

Процедура описывается между разделом описаний и разделом операторов основной программы.

Формат описания:

procedure <имя>(<список формальных параметров>);

<раздел описаний процедуры>

Begin

<раздел операторов процедуры>

end;

В списке формальных параметров перечисляются переменные и указываются их типы.

Различают параметры-аргументы (входные данные для процедуры) и параметры-результаты (для возвращения в основную программу результатов работы процедуры), причем перед списком переменных-результатов каждого типа указывается слово Var.

Например, для многократных вычислений и вывода значения функции  можно описать процедуру, где x − формальный параметр-аргумент, а f − формальный параметр-результат.

Procedure prim(x:real; var f:real);

Begin

f:=sqrt(abs(х))-sin(x);

writeln('f(',x:4:2,')=',f:7:4);

end;

Структура раздела описаний процедуры аналогична разделу описаний основной программы. Перечисленные в разделе объекты носят локальный характер (например, локальные переменные) и могут использоваться только в той процедуре, в которой описаны.

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

Формат оператора вызова процедуры

<имя процедуры>(<список фактических параметров>)

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

Например, вызов описанной выше процедуры prim в основной программе осуществляется посредством кода:

prim(7; y); {вычисление значения функции f при x = 7 – результат

                                  присваивается переменной y}

Оператор вызова процедуры работает следующим образом. Фактические параметры-аргументы передаются в подпрограмму как значения соответствующих формальных параметров. После окончания выполнения процедуры полученные значения формальных параметров-результатов возвращаются в основную программу и присваиваются переменным, выступающим в роли фактических параметров-результатов. Формальные и фактические параметры должны соответствовать друг другу по количеству и типу, а их имена могут попарно и не совпадать.

Формальные и фактические параметры в соответствующих списках могут отсутствовать вообще. В языке Pascal предусмотрена возможность получать и возвращать значения через глобальные (указанные в разделе описаний основной программы) переменные.

Пример 2. Задать массив, состоящий из десяти вещественных элементов, и вывести их на экран. Определить синус каждого элемента массива и отобразить результаты на экране. Каждый отрицательный элемент полученного массива заменить единицей и вывести модифицированный массив.

Решение.

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

Programmas2;

Var

M:array[1..10]ofreal; {описание одномерного массива}

i, n: integer;

Procedure Print; {процедура вывода элементов массива}

Begin

{цикл для вывода 10 элементов массива}

fori:=1to10dowriteln('M[',i,']=',M[i]:5:2);

end;

begin{основная программа}

writeln('Введите 10 элементов массива');

fori:=1to10do{цикл для ввода 10 элементов M}

Begin

write('M[',i,']=');

readln(M[i]); {ввод элемента с текущим индексом i}

end;

Print; {вызов процедуры вывода}

fori:=1to10doM[i]:=sin(M[i]);

Print; {вызов процедуры вывода}

fori:=1to10do

ifM[i]<0thenM[i]:=1;

Print; {вызов процедуры вывода}

End.

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

 

Другая разновидность подпрограмм − функция пользователя − возвращает в точку вызова только один параметр-результат простого стандартного типа. В общем виде функцию описывают перед разделом операторов, после описания процедур пользователя (если таковые имеются):

Function <имя функции>

(<список формальных параметров-аргументов>) :

<тип функции (результата)>;

<раздел описаний функции>

Begin

<раздел операторов функции, содержащий оператор присваивания>

end;

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

<имя функции>:=<выражение>

Вызов функции из основной программы возможен только из выражения (например, в операторе присваивания или операторе вызова процедуры) путем указания имени функции и фактических параметров-аргументов, заключенных в круглые скобки:

<имя функции>(<список фактических параметров>)

При этом вычисленное значение функции возвращается в точку вызова функции в программе так же, как возвращается значение любой стандартной (встроенной) функции, например, sin(x).

Пример 3. Вычислить значение выражения

                                                    .                                               (2)

Решение.

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

Programr1;

Varx, r: real;

{описание функции с формальным параметром z}

Function tg(z:real):real;

Begin

tg:=sin(z)/cos(z);

end;

Begin

writeln('Введите значение x');

read(x);

{при вызове функции тангенс используются фактические параметры,

  т. е. z заменяется на x}

r:=(tg(x/2)+sqr(1/tg(x)))/(1+2*tg(3*sqr(x)));

writeln('x=',x:4:1,' r=',r:5:2);

End.

Пример 4. Вычислить сумму ряда

                                                                         (3)

при положительных значениях переменной x.

Решение.

Вычисление факториала − неоднократно повторяющаяся операция при решении данной задачи. Целесообразно описать и использовать в основной программе функцию пользователя для вычисления факториала.

Programsum1;

Varx, un, S: real;

i, n: integer;

{описание функции с формальным параметром m}

Function fact(m: integer):real;

Varj:integer;

Begin

fact:=1;

forj:=1tondofact:=fact*j;

end;

Begin{основная программа}

writeln('Введите число x > 0');

read(x);

writeln('Введите число слагаемых ряда');

read(n);

un:=x/2; S:=un;

{начальные значения степенного выражения и суммы ряда}

for i:=1tom-1 do

Begin

un:=un*sqr(x/2);

S:=S+un*fact(2*i)/(sqr(fact(i))*(2*i+1))

{вычисление текущих значений степенного выражения и суммы ряда}

end;

writeln('S=',S:6:4);

End.

Задание 3. Составить программу для вычисления суммы или произведения ряда при произвольных значениях переменной x (таблица 2).

Таблица 2 − Суммы и произведения

Вариант Ряд Вариант Ряд
1 7
2 8
3 9
4 10
5 11
6 12

Контрольные вопросы

1 Перечислите структурированные типы данных языка Pascal.

2 Сформулируйте определение  массива в языке Pascal.

3 Какие массивы используются на Pascal?

4 Как в программном коде осуществляется доступ к отдельному элементу массива.

5 Описание одно-, двумерного массивов. Тип элементов массивов.

6 Организация ввода и вывода элементов массива.

7 Суммирование и вычисление произведений элементов массива.

8 Поиск минимального и максимального элементов массива.

9 Подсчет количества элементов массива, удовлетворяющих заданным условиям.

10 Как поменять местами значения двух элементов массива?

11 Понятие процедуры и функции пользователя.

12 Как описать процедуру или функцию пользователя?

13 Как осуществляется в программном коде вызов подпрограммы?

14 Назначение формальных и фактических параметров.


Лабораторная работа 3

Mathcad. Базовые операции.
Ранжированные переменные. Функции. Графики

Цель работы: получить первичные навыки работы в системе Mathcad. Изучить основные понятия и базовые операции, способы задания и использования ранжированной переменной, способы создания и форматирования графиков в системе Mathcad.

Сведения из теории

1.1 Основы работы в системе Mathcad

Запустить систему математических, научных и инженерных расчетов Mathcad можно из главного меню:Start / All Programs / Mathsoft Apps / Mathcad (Пуск / Все программы / Mathsoft Apps / Mathcad). Интерфейс Mathcad внешне напоминает интерфейс большинства приложений Windows.

При запуске системы, как правило, автоматически создается новый документ Mathcad с именем Untitled1 (Безымянный), который желательно сразу сохранить, выполнив команду File / Save as (Файл / Сохранить как). В открывшемся окне необходимо выбрать папку и задать имя файла. По умолчанию файлы Mathcad получают расширение .mcd.

 
Рисунок 1 – Панель инструментов Math

Для ввода математических символов, греческих букв, шаблонов матриц и графиков служат панели математических операторов и шаблонов. Они собраны на единой панели математических инструментов Math(Математическая), показанной на рисунке 1. Чтобы отобразить данную панель, необходимо выполнить команду View / Toolbars / Math (Вид / Панели инструментов / Математическая).

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

· формульные;

· текстовые;

· графические.

Каждая область документа имеет прямоугольную форму. Выделение области осуществляется щелком мыши на любом ее месте. Чтобы переместить область, необходимо навести указатель мыши на ее границу и, когда он примет вид стилизованной кисти руки, нажать на левую клавишу мыши и, не отпуская клавишу, переместить выделенную область на новое место документа.

Для копирования и перемещения областей используются команды меню Edit (Правка) или стандартные комбинации клавиш операционных систем семейства Windows. Кроме того, удалить выделенную область можно, нажав комбинацию клавиш Ctrl D.

Выровнять несколько областей по горизонтали можно командой Format / Align Regions / Across /(Формат / Выравнивание областей / Горизонтально). Вариант Down(Вертикально) предназначен для выравнивания областей по вертикали. Отделение областей друг от друга при их наложении производится командой Format / Separate Regions (Формат / Отделить области).










Последнее изменение этой страницы: 2018-05-10; просмотров: 249.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...