Метод чётно-нечётной сортировки на Turbo Prolog
.docxФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»
(СПбГУТ)
ФАКУЛЬТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ И ПРОГРАММНОЙ ИНЖЕНЕРИИ (ИТПИ)
КАФЕДРА ПРОГРАММНОЙ ИНЖЕНЕРИИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ (ПИ И ВТ)
Дисциплина: «Разработка и анализ требований проектирования ПО»
Лабораторная работа №3.
Тема: «Алгоритм сортировки чётно-нечётно»
Выполнил:
Студент группы ИКПИ-32
Кларк. А.Е
Принял:
Ерофеев Сергей Анатольевич
Подпись ______________
Постановка задачи
Целью данной работы является разработка программы для работы с файлами и списками в Turbo Prolog ,а так же реализовать метод чётно-нечётной сортировки для списка целых чисел.
1.Алгоритм работы программы заключается в следующем:
При запуске программы очищается окно, и на экран выводится сообщение о том, что происходит чтение списка из файла array.txt.
Программа проверяет, существует ли файл array.txt в рабочей папке:
Если файл не найден, на экран выводится сообщение «Error: File array.txt not found», после этого программа ждёт нажатия Enter и завершается;
Если файл найден, программа продолжает работу.
Если файл найден, программа открывает его для чтения и переключает устройство ввода на этот файл. Теперь чтение идёт не с клавиатуры, а из файла.
С помощью предиката read_array(Array) программа считывает все целые числа из файла до конца и записывает их в список Array. Каждое число в файле становится элементом списка.
После чтения:
Устройство ввода возвращается на клавиатуру;
Файл закрывается.
Программа выводит на экран исходный список, прочитанный из файла, с помощью предиката print_array(Array).
Затем программа вызывает предикат odd_even_sort(Array, Sorted), который сортирует список методом чётно-нечётной сортировки.
В результате получается отсортированный список Sorted.
Программа выводит на экран отсортированный список с помощью предиката print_array(Sorted).
В конце вызывается предикат 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 г.
