Олег Деревенец - Песни о Паскале
- Название:Песни о Паскале
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Олег Деревенец - Песни о Паскале краткое содержание
Песни о Паскале - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Разумеется, оператор печати строки тоже будет изменен.
Writeln(OutFile, Counter:3, Fam:18 , Cnt:8, Sum:14, Rating:11:1);
Осталось выяснить, что такое ReadFam? Это функция чтения фамилии, которую мы напишем по рассмотренному чуть выше алгоритму (рис. 72). Мой вариант функции таков.
function ReadFam: string;
var sym: char; { очередной символ }
S : string; { накопитель строки }
begin
S:=''; { очистка накопителя строки }
{ чтение символов до первой буквы }
repeat Read(InFile, sym); until Ord(sym)>32 ;
{ чтение последующих символов }
repeat
s:= s+sym;
if Eoln(InFile) then Break;
Read(InFile, sym);
until not ((Ord(sym)>32));
ReadFam:= S; { возвращаемый результат }
end;
Обратите внимание на сравнение введенного символа с пробелом. Это сравнение можно было бы записать так:
sym <> ’ ’
Но пробел в кавычках трудно разглядеть. Лучше сравнивать код символа с кодом пробела (который равен 32), что и сделано внутри функции.
Теперь все готово, запустите программу. Что оказалось в выходном файле «Journal2.out»? Наверное, вот это.
Номер Фамилия Количество Сумма Средний
ученика оценок баллов балл
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
Если не считать кривых колонок, неплохо. Кривизну даёт разная длина фамилий учеников. Можно выровнять колонки, вычисляя спецификатор ширины в зависимости от длины фамилии. Или поступить иначе, – дополнить фамилии до одинаковой длины пробелами справа, например:
while Length(Fam) < 12 do Fam:= Fam + Char(32);
Этот оператор уместен после чтения фамилии. Окончательный вариант программы со всеми дополнениями и уточнениями представлен ниже.
{ P_31_1 – Обработка классного журнала, второй этап }
var InFile, OutFile : text; { входной и выходной файлы }
Counter: integer; { счетчик строк в файле }
{----- Функция чтения фамилии -----}
function ReadFam: string;
var sym: char;
S : string;
begin
s:=''; { очистка накопителя строки }
{ чтение символа до первой буквы }
repeat Read(InFile, sym); until Ord(sym)>32;
{ чтение последующих символов }
repeat
s:= s+sym;
if Eoln(InFile) then Break;
Read(InFile, sym);
until not ((Ord(sym)>32));
ReadFam:= S;
end;
{----- Процедура обработки строки -----}
procedure HandleString;
var N : integer; { оценка, прочитанная из файла }
Cnt: integer; { количество оценок }
Sum: integer; { сумма баллов }
Rating: Real; { средний балл }
Fam: string ; { фамилия }
begin
Fam:= ReadFam ; { читаем фамилию }
{ для выравнивания столбцов добавляем пробелы }
while Length(Fam) < 12 do Fam:= Fam + ' ';
Sum:=0; Cnt:=0; { очищаем накопитель и счетчик оценок }
While not Eoln(InFile) do begin { пока не конец строки }
Read(InFile, N); { читаем оценку в переменную N }
Sum:= Sum+N; { накапливаем сумму баллов }
Cnt:= Cnt+1; { наращиваем счетчик оценок }
end;
if Cnt>0
then begin { если оценки в четверти были }
Rating:= Sum / Cnt; { вычисляем и печатаем ср. балл }
Writeln(OutFile, Counter:3, Fam:18 , Cnt:8,
Sum:14, Rating:11:1);
end
else { а если оценок не было }
Writeln(OutFile, Counter:3, Fam:18,' : Ученик не аттестован');
end;
begin {--- Главная программа ---}
Counter:= 0; { обнуляем счетчик строк }
{ открываем входной файл }
Assign(InFile,' Journal2.in '); Reset(InFile);
{ создаем выходной файл }
Assign(OutFile,' Journal2.out '); Rewrite(OutFile);
{ выводим шапку таблицы }
Writeln(OutFile, 'Номер Фамилия Количество Сумма Средний');
Writeln(OutFile, ' оценок баллов балл');
{ пока не конец входного файла… }
while not Eof(InFile) do begin
Counter:= Counter+1; { наращиваем счетчик строк }
HandleString; { обрабатываем строку }
{ переход на следующую строку }
if not Eof(InFile) then Readln(InFile);
end;
{ закрываем оба файла }
Close(InFile); Close(OutFile);
end.
• Для чтения отдельного слова в строке файла не годятся ни оператор Readln (он прочитает всю строку), ни оператор Read, который не видит конца строки. Слово читается посимвольно оператором Read с отслеживанием признака окончания строки и других условий.
• Строку выходного файла можно формировать порциями, применяя несколько вызовов процедуры Write. Каждый такой вызов формирует часть строки и продвигает позицию записи, оставляя её в текущей строке. Для перехода к следующей строке вызывается процедура Writeln.
А) Напишите программу для преобразования первого варианта базы данных «Police.txt» (которая содержит по одному числу в строке) во второй вариант (будет содержать по три числа в строке).
Б) Файл с физическими данными старшеклассников содержит три колонки: фамилия, рост и вес ученика. Создайте программы для решения следующих задач:
• отбор кандидатов для занятий баскетболом, – рост кандидата должен составлять не менее 175 см;
• поиск учеников с избыточным весом, для которых разница между ростом ученика (см) и его весом (кг) составляет менее 100.
Ваши программы должны сформировать соответствующие файлы с фамилиями и данными учеников.
Глава 32
Порядковые типы данных

Вот поле битвы, где там и сям мелькают спины бегущего противника. Разгоряченные боем, наши полки готовы гнать его хоть на край света. Но что это? Зачем полководец прекращает атаку и велит трубить сбор? Поверьте, он знает свое дело: выигрыш битвы – ещё не победа в войне. Предстоят новые сражения, и надо укрепить армию: дать отдых бойцам, накормить, подлечить и вновь построить в боевые порядки.
Освоенные нами элементы Паскаля (считайте их нашим войском) разбили в пух и прах все поставленные задачи. Но, то ли ещё будет! Впереди сильнейший противник. Так соберем свою армию в кулак, соединим все, что нам известно о Паскале. В этой и двух последующих главах мы детально рассмотрим уже освоенные элементы языка, и в первую очередь – типы данных.
Кто из вас видел «предметы вообще»? Также не бывает и «данных вообще», – они обязательно принадлежат к тому либо иному типу. Учреждая переменную, параметр или функцию, потрудитесь сообщить их тип компилятору, иначе он не уяснит, сколько памяти отвести для этих данных и что позволено совершать с ними.
Читать дальшеИнтервал:
Закладка: