Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Лабораторная работа № 4. Программирование циклических алгоритмов. Отладка программ



Лабораторная работа № 4. Программирование циклических алгоритмов. Отладка программ

Цель работы: изучить простейшие средства отладки программ в среде Delphi. Составить блок – схему, написать и отладить программу циклического алгоритма.

Операторы организации циклов

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

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

Оператор цикла – For

Оператор применяется, если известно количество повторений, и переменная цикла имеет порядковый тип.

Существует два варианта оператораFor:

C шагом 1: For переменная цикла: = нач. значение To кон. значение Do

оператор;

переменная цикла должна быть порядкового типа;

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

Для выполнения цикла должно выполняться условие

нач. значение кон. значение

Выполнение цикла For:

1. Вычисляется нач. значение и присваивается переменнойцикла.

2. Проверяется условие выполнения цикла: нач. значение ≤ кон. значение;

3. Если условие истинно (выполняется), то выполняется оператор ипп. 4–5, иначе (условие ложно) цикл завершается и выполняется оператор, стоящий после цикла.

4. Значение переменной цикла увеличивается на единицу.

5. Происходит переход к п. 2.

С шагом - 1: переменная цикла изменяется от большего значения к меньшему:

Forпеременная цикла: =нач. значение DownToкон. значение Do

оператор;

DownTo– «вниз к»;

нач. значение, кон. значение – так же как и с шагом 1.

Для выполнения цикла надо, чтобы нач. значение кон. значение.

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

Пример вычисления значения факториала n! =1·2·3·…· n

F: =1; F: =1;

For i: = 1 To n Do For i: = n DownTo 1 Do

F: = F*i; F: = F*i;

Фрагменты блок–схемы вычисления факториала приведены на рис. 4.1. и рис. 4.2.

Рис. 4.1. Цикл For с шагом 1 Рис. 4.2. Цикл For с шагом -1

Правила использования цикла For.

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

2. Циклы можно вкладывать друг в друга, но нельзя их пересекать.

3. Можно передавать управление из цикла, но нельзя передавать управление внутрь цикла.

Если заранее неизвестно, сколько раз необходимо выполнить операторы цикла, то удобнее применять циклы с предусловием While или с постусловием Repeat–Until.

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

1) неизвестно (например, цикл до достижения требуемой точности результата и т.п.);

2) известно, но шаг переменной цикла не равен 1 или переменная цикла не является переменной порядкового типа.

Операторы управления

Exit и Return – прерывают выполнение подпрограммы и осуществляют принудительный выход из подпрограммы в вызвающую программу.

Halt – останавливает выполнение программы и возвращает управление операционной системе.

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

Оператор Break

Прерывает выполнение цикла и передает управление первому оператору, расположенному после цикла.

Repeat While логическое выражение Do

оператор; Begin

… оператор;

Break; …

… Break;

оператор; …

Until логическое выражение; оператор;

оператор; End;

оператор;

При прерывании работы цикла For с помощью Break переменная цикла сохраняет свое текущее значение.

Оператор Continue

Прерывает работу текущей итерации цикла и передает управление оператору проверки условия, пропуская оставшуюся часть цикла.

Repeat While логическое выражение Do

оператор; Begin

… оператор;

Continue; …

… Continue;

оператор; …

Until логическое выражение; оператор;

оператор; End;

оператор;

Блок – схема алгоритма

 


Код программы

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Buttons, StdCtrls;

type

TForm1 = class(TForm)

Edit1: TEdit;

Edit2: TEdit;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Edit3: TEdit;

Label5: TLabel;

Edit4: TEdit;

Label6: TLabel;

Memo1: TMemo;

Label7: TLabel;

Label8: TLabel;

Button1: TButton;

BitBtn1: TBitBtn;

BitBtn2: TBitBtn;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure BitBtn2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

begin

Edit1.Text: ='0'; // Начальное значение xn

Edit2.Text: ='2'; // Конечное значение xk

Edit3.Text: ='0, 25'; // Значение шага h

Edit4.Text: ='0, 001'; // Значение точности eps

Memo1.Clear;

Label6.Caption: ='Результаты ст. гр. 012501 Иванова И.И.';

end;

procedure TForm1.Button1Click(Sender: TObject);

var

xn, xk, x, h, eps, a, s, y: Extended;

n, k: Integer;

begin

Memo1.Lines.Add('Вычисление таблицы значений функции');

Memo1.Lines.Add('Исходные данные: ');

xn: =StrToFloat(Edit1.Text);

Memo1.Lines.Add('xn='+FloatToStrF(xn, ffFixed, 6, 2));

xk: =StrToFloat(Edit2.Text);

Memo1.Lines.Add('xk='+FloatToStrF(xk, ffFixed, 6, 2));

h: =StrToFloat(Edit3.Text);

Memo1.Lines.Add('h='+FloatToStrF(h, ffFixed, 8, 3));

eps: =StrToFloat(Edit4.Text);

Memo1.Lines.Add('eps='+FloatToStrF(e, ffFixed, 8, 5));

Memo1.Lines.Add('Таблица значений функции');

Memo1.Lines.Add(' x S(x) Y(x) n');

x: =xn; // Начальное значение x (левая граница интервала)

Repeat

a: =1; // Начальное значение рекуррентной части

S: =1; // Начальное значение суммы ряда, т.к. по условию задания k=0

n: =0; // Начальное значение числа итераций (приближений)

While Abs(a)> eps Do // Вычисление суммы ряда с заданной точностью

Begin

Inc(n) // Вычисление числа итераций (приближений) n: =n+1;

a: =–a*x/n; //Вычисление рекуррентной части: знака, степени, факториала

s: =s+a;

End;

y: =Exp(–x); // Вычисление значения функции y(x)

Memo1.Lines.Add(FloatToStrF(x, ffFixed, 6, 2)+''+FloatToStrF (s, ffFixed, 8, 4)+' '+FloatToStrF(y, ffFixed, 8, 4)+' '+IntToStr(n));

x: =x+h; // Вычисление следующего значения x (добавление шага h)

Until x> xk+h/2 // xk+h/2 применяется для исключения потери последнего x

end;

procedure TForm1.BitBtn2Click(Sender: TObject);

begin // Очистка полей ввода и вывода результата для нового расчета

Edit1.text: ='';

Edit2.text: ='';

Edit3.text: ='';

Edit4.text: ='';

Memo1.Clear;

Label6.Caption: ='';

end;

end.

После отладки программы введите тест (n=2, xn=0, xk=1, h=3), установите курсор на оператор Inc(n); и нажмите клавишу F4. После этого нажимая клавишу F7, пошагово выполните программу и проследите, как меняются все переменные в процессе выполнения.

4.5. Индивидуальные задания

В соответствии с индивидуальным заданием (см. табл. 4.2) составить блок–схему алгоритма и программу вывода на экран таблицы значений функции Y(x) и ее разложения в ряд S(x) для x, изменяющегося от xn до xk, с заданным количеством шагов m ( ) и точностью eps. Близость значений S(x) и Y(x) во всем диапазоне значений x указывает на правильность вычисления S(x) и Y(x).

Спроектировать панель диалога. Создать вместо обработчика Button1.Click обработчик Memo1Click или Label1DblClick.

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

Таблица 4. 2

Индивидуальные задания

xn xk S(x) n или ε Y(x)
0, 1
0, 1
0, 1
0, 1
0, 1
0, 1
0, 1 0, 9
0, 1
0, 1
0, 1 0, 7
0, 1
0, 1
-1, 5 -0, 2
0, 2 0, 8
0, 1 0, 9
0, 1 0, 9 0, 001
0, 1 0, 001
0, 2 1, 2 0, 0001
0, 0001 2x
0, 1 1, 5 0, 0001 Sin2(x)
0, 1 1, 5 0, 0001 Sin3(x)
0, 1 0, 001 Sh(x)
0, 1 0, 001 Ch(x)
0, 1 1, 5 0, 001 Sin(x)
0, 1 1, 5 0, 001 Cos(x)
0, 1 0, 9 0, 001 Sin(x)
0, 1 1, 5 0, 001
0, 1 0, 9 0, 001 Arcsin(x)
0, 1 0, 001
0, 1 0, 001

Задания повышенной сложности

1. Определить, является ли натуральное число k палиндромом (читается одинаково как слева направо, так и справа налево). Например: 1221, 35753 – палиндромы; 7664, 112 – не палиндромы.

2. Удалить из записи натурального числа n нечетные цифры, сохранив порядок следования остальных цифр. Например, 5843 ® 84.

3. Найти все двузначные числа, сумма цифр которых не меняется при умножении их на 2, 3, 4, 5, 6, 7, 8, 9.

4. Вывести трехзначные числа, квадраты которых оканчиваются тремя одинаковыми цифрами, отличными от нуля.

5. Поменять местами наибольшую и наименьшую цифры заданного натурального числа n.

6. Числа Фибоначчи (Fi) определяются по формулам: F0 =F1=1; Fi=Fi – 1+Fi – 2 при i=2, 3, ... Найти первое из чисел Фибоначчи, превосходящих заданное число M (M> 0).

7. Пифагоровыми называются тройки натуральных чисел a, b, с, удовлетворяющие условию: a2+b2=c2. Например, пифагоровой является тройка чисел 6, 8, 10. Найдите все тройки пифагоровых чисел, не превышающих 25.

8. Совершенным называется число, равное сумме своих делителей, кроме себя самого. Например, совершенным является число 28=1+2+4+7+14. Найдите все совершенные числа на отрезке [a, b].

9. Число называется автоморфным, если после возведения в квадрат оно совпадает с младшими разрядами числа, например 52=25, 252=625. Определить, является ли заданное число n автоморфным.

10. Число, состоящее из n цифр, называется числом Армстронга, если оно равно сумме n–х степеней своих цифр, например 153= 13+53+33. Определить, является ли заданное число p числом Армстронга.

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

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

13. На заданном интервале (a, b) получить все трехзначные числа, в записи которых нет одинаковых цифр.

14. На заданном интервале (a, b) определить НОД чисел.

15. Найти k–ю цифру в последовательности, состоящей из квадратов всех натуральных чисел (149162536…).


 

Работа с массивами

Массив – пронумерованная структура данных, элементы которой обладают одним и тем же типом.

Например: 1 5 6 0 7 9 2 – массив целых чисел

a1 a2 a3 a4 a5 a6 a7

1, 2 5, 1 7, 9 2, 1 5, 5 9, 3 4, 8 – массив вещественных чисел

Каждый элемент массива обозначается именем, за которым в квадратных скобках указывается один или несколько индексов, разделенных запятыми, например: a[1], bb[i], c12[i, j*2], q[1, 1, i*j–1]. В качестве индекса можно использовать любые порядковые типы.

Объявление массива

Тип массива или сам массив определяются соответственно в разделе типов (Type) или переменных (Var) с помощью следующей конструкции:

Array[описание индексов] Of тип элемента массива;

Например:

Const

N_Max=100;

Type

Mas=Array[1.. N_Max] Of тип элементов массива;

Var

A: Mas;

i, n: Byte; {i – порядковый номер (индекс) элемента в массиве А;

n– количество элементов массива А}

Примеры описания массивов.

Const

N_Max=20; // Задание максимального значения размера массива

Type

Mas= Array [1..N] Of Byte; // Описание типа одномерного массива

Var

a: Mas; // а – массив типа Mas;

b: Array [1..10] Of Integer; // b – массив из десяти целых чисел

y: Array [1..5, 1..10] Of Char; // y – двумерный массив символьного типа

Элементы массивов могут использоваться в выражениях так же, как и обычные переменные, например: F: =2*a[3]+a[b[4]+1]*3;

a[n]: =1+sqrt(abs(a[n–1]));

Для доступа к элементу массива необходимо указать его имя и индекс (порядковый номер элемента в массиве): имя_массива [индекс]

Примеры программ

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

Const

N_Max=100;

Type

Mas=Array[1.. N_Max] Of Extended;

Var

a: Mas;

i, n, K_Pol, K_Otr: Byte; //K_Pol – количество положительных элементов

Sum_P, Sum_O: Extended; //K_Otr – количество отрицательных элементов

//Sum_P – сумма положительных элементов,

//Sum_O – сумма отрицательных элементов

Begin

// Ввод элементов массива

Sum_P: =0; // Инициализация переменных

K_Pol: =0;

Sum_O: =0;

K_Otr: =0;

For i: =1 To n Do Begin // Подсчет сумм и количества

If A[i]> 0 Then Begin // Если элемент положительный, то

Inc(K_Pol); // подсчитать количество

Sum_P: =Sum_P+A[i]; // и сумму

End;

If A[i]< 0 Then Begin // Если элемент отрицательный, то

Inc(K_Otr); // подсчитать количество

Sum_O: =Sum_O+A[i]; // и сумму

End;

End; // For i

// Вывод результатов

End;

Пример 2. Изменить значения элементов массива по заданному правилу:

- если значение элемента массива четное и положительное, то увеличить его в 2 раза,

- если кратно 3 – уменьшить на 10.

Const

N_Max=100;

Type

Mas=Array[1..N_Max] Of Integer;

Var

A: Mas;

i, n: Byte;

Begin

// Ввод элементов массива

For i: =1 To n Do Begin // Изменение значений элементов

If (A[i]> 0)And(Not Odd(A[i])) Then A[i]: =A[i]*2

Else If A[i] Mod 3=0 Then A[i]: =A[i]–10;

End; // For i

// Вывод результатов

End;

Пример 3. Записать положительные элементы массива А в массив В, а отрицательные элементы – в массив С, не меняя порядка следования элементов.

i_b: =0; //i_b количество элементов массива B,

i_c: =0; //i_c количество элементов массива C

For i: =1 to n Do Begin // Формирование новых массивов

If A[i]> 0 Then Begin

Inc(i_b); //Увеличение индекса

B[i_b]: =A[i]; // Запись в массив B

End;

If A[i]< 0 Then Begin

Inc(i_c); //Увеличение индекса

C[i_c]: =A[i]; //Запись в массив

End;

End; // Fori

Пример 4. Упорядочить элементы массива по возрастанию их значений, т.е. для всех элементов массива должно выполняться условие: ai < ai+1.

For k: =1 To n–1 Do // k – номер просмотра массива

For i: =1 To n–k Do // Просмотр элементов массива

If A[i]> A[i+1] Then Begin // Сравнение элементов массива

Tmp: =A[i]; // Перестановка элементов

A[i]: =A[i+1]; // ai и ai+1, если они

A[i+1]: =Tmp; // стоят неправильно

End;

Пример 5. Удалить из одномерного массива все отрицательные элементы.

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

– найти индекс удаляемого элемента;

– сдвинуть элементы, стоящие после него, в начало на один индекс;

– уменьшить размер массива на 1.

i: =1;

While i< =n Do Begin

If В[i]< 0 Then Begin {1} // Если найден отрицательный элемент, то

For j: =i DownTo n–1 Do {2} // сдвинуть элементы, стоящие после

В[j]: =В[j+1]; // удаляемого, на одну позицию

Dec(n); {3} // Уменьшить размер массива

Dec(i); // Возврат к предыдущему индексу

End; // If

Inc(i);

End; // While

Пример 6. Циклический сдвиг элементов массива на k позиций влево:

k: =k Mod n;

For j: =1 To k Do Begin

Tmp: =A[1];

For i: =1 To n–1 Do

A[i]: =A[i+1];

A[n]: =Tmp;

End;

Компонент TStringGrid

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

Cells[ACol: Integer; ARow: Integer]: String,

где ACol, ARow – соответственно номер столбца и строки элемента двумерного массива. Нумерация осуществляется с нуля.

Свойства ColCount и RowCount устанавливают соответственно количество столбцов и строк в таблице, а свойства FixedCols и FixedRows задают количество столбцов и строк фиксированной зоны. Фиксированная зона выделена другим цветом, и в нее запрещен ввод информации с клавиатуры.

5.5. Порядок выполнения задания

В массиве А из n элементов поменять местами максимальный и минимальный элементы. Значение n вводить в компонент TEdit, А – в компонент TStringGrid. Результат после нажатия кнопки типа TButton вывести в компонент TStringGrid.

5.5.1. Настройка компонента TStringGrid

1. На вкладке Additional в меню компонент щелкните мышью по пиктограмме для установки на форму компонентов StringGrid1и StringGrid2.

2. Установите компонент в нужном месте формы и отрегулируйте его размер.

3. В инспекторе объектов установите значения свойств TStringGrid:

ColCount равным 7 (семь столбцов), RowCount равным 2 (две строки),

FixedCols – 0 (нет столбцов с фиксированной зоной), FixedRows – 1 (одна строка с фиксированной зоной для подписи индексов элементов массива).

4. В свойстве Options (ЛКМ на знак « + », стоящий слева от Options) установите свойство goEditing в положение Trueдля компонентов StringGrid1 и StringGrid2 (по умолчанию в компонент TStringGrid запрещен ввод информации с клавиатуры).

Панель диалога приведена на рис. 5.1.

Рис. 5.1. Панель диалога

Блок – схема алгоритма

Код программы

unit Unit1;

Interface

Uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, Grids, MxArrays;

Type

TForm1 = class(TForm)

Label1: TLabel;

Edit1: TEdit;

Button1: TButton;

StringGrid1: TStringGrid;

Label2: TLabel;

Button2: TButton;

BitBtn1: TBitBtn;

StringGrid2: TStringGrid;

Label3: TLabel;

Button3: TButton;

Memo1: TMemo;

Label4: TLabel;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

Const

Nmax=100; // Максимальный размер массива

Type // Объявление типа одномерного массива размером Nmax

Mas = Array[1..Nmax] Of Extended;

Var

Form1: TForm1;

A: Mas; // Объявление одномерного массива

i, n: Byte;

Implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

Begin

Edit1.Text: ='10'; // Ввод размера массива

n: =StrToInt (Edit1.Text);

Memo1.Clear;

StringGrid1.ColCount: =n; // Задание числа столбцов в таблицах

StringGrid2.ColCount: =n;

For i: =0 To n–1 Do Begin //Заполнение верхней строки поясняющими

StringGrid1.Cells[i, 0]: =' i='+IntToStr(i+1); // подписями

StringGrid2.Cells[i, 0]: =' i='+IntToStr(i+1);

End;

End;

procedure TForm1.Button1Click(Sender: TObject); // Изменить

Begin // размер таблицы

n: =StrToInt(Edit1.Text); // Количество элементов в массиве

StringGrid1.ColCount: =n;

StringGrid2.ColCount: =n;

For i: =0 To n–1 Do Begin // Заполнение верхней строки поясняющими

StringGrid1.Cells[i, 0]: =' i='+IntToStr(i+1); // подписями

StringGrid2.Cells[i, 0]: =' i='+IntToStr(i+1);

End;

End;

procedure TForm1.Button3Click(Sender: TObject); // Очистить

begin

Memo1.Clear;

Edit1.Text: =’ ’;

For i: =0 To n–1 Do Begin

StringGrid1.Cells[i, 1]: =' ';

StringGrid2.Cells[i, 1]: =' ';

End;

End;

procedure TForm1.Button2Click(Sender: TObject);

Var

iMax, iMin: Byte;

Max, Min, t: Extended;

Begin

{$R+}

Try // Заполнение массива А элементами из таблицы StringGrid1

Memo1.Lines.Add('Исходный массив: ');

For i: =0 To n–1 Do

A[i+1]: =StrToFloat(StringGrid1.Cells[i, 1]);

For i: =1 To n Do

Memo1.Lines.Add('A['+IntToStr(i)+']='+FloatToStrF(A[i], ffFixed, 6, 0));

Except

On ERangeError Do Begin

ShowMessage('Выход за пределы массива. Уменьшите размер массива');

Exit;

End;

On EConvertError Do Begin

ShowMessage('В ячейке отсутствует значение или число введено не правильно. ');

Exit;

End

Else Begin

ShowMessage('Возникла неизвестная исключительная ситуация! ');

Exit;

End;

End;

Try

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

Max: =A[1]; // Инициализация значений

iMax: =1;

Min: =A[1];

iMin: =1;

For i: =1 To n Do Begin

If Max< A[i] Then Begin // Поиск

Max: =A[i]; // максимального элемента

iMax: =i; // и его индекса

End;

If Min> A[i] Then Begin// Поиск

Min: =A[i]; // минимального элемента

iMin: =i; // и его индекса

End;

End;

A[iMax]: =Min;

A[iMin]: =Max;

Except

On EInvalidOp Do Begin

MessageDlg('Неправильная операция с плавающей точкой.',

mtError, [mbCancel], 0);

Exit;

End;

On EOverFlow Do Begin

MessageDlg('Переполнение при выполнении операции'+

'с плавающей точкой. ', mtError, [mbCancel], 0);

Exit;

End

Else Begin

MessageDlg('Возникла неизвестная исключительная ситуация! ',

mtError, [mbCancel], 0);

Exit;

End;

End;

For i: =0 To n–1 Do // Вывод результата в таблицу StringGrid2

StringGrid2.Cells[i, 1]: =FloatToStrF(A[i+1], ffFixed, 6, 0);

Memo1.Lines.Add('Min='+FloatToStrF(Min, ffFixed, 6, 0)+

', iMin='+IntToStr(iMin));

Memo1.Lines.Add('Max='+FloatToStrF(Max, ffFixed, 6, 0)+

', iMax='+IntToStr(iMax));

Memo1.Lines.Add('Результирующий массив: ');

For i: =0 To n–1 Do

Memo1.Lines.Add('A['+IntToStr(i)+']='+

FloatToStrF(A[i+1], ffFixed, 6, 0));

End;

End.

5.6. Индивидуальные задания

В соответствии с индивидуальным вариантом составить блок–схему алгоритма и программу. Во всех заданиях переменные вводить и выводить с помощью компонента TEdit, массивы – c помощью компонента TStringGrid. Вычисления выполнять после нажатия кнопки типа TВutton. Вывести исходные данные и полученный результат. В местах возможного возникновения ошибок использовать конструкции для обработки исключительных ситуаций.

В одномерном массиве, состоящем из n вещественных элементов, определить:

1. Индексы совпадающих по величине соседних элементов.

2. Произведение между максимальным и минимальным элементами.

3. Сумму между первым и последним отрицательными элементами.

4. Среднее арифметическое элементов, расположенных до последнего положительного значения.

5. Сумму после последнего положительного элемента.

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

7. Минимальный элемент, расположенный между первым и последним нулевыми элементами.

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

9. Среднее арифметическое положительных кратных пяти элементов массива, расположенных до минимального элемента.

10. Произведение четных отрицательных элементов, расположенных между первым и вторым положительными элементами.

11. Сумму и количество нечетных элементов, расположенных после последнего отрицательного элемента.

12. Среднее арифметическое модулей кратных семи элементов, расположенных после максимального элемента.

13. Произведение модулей элементов, расположенных между первым и вторым минимальными элементами.

14. Сумму модулей элементов, расположенных между первым и последним нулевыми элементами.

15. Среднее арифметическое модулей четных элементов, расположенных между первым отрицательным и последним положительным элементами.

16. Второй по счету максимальный элемент и его индекс.

17. Максимальное значение между суммами четных и нечетных элементов массива, расположенных до минимального элемента.

18. Максимальное значение среди отрицательных элементов.

19. Минимальное значение среди четных элементов.

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

21. Индекс первого элемента, совпадающего по модулю с заданным числом t или вывести сообщение, что такого нет.

22. Индекс последнего элемента, меньшего заданного числа t или вывести сообщение, что такого нет.

23. Среднее арифметическое элементов, больших по модулю заданному числу t или вывести сообщение, что таких нет.

24. Произведение элементов между первым и последним элементами, равными заданному числу t, или вывести сообщение, что таких нет.

25. Максимальное и минимальное значения элементов, меньших заданного числа t, или вывести сообщение, что таких нет.

26. Произведение неповторяющихся элементов.

27. Наиболее часто встречающийся элемент и его индекс.

28. Среднее арифметическое четных неповторяющихся элементов.

29. Значения и индексы двух элементов, произведение которых максимально.

30. Количество инверсий, т. е. таких пар элементов, в которых большее число находится слева от меньшего.

Задания повышенной сложности

1. Даны массивы А размером n и Вразмером m, в которых числа не повторяются. Записать в новый массив элементы, встречающиеся как в массиве А, так и в В.

2. Удалить из массива А размером n элементы, не входящие в массив В размером m.

3. Заданы два массива из n и m вещественных чисел. Найти наименьшее среди тех элементов первого массива, которые не входят во второй.

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

5. Массив из n действительных чисел оставить без изменения, если он упорядочен по неубыванию или по невозрастанию; в противном случае получить положительные элементы исходного массива, упорядоченные по возрастанию.

6. В массиве В вставить после каждого отрицательного кратного трем элемента его модуль.

7. Удалить из массива Х элементы, входящие в него более одного раза.

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

9. Заменить второй элемент массива max(x1, x2), третий ̶ max(x1, x2, x3) и т. д.

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

11. Создать новый массив из наиболее длинной подпоследовательности подряд идущих убывающих значений.

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

13. Создать новый массив, каждый элемент которого рассчитывается как среднее арифметическое стоящих перед ним элементов.

14. Записать в новый массив те элементы, перед которыми находятся все меньшие их значения, а после них – большие.

15. Удалить из массива элементы, образующие возрастающую подпоследовательность.


Type

Pb=^Byte;

Pi=^Integer;

Ps=^String;

Var

p1, p2: Pointer; // Нетипизированные указатели

i: Pi; // Типизированные указатели: i – указатель на целый тип

k: Pb; // Указатель на тип Byte

S1, S2: Ps; // Указатели на строковый тип

P: ^Extended; // Указатель на вещественный тип

х: Extended; // Переменная вещественного типа

В общем виде объявление указателей можно записать:

Type

Pk=^тип; // тип – любой базовый тип

Var

a, b: Pk; // Объявление указателей через имя типа

Ptr1: ^тип; // Непосредственное объявление указателя

Ptr: Pointer; // Нетипизированный указатель

Операции над указателями

Над указателями можно применять операции присваивания и сравнения.

Указателю можно присвоить:

1. Адрес другого указателя, например p1: = p2;

Используемые в операторе присваивания типизированные указатели должны быть одного типа: S1: = S2;

Применяя нетипизированные указатели, можно передать адрес между указателями разного типа, например p1: =i;

k: =p1;

2. Константу Nil (пустой указатель), например:

S1: =Nil; // Очистка адреса, т.е. указатель никуда не указывает

k: =Nil,

 

 

3. Адрес объекта, определенный с помощью функции Addr() или оператора взятия адреса @:

х: =32;

P: =Addr(х); // Инициализация указателя

P: =@х; // То же

Через указатель можно изменить значение переменной, на которую он указывает, например:

S1^: =’БГУИР’;

// По адресу S1 размещается строка ’БГУИР’

 

k^: =25; // По адресу k размещается значение 25

i^: =k^+7; // По адресу i размещается результат k^+7

 

х: =10; // Переменной х присваивается значение 10

р^: =х; // По адресу р размещается значение 10

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

Для присваивания значения (не адреса) нетипизированному указателю надо его привести к соответствующему типу, например: Integer(p1^): =10;

При такой записи переменная p1 по-прежнему является указателем, но теперь ей можно присваивать адреса только целых переменных.

Указатели одного типа можно сравнивать на равенство = или неравенство < >, например: If a=b Then...// Указатели a и b ссылаются на одни и те же данные

If a< > b Then... // Указатели a и b ссылаются на разные данные

Часто используется проверка условия: связан ли указатель с динамической переменной, например If b< > Nil Then...

If p1=Nil Then New(p1); // Если указателю не выделена динамическая память,

// то она выделяется процедурой New();

If p1< > Nil Then Dispose(p1); // Если указатель указывает на какое-либо

// значение, то происходит очистка его адреса процедурой Dispose();

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

Процедура New()

Общий вид процедуры: New (типизированный указатель);

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

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

Каждой процедуре New(); должен соответствовать свой Dispose();

Например:

Type


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-08-31; Просмотров: 1794; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.377 с.)
Главная | Случайная страница | Обратная связь