Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РЕШЕНИЕ ФУНКЦИОНАЛЬНЫХ И ВЫЧИСЛИТЕЛЬНЫХ ЗАДАЧ.doc
Скачиваний:
25
Добавлен:
25.11.2018
Размер:
4.81 Mб
Скачать

1.7 Обработка одномерных массивов

Цель: Научиться составлять программы с использованием массивов.

Данная тема будет рассмотрена на примерах.

Полином степени n часто представляется в виде

P(x)=anxn+an-1xn-1+…+a0.

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

Объявить массив вещественных чисел

x1,x2,…,xn-1,xn (n<=50).

Способ 1. Вся требуемая при описании информация задается одновременно:

Var x: array[-50..50] of real;

Способ 2. Здесь определение вводит новое понятие, а затем рассматривается объект по имени х, обладающий свойствами, которые указаны в определении.

Пусть последовательность вещественных чисел х1,х2,…,хn. (n<=1) представлена в программе массивом х, а его описание и описания прочих переменных имеют вид:

В рассматриваемом примере определим новый тип данных, которому дадим имя vector

Type vector=array[-50..50]of real;

Описание массива х теперь производится обычным образом как описание переменной типа vector

Var x:vector;

В соответствии с правилами истолкований конструкций языка запись -50..50 представляет собой определение нового так называемого диапазонного типа данных. Его значениями являются все целые6 числа от -50 до 50. Переменна этого типа описывается следующим образом

Var i: -50..50;

Диапазонному типу данных можно дать свое имя, определив его в разделе type, и далее использовать это имя в описаниях. Например:

Type index= -50..50;

Var x: array [index] of real:

I: index;

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

Const nmax=50;

Type vector=array [-nmax..nmax] of real;

Var x: vector;

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

Для переменных-массивов, допустима только одна операция – присваивание. Ее выполнение создает копию массива. Оба имени, участвующие в операции, должны именовать объекты одного и того же типа. Например, пусть имеются три варианта объявления двух массивов:

  1. var x,y: vector;

  2. var x,y: array[index] of real;

  3. var x: vector;

y: array [index] of real;

Во всех вариантах структуры массивов идентичны – это совокупности одинаково пронумерованных вещественных чисел. Но только в вариантах a) и b) типы x и y считаются одинаковыми(тождественными). Поэтому оператор присваивания y:=x при трансляции будет признан ошибочным, когда использовано описание с).

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

Пусть последовательность вещественных чисел х1,х2,…,хn. (n<=50) представлена в программе массивом х, а его описание и описания прочих переменных имеют вид:

Type ind=1..50;

Vec=array[ind] of real;

Var

X: vec;

I,n: ind;

Max, s: real;

Задание1: Даны натуральные числа n, a1, a2, … ,an. Определить количество ak последовательности a1,a2,…,an, являющихся чётными числами и вывести их.

Технология выполнения задания

Постановка задачи: Создать приложение для нахождения четных членов последовательности и определения их количества.

Математическая модель представляется так: исходные данные – n, a1, a2, … ,an, результат – k, ak- четный член последовательности.

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

Программа: Установите компоненты на форме и измените свойство Caption для каждого компонента в соответствии с рисунком 17.

Для четных чисел данной последовательности установить компонент ListBox. Для компонента BitBtn1 (кнопка Закрыть) в инспекторе объектов измените свойство Kind – bkClose.

Двойным щелчком по компоненту Button1 (кнопка Вычислить) автоматически создается в окне кода стандартная структур. В данную структуру впишите часть программы (у каждого варианта своя индивидуальная часть программы). Для задания 1 эта часть выглядит следующим образом:

procedure TForm1.Button1Click(Sender: TObject);

const n=15;

var q,b:array[1..n] of integer;

i,k:byte;

s:string

begin

k:=0;

for i:=1 to n do

begin

s:=inputbox('введите последовательность','n'+IntToStr(i),'0');

q[i]:=StrToint(s);

b[i]:=round(q[i]/2);

if (q[i] mod 2=0) and (b[i] mod 2<>0) then

begin

k:=k+1;

ListBox1.Items.Add(IntToStr(q[i]));

end;

end;

Label2.Caption:='Количество четных членов последовательности '+IntToStr(k);

end;

Рисунок 17 - Образец размещения компонент на форме

Задание2: Дана последовательность вещественных чисел х1,х2,…,хn (n<=30). Найти их среднее значение.

Технология выполнения задания

Постановка задачи: Создать приложение для нахождения среднего значения вещественных чисел х1,х2,…,хn (n<=30).

Математическая модель представляется так: исходные данные – n, х1,х2,…,хn , результат – s, xi- член последовательности.

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

Программа: Установите компоненты на форме и измените свойство Caption для каждого компонента.

Для чисел данной последовательности установить компонент ListBox. Для компонента BitBtn1 (кнопка Закрыть) в инспекторе объектов измените свойство Kind – bkClose.

Двойным щелчком по компоненту Button1 (кнопка Вычислить) автоматически создается в окне кода стандартная структур. В данную структуру впишите часть программы (у каждого варианта своя индивидуальная часть программы). Для задания 2 эта часть выглядит следующим образом:

procedure TForm1.Button1Click(Sender: TObject);

const nmax=30;

var

x: array[1..nmax] of real;

i,n:integer;

s:real;

begin

n:=strtofloat(edit1.text);

for i:=1 to n do

x[i]:=StrToint(inputbox('введите последовательность','x'+IntToStr(i),'0'));

s:=0;

for i:=1 to n do

s:=s+x[i];

s:=s/n;

Label2.Caption:='среднее = '+IntToStr(s);

end;

Задание3: Вычислить значение полинома P(x)=anxn+an-1xn-1+…+a0 (n20) при заданном значении x.

Для решения задачи воспользуемся схемой Горнера вычисления значения полинома, основанной на представлении его в следующей форме:

P(x)=(…((a0x+a1)x+a2)x+…+an-1)x+an.

Значение полинома получается n-кратным выполнением оператора присваивания

p:=p*x+ai, i=1,2,…,n

при начальном значении p=a0.

Технология выполнения задания

Постановка задачи: Создать приложение для нахождения значения полинома

P(x)=anxn+an-1xn-1+…+a0 (n20).

Математическая модель представляется так: исходные данные – n, a0,a1, a2, … ,an, результат – p.

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

Программа: Установите компоненты на форме и измените свойство Caption для каждого компонента. Для четных чисел данной последовательности установить компонент ListBox. Для компонента BitBtn1 (кнопка Закрыть) в инспекторе объектов измените свойство Kind – bkClose.

Двойным щелчком по компоненту Button1 (кнопка Вычислить) автоматически создается в окне кода стандартная структур. В данную структуру впишите часть программы (у каждого варианта своя индивидуальная часть программы). Для задания 3 эта часть выглядит следующим образом:

procedure TForm1.Button1Click(Sender: TObject);

const nmax=20;

type

ind=0..nmax;

coef=array[ind] of real;

var a: coef;

i,n:ind;

x,p:real; s:string;

begin

n:strtofloat(edit1.text);

for i:=0 to n do

begin

s:=inputbox('введите коэффициенты','a'+IntToStr(i),'0');

a[i]:=StrToint(s);

x:=strtofloat(edit2.text);

p:=a[0];

end;

for i:=1 to n do

p:=p*x+a[i];

Label2.Caption:='Значение полинома '+IntToStr(p);

end;

Таблица 9 - Индивидуальные варианты лабораторной работы №7

В

Варианты индивидуальных заданий

1

Найти наименьший элемент последовательности и его номер.

2

Вычислить сумму элементов последовательности

3

По заданному полиному найти коэффициенты полинома Q(x)=P(x).

4

По заданному полиному ) найти коэффициенты полинома

5

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

Продолжение таблицы 9

6

Дана последовательность целых чисел . Получить новую последовательность, выбросив из исходной элементы со значением max().

7

По заданной последовательности (n<=20) построить две последовательности и , элементы которых определяются условиями:

8

Дана последовательность (n<=20). Сдвинуть циклически последовательность на один элемент влево (например, из последовательности 5 8 3 4 10 получить 8 3 4 10 5).

9

Найти сумму элементов последовательности (n<=30), начиная от первого отрицательного элемента и до конца последовательности.

10

Дана последовательность вещественных чисел (n<=20). Вычислить

11

В последовательности (n<=25) заменить все отрицательные элементы их квадратами, а положительные – кубами.

12

В последовательности (n<=30) сосчитать число отрицательных и число положительных элементов.

13

Дана последовательность целых чисел (n<=15). Вычислить , где m – либо номер первого отрицательного элемента, либо n, если отрицательных элементов нет.

14

Дана последовательность из n (n<=20) различных целых чисел. Найти сумму чисел этой последовательности, расположенных между максимальным и минимальным числами, включая эти числа.

15

Даны две последовательности по n целых чисел в каждой (n<=10). Найти наименьшее среди тех чисел первой последовательности, которые не входят во вторую последовательность.

16

Даны целые числа а1,…,а50. Получить последовательность b1,…,b50, которая отличается от исходной тем, что все члены удвоены.

17

Даны натуральные числа n, a1, a2, … ,an. Определить количество ak последовательности a1,a2,…,an , являющихся нечётными числами.

Продолжение таблицы 9

18

Даны натуральные числа n, a1, a2, … ,an. Определить количество ak последовательности a1,a2,…,an, кратных 3 и не кратных 5.

19

Даны натуральные числа n, a1, a2, … ,an. Определить количество ak последовательности a1,a2,…,an, являющихся квадратами чётных чисел.

20

Даны натуральные числа n, a1, a2, … ,an. Определить количество ak последовательности a1,a2,…,an, удовлетворяющих условию

.

21

Даны натуральные числа n, a1, a2, … ,an. Определить количество ak последовательности a1,a2,…,an, удовлетворяющих условию

.

22

Даны натуральные числа n, q1, q2,…, qn. найти те члены qi последовательности q1, q2,…, qn которые являются удвоенными нечётными числами.

23

Даны натуральные числа n, q1, q2,…, qn. найти те члены qi последовательности q1, q2,…, qn, которые при делении на 7 дают остаток 1,2 или 5.

24

Даны натуральные числа n, a1, a2, … ,an. В последовательности a1, a2,…,an получить сумму положительных и число отрицательных членов.

25

Дано натуральное число n. Получить сумму тех чисел, которые являются удвоенными нечётными. При отсутствии таких чисел искомая сумма равна нулю.

26

Даны целые числа а1,…,а50. Получить сумму тех чисел данной последовательности, которые кратны 5.

27

Даны целые числа а1,…,а50. Получить сумму тех чисел данной последовательности, которые нечётны и отрицательны.

28

Даны целые числа а1,…,а50. Получить сумму тех чисел данной последовательности, которые удовлетворяют условию .

Продолжение таблицы 9

29

Даны натуральное число n, действительные числа a1, a2, … ,an. в последовательности a1, a2, … ,an все отрицательные члены увеличить на 0.5, а все неотрицательные заменить на 0.1.

30

Даны натуральное число n, действительные числа x1,…xn. В последовательности x1,…xn все члены, меньшие двух, заменить нулями.