- •Разработал:
- •Содержание
- •Задачи с циклами
- •Цикл с предусловием
- •Вечный цикл
- •Цикл с постусловием
- •Цикл с переменной
- •Дополнительные операторы управления циклами
- •Вложенные циклы
- •Статические массивы
- •Многомерные статические массивы
- •Ввод-вывод массивов
- •Ввод с клавиатуры
- •Считывание массива из файла
- •Поиск максимума и минимума
-
Считывание массива из файла
Чтобы сто раз не вводить одно и то же, удобно организовать считывание элементов массива из текстового файла. В каждой строчке такого файла записан один элемент массива (Рис. 6, а).
|
|
||
а) одномерный массив |
б) двумерный массив |
Рис. 6 – Файлы для хранения массивов.
Считывание делается примерно следующим образом:
TYPE TA=ARRAY[1..10] OF REAL;
VAR a:TA; f:TEXTFILE; i:BYTE;
BEGIN
ASSIGNFILE(f,'1.txt');
RESET(f);
FOR i:=1 TO 10 DO
READLN(f,a[i]);
CLOSEFILE(f);
…
Преобразование типов (из файла считывается текстовая строка, а в массив оно заносится как вещественное число) выполняется автоматически процедурой READLN.
Если массив двумерный, то удобно в каждой строчке файла располагать несколько его элементов, разделяя их пробелами. Давайте считаем массив 33 элемента, показанный на Рис. 6, б:
TYPE TA=ARRAY[1..3,1..3] OF REAL;
VAR a:TA; i,j:BYTE; f:TEXTFILE;
BEGIN
ASSIGNFILE(f,'1.txt');
RESET(f);
// Цикл по строкам файла
FOR i:=1 TO 3 DO
BEGIN
// Цикл по числам внутри строки
FOR j:=1 TO 3 DO
READ(f,a[I,j]);
// Считывание символов конца строки
READLN(f)
END;
CLOSEFILE(f);
…
В приведенном фрагменте используется процедура READ, которая считывает не строку целиком, а ее часть до следующего пробела. После считывания всех чисел из строки нужно перейти на следующую строчку, для чего применяется процедура READLN(f). Данных она не считывает, а просто переходит к следующей строке файла.
-
Поиск максимума и минимума
Допустимые отклонения размеров деталей будут накапливаться
однонаправленно, чтобы причинить максимум трудностей при сборке.
Из законов Мэрфи
Очень часто встречается задача нахождения минимального или максимального элемента в массиве. Существует много неправильных способов ее решения. А вот как выглядит правильный:
CONST Nmax=10; { число элементов в массиве }
TYPE TA=ARRAY[1..Nmax] OF REAL;
VAR a:TA; i:BYTE; max: REAL;
BEGIN
// заполнение массива
FOR i:=1 TO Nmax DO
a[i]:=RANDOM;
max := a[1];
FOR i:=2 TO Nmax DO
IF a[i]>max THEN
max:=a[i];
Label1.Caption:=
'Максимальный элемент равен '+FloatToStrF(max,ffFixed,10,4);
Суть этого способа в том, что сначала мы принимаем первый элемент массива за максимальный, а потом сравниваем с ним все остальные элементы, начиная со второго. Если очередной элемент окажется больше, мы запоминаем его значение в переменной max.