ЛАБОРАТОРНАЯ МОЯ!4. Массивы. Одномерные массивы
Скачать 305 Kb.
|
Дата 14.05.2007г. Лабораторная работа №4 Тема: Массивы. Одномерные массивы. Цель: Изучить массивы. Одномерные массивы. Многие задачи, которые решаются с помощью компьютера, связаны с обработкой больших объемов информации, представляющей совокупность данных, объединенных единым математическим содержанием или связанных между собой по смыслу. Такие данные удобно представлять в виде линейных или прямоугольных таблиц. В линейной таблице каждому ее элементу соответствует порядковый номер. Для элемента прямоугольной таблицы должны быть указаны два номера: номер по вертикали (номер строки) и номер по горизонтали (номер столбца). В высшей математике табличные величины называют соответственно векторами и матрицами. В программе для представления таких данных используются массивы. Массив — это упорядоченная совокупность однотипных данных, с каждым из которых связан упорядоченный набор целых чисел, называемых индексами. Массив характеризуется именем, размерностью и размером. Имя массива образуется по общему правилу образования имен, т. е. представляет собой идентификатор, например A, Bl, C8 и т. д. Однако оно не должно совпадать с именем ни одной простой переменной, используемой в той же программе. Работа с массивом сводится к действиям над его элементами. Для того чтобы указать, какой элемент в данный момент используется, достаточно задать его порядковый номер, который приписывается к имени соответствующего массива. Таким образом, элементы массива обозначаются переменной с индексами. Запись переменной с индексами состоит из имени массива и следующего за ним в квадратных скобках списка индексов, например А[1], A[I], B1[K], C8[I, J], С8[2, 1] Индексы определяют положение элемента в массиве. Число индексов определяет размерность массива, т.е. форму его компоновки: одномерный, двумерный и т. д. Одномерный массив соответствует линейной таблице. Его элемент обозначается переменной с одним индексом: A[l], A[I] —соответственно первый и i-й элементы одномерного массива А; Двумерный массив описывает в программе прямоугольную таблицу. Его элементы обозначаются переменной с двумя индексами: C8[I, J], С8[2, 1], где первый индекс обозначает номер строки, а второй — номер столбца. Таким образом, для обращения к конкретному элементу массива необходимо указать имя массива и значения индексов. Для записи элементов массива в память компьютера нужно выделить для их хранения необходимое количество (массив) ячеек памяти, которое определяется размером массива. Размеры массива задаются границами изменения индексов по каждому измерению (минимальное и максимальное значение индекса). По умолчанию применяется так называемая нумерация с нулевой базой, т.е. элементы массива нумеруются, начиная с 0. В программе для каждого массива должны быть указаны его параметры: имя, размерность и размеры. Эта информация нужна для резервирования необходимого объема памяти для хранения числовых значений; она задается специальным оператором описания массивов. Описание статического массива определяет имя, размер массива и тип данных, которые в нем хранятся. Формат описания в разделе переменных: Var <имя_массива>: array <[тип_индекса]> of <тип_данных>; Чаще всего в качестве типа индекса используется интервальный целый тип (тип-диапазон). Интервальный тип задается начальным и конечным значениями, которые разделяются двумя точками. Например Var A : array [1..10] of real; Описывается одномерный массив вещественных чисел A, который максимально может состоять из 10 элементов. Нижняя граница индекса равна 1, верхняя – 10. Начиная с версии Delphi 4 можно использовать также и динамические массивы, когда количество элементов может меняться по ходу выполнения программы. Динамические массивы отличаются от обычных статических тем, что для них не объявляется заранее длина – число элементов. Объявление такого массива содержит только имя и тип элементов. Var <имя_массива>: array of <тип_данных>. При объявлении динамического массива место под него не отводится. Прежде чем использовать такой массив, надо задать в программе его размер процедурой SetLength. Параметры данной процедуры - количество элементов по каждой размерности. Например, SetLength(10,20) - для двумерного массива. Линейный (одномерный) массив – это просто список элементов данных. Примеры описания одномерных массивов: var B : array [0..5] of real R : array [1..34] of char; N : array [’A’..’Z’] of integer; M : array of integer; {динамический массив} Для доступа к элементу массива следует указать имя массива с последующим числом (индексом), заключенном в квадратные скобки. Элементы массива можно использовать в любом выражении точно также как и значение константы или переменной. Сортировка выборомСуть этого метода очень проста и может быть описана так: 1. В последовательности из n элементов выбирается наименьший (наибольший) элемент; 2. Меняется местом с первым; 3. Далее процесс повторяется с оставшимися n-1 элементами, затем с оставшимися n-2 элементами и т.д., до тех пор пока не останется один самый большой (маленький) элемент. Задание №1. Заполните массив случайными числами. Отсортируйте массив по возрастанию методом пузырька. Программа на языке Delphi unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Label1: TLabel; Button1: TButton; Button2: TButton; Edit3: TEdit; Label2: TLabel; Image1: TImage; Label3: TLabel; BitBtn1: TBitBtn; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; n:integer; M:array of integer; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin Randomize; N:=strtoint(edit2.Text); setlength(M,N); edit1.Text:=''; for i:=0 to N-1 do begin M[i]:=Round(sin(random(10))*10); edit1.Text:=edit1.text+' '+inttostr(M[i]); end; end; procedure TForm1.Button2Click(Sender: TObject); var i,j,k_m:integer; t,p:integer; begin edit3.Text:=''; for i:=0 to n-2 do for j:=n-1 downto i+1 do if M[j-1]>M[j] then begin p:=M[j-1]; M[j-1]:=M[j]; M[j]:=p end; for i:=0 to n-1 do edit3.Text:=edit3.text+' '+inttostr(M[i]); end; end. Тестирование Индивидуальное задание №1 1. Дан массив целых чисел из n элементов, заполненный случайным образом числами из промежутка [-10,20]. Найти сумму элементов, имеющих нечетные индексы. 2. Подсчитать количество элементов массива, значения которых больше заданного числа А и кратных 5. 3. Найти номер первого отрицательного элемента, делящегося на 5 с остатком 2. Программа на языке Delphi unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Image1: TImage; Edit1: TEdit; Edit2: TEdit; Button1: TButton; Button2: TButton; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; GroupBox1: TGroupBox; CheckBox2: TCheckBox; CheckBox3: TCheckBox; CheckBox1: TCheckBox; Label1: TLabel; Label2: TLabel; Label3: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; n:integer; M: array of integer; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin Randomize; N:=strtoint(edit2.Text); setlength(M,N); edit1.Text:=''; for i:=0 to N-1 do begin M[i]:=Random(31)-10; edit1.Text:=edit1.text+' '+inttostr(M[i]); end; end; procedure TForm1.Button2Click(Sender: TObject); var i:integer; a,sum,k,countp,per,chislo,j:integer; begin a:=strtoint(edit6.text); edit3.Text:=''; edit4.Text:=''; edit5.Text:=''; sum:=0; countp:=0; chislo:=m[0]; per:=0; k:=0 ; for i:=0 to n-1 do begin if checkbox1.Checked then if i mod 2<>0 then sum:=sum+m[i]; if checkbox2.Checked then if (m[i]>a) and (m[i] mod 5=0) then countp:=countp+1; if checkbox3.Checked then for j:=0 to n-1 do if (m[i]<0) and (m[i] mod 5 =2) then begin chislo:=m[i+1]; per:=i+1; break; end; end; if checkbox1.checked then edit3.text:=inttostr(sum); if checkbox2.checked then edit4.text:=inttostr(countp); if checkbox3.checked then edit5.text:=inttostr(per); end; end. Тестирование Индивидуальное задание №2 1. Заменить последний положительный элемент массива на второй элемент массива. 2. Разделить все элементы массива с четными номерами на первый элемент (первый элемент отличен от 0). 3. Из элементов массива D сформировать массив A той же размерности по правилу: если номер четный, то значение элемента находится по формуле Ai = Di2, если нечетный, то по форму ле Ai = 2Di. Программа на языке Delphi unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Button1: TButton; Button2: TButton; Image1: TImage; GroupBox1: TGroupBox; CheckBox1: TCheckBox; Label1: TLabel; CheckBox2: TCheckBox; Edit5: TEdit; CheckBox3: TCheckBox; Label2: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; n:integer; M: array of integer ; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin Randomize; N:=strtoint(edit2.Text); setlength(M,N); edit1.Text:=''; for i:=0 to N-1 do begin M[i]:=Random(31)-10; edit1.Text:=edit1.text+' '+inttostr(M[i]); end; end; procedure TForm1.Button2Click(Sender: TObject); var i:integer; vivod,mass:real; a,s,k,pol,nomer,j:integer; begin edit3.Text:=' '; pol:=m[0]; nomer:=0 ; for i:=n-1 downto 0 do begin if (m[i]>0) and (i>nomer) then begin pol:=m[i]; nomer:=i; m[i]:=m[1]; break; end; end; for i:=0 to n-1 do if checkBox1.Checked then edit3.text:=edit3.text+' '+inttostr(m[i]); begin edit4.Text:=' '; for i:=0 to n-1 do begin if (i mod 2=0) and (m[i]<>0) then vivod:=m[i]/m[0]; if i mod 2<>0 then vivod:=m[i]; if checkbox2.Checked then edit4.text:=edit4.text+' '+floattostr(vivod); end; end; begin edit5.Text:=' '; for i:=0 to n-1 do begin if i mod 2=0 then mass:=sqr(m[i]); if i mod 2<>0 then mass:=2*m[i]; if checkbox3.Checked then edit5.Text:=edit5.text+' '+floattostr(mass); end; end; end; end. Тестирование Дан массив целых чисел из n элементов, заполненный случайным образом числами из промежутка [-35,75]. Удалить из него все элементы, первая цифра которых четная. Программанаязыке Delphi unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Button1: TButton; Button2: TButton; Label1: TLabel; Image1: TImage; Label3: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; n:integer; M : array of integer; B : array of integer; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin Randomize; N:=strtoint(edit1.Text); setlength(M,N); edit2.Text:=''; for i:=0 to N-1 do begin M[i]:=Random(111)-35; edit2.Text:=edit2.text+' '+inttostr(M[i]); end; end; procedure TForm1.Button2Click(Sender: TObject); var i,k,ib,j,sdvig,pos,tmp:integer; begin edit3.Text:=' '; i:=0; while i<=N-1 do if (m[i] div 10 mod 2<>0) or (m[i]=0) or (m[i] div 10 =0) and (m[i] mod 2<>0) then i:=i+1 else begin for j:=i to n-1 do m[j]:=m[j+1]; n:=n-1; end; for i:=0 to n-1 do edit3.Text:=edit3.text+' '+inttostr(M[i]); end; end. Тестирование Вставить число К1 после всех элементов, больших заданного числа Программанаязыке Delphi unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Button1: TButton; Button2: TButton; Edit3: TEdit; Edit4: TEdit; Image1: TImage; Label1: TLabel; Label2: TLabel; Label3: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } publiс { Public declarations } end; var Form1: TForm1; n:integer; M: array of integer ; b: array of integer ; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin Randomize; N:=strtoint(edit1.Text); setlength(M,n); edit2.Text:=''; for i:=0 to N-1 do begin M[i]:=Random(31)-10; edit2.Text:=edit2.text+' '+inttostr(M[i]); end; end; procedure TForm1.Button2Click(Sender: TObject); var k,i,ib:integer; begin setlength(b,2*n); k:=strtoint(edit4.Text); edit3.text:=''; ib:=1; for i:=0 to n do begin b[ib]:=m[i]; if m[i]>k then begin ib:=ib+1; b[ib]:=k; end; ib:=ib+1; end; k:=ib-1; for i:=1 to k do edit3.text:=edit3.text+' '+inttostr(b[i]); end; end. Тестирование Перенести первые k элементов в конец: a[k+1], a[k+2], .. ,a[n], a[2], .., a[k]. Программанаязыке Delphi unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Button1: TButton; Edit3: TEdit; Button2: TButton; Edit4: TEdit; Image1: TImage; Label1: TLabel; Label2: TLabel; Label3: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; M:array of integer; n:integer; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin Randomize; N:=strtoint(edit1.Text); setlength(M,N); edit2.Text:=''; for i:=0 to N-1 do begin M[i]:=Random(31)-10; edit2.Text:=edit2.text+' '+inttostr(M[i]); end; end; procedure TForm1.Button2Click(Sender: TObject); var k,i,tmp,j,sdvig:integer; begin edit3.Text:=''; k:=strtoint(edit4.Text); if k<>0 then begin if k>0 then sdvig:=k else sdvig:=n+k; for i:=0 to sdvig do begin tmp:=m[n-1]; for j:=n-2 downto 0 do m[j+1]:=m[j]; m[0]:=tmp; end; end; for i:=0 to n-1 do edit3.Text:=edit3.Text+' '+inttostr(m[i]); end; end. Тестирование Вывод: Я изучила массивы, одномерные массивы. |