Общие пояснения
Рассмотрим некоторые моменты, связанные с обработкой одномерных массивов. Следует помнить, что выделение памяти под массив при его описании может производиться только с помощью констант (в явном виде, или с предварительным описанием константы), например:
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. Вывод результатов. Если в процессе выполнения программы исходный массив изменяется (в нем меняются сами значения элементов, их количество или они переставляются), исправленный массив должен выводиться в конце программы под заголовком 'Измененный массив'.
Разбор контрольного варианта