}
}
UpdateData(0); //Вывести дані в редактори
}
Тут m_radio - змінна, пов'язана з групою перемикачів.
На малюнку представлений результат роботи програми:

Робота № 4
Графічний інтерфейс з використанням списків, комбінованих полів. Вирішення завдань, що використовують елементи графічного інтерфейсу, що вивчаються, масиви і структури даних.
Мета роботи:
Навчитися користуватися списками і комбінованими полями, а також використовувати структури і масиви мови VC++. Отримати практичні навики по використанню різних елементів графічного інтерфейсу і операторів мови VC++.
Створіть застосування за допомогою MFС AppWizard (exe), з діалоговим вікном як головне. Вирішити на основі даного застосування завдання з лабораторної роботи №3 У гаражі є декілька різних автомобілів (наприклад: Ваз, Газель, Газ-66, Мерседес), кожен автомобіль має свою витрату палива на 100 км. дороги, а також свою вартість палива. Програма повинна обчислювати вартість поїздки для заданої машини. Використовувати списки і комбіновані поля. Для зберігання даних використовувати масиви або структуру даних
Удосконалити отриману в першому пункті програму, додавши режим заповнення даних для кожного автомобіля. При створенні програми мати на увазі, що кількість автомобілів заздалегідь не відома, заповнювати список марок автомобілів в ході виконання програми. Передбачити можливість видалення марок авто із списку
Удосконалити отриману програму додати вантажопідйомність автомобілів, і можливість вказувати вагу вантажу, що перевозиться. Програма повинна розрахувати оптимальний варіант за вартістю перевезення вантажу
Удосконалити отриману програму. Програма повинна виконувати розрахунок і виводити результати і вихідні дані по клацанню на елемент списку або комбінованого поля
Виконаємо всі завдання в одній програмі.
Створюємо редактор (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);
}
}
А тепер для кнопки ВИДАЛИТИ:
{
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(); //Обновить списки і выч. кол. поїздок
}
Тут ми записуємо дані в масиви, потім заново проводимо всі обчислення і оновлюємо екран.
Додамо кнопку ОПТИМАЛЬНИЙ ВАРІАНТ. У обробнику буде код:
{
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++. Використання файлів для зберігання даних.
Мета роботи:
Вивчити прийоми роботи з файлами і способи створення файлів. Отримати практичні навики по використанню файлів для зберігання інформації.
Створіть застосування за допомогою MFС AppWizard (exe), з діалоговим вікном як головне. Використовувати вирішену в лабораторній роботі № 4 завдання, додавши в неї можливість запису внесених до структури даних у файл на диску і можливість в подальшому записати дані з файлу в структуру
Удосконалити отриману в першому пункті програму, додавши режим вибору файлу в стандартному діалозі Windows
Удосконалити отриману програму додавши до кнопок ОК і Cancel Програмний код що нагадує про можливість збереження даних на диску
Підемо тим же дорогою, що і лабораторній роботі № 4, тобто виконаємо всі завдання в одній програмі. Спершу додамо в структуру ще два елементи: