Сортировка строк в текстовом файле

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    11,34 Кб
  • Опубликовано:
    2013-05-17
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Сортировка строк в текстовом файле

Московский Энергетический Институт

Институт автоматики и вычислительной техники

Кафедра ВМСС






Курсовая работа

по дисциплине «Системное программное обеспечение»

Сортировка строк в текстовом файле


Студент: Филюк Андрей

Группа: А-8-07

Проверил: Гольцов А.Г.








Москва 2010

Оглавление

сортировка строка файл программа

Введение

. Анализ задания

. Проектирование пользовательского интерфейса

. Выбор формата представления данных

. Список процедур и их назначение

. Используемые в программе функции

. Тестирование и отладка программы

Заключение

Список литературы

Приложение. Листинг программы

Введение

Данная программа служит для сортировки строк в текстовом файле.

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

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

Различные операционные системы придерживаются своего представления перевода строки и конца файла. В UNIX перевод строки состоит из одного символа LF (0x0A), в Mac OS - из символа CR (0x0D), а в DOS и Microsoft Windows перевод строки кодируется последовательностью двух символов CR LF. В DOS и Microsoft Windows конец файла кодируется символом 0x1A, а в UNIX символ конца файла не употребляется.

Под сортировкой строк понимается посимвольное сравнение строк с помощью таблицы ASCII.

Программа может быть очень полезна, например когда необходимо отсортировать файлы с большим количеством строк, для быстрого наглядного поиска нужного элемента в файле. Легко найдет применение везде, где так или иначе нужна сортировка.

1. Анализ задания

Разобьем нашу задачу на подзадачи:

Ввести пути к файлам, с которыми будем работать: путь к файлу, который необходимо отсортировать (в программе обозначен как Input file) и путь к файлу, в который сохраним результат (в программе - Output file).

Ввод будет осуществляться прямо из программы. Для этого нам понадобятся функции 07h* и 02h* - ввод с клавиатуры без ЭХО и вывод символа на экран соответственно. Именно эти функции нам позволят обработать введенный символ, прежде чем он отобразится на экране. Это нам позволит корректно использовать клавишу BackSpace. Функцию 01h* (ввод символа с клавиатуры с ЭХО) использовать нежелательно, так как некоторые символы нам ненужно отображать и тем более записывать в строку (например, Enter).

Ввести тип сортировки (в программе Input key [D/A]).

Для выбора типа сортировки: по возрастанию необходимо вести A, по убыванию - D. При воде необходимо учитывать верхний регистр вводимого символа. Дается две попытки на правильный ввод, потом программа осуществляет выход.

Подготовка файлов для работы.

Нам необходимо открыть один и создать второй файл, для этого мы будем использовать функции 3dh* и 3ch*, так как это единственные функции для работы с файлами, то выбор очевиден.

Сортировка.

Для этого необходимо, во-первых, считать блок данных из файла (с помощью функции 3fh*). Сортировать сами строки в памяти слишком нерационально, поэтому для сортировки нам понадобится массив с адресами начала строк. Потом необходимо отсортировать адреса строк соответствии с выбранным типом сортировки. Создать массив, в котором будут храниться данные о количество символов в уже отсортированных строках. Потом записать полученный результат в файл (с помощью функции 40h*).

*Функции относятся к прерыванию 21h.

2. Проектирование пользовательского интерфейса

Интерфейс программы очень прост и удобен, пользователю достаточно запустить ЕХЕ файл и он увидит приглашение на ввод информации. Это будут последовательно 3 приглашения: на ввод пути к файлу, который надо закодировать (Input file), на ввод пути к файлу в который сохранится результат работы (Output file) и приглашение на ввод типа сортировки (Input key [D/A]).

После завершения на экране появится сообщение «Done», информирующее о том, что программа успешно завершила свою работу.

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

. Выбор формата представления данных

Для определения переменных в программе используются метки db и dw (byte и word), а так же для некоторых переменных используется директива EQU для более гибкого написания кода.

В таблице 1 перечислены все переменные, использующиеся в программе.

Таблица 1

Список переменных

ИмяМеткаПримечаниеmsg0dbСообщение. Информация о курсовом проекте.msg1dbСообщение. Приглашение на ввод файла (Input file).msg2dbСообщение. Приглашение на ввод файла (Output file).msg3dbСообщение. Сообщение. Информация о том, что надо ввести для сортировки по возрастанию или убываниюmsg4dbmsg5dbСообщение. Появляется перед завершением работы программы, для того что бы сообщить пользователю, что необходимо нажать любую клавишу, что бы программ завершилась (Press any key)msg6dbСообщение. «Готово» сообщает о том, что процесс кодирования завершен (Done)msg7dbСообщение. Информация о неправильном вводе символа выбора типа сортировки.msg8dbСообщение. Количество попыток превышено, выход err_0dbСообщение об ошибке. Открытие файла.err_1dbСообщение об ошибке. Создание файла.err_2dbСообщение об ошибке. Чтение из файла.err_3dbСообщение об ошибке. Записи в файл.err_4dbСообщение об ошибке. Закрытие файла.err_5dbСообщение об ошибке. Файл имеет только нулевую строку.num1EQUОграничение на длину, вводимой строкиfile1dbПуть к файлу для сортировкиfile2dbКуда сохранить отсортированный файлflagdbФлаг, отвечающий за тип сортировки.num2EQUОграничение на длину данныхhandle1dwЗаголовок файла, который надо отсортироватьhandle2dwЗаголовок файла,в который записываем отсортированные строкlen_filedwКол-во символов в файлеnum_strdwКол-во строк в файлеDdwЗарезервируем блок для хранения данныхmasdwЗарезервируем блок для массива адресов начала строкmas_numdwЗарезервируем блок для массива кол-ва символов в строках

4. Список процедур, макросов и их назначение

В таблице 2 указан список процедур, макросов и их назначение.

Таблица 2

Список процедур, макросов и их назначение

ИмяНазначениеprintМакрос вывода строки на экран. В качестве параметра - имя выводимой структуры, это должна быть строка, оканчивающаяся символом $.input_lineПроцедура, осуществляющая ввод пути к файлу. Перед вызовом в регистре di, должен храниться адрес структуры, куда будет записан путь.delete_charПроцедура, стирающая с экрана последний введенный символ, вызывается внутри процедуры INPUT_LINE при нажатии клавиши BackSpace.reception_typeПроцедура получения типа сортировки.clearПроцедура очистки экрана. open_fileПроцедура открытия файла. Путь к файлу в file1, номер открытого файла сохранится в handle1. read_fileПроцедура чтения. Считывание происходит из файла file1, данные в структуру D.make_masПроцедура создания массива адресов строк.sortПроцедура сортировки.make_mas_numПроцедура создания массива длин отсортированных строкcreate_fileПроцедура создания файла. Путь к файлу в file2, номер созданного файла сохранится в handle2.write_fileПроцедура записи. Запись происходит в файл file2. На входе в регистре cx должно храниться количество байт для записи из структуры D.close_fileПроцедура закрытия файла. File1 закроется если он был открыт, а File2 закроется если он был создан.exitЗавершение программы. Внутри вызывается процедура CLOSE_FILE, выводится сообщение «Press any key..» и ожидается ввод с клавиатуры символа, после этого программа завершает свою работу.

5. Используемы в программе функции

Функция 02h прерывания 21h. Вывод символа на экран.

Вход: ---

Выход: DL = символ, который необходимо вывести.

(используется для отображения вводимой строки в процедуре input_line).

Функция 07h прерывания 21h. Ввод с клавиатуры без ЭХО.

Вход: ---

Выход: AL = считанный символ.

(используется для считывания кода символа в процедуре input_line).

Функция 0Ah прерывания 21h. Буферизованный ввод с клавиатуры.

Вход: адрес входного буфера (смотри ниже)

Выход: ---

Первый байт буфера должен содержать максимальную длину на входе; второй байт содержит фактическую длину предыдущей линии, которая может будьте отозваны с командами редактирования линии DOC по возвращению второй байт содержит фактическую длину, третий и последующие байты содержат входную линию

(используется для считывания кода символа в процедуре reception_type).

Функция 0003h прерывания 10h.Установка видео режима.

Выход: ---

(используется для считывания кода символа в процедуре clear).

Функция 09h прерывания 21h. Вывод строки.

Вход: DS:DX = адрес строки, заканчивающейся $.

Выход: ---

(используется в программе для вывода информации о проекте, приглашения на ввод строки, а так же для вывода сообщений об ошибках).

Функция 3dh прерывания 21h. Открыть файл.

Вход:AL = код доступа (0 - чтение, 1 - запись, 2 - чтение запись).:DX = адрес на строку в формате ASCIZ.

Выход:CF = 1 - есть ошибка, AX = код ошибки.= 0 - нет ошибки, AX = номер файла.

Функция 3сh прерывания 21h. Создать файл.

Вход:СХ = атрибут.:DX = адрес на строку в формате ASCIZ.

Выход:CF = 1 - есть ошибка, AX = код ошибки.= 0 - нет ошибки, AX = номер файла.

Функция 3eh прерывания 21h. Закрыть файл.

Вход:BX = номер файла.

Выход:CF = 1 - есть ошибка, AX = код ошибки.

Функция 3fh прерывания 21h. Чтение из файла.

Вход:BX = номер файла.= количество байт, которые необходимо считать.:DX = адрес буфера.

Выход:CF = 1 - есть ошибка, AX = код ошибки.= 0 - нет ошибки, AX = количество считанных байт.

Функция 40h прерывания 21h. Запись в файла.

Вход:BX = номер файла.= количество байт, которые необходимо записать.:DX = адрес буфера.

Выход:CF = 1 - есть ошибка, AX = код ошибки.= 0 - нет ошибки, AX = количество записанных байт.

Функция 4ch прерывания 21h. Завершение программы.

Вход:AL = код завершения.

Выход: ---

6. Тестирование и отладка

Тестирование на ошибочный ввод параметров.

Ввод несуществующего файла в качестве Input file.

Ввод некорректного пути к создаваемому фалу Output file.

Тестирование правильной работы.

Для тестирования правильной работы программы был выбран текстовый документ 1.txt с различными строками, сортировка была произведена в файл 2.txt сначала по возрастанию, потом по убыванию.

Результат тестирования на ошибочный ввод параметров.

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

Результат тестирования правильной работы.

После сортировки файла 1.txt в 2.txt строки были отсортированы в зависимости от выбранного типа сортировки.

Заключение

Программа работоспособна и соответствует предъявленным требованиям. Проделано тестирование программы и соответствующая отладка по устранению ошибок.


Список литературы

1. П. Абель Язык ассемблера для IBM PC и программирования - М.: ЭНТРОП, 2007. -447с.

. Файл руководства по системным функциям - interrup.lst

Приложение А

«Листинг программы»

;Курсовой проект

;Выполнил:Филюк Андрей

;Группа:А-8-07

;Тема:Сортировка строк в текстовом файле

;макрос вывода строки, заканчивающейся $str;в str - адрес выводимой структурыah, 09h;выбор функции вывода строки, заканчивающейся $dx, str;сохраняем адрес в dx

int 21h;выводим строку

.model small

.stack 100h

.datadb 13,10,'Filuk Andrew A-8-07 ',' File sorting ',13,10,'$'db13,10,'Input file: $'db13,10,'Output file: $'db 13,10,'For descending sort need enter key D',13,10,'For ascending sort need enter key A',13,10,'$'db 13,10,'Input key [D/A]:? $'db13,10, 'Press any key.. $'db13,10, 'Done$'db13,10, 'Incorrect input, please try again $'db13,10, 'Sorry, try next time $'

;сообщения об ошибках_0db13,10, ' Error 0: Can not open file $'_1db13,10, ' Error 1: Can not create file $'_2db13,10, ' Error 2: Can not read file $'_3db13,10, ' Error 3: Can not write file $'_4db13,10, ' Error 4: Can not close file $'_5db13,10, ' Error 5: File have only null string $'

num1 EQU 80hdbnum1 DUP(0);путь к файлу, который надо отсортироватьdbnum1 DUP(0);куда сохранить отсортированный файл

flag db 2;флагEQU 1000h

handle1 dw 0;заголовок файла, который надо отсортироватьdw 0;заголовок файла,в который записываем отсортированные строки_file dw 0;кол-во символов в файле_str dw 0;кол-во строк в файлеdb num2 DUP('D') ;данныеdw 100h DUP('#');массив адресов начала строк_num dw 100h DUP('*');массив кол-ва символов в строках

.code:ax, @data;сохраним адрес на сегмент данных в AXds, ax;инициализация сегмента данныхes, ax;инициализация сегмента дополнительных данныхclear;процедура очистки экранаmsg0;вывод сообщенияо о проекте

msg1 ;вывод сообщения на ввод пути вх. файлаdi, file1;сохраним адрес на структуру file1 в diinput_line;вызываем процедуру ввода строкиmsg2;вывод сообщения на вывод пути вых. файлаdi, file2;сохраним адрес на структуру file2 в diinput_line;вызываем процедуру ввода строкиreception_type;процедура определения типа сортировки(по озрастанию или убыванию)open_file;открытие файла, который надо отсортироватьread_file;чтение файлаmake_mas;создание массива начала адресов строкsort;сортировкаmake_mas_num;создание массива кол-ва символов в уже отсортированном массиве адресов строкcreate_file;создание файла для вывода

call write_file;запись в файл

print msg6;вывод сообщенияexit;выход с закрытием файлов

;------------------Получение типа сортировки------------------------_type proc ax;ах в стекmsg3;вывод сообщенияcx,2;кол-во попыток неправильного ввода:msg4;вывод сообщенияdx, flag ;dx указывает на первый байт буфераah,0ah;буферизованный ввод с клавиатуры21hah,02h ;ывод символа на экранdl,0dh;символ возврата коретки (для буфера)

int 21hflag+2, 65;введена клавиша A?

jne k1;нет, переход по метке сравнения с клавишей Dflag,0 ;иначе устанавливаем флаг в 0k3 ;на выход

: cmp flag+2, 68 ;введена ли клавиша D?k2;нет, переход по метке k2flag,1;иначе устанавливаем флаг в 1k3 ;переход по метке: msg7;вывод сообщенияk0 msg8;вывод сообщенияexit2 ;Не введено ни A, ни D, - выход:ax;возврат значения из стека

ret

;------------------------------ Очистка экрана ------------------------------proc

mov ah,00h; Установка видеорежима дисплеяal,03h; Номер видеорежима10h

ret endp

;--------------------------------Ввод строки----------------------------------

input_line proccx, 0;в CX будет храниться количество введенных символов:ah, 07h;выбор функции ввод с клавиатуры без ЭХО21h;ждемal, 08h;проверяем на BackSpacem2;если да - переходим на m2cx, 0;если нет - проверяем есть ли что удалять m0;если строка пуста - возвращаемся на начало и ждем вводаdelete_char;если строка не пуста - стираем с экрана последний введенный символdi;уменьшаем адрес, где сохранен путь на 1cx;уменьшаем количество введенных символов на 1m0;возвращаемся на начало и ждем ввода:ah, 02h;выбор функции вывода символа на экранdl, al;считанный ранее символ хранится в al - записываем его в dl21h;выводим его[di], al;сохраняем по адресу didi;переходим на следующую ячейкуcx;увеличиваем количество введенных символов на 1cl, num1;огранисчение на 80 символовm1;если ввели 80 символом, то считаем что строка введенаal, 0dh;проверяем не нажат ли Enterm0di;возвращаемся в предыдущую ячейку:al, 00h;что бы записать символ конца строки - 0[di], al;записываем

;---------Стереть символ с экрана---------------_charproc

;при работе испортится регистр axax;сохраним его в стекah, 02h;функция вывода символа на экранdl, 08h;символ - Backspace21h;выводим, тем самым переместим курсор влево на 1dl, 20h;символ - space21h;выводим, тем самым сотрем с экрана символ на котором находится курсор

endp

;-----------------Открытие файла-----------------------

open_fileprocnearah, 3dh;функция открытия файлаal, 00; 00 - для чтенияdx, file1;путь к файлу в file121h ;открываемm3;если не было ошибки - то на метку m3err_0;если была ошибка - выводим соотв. сообщениеexit2;завершаем работу:handle1, ax;сохраняем номер файла в handle1

;-----------------Чтение из файла----------------------_fileprocah, 3fh;функция чтения из файлаbx, handle1;номер файла - откуда считатьcx, num2;количество байт, которые надо считатьdx, D;буфер для данных

int 21h;считываемlen_file, ax

jnc m4;если не было ошибки - то на метку m4err_2;если была ошибка - выводим соотв. сообщениеexit;завершаем работу:

;-----------------Создание массива адресов строк-------_mas procax;сохраним его в стекax, len_file;в ах кол-о символов в файлеax,ax;сравнение на нулевой файлm51;нет -> идем по метке создания массиваerr_5;если была ошибка - выводим соотв. сообщениеexit;на выход:bx,bx;обнуляем bxdx,dx;обнуляем dxdi,D;в di адрес начала первой строкиmas[bx],di;заносим её адрес в массивal,0Ah ;поиск ведем по символу конца строки cx,len_file;загрузим кол-во символов в файле;сканирование осуществляем вперед:repne scasb;сканирование в поиcке заданного символа, пока счетчик не обнулиться, остановиться когда найдет символ 0, записанный в albx,2;организация перехода на след. элемент массиваmas[bx],di;заносим адрес начала след. строки в массива

inc dx;+1cx;+1m5

mov num_str, dx;в переменную num_str сохраняем кол-во строкbyte ptr [di],0Dh;добавляем концевой символbyte ptr [di+1],0Ah;добавляем концевой символax;восстановим регистр ax

;-----------------Сортировка строк--------------------procax;заносим ах стек

sort1: si,si;обнуляем si

mov bh, 0;используем bh как флаг, если строки перемещались, то флаг установился в 1cx,num_str;в сх кол-во строк для организации циклаcx;-1cx,0;если в файле одна строка, то сортировка не нужнаsort2;если нет -> сортируемend_sort;иначе выход:ax,ax;обнуляем ахcx;сх стекax,mas[si];адрес начала строки в axdx,mas[si+2];адрес начала след. строки в dxsi;si в стекsi,ax;в si адрес начала строкиdi,dx;в di адрес начала след. строки

dec si;-1di;-1_string:

mov cl,byte[si];в cl заносим символ строкиch,byte[di];в ch заносим символ след. строкиflag,0;определяем тип сравнения. по возрастанию?increase;да -> переход на алгоритм сортировки по возрастанию, иначе по убываниюch,0Dh;сравниваем символ строки с адресом конца строкиnext_string;если равен -> перех к сравнению след. строкcl,0Dh;сравниваем символ след строки с адресом конца строкиchange;если да -> меняемcl,ch;производим сравнение символов находящихся не в концах строк next_simbol;равны следовательно переход по метке к сравнению след символа в строкахcl,ch;сравниваем какой из них "больше"

ja next_string;переход если сl > сh

jmp change;иначе меняем строки : cl,0Dh;сравниваем символ след строки с адресом конца строкиnext_string;если равен -> перех к сравнению след. строкch,0Dh;сравниваем символ строки с адресом конца строкиchange;если да -> меняемcl,ch;производим сравнение символов находящихся не в концах строк next_simbol;равны следовательно переход по метке к сравнению след символа в строкахcl,ch;сравниваем какой из них "больше"

jb next_string;переход если сl < сh

jmp change;иначе меняем строки :ax,dx;меняем адреса строкbh,1;устанавливаем флагnext_string;переход к след. строке_simbol:si;переход к след символу строкиdi;переход к след символу строкиcompare_string;на метку сравнения строк_string:si;возращаем из стека simas[si],ax;заносим адреса отсортированных строк в массив mas[si+2],dx;заносим адреса отсортированных строк в массив cx;возращаем из стека схsi,2;организация перехода к след. строкеsort2bh,0;сравниваем флаг на перемещение строк.end_sort;если не было перемещений -> выходsort1;иначе продолжаем сравнивать_sort:ax;возращаем из стека ах

;-----Создание массива длин отсортированных строк-------

make_mas_num proc ax;заносим ах в стекsi,si;обнуляем sicx, num_str;в сх заносим кол-во строк для организации цикла:cx;заносим сх в стекdi,mas[si];адрес начала строки в axdi;заносим адрес начала в стекal,0Ah ;в al заносим символ который ищем cx,len_file;загрузим максимальный объем;сканирование осуществляем впередscasb;сканирование в поиcке заданного символа, пока счетчик не обнулиться, останоиться когда найдет символ 0, записанный в alax;возвращаем из стекаdi,ax ;вычитаем из di адрес начала строки для получения длины строкиmas_num[si],di;заносим длину строки в массивsi,2;организация перехода к след элементуcx;возращаем изз стека схm6ax;возвращаем из стека ах

ret

;------------------Cоздание файла----------------------_file proc

mov ah, 3ch;функция создания файлаcx, 00h;файл - обычныйdx, file2;file2 - путь к файлу21h;создаемm7;если не было ошибки - то на метку m7err_1;если была ошибка - выводим соотв. сообщениеexit;завершаем работу:handle2, ax;сохраняем номер файла в handle2

;------------------Запись в файл-----------------------

;при входе в процедуру в cx - количество байт для записи

write_file procsi,si;обнуляем si

mov cx, num_str;в сх заносим кол-во строк для организации цикла:cx;заносим сх в стекah,40h;функция записи в файлbx, handle2 ;номер открытого файлаcx,mas_num[si] ;количество символов которые надо dx,mas[si]21h ;записываемm9;если не было ошибки - то на метку m9err_3;если была ошибка - выводим соотв. сообщениеexit;завершаем работу:si,2;переход к след. элементуcx;возвращаем из стека схm8;пока сх не равен нулю возврат по метке m8

ret

;------------------Закрытие файлов-----------------------_file proc

cmp handle1, 0;проверяем был ли открыт файлm10;если нет - закрывать нечего, переходим на m10ah, 3eh;функция закрытия файлаbx, handle1;номер файла21h;закрываемm10;если не было ошибки - то на метку m10err_4;если была ошика - выводим соотв. сообщениеexit;завершаем работу:handle2, 0;проверяем был ли создан файлm11;если нет - закрывать нечего, переходим на m11ah, 3eh;функция закрытия файлаbx, handle2;номер файла21h;закрываемm11;если не было ошибки - то на метку m11err_4;если была ошибка - выводим соотв. сообщениеexit;завершаем работу:

;------------------Выход------------------------------proc

close_file;вызров процедуры закрытия файлов

exit2:msg5;вывод сообщения "Press any key.."

mov ah, 07h;функция ввода с клавиатуры бех ЭХО21h;ждем нажатия клавишиax, 4c00h;выход из программы с кодом возврата 0

int 21h;выходимStart

Похожие работы на - Сортировка строк в текстовом файле

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!