char Cars[15]; //Название автомобілів
Оскільки в попередній роботі ми не зберігали назви автомобілів і їх кількість, то у вихідному файлі скрізь змінну NumCars доведеться замінити на car[0].NumCars (зберігати кількість автомобілів будемо в нульовому елементі масиву). При натисненні на кнопку ДОДАТИ нам доведеться додавати в масив ще два елементи. З кількістю автомобілів проблем не було, а ось з назвою не все так просто. Робити це потрібно з використанням стандартної функції копіювання рядка:
strcpy(car[NumCars].Cars, m edAdd);
У телі функції OnInitDialog() приберемо все зайве (ініціалізацію масивів) і додамо наступний код:
car[0].NumCars = 0; //На той випадок, якщо файлів не виявиться
FILE *F; //Файловая змінна
if ((F = fopen("base.dat", "r")) == NULL) //Если файл не існує, то AfxMessageBox("Файл 'base.dat' не знайдений!”); //выдать повідомлення
else //иначе прочитати файл в масив car і вивести назви { //автомобилей в список
fread(&car, sizeof(car), 1, F); fclose(F);
for (int i = 0; i < car[0].NumCars; i++) m_lbGarage.AddString(car[i].Cars);
}
Додаємо кнопку ВІДКРИТИ і прописуємо для неї:
{
CFileDialog fd(TRUE,NULL,"*.dat",NULL|*.*|(*.dat)|*.dat|"); int res = fd.DoModal();
if ( res = IDOK) //Если користувач вибрав ВІДКРИТИ
{
for (int i = car[0].NumCars - 1; i >= 0 ; i--)
{
m lbGarage.DeleteString(i); //Очистить списки m lbResult.DeleteString(i);
}
FILE *F;
if ((F = fopen(fd.GetPathName(), "r")) != NULL) //Прочитать файл
fread(&car, sizeof(car), 1, F); //и записати дані в масив fclose(F);
for (i = 0; i < car[0].NumCars; i++) //Вывести дані в список m lbGarage.AddString(car[i].Cars);
}
}
Кнопки ОК і Cansel ми вже видалили. Завдання з пункту 3 здійснимий в обробнику події, яка відповідає натисненню на кнопку ЗАПАМ'ЯТАТИ. Додамо туди наступний код (до що вже є):
CFileDialog fd(FALSE,NULL,"*.dat",NULL|*.*|(*.dat)|*.dat|"); int res = fd.DoModal(); if (res = IDOK)
{
FILE *F;
F = fopen(fd.GetPathName(), "w"); fwrite(&car, sizeof(car), 1, F); fclose(F);
}
При створенні об'єкту класу CFileDialog перший аргумент встановлює типа діалогу. Якщо він має значення TRUE, то відкривається вікно для відкриття файлу, інакше - для збереження.
Робота № 6
Використання повзунка і обробка повідомлень.
Мета роботи:
Вивчити порядок використання повзунка як елементу графічного інтерфейс Навчитися обробляти повідомлення, що отримуються програмою. Отримати практичні навики в написанні програм, оброблювальних повідомлення середовища Windows.
Створіть застосування за допомогою MFС AppWizard (exe) з діалоговим вікном як головне. Використовувати вирішену в лабораторних роботах № 4 і № 5 завдання, додавши в неї можливість змінювати мас; вантажу, що перевозиться, за допомогою елементу графічного інтерфейсу Slider (Повзунок)
Удосконалити отриману програму, додавши до методу, що переділяє положення движка обчислення оптимального варіанту використання автомобіля для перевезення вантажу заданою движком мас]
Розробити тестовий приклад (тобто задати декілька варіантів марок автомобілів різної вантажопідйомності, з різною витратою бензину: і різною його вартістю). Дані тестового прикладу вводити з файл< як робилося в роботі № 5. Досліджувати за допомогою елементу графічного інтерфейсу Slider, як змінюється вибір оптимального варіанту при зміні ваги вантажу, що перевозиться
Використовуємо злегка змінені вихідні коди з попередніх робіт, тому детально зупинятися на способах получения/обработки даних не будемо. Розглянемо лише роботу з повзунком і саму програму. У нас є кнопка ВІДКРИТИ, за допомогою якої вибираємо і стандартного діалогу один з файлів, створених нами в лабораторній роботі № 5. Дані з файлу завантажуються в масив, а назви автомобілів - в список. У діалозі також є редактор m_edOptimum. При пересуванні повзунка змінюватиметься маса вантажу, що перевозиться, і обчислюватися вартість поїздки. Залежно від результатів обчислень в редакторові m_edOptimum відображуватиметься назва автомобіля, найбільш відповідного для поїздки.
Додаємо змінну для повзунка. При цьому потрібно на вкладці Member Variables клацнути кнопку Add Variable., задати ім'я змінної (m_slider) і вибрати категорію Control. Потім додамо подію NM_CUSTOMDROW і назвемо обробник ім'ям OnReplace. Код буде таким:
{
m_edWeight = m slider.GetPos() * 50; //Получить масу вантажу
int Num, j = 0;
float n, z;
float m[10];
//---Обчислити к-ть поїздок і їх вартість
for (int i = 0; i < car[0].NumCars; i++)
{
Num = 1;
if (car[i].Tonnage > 0) //Если вантажопідйомність більше нуля {
Num = int(m edWeight / car[i].Tonnage); z = float(m edWeight)/ float(car[i].Tonnage); if (Num < z) Num = Num++;
}
m[i]= (car[i].Way/100)*car[i].Litres*car[i].Price*Num;
}
n = m[0];
for (i = 0; i < car[0].NumCars; i++) //Найти найменшу вартість {
m_edResult = m[i]; if ( m edResult < n)
{
j = i;
n = m edResult;
}
}
m_edResult = m[j];
m_edOptimum = car[j].Cars; //Получить авт-ль, соотв. наим. стоїмо. UpdateData(0);
*pResult = 0;
}
Результат роботи програми:

Робота № 7
Створення меню в Windows Application (на базі одиндокументного застосування). Підключення команд меню до коду програми.
Мета роботи:
Вивчити порядок створення застосування типа Single Document. Навчитися створювати свої пункти меню, підключати до них програмний код. Отримати практичні навики в написанні програм з розвиненим меню.
Створіть застосування за допомогою MFС AppWizard (exe), вибрати типа пропозиції Single document
Перейти на вкладку Res.., знайти ресурс IDR MAINFRAME -меню і перейти в редактор меню. За допомогою засобів візуального редактора меню створити новий пункт меню і до нього декілька підпунктів
Додати до кожного пункту створеного Вами меню програмний код який дозволяє виводити у вікні документа напису відповідне вибраному пункту меню (наприклад: ВИБРАНО 1 пункт меню або ВИБРАНИЙ 2 пункт меню і так далі)
Додати можливість програмного блокування і розблокування окремих пунктів меню, а також можливості зміни написів в пункті меню, установки галочок і крапок напроти написів (використовувати отриману на лекції інформацію)
Додати кнопки на панель інструментів і прив'язати до них команди меню, використовувати ресурс Toolbar. Зробити клавіші акселератори, використовуючи ресурс Accelerator
Додаємо пункт в меню який дозволяє нам ввести дані про автомобілі з файлу створеного в лабораторній роботі № 5. Виводимо отримані дані у вікно програми (використовувати матеріал лекції і попередніх лабораторних робіт)
Пункти і підпункти меню додаються елементарно, тому зупинятися на цьому не будемо. Спершу ініціалізували змінні int в і char punkts[50][16]. Масив punkts зберігатиме вибрані назви пунктів. Для цього клацаємо правою кнопкою миші на класі CLab_07Doc на вкладці CLassView і вибираємо пункт Add Member Variable, де вказуємо типа і ім'я змінної. Потім в класі CLab_07Doc двічі клацаємо по функції OnNewDocument(), де пишемо
в = 0;
strcpy(punkts[y], "Робота з меню");
Потім вибираємо клас CLab_07View і двічі клацаємо по функції OnDrow(). У телі функції пишемо:
void CLab 07View::OnDraw(CDC* pDC){
CLab 07Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
for (int i = 0; i <= pDoc->y; i++)
pDC->TextOut(0, i*20, pDoc->punkts[i]);
}
Як додати код до пункту? Вибираємо View -> ClassWizard -> Message Maps. У списку Object IDs вибираємо ідентифікатор потрібного пункту (для першого пункту в нашому випадку це ID_MENUITEM32771). У полі Class name має бути вибраний клас CLab_07View. У списку Messages вибираємо COMMAND і клацаємо кнопку Add Functions. Потім пишемо ім'я функції (для першого пункту хай буде OnFirstPunkt), клацаємо ОК і Edit Code. Пишемо такий код:
CLab 07Doc* pDoc = GetDocument();
strcpy(pDoc->punkts[++pDoc->y], "Перший пункт");
Invalidate(); //Перерисовать вікно
Те ж саме проробляємо з останніми пунктами.
Потім додаємо змінні в клас CLab_07View. Методика описана вищим. А змінні будуть такі:
bool block;
bool ch;
Cstring str;
Потім двічі клацаємо по функції CLab_07View() і ініціалізували змінні:
block = 1;
str = "Нова назва";
Потім для пункту ЗАБЛОКУВАТИ додаємо функцію UPDATE_COMMAND_UI і в її телі пишемо
pCmdUI->Enable(block);
Для пункту ЗАБЛОКУВАТИ додаємо функцію COMMAND і в її телі пишемо block = 0;
Що ж відбуватиметься? По клацанню на пункті ЗАБЛОКУВАТИ змінній block буде привласнено значення 0, функція UPDATE_COMMAND_UI набуде цього значення і виконає код
pCmdUI->Enable(block);
який і заблокує відповідний пункт меню (ЗАБЛОКУВАТИ).
Аналогічно поступаємо з іншими підпунктами. При цьому у функціях UPDATE_COMMAND_UI використовуваний наступні коди:
pCmdUI->SetText(str); //Установить текст напису pCmdUI->SetCheck(ch); //Установить\удалить галочку pCmdUI->SetRadio(ch); //Установить\удалить крапку
У обробниках відповідних подій можна написати:
ch = !ch;
Тоді по кожному клацанню змінною ch привласнюватиметься протилежне значення.
Далі до пунктів меню робимо кнопки на панелі. Знаходимо в ресурсах TolBar. У нім малюємо кнопки і розмішаємо їх на панелі. Клацаємо по потрібній кнопці, у властивостях кнопки вибираємо ID ідентифікатор пункту меню, до якого хочемо приробити кнопку. Для додавання акселераторів треба в ресурсах в теці Accelerator двічі клацаємо по IDR_MAINFRAME. На списку, що відкрився, клацаємо правою кнопкою і вибираємо New Accelerator. Вибираємо ID і поєднання клавіш. Ось що вийшло:

Частина III
1.1. Консольний режим роботи середовища Visual С++ 6.0
Програма, що створюється в середовищі Visual C++, завжди оформляється у вигляді окремого проекту. Проект (project) – це набір взаємозв'язаних вихідних файлів, призначених для вирішення певного завдання, компіляція і компоновка яких дозволяє отримати виконувану програму. У проект входять як файли, що безпосередньо створюються програмістом, так і файли, які автоматично створює і редагує середовище програмування.
Для створення нового проекту необхідно:
• вибрати File – New;
• у вікні, що відкрилося, на закладці Projects вибрати типа проекту Win32 Сonsole Application;
• у полі Project Name ввести ім'я проекту, наприклад maylab1;
• у полі Location ввести ім'я каталога, в якому буде розміщений проект і повна дорога до нього, наприклад D:\WORK\mylab1. Каталог також можна вибрати, використовуючи діалогове вікно Choose Directory, для чого треба клацнути мишею по кнопці . ;
• вказати типа створюваного проекту – Win32 Console Application;
• клацнути мишею по кнопці ОК;
• у вікні майстра застосувань Win32 Console Application, що відкрилося, – Step 1 of 1 вибрати An empty project (порожній проект) і клацнути по кнопці Finish;
• у вікні New Project Information (інформація про новий проект), що відкрилося, клацнути мишею по кнопці ОК.
Для роботи з консольним застосуванням необхідно створити новий або додати існуючий файл з текстом програми.
Для створення нового файлу необхідно:
• вибрати File – New;
• у що відкрився вікні на закладці Files вибрати типа файлу C++ Source File;
• у полі File name: ввести ім'я файлу. Для зручності бажано ввести ім'я, співпадаюче з ім'ям проекту, наприклад maylab1;
• клацнути мишею по кнопці ОК.
Для додавання в проект вже існуючого файлу з текстом програми необхідно:
• скопіювати наявний файл (розширення cpp) в робочу теку проекту;
• у вікні Workspace, закладка FileView, клацнути правою кнопкою миші по теці Source Files;
• у діалоговому вікні Insert Files, що відкрилося... вибрати файл, що додається, і клацнути мишею по кнопці ОК.
У теці проекту, як правило, розміщено п'ять файлів і одну вкладену теку. Файли мають наступне призначення.
Файл з розширенням dsw (наприклад mylab1.dsw) – файл проекту, який об'єднує всі вхідні в проект файли.
Файл з розширенням dsp (наприклад mylab1.dsp) призначений для побудови окремого проекту або підпроекту.
Файл з розширенням opt (наприклад mylab1.opt) містить всі налаштування даного проекту.
Файл з розширенням ncb (наприклад mylab1.ncb) – службовий файл.
Файл з розширенням cpp (наприклад mylab1.cpp) – файл тексту програми.
Функції для розрахунку математичних виразів знаходяться в бібліотеці math.lib (підключення бібліотеки: #include math.h). Всі аргументи в тригонометричних функціях задаються в радіанах. Параметри і аргументи всіх останніх функцій мають типа double (окрім abs(x)).
|
Математична функція |
Функція бібліотеки math.lib |
Опис |
|
|x| |
аbs(x) |
Обчислення абсолютного значення (лише для цілих чисел!) |
|
arccos(x) |
acos(x) |
Обчислення значення арккосинуса x |
|
arctg(x) |
atan(x) |
Обчислення значення арктангенса x |
|
arctg(x/y) |
atan2(x,y) |
Обчислення значення арктангенса двох аргументів x і y |
|
Округлення до більшого |
ceil(x) |
Функція повертає дійсне значення, відповідне найменшому цілому числу, яке більше або рівне x |
|
cos(x) |
cos(x) |
Обчислення косинуса x |
|
ch(x)= (ex+e(x) /2 |
cosh(x) |
Обчислення косинуса гіперболічного x |
|
ex |
exp(x) |
Обчислення експоненти числа x |
|
|x| |
fаbs(x) |
Обчислення абсолютного значення x |
|
Округлення до меншого |
floor(x) |
Функція повертає дійсне значення, відповідне найбільшому цілому числу, яке менше або рівне x |
|
Залишок від ділення x на y |
fmod(x,y) |
Функція повертає дійсне значення, відповідне залишку від цілочисельного ділення x на y |
|
ln(x) |
log(x) |
Обчислення натурального логарифма x |
|
lg10(x) |
log10(x) |
Обчислення десяткового логарифма x |
|
xy |
pow(x, в) |
Піднесення x до ступеня y |
|
sin(x) |
sin(x) |
Обчислення синуса x |
|
sh(x)= (ex(e(x) /2 |
sinh(x) |
Обчислення синуса гіперболічного x |
|
|
sqrt(x) |
Обчислення квадратного кореня x |
|
tg(x) |
tan(x) |
Обчислення тангенса x |
|
tgh(x) |
tanh(x) |
Обчислення тангенса гіперболічного x |