Определить количество всех отрицательных компонент типизированного файла вещественных чисел - Free Pascal
Формулировка задачи:
Дан типизированный файл вещественных чисел. Определить количество всех отрицательных
Решение задачи: «Определить количество всех отрицательных компонент типизированного файла вещественных чисел»
textual
Листинг программы
program file_of_single;
{Задача с [url]http://www.cyberforum.ru/free-pascal/thread1628086.html[/url]
Дан типизированный файл вещественных (Single) чисел.
Определить количество всех отрицательных.
Подпрограмма должна быть написана в стиле защитного программирования.
Необходимо предусмотреть обработку всех возможных ошибок. Описать все
необходимые типы данных. Написать спецификацию к подпрограмме.}
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
sysutils, {для активации механизма исключений}
Classes;
{Спецификация:
Функция принимает аргумент aFileName - имя файла вещественных числе
и возвращает целое - количество отрицательных чисел,
либо в случае неудачи значение -1}
function ProcessFile(const aFileName: string): integer;
var
fHandle: file of Single;
value: Single;
begin
Result:= 0;
try
AssignFile(fHandle, aFileName);
try
Reset(fHandle);
if FileSize(fHandle) > MaxInt then
Raise Exception.Create('The file is too big. Integer overflow!');
repeat
Read(fHandle, value);
if value < 0 then inc(Result);
until EOF(fHandle) ;
finally
CloseFile(fHandle);
end;
except
Result:= -1;
exit;
end;
end;
var
fHTestFile: file of Single;
begin
//testing
AssignFile(fHTestFile, '_test.dat');
Rewrite(fHTestFile);
Write(fHTestFile, Single(15.0));
Write(fHTestFile, Single(-15.0));
Write(fHTestFile, Single(0.0));
Write(fHTestFile, Single(99.0));
CloseFile(fHTestFile);
//корректный файл с 1-м отрицательным
writeln('output should be 1, but we have: ', ProcessFile('_test.dat'));
//корректный файл без отрицательных
AssignFile(fHTestFile, '_test.dat');
Rewrite(fHTestFile);
Write(fHTestFile, Single(15.0));
Write(fHTestFile, Single(15.0));
Write(fHTestFile, Single(0.0));
Write(fHTestFile, Single(99.0));
CloseFile(fHTestFile);
writeln('output should be 0, but we have: ', ProcessFile('_test.dat'));
//несуществующий файл
writeln('output should be -1, but we have: ', ProcessFile('___test.dat'));
//файл неправильного формата
writeln('output should be -1, but we have: ', ProcessFile('file_of_single.exe'));
readln;
end.
Объяснение кода листинга программы
- Объявление функции ProcessFile с аргументом aFileName и возвращаемым типом integer.
- Создание переменной fHandle типа file of Single для работы с файлом.
- Создание переменной value типа Single для хранения прочитанного значения из файла.
- Инициализация результата в 0.
- Попытка открыть файл с помощью AssignFile(fHandle, aFileName).
- Проверка размера файла с помощью FileSize(fHandle) и возможность обработки его значения с помощью Raise Exception.Create.
- Чтение значения из файла с помощью Read(fHandle, value).
- Проверка на отрицательность значения и увеличение результата в случае обнаружения отрицательного числа.
- Повторение шагов 7-8 до достижения конца файла с помощью EOF(fHandle).
- Закрытие файла с помощью CloseFile(fHandle).
- Обработка исключений с помощью try-except блока.
- Установка значения результата в -1 в случае возникновения ошибки.
- Завершение функции с выходом из блока try-except и возвратом значения результата.
- Объявление переменной fHTestFile типа file of Single для работы с тестовым файлом.
- Создание тестового файла с помощью AssignFile(fHTestFile, '_test.dat') и Rewrite(fHTestFile).
- Запись в тестовый файл отрицательного значения с помощью Write(fHTestFile, Single(-15.0)).
- Запись в тестовый файл положительного значения с помощью Write(fHTestFile, Single(15.0)).
- Закрытие тестового файла с помощью CloseFile(fHTestFile).
- Вывод на экран ожидаемого результата выполнения функции ProcessFile('_test.dat') равного 1.
- Вывод на экран ожидаемого результата выполнения функции ProcessFile('_test.dat') равного 0.
- Вывод на экран ожидаемого результата выполнения функции ProcessFile('___test.dat') равного -1.
- Вывод на экран ожидаемого результата выполнения функции ProcessFile('file_of_single.exe') равного -1.