Треб-я к л.р. №1 (2022, 2-й семестр). Тема Потоковый форматированный вводвывод (текстовый файлконсоль). Работа с одномерным массивом числовых данных. Динамическое распределение памяти, адресная арифметика.
Скачать 26.17 Kb.
|
Л.р. №1: Си++, задание №6 из сборника (работа с текстовым файлом): Тема: «Потоковый форматированный ввод/вывод (текстовый файл/консоль). Работа с одномерным массивом числовых данных. Динамическое распределение памяти, адресная арифметика.» Исходные данные (последовательность чисел) должны загружаться из текстового файла с помощью файлового потока. При запуске программы у пользователя запрашивается ввод с клавиатуры имени открываемого файла. В этом же запросе пользователю предоставляется возможность ввести символ ‘*’ для завершения работы программы. Результат открытия файлового потока должен проверяться. При неуспешном открытии файлового потока должно выводиться информативное сообщение об ошибке, включающее имя открываемого файла (выводится в двойных кавычках), системный код ошибки (можно получить с помощью макроса errno), также желательно выводить системное сообщение об ошибке (ф-ция perror). Память под хранение элементов массива должна выделяться динамически с помощью оператора new (освобождаться – с помощью delete), размер выделяемой памяти должен определяться программой автоматически по содержимому файла (а не задаваться фиксированным или вводиться пользователем с клавиатуры). Результат выделения памяти должен проверяться. При неуспешном выделении памяти должно выводиться соответствующее сообщение об ошибке. Необходимо реализовать 2 способа применения операции new, обнаружения и обработки ошибки выделения памяти: первый — с nothrow, второй — без nothrow. Подсчет количества числовых значений в файле должен быть совмещен с проверкой их корректности. Если хотя бы одно числовое значение задано некорректно (содержит недопустимые символы; содержит допустимые символы, но некоторые из них находятся не на своих местах (нарушение формата числа); число выходит за границы диапазона значений выбранного для него типа данных), то дальнейший подсчет количества значений, выделение памяти, загрузка и обработка массива не производятся, а вместо этого пользователю выдается информативное сообщение, указывающее порядковый номер некорректного значения. Дополнительно пользователю можно выводить (в двойных кавычках) всю последовательность символов, задающую это некорректное значение, и абсолютную позицию в файле первого символа этой последовательности. Порядковый номер некорректного значения должен правильно определяться для различных видов возможных ошибок, допускаемых пользователем при задании числового значения в файле. При подсчете количества числовых значений в файле программа должна корректно обрабатывать ситуации, связанные с возможным наличием в файле «лишних» пробельных символов-разделителей (пробел, табуляция, переход на новую строку). Они могут находиться в любом месте файла и в любом количестве, при этом они не должны влиять на правильность подсчета количества числовых значений и на правильность выявления наличия некорректных значений. Реализовать 2 способа решения этой задачи (задачи подсчета количества чисел в файле и проверки их корректности): первый — с применением средств только файлового потока, второй — с применением дополнительного строкового потока ([i]stringstream). Вывод исходного массива и результатов его обработки на экран д.б. форматированный. Если выводится массив, то в первой строке – порядковые номера элементов, а строго под ними – значения соответствующих элементов; в начале строки с номерами – слово «Номера:», в начале строки с элементами – слово «Элементы:». В любом месте программы продемонстрировать применение адресной арифметики для обращения к элементам массива. Работа программы должна начинаться с очистки окна консоли. В программе должны присутствовать все необходимые подписи, приглашения к вводу и подсказки для пользователя, выводимые на русском языке. Вся работа программы (как успешная, так и в случае любых ошибок) должна быть зациклена через запрос имени файла (или ‘*’) и должна завершаться при вводе ‘*’. На оценку «4»: При решении задачи подсчета количества чисел в файле и проверки их корректности первым способом, допускаются некоторые недочеты по выявлению некорректных значений в файле и нежелательная чувствительность программы к наличию «лишних» пробельных символов-разделителей в некоторых местах файла. Можно не выводить последовательность символов, задающую некорректное значение. На оценку «3»: При решении задачи подсчета количества чисел в файле и проверки их корректности можно ограничиться только вторым способом. При реализации динамического выделения памяти с помощью операции new можно ограничиться только одним способом ее применения. Вопросы для самоподготовки: стандартные потоки ввода/вывода и средства работы с ними (операторы, функции-члены, манипуляторы, флаги, форматированный вывод в поток); средства и правила работы с файловыми потоками; принцип подсчета количества значений, представляющих собой элементы одномерного массива, в текстовом файле, и проверки их корректности: первым и вторым способом; основные понятия, особенности, средства и правила работы с динамической памятью (преимущества и недостатки по сравнению с другими видами памяти, адреса, указатели, new, delete, адресная арифметика); + вопросы по теме данной лаб. работы из большого списка Некоторые источники (в дополнение к конспекту лекций и видеозаписям): Указатели и динамическое распределение памяти: Прата С. Язык программирования С++. Лекции и упражнения, 6-е изд. : Пер. с англ. — М.: ООО "И.Д. Вильямс". 2012. - 1248 с. Глава 4. Составные типы Указатели и свободное хранилище (стр. 166) Указатели, массивы и арифметика указателей (стр. 179) Глава 9. Модели памяти и пространства имен Схемы хранения и динамическое выделение памяти (стр. 457) Глава 15. Друзья, исключения и многое другое Исключение bad_alloc и операция new (стр. 841) Нулевой указатель и операция new (стр. 842) Шилдт Г. С++: базовый курс, 3-е издание. : Пер. с англ. — М. : Издательский дом "Вильямс", 2010. — 624 с. Глава 6. Указатели (стр. 123) Глава 17. Обработка исключительных ситуаций Обработка исключений, сгенерированных оператором new (стр. 430) Глава 9. Еще о типах данных и операторах Динамическое распределение памяти с использованием операторов new и delete (стр. 228) Лафоре P. Объектно-ориентированное программирование в С++. Классика Computer Science. 4-е изд. — СПб.: Питер, 2003. — 928 с. Глава 10. Указатели (стр. 411) Потоковый ввод/вывод в С++: Прата С. Язык программирования С++. Лекции и упражнения, 6-е изд. : Пер. с англ. — М.: ООО "И.Д. Вильямс". 2012. — 1248 с. Глава 17. Ввод, вывод и файлы Шилдт Г. С++: базовый курс, 3-е издание. : Пер. с англ. — М.: Издательский дом "Вильямс", 2010. — 624 с. Глава 18. С++-система ввода-вывода Липпман С., Лажойе Ж., My Б. Язык программирования С++. Базовый курс, 5-е изд. : Пер. с англ. — М.: ООО "И.Д. Вильямс", 2014. — 1120 с. Глава 8. Библиотека ввода-вывода Лафоре P. Объектно-ориентированное программирование в С++. Классика Computer Science. 4-е изд. — СПб.: Питер, 2003. — 928 с. Глава 12. Потоки и файлы + справочная система |