Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
delphi / песни о паскале.pdf
Скачиваний:
62
Добавлен:
26.03.2016
Размер:
5.16 Mб
Скачать

Глава 30

Журнальная история

режиме. Если пара строк будет обработана правильно, запустите её далее в непрерывном режиме.

Блин второй

Запуская программу, не ждите результатов на экране, — программа отработает молча. Для просмотра результатов откройте выходной файл «P_30_1.out». Сделайте это, не выходя из IDE: просто нажмите F3 и укажите имя файла. Вам откроется следующая картина.

Номер

Количество

Сумма

Средний

 

оценок

баллов

балл

13124

24205

34184

43103

5273

Что это? Вместо ожидаемых четырех колонок чисел мы видим только одну. Да и числа в ней несуразные! Откуда они взялись? Пробуем разгадать эту головоломку: первая цифра совпадает с порядковым номером строки: 1, 2, 3 и так далее. Вторая равна количеству оценок ученика: 3, 4, 4, 3, 2. Ага, значит, результаты правильные, только «слиплись» в одно число, — между числами нет пробелов. Кто виноват? Нет, не мы с вами, а этот оператор.

Writeln(OutFile, Counter, Cnt, Sum, Rating);

Его параметры разделены запятыми, и потому печатаются подряд, без пробелов. Вставить пробелы можно, например, так.

Writeln(OutFile, Counter,’ ’,Cnt,’ ’,Sum,’ ’, Rating);

Тут между числами печатаются три строковые константы, состоящие из пробелов, они и будут разделять числа между собой. Количество пробелов можно рассчитать заранее или подобрать опытным путем. Но есть лучшее решение.

Спецификатор ширины поля

Лучшее решение дают спецификаторы ширины поля. Это числовые выражения, задающие количество позиций для печати параметра. Их указывают за печатаемым параметром, причем параметр и спецификатор разделяются двоеточием, например:

205

Глава 30

Журнальная история

W := 15;

Writeln(OutFile, Cnt : 10, Sum : W);

Здесь значение переменной Cnt позициях, а значение переменной значению W).

будет напечатано на десяти символьных Sum — на пятнадцати (соответственно

Спецификаторы — это дополнительные параметры процедуры печати, придающие красоту выводимым результатам. Когда число требует меньше места, чем задано в спецификаторе, лишние позиции заполнятся пробелами, а нам того и надо. К тому же, спецификатор может выравнивать выводимые числа по левому, или правому краю колонки: положительное его значение выравнивает число по правому краю, а отрицательное — по левому. Спецификаторы применяют и к строковым выражениям.

Для нашего случая я подобрал следующие значения спецификаторов.

Writeln(OutFile, Counter:3, Cnt:13, Sum:14, Rating:12);

Исправьте заодно и этот оператор вывода в файл:

Writeln(OutFile, Counter:3, ' Ученик не аттестован');

Снова запустите программу и проверьте результат. Кстати, если вы не закрывали окно с выходным файлом «P_30_1.out», то по завершении программы IDE сообщит о том, что файл на диске был изменен, — это сделала ваша программа. Но в открытом окне всё осталось по-прежнему, потому IDE спрашивает разрешение на обновление окна, — дайте положительный ответ кнопкой «Yes» и переключитесь в окно с файлом «P_30_1.out». Теперь вы увидите вот что.

Номер

Количество

Сумма

Средний

 

оценок

баллов

балл

1

3

12

4

2

4

20

5

3

4

18

4

4

3

10

3

5

2

7

3

 

 

 

 

Это почти идеальный результат. Осталась лишь одна шероховатость, — средний балл не содержит дробной части. Займемся этим вопросом.

206

Глава 30

Журнальная история

«Развесные» числа

Обратимся к строке программы, где вычисляется средний балл.

Rating:= Sum div Cnt;

Здесь одно целое число делится на другое, и результат тоже получается целым. Куда же девается дробная часть? Увы, дробная часть отбрасывается. Куда отбрасывается, не знаю, но она теряется. Поэтому при целочисленном делении получаются, например, такие забавные результаты.

7 div 3 = 2

7 div 4 = 1

7 div 5 = 1

Целые числа потому и целые, что не дают «отколоть» от себя ни крошки. Они как штучный товар. Но средний балл — это «развесной товар», для него нужны другие числа, и они в Паскале есть.

Я говорю о вещественных числах. В Паскале есть несколько типов для представления таких чисел. Один из них — REAL — родной для Паскаля, поскольку существовал в первой версии языка. Другие добавились с появлением в компьютерах математических сопроцессоров. Для хранения среднего балла воспользуемся типом REAL; с этой целью изменим объявление переменной Rating следующим образом:

var Rating: Real;

Но этого недостаточно. Дело в том, что, если мы оставим формулу

Rating:= Sum div Cnt;

без изменений, то и результат не изменится. Всё потому, что операция DIV (от Division — «деление») предназначена только для целых чисел, и дробную часть она всё равно отбросит. Для деления вещественных чисел в Паскале есть другая операция, она записывается косой чертой «/». Значит, упомянутый выше оператор мы должны изменить так.

Rating:= Sum / Cnt;

Вот теперь должно заработать! Запустив новый вариант программы и открыв выходной файл, вы найдете вот что.

207

 

 

 

 

 

Глава 30

 

 

 

 

Журнальная история

 

 

 

 

 

 

 

 

 

Номер

Количество

Сумма

 

Средний

 

 

 

оценок

баллов

балл

 

 

1

3

12

4.00000000000000E+0000

 

 

2

4

20

5.00000000000000E+0000

 

 

3

4

18

4.50000000000000E+0000

 

 

4

3

10

3.33333333333212E+0000

 

 

5

2

7

3.50000000000000E+0000

 

 

 

 

 

 

 

 

Что бы это значило? Средний балл считается верно, но печатается очень странными уродливыми числами! Не пугайтесь, перед вами научный формат представления вещественного числа, он удобен для изображения очень маленьких и очень больших чисел. Например, известное физикам и химикам число Авогадро (примерно 6,022140·1023) изображается как 6.022140E+0023. Но нам этот формат не подходит, и мы заменим его, задав спецификатор ширины поля.

Для вещественных чисел спецификатор состоит из двух частей, разделяемых двоеточием. Первая часть задает общую ширину поля печати (так же, как и для целых чисел), а вторая — количество цифр после запятой (после точки). Чтобы напечатать переменную Rating с одним знаком после точки при общей ширине поля в 12 позиций, нам следует применить такой оператор печати.

Writeln(OutFile, Counter:3, Cnt:13, Sum:14, Rating:12:1);

Теперь вновь запустим программу и полюбуемся на результат.

Номер

Количество

Сумма

Средний

 

оценок

баллов

балл

1

3

12

4.0

2

4

20

5.0

3

4

18

4.5

4

3

10

3.3

5

2

7

3.5

 

 

 

 

Прекрасно! Изрядно потрудившись и одолев ряд ошибок, мы достигли цели! Осталось лишь подытожить завоевания этой главы.

Итоги

Функция Eoln следит за признаком конца текущей строки, применяется совместно с оператором WHILE.

Для продвижения позиции чтения в начало следующей строки вызывайте процедуру Readln, указывая лишь один параметр – файловую переменную.

208

Глава 30

Журнальная история

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

Целые числа не содержат дробной части. Для действий с дробными числами применяют вещественные типы, например, Real.

Для получения дробного результата деления пользуйтесь операцией «/» (косая черта). Операция DIV при делении отбрасывает дробную часть.

Для ровной печати чисел применяйте спецификаторы ширины поля.

Аслабо?

А) Функция Trunc выделяет целую часть вещественного числа, например:

Writeln (Trunc( 12.345 ));

{ 12 }

Исследуйте её и придумайте способ выделения дробной части вещественного числа. Напишите подходящую функцию и программу для её проверки.

Б) Объясните и проверьте, что напечатает следующая программа.

var N: integer;

begin

for N:=1 to 20 do Writeln (’ ’:N, N);

end.

В) Сформируйте файл «Numbers.txt», поместив в него 100 случайных чисел в диапазоне от 0 до 999 (некоторые числа могут повторяться). Затем найдите в этом файле: 1) максимальное и минимальное число; 2) сумму всех чисел; 3) среднее арифметическое — напечатайте его с двумя знаками после точки.

Г) Сканирование марсианской поверхности дало файл, содержащий высоту отдельных его точек вдоль одного из направлений, — пусть это будет файл «Numbers.txt» из предыдущей задачи. Найдите точки, где вероятней всего обнаружить марсианскую воду. На следующем ниже рисунке они обозначены буквами W. Программа должна напечатать две колонки: порядковый номер точки относительно начала файла (счет от нуля) и высоту точки (такие точки математики называют локальными минимумами).

W

W

W

Рис. 70 - Рельеф марсианской поверхности

209

Соседние файлы в папке delphi