Лабораторная работа №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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.