Общие пояснения

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

Const MIN=5;

MAX=100;

Var Massiv1 : array[1..110] of real;

Massiv2 : array[MIN..MAX] of integer;

Кроме того, рекомендуется сначала завести свои описатели типов массивов, а затем с их помощью выделять место под конкретные переменные этих "массивных" типов, например:

Const MAXI=200;

Type IntMasMAX = array[1..MAX] of integer; {описатель для целочисленных массивов из MAX элементов}

RealMass = array[1..110] of real; { описатель

для вещественных массивов из 110 элементов }

Var Massiv1,Nmbs:IntMasMAX; {завели 2 целочисл. массива}

Massiv2,WindV:RealMass; {Завели 2 веществ. массива}

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

1. Ввод исходных данных. Обычно включает ввод количества элементов массива (с проверкой допустимости введенного значения) и ввод самих элементов массива в указанном количестве. Если ввод значений предусмотрен с клавиатуры, перед каждым оператором чтения должен быть запрос на ввод. Если используется ввод из файла, запросы не делаются, но перед вводом данных в массив из файла, последний следует открыть для чтения стандартными процедурами Assign и Reset, а в разделе описаний переменных для файла должна быть введена переменная с помощью описателя text:

VAR

Finput : text; {завели файловую переменную для набора данных текстового типа}

. . .

BEGIN

. . .

Writeln(' Введи длину массива');

metka: Read(N);

if(N<MIN) or (N>MAX) then

Begin

Writeln('Недопустимое количество, введите снова');

goto metka;

End;

Assign(Finput,'UMNIK4.DAT'); { связали файловую

переменную с набором данных UMNIK4.DAT }

Reset(Finput); { открыли файл для чтения }

for i:=1 to N do

Read(Finput,Massiv2[i]);

. . .

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

2. Вывод исходных данных. Включает обычно вывод заголовка массива, возможно с указанием его длины, и затем вывод заполненных элементов массива в удобной для просмотра на экране (и при распечатке) форме. При выводе на дисплей можно ориентироваться на ширину экрана (80 позиций), при печати – на 60 (вдоль тетрадного листа), 76 (поперек тетрадного листа или при выводе на стандартный лист).

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

· в разделе описаний переменных завести файловую переменную типа text для вывода;

· в выполняемом блоке связать файловую переменную с набором данных и открыть для вывода (используя стандартные процедуры Assign и ReWrite);

· в операторах Write и WriteLn в качестве первого (или единственного) параметра указывать имя файловой переменной;

· перед концом программы закрыть выводной файл стандартной процедурой Close.

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

Например, если числа целые и находятся в диапазоне от –999 до +999, формат должен быть не менее :5 (с учетом разделяющих пробелов). Если диапазон целых чисел неизвестен, следует рассчитывать на максимум. Для самых длинных целых чисел (–32768) он составит :7 и выводить удобно по 10 значений в строке.

Для вещественных чисел, если использовать экспоненциальную форму записи, достаточно оставлять три значащие цифры, что с учетом знака, точки и порядка числа составит :11, например, _–0.836Е-02, и выводить имеет смысл по пять чисел в строке.

Конечно, удобнее числа выводить в форме с фиксированной точкой (что можно делать, если порядки чисел известны и они не сильно отличаются от нулевого). Например, по формату :8:2 вывод идет с точностью до сотых.

При выводе в конце каждой строки следует давать команду Writeln для перехода на новую строку. Определить, что пора менять строку, можно по остатку от деления текущего номера элемента на количество значений в строке. Ниже приведен пример вывода на печать в выводной текстовый файл Fout одномерного вещественного массива по "k" значений в строке:

Assign(Fout,'UMNIK4.RES'); {связали Fout с Н.Д. UMNIK4.RES }

ReWrite(Fout); { открыли файл для записи }

Writeln(Fout,' Исходный массив из ',N,' элементов');

for i:=1 to N do

Begin

Write(Fout,Massiv2[i]:8:2); { печать в текущей строке}

if i mod k = 0 then Writeln(Fout); {если номер элемента

кратен "к", переходим на новую строку}

End;

. . .

Close(Fout); {закрытие файла }

3. Обработка массива. Здесь могут встретиться различные ситуации, на которые следует обратить внимание.

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

for i:=1 to N do

begin

if K[i] mod 5 = 0 then

{ делать что надо, т.к. элемент массива делится на 5} ;

. . .

end;

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

Например, если надо что-то делать с каждым пятым элементом массива К длиной N элементов, то цикл обработки будет иметь вид:

M:=N div 5; { определение числа повторений цикла }

for i:=1 to M do

begin

j:=i*5; { определение номера обрабатываемого элемента}

{ обработка K[j]-го элемента массива }

. . .

end;

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

j:=3;

M:=(N-(3-1)) div 5;{определение числа повторений цикла}

for i:=1 to M do

begin { обработка K[j]-го элемента массива }

. . .

j:=j+5; {определение номера следующего обраб.элемента}

end;

в) Если требуется обрабатывать символьный массив, например, подсчитать, сколько раз встречается символ 'Ó', нужно уметь, во-первых, присваивать символьным переменным нужные значения, во-вторых, вводить символы в массив с клавиатуры, и, в-третьих, уметь сравнивать символьные элементы массива.

Присваивание значения переменной можно сделать либо перенося это значение из другой переменной (если она содержит в данный момент нужный символ), либо задавая присваивание константы, либо используя функцию Chr(i), преобразования целого числа в символ (с кодом, равным этому числу). Таблица кодов символов приведена в Приложении Г. Примеры присваивания:

return false">ссылка скрыта

Const

SimA ='A';

Paragraf = #21;

Kod = 21;

SixKod = $15;

Var S1,S2,S,S4,S5,S6 : char;

. . .

Begin

. . .

S1:= SimA;

S2:=S1;

S3:='A';

S3:=Paragraf;

S4:=#21;

S5:=#$15;

S6:=Chr(21);

S7:=Chr($15);

Пример используемых операторов:

. . .

Var Sim : char;

TextM:array[1..100] of char;{завели символьный массив}

i,N : shortint;

. . .

Begin

. . .

{Если заполнение символьного массива TextM с клавиатуры}

for i:=1 to N do

begin

writeln('Вводи очередной символ');

readln(TextM[i]);

end;

. . .

{Если заполнение символьного массива TextM из файла}

assign(fin,'UMNIK4.DAT');

reset(fin);

for i:=1 to N do

read(fin,TextM[i]);

. . .

close(fin); { не забыть в конце закрыть все открытые файлы }

4. Вывод результатов. Если в процессе выполнения программы исходный массив изменяется (в нем меняются сами значения элементов, их количество или они переставляются), исправленный массив должен выводиться в конце программы под заголовком 'Измененный массив'.

Разбор контрольного варианта