Определить количество всех отрицательных компонент типизированного файла вещественных чисел - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д