Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Метод чётно-нечётной сортировки на Turbo Prolog

.docx
Скачиваний:
0
Добавлен:
02.01.2026
Размер:
325.26 Кб
Скачать

ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»

(СПбГУТ)

ФАКУЛЬТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ И ПРОГРАММНОЙ ИНЖЕНЕРИИ (ИТПИ)

КАФЕДРА ПРОГРАММНОЙ ИНЖЕНЕРИИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ (ПИ И ВТ)

Дисциплина: «Разработка и анализ требований проектирования ПО»

Лабораторная работа №3.

Тема: «Алгоритм сортировки чётно-нечётно»

Выполнил:

Студент группы ИКПИ-32

Кларк. А.Е

Принял:

Ерофеев Сергей Анатольевич

Подпись ______________

Постановка задачи

Целью данной работы является разработка программы для работы с файлами и списками в Turbo Prolog ,а так же реализовать метод чётно-нечётной сортировки для списка целых чисел.

1.Алгоритм работы программы заключается в следующем:

  1. При запуске программы очищается окно, и на экран выводится сообщение о том, что происходит чтение списка из файла array.txt.

  2. Программа проверяет, существует ли файл array.txt в рабочей папке:

    1. Если файл не найден, на экран выводится сообщение «Error: File array.txt not found», после этого программа ждёт нажатия Enter и завершается;

    2. Если файл найден, программа продолжает работу.

  3. Если файл найден, программа открывает его для чтения и переключает устройство ввода на этот файл. Теперь чтение идёт не с клавиатуры, а из файла.

  4. С помощью предиката read_array(Array) программа считывает все целые числа из файла до конца и записывает их в список Array. Каждое число в файле становится элементом списка.

  5. После чтения:

    1. Устройство ввода возвращается на клавиатуру;

    2. Файл закрывается.

  6. Программа выводит на экран исходный список, прочитанный из файла, с помощью предиката print_array(Array).

  7. Затем программа вызывает предикат odd_even_sort(Array, Sorted), который сортирует список методом чётно-нечётной сортировки.

    1. В результате получается отсортированный список Sorted.

  8. Программа выводит на экран отсортированный список с помощью предиката print_array(Sorted).

  9. В конце вызывается предикат wait_for_enter. На экран выводится сообщение Press Enter to exit, и программа ждёт нажатия клавиши Enter. После нажатия программа завершает работу.

2.Перечень предикатов

Предикаты ввода и вывода данных

  • read_array(List) – считывает из файла все целые числа до конца файла и записывает их в список List.

  • print_array(List) – выводит на экран элементы списка List через пробел.

Предикаты алгоритма чётно-нечётной сортировки

  • odd_even_sort(List, Sorted) – запускает чётно-нечётную сортировку списка List, результат возвращает в Sorted.

  • odd_even_iter(List, Sorted) – выполняет по очереди чётный и нечётный проходы по списку List, повторяет их, пока есть обмены, и в конце возвращает отсортированный список Sorted.

  • even_pass(Input, Output, Swapped) – выполняет чётный проход по списку Input: сравнивает пары элементов (0,1), (2,3), (4,5) и при необходимости меняет их местами; результат записывает в Output, а в Swapped возвращает флаг, был ли хоть один обмен (0 – нет, 1 – да).

  • odd_pass(Input, Output, Swapped) – выполняет нечётный проход по списку Input: первый элемент оставляет на месте, затем к остальным элементам применяет чётный проход (тем самым сравниваются пары (1,2), (3,4), (5,6)); результат записывает в Output, а в Swapped возвращает флаг обменов.

Предикаты управления работой программы

  • process_file – проверяет, существует ли файл array.txt, при наличии открывает его, считывает числа в список, выводит исходный список, сортирует его и выводит отсортированный список; при отсутствии файла выводит сообщение об ошибке.

  • wait_for_enter – выводит приглашение «Press Enter to exit» и ждёт нажатия клавиши Enter перед завершением программы.

3.Блок-схемы

Общая схема работы алгоритма чётно-нечётной сортировки.

Общая схема работы программы.

Схема одного прохода алгоритма.

4.Тестирование программы

Тест-1 n=7 [10,34,55,2,-5,4]

Программа отработала нормально.

Тест-2 n=7 [10,34,55,2,-5,4.2]

Программа нашла не целочисленное число.

Тест-3 n=6 [10,34,55,2,-5,4.2]

Программа считала только n элементов матрицы.

Тест-4 n=8 [10,34,55,2,-5,4.2]

Программа не обнаружила достаточное количество элементов матрицы.

Таким образом, программа корректно отличает ситуации, когда элементы списка являются целочисленными или вещественными.

5.Вывод

В ходе выполнения лабораторной работы была разработана программа на языке Turbo Prolog, которая:

  • читает список целых чисел из текстового файла array.txt;

  • выводит исходный список на экран;

  • сортирует список методом чётно-нечётной сортировки;

  • выводит отсортированный список;

В работе закреплены следующие навыки: чтение данных из файла и работа с устройством ввода в Turbo Prolog. Реализация алгоритма сортировки с помощью рекурсивных предикатов.

Программа прошла тестирование на нескольких наборах данных и показала корректную работу.

Код работы

NOWARNINGS

DOMAINS

realnum = real

file = file_pointer ; sorted_file % <-- добавили sorted_file в домен

int = integer

int_list = int*

str = string

flag = yes ; no

PREDICATES

go

process_file

handle_file

read_numbers(int, int_list)

print_list(int_list)

odd_even_sort(int_list, int_list)

odd_even_pass(int_list, int_list, flag)

even_pass(int_list, int_list, flag)

even_pass_pairs(int_list, int_list, flag)

continue_sort(int_list, flag, flag, int_list)

or_flag(flag, flag, flag)

write_sorted_to_file(int_list)

read_int(int)

CLAUSES

go :-

process_file.

% Процедура чтения файла numbers.txt

process_file :-

existfile("array.txt"),!,

write("File array.txt found, opening..."), nl,

openread(file_pointer, "array.txt"),

readdevice(file_pointer),

handle_file,

readdevice(keyboard),

closefile(file_pointer),!.

process_file :-

write("Error: file array.txt not found"), nl.

% Чтение N и запуск сортировки

handle_file :-

% читаем N как целое

read_int(N),

write("Array size N = "), write(N), nl,

% проверка N >= 0

N >= 0,!,

read_numbers(N, List),

nl,

write("Numbers from file:"), nl,

print_list(List), nl,

odd_even_sort(List, Sorted),

write("Sorted numbers (odd-even sort):"), nl,

print_list(Sorted), nl,

% вывод в отдельный файл

write_sorted_to_file(Sorted).

% если N < 0

handle_file :-

write("Error: N must be >= 0"), nl.

% ЧТЕНИЕ N ЧИСЕЛ В СПИСОК

read_numbers(0, []) :- !.

read_numbers(N, [X | T]) :-

N > 0,

read_int(X),

N1 = N - 1,

read_numbers(N1, T).

% ВЫВОД СПИСКА НА ЭКРАН

print_list([]) :- !.

print_list([H]) :-

write(H),!.

print_list([H | T]) :-

write(H),

write(" "),

print_list(T).

% ЧЁТНО-НЕЧЁТНАЯ СОРТИРОВКА

odd_even_sort(List, Sorted) :-

odd_even_pass(List, List1, Sw1),

even_pass(List1, List2, Sw2),

continue_sort(List2, Sw1, Sw2, Sorted).

continue_sort(List, no, no, List) :- !.

continue_sort(List, _, _, Sorted) :-

odd_even_sort(List, Sorted).

% НЕЧЁТНЫЙ ПРОХОД (1–2, 3–4, ...)

odd_even_pass([], [], no) :- !.

odd_even_pass([X], [X], no) :- !.

odd_even_pass([X, Y | Rest], [Y, X | RestOut], SwOut) :-

X > Y,!,

odd_even_pass(Rest, RestOut, SwRest),

or_flag(yes, SwRest, SwOut).

odd_even_pass([X, Y | Rest], [X, Y | RestOut], SwOut) :-

odd_even_pass(Rest, RestOut, SwRest),

or_flag(no, SwRest, SwOut).

% ЧЁТНЫЙ ПРОХОД (2–3, 4–5, ...)

even_pass([], [], no) :- !.

even_pass([X], [X], no) :- !.

even_pass([X | Rest], [X | RestOut], SwOut) :-

even_pass_pairs(Rest, RestOut, SwOut).

even_pass_pairs([], [], no) :- !.

even_pass_pairs([X], [X], no) :- !.

even_pass_pairs([X, Y | Rest], [Y, X | RestOut], SwOut) :-

X > Y,!,

even_pass_pairs(Rest, RestOut, SwRest),

or_flag(yes, SwRest, SwOut).

even_pass_pairs([X, Y | Rest], [X, Y | RestOut], SwOut) :-

even_pass_pairs(Rest, RestOut, SwRest),

or_flag(no, SwRest, SwOut).

% "логическое ИЛИ" для флагов обменов

or_flag(yes, _, yes) :- !.

or_flag(_, yes, yes) :- !.

or_flag(no, no, no).

% ВЫВОД ОТСОРТИРОВАННОГО СПИСКА В ФАЙЛ

write_sorted_to_file(List) :-

openwrite(sorted_file, "sorted.txt"),

writedevice(sorted_file),

print_list(List),

nl,

writedevice(screen),

closefile(sorted_file),

write("Sorted numbers written to sorted.txt"), nl.

% Безопасное чтение ЦЕЛОГО числа

read_int(N) :-

readln(S),

str_int(S, N),!.

read_int(_) :-

write("Error: invalid integer value in file"), nl,

fail.

GOAL

clearwindow,

write("Reading numbers from file numbers.txt"), nl, nl,

go.

Санкт-Петербург

2025 г.