Номер Количество Сумма Средний
оценок баллов балл
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 умноженное на 10 в 23-й степени) изображается как 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, указывая лишь один параметр – файловую переменную.
• Данные внутрь процедур и функций можно передавать через глобальные переменные; такой прием допустим для несложных программ.
• Целые числа не содержат дробной части. Для действий с дробными числами применяют вещественные типы, например, 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. Программа должна напечатать две колонки: порядковый номер точки относительно начала файла (счет от нуля) и высоту точки (такие точки математики называют локальными минимумами).
Рис. 70 – Рельеф марсианской поверхности
Глава 31
Финал журнальной истории
В предыдущей главе мы поклялись восстановить съеденную мышами программу и отчасти сдержали клятву. Нами решена упрощенная задача – обработка журнала без фамилий учеников, то есть, мы исполнили вычислительную часть проекта. Теперь завершим его, добившись обработки настоящего классного журнала. Требуется, казалось бы, пустяк – прочесть фамилии учеников. Но воспользоваться процедурой Readln, как мы поступили в программе шифрования текста, здесь не получится, – она прочитает всю строку целиком, включая и оценки (которые станут как бы частью фамилии!).
Буква за буквой
Славный литературный герой Остап Бендер по поводу желанного миллиона сказал так: «Я бы взял частями, но мне нужно сразу!». Увы! При чтении фамилий надо проявить терпение. Если не получается сразу, возьмем по частям. Ведь строка фамилии состоит из отдельных букв, – так прочитаем фамилию по буквам! Прочитать букву может все та же процедура Read, например:
Читать дальше