
Методуказания II семестр
.pdflv->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