Определить количество всех отрицательных компонент типизированного файла вещественных чисел - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Дан типизированный файл вещественных чисел. Определить количество всех отрицательных

Подпрограмма должна быть написана в стиле защитного программирования. Необходимо предусмотреть обработку всех возможных ошибок. Описать все необходимые типы данных. Написать спецификацию к подпрограмме.

Решение задачи: «Определить количество всех отрицательных компонент типизированного файла вещественных чисел»

textual
Листинг программы
  1. program file_of_single;
  2. {Задача с [url]http://www.cyberforum.ru/free-pascal/thread1628086.html[/url]
  3.  
  4.  Дан типизированный файл вещественных (Single) чисел.
  5.  Определить количество всех отрицательных.
  6.  
  7.  Подпрограмма должна быть написана в стиле защитного программирования.
  8.  Необходимо предусмотреть обработку всех возможных ошибок. Описать все
  9.  необходимые типы данных. Написать спецификацию к подпрограмме.}
  10. {$mode objfpc}{$H+}
  11.  
  12. uses
  13.     {$IFDEF UNIX}{$IFDEF UseCThreads}
  14.     cthreads,
  15.     {$ENDIF}{$ENDIF}
  16.     sysutils, {для активации механизма исключений}
  17.     Classes;
  18. {Спецификация:
  19. Функция принимает аргумент aFileName - имя файла вещественных числе
  20. и возвращает целое - количество отрицательных чисел,
  21. либо в случае неудачи значение -1}
  22. function ProcessFile(const aFileName: string): integer;
  23. var
  24.   fHandle: file of Single;
  25.   value: Single;
  26. begin
  27.   Result:= 0;
  28.   try
  29.       AssignFile(fHandle, aFileName);
  30.  
  31.     try
  32.       Reset(fHandle);
  33.  
  34.       if FileSize(fHandle) > MaxInt then
  35.          Raise Exception.Create('The file is too big. Integer overflow!');
  36.  
  37.       repeat
  38.         Read(fHandle, value);
  39.         if value < 0 then inc(Result);
  40.       until EOF(fHandle) ;
  41.  
  42.     finally
  43.       CloseFile(fHandle);
  44.     end;
  45.  
  46.   except
  47.     Result:= -1;
  48.     exit;
  49.   end;
  50.  
  51. end;
  52.  
  53. var
  54.   fHTestFile: file of Single;
  55. begin
  56.   //testing
  57.   AssignFile(fHTestFile, '_test.dat');
  58.   Rewrite(fHTestFile);
  59.   Write(fHTestFile, Single(15.0));
  60.   Write(fHTestFile, Single(-15.0));
  61.   Write(fHTestFile, Single(0.0));
  62.   Write(fHTestFile, Single(99.0));
  63.   CloseFile(fHTestFile);
  64.   //корректный файл с 1-м отрицательным
  65.   writeln('output should be 1, but we have: ', ProcessFile('_test.dat'));
  66.   //корректный файл без отрицательных
  67.   AssignFile(fHTestFile, '_test.dat');
  68.   Rewrite(fHTestFile);
  69.   Write(fHTestFile, Single(15.0));
  70.   Write(fHTestFile, Single(15.0));
  71.   Write(fHTestFile, Single(0.0));
  72.   Write(fHTestFile, Single(99.0));
  73.   CloseFile(fHTestFile);
  74.   writeln('output should be 0, but we have: ', ProcessFile('_test.dat'));
  75.   //несуществующий файл
  76.   writeln('output should be -1, but we have: ', ProcessFile('___test.dat'));
  77.   //файл неправильного формата
  78.   writeln('output should be -1, but we have: ', ProcessFile('file_of_single.exe'));
  79.  
  80.   readln;
  81. end.

Объяснение кода листинга программы

  1. Объявление функции ProcessFile с аргументом aFileName и возвращаемым типом integer.
  2. Создание переменной fHandle типа file of Single для работы с файлом.
  3. Создание переменной value типа Single для хранения прочитанного значения из файла.
  4. Инициализация результата в 0.
  5. Попытка открыть файл с помощью AssignFile(fHandle, aFileName).
  6. Проверка размера файла с помощью FileSize(fHandle) и возможность обработки его значения с помощью Raise Exception.Create.
  7. Чтение значения из файла с помощью Read(fHandle, value).
  8. Проверка на отрицательность значения и увеличение результата в случае обнаружения отрицательного числа.
  9. Повторение шагов 7-8 до достижения конца файла с помощью EOF(fHandle).
  10. Закрытие файла с помощью CloseFile(fHandle).
  11. Обработка исключений с помощью try-except блока.
  12. Установка значения результата в -1 в случае возникновения ошибки.
  13. Завершение функции с выходом из блока try-except и возвратом значения результата.
  14. Объявление переменной fHTestFile типа file of Single для работы с тестовым файлом.
  15. Создание тестового файла с помощью AssignFile(fHTestFile, '_test.dat') и Rewrite(fHTestFile).
  16. Запись в тестовый файл отрицательного значения с помощью Write(fHTestFile, Single(-15.0)).
  17. Запись в тестовый файл положительного значения с помощью Write(fHTestFile, Single(15.0)).
  18. Закрытие тестового файла с помощью CloseFile(fHTestFile).
  19. Вывод на экран ожидаемого результата выполнения функции ProcessFile('_test.dat') равного 1.
  20. Вывод на экран ожидаемого результата выполнения функции ProcessFile('_test.dat') равного 0.
  21. Вывод на экран ожидаемого результата выполнения функции ProcessFile('___test.dat') равного -1.
  22. Вывод на экран ожидаемого результата выполнения функции ProcessFile('file_of_single.exe') равного -1.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.5 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы