Системне програмне забезпечення С

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

 з дисципліни

 “Системне  програмне забезпечення”

Тема:

Розробка обєктно-орієнтованих  програм  мовою C++ в  середовищі Windows 95/98

(на основі бібліотеки MFC пакету VISUAL C++ 6.0)













 


Технічне завдання.



Головна програма повинна реалізовувати діалоговий інтерфейс користувача на основі класів бібліотеки MFC.

Програма на  Assembler повинна отримувати початкові дані від головної програми, виконувати задану операцію над матрицею і отриманий результат передавати в основну програму.

Інтерфейс в головній програмі повинен бути реалізований за допомогою меню і діалогових вікон, які повинні бути визначені в файлі ресурсів.

Результати виконання арифметичних операцій повинні бути представлені в аналітичному і графічному вигляді.

Повинні бути реалізовані додаткові функції інтерфейсу користувача.

Реалізувати паралельне виконання головної програми і програми на Assembler за варіантом.


Програма на Assembler :

	Скласти програму на мові Assembler для знаходження максимального елемента побічної діагоналі, заданих в форматі байта, слова чи подвійного слова.



Головне меню :

File

Info

Help

Result

Quit

Open









Input



Save As





Run



Delete





Result

























Діалогове вікно


Зміст



Вступ…………………………………………..................................... 



1. Загальна структура курсової роботи.......………………………...



2. Основні класи та функції.................................. ………………….



3. Cтворення меню……………………………………………………



4. Створення діалогових вікон.........…………………………………



5. Робота з графікою..................……………………………………..



6. Виконання обробки матриці на Асемблері.............................…...



7. Робота з файлами в Visual C++6.0…………………………………



Висновки...............................………………………………………….



Література.............................………………………………………….



Додатки................................…………………………………………..






Анотація.

Курсова робота  присвячена розробці обєктно-орієнтованої програми мовою C++ в  середовищі Windows 95/98 на основі бібліотеки MFC пакету VISUAL C++ 6.0. Інтерфейс в головній програмі реалізований за допомогою меню і діалогових вікон на основі класів бібліотеки MFC. Також виконана зручна робота з файлами: відкриття, збереження, видалення. Створення власних діалогових вікон. При створенні меню задається бажана кількість кнопок їх вигляд та розміщення.

Реалізоване паралельне виконання головної програми і програми на Assembler.

Результати виконання арифметичних операцій представлені в аналітичному і графічному вигляді.


ВСТУП

Visual С++ 6.0 представляє собою потужний та складний інструмент для створення 32-розрядних приложень Windows 95 та Windows NT. Ці приложення набагато переважають як за об’ємом так і по складності своїх попередників для 16-розрядних Windows та ще набагато древніших програм, які звгалі обходяться без графічного інтерфейса. Але не дивлячись на те, що об’єм та складніст програм збільшуються, для їх створення програмісту потрібно не більше, а набагато менше зусиль, по крайній мірі для тих, хто правильно вибираєнеобхідні інструментальні засоби. 

Саме таким інструментом є Visual С++ 6.0. Visual С++ 6.0   це універсальний пакет програмування, який дозволяє створювати модулі з графічним інтерфейсом під операційну систему Windows 95(98). Окрім можливостей, які дає C, С++ надає гнучкі та ефективні засоби визначення нових типів. Використовуючи визначення нових типів, що точно відповідають концепціям прикладних програм, програміст може розділяти розроблювану програму на частини, що легко піддаються контролю. Такий метод побудови програм часто називають абстракцією даних. Інформація про типи міститься у деяких об’єктах типів, визначених користувачем. Такі об’єкти прості та надійні у використанні у тих ситуаціях, коли їх тип не можна встановити на стадії компіляції. Програмування з застосуванням таких об’єктів часто називають об’єктно-орієнтованим. При правильному використанні цей метод дає коротші, простіші в налагодженні та використанні модулі  та програми.

Відмінною особливістю мови С++ є поняття класу, яке ще більш широко і яскраво реалізоване в Visual С++ 6.0. Клас – це новий тип змінної, що визначається користувачем. Класи забезпечують приховування даних, гарантовану ініціалізацію даних, неявне перетворення типів, динамічне завдання типу, управління, що контролюється користувачем, механізми перевантаження операцій. В Visual С++ 6.0 збережені можливості мови C по роботі з основними об’єктами апаратного забезпечення (біти, байти, слова, адреси і т.п.). 

Visual С++ 6.0 та його бібліотеки, як стандартні, так і MFC спроектовані так, щоб забезпечувати мобільність. Бібліотека MFC дає змогу швидко та ефективно реалізувати графічний інтерфейс та обробляти потрібні функції та повідомлення. 


1. Загальна структура програми

Курсова робота складається з декількох окремих блоків (файлів):

proba.cpp – основна програма, написана мовою С++ на базі пакету Visual C++6.0, в якій створено графічний інтерфейс з використанням меню, діалогових вікон, повідомлень, графіки, роботи з файлами. Вона  реалізує введення з клавіатури в діалоговому вікні матриці чисел із послідуючим записом даних у файл IN.DAT, який має знаходитись в робочому каталозі; якщо в робочому каталозі даного файлу немає, програма створить новий з таким же ім’ям.

Proba.rc – файл ресурсів, який використовується головною програмою і в якому створені такі об’єкти як меню, діалогові вікна для вводу інформації, обробки даних та виведення результатів; в файлі Lab.rc задаються та визначаються всі ре

сурси головного вікна, а саме: тип та структура панелі меню,               форма та вигляд діалогових вікон, іконки;

oks.asm – програма на мові Асемблер, яка відкриває файл in.dat і зчитує інформацію, записану головною програмою. Програма передає зчитані дані в головну програму; програма знаходить номер рядка, де є мінімальний елемент побічної діагоналі матриці. Результат роботи програма передає в out.dat.



out.dat

in.dat 

Resours.h

proba.rc

proba.cpp

oks.asm
2 Основні класи та функції MFC-програми

Для програми пакету VISUAL C++ 6.0 були використані стандартні класи та функції з бібліотеки MFC. Розглянемо та коротко опишемо основні з них. 

class CPashaWnd: public CFrameWnd - клас робочого вікна, що є похідним від стандартного CFrameWnd. Він складається з функцій:

- void OnOpen(),  void OnSaveAs(),  void OnDelete(),  void OnInput(),  void OnRun(),  void OnResult(), void OnInfo(),  void OnQuit() – функції реакцій на вибір команд меню;

class CMyDialog:public CDialog – ініціалізація діалогового вікна;

class CPashaApp:public CWinApp – клас, від якого ми створюємо свій власний похідний клас, що в роботі створюватиме програму.

BOOL CPashaApp::InitInstance() – функція ініціалізації головного вікна;

AfxMessageBox() – функція, яка виводить вікно повідомлення з вказаним повідомленням та заголовком до нього. 

CChecButton, СListBox, CcomboBox, CEdit – стандартні класи з відповідними функціями обробки активних елементів діалогових вікон.

DoDataExchange() – функція викликається автоматично під час ініціалізації діалогового вікна, вона має набір DDX макросів;

DDX макроси встановлюють зв‘язок між елементом керування і відповідною змінною;


4. Створення діалогових вікон

Створення діалогових  вікон заданої конфігурації в VISUAL C++ 6.0 з використанням бібліотеки MFC. Для цього потрібно відкрити новий ресурс (діалогове вікно) в створеному проекті і задати (виділивши маніпулятором миша) потрібний розмір діалогового вікна. Після цього можна задавати у новоствореному вікні потрібні обєкти, вибравши тип потрібного обєкту на верхній панелі інструментів. Місце розташування потрібного обєкта (рамка, напис, вікно для редагування (Edit), селекторні кнопки(RadioButton), контрольні перемикачі (CheckBox), комбіновані списки (ComboBox), списки (ListBox) та багато інших) потрібно вказати курсором мишки і задати для деяких із них розмір. Після того, як зображення елемента зявилось можна задати йому певних параметрів та властивостей. Все це відбувається візуально.

Створивши всі необхідні  обєкти, програма автоматично запише весь текст програми, який відповідатиме за створення даного діалогового вікна, у файл ресурсів Script.RC. На цьому візуальна частина створення діалогових вікон скіінчилась. Для того, щоб таке вікно працювало, потрібно описати в головній програмі project.CРР власні класи діалогових вікон, які будуть потомками стандартних класів. Для ініціалізації потрібно створити змінні певних типів для всіх активних елементів діалогового вікна у створеному для нього класі і задати їм початкові значення. 

Для передачі даних, які були введені в діалоговому вікні, найпростішим способом є закріплення за цим діалоговим вікном структури, в якій будуть описані глобальні змінні відповідно до порядку ініціалізації активних елементів вікна. 


Етапи створення діалогового вікна в даній курсовій роботі:

1.Створення власного класу діалогового вікна class CMyDialog:public CDialog. Об‘ява для елементів керування змінних властивостей класу :

змінні другої категорії Control – CEdit m_text, що забезпечують прямий доступ до елементів керування. 

2.Ініціалізація змінних властивостей класу: 

m_text=_T();

m_List=_T();

3.Обмін даними з елементами діалога

void CMyDialog::DoDataExchange(CDataExchange* pDX)

   {

      CDialog::DoDataExchange(pDX);

	  DDX_Text(pDX,IDC_EDIT,m_text);

	  DDX_LBString(pDX,IDC_LIST,m_List);

}

4.Організація результатів виконання діалогу після натиснення кнопок OK, Cancel 

void CMyDialog::OnOK()			void CMyDialog::OnCancel()

5.Організація ініціалізації елементів керування за допомогою функції OnInitDialog():

CDialog::OnInitDialog();

       CListBox* p=(CListBox*)GetDlgItem(IDC_LIST);

       p->AddString("6");

       p->AddString("3");

       p->AddString("5");

6.Відтворення карти повідомлень:

BEGIN_MESSAGE_MAP(CPashaWnd, CFrameWnd)

ON_COMMAND(ID_INPUT, OnInput)

ON_COMMAND(ID_INFO, OnInfo)

END_MESSAGE_MAP();

7.Створення об‘єкту діалогового вікна і його відображення:

     CMyDialog dialog(this);

     dialog.DoModal();

8.Створення  функцій обробки результатів, що отримали з діалогового вікна.


5. Робота з графікою

Для графічного відображення результатів використовуються стандартні бібліотечні функції та класи. В WINDOWS для виведення графіки потрібно використовувати контексти пристроїв:

		CDС – базовий клас DС, на основі якого створюються інші пристрої;

		CClientDC – виведення в робочу частину вікна;

		CPaintDC  визначення вікна, яке потрібно перерисовувати;

		CWindowDC  виведення на всю область вікна;

Основними інструментами, що використовуються в даній програмі є:

Pen – перо. Brush – пензель.. Color – логічний колір.

Для застосування цих інструментів їх потрібно створити та ініціалізувати. Створення та ініціалізація в даній курсовій роботі має слідуючий вид:

dc.SelectObject (&Pen3) – ініціалізація власних типів пер.

dc.SelectObject (&Вrush) – ініціалізація власного типу пензля.

Створення власних пер: Pen1 = Create Pen(PS_DOT,2,RGB(255,0,0)), 

Pen2 = Create Pen(PS_SOLID,2,RGB(255,0,0)), 

Pen3 = Create Pen(PS_DASH,2,RGB(255,0,0)) ..

Створення власного пензля: Brush. Create SolidBrush(RGB(0,255,255)). 

Створення власних кольрів:RGB(n1, n2, n3), ni = 0-255,

RGB(255, 0, 0) – червоний, RGB(0, 0, 0) – чорний.

Спочатку потрібно об‘явити ці інструменти:

 CPen pen1; CBrush brush1;


Висновки.

Даний курсова робота в деякій мірі розкриває можливості мови С++ пакету Visual C++ 6.0. тут можна побачити перевиги даного пакету над іншими як у вирішенні різного роду задач так і у інтерфейсі. 

Так, як програма складається з окремих модулів, то кожний модуль можна використовувати для реалізації інших подібних програм, які необхідно виконати в стислий термін.

Таким чином, програмування на Visual C++ 6.0 та Assembler відкриває перед програмістом безмежну кількість варіантів та можливостей реалізації поставлених задач, а це досить важливо сьогодні, так як комп’ютери та комп’ютерні мережі та системи стали застосовуватись практично у всіх галузях народного господарства.

При вивченні основних можливостей Visual C++ 6.0 та об’єктно-орієнтованого програмування з використанням MFC – бібліотеки було встановлено і розглянуто частину принципово нових можливостей реалізації графічного інтерфейсу та модульного програмування, які є досить ефективні і мобільні .

Завдяки поєднанню програм на Visual С++ і Асемблері можна створити програму високого рівня, тобто програму, яка відповідає світовим стандартам по оформленню, швидкодії та іншим параметрам.

Створена система меню може застосовуватись не лише для реалізації поставленої задачі, а й для будь-якої іншої програми, тому що зміна пунктів меню, зовнішнього вигляду, виконання процесу робиться досить швидко і без будь-яких ускладнень.


Література

  Абель П. Язык Ассемблера для IBM PC и программирование.– .М.:Высш. Шк.,1992.–447 с.

 Гладков, Фролов   Програмирование в Windows Microsoft

Мешков, Тихомиров Visual C++  MFC 3том.

 Тихомиров Visual C++ 6.0 1999г. С.-П.

Марк Луис  Visual C++ . Москва 1995г.

Кейт Грегори Использованиие Visual C++ 6.0 М. “Издательский дом Вильямс” 2000.- 864 c.   


3. Створення меню.

В даній курсовій роботі меню має вигляд, що показаний в завданні. Меню являється найпростішим ресурсом, що забезпечує нам  зручну роботу з програмою, служить візуальним помічником.

Типи повідомлень в бібліотеці MFC розподіляють:

Повідомлення Windows (WM_WindowsMessage).

Повідомлення від дочірніх вікон та кнопок – елементів керування.

Командні повідомлення – від меню та панелей інструментів.

Наведемо приклад обробки повідомлень від меню, що здійснюється в даній програмі.

DECLARE_MESEEAGE_MAP ( ) – таблиця реакцій, якя зв‘язує вибір команди меню з відповідною функцією обробки;

class CPashaWnd:public CFrameWnd 

{

public: 

	CPashaWnd();

protected:

    protected:

     afx_msg void OnOpen();       

     afx_msg void OnSaveAs();

     afx_msg void OnQuit();

	 afx_msg void OnDelete();

	 afx_msg void OnPaint();

  	 afx_msg void OnInput();

  	 afx_msg void OnHelp();

	 afx_msg void OnRun();

	 afx_msg void OnResult();

	 afx_msg void OnInfo();

	DECLARE_MESSAGE_MAP() 

};



BEGIN_MESSAGE_MAP(CPashaWnd, CFrameWnd)

   ON_COMMAND(ID_OPEN,OnOpen)    

   ON_COMMAND(ID_SAVE,OnSaveAs)

   ON_COMMAND(ID_DELETE,OnDelete)

   ON_COMMAND(ID_QUIT,OnQuit)

   ON_COMMAND(ID_INPUT,OnInput)

   ON_COMMAND(ID_HELP,OnHelp)

   ON_COMMAND(ID_RUN,OnRun)

   ON_COMMAND(ID_INFO,OnInfo)

   ON_COMMAND(ID_RESULT,OnResult)

   ON_WM_PAINT()

END_MESSAGE_MAP();



void CPashaWnd::OnInput()

{

}

void CPashaWnd::OnHelp()

{

}

void CPashaWnd::OnRun()

{

}

void CPashaWnd::OnResult()

{

}

void CPashaWnd::OnInfo()

{

}

CPashaWnd::CPashaWnd()

{

	Create(NULL,"My program",

           WS_OVERLAPPEDWINDOW,rectDefault,NULL,   

		   MAKEINTRESOURCE(IDR_MENU1));  };


7.Робота з файлами в Visual C++6.0

Зручний багатофункціональний інтерфейс даної роботи передбачає також і роботу з файлами, їх зберігання, відкриття, знищення, що є зручним для користувача. Робота з файлами здійснюється за допомогою бібліотеки <iostream.h>.

Всі функції роботи з файлами знаходяться в меню в пункті File:

Open

Save 

Delete

Вибираємо потрібну нам функцію та файл, з яким будемо працювати за допомогою миші.

В змінній DlgOpen.GetPathName зберігається ім‘я файлу.

Функції реалізовані слідуючим чином:   Open 

void CPashaWnd::OnOpen()

{

	  CString m_Text;

 створення стандартної панелі вибору файлу Open

		CFileDialog DlgOpen(TRUE,(LPCSTR)"*",NULL,

		OFN_HIDEREADONLY,(LPCSTR)" ALL Files (*.*) |*.*||");

відображения стандартної панелі вибору файлу

if(DlgOpen.DoModal()==IDOK)	

відкриття файлу і зчитування:

FILE *f = fopen(dlg.GetPathName(), "rt");

		if (f == NULL)

		{

		AfxMessageBox("Can'topen file");

			return;

		}

		int i;

		char str[101], acBuf[1001];

		acBuf[0] = '\0';

		for (i = 0; i < 10; i++)

		{

			if (fgets(str, 100, f) == NULL)

				break;

			::lstrcat(acBuf, str);

		}

		MessageBox(acBuf, dlg.GetPathName(),

			MB_ICONINFORMATION | MB_OK);

		fclose(f);

	} 

		Save 

void CPashaWnd::OnFSaveAs()

{

	 	char filter[] = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*|";

	CFileDialog dlg(FALSE, "*.txt", NULL,	OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, filter);

	if (dlg.DoModal() == IDOK)

	{

		FILE *f = fopen(dlg.GetPathName(), "wt");

		if (f == NULL)

		{

			AfxMessageBox("Can'topen file");

			return;

		}

		char acBuf[400];

		if (fMatrFilled)

		{

			Calc();

			::wsprintf(acBuf, "Result = %d", result);

		}

		else

			::strcpy(acBuf, "Matrix has not inputed");

		fputs(acBuf, f);

		::wsprintf(acBuf, "File : %s succesfully saved", dlg.GetPathName());

		MessageBox(acBuf, "File Saving",

			MB_ICONEXCLAMATION | MB_OK);

		fclose(f);

	}

}

Delete

void CPashaWnd::OnFDelete()

{ char filter[ ] = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*|";

	CFileDialog dlg(TRUE, "*.txt", NULL, OFN_HIDEREADONLY, filter);

	if (dlg.DoModal() == IDOK)

	{

		::remove(dlg.GetPathName());

		MB_ICONINFORMATION | MB_OK);

	}

}

	Виведення повідомлення після виконання операції

MessageBox("Succesfully deleted", dlg.GetPathName(),


6. Виконання обробки матриці на Асемблері

Основні функції Асемблера

Головні функції та переривання, що були використані при програмуванні на мові Асемблера в даній курсовій роботі:

	Функція 03сh переривання 21h – створення файлу; в СХ – атрибути файлу, DS:DX – специфікація файлу. В АХ повертає значення відкритого каналу для цього файлу.

Функція 03dh переривання 21h – відкрити файл; в AL – режим  доступу до файлу, DS:DX – специфікація файлу.

Функція 03eh переривання 21h – закрити файл; BX – номер каналу.

Функція 03fh переривання 21h – читання з файлу або пристрою; BX – номер каналу, СX – кількість байт, що зчитуються, DS:DX буфер.

Функція 042h переривання 21h – перемістити покажчик файлу; BX – номер каналу, CX:DX – зміщення покажчика.

Взаємодія Асемблера та проекту мовою VisualC++6.0

Для підключення файлу Асемблера до проекту треба виконати наступні дії:

Під час створення проекту задати режим не Win32, а 16.

Після створення проекту підключити до нього вручну сам файл Асемблера через контекстне меню.

Переписати в каталог, де міститься проект сам Асемблер “TASM32.EXE”.

Написати програму на Асемблері за правилами інтерфейсу С++:

Повинна співпадати модель пам‘яті (по умовчанню LARGE)

Використовувати скорочені назви сегменту.

Всі зовнішні імена на Асемблері повинні мати знак підкреслення “__”.

Імена зовнішніх змінних і в Асемблері, і в С++ повинні бути однакові з урахуванням регістра.

Після введення даних в діалогове вікно вони записуються в файл “in.dat”

Програма на Асемблері зчитує з дані з цього файлу та перетворює їх в число.

Над даними виконати арифметичні дії.

Результати виконання програми записати в файл “out.dat”.

Програма мовою Visual С++ зчитує ці дані з файлу і виводить результат на екран .

Якщо результат вивели на екран – основна задача та мета роботи досягнута.


























Додаток 1.

Лістинг програми мовою С++ паекту Visual C++6.0

#include <afxwin.h>

#include "resource.h"

#include<stdlib.h>

#include <stdio.h>

#include <conio.h>

#include <afxdlgs.h>

#include <iostream.h>

#include <fstream.h>

   char str2[300];

  int radio1=1,radio2=0,radio3=0;  int    t, i, j;

 char str[80];

 char buf1[80];

 char buf2[80];

int matrix[20][20];

	char str1[300],listStr[10];

int index,inde,ind=10;

short int average ,max,min;



class CMyDialog:public CDialog

{

public:

	CString m_text;

	CMyDialog():CDialog(IDD_DIALOG) { m_text=_T("text"); }	

protected: 

	afx_msg void OnInput(); 

	virtual void DoDataExchange(CDataExchange *pDX);

	BOOL OnInitDialog();

   	afx_msg void OnLIST2(); 

	 afx_msg void OnLIST3(); 



	

	DECLARE_MESSAGE_MAP()

};



BEGIN_MESSAGE_MAP(CMyDialog,CDialog)

ON_COMMAND(IDC_OK,OnInput) 

  ON_LBN_DBLCLK(IDC_LIST2,OnLIST2)

ON_LBN_DBLCLK(IDC_LIST3,OnLIST3)

END_MESSAGE_MAP()



void CMyDialog::DoDataExchange(CDataExchange *pDX)

{

 CDialog::DoDataExchange(pDX);

 DDX_Text(pDX,IDC_EDIT1,m_text);

 //AfxMessageBox(m_text); 

}



void CMyDialog::OnInput()

{

  //CEdit *ped=(CEdit*)GetDlgItem(IDC_EDIT1); 

 //ped->GetWindowText(str1,sizeof(str1-1)); 

 //AfxMessageBox(str1);

 //CDialog::OnOk(); 

 GetDlgItemText(IDC_EDIT1,str1,255); 

 {char t[10];

 int arr[10];

 int i=0,n=0,j=0,m=0;

  while(str1[n]!='\0')

  { 

   while(isdigit(str1[n]))

   {

    t[i++]=str1[n]; 

    n++;

   }

   if(i>0)

   {t[i]='\0';i=0;arr[m++]=atoi(t);}

  n++; 

 }	   

 int a=50,b=80;

 i=0;

 //initialization of matrix by the numbers inputed in edit box

 //int matrix[20][20];

 for(m=0;m<ind;m++)

  for(n=0;n<inde;n++)

   matrix[m][n]=arr[i++];   

  _int16 *NewArray16=new _int16[ind*inde];

 m=0;

 for(i=0;i<ind;i++)

  for(j=0;j<inde;j++)

   NewArray16[m++]=(_int16)matrix[i][j];

        

 for(m=0;m<ind*inde;m++)

 {

  NewArray16[m]=(_int16)matrix[i][j];

  if(j==inde)

  {	

   i++;j=0;

  }

  j++;

  if(i==ind)

   break;

 }	 }

  





 SendMessage(WM_CLOSE);

}



BOOL CMyDialog::OnInitDialog()





 /* CButton*cbpr1=(CButton*)GetDlgItem(IDC_RADIO1);

  CButton*cbpr2=(CButton*)GetDlgItem(IDC_RADIO2);

  CButton*cbpr3=(CButton*)GetDlgItem(IDC_RADIO3);



	 cbpr1->SetCheck(radio1);

	 cbpr2->SetCheck(radio2);

	 cbpr3->SetCheck(radio3);

	 return TRUE;  */

	 {



	 char temp1[10];

	CDialog::OnInitDialog();

	CListBox *d=(CListBox*)GetDlgItem(IDC_LIST2);

	for(int i1=0;i1<ind;i1++)

	{

		sprintf(temp1,"%d",i1);

		d->AddString(temp1); 

	} 



	 char temp2[10];

	CDialog::OnInitDialog();

	CListBox *k=(CListBox*)GetDlgItem(IDC_LIST3);

	for(int i2=0;i2<ind;i2++)

	{

		sprintf(temp2,"%d",i2);

		k->AddString(temp2); 

	} 

	

	return TRUE;	

}



  void CMyDialog::OnLIST2()

{

 //here we are getting list pointer with indentifier IDC_LIST1

 CListBox* lbd=(CListBox*)GetDlgItem(IDC_LIST2);

 //after obtaining the pointer,we are defining index of selected element    

  inde=lbd->GetCurSel();

  //find out name of selected element

  lbd->GetText(inde,listStr);

  MessageBox(listStr,"Selection is");

}



void CMyDialog::OnLIST3()

{

 //here we are getting list pointer with indentifier IDC_LIST1

 CListBox* lbk=(CListBox*)GetDlgItem(IDC_LIST3);

 //after obtaining the pointer,we are defining index of selected element    

  ind=lbk->GetCurSel();

  //find out name of selected element

  lbk->GetText(ind, listStr);

  MessageBox(listStr,"Selection is");

}



float C;

const char szPashaWndTitle[] = "Pasha's application uses MFC";

const StepNum = 20;

bool bRunned;

class CPashaWnd : public CFrameWnd

{

 public:

  _int16 *NewArray16;

     

  CPashaWnd() 

  { 	

   NumOfRow = 2; 

   bRunned = false;

   RECT r;

   r.top=r.left=50;

   r.bottom=r.right=500;

   Create(NULL,"In any business the most difficul is beginning",

    WS_OVERLAPPEDWINDOW|WS_VISIBLE,r,NULL,MAKEINTRESOURCE(IDR_MENU1));  

  };

	~CPashaWnd() {};

 	

  	afx_msg void OnOPEN();

	  	afx_msg void OnHELP();



	afx_msg void OnSAVE();

		afx_msg void OnINFO();



 	afx_msg void OnRENAME();

    afx_msg void OnCreateChildWindow();   

	afx_msg void OnQUIT();

	afx_msg void OnDialog();

	afx_msg void OnRUUN();

	afx_msg void OnRESULT();

	afx_msg void OnPaint();

    afx_msg void OnRogy();

	afx_msg void OnINPUT();

  DECLARE_MESSAGE_MAP()

	int NumOfRow;

};



BEGIN_MESSAGE_MAP( CPashaWnd, CFrameWnd)

	ON_COMMAND( ID_CHILD,OnCreateChildWindow)	

ON_COMMAND( ID_CHILDNEXT,OnRogy)	

	ON_COMMAND( ID_FILE_OPEN, OnOPEN)

		ON_COMMAND( ID_FILE_INFO, OnINFO)



		ON_COMMAND( ID_FILE_HELP, OnHELP)	



	ON_COMMAND( ID_FILE_SAVE, OnSAVE)	  

     ON_COMMAND( ID_RUUN_RUUN, OnRUUN)

	ON_COMMAND( AFX_ID_FILE_RENAME, OnRENAME)  

    ON_COMMAND( AFX_ID_FILE_QUIT, OnQUIT)	

//    ON_COMMAND( AFX_ID_RUN_RUN, OnRUN)

    ON_COMMAND( AFX_ID_RESUET_RESUET, OnRESULT)		    

    ON_COMMAND( AFX_ID_FILE_Dialog, OnDialog)	

END_MESSAGE_MAP()

//-------------------------------------------------------------------

class CChildWnd:public CFrameWnd

{

protected: 

  POINT p;  

  afx_msg  void OnPaint();

 DECLARE_MESSAGE_MAP();

public: 

 CChildWnd(CWnd *pParent)

 {

  CRect wndSize(0,0,300,300);

  Create(NULL,"ChildWindow",WS_OVERLAPPEDWINDOW|

	       WS_CHILD,wndSize,pParent);

 }

};

BEGIN_MESSAGE_MAP(CChildWnd,CFrameWnd)

 ON_WM_PAINT()

END_MESSAGE_MAP()

void CChildWnd::OnPaint()

{



 CPaintDC dc(this);

 if (!bRunned) 

 {

  char str2[20];

  CPen pen,pen1;

  CRect rect;

  CString tmp = _T("");



    sprintf(str2," %f ",average);

    pen.CreatePen(PS_SOLID, 2, RGB(0,250,0));

	pen1.CreatePen(PS_SOLID, 2, RGB(255,255,255));

    dc.SelectObject(&pen);



	GetClientRect(&rect);

	int step = (rect.right - rect.left) / StepNum;



	int x = average * step + 50;



	step = (rect.bottom - rect.top) / Nmax;

    pen.DeleteObject();



	CBrush brush,brush1,brush2,brush3;

	brush.CreateSolidBrush(RGB(255,255,255));

	brush2.CreateSolidBrush(RGB(255,200,255));

	brush3.CreateSolidBrush(RGB(0,0,0));





	brush1.CreateSolidBrush(RGB(255,255,255));

	dc.SelectObject(&brush);



	int y = rect.bottom - index*step;

	int k,d,dy = 1;

	int flag=1;

	int top = 5;

	



	k = top;

	while(top < y) 

	{

    dc.SelectObject(&brush2);

    dc.SelectObject(&pen);

    dc.Ellipse(x, k, x+30, k-30);

    for(d=0;d<1000000;d++);

    dc.SelectObject(&brush2);

    dc.SelectObject(&pen1);

    dc.Ellipse(x, k, x+30, k-30);

	  

	dc.SelectObject(&brush);

	dc.SelectObject(&pen);

  	dc.Ellipse(x, k, x+30, k-30);

	

	k += dy;

	  dy += flag;

	  if(k>y)

	  {	   k = y;

	    dy = -dy/2;

	   flag = -1;

	   top += step;  }



	  if(k<top)

	  {  k = top ;

	   dy = 1;

	   flag = 1;  }

	 } 



	k-=15;

	

    dc.SelectObject(&brush2);

    dc.SelectObject(&pen1);

    dc.Ellipse(x, k, x+30, k-30);



	brush.DeleteObject();

  }



 }

int cnt=0;

//-----------------------------------------------------------------------

class CChildNextWnd:public CFrameWnd

{

protected: 

  POINT p;  

  afx_msg  void OnPaint();

 DECLARE_MESSAGE_MAP();

public: 

 CChildNextWnd(CWnd *pParent)

 {

  CRect wndSize(0,0,300,300);

  Create(NULL,"ChildWindow",WS_OVERLAPPEDWINDOW|

	       WS_CHILD,wndSize,pParent);

 }

};

BEGIN_MESSAGE_MAP(CChildNextWnd,CFrameWnd)

 ON_WM_PAINT()

END_MESSAGE_MAP()



void CChildNextWnd::OnPaint()

 {

  CPaintDC dc(this);

  

  

 char t[10];

 int arr[10];

 int i=0,n=0,j=0,m=0;

  while(str1[n]!='\0')

  { 

   while(isdigit(str1[n]))

   {

    t[i++]=str1[n]; 

    n++;

   }

   if(i>0)

   {t[i]='\0';i=0;arr[m++]=atoi(t);}

  n++; 

 }	   

 int a=50,b=80;

 i=0;

 //initialization of matrix by the numbers inputed in edit box

 //int matrix[20][20];

 for(m=0;m<ind;m++)

  for(n=0;n<inde;n++)

   matrix[m][n]=arr[i++];   

  _int16 *NewArray16=new _int16[ind*inde];

 m=0;

 for(i=0;i<ind;i++)

  for(j=0;j<inde;j++)

   NewArray16[m++]=(_int16)matrix[i][j];

        

 for(m=0;m<ind*inde;m++)

 {

  NewArray16[m]=(_int16)matrix[i][j];

  if(j==inde)

  {	

   i++;j=0;

  }

  j++;

  if(i==ind)

   break;

 }	  

	  





	int  x=40,y=50;char buf[10];



 //filling the screen by numbers that are in matrix 

 int temp;

 int max = matrix[0][ind-1];

 dc.TextOut(x,y-20,"Matrix");

 for(m=0;m<ind;m++)

 { 

  for(n=0;n<inde;n++)

  { 

    temp=matrix[m][n];     

 	sprintf(buf,"%d",temp); 

    dc.TextOut(x,y,buf,strlen(buf));

   x+=30;

  } 

  y+=20;		 

  x=40;

 }

 

{

	

	//for (i = 0; i < inde; i++)

	//	if (matrix[i][inde- i - 1] > max)

	//max=matrix[i][ind - i - 1];



	

}

			

ifstream in("out.dat");

 if(!in)

  cout<<"Figovina!";

 else

 {

	in >> min >> max >> average;

	in.close();

 };  max = 10;  



 dc.TextOut(50,180,"Mах");  

 sprintf(buf,"%d",max);

 dc.TextOut(90,180,buf);



} 

//------------------------------------------------------------------

/*void CPashaWnd::OnRUN()

{

 CClientDC dc(this);

 char t[10];

 int arr[10];

 int i=0,n=0,j=0,m=0;

  while(str1[n]!='\0')

  { 

   while(isdigit(str1[n]))

   {

    t[i++]=str1[n]; 

    n++;

   }

   if(i>0)

   {t[i]='\0';i=0;arr[m++]=atoi(t);}

  n++; 

 }	   

 int a=50,b=80;

 i=0;

 //initialization of matrix by the numbers inputed in edit box

 //int matrix[20][20];

 for(m=0;m<ind;m++)

  for(n=0;n<inde;n++)

   matrix[m][n]=arr[i++];   

  _int16 *NewArray16=new _int16[ind*inde];

 m=0;

 for(i=0;i<ind;i++)

  for(j=0;j<inde;j++)

   NewArray16[m++]=(_int16)matrix[i][j];

        

 for(m=0;m<ind*inde;m++)

 {

  NewArray16[m]=(_int16)matrix[i][j];

  if(j==inde)

  {	

   i++;j=0;

  }

  j++;

  if(i==ind)

   break;

 }

	  

 

  /*int  x=40,y=50;char buf[10];

 //filling the screen by numbers that are in matrix 

 int temp;

 dc.TextOut(x,y-20,"Matrix");

 for(m=0;m<ind;m++)

 { 

  for(n=0;n<inde;n++)

  { 

    temp=matrix[m][n];     

 	sprintf(buf,"%d",temp); 

    dc.TextOut(x,y,buf,strlen(buf));

   x+=30;

  } 

  y+=20;		 

  x=40;

 }

//here we find out 'Min' element of row that was selected in ListBox 

	min=matrix[index][0];



	for(m=1;m<inde;m++)

		if(min>matrix[index][m])

			min=matrix[index][m];



//here we find out 'Max' element of row that was selected in ListBox  

	max=matrix[index][0];

	

	for(m=1;m<inde ;m++) 

		if(max<matrix[index][m])    	 

			max=matrix[index][m];

 

 average=(max+min)/2; 

 dc.TextOut(60,140,"--This is the number of matrix row having been selected before");

 dc.TextOut(50,140,listStr);

 

 dc.TextOut(50,160,"Min"); 

 sprintf(t,"%d",min);

 dc.TextOut(90,160,t,strlen(t)); 

 

 dc.TextOut(50,180,"Mах");  

 sprintf(t,"%d",max);

 dc.TextOut(90,180,t);

 

 dc.TextOut(50,200,"Average of Min and Max");



 sprintf(t,"%d",average);

 dc.TextOut(280,200,t);

 

 bRunned=1;

 //--------------------------------------------------------------

 //CBrush brush(0,RGB(0,30,70));

 //access=1;

 //OnTimer(access);

 bRunned=1;



}*/

//	bRunned=1;	 



void CPashaWnd::OnRUUN()

{



	system("oks.exe");

}



void CPashaWnd::OnRogy()

{ 

 CChildNextWnd *pFrameWnd=new CChildNextWnd(this);

 pFrameWnd->ShowWindow(1);

 pFrameWnd->UpdateWindow();

}



void CPashaWnd::OnCreateChildWindow()

{ 

 CChildWnd *pFrameWnd=new CChildWnd(this);

 pFrameWnd->ShowWindow(1);

 pFrameWnd->UpdateWindow();

}



void CPashaWnd::OnRESULT() {}



void CPashaWnd::OnSAVE()

{

  	// создание стандартной панели выбора файла SaveAs

  CFileDialog DlgSaveAs(FALSE,(LPSTR)"*",NULL,OFN_ALLOWMULTISELECT ,

	      (LPSTR)"Dat Files(*.dat)|*.dat");



	// отображение стандартной панели выбора файла SaveAs

 if(DlgSaveAs.DoModal()==IDOK)

 {

 // создание объекта и открытие файла для записи



  ofstream fout(DlgSaveAs.GetPathName());

  if(!fout)

   AfxMessageBox("File hasn't been created");

 

  else

  {

	  fout << ind << " ";

	  fout << inde << " ";

	  fout << index << " ";



	  for (int i=0; i<ind; i++)

		  for (int j=0; j<inde; j++)

		  {

			  fout << matrix[i][j] << " "; 

		  }

		 

	fout.close();

		system( "oks.exe");

  } }}

	 

void CPashaWnd::OnRENAME()

{

	CClientDC dc(this);



	CFileDialog DlgOpen(TRUE,(LPCSTR)"*",NULL,

	OFN_HIDEREADONLY,(LPCSTR)" All Files (*.dat) |*.dat||");

	if(DlgOpen.DoModal()==IDOK)

	{

        CStdioFile File(DlgOpen.GetPathName(),CFile::modeRead);



		File.Close();

		File.Remove(DlgOpen.GetPathName());

	} 

}



void CPashaWnd::OnQUIT()

{

	PostQuitMessage( 0);

}





void CPashaWnd::OnHELP()

{

	AfxMessageBox("НЕТ  И НЕ БУДЕТ");

 

}



void CPashaWnd::OnINFO()

{

	AfxMessageBox("СТУДЕНТ  ГРУПИ  2КІ-98 ПАША");

 

}



void CPashaWnd::OnOPEN()

{

       

int i;

	CClientDC dc(this);

		CFileDialog DlgOpen(TRUE,(LPCSTR)"*",NULL,

		OFN_HIDEREADONLY,(LPCSTR)" All Files (*.*) |*.*||");

        int arr[50];

		if(DlgOpen.DoModal()==IDOK)

		{

		 char buf[255];



		 FILE *in;

		 if (in = fopen(DlgOpen.GetPathName(), "rt"))

		 {

			fgets(buf, 255, in);

			CString t = _T(buf);

			dc.TextOut(10,10,t);

		 }		} }



void CPashaWnd::OnDialog()

{

	CMyDialog MyDialog;

	MyDialog.DoModal();



	bRunned = false;

}



void CPashaWnd::OnPaint()

{

    CPaintDC dc(this);

	int len; 

	len=strlen(buf1);

	 if(len)

	 {

	   dc.TextOut(20,180,"ListBox1:");

	   dc.TextOut(100,180,buf1,len);

	 }

	len=strlen(buf2);

	 if(len)

	 {

	   dc.TextOut(20,210,"ListBox2:");

	   dc.TextOut(100,210,buf2,len);

	 }

	len=strlen(str);

	 if(len)

	 {

	   dc.TextOut(20,240,"Edit:");

	   dc.TextOut(100,240,str,len);

	 }

 }





class CPashaApp : public CWinApp

{

public:

	CPashaApp() {};

	virtual BOOL InitInstance();

};



BOOL CPashaApp::InitInstance()

{

 m_pMainWnd= new CPashaWnd();

 m_pMainWnd->ShowWindow(m_nCmdShow);

 m_pMainWnd->UpdateWindow();

 return TRUE;

}



CPashaApp PashaApp;

  
Додаток 2. 

Proba.rc

#include "resource.h"



#define APSTUDIO_READONLY_SYMBOLS

#include "afxres.h"



#undef APSTUDIO_READONLY_SYMBOLS



#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_UKR)

#ifdef _WIN32

LANGUAGE 0x22, 0x1

#pragma code_page(1251)

#endif //_WIN32



IDR_MENU1 MENU DISCARDABLE 

BEGIN

    POPUP "&FILE"

    BEGIN

        MENUITEM "OPEN",                        ID_FILE_OPEN

        MENUITEM "SaveAs",                      ID_FILE_SAVE

        MENUITEM "DELETE",                      AFX_ID_FILE_RENAME

    END

    MENUITEM "&INFO",                       ID_FILE_INFO

    MENUITEM "&HELP",                       ID_FILE_HELP

    POPUP "Cale"

    BEGIN

        MENUITEM "INPUT",                       AFX_ID_FILE_Dialog

        MENUITEM "RUN",                         ID_CHILDNEXT

        MENUITEM "&RESUET",                     ID_CHILD

    END

    MENUITEM "QUIT",                        AFX_ID_FILE_QUIT

END





#ifdef APSTUDIO_INVOKED



1 TEXTINCLUDE DISCARDABLE 

BEGIN

    "resource.h\0"

END



2 TEXTINCLUDE DISCARDABLE 

BEGIN

    "#include ""afxres.h""\r\n"

    "\0"

END



3 TEXTINCLUDE DISCARDABLE 

BEGIN

    "\r\n"

    "\0"

END



#endif    // APSTUDIO_INVOKED



IDR_ACCELERATOR1 ACCELERATORS DISCARDABLE 

BEGIN

    "I",            ID_HELP_INFO,           VIRTKEY, CONTROL, NOINVERT

    VK_F10,         ID_FILE_EXIT,           VIRTKEY, CONTROL, NOINVERT

END



IDD_DIALOG DIALOG DISCARDABLE  0, 0, 307, 140

STYLE DS_MODALFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | 

    WS_CAPTION | WS_SYSMENU

CAPTION "Dialog"

FONT 8, "MS Sans Serif"

BEGIN

    DEFPUSHBUTTON   "OK",IDC_OK,145,45,50,14

    PUSHBUTTON      "Cancel",IDCANCEL,225,45,50,14

    LISTBOX         IDC_LIST2,5,85,48,18,LBS_SORT | LBS_NOINTEGRALHEIGHT | 

                    WS_VSCROLL | WS_TABSTOP

    EDITTEXT        IDC_EDIT1,190,110,49,19,ES_AUTOHSCROLL

    CONTROL         "BYTE",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,25,10,35,

                    10

    CONTROL         "WORD",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,115,10,39,

                    10

    CONTROL         "DWORD",IDC_RADIO3,"Button",BS_AUTORADIOBUTTON,195,10,45,

                    10

    LTEXT           "ъ¦ы№ъ¦ёЄ№  Ё фъ¦т",ID_STATIC,65,50,56,8

    LTEXT           "ъ¦ы№ъ¦ёЄ№  ёЄютяўшъ¦т",ID_STATIC2,60,90,71,8

    LTEXT           "¦LT¦Lг-",IDC_STATIC,195,95,37,8

    LTEXT           "List Box",IDC_STATIC,20,70,25,10

    LTEXT           "List Box",IDC_STATIC,15,110,26,8

    LISTBOX         IDC_LIST3,5,40,50,20,LBS_SORT | LBS_NOINTEGRALHEIGHT | 

                    WS_VSCROLL | WS_TABSTOP

END





#ifdef APSTUDIO_INVOKED

GUIDELINES DESIGNINFO DISCARDABLE 

BEGIN

    IDD_DIALOG, DIALOG

    BEGIN

        LEFTMARGIN, 7

        RIGHTMARGIN, 297

        BOTTOMMARGIN, 133

    END

END

#endif    // APSTUDIO_INVOKED



STRINGTABLE DISCARDABLE 

BEGIN

    AFX_ID_FILE_RENAME      "RENAME"

    AFX_ID_FILE_QUIT        "QUIT"

    AFX_ID_RESUET_RESUET    "RESUET"

    AFX_ID_Dialog_Dialog    "Dialog"

    AFX_ID_FILE_Dialog      "Dialog"

    ID_CHILDNEXT            "RUN"

    ID_RUUN_RUUN            "яюхїрыш"

    ID_FILE_HELP            "HELP"

END



STRINGTABLE DISCARDABLE 

BEGIN

    ID_FILE_OPEN            "OPEN"

    ID_FILE_SAVE            "RUUN"

END



STRINGTABLE DISCARDABLE 

BEGIN

    AFX_ID_RUN_RUN          "INFO"

END



#endif    // Unknown language: 0x22, 0x1 resources



#ifndef APSTUDIO_INVOKED



#endif    // not APSTUDIO_INVOKED


Додаток 3. 

Resource.h

//{{NO_DEPENDENCIES}}

// Microsoft Developer Studio generated include file.

// Used by proba.rc

//

#define IDR_MENU1                       101

#define IDR_ACCELERATOR1                102

#define IDD_DIALOG                      103

#define ID_LIST2                        1001

#define IDC_LIST2                       1001

#define ID_EDIT                         1002

#define IDC_EDIT1                       1002

#define IDC_RADIO1                      1003

#define IDC_RADIO2                      1004

#define IDC_RADIO3                      1005

#define ID_STATIC                       1006

#define ID_STATIC2                      1007

#define ID_LIST1                        1008

#define IDC_LIST1                       1008

#define ID_STATIC3                      1009

#define ID_LIST3                        1010

#define IDC_LIST3                       1010

#define IDC_OK                          1011

#define ID_FILE_EXIT                    40001

#define ID_HELP_INFO                    40002

#define AFX_ID_FILE_RENAME              40003

#define AFX_ID_FILE_QUIT                40004

#define AFX_ID_RESUET_RESUET            40006

#define AFX_ID_Dialog_Dialog            40007

#define AFX_ID_FILE_Dialog              40008

#define ID_CHILD                        40009

#define ID_CHILDNEXT                    40010

#define ID_RUUN_RUUN                    40011

#define ID_FILE_HELP                    40012

#define AFX_ID_RUN_RUN                  65535

#define ID_FILE_INFO                    65535



// Next default values for new objects

// 

#ifdef APSTUDIO_INVOKED

#ifndef APSTUDIO_READONLY_SYMBOLS

#define _APS_NEXT_RESOURCE_VALUE        104

#define _APS_NEXT_COMMAND_VALUE         40013

#define _APS_NEXT_CONTROL_VALUE         1012

#define _APS_NEXT_SYMED_VALUE           101

#endif

#endif
Додаток 4.

Лістинг програми на Assembler



STACKSG  SEGMENT  PARA STACK 'Stack'

         DW       80 DUP(?)

STACKSG  ENDS

;----------------------------------------------------------------------------

DATASG   SEGMENT  PARA 'Data'

HANDLE DW 0

MIN   DW       0fff0H                       ;минимальный элемент

MAX   DW       0

SREDN DW       0

TEN     DB      10



IN_FNAME   DB       "IN.DAT",0            ;имя входного файла

OUT_FNAME  DB       "OUT.DAT",0           ;имя выходного файла



NUMROWS     DW       1                        ;количество строк

NUMCOLS     DW       1                        ;количество столбцов

ROW         DW       0

TMP         DW       ?                  ;temporary cell

BUFFER      DB       64 DUP(5)                ;буфер ввода



stringlen       DB      ?

STRING          DB      4       DUP(?)          ;temporary string

DATASG   ENDS



CODESG   SEGMENT  PARA 'Code'

BEGIN    PROC     FAR

ASSUME   CS:CODESG,DS:DATASG,SS:STACKSG

         PUSH     DS

         SUB      AX,AX

         PUSH     AX

         MOV      AX,DATASG

         MOV      DS,AX

         CALL     LOAD_FROM_FILE              ;вызов

         CALL     CALCULATE                   ;пользовательских

         CALL     SAVE_TO_FILE                ;процедур

         RET

BEGIN    ENDP



LOAD_FROM_FILE PROC     NEAR

         MOV      AH,03Dh                   ;

         MOV      AL,0C2h                   ; открытие файла

         MOV      DX,OFFSET      IN_FNAME     ;

         INT      21h

         MOV      HANDLE,AX



        mov BX,0

        push BX

        @Cicle1:

         MOV      BX,HANDLE

         MOV      AH,03Fh                   ;

         MOV      CX,1                         ; считываем 1 байт в буфер

         MOV      DX,OFFSET      NUMROWS     ;

         INT      21h

         cmp NUMROWS,32  ; Space

         jz @EndCicle1

                sub NUMROWS,48

                pop BX

                mov AX,BX

                mul TEN

                add AX,NUMROWS

                mov BX,AX

                push BX

        jmp @Cicle1

        @EndCicle1:

        pop BX

        mov NUMROWS,BX



        mov BX,0

        push BX

        @Cicle2:

         MOV      BX,HANDLE

         MOV      AH,03Fh                   ;

         MOV      CX,1                         ; считываем 1 байт в буфер

         MOV      DX,OFFSET      NUMCOLS     ;

         INT      21h

         cmp NUMCOLS,32  ; Space

         jz @EndCicle2

                sub NUMCOLS,48

                pop BX

                mov AX,BX

                mul TEN

                add AX,NUMCOLS

                mov BX,AX

                push BX

        jmp @Cicle2

        @EndCicle2:

        pop BX

        mov NUMCOLS,BX



        mov BX,0

        push BX

        @Cicle3:

         MOV      BX,HANDLE

         MOV      AH,03Fh                   ;

         MOV      CX,1                         ; считываем 1 байт в буфер

         MOV      DX,OFFSET      ROW     ;

         INT      21h

         cmp ROW,32  ; Space

         jz @EndCicle3

                sub ROW,48

                pop BX

                mov AX,BX

                mul TEN

                add AX,ROW

                mov BX,AX

                push BX

        jmp @Cicle3

        @EndCicle3:

        pop BX

        mov ROW,BX



         MOV     AX,NUMROWS

         MOV     CX,NUMCOLS

         MUL     CX                         ; AX = NUMROWS * NUMCOLS

        mov CX,AX



        mov SI,0

        @GlobalCicle:

                push CX



                mov BX,0

                push BX

                @Cicle4:

                 MOV      BX,HANDLE

                 MOV      AH,03Fh                   ;

                 MOV      CX,1                         ; считываем 1 байт в буфер

                 MOV      DX,OFFSET      TMP     ;

                 INT      21h

                 cmp TMP,32  ; Space

                 jz @EndCicle4

                        sub TMP,48

                        pop BX

                        mov AX,BX

                        mul TEN

                        add AX,TMP

                        mov BX,AX

                        push BX

                jmp @Cicle4

                @EndCicle4:



                pop BX

                mov buffer[SI],BL

                inc SI



                pop CX

        loop @GlobalCicle



         MOV Ah,3Eh

         MOV BX,HANDLE

         INT 21H

         RET

LOAD_FROM_FILE  ENDP

CALCULATE     PROC     NEAR

         MOV     BX, OFFSET BUFFER

         MOV     AX, ROW

         MOV     CX,NUMCOLS

         MUL     CX

         MOV     SI,AX

         MOV     CX, NUMCOLS

         mov     DX,SI

         mov al,[bx+si]

        xor ah,ah

         mov min,ax

         mov max,ax

        mov sredn,ax

         dec cx

         inc si

        jcxz @endcycle

@CYCLE1:

         MOV Al, [BX+SI]

        xor ah,ah

         CMP AX,MIN

         JA @NEXT1

         MOV MIN, AX

@NEXT1:

         inc SI

         LOOP @CYCLE1

         MOV CX, NUMCOLS

         MOV SI,DX

@CYCLE2:

         MOV Al, [BX+SI]

        xor ah,ah

         CMP AX,MAX

         JB @NEXT2

         MOV MAX, AX

@NEXT2:

         inc SI

         LOOP @CYCLE2



         MOV AX,MIN

         ADD AX,MAX

         SHR AX,1

         MOV SREDN,AX

@ENDCYCLE:

         RET

CALCULATE     ENDP

SAVE_TO_FILE     PROC     NEAR

         MOV      AH,03Ch                  ;

         MOV      CX,0                     ; открытие файла

         MOV      DX,OFFSET OUT_FNAME      ;

         INT      21h

         MOV      HANDLE,AX

        mov AX,min

        push AX

        mov stringlen,0



        @2Cicle1:

                pop AX

                xor ah,ah

                or AL,AL

                jz @2EndCicle1



                mov BX,AX

                div TEN

                push AX

                mul TEN

                sub BX,AX

                add BX,48  ; '0'



                mov CL,stringlen

                or CL,CL

                jz @end_disl1

                xor CH,CH

                mov SI,CX



                @dislocation1:

                        mov AL, string[SI-1]

                        mov string[SI], AL

                        dec SI

                loop @dislocation1

                @end_disl1:

                inc stringlen



                mov String[0],BL



                jmp @2Cicle1

        @2EndCicle1:

        MOV      BX,HANDLE                ;

        MOV      AH,040h                  ;¦

        MOV      CL,stringlen             ; сохранение MIN

        xor     ch,ch

        MOV      DX,OFFSET string         ;

        INT      21h



        mov MIN,32    ; Space

        MOV      BX,HANDLE

        MOV      AH,040h

        MOV      CX,1

        MOV      DX,OFFSET MIN

        INT      21h



        mov AX,max

        push AX

        mov stringlen,0



        @2Cicle2:

                pop AX

                xor ah,ah

                or AL,AL

                jz @2EndCicle2



                mov BX,AX

                div TEN

                push AX

                mul TEN

                sub BX,AX

                add BX,48  ; '0'



                mov CL,stringlen

                or CL,CL

                jz @end_disl2

                xor CH,CH

                mov SI,CX



                @dislocation2:

                        mov AL, string[SI-1]

                        mov string[SI], AL

                        dec SI

                loop @dislocation2

                @end_disl2:

                inc stringlen



                mov String[0],BL



                jmp @2Cicle2

        @2EndCicle2:

        MOV      BX,HANDLE                ;

        MOV      AH,040h                  ;¦

        MOV      CL,stringlen             ; сохранение MAX

        xor     ch,ch

        MOV      DX,OFFSET string         ;

        INT      21h



        mov MIN,32    ; Space

        MOV      BX,HANDLE

        MOV      AH,040h

        MOV      CX,1

        MOV      DX,OFFSET MIN

        INT      21h



        mov AX,sredn

        push AX

        mov stringlen,0



        @2Cicle3:

                pop AX

                xor ah,ah

                or AL,AL

                jz @2EndCicle3



                mov BX,AX

                div TEN

                push AX

                mul TEN

                sub BX,AX

                add BX,48  ; '0'



                mov CL,stringlen

                or CL,CL

                jz @end_disl3

                xor CH,CH

                mov SI,CX



                @dislocation3:

                        mov AL, string[SI-1]

                        mov string[SI], AL

                        dec SI

                loop @dislocation3

                @end_disl3:

                inc stringlen



                mov String[0],BL



                jmp @2Cicle3

        @2EndCicle3:

        MOV      BX,HANDLE                ;

        MOV      AH,040h                  ;¦

        MOV      CL,stringlen             ; сохранение SREDN

        xor     ch,ch

        MOV      DX,OFFSET string         ;

        INT      21h



        mov MIN,32    ; Space

        MOV      BX,HANDLE

        MOV      AH,040h

        MOV      CX,1

        MOV      DX,OFFSET MIN

        INT      21h





         MOV Ah,3Eh

         MOV BX,HANDLE

         INT 21H

         RET

SAVE_TO_FILE     ENDP

CODESG   ENDS

         END      BEGIN