Програма розрахунку сили супротиву
Програма розрахунку сили супротиву
3 Постановка задачі На частинку,яка рухається в середовищі, діє сила супротиву. Вона розраховується по формулі: , де S - площа проекції тіла на площину ; - швидкість руху частинки відносно середовища; - щільність середовища; - коефіцієнт супротиву середовища; Він залежить від числа Рейнольдса , де - швидкість руху частинки відносно середовища; d - діаметр частинки; - щільність середовища; - в'язкість середовища. Конкретно : = для Re, = для 2 < Re ? 500, =0,44 для 500 < Re < 2*. Описати абстрактний клас «Об'єкт_обчислення» з елементом даних «Обчислювальний параметр». Передбачити три віртуальні функції: 1) Введення даних із файлу; 2) Розрахунок обчислюваного параметру; 3) Виведення в файл результату та вхідних даних. Описати клас «Сила_опору», похідний від абстрактного класу. В ньому добавити елементи даних: , , d, , Re. Крім віртуальних функцій передбачити перевантажені операції присвоєння, порівняння (= =, !=, <, <=, >, >=), а також конструктори: пустий, з ініціалізацією і копіювання. Привести приклад програми, в якій застосувати усі конструктори, члени-функції і перевантажені оператори. Порядок значень параметрів: =1,29 кг/ =8-20 м/с, d=1*, Пояснювальна записка В програмі використовуються: 1. Заголовкові файли стандартної бібліотеки: § <stdio.h> - прототипи для функцій введення/виведення; § <math.h> - прототипи для функцій математичної бібліотеки; § <iostream.h> - організація потокового введення/виведення; § <stdlib.h> - прототипи функцій для перетворення чисел в текст і навпаки, а також прототипи функцій розміщення пам'яті, генерації випадкових чисел і т.п.; в курсовій роботі застосовується для використання команди exit(); § <fstream.h> - містить підкласи ofstream, ifstream та fstream, які забезпечують потоки введення/виведення в дискові файли; § <conio.h> - прототипи функцій консольного введення/виведення. 2. Класи: § Абстрактний - клас, в якому є хоча б одна чиста віртуальна функція. § Похідний - може використовувати як елементи даних базового класу (в якому передбачені загальні елементи даних і методи їх обробки, також це клас, з якого породжуються інші класи), так і мати свої власні елементи даних і методи для їх обробки. 3. Спеціальні члени-функції класу: § Конструктор - спеціальна функція, яка викликається кожного разу, коли треба створити новий об'єкт класу. Пустий конструктор (конструктор по замовчуванню) - його задачею є створення об'єкта класу. Конструктор з ініціалізацією в тілі - відбувається не тільки створення об'єкта, а й відбувається ініціалізація його елементів даних. Конструктор копіювання - слугує для того, щоб під час створення нового об'єкту можна було скопіювати йому елементи даних уже раніше описаного об'єкту. 4. Функції: § Чисті віртуальні функції - функції без тіла (тіла функції немає, наприклад, тому, що ми не знаємо як реалізувати її тіло, але сама функція буде відображувати концепцію певної дії). § Inline-функції (вбудовані функції) - функції, які підставляються в точці виклику. 5. Структура вибору: § if/else - дає можливість програмісту вказати, залежно від того, істинна умова чи хибна, які дії будуть виконуватись. § if - використовується для вибору одного з альтернативних напрямків дій. 6. Вказівники: § Вказівник - змінна, яка містить адресу. § Неявний вказівник *this - вказівник на поточний об'єкт всередині члена-функції. В нього заноситься адреса об'єкту, який зв'язується з цією функцією. 7. Перевантажені оператори: § Перевантаження операторів - визначення функціональності вбудованих операторів при використанні з типами користувача. 8. Потоки: § Стандартні cin - стандартний вхідний потік; cout - стандартний вихідний потік; § Файлові ofstream - відповідає за виведення інформації в файл; ifstream - відповідає за введення інформації в файл; Послідовність дійУ файлі kurs.cpp описуємо абстрактний клас «object» та похідний від абстрактного класу клас «sila_oporu».Підключаємо заголовкові файли:#include<iostream.h>-файл заголовків методів класів потоків вводу виводу інформації;#include<fstream.h> - файл заголовків методів класів потоків для роботи з файлами;#include<math.h> - файл з прототипами математичних функцій, який забезпечує виконання математичних операцій;#include<conio.h> - файл з прототипами функцій консольного вводу/виводу;#include<stdlib.h> - файл, який містить в собі функції для виділення памяті, перетворення типів і керування процесом виконання програми.Потім оголошується клас «object »:class object{protected:double F;public:virtual void vvod()=0;virtual void resh()=0;virtual void resh1()=0;virtual void vivod()=0;};Тут ми оголосили змінну F типу double з міткою доступу protected. Це означає, що змінна F буде доступна для даного та похідних від нього класів. Також оголошені прототипи чистих віртуальних функцій.Далі описуємо клас «sila_oporu», що є похідним від абстрактного класу. В ньому додаємо елементи даних. class sila_oporu: public object{private:double Q1;double s;double R;double V;double d;double m;double re;Визначаємо допоміжні функції:public:double S(){return (d*d*M_PI)/4;}double Re(){return ((V*d*R)/m);}double Q(){double re = Re();if (re<=2){ return 24/re;}if(2<re && re<=500){ return (18.5)/pow(re,0.6);}if(500<re && re<200000){return 0.44;}return 0;}Оголосимо пустий конструктор:sila_oporu(){}Оголосимо конструктор з ініціалізацією:sila_oporu(double Q1src, double ssrc, double Rsrc, double Vsrc){Q1=Q1src;s=ssrc;R=Rsrc;V=Vsrc;}Оголосимо конструктор копіювання:sila_oporu(const sila_oporu & src){Q1=src.Q1;s=src.s;R=src.R;V=src.V;}Визначаємо віртуальні функції, прототипи яких описані раніше:virtual void vvod(){ifstream ifs("dan.txt");if(!ifs){cout<<"Error: file \"dan.txt\" was not found"<<'\n';exit(1);}ifs>>R>>V>>d>>m;cout<<"Information from the file \"dan.txt\":\n R="<<R<<" V="<<V<<" d="<<d<<" m="<<m<<'\n';ifs.close();}virtual void resh(){F=((Q()*S()*R*V*V)/2);cout<<"F="<<F<<'\n';}virtual void resh1(){F=((Q1*s*R*V*V)/2);cout<<"F="<<F<<'\n';}virtual void vivod(){ofstream ofs("rez.txt");if(!ofs){cout<<"Error: file \"rez.txt\" was not found"<<'\n';exit(1);} ofs<<"Q="<<Q()<<"S="<<S()<<"R="<<R<<"V="<<V<<"Re="<<Re()<<"\nF="<<F;cout<<"The result was written into the file \"rez.txt\"\n";ofs.close();}Перевантажуємо операцію ==:sila_oporu & operator == (sila_oporu&src){if(F==src.F)cout<<"Power of object A and B are equal.\n";elsecout<<"Power of object A and B are not equal.\n";return *this;}Перевантажуємо операцію !=:sila_oporu & operator != (sila_oporu&src){if(F!=src.F)cout<<"Power of object A and B are not equal.\n";elsecout<<"Power of object A and B are equal.\n";return *this;}Перевантажуємо операцію <:sila_oporu & operator < (sila_oporu&src){if(F<src.F)cout<<"Power of object A is less then Power of object B.\n";elsecout<<"Power of object A is greater then Power of object B.\n";return *this;}Перевантажуємо операцію <=:sila_oporu & operator<=(sila_oporu&src){if(F<=src.F)cout<<"Power of object A is less or equal then Power of object B.\n";else cout<<"Power of object A is greater or equal then Power of object B.\n";return *this;}Перевантажуємо операцію>:sila_oporu & operator>(sila_oporu&src){if(F>src.F)cout<<"Power of object A is greater then Power of object B.\n";elsecout<<"Power of object A is less then Power of object B.\n";return *this;}Перевантажуємо операцію>=:sila_oporu & operator>=(sila_oporu&src){if(F>=src.F) cout<<"Power of object A is greater or equal then Power of object B. ";elsecout<<"Power of object A is less or equal then Power of object B. ";return *this;}};Потім опишемо функцію void main(), в якій безпосередньо і використовуватимемо описані вище функції та перевантаження операцій.Опис функцій1. virtual void vvod() - функція, що зчитує дані з файлу «dan.txt», та виводить їх на екран в тому разі, якщо інформація зчитана успішно. Якщо інформація не зчитана, то з'являється відповідне повідомлення. 2. virtual void resh() - функція, що безпосередньо обчислює наше значення F використовуючи при цьому дані, що зчитані з файлу та дві допоміжні функції Q() та S(). Після обчислень результат виводиться на екран. 3. virtual void resh1() - функція, що обчислює F використовуючи дані, ініціалізовані конструктором. Після обчислень результат виводиться на екран. 4. virtual void vivod() - функція, що записує результати в файл rez.txt, а саме Q1, S, R, V, Re, F. Також вона виводить повідомлення на екран про те, що дані записані в файл. 5. double S() - функція, що повертає значення (d*d*M_PI)/4, а саме обчислює площу проекції тіла на площину. 6. double Re() - функція, що повертає значення (V*d*R)/m, а саме обчислює число Рейнольда. 7. double Q() - функція, що повертає значення коефіцієнта супротиву середовища в залежності від величини числа Рейнольда. 8. void main() - головна функція, в якій реалізовані всі операції та функції. 9. clrscr() - стандартна функція очищення екрану. 10. getch() - функція, що зчитує і повертає код одного символа з буфера клавіатури без відображення його на екрані. Використовується для затримки екрану. 11. close() - функція, що закриває файловий потік. 12. pow() - стандартна функція обчислення степеня. Опис команд та операторів1. sila_oporu & operator == (sila_oporu&src) - перевантаження операції ==. 2. sila_oporu & operator != (sila_oporu&src) - перевантаження операції !=. 3. sila_oporu & operator < (sila_oporu&src) - перевантаження операції <. 4. sila_oporu & operator<=(sila_oporu&src) - перевантаження операції <=. 5. sila_oporu & operator>(sila_oporu&src) - перевантаження операції >. 6. sila_oporu & operator>=(sila_oporu&src) - перевантаження операції >=. 7. cout - стандартний об'єкт, що служить для виведення інформації на екран. 8. endl - маніпулятор, який викликає flash, переходить на інший рядок. 9. іf - логічна інструкція. 10. ofstream - стандартний клас файлового виведення даних. 11. іfstream - стандартний клас файлового введення даних. 12. оfs - команда, що використовується для файлового виведення даних. 13. іfs - команда, що використовується для файлового введення даних. Таблиця символьних імен |
Змінна за умовою | Змінна в програмі | Одиниці вимірювання | Пояснення | | F | F | Н | сила супротиву | | | Q1 | / кг*м | коефіцієнт супротиву середовища | | S | s | | площа проекції тіла на площину | | | R | кг/ | щільність середовища | | | V | м/с | швидкість руху частинки відносно середовища | | d | d | м | діаметр частинки | | | m | | в'язкість середовища | | Re | re | кг*м/ | число Рейнольдса | | |
Також в програмі використовуються такі змінні як: Q1src, ssrc, Rsrc, Vsrc - вони застосовуються в конструкторі ініціалізації для ініціювання змінних заданими значеннями. Програма #include<math.h> #include<stdlib.h> #include<fstream> #include<conio.h> #include<iostream> using namespace std; #define M_PI 3.14159265 class object //абстрактний клас { protected: double F; public: virtual void vvod()=0; //чисті віртуальні функції virtual void resh()=0; virtual void resh1()=0; virtual void vivod()=0; }; class sila_oporu: public object //клас, похідний від абстрактного { private: double Q1; double s; double R; double V; double d; double m; double re; public: double S() { return (d*d*M_PI)/4; } double Re() { return ((V*d*R)/m); } double Q() { double re = Re(); if (re<=2) { return 24/re; } if(2<re && re<=500) { return (18.5)/pow(re,0.6); } if(500<re && re<200000) { return 0.44; } return 0; } sila_oporu() //пустий конструктор { } sila_oporu(double Q1src, double ssrc, double Rsrc, double Vsrc) { Q1=Q1src; //конструктор з ініціалізацією в тілі s=ssrc; R=Rsrc; V=Vsrc; } sila_oporu(const sila_oporu & src) //конструктор копіювання { Q1=src.Q1; s=src.s; R=src.R; V=src.V; } virtual void vvod() //функція введення даних з файлу { ifstream ifs("dan.txt"); if(!ifs) { cout<<"Error: file \"dan.txt\" was not found"<<'\n'; exit(1); } ifs>>R>>V>>d>>m; cout<<"Information from the file \"dan.txt\":\n R="<<R<<" kg/m^3 V="<<V<<" m/s d="<<d<<" m m="<<m<<" N*s/m^2 '\n'" ; ifs.close(); } virtual void resh() //функція підрахунку сили F { F=((Q()*S()*R*V*V)/2); cout<<"F="<<F<<'\n'; } virtual void resh1() { F=((Q1*s*R*V*V)/2); cout<<"F="<<F<<'\n'; } virtual void vivod() //функція виведення (запису в файл) { ofstream ofs("rez.txt"); if(!ofs) { cout<<"Error: file \"rez.txt\" was not found"<<'\n'; exit(1); } ofs<<"Q="<<Q()<<" S="<<S()<<" R="<<R<<" V="<<V<<" Re="<<Re()<<"\nF="<<F; cout<<"The result was written into the file \"rez.txt\"\n"; ofs.close(); } sila_oporu & operator = (sila_oporu&src) //перевантаження оператора присвоєння { Q1=src.Q1; s=src.s; R=src.R; V=src.V; return *this; } sila_oporu & operator == (sila_oporu&src) //перевантаження оператора порівняння = = { if(F==src.F) cout<<"Power of object A and B are equal.\n"; else cout<<"Power of object A and B are not equal.\n"; return *this; } sila_oporu & operator != (sila_oporu&src) //перевантаження оператора порівняння ? (!=) { if(F!=src.F) cout<<"Power of object A and B are not equal.\n"; else cout<<"Power of object A and B are equal.\n"; return *this; } sila_oporu & operator < (sila_oporu&src) //перевантаження оператора порівняння < { if(F<src.F) cout<<"Power of object A is less then Power of object B.\n"; else cout<<"Power of object A is greater then Power of object B.\n"; return *this; } sila_oporu & operator<=(sila_oporu&src) //перевантаження оператора порівняння { if(F<=src.F) cout<<"Power of object A is less or equal then Power of object B.\n"; else cout<<"Power of object A is greater or equal then Power of object B.\n"; return *this; } sila_oporu & operator>(sila_oporu&src) //перевантаження оператора порівняння > { if(F>src.F) cout<<"Power of object A is greater then Power of object B.\n"; else cout<<"Power of object A is less then Power of object B.\n"; return *this; } sila_oporu & operator>=(sila_oporu&src) //перевантаження оператора порівняння ? { if(F>=src.F) cout<<"Power of object A is greater or equal then Power of object B. "; else cout<<"Power of object A is less or equal then Power of object B. "; return *this; } }; void main() //головна функція { object *p; p=new sila_oporu; //виділення пам'яті p->vvod(); //звертання до функції введення cout<<"\nThe result is: "; p->resh(); //звертання до функції підрахунку p->vivod(); //звертання до функції виведення sila_oporu a(1.1,8.3,1.29,15); sila_oporu b(0.8,4.2,1.29,20); cout<<"\nAfter the initialising:\nFor object A: "; a.resh1(); cout<<"\nFor object B: "; b.resh1(); sila_oporu w(a); cout<<"After the copying: "; w.resh1(); sila_oporu k; k=a; cout<<"After the assignment: "; k.resh1(); cout<<"Operator ==: "; a==b; cout<<"Operator !=: "; a!=b; cout<<"Operator >=: "; a>=b; cout<<"\nOperator >: "; a>b; cout<<"Operator <=: "; a<=b; cout<<"Operator <: "; a<b; } Результати роботи програми В результаті отримаємо : Тобто, спочатку зчитуються з файлу “dan.txt” та виводяться на екран дані, з якими працюватиме програма. Далі обраховується значення сили супротиву F; результат обчислення записується в файл “rez.txt” та виводиться на екран. Також в програмі передбачена ініціалізація даних для двох об'єктів класу “ sila_oporu ” - а та b, після чого обчислюються та виводяться на екран значення параметра F для даних об'єктів. Присутнє і присвоєння(копіювання) - об'єкт k=a (w(a)) . Тобто, об'єкт k (w) класу “ sila_oporu ” буде мати такі самі значення параметрів, як і а. На екран виводиться результат присвоєння(копіювання) - значення F для k (w). Програма містить перевантажені операції присвоєння (що використовується при копіюванні) та порівняння (==, !=, <, <=, >, >=), за допомогою яких відбувається порівняння об'єктів а та b. Результат роботи цих операцій виводиться на екран. Висновки В курсовій роботі виконується обчислення сили супротиву, яка діє на частинку,що рухається в середовищі. Вона обчислюється по формулі: . Програмна реалізація основується на роботі з класами, а саме: 1. Описується абстрактний клас, в якому наявні чисті віртуальні функції: 1) Введення даних із файлу. 2) Розрахунок обчислювального параметру. 3) Виведення в файл результату та вхідних даних. 2. Описується клас, похідний від абстрактного, в якому передбачені: 1) Перевантажені операції присвоєння, порівняння (==, !=, <, <=, >, >=). 2) Конструктори: пустий, з ініціюванням і копіювання. Тобто, в курсовій роботі були вдосконаленні вміння роботи з класами, спеціальними членами-функціями класу, віртуальними функціями, перевантаженими операторами, а також з файловими потоками в середовищі Microsoft Visual C++ 2005. Література 1. Конспект лекцій з предмету «Алгоритмічні мови». 2. Стефан, Дэвис. C++ для "чайников", 4-е издание. : Пер. с англ.: - М.: Издательский дом «Вильямс», 2003. - 336 с. 3. Х.Дейтел, П.Дейтел. Как программировать на С. : Пер. с англ.: - М.: Издательский дом «Вильямс», 2000. - 995 с. 4. Джесс Либерти. Освой самостоятельно С++ за 21 день.:Пер. С англ.:- М.: Издательский дом «Вильямс», 2006. -840 с.
|