
- •Мета роботи
- •Зміст пояснювальної записки
- •Приклад оформлення титульного аркуша
- •Пояснювальна записка
- •Вимоги до виконання і оформлення роботи
- •Варіанти розрахунково-графічної роботи
- •Умова типового варіанта
- •Реалізація типового варіанта
- •Обробка масивів чисел
- •Реалізація апроксимації у середовищі excel
- •Апроксимація функції у середовищі mathcad
- •Метод найменших квадратів
- •Додаток 2 розв’язання системи рівнянь методом гаусса
- •Додаток 3 текст класу рисування графіка
- •Бібліографічний список
Умова типового варіанта
Перетворити одновимірний масив дійсних чисел Y(N) = {0.2, -7.8, 2.5, -6.3, 1.3, 5.9, 4.4, 7.8, 0.3} у масив V за формулою Vj = cosYj, де j = 1..N (N = 9). Оформити підпрограму перетворення масиву Y у масив чисел V.
Замінити додатні елементи одержаного масиву V їх кубами, а від’ємні – найменшим елементом масиву. Оформити підпрограму виконання вказаних дій над масивом А(a1, a2, ..., an).
Перетворити одновимірний масив V(9) у двовимірний W(3, 3): розрізати умовно масив V на три смужки; помістити потім під першою смужкою другу, під другою – третю. Використати при цьому підпрограму перетворення одновимірного масиву А(n) у двовимірний масив дійсних чисел B(m, m).
Скласти масив з добутків елементів кожного стовпця одержаної вище матриці. Оформити підпрограму виконання вказаних дій над масивом В(m, m).
Знайти коефіцієнти поліномів другого степеня, що апроксимують таблично задану функцію yi = f(xi) (i = 1..n) методом найменших квадратів:
x |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
y |
0.5 |
0.8 |
1.3 |
2.5 |
2.1 |
1.9 |
1.5 |
Реалізація типового варіанта
Виконання поставленого завдання можна розбити на дві функціонально незалежні частини. Першу частину завдання (пп. 1 – 4) з обробки масивів чисел реалізуємо у вигляді консольної програми в інтегрованому середовищі програмування Microsoft Visual C++ 7.0. Консольна програма має істотно менший об'єм, а отже, простіша в процесі кодування і при відлагодженні. Другу частину роботи (п. 5) виконаємо за допомогою різних інструментів:
інтегрованого середовища розробки програмного забезпечення Microsoft Visual C++ 7.0 (побудуємо програму Windows алгоритмічною мовою програмування Visual C++);
середовища Microsoft Excel (реалізуємо електронну таблицю);
проблемно-орієнтованого середовища Mathcad.
Обробка масивів чисел
Побудуємо консольну програму в інтегрованому середовищі розробки програмного забезпечення Microsoft Visual C++ 7.0, що реалізує пункти 1 – 4 типового завдання.
Запустити на виконання інтегроване середовище програмування Microsoft Visual C++ командою Пуск | Программы | Microsoft Visual C++. На екрані комп’ютера зявиться вікно (рис. 1), що складається з меню основних команд, панелей інструментальних кнопок (вивести увесь список панелей можна правою кнопкою миші на вільному місці меню), вікна робочого простору Workspace (ліворуч), вікна редактора тексту та інших ресурсів проекту (праворуч) і вікна результатів компіляції проекту (знизу). Всі вихідні дані (елементи масиву Y) помістимо в текстовий файл DZ1.TXT. Проміжні й остаточні результати виконання розрахунку виведемо в інший текстовий файл DZ1.out. Для роботи з файлами використовуємо стандартні функції scanf() і printf().
Рис. 1
Створити проект консольної програми, що виконує поставлене завдання.
Запустити майстер створення проекту командою меню File | New | Project…. З’являється вікно вибору типу проекту (рис. 2).
В діалоговій панелі New Project на вкладці Project Types треба виділити мишею тип проекту Win32, а у вікні Templates – варіант майстра консольних програм Win32 Console Project. У вікні редагування Location вказати місце проекту на жорсткому диску (наприклад D:\). При виборі диска треба переконатися, що Ви маєте право запису на цей диск. У вікні редагування Name необхідно набрати ім'я проекту DZ1 (назва проекту повинна бути короткою, інформативною, без пропусків і спеціальних символів).
Рис. 2
Підтвердити натисненням кнопки OK вибрані опції панелі New Project. У вікні Win32 Application Wizard, що відкрилося (рис. 3), є можливість створити пустий проект (а потім залучати до нього нові файли), простий проект з примітивним каркасом програми і проект з підтримкою стандартної бібліотеки класів Microsoft Foundation Classes (MFC). За замовчуванням створюється проект простої програми Simple Application. У цьому випадку проект вже буде мати декілька готових файлів, які треба буде тільки відредагувати. Серед них файл DZ1.cpp з місцем входу до головної функції main() та спеціальний заголовний файл StdAfx.h, в який у разі потреби будемо заносити необхідні заголовні файли стандартних бібліотек та заголовні файли користувача. Спеціальний файл StdAfx.cpp проекту ніколи не доведеться редагувати, його призначення має службовий характер.
Підтвердити вибрані опції, натиснувши кнопку Finish. Відкриється головне вікно Visual Studio. Майстер завершив свою роботу та повернув керування середовищу Visual C++ (рис. 4). Рухатися проектом можна за допомогою панелі Class View, Resource View або Solution Explorer (рис. 5)
Рис. 3
Рис. 4
Рис. 5
Початковий файл тексту програми DZ1.cpp вже має визначення головної функції _tmain() (рис. 6).
Рис. 6
Вставимо в проект новий файл Functions.cpp для зберігання тексту функцій, що виконують пункти завдання. Для цього треба виконати команду меню Project | Add New Item....
На вкладці Add New Item (рис. 7) треба виділити шаблон C++ File (.cpp), у вікні редагування Name набрати ім'я файла Functions. Підтвердити установки натисненням кнопки Оpen. У результаті новий файл з'явиться в структурі проекту і буде автоматично відкритий у вікні текстового редактора (рис. 8).
Рис. 7
Рис. 8
Внесемо у створений файл Functions.cpp текст визначення функцій завдання (бажано, щоб імена функцій відображали зв'язок із завданням; наприклад, функція Func1() виконуватиме п. 1 завдання).
#include "stdafx.h" // стандартний заголовний файл
void Func1(float* Y,float* V,int n) // пункт 1 завдання
{
for(int i=0;i<n;i++)
V[i]=cos(Y[i]);
}
void Func2(float* A,int n,float& Amin) // пункт 2 завдання
{
Amin=A[0];
for(int i=1;i<n;i++)
if(A[i]<Amin) Amin=A[i];
for(i=0;i<n;i++)
{
if(A[i]>0)
A[i]=pow(A[i],3);
else
A[i]=Amin;
}
}
void Func3(float* A,int n,float** W,int m) // пункт 3 завдання
{
int k=-1;
for(int i=0;i<m;i++)
for(int j=0;j<m;j++)
{
k++;
W[i][j]=A[k];
}
}
void Func4(float** W,int m,float*R) // пункт 4 завдання
{
for(int j=0;j<m;j++)
{
float P=1;
for(int i=0;i<m;i++)
P=P*W[i][j];
R[j]=P;
}
}
Вставимо в проект новий заголовний файл з оголошеннями створених функцій ( Project | Add New Item...).
На вкладці Add New Item (рис. 9) необхідно виділити шаблон Header File (.h), у вікні редагування Name набрати ім'я файла Functions.
Рис. 9
Підтвердіть установки натисненням кнопки Оpen. Новостворений файл Functions.h з'явиться в структурі проекту і відкриється у вікні редактора.
У файл Functions.h (рис. 10) необхідно занести заголовки створених функцій. Кожний заголовок називається інтерфейсом відповідної функції й завершується крапкою з комою. Тут же оголосимо як глобальні константи розмірності N і M масивів, що беруть участь у розрахунках. Директива #pragma once дозволяє компілятору уникнути повторної вставки заголовного файла при компіляції проекту й уникнути конфлікту.
// functions.h
#pragma once
// глобальні константи програми
const int N=9;
const int M=3;
// заголовки глобальних функцій програми
void Func1(float* Y,float* V,int n);
void Func2(float* A,int n,float& Amin);
void Func3(float* A,int n,float** W,int m);
void Func4(float** W,int m,float*R);
Рис. 10
Аналогічно заголовному файлу та файлу початкового тексту на С++ вставимо в проект текстовий файл вихідних даних DZ1.txt (рис. 11). При вставленні необхідно вибрати тип файла Text File (.txt).
Рис. 11
Відредагуємо файл DZ1.inp. Необхідно внести через пропуски числа початкового масиву Y:
0.2 -7.8 2.5 -6.3 1.3 5.9 4.4 7.8 0.3
Внесемо зміни в існуючий файл DZ1.cpp. Усередину заготівки головної функції main() консольної програми необхідно набрати текст, що викликає створені функції користувача.
// DZ1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
FILE
*fpi,
*fpo;
float
Y[N],
V[N],
**W,
R[M];
int
i,
j;
// виділення динамічної пам’яті
W=new float* [M];
for(i=0;i<M;i++)
W[i]=new float[M];
// завдання вихідних даних із файла
fpi=fopen("DZ1.TXT","r");
fpo=fopen("DZ1.OUT","w");
for(i=0;i<N;i++)
fscanf(fpi,"%f",&Y[i]);
fclose(fpi);
fprintf(fpo,"******************************************\n");
fprintf(fpo,"* Домашнее задание №1 *\n");
fprintf(fpo,"* по курсу \"Иформатика\" семестр 2 *\n");
fprintf(fpo,"******************************************\n");
fprintf(fpo,"* Выполнил: ст. гр. 211 Иванов И.И. *\n");
fprintf(fpo,"*----------------------------------------*\n");
fprintf(fpo,"* Проверил: доц. каф. 304 Петров Л.Н. *\n");
fprintf(fpo,"******************************************\n\n");
fprintf(fpo," Исходный массив Y:\n");
for(i=0;i<N;i++)
fprintf(fpo," %7.4f",Y[i]);
fprintf(fpo,"\n**************** Пункт 1: ****************");
Func1(Y,V,N);
fprintf(fpo,"\n Новый массив V:\n");
for(i=0;i<N;i++)
fprintf(fpo," %7.4f",V[i]);
fprintf(fpo,"\n**************** Пункт 2: ****************");
float Vmin;
Func2(V,N,Vmin);
fprintf(fpo,"\n Минимальный элемент массива Vmin = %7.4f\n",
Vmin);
fprintf(fpo," Преобразованный массив V:\n");
for(i=0;i<N;i++)
fprintf(fpo," %7.4f",V[i]);
fprintf(fpo,"\n**************** Пункт 3: ****************\n");
Func3(V,N,W,M);
fprintf(fpo," Новый массив W:\n");
for(i=0;i<M;i++)
{
for(j=0;j<M;j++)
fprintf(fpo," %7.4f",W[i][j]);
fprintf(fpo,"\n");
}
fprintf(fpo,"\n**************** Пункт 4: ****************\n");
Func4(W,M,R);
fprintf(fpo," Новый массив R:\n");
for(i=0;i<M;i++)
fprintf(fpo," %7.4f",R[i]);
fprintf(fpo,"\n******************************************\n");
fclose(fpo);
// звільнення динамічної пам’яті
for(i=0;i<M;i++)
delete [] W[i];
delete [] W;
return 0;
}
У заголовний файл StdAfx.h після рядка коментаря TODO вставимо необхідні для коректної роботи заголовні файли стандартних бібліотек та інтерфейсний файл functions.h. Це саме те місце в програмі, куди треба вставляти заголовні файли, а сам файл StdAfx.h вже потім додавати до файлів початкового тексту на мові C++.
#include <math.h>
#include "functions.h"
Виконаємо побудову проекту командою меню Build | Build DZ1.exe. Якщо знайдено помилки, їх треба локалізувати і виправити. Після цього можна запустити проект на виконання командою меню Build | Execute DZ1.exe. На екрані монітора з'явиться вікно консольної програми (рис. 12). Для завершення її роботи необхідно натиснути будь-яку клавішу клавіатури.
Рис. 12
У результаті роботи програми в директорії проекту DZ1 з'явиться новий текстовий файл DZ1.out. Для перегляду результатів розрахунку додамо його в проект за допомогою команди меню Project | Add Existing Item... (рис. 13). В діалоговій панелі Add Existing Item у списку File of Type виділіть маску All Files (усі файли).
Рис. 13
У вікні файлів виберемо файл DZ1.out і натиснемо кнопку Open. Файл з'явиться в ієрархічному дереві файлів проекту на панелі Solution Explorer, а його вміст – у вікні редактора (рис. 14).
Проаналізуємо результати розрахунку на відповідність завданню. У разі логічних помилок необхідно їх локалізувати в тексті програми, виправити початковий текст і повторити етапи побудови і виконання проекту.
Скопіюємо результати розрахунку в «Пояснювальну записку», використовуючи Clipboard. Якщо виникають проблеми з відображенням кирилиці, то можна спочатку виконати менеджер файлів Far.exe, відкрити у вбудованому у цю програму текстовому редакторі (F4), скопіювати в редактор результати розрахунку, змінити кодування DOS на Windows (F8), а потім знов скопіювати текст (Ctrl+Ins / Shift+Ins) у звіт.
Рис. 14
**************************************************
* Домашнее задание №1 *
* по курсу "Иформатика" семестр 2 *
**************************************************
* Выполнил: ст. гр. 211 Иванов И.И. *
*--------------------------------------------------------*
* Проверил: доц. каф. 304 Петров Л.Н.*
**************************************************
Исходный массив Y:
0.2000 -7.8000 2.5000 -6.3000 1.3000 5.9000 4.4000 7.8000 0.3000
**************** Пункт 1: ****************
Новый массив V:
0.9801 0.0540 -0.8011 0.9999 0.2675 0.9275 -0.3073 0.0540 0.9553
**************** Пункт 2: ****************
Минимальный элемент массива Vmin = -0.8011
Преобразованный массив V:
0.9414 0.0002 -0.8011 0.9996 0.0191 0.7978 -0.8011 0.0002 0.8719
**************** Пункт 3: ****************
Новый массив W:
0.9414 0.0002 -0.8011
0.9996 0.0191 0.7978
-0.8011 0.0002 0.8719
**************** Пункт 4: ****************
Новый массив R:
-0.7539 0.0000 -0.5573
******************************************
Завершимо роботу середовища Visual C++ командою File | Exit.
АПРОКСИМАЦІЯ У СЕРЕДОВИЩІ VISUAL C++
(ТРЕТИЙ ТРИМЕСТР)
Створити проект однодокументної програми Windows, що виконує поставлене у п. 5 завдання.
Запустити на виконання інтегроване середовище програмування Microsoft Visual C++ командою Пуск | Программы | Microsoft Visual C++.
Запустити майстер створення проекту AppWizard командою меню File | New.
У діалоговій панелі New перейти мишею на вкладку проектів Projects.
Виділити мишею варіант майстра MFC AppWizard (exe). На відміну від майстра консольного проекту майстер MFC AppWizard (exe) допомагає побудувати повномасштабну програму Windows з підтримкою могутньої стандартної бібліотеки класів Microsoft Foundation Classes. За необхідності майстер дозволяє додати такі риси, як можливість підключення до баз даних, використання елементів керування ActiveX, підтримка довідкової системи, формування специфічних для вирішення конкретної задачі базових класів. Звичайно, усі ці властивості можна додати потім самому, але, якщо програму грамотно заздалегідь спроектовано, цю роботу краще доручити майстру.
За допомогою кнопки «...» праворуч від вікна редагування Location перейти на робочий логічний диск (наприклад D:\).
Перейти у вікно редагування Project Name і набрати ім'я нового проекту DZ2 (рис. 15).
Підтвердити натисненням кнопки OK вибрані опції панелі New.
У наступному вікні майстра MFC AppWizard вибрати перемикач однодокументного типу програми Single document (рис. 16).
Підтвердити вибрані опції, натиснувши кнопку Finish у вікні з інформацією New Project Information (рис. 17).
Майстер AppWizard згенерує проект програми типу SDI (Single Document Interface), який можна відкомпілювати і запустити на виконання. Створено ряд класів, назва яких побудована на імені проекту (рис. 18). Клас CDZ2Doc (Документ) відповідає за зберігання і обробку даних програми, клас CDZ2View (Вигляд) – за відображення Документа на екрані комп’ютера, клас CAboutDlg – за діалогову панель з інформацією про версію програми, клас CMainFrame – за керування головною формою програми, а клас CDZ2App об’єднує роботу всіх цих класів. Класи мають свої набори функцій (методів) та змінних (властивостей). Їх можна побачити в ієрархічній структурі класів проекту на вкладці ClassView, якщо розгорнути вузол відповідного класу.
Рис. 15
Рис. 16
Рис. 17
Рис. 18
Підготуйте шаблон діалогової панелі програми для прийому вихідних даних розрахунку. Як вихідні дані тут виступає лише одна змінна – степінь полінома апроксимації табличної функції m.
Виконайте команду меню Insert | Resource. У вікні панелі (рис. 19) виділіть тип ресурсу Dialog і натисніть кнопку New.
У вікні редактора діалогу, що відкрилося, з'явиться заготовка нової діалогової панелі з ідентифікатором IDD_DIALOG1 (рис. 20).
Змініть мову діалогової панелі. Правою кнопкою миші викличте контекстне меню на ідентифікаторі ресурсу IDD_DIALOG1 і виконайте команду Properties.
Рис. 19
Рис. 20
У діалозі Dialog Properties, що з'явився, змініть мову ресурсу з англійської на російську (рис. 21).
Рис. 21
Вікно властивостей можна зафіксувати на екрані кнопкою в лівому верхньому куті. Виберіть курсором миші діалогову панель у вікні редактора діалогів. Внесіть зміни в ім'я ідентифікатора ID (IDD_DIALOG_INPUT) і в заголовок панелі Caption (рис. 22). Тепер діалог має нове ім'я ідентифікатора ID (рис. 23).
Рис. 22
Залиште на діалоговій панелі (рис. 24) кнопки OK (означатиме згоду з уведеними даними) і Cancel (відмінятиме введення даних). Створіть текстовий пояснюючий надпис. Перетягніть елемент Static Box на діалог з панелі інструментів і змініть його заголовок за допомогою панелі властивостей (команда меню View | Properties). Після цього додайте поле редагування Edit Box для введення степеня апроксимуючого полінома m. Присвойте вікну редагування ідентифікатор IDC_EDIT_M. Збережіть зміни.
Додайте в проект клас для створеного діалогу (рис. 25). Виконайте подвійне клацання лівою кнопкою миші по діалоговій панелі. З'явиться вікно майстра з пропозицією ввести до проекту новий клас. Погодьтеся, натискуючи ОК.
Рис. 23
Рис. 24
Рис. 25
Дайте ім'я класу CDlgInput у вікні Name (рис. 26).
Рис. 26
Підтвердіть введені дані, натискуючи ОК. У вікні майстра класів ClassWizard за допомогою кнопки Add Variable додайте змінну m_M цілого типу в знов створений клас діалогової панелі CDlgInput (рис. 27). Ця змінна діалогу обмінюватиметься з відповідною змінною розрахунку m. Погодьтеся з роботою майстра.
Рис. 27
Перейдіть на вкладку ResourceView проекту, розкрийте дерево класів DZ2 classes, вузол Menu та викличте редактора меню, виконавши подвійне клацання по ідентифікатору меню IDR_MAINFRAME.
Вилучіть всі непотрібні для подальшої роботи пункти меню окрім View і Help. Для цього треба виділити лівою кнопкою миші відповідний пункт меню, що вилучається, та натиснути клавішу Delete.
Правою кнопкою миші викличте контекстне меню на порожньому пункті меню (рис. 28) та відкрийте панель властивостей меню Menu Item Properties (рис. 29).
У полі Caption введіть заголовок пункту меню (наприклад Calc), зніміть прапорець біля пункту Pop-up (меню, що випадає) і введіть довідкову інформацію в полі підказки Prompt, яка з'являтиметься в статус-рядку програми (нижня смуга головної форми програми, що служить для виведення довідкової інформації в процесі її виконання) при виділенні пункту меню за допомогою миші або клавіатури. Ідентифікатор ID можна не коригувати, його буде додано за замовчуванням ID_CALC.
Перейдіть на вкладку ClassView робочого простору і відкрийте оголошення класу Документа CDZ2Doc подвійним клацанням лівої кнопки миші на імені класу (рис. 30).
Рис. 28
Рис. 29
Рис. 30
Відредагуйте заголовний файл DZ2Doc.h. Уведіть оголошення необхідних для розрахунків змінних і функцій.
#include "Graph.h" // підтримка класу рисування
class CDZ2Doc : public CDocument
protected: // create from serialization only
CDZ2Doc();
DECLARE_DYNCREATE(CDZ2Doc)
// Attributes
public:
TValues xGr, yGr; // масиви абсцис і ординат
UINT
NPoints1 // кількість точок
NPoints; // кількість точок
CString sCurFunc; // заголовок поточного графіка функції
double Time; // діапазон зміни координати X
TData data; // узагальнені параметри функцій
double X2,X1; // діапазон Х зображення графіка
int
n // кількість точок експерименту
m // степінь апроксимуючого полінома
i // допоміжні змінні
до
k1
n1;
float
x1 // поточне значення Х
p; // значення полінома в поточній крапці Х
float
x[50] // заданий масив Х точок
f[50] // заданий масив F точок
c[50]; // масив коефіцієнтів полінома
float
а[10][11]; // матриця коефіцієнтів системи рівнянь
FILE* fpr; // файлові змінні
FILE* fpw;
// Operations
public:
float ex(float а, int n); // обчислення степеневої функції
void gram(); // підготовка матриці Грама
void GA(); // розв’язання системи рівнянь методом Гаусса
float fi(float x1); // розрахунок значення полінома в крапці х1
void Calc(); // підготовка масиву для рисування
// графіка
// Overrides
DECLARE_MESSAGE_MAP()
};
Відредагуйте файл реалізації DZ2Doc.cpp. Уведіть визначення необхідних для розрахунків функцій.
/////////////////////////////////////////////////////////////////////////////
// CDZ2Doc construction/destruction
// Конструктор
CDZ2Doc::CDZ2Doc()
{
// TODO: add one-time construction code here
fpw=fopen("DZ2.out","a");
}
/////////////////////////////////////////////////////////////////////////////
CDZ2Doc::~CDZ2Doc()
{
fclose(fpw);
}
/////////////////////////////////////////////////////////////////////////////
BOOL CDZ2Doc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
fpr=fopen("DZ2.inp","r");
fscanf(fpr,"%d",&n); // кількість крапок
for(int i=0;i<=n;i++) // таблична функція
fscanf(fpr,"%f%f",&x[i],&f[i]);
fclose(fpr);
m=1; // поліном 1-го степеня
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
float CDZ2Doc::ex(float а, int n)
{
int i;
float e; // степенева функція
e=1.0;
for(i=1;i<=n;i++)
e*=a;
return e;
}
/////////////////////////////////////////////////////////////////////////////
void CDZ2Doc::gram()
{
int
i,j;
float
p,q,r,s;
// матриця Грама а(m,m+1)
for(j=0; j<=m; j++)
{
s=0.0;
r=s;
q=s;
for(i=0;i<=n; i++)
{
p=ex(x[i],j);
s=s+p;
r=r+p*f[i];
q=q+p*ex(x[i],m);
}
а[0][j]=s;
а[j][m+1]=r;
а[j][m]=q;
}
for(i=1;i<=m;i++)
for(j=0;j<=m-1;j++)
а[i][j]=a[i-1][j+1];
}
/////////////////////////////////////////////////////////////////////////////
void CDZ2Doc::GA()
{
int
i,j,k;
float
r,s;
n1=m+1; // метод Гаусса для системи рівнянь
for(k=0;k<=m;k++)
{
k1=k+1;
s=a[k][k];
for(j=k1;j<=n1;j++)
а[k][j]=a[k][j]/s;
for(i=k1;i<=m;i++)
{
r=a[i][k];
for(j=k1;j<=n1;j++)
а[i][j]=a[i][j]-a[k][j]*r;
}
}
for(i=m; i>=0; i--)
{
s=a[i][n1];
for(j=i+1;j<=m;j++)
s=s-a[i][j]*c[j];
c[i]=s;
}
fprintf(fpw,"Расширенная матрица коэффициентов а[i][j]\n");
for(i=0;i<=m;i++)
{
for(int j=0;j<=m+1;j++)
fprintf(fpw,"%8.4f ",a[i][j]);
fprintf(fpw,"\n");
}
fprintf(fpw,"Коэффициенты полинома Pm(x)\n");
for(i=0;i<=m;i++)
fprintf(fpw,"%8.4f",c[i]);
fprintf(fpw,"\n");
}
/////////////////////////////////////////////////////////////////////////////
float CDZ2Doc::fi(float x1)
{
int i;
p=c[m]; // апроксимуюча функція
for(i=m-1;i>=0; i--)
p=c[i]+x1*p; // Поліноми Лежандра
return p;
}
/////////////////////////////////////////////////////////////////////////////
void CDZ2Doc::Calc()
{
gram();
GA();
int i;
NPoints = 201;
NPoints1 =NPoints+n+1;
xGr.SetSize (NPoints1); // Відводимо пам'ять
yGr.SetSize (NPoints1);
sCurFunc.Format("Полином Pm(x)");
X2=x[n];
X1=x[0];
double dx=(X2-X1)/(NPoints-1);
int ind;
for(i=0;i<NPoints;i++)
{
xGr[i]=X1+i*dx;
yGr[i]=fi(xGr[i]);
}
ind=i-1;
for(i=0;i<=n;i++)
{
ind++;
xGr[ind]=x[i];
yGr[ind]=f[i];
}
Time=X2-X1; // інтервал аргументу
}
Додайте в клас Вигляду CDZ2View метод, що реагує на натиснення пункту меню Calc з ідентифікатором ID_CALC.
Викличте майстер класів ClassWizard командою меню View | ClassWizard, перейдіть на вкладку MessageMaps (рис. 31), у вікні Class name виділіть ім'я класу Вигляду CDZ2View, у вікні ідентифікаторів Object IDs виділіть ідентифікатор ID_CALC пункту меню, у вікні повідомлень Messages виділіть рядок COMMAND і натисніть кнопку Add Function.
Рис. 31
Погодьтеся з ім'ям функції, натиснувши кнопку ОК (рис. 32).
Рис. 32
Не виходячи з майстра класів, натисніть кнопку Edit Code. Управління буде передано до редактора тексту новододаної функції OnCalc() (рис. 33). Зверніть увагу, що декларація цього методу (файл DZ2View.h) вже потрапила до потрібного місця в класі CDZ2View, а його визначення (файл DZ2View.cpp) містить тільки каркас функції. Ми повинні додати необхідні інструкції до тіла функції.
Рис. 33
У заготовці методу, що відкрилася в текстовому редакторі, замість коментаря //TODO додайте відповідний код для обчислення коренів рівняння з точністю :
/////////////////////////////////////////////////////////////////////////////
// CDZ2View message handlers
void CDZ2View::OnCalc()
{
CDZ2Doc* pDoc;
pDoc=GetDocument(); // одержуємо покажчик на Документ
CDlgInput dlg; // оголошення змінної діалогу даних
// присвоювання змінним діалогу значень Документа
dlg.m_M=pDoc->m;
int result=dlg.DoModal(); // запуск діалогової панелі даних
if(result==IDOK) // якщо завершили діалог натисненням ОК
{
// присвоювання змінним Документа значень діалогу
pDoc->m=dlg.m_M;
// виклик методу Документа, що проводить розрахунок
pDoc->Calc();
bDraw=TRUE; // дозволити рисування в OnDraw()
Invalidate(); // вимога перерисовування вікна Вигляду
}
else // якщо завершили діалог натисненням CANCEL
MessageBox("Повторите введение данных","Внимание!"
MB_OK|MB_ICONEXCLAMATION);
}
Додайте у початок файла реалізації класу Вигляду DZ2View.cpp посилання на заголовний файл діалогу DlgInput.h.
// DZ2View.cpp : implementation CDZ2View class
#include "stdafx.h"
#include "DZ2.h"
#include "DZ2Doc.h"
#include "DZ2View.h"
#include "DlgInput.h"
...
У методі OnDraw() класу Вигляду CDZ2View, який запускається при перерисовуванні вікна, вставте інструкції відображення на екран точок табличної функції й графіка апроксимуючого полінома.
/////////////////////////////////////////////////////////////////////////////
// CDZ2View drawing
//
void CDZ2View::OnDraw(CDC* pDC)
{
CDZ2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
if(bDraw)
{
// З'ясовуємо розміри масивів
UINT size = (pDoc->xGr).GetSize();
CRect r;
GetClientRect(r); // З'ясовуємо розміри вікна Вигляд
// Створюємо об'єкт імпортованого класу
CGraph graph(r, size, pDoc->n);
// Вибираємо чорне перо, запам'ятовуючи поточне
CPen* pOldPen = pDC->SelectObject (&BlackPen);
// Задаємо назви осей
CString Xlab("t"), Ylab("y");
// Просимо зобразити сітку
graph.DrawGrid (pDC, pDoc->sCurFunc, Xlab,Ylab
pDoc->xGr, pDoc->yGr);
// Відчеплюємо перо Windows від об'єкту класу
BlackPen.Detach();
// Вибираємо синє перо
pDC->SelectObject (&BluePen);
// Просимо зобразити криву графіка
graph.DrawFunc (pDC &RedPen);
// Реставруємо перо Windows
pDC->SelectObject (pOldPen);
}
...
Не забудьте додати у файл stdafx.h оголошення бібліотек математичних функцій <math.h> і шаблонів <afxtempl.h>.
#include <math.h>
#include <afxtempl.h>
Увійдіть до ресурсу інструментальних кнопок ToolBar на панелі ResourceView (рис. 34).
Рис. 34
Видаліть усі інструментальні кнопки (рис. 35), окрім довідкової й порожньої. Видалення відбувається, якщо курсором миші «перетягнути» кнопку за межі рядка кнопок.
Рис. 35
За допомогою панелі рисування відредагуйте нову інструментальну кнопку (рис. 36), яка дублюватиме виконання команди меню Calc.
Рис. 36
Пов'яжемо кнопку з командою меню. Для цього викличте панель властивостей (команда меню View | Properties) при активній кнопці (рис. 37). У списку ідентифікаторів ID знайдіть і виберіть ідентифікатор пункту меню ID_CALC, уведений раніше. Закрийте панель властивостей.
Рис. 37
Додайте в проект файли Graph.h і Graph.cpp класу рисування графіка (команда меню Project | Add to project | Files) (початкові тексти файлів див. у додатку 3). Оголошення класу CGraph з'явиться на вкладці ClassView (рис. 38).
Рис. 38
У текст оголошення класу Вигляду CDZ2View додайте оголошення допоміжних змінних для рисування (файл DZ2View.h).
//////////////////////////////////////////////////
class CDZ2View : public CView
{
protected: // create from serialization only
CDZ2View();
DECLARE_DYNCREATE(CDZ2View)
// Attributes
public:
CDZ2Doc* GetDocument();
// Чорне, синє, червоне пера
CPen BlackPen, BluePen, RedPen;
BOOL bDraw; // дозвіл на рисування
// Operations
public:
...
}
Присвойте початкові значення цим змінним у конструкторі класу Вигляду (файл DZ2View.cpp).
/////////////////////////////////////////////////////////////////////////////
// CDZ2View construction/destruction
CDZ2View::CDZ2View() :
BlackPen(PS_SOLID,1,RGB(0,0,0))
RedPen(PS_SOLID,1,RGB(255,0,0))
BluePen (PS_SOLID,2,RGB(0,0,255))
{
// TODO: add construction code here
bDraw=FALSE;
}
Додайте в проект новий текстовий файл даних DZ2.inp (рис. 39).
Рис. 39
Відкомпілюйте проект (Build | Build DZ2.exe) і запустіть на виконання Ctrl+F5. З'явиться форма програми з меню, статус-рядком і порожнім вікном Вигляду (рис. 40). Затримайте курсор миші над спроектованою інструментальною кнопкою. Ви побачите спливаюче вікно підказки і довідку в нижньому рядку вікна. Це інформація, що Ви ввели в панелі властивостей меню.
Рис. 40
Натисніть пункт меню Calc. З'явиться панель вихідних даних (рис. 41). Погодьтеся із степенем полінома m = 1 і натисніть ОК.
Рис. 41
Результати розрахунку з'являться у вікні Вигляду (рис. 42).
Рис. 42
Для розрахунку апроксимуючого полінома другого степеня (m = 2) скористаємося інструментальною кнопкою C (рис. 43). Вона виконує ту ж саму функцію, що й меню Calc.
Рис. 43
Результати розрахунку з'являться у вікні Вигляду (рис. 44).
Проаналізуйте одержані графіки і завершіть роботу програми.
Додайте до проекту і відкрийте у вікні редактора файл DZ2.out (рис. 45).
Оформіть відповідну частину пояснювальної записки.
Рис. 44
Рис. 45