Написание программы на С#, реализующей сортировку методом Шелла

Страницы работы

Содержание работы

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

Файловый ввод/вывод

Цель:       написать программу на С# реализующую сортировку методом Шелла.

Задача:       изучение среды VS.NET

Исследование файлового ввода/вывода на примере языкаС#

Выдержки из кода программы на С#:

using System;

using System.IO;

class MyMainObject

{

public static void Main()

{         

char [] MyChar;

MyChar = new char [1000];

string MyString;

FileStream fs1 = new FileStream("in.txt", FileMode.Open, FileAccess.Read);

StreamReader r1 = new StreamReader(fs1);

MyString = r1.ReadToEnd();

long u;

u = r1.BaseStream.Seek(0, SeekOrigin.End);

r1.Close();

for (int i = 0; i <= (MyString.Length-1); i++) MyChar[i] = MyString[i];

MyMainObject Object1 = new MyMainObject();

Object1.shellSort(MyChar, 0, (u-1));

FileStream fs = new FileStream("out.txt", FileMode.OpenOrCreate, FileAccess.Write);

StreamWriter w = new StreamWriter(fs);

for (int i=0; i<=(u-1); i++) w.Write(MyChar[i]);

w.Flush();

w.Close();

}

Код функции сортировки шелла, аналогичен написанному на С++

Исследование программы встроенными средствами Visual Studio C++  6:

Код

приложения

на С#

Дизассемблированный

код программы (VS .NET )

Код MSIL

h = 1;

0000005c  mov       esi,1

00000061  xor       edi,edi

IL_0007:  ldc.i4.1

IL_0008:  conv.i8

IL_0009:  stloc.1

if (n < 14)

00000063  cmp      dword ptr [ebp-0Ch],0

00000067  jl       00000071

00000069  jg       0000007A

IL_000a:  ldloc.0

IL_000b:  ldc.i4.s   14

IL_000d:  conv.i8

IL_000e:  bge.s      IL_0015

Исследование

Для разрабатываемого приложения напишем make файл следующего содержания.

Class1.exe:

Csc.exe class1.cs

И сохраним под именем lab03.mak

Для компиляции создан .BAT файл, ассоциативно связанный в FARe с расширением *.mak. Если подвести на выше написанный mak файл и нажать Enter, то произойдет сборка исполняемого файла:

Microsoft (R) Program Maintenance Utility   Version 6.00.8168.0

Copyright (C) Microsoft Corp 1988-1998. All rights reserved.

csc.exe class1.cs

Microsoft (R) Visual C# .NET Compiler version 7.00.9466

for Microsoft (R) .NET Framework version 1.1.4322

Copyright (C) Microsoft Corporation 2001. All rights reserved.

Для работы скомпилированной программы, необходимо наличие в каталоге с запускаемым приложением два файла с именами in.txt и out.txt. В которых содержится соответственно несортированная последовательность символов и отсортированная последовательность методом шелла.

Вывод: в ходе лабораторной работе была написана программа сортировки методом Шелла на языке С# в программной среде Microsoft Visual Studio .NET. Программа была откомпилирована и собрана, как при помощи визуальных средств MVS .NET, так и при помощи консольного режима утилитами nmake, csc. Полученный исполняемый файл, дизассемблировался с помощью встроенных средств Microsoft Visual Studio .NET.

Приложение

Дизассемблированный код

void shellSort(char[] a, long lb, long ub)

{

long n, h, i, j;

char t;

/* compute largest increment */

n = ub - lb + 1; (стр. 36)

00000000  push        ebp 

00000001  mov         ebp,esp

00000003  sub         esp,30h

00000006  push        edi 

00000007  push        esi 

00000008  push        ebx 

00000009  mov         dword ptr [ebp-4],ecx

0000000c  mov         dword ptr [ebp-8],edx

0000000f  mov         dword ptr [ebp-10h],0

00000016  mov         dword ptr [ebp-0Ch],0

0000001d  xor         esi,esi

0000001f  xor         edi,edi

00000021  mov         dword ptr [ebp-20h],0

00000028  mov         dword ptr [ebp-1Ch],0

0000002f  mov         dword ptr [ebp-28h],0

00000036  mov         dword ptr [ebp-24h],0

0000003d  mov         dword ptr [ebp-2Ch],0

00000044  mov         eax,dword ptr [ebp+8]

00000047  mov         edx,dword ptr [ebp+0Ch]

0000004a  sub         eax,dword ptr [ebp+10h]

0000004d  sbb         edx,dword ptr [ebp+14h]

00000050  add         eax,1

00000053  adc         edx,0

00000056  mov         dword ptr [ebp-10h],eax

00000059  mov         dword ptr [ebp-0Ch],edx

h = 1; (38)

0000005c  mov         esi,1

00000061  xor         edi,edi

if (n < 14)(39)

00000063  cmp         dword ptr [ebp-0Ch],0

00000067  jl          00000071

00000069  jg          0000007A

if (n < 14) (40)

0000006b  cmp         dword ptr [ebp-10h],0Eh

0000006f  jae         0000007A

h = 1;

00000071  mov         esi,1

00000076  xor         edi,edi

00000078  jmp         000000D6

else if (/*sizeof(int) == 2 &&*/ n > 29524)

0000007a  cmp         dword ptr [ebp-0Ch],0

0000007e  jg          0000008B

00000080  jl          00000094

00000082  cmp         dword ptr [ebp-10h],7354h

00000089  jbe         00000094

h = 3280;

0000008b  mov         esi,0CD0h

00000090  xor         edi,edi

00000092  jmp         000000D6

00000094  nop             

00000095  jmp         000000AC

while (h < n) h = 3*h + 1;

00000097  push        0   

00000099  push        3   

0000009b  push        edi 

0000009c  push        esi 

Похожие материалы

Информация о работе

Тип:
Отчеты по лабораторным работам
Размер файла:
75 Kb
Скачали:
0