- •Программирование на языке Паскаль в среде Turbo Pascal версии 6 и 7
- •Глава 7. Составные типы данных 29
- •Глава 8. Подпрограммы и функции 46
- •Глава 9. Файлы 50
- •Глава 10. Динамические переменные (списки) 58
- •Тип и функциональные возможности языка
- •Структура программы на Паскале
- •Алфавит языка
- •Правила написания имен
- •Структура блока описаний
- •Глава 2. Простые типы данных в языке Паскаль Понятие и классификация типов данных
- •Целочисленные типы
- •Вещественные типы
- •Логический тип
- •Символьный тип
- •Интервальный тип пользователя
- •Перечисляемый тип пользователя
- •Глава 3. Встроенные функции Понятие и классификация типов функций
- •Математические функции
- •Функции преобразования типов
- •Глава 4. Выражения Понятие и классификация типов выражений
- •Арифметические операции
- •Логические операции
- •Отношения
- •Битовые операции
- •Глава 5. Выполняемые операторы языка (для программ линейной структуры) Понятие и классификация
- •Классификация инструкций Паскаля
- •Оператор присваивания
- •Простейшие операторы ввода с клавиатуры
- •Простейшие операторы вывода на экран дисплея
- •Глава 6. Выполняемые управляющие операторы языка Простые управляющие операторы
- •Оператор безусловного перехода.
- •Оператор продолжения цикла.
- •Операторы ветвлений
- •Оператор условного перехода.
- •Неполный условный оператор.
- •Полный условный оператор.
- •Операторы циклов
- •Оператор арифметического цикла
- •Операторы итеративных циклов
- •Организация цикла с помощью условного перехода
- •Оператор итеративного цикла с предусловием
- •Оператор итеративного цикла с постусловием
- •Глава 7. Составные типы данных Классификация составных типов
- •Массивы Основные определения
- •Вывод массива
- •Примеры программ работы с массивами
- •Сортировки массива
- •Алгоритмы основных методов сортировок
- •Строки Строковые переменные
- •Стандартные (встроенные) процедуры работы со строками
- •Стандартные (встроенные) функции работы со строками
- •Структуры
- •Глава 8. Подпрограммы и функции Понятие подпрограмм в языке Паскаль.
- •Процедуры.
- •Описание и вызов функций
- •Параметры процедур и функций
- •Глава 9. Файлы Классификация внешних данных
- •Стандартные процедуры работы с файлами
- •Процедуры
- •Функции
- •Особенности работы с текстовыми файлами
- •Пример работы с текстовыми файлами.
- •Двоичные файлы (в машинных кодах) Типизированные файлы
- •Процедуры при работе с типизированными файлами
- •Функции при работе с типизированными файлами
- •Пример работы с типизированными файлами.
- •Файлы без типов
- •Процедуры, используемые при работе с нетипизированными файлами
- •Функции, используемые при работе с нетипизированными файлами.
- •Глава 10. Динамические переменные (списки) Понятие динамических переменных
- •Списочные данные
- •Односвязные списки
- •Двусвязные списки
- •Нульсвязные списки
- •Глава 11.Стандартный модуль работы с текстовым экраном Crt
- •2) Координаты экрана
- •3) Управление графическим режимом
- •4) Управление экраном и окном
- •5) Управление цветом
- •6) Вывод точек
- •7) Вывод линий
- •8) Вывод и закраска контуров
- •9) Окружности, эллипсы, дуги
- •10) Вывод текста
- •11) Последовательность работ при использовании графического режима
- •11) Пример программы приложения
Вывод массива
Включает обычно вывод заголовка массива, возможно с указанием его длины, и затем вывод заполненных элементов массива в удобной для просмотра на экране (и при распечатке) форме. При выводе на дисплей можно ориентироваться на ширину экрана (80 позиций), при печати – на 60 (вдоль тетрадного листа), 76 (поперек тетрадного листа или при выводе на стандартный лист).
Обычно для распечатки результатов работы используют вывод в текстовый файл, который затем выводят на принтер, как и текст программы. Работа с файлами будет рассмотрена в 9 главе, здесь мы остановимся на моментах, связанных с форматным выводом массивов в виде таблиц.
Оформление вывода следует выполнять с использованием формата, размер которого определяется максимальными размерами выводимых значений.
Например, если числа целые и находятся в диапазоне от –999 до +999, формат должен быть не менее :5 (с учетом разделяющих пробелов). Если диапазон целых чисел неизвестен, следует рассчитывать на максимум. Для самых длинных целых чисел (–32768) он составит :7 и выводить удобно по 10 значений в строке.
Для вещественных чисел, если использовать экспоненциальную форму записи, достаточно оставлять три значащие цифры, что с учетом знака, точки и порядка числа составит :10 и дополнительный пробел, например, _–0.836Е-02, а выводить имеет смысл по пять чисел в строке.
Конечно, удобнее числа выводить в форме с фиксированной точкой (что можно делать, если порядки чисел известны и они не сильно отличаются от нулевого). Например, по формату :8:2 вывод идет с точностью до сотых.
При выводе в конце каждой строки следует давать команду Writeln для перехода на новую строку. Определить, что пора менять строку, можно по остатку от деления текущего номера элемента на количество значений в строке. Ниже приведен пример вывода на печать одномерного вещественного массива по "k" значений в строке:
. . .
Writeln(' Исходный массив из ',N,' элементов');
for i:=1 to N do
if i mod k = 0 then { если номер элемента
WriteLn(A4[i]:8:2)кратен "к", переходим на новую строку}
else
Write(A4[i]:8:2){ печать в текущей строке}
Writeln; {переход на новую строку в конце печати}
. . .
Вышесказанное относится к выводу одномерных массивов. Для двумерных массивов, количество чисел на строке дисплея определяется числом столбцов массива. Если число столбцов не позволяет разместить массив на экране целиком, его приходится распечатывать по несколько столбцов, организуя не двойной, а тройной цикл. Пример распечатки целочисленного двумерного массива представлен ниже:
. . .
Writeln(' Исходный массив из ',M,'x',N,' элементов');
for i:=1 to M do
begin
for j:=1 to N do
Write(A[i,j]:6); {печать текущей строки }
Writeln; {переход на новую строку экрана перед новой строкой массива}
end;
. . .
Примеры программ работы с массивами
Перестановка целочисленного массива из N элементов (N<=100) в обратном порядке.
Метод решения задачи предлагается следующим: Чтобы массив оказался записанным в обратном порядке, первый элемент (A[1]) надо поменять местами с последним (A[N]), второй (A[2]) – с предпоследним (A[n-1]) и т.д. (A[i],< A[N+1-i]). Перестановку будем выполнять, используя рабочую переменную (R). Количество переставляемых пар – N div 2.
Таким образом, при условии заполнения массива из файла (подробно работа с файлами будет рассмотрена позже), программа будет выглядеть так:
Program Revers;
{ VGI, MIT }
Var Fin,Fout:text;
A : array[1..100] of integer;
i,N,R: integer;
BEGIN
Repeat
WriteLn(’Задайте длину массива’);
ReadLn(N);
if N>100 then
WriteLn(’Нельзя больше 100’);
Until N<=100;
Assign(Fin,’S:\kurs_1\_data\DatI.txt’);
Reset(Fin);
for i:=1 to N do
Read(Fin,A[i]);
Close(Fin);
Assign(Fout,’Revers.txt’);
ReWrite(Fout);
WriteLn(Fout,’Исходный массив’);
for i:=1 to N do
if i mod 10 = 0 then { печатаем по десять чисел в строке }
WriteLn(Fout,A[i]:7)
else
Write(Fout,A[i]:7);
WriteLn(Fout);
for i:=1 to N div 2 do
begin
R:=A[i];
A[i]:=A[N+1-i];
A{N+1-i]:=R;
end;
WriteLn(’Измененный массив’);
for i:=1 to N do
if i mod 10 = 0 then
WriteLn(Fout,A[i]:7)
else
Write(Fout,A[i]:7);
WriteLn(Fout);
Close(Fout);
END.
Второй пример. Удаление строки с минимальным значением из двумерного вещественного массива размерами M x N элементов, где M и N не превосходят 7.
Алгоритм решения состоит из следующих частей:
1. Ввод числа строк
2. Ввод числа столбцов
3. открытие файла с числами и заполнение массива значениями
4. Открытие выходного файла и распечатка в него исходного массива
5. Поиск места, где расположен минимальный элемент массива
6. удаление строки с минимальным элементом. Удаление производится, путем переписывания на место удаляемой строки, строки, лежащей ниже (следующей). Затем, в строку, которую откопировали в вышележащую, переписывается следующая строка и т.д. Наконец, M-я строка копируется на (M-1)-е место.
7. количество строк исправленного массива уменьшается на 1.
8. Полученный массив распечатывается
Реализация алгоритма (с некоторыми пропусками) выглядит так:
Program DelLine;
{ VGI, MIT }
Var Fin,Fout:text;
A : array[1..7,1..7] of real;
i,j,N,M,imin,jmin: integer;
Amin : real;
BEGIN
Repeat
WriteLn(’Задайте число строк’);
ReadLn(N);
if N>7 then
WriteLn(’Нельзя больше 7’);
Until N<=7;
{ аналогично задается число столбцов N}
. . .
Assign(Fin,’S:\Kurs_1\_Data\DatF.txt’);
Reset(Fin);
for i:=1 to M do
for j:=1 to N do
Read(Fin,A[i,j)’
Close(fin);
Assign(Fout,’DelLine.txt’);
ReWrite(Fout);
WriteLn(Fout,’Исходный массив’);
for i:=1 to M do
begin
for j:=1 to N do
Write(Fout, A[i,j]);
WriteLn(Fout);
end;
{ поиск места минимального элемента }
imin:=1;
jmin:=1; { сначала считаем минимальным 1-й элемент массива}
for i:=1 to M do
for j:=1 to N do
if A[i,j]<A[imin,jmin] then
begin
imin:=i;
jmin:=j;
end;
{ Удаление строки с номером imin }
for i:=imin to M-1 do
for j:=1 to N do
A[i,j] := A{i+1,j];
M:=M-1;
{ печатаем измененный массив, также, как и исходный и закрываем
файл с протоколом}
. . .
Close(Fout);
END.