Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методуказания II семестр

.pdf
Скачиваний:
11
Добавлен:
02.06.2015
Размер:
2.32 Mб
Скачать

lv->Columns->Add((i+1).ToString(), 30, HorizontalAlignment::Center); //

создаем очередной столбец

item1->SubItems->Add(w[i].ToString()); // присваиваем элементу этого столбца значение

}

lv->Items->Add(item1); // выводим значения текущей строки

}

(11) Функция инициализации элементов массива из исходного массива в рабочий private:System::Void init(){

b=new int[n]; // выделяем память для n элементов массива for(int i=0;i<n;i++)

b[i]=a[i]; // переписываем значения исходного массива (а) в рабочий

массив (b)

}

(14) Функция решения второй задачи private:System::Void task2(int z){

int i,j;

for (i = n-1; i >= 0; i--) // ищем последний положительный элемент if (b[i] > 0)

break;

if(i<0){

MessageBox::Show(this, "Положительных элементов нет!","Сообщение об ошибке", MessageBoxButtons::OK,MessageBoxIcon::Information); // выводим сообщение

return;

}

b=(int*)realloc(b,sizeof(int)*(n+1)); // увеличиваем память for (j = n; j > i; j--) // смещаем элементы вправо

b[j] = b[j-1];

b[i] = z; // записываем значение

vivod(grbWork,lvWork,b,n+1,"Задача №2: Вставить заданное число перед последним положительным элементом"); // вызываем функцию вывода элементов массива с соответствующими параметрами

}

События Формы

! События добавляются из списка событий () при двойном нажатии на соответствующем событии объекта. При этом, заголовок и скобки функции добавляются автоматически, вам остается добавить лишь код тела функции.

(1) Закрытие формы

private: System::Void Form1_Closed(System::Object^ sender, System::EventArgs^ e){ if(a!=NULL)

delete a; if(b!=NULL)

delete b;

}

События кнопок

(3) Подтверждение ввода количества элементов

private: System::Void btnN_Click(System::Object^ sender, System::EventArgs^ e){ try

{

n=Convert::ToInt32(this->txtN->Text); // переводим из строки в целое grbEl->Visible=true; // рамку для ввода элементов массива делаем видимой btnRnd->Focus(); // перемещаем фокус на кнопку ввода случайным образом

}

catch(...)

{

MessageBox::Show(this, "Введите число!","Сообщение об ошибке",

MessageBoxButtons::OK,MessageBoxIcon::Error); // сообщение об ошибке txtN->Text=""; // очищаем текстовое окно

txtN->Focus(); // перемещаем фокус в текстовое окно

}

}

(9) Подтверждение ввода очередного элемента массива

31

private: System::Void btnEl_Click(System::Object^ sender, System::EventArgs^ e){ static int vvod=0; // переменная ввода элементов с клавиатуры

try

{

a[vvod]=Convert::ToInt32(this->txtEl->Text); // переводим из строки в

целое

lblEl->Text=String::Concat("Введите ",(vvod+2).ToString()," элем."); //

записываем информацию в метку о номере вводимого элемента txtEl->Text=""; // текстовое окно очищаем txtEl->Focus(); // перемещаем фокус в текстовое окно

}

catch(...)

{

MessageBox::Show(this, "Введите число!","Сообщение об ошибке",

MessageBoxButtons::OK,MessageBoxIcon::Error); txtEl->Text="";

txtEl->Focus(); return;

}

vvod++;

vivod(grbBasic,lvBasic,a,n,""); // вызов функции вывода на экран элементов if(vvod==n){ // если введены все элементы массива

vvod = 0;

lblEl->Visible=false; // объект делаем невидимым txtEl->Visible=false; // -||- btnEl->Visible=false; // -||-

mnuTask->Enabled=true; //меню решения задач делаем доступным

}

}

(15) Подтверждение ввода заданного значения для задачи №2

private: System::Void btnz_Click(System::Object^ sender, System::EventArgs^ e){ try

{

int z=Convert::ToInt32(this->txtz->Text); task2(z);

pnlz->Visible=false;

}

catch(...)

{

MessageBox::Show(this, "Введите число!","Сообщение об ошибке",

MessageBoxButtons::OK,MessageBoxIcon::Error); txtz->Text="";

txtz->Focus();

}

}

(7) Ввод элементов массива случайным образом

private: System::Void btnRnd_Click(System::Object^ sender, System::EventArgs^ e){ a=new int[n];

for(int i=0;i<n;i++) a[i]=rand()%20-10;

vivod(grbBasic,lvBasic,a,n,""); // вызов функции вывода на экран элементов mnuTask->Enabled=true; // меню решения задач делаем доступным

}

(8) Ввод элементов массива с клавиатуры

private: System::Void btnKlav_Click(System::Object^ sender, System::EventArgs^ e){ a=new int[n];

for(int i=0;i<n;i++) a[i]=0;

lblEl->Text=S"Введите 1 элем."; lblEl->Visible=true; txtEl->Visible=true; btnEl->Visible=true; txtEl->Focus();

32

}

События текстовых окон

(4) Информация в текстовом окне изменилась (значение количества элементов массива) private: System::Void txtN_TextChanged(System::Object^ sender, System::EventArgs^ e){

grbEl->Visible=false; grbBasic->Visible=false; grbWork->Visible=false; mnuTask->Enabled=false;

}

(5) Нажатие Enter в текстовом окне ввода количества элементов массива private: System::Void txtN_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e){

if(e->KeyChar==13) // если нажата кнопка клавиатуры Enter btnN_Click( sender, e); // вызываем событие кнопки Ок

}

(10) Нажатие Enter в текстовом окне ввода количества элементов массива private: System::Void txtEl_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e){

if(e->KeyChar==13) btnEl_Click( sender, e);

}

(16) Нажатие Enter в текстовом окне ввода заданного значения для задачи №2 private: System::Void txtz_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e){

if(e->KeyChar==13) btnz_Click( sender, e);

}

События меню

(12) Решение задачи №1

private: System::Void mnu1_Click(System::Object^ sender, System::EventArgs^ e){ init(); // вызов функции инициализации

int m = 0, p, j, i;

for (i = n-1; i >= 0; i --)

{

if (b[i] % 2 == 0)

{

m++;

p = b[i];

for (j = i; j < n-m; j++) b[j] = b[j+1];

b[j] = p;

}

}

vivod(grbWork,lvWork,b,n,"Задача №1: Четные элементы массива переставить в конец массива");

}

(13) Подготовка к решению задачи №2

private: System::Void mnu2_Click(System::Object^ sender, System::EventArgs^ e){ init();

pnlz->Visible=true; // панель для ввода заданного значения делаем видимой txtz->Focus(); // передаем фокус в текстовое окно

}

(2) Выход из приложения

private: System::Void mnuExit_Click(System::Object^ sender, System::EventArgs^ e){ Close(); // закрытие приложения

}

33

ПРИМЕР СТРУКТУРЫ ПРИЛОЖЕНИЯ

Задачи

 

 

 

Меню формы

 

Выход

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Задача №1

 

 

mnu1_

 

 

 

 

 

 

 

 

 

 

 

mnuExit_

 

 

 

 

 

 

 

 

Click

 

 

 

 

btnN_Click

 

 

Количество

 

 

 

Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

элементов

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Задача №2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

btnRnd_Click

 

 

Случайным

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

vivod

 

 

 

 

 

 

 

образом

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

mnu2_

 

 

 

 

 

 

 

 

btnKlav_Click

 

 

С клавиатуры

 

 

 

 

 

 

 

 

Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

task2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

btnEl_Click

 

 

Ввод

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

элемента

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

btnz_Click

КнопкиЗаданный элемент

ЛАБОРАТОРНАЯ РАБОТА №10

Сортировка

Цель работы: ознакомиться с различными видами сортировки элементов одномерного массива.

План работы: в течение четырех занятий студент должен изучить материал текущей лабораторной работы и продемонстрировать свои навыки преподавателю. В результате чего студент получает две оценки: за приложение и за изученный материал.

Задание: создать приложение в соответствии с заданным вариантом для выполнения сортировки элементов одномерного массива.

Требования:

3.Ввод размера массива (n), где значения данных формируются случайным образом и должны находиться в диапазоне от –m до m (п. 12.4);

4.Алгоритм работы: открывается приложение; вводится размер массива и диапазон чисел; выбирается какой массив нужно формировать (целочисленный, с плавающей точкой); выводится на экран сформированный исходный массив; меню: создать новый массив, отсортировать одним способом, отсортировать другим способом, выход. Если новый, то сначала: вводится размер массива; выбирается какой массив нужно ...

5.Отображение данных: отсортированный массив, время начала сортировки, время окончания сортировки, время сортировки массива (п. 13.2). Точность результата до сотых долей секунды. Например:

Случайный массив

время начала сортировки

12:15:26.34

время окончания сортировки

12:15:29.82

время сортировки массива

3.48

Отсортированный массив

 

время начала сортировки

12:15:30.01

34

время окончания сортировки

12:15:30.93

время сортировки массива

0.92

Требование к отчету:

1.Номер и название лабораторной работы.

2.Текст задания.

3.Список идентификаторов.

4.Структура приложения.

5.Блок-схема алгоритма.

6.Программные коды.

7.Результаты вычислений.

8.Вывод.

Пояснения:

7. Результаты вычислений.

Заполнить следующую таблицу:

 

Кол-во

 

Время, с

 

 

 

 

 

 

 

 

 

 

 

Случайный

 

Упорядоченный

 

 

 

 

 

 

 

 

 

[-10;10]

[-10000;10000]

 

[-10;10]

[-10000;10000]

 

 

 

 

 

 

 

Название

1000

 

 

 

 

 

 

 

 

 

 

 

10000

 

 

 

 

 

сортировки №1

 

 

 

 

 

 

 

 

 

 

 

 

100000

 

 

 

 

 

 

 

 

 

 

 

 

Название

1000

 

 

 

 

 

 

 

 

 

 

 

10000

 

 

 

 

 

сортировки №2

 

 

 

 

 

 

 

 

 

 

 

 

100000

 

 

 

 

 

 

 

 

 

 

 

 

8. Вывод.

Пояснить почему одна сортировка выполняется быстрее или медленнее другой ссылаясь на алгоритм.

Перечень некоторых функций

Функция

Синтаксис

Описание

Файл

gettime

void gettime(struct time *timep)

Заносит в timep текущее время

dos.h

settime

void settime(struct time *timep)

Задает timep как системное время

dos.h

time

time_t time(time_t *timer)

Возвращает текущее время и заносит его в timer

time.h

 

 

(если timer не NULL)

 

difftime

double difftime(time_t time2, time_t time1);

Возвращает разницу между двумя значениями

time.h

 

 

времени в секундах

 

Пример функции выполнения сортировки

Функция сортировки

{

//запоминание времени начала сортировки long t;

struct timeb start, finish; ftime(&start);

//алгоритм сортировки

//запоминание времени окончания сортировки ftime(&finish);

//печать отсортированного массива

35

// вычисление и вывод времени сортировки с точностью до долей секунды if(finish.millitm<start.millitm) t=finish.millitm+1000-start.millitm;

else t=finish.millitm-start.millitm;

printf ("\nTime: %5d.",finish.time-start.time);printf ("%d sec",t);

}

Литература по сортировке

1.Вирт Н. Алгоритмы и структуры данных: Пер. с англ. - М.: Мир, 1989, - 360 с.

2.Кнут Д. Искусство программирования для ЭВМ. т.3. Сортировка и поиск: Пер. с англ., -

М.: Мир, 2001, 832 с.

3.Лорин Г. Сортировка и системы сортировки. - Издательство «Наука». 1983. – 384с.

ЛАБОРАТОРНАЯ РАБОТА №11

Работа с динамическими структурами данных

Цель работы: ознакомиться с работой списков и бинарных деревьев.

План работы: в течение шести занятий студент должен изучить материал текущей лабораторной работы и продемонстрировать свои навыки преподавателю. В результате чего студент получает две оценки: за приложение и за изученный материал.

Задание: создать приложение в соответствии с заданным вариантом для выполнения следующих операций над динамическими структурами данных:

отображение всех данных (если список двусвязный, то вывести данные в прямом и обратном порядке);

отображение выбранных данных (поиск) (1);

ввод новых данных (добавление) (2);

удаление выбранных данных (3);

редактирование необходимых данных (4).

сохранить список в файл;

открыть список из файла.

Требование к отчету:

1.Номер и название лабораторной работы.

2.Текст задания.

3.Структура приложения.

4.Таблица свойств объектов.

5.Определение структурного типа.

6.Перечисление функций (название и назначение) для работы со структурой.

7.Список идентификаторов.

8.Блок-схема алгоритма.

9.Программные коды.

Тестовое задание: создать приложение для работы с динамическими структурами данных:

1.Односвязный линейный список.

2.Добавить элемент в конец списка.

3.Удалить элемент по указанному номеру.

36

Формы в процессе проектирования и выполнения

Form1

Elements

Таблица свойств объектов отличных от по умолчанию

Form1

Контейнер

Объект

Name

Text

Другие свойства

 

ContextMenuStrip

contextMenu

 

 

 

Label

lblStatus

lblStatus

 

 

 

 

 

Columns: №,

 

ListView

lvList

 

Название, Дата, Цена

Form

 

GridLines: true

 

 

 

 

 

 

View: Details

 

 

 

 

 

MenuStrip

menuStrip1

 

 

 

OpenFileDialog

openDlg

 

 

 

SaveFileDialog

saveDlg

 

 

 

Timer

timer1

 

Interval: 500

 

 

mnuFile

Файл

 

 

 

mnuOpen

Открыть

ShortcutKeys: Ctrl+O

 

 

mnuSave

Сохранить

ShortcutKeys: Ctrl+S

menuStrip1

ToolStripMenuItem

mnuClear

Очистить

ShortcutKeys: Ctrl+G

 

 

mnuEdit

Правка

 

 

 

mnuAdd

Добавить

ShortcutKeys: Ctrl+Ins

 

 

mnuExit

Выход

 

contextMenu

ToolStripMenuItem

mnuDel

Удалить

 

37

Elements

Контейнер

Объект

Name

Text

Другие свойства

 

Label

label1

Название

 

 

label2

Дата

 

 

 

label3

Цена

 

Elements

TextBox

txtName

 

 

txtPrice

 

 

 

 

 

 

 

MaskedTextBox

mtxDate

 

Mask: 00/00/00

 

Button

Добавить

btnOk

 

 

Отмена

btnCancel

DialogResult: Cancel

 

 

Программные коды stdafx.h

#pragma once #include<string.h> #include<stdio.h> #include "Elements.h"

class sklad{ public:

sklad* add(sklad* ph, wchar_t *n, wchar_t *d, float p){ sklad * ptmp = new sklad;

wcscpy_s(ptmp->name, n); wcscpy_s(ptmp->dat, d); ptmp->price = p; ptmp->next=NULL; if(!ph)

ph = ptmp;

else{

sklad * p = new sklad; int i=0;

for(p=ph;p->next!=NULL;i++,p=p->next); i=i;

p->next=ptmp;

}

return ptmp;

};

sklad* del(sklad* ph, int num){ sklad * p = new sklad;

if(num == 1 && ph->next == NULL) ph = NULL;

else if(num == 1) ph = ph->next;

else{

sklad * pr = new sklad;

for(p = ph; num > 1; pr = p, num--, p = p->next); if(p->next == NULL){

pr->next = NULL; delete p;

}

else{

pr->next = p->next; delete p;

}

}

return ph;

}

int save(sklad* ph, wchar_t *filename){ if(!ph){

return 0;

}

38

FILE *f1; // указатель на поток errno_t err;

if((err =_wfopen_s(&f1, filename, L"wt+,ccs=UTF-8")) != 0)

{

return 0;

}

sklad * p = new sklad; for(p=ph;p!=NULL;p=p->next)

fwprintf(f1, L"%30s %15s %f\n",p->name, p->dat, p->price); fclose(f1);

return 1;

}

sklad* open(wchar_t *filename){

FILE *f1; // указатель на поток errno_t err;

if((err =_wfopen_s(&f1, filename, L"rt+,ccs=UTF-8"))!= 0)

{

return NULL;

}

sklad * ph = NULL; sklad * p = NULL; wchar_t n[30], d[9]; float pr;

while( !feof( f1 ) ){

fwscanf(f1, L"%30s %15s %f\n", n, d, &pr); p = p->add(ph, n, d, pr);

if(!ph)

ph = p;

}

fclose(f1); return ph;

}

static int kol; sklad *next; wchar_t name[30]; wchar_t dat[9]; float price;

};

Form1.h

В разделе «public ref class Form1 : public System::Windows::Forms::Form» объявляем переменные

private: sklad * tovar; private: sklad * ph;

После #pragma endregion static int number = 0; static bool needSave = false;

private: wchar_t* StringToWchar(String^ str){ wchar_t* wch = new wchar_t[str->Length + 1]; array<Char>^ arr = str->ToCharArray(); for(int i = 0; i < str->Length ; i++)

wch[i] = arr[i]; wch[str->Length] = '\0';

return wch;

}

private: String^ WcharToString(wchar_t* wch){ String^ str;

str = gcnew String(wch); return str;

}

private: void vivod(){

39

for(tovar=ph;tovar!=NULL;tovar=tovar->next){

ListViewItem^ newItem = gcnew ListViewItem((++number).ToString()); lvList->Items->Add(newItem); newItem->SubItems->Add(WcharToString(tovar->name)); newItem->SubItems->Add(WcharToString(tovar->dat)); newItem->SubItems->Add((tovar->price).ToString());

}

}

private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { lblStatus->Visible=false;

}

private: System::Void mnuExit_Click(System::Object^ sender, System::EventArgs^ e) { Close();

}

private: System::Void mnuAdd_Click(System::Object^ sender, System::EventArgs^ e) { Elements^ frmEl = gcnew Elements;

frmEl->ShowDialog();

if(frmEl->DialogResult == ::DialogResult::OK){ needSave = true;

ListViewItem^ newItem = gcnew ListViewItem((++number).ToString()); lvList->Items->Add(newItem); newItem->SubItems->Add(frmEl->getName()); newItem->SubItems->Add(frmEl->getDate()); newItem->SubItems->Add((frmEl->getPrice()).ToString());

tovar = tovar->add(ph, StringToWchar(frmEl->getName()), StringToWchar(frmEl->getDate()), frmEl->getPrice());

if(!ph) ph=tovar;

}

}

private: System::Void mnuClear_Click(System::Object^ sender, System::EventArgs^ e){ needSave = false;

lvList->Items->Clear(); number = 0;

}

private: System::Void mnuSave_Click(System::Object^ sender, System::EventArgs^ e) { saveDlg->Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"; saveDlg->FilterIndex = 1;

saveDlg->RestoreDirectory = true;

if ( saveDlg->ShowDialog() == ::DialogResult::OK ){ needSave = false;

timer1->Enabled = true;

String^ fileName = saveDlg->FileName; if(ph->save(ph,StringToWchar(fileName)) == 1){

lblStatus->ForeColor = Color::Blue; lblStatus->Text = "Файл успешно сохранен";

}

else{

lblStatus->ForeColor = Color::Red; lblStatus->Text = "Файл сохранить не удалось";

}

}

}

private: System::Void mnuOpen_Click(System::Object^ sender, System::EventArgs^ e) { openDlg->FileName = "";

openDlg->Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"; openDlg->FilterIndex = 1;

openDlg->RestoreDirectory = true;

if ( openDlg->ShowDialog() == ::DialogResult::OK ){ String^ fileName = openDlg->FileName;

ph = ph->open(StringToWchar(fileName)); timer1->Enabled = true;

if(ph){

40