Материал: metodichka_u_praktika

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

}

}

UpdateData(0); //Вывести дані в редактори

}

Тут m_radio - змінна, пов'язана з групою перемикачів.

На малюнку представлений результат роботи програми:

Робота № 4

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

Мета роботи:

Навчитися користуватися списками і комбінованими полями, а також використовувати структури і масиви мови VC++. Отримати практичні навики по використанню різних елементів графічного інтерфейсу і операторів мови VC++.

  1. Створіть застосування за допомогою MFС AppWizard (exe), з діалоговим вікном як головне. Вирішити на основі даного застосування завдання з лабораторної роботи №3 У гаражі є декілька різних автомобілів (наприклад: Ваз, Газель, Газ-66, Мерседес), кожен автомобіль має свою витрату палива на 100 км. дороги, а також свою вартість палива. Програма повинна обчислювати вартість поїздки для заданої машини. Використовувати списки і комбіновані поля. Для зберігання даних використовувати масиви або структуру даних

  2. Удосконалити отриману в першому пункті програму, додавши режим заповнення даних для кожного автомобіля. При створенні програми мати на увазі, що кількість автомобілів заздалегідь не відома, заповнювати список марок автомобілів в ході виконання програми. Передбачити можливість видалення марок авто із списку

  3. Удосконалити отриману програму додати вантажопідйомність автомобілів, і можливість вказувати вагу вантажу, що перевозиться. Програма повинна розрахувати оптимальний варіант за вартістю перевезення вантажу

  4. Удосконалити отриману програму. Програма повинна виконувати розрахунок і виводити результати і вихідні дані по клацанню на елемент списку або комбінованого поля

Виконаємо всі завдання в одній програмі.

Створюємо редактор (EditBox) і пов'язуємо з ним змінну m_edAdd типа CString. Створюємо список ListBox, з яким зв'язуємо змінну m_lbGarage. Додаючи змінну для списку в полі Category потрібно вибрати значення Control. Створимо ще один список і пов'яжемо його із змінною m_lbResult. У цей список заноситимемо результати обчислень. Створимо також кнопки ДОДАТИ і ВИДАЛИТИ, за допомогою яких будемо добавлять/удалять елементи, і кнопку ЗАПАМ'ЯТАТИ, за допомогою якої записуватимемо дані в масиви.

На вкладці ClassView розкриваний Clab_04_1Dlg і двічі клацаємо OnInitDialog(). Переходимо в початок файлу і після директиви #e оголошуємо структуру і змінні:

struct Garage {

float Litres; //Витрата палива

float Price; //Цена одного літра

float Way; //Відстань

int Tonnage; //Вантажопідйомність

int Weight; //Вага вантажу

};

Garage car[10]; //Оголосити масив

float Result; //Оголосити змінну

int NumCars; //Кількість автомобілів в списку

Слід звернути увагу на крапку з комою після останньої фігурної дужки. При оголошенні структур і класів вона обов'язкова (на відміну від оголошення функцій).

Потім знову клацаємо двічі по OnInitDialog() і в тіло функції CLab_04_1Dlg::OnInitDialog() додаємо наступний код:

CDialog::OnInitDialog(); //Це додавати не треба (вже є)

// Додамо в список автомобілі

m_lbGarage.AddString("ВАЗ"); m_lbGarage.AddString("Газель"); m_lbGarage.AddString("ГАЗ-66"); m_lbGarage.AddString("Мерседес");

// Заповнюємо масив даних: ВАЗ

car[0].Litres = 8.5; car[0].Price = 15; car[0].Way = 100;

car[0].Tonnage = 400; car[0].Weight = 500;

//---Газель

car[1].Litres = 15; car[1].Price = 12; car[1].Way = 100;

car[1].Tonnage = 1500; car[1].Weight = 500;

// ГАЗ-66

car[2].Litres = 30; car[2].Price = 10; car[2].Way = 100;

car[2].Tonnage = 3500; car[2].Weight = 500;

// Мерседес

car[3].Litres = 10; car[3].Price = 17; car[3].Way = 100;

car[3].Tonnage = 500; car[3].Weight = 500;

NumCars = 4; //У нас доки чотири автомобілі

m_lbGarage.SetCurSel(0); //Вибрати 1-й елемент списку (ВАЗ)

// Вивести дані про Вазу в редактори

m_edLitres = car[0].Litres; m_edPrice = car[0].Price; m_edWay = car[0].Way;

m_edTonnage = car[0].Tonnage; m_edWeight = car[0].Weight; m_edNum = 2;

UpdateData(0);

Result = (m_edWay/100)*m_edLitres*m_edPrice*m_edNum;

CString s; //Сформувати об'єкт класу CString

s.Format("%0.2f", Result); //Преобразовать число в рядок m_lbResult.AddString(s); m_lbResult.AddString("?"); m_lbResult.AddString("?"); m_lbResult.AddString("?");

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

Обчислення результату проводитимемо безпосередньо в обробнику події, яка відповідає клацанню за списком автомобілів. Вибираємо подію LBN_SELCHANGE і пишемо там:

void CLab 04 1Dlg::OnGarage()

{

int x = m lbGarage.GetCurSel(); //Отримати позицію в списку m_edLitres = car[x].Litres; m_edPrice = car[x].Price; m_edWay = car[x].Way;

m_edTonnage = car[x].Tonnage; m_edWeight = car[x].Weight;

float z; //Объявить змінну

if (m edTonnage > 0) //Якщо вантажопідйомність більше нуля {

//---Обчислити к-ть поїздок

m_edNum = int(m_edWeight / m_edTonnage);

z = float(m_edWeight)/ float(m_edTonnage);

if (m_edNum < z) m_edNum = m_edNum++;

}

else m_edNum = 1;

Result = (m_edWay/100)*m_edLitres*m_edPrice*m_edNum;

CString s; //Сформировать об'єкт класу CString s.Format("%0.2f", Result); //Перетворити число в рядок

m_lbResult.DeleteString(x); //Видалити рядок із списку m_lbResult.InsertString(x, s); //Вставити в сп. стор. з результатом m_lbResult.SetCurSel(x); //Виділити рядок

UpdateData(0);

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

Далі додамо обробник для кнопки ДОДАТИ:

void CLab 0 4 1Dlg::OnAdd()

{

UpdateData(1); //Отримати дані if (m_edAdd != "" && NumCars < 10)

{

m_lbGarage.AddString(m edAdd); //Додати рядок в список

car[NumCars].Litres = m_edLitres;

car[NumCars].Price = m_edPrice;

car[NumCars].Way = m_edWay;

car[NumCars].Tonnage = m_edTonnage;

car[NumCars].Weight = m_edWeight;

float z; //Объявить змінну

if (m_edTonnage > 0) //Якщо вантажопідйомність більше нуля {

//---Обчислити к-ть поїздок

m_edNum = int(m_edWeight / m_edTonnage); z = float(m_edWeight)/ float(m_edTonnage); if ( m_edNum < z) m_edNum = m_edNum++;

}

else m_edNum = 1; car[NumCars].Num = m_edNum;

Result = (m_edWay/100)*m_edLitres*m_edPrice*m_edNum;

CString s; //Сформировать об'єкт класу CString

s.Format("%0.2f", Result); //Перетворити число в рядок m_lbResult.AddString(s); //Додати рядок в 2-й список m_lbGarage.SetCurSel(NumCars); //Виділити рядок m_lbResult.SetCurSel(NumCars); //Виділити рядок

NumCars++; //Збільшити к-ть автомобілів в списку

UpdateData(0);

}

}

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

Далі додамо обробник для кнопки ДОДАТИ:

void CLab 0 4 1Dlg::OnAdd()

{

UpdateData(1); //Получить дані if (m_edAdd != "" && NumCars < 10)

{

m_lbGarage.AddString(m edAdd); // Додати ь рядок в список

car[NumCars].Litres = m_edLitres;

car[NumCars].Price = m_edPrice;

car[NumCars].Way = m_edWay;

car[NumCars].Tonnage = m_edTonnage;

car[NumCars].Weight = m_edWeight;

float z; //Объявить змінну

if (m edTonnage > 0) //Если вантажопідйомність більше нуля {

//---Обчислити к-ть поїздок

m_edNum = int(m edWeight / m_edTonnage);

z = float(m_edWeight)/ float(m_edTonnage); if ( m edNum < z) m_edNum = m_edNum++;

}

else m_edNum = 1; car[NumCars].Num = m_edNum;

Result = (m edWay/100)*m_edLitres*m_edPrice*m_edNum;

CString s; //Сформировать об'єкт класу CString

s.Format("%0.2f", Result); //Перетворити число в рядок m_lbResult.AddString(s); //Додати рядок в 2-й список m_lbGarage.SetCurSel(NumCars); //Виділити рядок m_lbResult.SetCurSel(NumCars); //Виділити рядок

NumCars++; //Збільшити к-ть автомобілів в списку

UpdateData(0);

}

}

А тепер для кнопки ВИДАЛИТИ:

Void cLab_04 1Dlg::OnDel()

{

Garage Mas[10]; //Объявить масив для тимчасового зберігання даних int x = m lbGarage.GetCurSel(); //Получить поз. курсора в списку for (int i = 0; i < NumCars; i++) Mas[i]= car[i]; if (NumCars > 0) NumCars--; //Уменьшить к-ть автомобілів

for (i = 0; i < NumCars; i++) //Удалить соотв. запис з if (i < x) car[i]= Mas[i]; //массива даних else car[i]= Mas[i + 1]; m_lbGarage.DeleteString(x); //Удалить соотв.

m_lbResult.DeleteString(x); //строки із списків

if (NumCars > 0) //Если в списку залишилися рядки

{

m_lbGarage.SetCurSel(NumCars - 1); //Установить курсор на m_lbResult.SetCurSel(NumCars - 1); //последнюю рядок CLab_04_1Dlg::OnGarage(); //Обновить дані на екрані

};

}

Додамо два прапорці: ВСТАНОВИТИ ВАГУ ВАНТАЖУ ДЛЯ ВСІХ (m_cbWeight) і ВСТАНОВИТИ ВІДСТАНЬ ДЛЯ ВСІХ (m_cbWay). Якщо який-небудь з цих прапорців встановлений, то при записі даних відповідно вага вантажу або відстань будуть встановлена однаковими для всіх автомобілів. Додамо обробник для кнопки ЗАПАМ'ЯТАТИ:

void CLab 04 1Dlg::OnSave()

{

int x = m lbGarage.GetCurSel(); //Получить поз. курсора в сп. UpdateData(1); //Получить дані

car[x].Litres = m_edLitres; car[x].Price = m_edPrice; car[x].Tonnage = m_edTonnage;

if (m cbWay == 0) car[x].Way = m_edWay; else

for (int i = 0; i < NumCars; i++) car[i].Way = m_edWay; if (m_cbWeight == 0) car[x].Weight = m_edWeight; else

for (int i = 0; i < NumCars; i++) car[i].Weight = m edWeight; for (int i = 0; i < NumCars; i++)

{

m_lbGarage.SetCurSel(i); //Установить поз. курсора в сп.

CLab 04 1Dlg::OnGarage(); //Обновить списки і выч. кол. поїздок UpdateData(0); //Обновить дані

}

m_lbGarage.SetCurSel(x); //Вернуться до поточної поз. курсора CLab_04_1Dlg::OnGarage(); //Обновить списки і выч. кол. поїздок

}

Тут ми записуємо дані в масиви, потім заново проводимо всі обчислення і оновлюємо екран.

Додамо кнопку ОПТИМАЛЬНИЙ ВАРІАНТ. У обробнику буде код:

Void cLab 04 1Dlg::OnOptimum()

{

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

{

m_lbGarage.SetCurSel(i); //Установить поз. курсора в сп.

CLab 04 1Dlg::OnGarage(); //Обновить списки і выч. кол. поїздок UpdateData(0); //Обновить дані

}

if (NumCars > 0)

{

CString st;

m_lbResult.GetText(0, st); //Получить перший елемент списку Result = atof(st); //и перетворити його в число

int j = 0; float n;

for (i = 1; i < NumCars; i++) //Найти найменшу вартість {

m_lbResult.GetText(i, st); //Получить елемент списку n = atof(st); //и перетворити його в число

if ( n < Result) //Если він менше отриманого раніше

{

Result = n; j = i;

}

}

m_lbGarage.GetText(j, st); //Получить авт-ль, соотв. наим. стоїмо. st = "Оптимальний варіант - автомобіль " + st;

AfxMessageBox(st); //Вывести повідомлення

}

}

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

Робота № 5

Робота з файлами в VC++. Використання файлів для зберігання даних.

Мета роботи:

Вивчити прийоми роботи з файлами і способи створення файлів. Отримати практичні навики по використанню файлів для зберігання інформації.

  1. Створіть застосування за допомогою MFС AppWizard (exe), з діалоговим вікном як головне. Використовувати вирішену в лабораторній роботі № 4 завдання, додавши в неї можливість запису внесених до структури даних у файл на диску і можливість в подальшому записати дані з файлу в структуру

  2. Удосконалити отриману в першому пункті програму, додавши режим вибору файлу в стандартному діалозі Windows

  3. Удосконалити отриману програму додавши до кнопок ОК і Cancel Програмний код що нагадує про можливість збереження даних на диску

Підемо тим же дорогою, що і лабораторній роботі № 4, тобто виконаємо всі завдання в одній програмі. Спершу додамо в структуру ще два елементи:

Источник: https://studfile.net/preview/14533173/