Автор: Пользователь скрыл имя, 22 Февраля 2012 в 13:13, курсовая работа
Целью курсового проекта является рассмотрение различных алгоритмов сортировки массива. В качестве практической проблемы, требующей решения, рассматривается известная задача сортировки (упорядочивания) массива в порядке возрастания (убывания) его элементов. При решении этой задачи требуется исходный массив, содержащий произвольные целые числа, преобразовать к виду, когда каждый элемент массива находится перед другим элементом этого массива, если его значение меньше (больше), чем значение сравниваемого элемента.
ВВЕДЕНИЕ…………...........................................................................................4
1. Исследовательский раздел
1.1. Массивы………………………………………………………………..5
1.2. Описание методов сотрировки массивов и их алгоритмы….......5
2. Технологический раздел
2.1. Постановка задачи и предлагаемый алгоритм решения……….12
2.2. Описание команд языка программирования Ассемблер...……..13
2.3. Описание команд языка программирования С++……………….13
2.4 Коментированный ход решения в С++…………………………....15
2.5 Коментированный ход решения в Ассемблере…………………..18
Заключение………………………………………………………………...22СПИСОК ЛИТЕРАТУРЫ…………………………………………………….23
сдвиг элементов массива от i-го до j-1-го вправо, чтобы освободить найденную позицию вставки;
вставка взятого элемента в найденную i-ю позицию.
2.2 Описание команд языка программирования Ассемблер
Команда | Описание |
Equ | Определение константы |
Mov | Копирование значения |
Xor | Логическая операция «исключающее ИЛИ» |
Lea | Сохранение адреса второго операнда, в первый |
Int | Вызов прерывания |
Add | Сложение операндов |
Jmp | Безусловный переход |
Shl | Умножение на степень двойки |
Cmp | Сравнение операндов |
Jle | Условный переход, если первый операнд =< второго операнда |
Jg | Условный переход, если первый операнд > второго операнда |
Inc | Инкремент, увеличение значения на единицу |
Jl | Условный переход, если первый операнд < второго операнда |
Loop | Организация цикла |
End | Конец программы |
2.3 Описание команд языка программирования С++
Команда | Описание |
Include | Подключение библиотек |
Int | Указание целочисленного типа данных |
char | Указание символьного типа данных |
For | Цикл со счетчиком |
Return | Возвращение чего-либо |
printf | Вывод информации на экран |
scanf | Ввод информации с клавиатуры |
If | Условие |
Getch | Ожидание нажатия кнопки на клавиатуре |
Endl | Конец строки |
3.2.1.Комментированный исходный код решения в С++
#include <stdio.h> //заголовочный файл стандартной библиотеки языка Си, содержащий определения макросов, константы и объявления функций и типов, используемых для различных операций стандартного ввода и вывода.
#include <conio.h> //консольный ввод-вывод
int vibor (int in[], int n); //
void main ()
{
int m=0; //объявление целочисленной переменной m значения 0
int s; // объявление целочисленной переменной s
int vvh [100]; //объявление количества целочисленных переменных
//Ввод массива
char f [80]; //объявление количества символьных переменных
printf("\n vvedite chislo elementov v massive: ", f);
scanf ("%d", &m); //Узнаем размер массива
printf("\n vvedite cherez probel celie chisla: ", f);
for (int j=0; j<m; j++)
scanf ("%d", &vvh[j]); //Заполнение массива
printf ("\n");
s = vibor (vvh, m); //Сортировка методом включения
getch(); //экран не закрывается пока не нажата любая клавиша
}
int vibor (int in[], int n)
{
int sravnen=0; //Характеристика трудоемкости (число стравнений)
//Вывод сообщений
char f [80];
printf("\n sortirovka metodom priamogo vklucheniya: \n", f);
//Начало сортировки
int i;
for (i=0; i<n-1; i++) //n-1 раз ищем наименьший элемент
{
int imin=i; //принимаем за наименьший первый из рассматриваемых элементов
//Поиск минимального элемента
for (int j= i + 1; j<n; j++)
{
if (in[j]<in[imin]) imin = j;
sravnen++;
}
int a = in[i]; in[i]=in[imin]; in[imin]=a; //Обмен элементов
}
//Вывод результатов работы программы
for (i=0; i<n; i++)
printf ("%d ", in[i]);
printf ("\n");
return sravnen; //Возвращаем число сравнений
}
}
2.2.1 Комментированный исходный код решения в Ассемблере
assume CS: code, DS: data
data segment ;сегмент данных
mas dw 9 ,2 ,4 ,0 ,1 ,9 ,3 ,6 ,5 ,8 ;заданные числа массива
mes1 db 'Исходный массив: $',10,13,
mes2 db 10,13,'Отсортированный массив: $'
n equ 9
i dw 0
j dw 0
temp dw 0
pkey db 10,13,'Нажмите "ОК" в окне... $'
stk segment stack
dw 128 dup (0) ;резервируется память объемом 128 слов
stk ends
code segment
begin: ;начало программы
mov AX, data ;заносится значение переменной data в ;AX
mov DS, AX ;заносится значение переменной AX в
;DS
mov AH, 09h ;заносится значение 09h в переменную
;AH
mov DX, offset mes1 ;заполнение исходного массива
int 21h
mov cx,10 ;заносится значение 10 в переменную СХ
mov si,0 ;заносится значение 0 в переменную SI
show_primary: ;цикл заполнения исходного массива
mov dx,mas[si];заносится значение переменной ;mas[si] в переменную
add dl,30h
mov ah,02h ;
int 21h ;вывод значения на экран
add si,2
loop show_primary ;цикл будет повторяться до тех пор пока не заполниться массив
internal: ;внутренний цикл
mov j,9
jmp cycl_j ;переход к cycl_j
exchange: цикл обмена
mov bx,i ;поместить в bx значение i
shl bx,1 ;сдвиг значения bx на 1 влево
mov ax,mas[bx] ;поместить в ax
;значение;mas[bx]
mov bx,j ;поместить j в bx
shl bx,1 ;сдвиг значения bx на 1 влево
cmp ax,mas[bx] ;сравнение элемента mas[bx] с ax
jle lesser ;переход к lesser
mov bx,i ;поместить i в bx
shl bx,1 ;умножение bx на 2
mov temp,ax ;поместить ax в temp
mov bx,j ;поместить j в bx
shl bx,1
mov ax,mas[bx]
mov bx,i
shl bx,1
mov mas[bx],ax
mov bx,j
shl bx,1
mov ax,temp
mov mas[bx],ax
lesser:
dec j ;уменьшить j на 1
cycl_j:
mov ax,j
cmp ax,i
jg exchange
inc i ;
cmp i,n ;
jl internal
mov AH, 09h ;
mov DX, offset mes2 ;
int 21h ;
mov cx,10 ;
mov si,0 ;
show:
mov dx,mas[si] ;
add dl,30h ;
mov ah,02h ;
int 21h ;
add si,2 ;
loop show ;
mov AH, 08h ;
lea dx, pkey ;
mov ah, 9 ;
int 21h ; output string at ds:dx
; ожидание нажатия клавиши....
mov ah, 1
mov AH, 4Ch
mov AL, 00h
int 21h
mov ax, 4c00h ;выход в операционную систему
int 21h ;
code ends ;
Заключение
В процессе выполнения курсового проекта были изучены алгоритмы сортировки массивов. Была составлена программа на языках программирования С++ и Ассемблер, реализующая сортировку массива методом прямого включения.
Из данного курсового проекта можно сделать вывод, что языки программирования Ассемблер и С++ до сих пор востребованы и неотъемлемо связаны с компьютером. И поэтому самой быстрой программой на данном оборудовании всегда будет программа, написанная на ассемблере. Данная программа позволяет переводить текст с языка, понятного человеку, в язык, понятный процессору.
Рис. 5 Пример работы программы
Рис. 6 Результаты выполения программы
СПИСОК ЛИТЕРАТУРЫ
1. Р. Марек - Ассемблер на примерах. Базовый курс. НиТ, 2005. – 233 с
2. Архангельский А.Я. Программирование в C++ Builder 6. БИНОМ, 2003. – 1152 с.
3. Р.Лафоре - Объектно-ориентированное программирование в С++. Питер, 2004. – 922 с
4. Пирогов В.Ю. ASSEMBLER Учебный курс. Нолидж, 2001. - 846 с
5. Дональд Э. К. Искусство программирования, том 3 Сортировка. Вильямс, 2007. – 824 с
Информация о работе Сортировка массива методом прямого включения