Федеральное Агентство Железнодорожного Транспорта Федеральное Государственное Бюджетное Образовательное Учреждение Высшего Образования «Московский Государственный Университет Путей Сообщения Императора Николая II» (МГУПС(МИИТ) Кафедра: «Экономической информатики» ОТЧЁТ по лабораторной работе №1 по теме: «Сортировка массива методом обмена» Дисциплина: «Основы алгоритмизации и программирования» Выполнила студентка группы: ППИ-111 Принял: доц. Ханин В.И. Москва 2016 Содержание 1. Постановка задачи ................................................................ 3 2. Требования к программе и ограничения............................. 4 3. Тестовый пример .................................................................. 5 4. Описание идентификаторов................................................. 8 5. Блок-схема данного алгоритма ............................................ 9 6. Листинг программы............................................................ 14 7. Результаты работы программы.......................................... 19 8. Список используемой литературы .................................... 21 2 1. Постановка задачи Требуется разработать алгоритм и программу сортировки массива элементов целого типа методом «обмена». Суть метода «обмена». Элементы массива последовательно сравниваются попарно: первый со вторым, второй с третьим и т.д. по каждой паре определяются, как составляющие её элементы соотносятся между собой. Если их соотношение не удовлетворяет условиям сортировки, то выполняется перестановка элементов по отношению друг к другу (обмен). В противном случае элементы остаются на своих местах. Указанные операции на каждом шаге сортировки выполняются со всеми элементами массива. Причем количество связанных с этим шагом операций заранее не определимо. Массив считается упорядоченным, когда на последнем шаге не окажется перестановок. 3 2. Требования к программе и ограничения Требования к программе: 1) программа должна содержать проверку исходных данных; 2) программа должна содержать диалог с пользователем; 3) программа должна выполняться произвольное количество раз по желанию пользователя; 4) программа должна быть комментированной. Ограничения: 1) размерность массива должна лежать от 2 до 1000 элементов; 2) элементами в массиве могут быть целые числа в диапазоне от -10000 до 10000. 4 3. Тестовый пример Исходный массив: N = 10 i 1 2 3 4 5 6 7 8 9 10 A[i] 2 -1 3 7 8 11 10 8 13 14 Шаг 1 i A[i] F=0 1 2 -1 2 -1 2 3 3 4 7 5 8 6 11 7 10 8 8 9 13 10 14 2 3 3 7 7 8 8 11 10 11 8 11 11 13 13 14 F=1 5 Шаг 2 i A[i] F=0 1 -1 -1 2 2 2 3 3 4 7 5 8 6 10 7 8 8 11 9 13 10 14 2 3 3 7 7 8 8 10 8 10 10 11 11 13 13 14 F=1 Шаг 3 F=0 i A[i] 1 -1 -1 2 2 2 3 3 4 7 5 8 6 8 7 10 8 11 9 13 10 14 2 3 3 7 7 8 8 8 8 10 10 11 11 13 13 14 F = 0 (сортировка закончена) 6 Отсортированный массив: i 1 2 3 4 5 6 7 8 9 10 A[i] -1 2 3 7 8 8 10 11 13 14 7 4. Описание идентификаторов A – имя обрабатываемого массива; A[i] – значение i–того элемента массива; N – количество элементов в массиве; i – индекс элемента массива; e – переменная-счётчик; Ch – переменная для хранения кода символа нажатой клавиши; Error – переменная для хранения кода ошибки операции ввода/вывода; F – флажок, который фиксирует операцию обмена; Z – рабочая область для временного хранения значения элемента массива в ходе операции обмена. 8 5. Блок-схема данного алгоритма начало начало 1 Объявление: A – имя обрабатываемого массива; A[i] – значение i–того элемента массива; N – количество элементов в массиве; i – индекс элемента массива; e – переменная счётчик; Ch – переменная для хранения кода символа нажатой клавиши; Error – переменная для хранения кода ошибки операции ввода/вывода; F – флажок, который фиксирует операцию обмена; Z – рабочая область для временного хранения значения элемента массива в ходе операции обмена 2 Вывод: «Заставки» 3 Вывод: «Введите количество элементов массива в интервале от 2 и до 100» 3 4 ввод N 7 5 2<=N<=1000? нет Вывод: «Неправильно задано множество элементов массива. Пожалуйста повторите ввод заново» да 10 6 9 9 5 6 очистка экрана 8 i=1, N 9 Вывод: «Введите А[i]» 10 ввод А[i] 11 13 нет -10000<=A[i]<=10000? Вывод: «Ошибка в значении элемента массива. Пожалуйста повторите ввод» да 11 12 10 10 11 12 очистка экрана 14 Вывод: «Исходный массив» 15 i=1, N 12 17 16 Вывод: « А[i]» 11 13 11 21 15 17 F: =0 18 i=1, N-1 19 нет 20 13 21 A[i]>A[i+1]? да Z: =A[i]; A[i]:=A[i+1]; A[i+1]:=Z; F:=1 12 12 18 21 нет F=0? 12 17 22 да Вывод: «Отсортированный массив» 23 i=1, N 25 24 Вывод A[i] 25 Вывод: «Отсортировать ещё один массив?» 26 Ввод: Y/y или N/n нет 27 Введено N/n? 9 2 да конец 13 6. Листинг программы program sortirovka; uses crt; {модуль для работы с программой в текстовом режиме} var А: array [1...100] of integer; {массив, переменные целого типа} {область для временного хранения значения элемента массива в ходе операции обмена} Z, {индекс элемента массива} i, {количество элементов в массиве} N, {переменная для хранения кода ошибки} Error, F: integer; Ch: char; {переменные целого типа} {переменная символ} {описание меток} label L1, L2; {начало программы} begin {очистка экрана} clrscr; {цвет символов} textattr:=yellow; gotoxy (20,6); {вывод текста в указанном месте экрана} writeln (‘ Вашему вниманию представляется программа, ’); {вывод информации на экран} gotoxy (20,7); writeln (‘ которая сортирует элементы задаваемого массива’); gotoxy (20,8); writeln (‘ в порядке возрастания методом «обмена»’); textattr: =red; gotoxy (35,10); writeln (‘ Внимание!’); gotoxy (20,12); textattr: = green; writeln (‘ 1) Размерность задаваемого массива должна быть ’); 14 gotoxy (20,13); writeln (‘ в диапазоне от 2 до 100 ’); gotoxy (40,14); writeln (‘ 2) Элементы - целые числа от -10000 до 10000’); gotoxy (40,17); textattr: = white; writeln (‘ Программу составила студентка’); gotoxy (40,19); writeln (‘ МГУПС (МИИТ), группы ППИ-111’); gotoxy (40,20); writeln (‘ ФИО’); gotoxy (40,21); writeln (‘ Москва, 2016’); gotoxy (40,23); writeln (‘ Нажмите любую клавишу для продолжения’); {считывание символа с клавиатуры} Ch:= readkey; {----------------------------ввод количества элементов массива---------------------------} L1: clrscr; {начало цикла с постусловием} repeat textattr:= yellow; gotoxy (5,5); write (‘ Введите количество элементов массива в диапазоне от 2 до 100 ’); {отключение проверки ошибок ввода данных} {$i-} readln [N]; {ввод с клавиатуры значения переменной} error: =ioresult; {возвращение результатов последней операции ввода/вывода} {$i+} {включение проверки ввода данных} if (N<2) or (N>100) or (Error<>0) then 15 begin textattr: =red; writeln (‘ Неверно задано количество элементов в массиве ’); end; until (N>=2) and (N>=100) and (Error=0) {конец цикла с постусловием} {------------------------------ввод значений элементов массива----------------------------} clrscr; writeln; writeln (‘ Введите значение элементов массива ’); gotoxy (35,5); textattr: =yellow; writeln (‘ Внимание! ’); gotoxy (15,16); writeln (‘ Значение элементов должно быть в диапазоне от -10000 до 10000 ’); textattr: =white; {отключение проверки ошибок ввода данных} {$i-} for i=1 to N do begin repeat writeln (‘ Введите А[‘,i,’]:’); readln (A[i]); error =ioresult; {включение проверки ввода данных} {$i+} textattr: =red; if (A[i]<=-10000) and (A[i]>=10000) and (error=0) then writeln (‘ Ошибка в значении элемента массива! Повторите ввод! ’); textattr:=white; 16 until (A[i]<=10000) and (A[i]>=-10000) and (error=0); end; {------------------------------ввод результатов сортировки--------------------------------} clrcsr; textattr:=yellow; gotoxy(23,4); writeln (‘ Р е з у л ь т а т ы с о р т и р о в к и ’ ); textattr:=white; gotoxy(21,8); writeln (‘ Исходный массив’ ); gotoxy(21,10); for i:=1 to N do write (А[i],’.’); repeat F:=0; for i:=1 to N-1 do begin if А[i]> А[i+1] then begin Z:= А[i]; А[i]:= А[i+1]; А[i+1]:=Z; F:=1 end; end; until (F=0); writeln (‘’); 17 gotoxy(20,16); textattr:=green; writeln (‘ Отсортированный массив: ’ ); gotoxy(20,18); for i:=1 to N do write (A[i],‘ ,’ ); gotoxy(20,24); textattr:=yellow; writeln (‘Желаете отсортировать ещё один массив? (Y-да, N-нет)’ ); L2: case readkey of {конструкция выбора, проверяющая вводимые данные и выполняющая определённое действие в зависимости от ввода данных} #89: goto L1; #121: goto L1; #78: exit; #110: exit; end; goto L2; end. {конец программы} 18 7. Результаты работы программы Начало работы: 19 20 8. Список используемой литературы 1) В.И.Ханин «Основы разработки программ» 2) В.Г.Ягофаров «Теория построения алгоритмов» 3) Г. Г. Рапаков, С. Ю. Ржеуцкая «Программирование на языке Pascal» 21