Работа с текстовыми файлами в языке Ада. Решение тематических задач

Для решения задач этого раздела рекомендую предварительно ознакомится с разделом "Работа с текстовыми файлами в языке Ада". Сразу же оговорюсь: на данном этапе рассматривается работа только с текстовыми файлами (в текстовом режиме).

  • Написать программу, считывающую с клавиатуры 5 целых цифр. Программа должна записать эти числа в файл, а затем дописать ещё 5 случайных целых цифр от 1 до 100. После этого программа должна вычислить среднее арифметическое всех цифр в файле.

  • Число 1: 1
    Число 2: 2
    Число 3: 3
    Число 4: 4
    Число 5: 5
    Случайные числа:
    Число 6: 53
    Число 7: 18
    Число 8: 64
    Число 9: 21
    Число 10: 32

    Среднее арифметическое: 20.30

  • with Ada.Text_IO; use Ada.Text_IO;
    with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
    with Ada.Float_Text_IO; use Ada.Float_Text_IO;
    with Ada.Numerics.Discrete_Random;
     
    procedure main is
    	subtype Short is Integer range 1..100; --Для генерации чисел от 1 до 100
    	package ANDR is new Ada.Numerics.Discrete_Random(Short);
    	g : ANDR.Generator; --Генератор
    	Num_File : File_Type; --Идентификатор файла
    	name : String := "numbers.txt"; --Имя файла
    	col : Integer := 5; --Количество считываемых чисел
    	n : Integer; --Сюда будет ситываться число
    	sum : Float := 0.0;
    	num : Integer := 0;
    	str : String(1..20); --сюда будет считываться информация из файла
    	str_len : Integer := 0;
    begin
    	--Создание файла для записи и запись в него данных
    	Create(File => Num_File, Mode => Out_File, Name => name);
    	for i in 1..col loop
    		Put("Число" & Integer'Image(i) & ": ");
    		Get(n);
    		Put_Line(File => Num_File, Item => Integer'Image(n));
    	end loop;
    	ANDR.Reset(g);
    	Put_Line("Случайные числа: ");
    	for i in 1..col loop
    		n := ANDR.Random(g);
    		Put_Line("Число" & Integer'Image(i + col) & ":" & Integer'Image(n));
    		Put_Line(File => Num_File, Item => Integer'Image(n));
    	end loop;
    	Close(Num_File);
     
    	--Открытие файла для чтения и чтение из него чисел
    	Open(File => Num_File, Mode => In_File, Name => name);
    	--Вместо двух предыдущих команд (закрытие файла и его повторное открытие для
            --чтения)
    	--можно использовать его переоткрытие в режиме для чтения:
    	--Reset(File => Num_File, Mode => In_File);
    	while not End_Of_File(Num_File) loop
    		while not End_of_Line(Num_File) loop
    			Get_Line(Num_File, str, str_len);
    			n := Integer'Value(str(1..str_len));
    			sum := sum + Float(n);
    			num := num + 1;
    		end loop;
    	end loop;
    	Close(Num_File);
     
    	New_Line;
    	Put("Среднее арифметическое: ");
    	Put(Item => (sum / Float(num)), Fore => 3, Aft => 2, Exp => 0);
    	New_Line;
    end main;

  • Напишите программу, которая выводит на экран код своего исходного файла (main.adb)
  • with Ada.Text_IO; use Ada.Text_IO; --Для работы с текстовыми файлами
    --Для работы с Unbounded Strings
    with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
    --Для операция ввода-вывода Unbounded Strings
    with Ada.Text_IO.Unbounded_IO; use Ada.Text_IO.Unbounded_IO;
     
    procedure main is
    	fl : File_Type;
    	fname : Unbounded_String := To_Unbounded_String("main.adb");
    	str : Unbounded_String;
    begin
    	Open(File => fl, Mode => in_File, Name => To_String(fname));
    	while not End_Of_File(fl) loop
    		--Так как в программе используется Unbounded_String, то строка считывается
                    --полностью, поэтому проверка на достижение конца строки (End_OF_Line)
                    --здесь не нужна.
    		Get_Line(File => fl, Item => str);
    		Put_Line(str);
    	end loop;
    	Close(fl);
    end main;

  • Напишите программу, которая дописывает в файл phone.txt имя, фамилию и номер телефона абонента. Если файл не существует, то программа должна создать его. В файле каждый элемент данных (имя, фамилия, телефон) должен находиться в отдельной строке.

  • Если файл не существует, то при его открытии будет вызвано исключение и, при отсутствии обработчика исключения, программа аварийно завершится. Обработчик создаст новый файл и позволит продолжить выполнение программы. Более подробно исключения будут рассмотрены в отдельной теме, а пока можно просто запомнить общую конструкцию:

        declare
        begin
        --Попытка открытия файла для дозаписи
        Open(File => fl, Mode => Append_File, Name => fname);
        --Если файл не существует:
        exception
            when others => --При любом исключении будет выполнена следующая строка
                --Создание файла для записи
                Create(File => fl, Mode => Out_File, Name => fname);
    end;

  • Добавление в телефонный справочник.
    Для завершения вместо ввода фамилии нажмите <Enter>
    Фамилия: Иванов
    Имя: Иван
    Телефон: 23-81-13
    Информация добавлена.
    Фамилия: Петров
    Имя: Вася
    Телефон: 41-11-11
    Информация добавлена.
    Фамилия:
    Ввод завершен

  • with Ada.Text_IO; use Ada.Text_IO;
    with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
    with Ada.Text_IO.Unbounded_IO; use Ada.Text_IO.Unbounded_IO;
     
     
    procedure main is
    	fl : File_Type;
    	fname : Unbounded_String := To_Unbounded_String("phone.txt");
     
    	procedure AddContact(fl: File_Type) is
    	--Добавляет в телефонный справочник контактную информацию
    		surname : Unbounded_String;
    		name : Unbounded_String;
    		phone: Unbounded_String;
    	begin
    		Put_Line("Добавление в телефонный справочник.");
    		Put_Line("Для завершения вместо ввода фамилии нажмите Enter");
    		loop
    			Put("Фамилия: ");
    			surname := To_Unbounded_String(Get_Line);
    			if Length(surname) = 0 then
    				Put_Line("Ввод завершен.");
    				exit;
    			end if;
    			Put("Имя: ");
    			name := To_Unbounded_String(Get_Line);
    			Put("Телефон: ");
    			--Проверку на корректность ввода номера я делать не буду
    			phone := To_Unbounded_String(Get_Line);
    			Put_Line(File => fl, Item => To_String(surname));
    			Put_Line(File => fl, Item => To_String(name));
    			Put_Line(File => fl, Item => To_String(phone));
    			Put_Line("Информация добавлена.");
    		end loop;
    	end AddContact;
     
    begin
    	--В следующем блоке будет использована обработка исключения.
            --Если файл не существует, то при его открытии будет вызвано исключение и, при
            --отсутствии обработчика исключения,программа аварийно завершится. Обработчик
            --создаст новый файл и позволит продолжить выполнение программы.
    	--Более подробно исключения будут рассмотрены в отдельной теме.
    	declare
    	begin
    		Open(File => fl, Mode => Append_File, Name => To_String(fname));
    		exception
    			when others =>
    				Create(File => fl, Mode => Out_File, Name => To_String(fname));
    	end;
    	AddContact(fl);	
    	Close(fl);
    end main;

  • Напишите программу, которая позволяет найти в телефонном справочнике phone.txt нужные сведения. Программа должна запрашивать фамилию человека и выводить его телефон. Если в справочнике есть люди с одинаковыми фамилиями, то программа должна вывести список всех этих людей.

  • Поиск в телефонном справочнике.
    Введите фамилию и нажмите <Enter>. Для завершения работы с программой сразу после приглашения нажмите <Enter>
    Фамилия: Петров
    В справочнике данных о Петров нет.
    Фамилия: Иванов
    Иванов Иван 57-11-08
    Иванов Степан 43-12-43
    Фамилия:

  • with Ada.Text_IO; use Ada.Text_IO;
    with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
    with Ada.Text_IO.Unbounded_IO; use Ada.Text_IO.Unbounded_IO;
     
    procedure main is
    	fl : File_Type;
    	fname : String := "phone.txt";
    	surname : Unbounded_String;
    	str : Unbounded_String;
    	snfound : Boolean := False;
     
    	procedure Get_Contact(fl : in out File_Type) is
    	begin
    		Put_Line("Поиск в телефонном справочнике.");
    		Put_Line("Введите фамилию и нажмите Enter. Для завершения работы с программой сразу после приглашения нажмите Enter");
    		loop
    			snfound := False;
    			Put("Фамилия: ");
    			surname := Get_Line;
    			--Если введена пустая строка, то выходим из процедуры
    			if Length(surname) = 0 then
    				exit;
    			end if;
     
    			Reset(fl); --"Перематываем" файл в начало
    			--Пока не достигнут конец файла
    			while not End_Of_File(fl) loop
    				Get_Line(File => fl, Item => str);
    				--Если найдено совпадение
    				if str = surname then
    					Put(str);
    					Put(" ");
    					Get_Line(File => fl, Item => str);
    					Put(str);
    					Put(" ");
    					Get_Line(File => fl, Item => str);
    					Put_Line(str);
    					snfound := True; --Найдено совпадение
    				end if;
    			end loop;
    			--Если контакта в справочнике нет
    			if not snfound then
    				Put_Line("В справочнике данных о " & surname & " нет.");
    			end if;
    		end loop;
    	end Get_Contact;
     
    begin
    	Open(File => fl, Mode => In_File, Name => fname);
    	Get_Contact(fl);
    	Close(fl);
    end main;

  • Напишите программу, которая объединяет возможности двух предыдущих программ: добавление контакта в справочник, поиск контакта по справочнику, а также имеет возможность вывода всего справочника. При запуске программы на экран должно выводиться меню, предоставляющее пользователю возможность выбора операции.

  • ***Телефонный справочник***
    Выберите действие:
    0. Выйти из программы
    1. Добавить контакт
    2. Показать телефонную книгу
    3. Найти контакт
    1
    Фамилия: Писькунов
    Имя: Жан-Поль Николаевич
    Телефон: 55-55-55
    ***Телефонный справочник***
    Выберите действие:
    0. Выйти из программы
    1. Добавить контакт
    2. Показать телефонную книгу
    3. Найти контакт
    2
    Иванов Иван 14-15-16
    Васечкин Петр 78-98-56
    Петров Василий 32-33-34
    Писькунов Жан-Поль Николаевич 55-55-55

    ***Телефонный справочник***
    Выберите действие:
    0. Выйти из программы
    1. Добавить контакт
    2. Показать телефонную книгу
    3. Найти контакт

  • with Ada.Text_IO; use Ada.Text_IO;
    with Ada.Text_IO.Unbounded_IO;
    with Ada.Strings.Unbounded;
    with Ada.Integer_Text_IO;
    with Ada.Characters.Latin_1;
     
    procedure main is
        PhoneBook : File_Type;
        PhoneBookName : String := "PhoneBook.txt";
        act : Integer := -1;
     
        function Get_Choice return Integer is
            ch : Integer := -1;
        begin
            while ch not in 0..4 loop
                Put_Line("***Телефонный справочник***");
                Put_Line("Выберите действие:");
                Put_Line("0. Выйти из программы");
                Put_Line("1. Добавить контакт");
                Put_Line("2. Показать телефонную книгу");
                Put_Line("3. Найти контакт");
                Ada.Integer_Text_IO.Get(ch);
                Skip_Line;
            end loop;
            return ch;
        end Get_Choice;
     
        function Get_Phone return Ada.Strings.Unbounded.Unbounded_String is
        --Считывает номер телефона с клавиатуры и выполняет некоторую проверку корректности ввода
            type Vector is array(1..16) of Character;
            phone : Ada.Strings.Unbounded.Unbounded_String := Ada.Strings.Unbounded.To_Unbounded_String("");
            ch : Character;
            str : String(1..1);
            --Допустимые символы при вводе номера телефона
            symb : Vector := ('0','1','2','3','4','5','6','7','8','9','(',')','-', Ada.Characters.Latin_1.LF, Ada.Characters.Latin_1.CR, '+');
            open_bracket : Integer := 0;
            close_bracket : Integer := 0;
            true_input : Boolean := False;
        begin
            loop
                Get_Immediate(ch);
                if ch = Ada.Characters.Latin_1.LF or ch = Ada.Characters.Latin_1.CR then
                    return phone;
                end if;
                --Проверка символа (есть ли он в массиве допустимых символов)
                for i in 1..symb'Last loop
                    if ch = symb(i) then
                        Put(ch);
                        str(1) := ch;
                        Ada.Strings.Unbounded.Append(phone, Ada.Strings.Unbounded.To_Unbounded_String(str(1..1)));
                        exit; --Если символ обнаружен в массиве допустимых символов, по пробегать массив до конца не имеет смысла
                    end if;
                end loop;
            end loop;
        end Get_Phone;
     
        procedure Add_Contact(PhoneBookName : String) is
        --Добавляет новый контакт в адресную книгу
            surname : Ada.Strings.Unbounded.Unbounded_String;
            name : Ada.Strings.Unbounded.Unbounded_String;
            phone : Ada.Strings.Unbounded.Unbounded_String;
            PhoneBook : File_Type;
        begin
            Put("Фамилия: ");
            surname := Ada.Strings.Unbounded.To_Unbounded_String(Get_Line);
            Put("Имя: ");
            name := Ada.Strings.Unbounded.To_Unbounded_String(Get_Line);
            Put("Телефон: ");
            phone := Get_Phone;
            New_Line;
     
            declare
            begin
                --Открыть книгу для дозаписи
                Open(File => PhoneBook, Mode => Append_File, Name => PhoneBookName);
                --Если телефонная книга не существует
                exception
                    when others =>
                        Create(File => PhoneBook, Mode => Out_File, Name => PhoneBookName);
            end;
            --Запись контакта в файл
            Put_Line(File => PhoneBook, Item => Ada.Strings.Unbounded.To_String(surname));
            Put_Line(File => PhoneBook, Item => Ada.Strings.Unbounded.To_String(name));
            Put_Line(File => PhoneBook, Item => Ada.Strings.Unbounded.To_String(phone));
     
            Close(PhoneBook);
        end Add_Contact;
     
        procedure Show_PhoneBook(PhoneBookName : String) is
        --Показывает всю адресную книгу
            str : Ada.Strings.Unbounded.Unbounded_String;
            PhoneBook : File_Type;
        begin
            Open(File => PhoneBook, Mode => In_File, Name => PhoneBookName);
     
            while not Ada.Text_IO.End_Of_File(PhoneBook) loop
                Ada.Text_IO.Unbounded_IO.Get_Line(File => PhoneBook, Item => str);
                Ada.Text_IO.Unbounded_IO.Put(str);
                Ada.Text_IO.Put(" ");
                Ada.Text_IO.Unbounded_IO.Get_Line(File => PhoneBook, Item => str);
                Ada.Text_IO.Unbounded_IO.Put(str);
                Ada.Text_IO.Put(" ");
                Ada.Text_IO.Unbounded_IO.Get_Line(File => PhoneBook, Item => str);
                Ada.Text_IO.Unbounded_IO.Put_Line(str);
            end loop;
            New_Line;
            if Is_Open(PhoneBook) then
                Close(PhoneBook);
            end if;
     
            exception
                when others =>
                    Put_Line("Телефонная книга не существует! Создайте телефонную книгу.");
        end;
     
        procedure Find_Contact(PhoneBookName : String) is
            use Ada.Strings.Unbounded; --Для того, чтобы без лишних телодвижений использовать "=" при сравнении Unbounded_String
            PhoneBook : File_Type;
            snfound : Boolean;
            surname, str : Unbounded_String;
        begin
            Open(File => PhoneBook, Mode => In_File, Name => PhoneBookName);
            Put_Line("Поиск в телефонном справочнике.");
            Put_Line("Введите фамилию и нажмите Enter.");
            snfound := False;
            Put("Фамилия: ");
            surname := Ada.Text_IO.Unbounded_IO.Get_Line;
            --Если введена пустая строка, то выходим из процедуры
            if Length(surname) /= 0 then
                Reset(PhoneBook); --"Перематываем" файл в начало
                --Пока не достигнут конец файла
                while not End_Of_File(PhoneBook) loop
                    Ada.Text_IO.Unbounded_IO.Get_Line(File => PhoneBook, Item => str);
                    --Если найдено совпадение
                    if str = surname then
                        Ada.Text_IO.Unbounded_IO.Put(str);
                        Put(" ");
                        Ada.Text_IO.Unbounded_IO.Get_Line(File => PhoneBook, Item => str);
                        Ada.Text_IO.Unbounded_IO.Put(str);
                        Put(" ");
                        Ada.Text_IO.Unbounded_IO.Get_Line(File => PhoneBook, Item => str);
                        Ada.Text_IO.Unbounded_IO.Put_Line(str);
                        New_Line;
                        snfound := True; --Найдено совпадение
                    end if;
                end loop;
            end if;
            --Если контакта в справочнике нет
            if not snfound then
                Ada.Text_IO.Unbounded_IO.Put_Line("В справочнике данных о '" & surname & "' нет.");
            end if;
            Close(PhoneBook);
     
            exception
                when others => Put_Line("Телефонная книга не существует! Создайте телефонную книгу.");
        end Find_Contact;
     
    begin
        main_loop: while act /= 0 loop
            act := Get_Choice;
            case act is
                when 0 => exit main_loop;
                when 1 => Add_Contact(PhoneBookName);
                when 2 => Show_PhoneBook(PhoneBookName);
                when 3 => Find_Contact(PhoneBookName);
                when others => Put_Line("Некорректный выбор! Попробуйте ещё.");
            end case;
        end loop main_loop;
    end main;

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *