Калькулятор на WinApi

Утиліта для обчислення арифметичних дій та тригонометричних функцій. Інтерфейс користувача. Характеристика роботи програми. Використання вбудованих функцій. Опис всіх розроблених класів та функцій. Код програми. Програмування С++ із використанням WinApi.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 30.05.2018
Размер файла 1,3 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

ЗАВДАННЯ

Мета: Створити утиліту для обчислення арифметичних дій та тригонометричних функцій

1. Всі арифметичні дії.

2. Всі тригонометричні дії.

3. Логарифми та стек.

4. Створити кнопки для введення даних у вікні програми.

АНОТАЦІЯ

Тема даної курсової роботи: Калькулятор.

Виконав - Цапкаленко Ю.І.

Керівник - Кобилінський І. А.

Курсова робота виконана на аркушах формату А4 та містить 44 сторінки тексту, рисунків 59.

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

Основною особливістю завдання є використання функцій WinApi (функції, що дозволяють створювати віконні програми, стандартні для операційної системи Windows). В якості мови реалізації програми вибрано мову С++.

Курсовий проект складається з таких основних розділів як:

- Вступ

- Постановка задачі.

- Аналіз предметної області.

- Ескізний проект (ієрархія компонентів робочого вікна та їх опис) та стани роботи програми.

- Робочий проект (особливості реалізації, що включає опис всіх розроблених класів та функцій).

- Представлення результатів роботи програми.

- Висновки.

- Перелік посилань

- Додатки:

1. Вихідний код програми

2. Інструкція з користування

ЗМІСТ

Вступ

1.Аналіз предметної області

2. Постановка задачі

3. Ескізний проект

3.1 Інтерфейс користувача

3.2 Характеристика роботи програми

4. Робочий проект

4.1 Використання вбудованих функцій

4.2 Опис всіх розроблених класів та функцій

5.Представлення результатів роботи прорами

Висновки

Перелік посилань

Додатки

Додаток А. Код програми

Додаток Б. Інструкція

ВСТУП

Майже кожній людині у сучасному світі доводилося хоча б раз у своєму житті користуватися калькулятором. Калькулятор є одним з найбільш необхідних елементів сучасного життя для кожної людини. Він дозволяє з величезною швидкістю обчислювати арифметичні, алгебраїчні та тригонометричні функції майже без затрати зусиль. Наприклад обчислити тангенс кута в 57° за допомогою калькулятора можна всього за декілька секунд (з урахуванням введення потрібних даних), тоді як для того щоб обчислити його не маючи ні калькулятора ні таблиці тригонометричних значень кутів на це пішло б значно більше часу. Кожна людина, будь то науковець, чи бухгалтер чи філолог або студент, повинна мати калькулятор, або програмне забезпечення що його імітує. Важко знайти хоча б когось кому зовсім не потрібен був би калькулятор. У подібному програмному забезпеченні виникає необхідність завжди, особливо у інженерів та програмістів. Як представники точних наук ми часто стикаємось з необхідністю швидко вирішувати складні завдання, і якщо це стосується математичних виразів, о калькулятор - незамінна річ у цьому питанні. Є калькулятори які допомагають вирішувати інтеграли, диференціали та інші складні вирази, є прості калькулятори для швидкого зведення числа в степінь, є калькулятори тригонометричних функцій та ще багато різних видів. тригонометричний програмування winapi

Моє завдання - реалізувати такий калькулятор, який зможе виконувати основні функції, як арифметичні, що являються основними в алгебрі, так і прості тригонометричні функції. Також я маю на меті реалізувати пріоритет операцій, без якого неможлива класична алгебра, дужки та логарифм. Також серед основних вимог є кнопка reset та можливість зведення числа в степінь.

Для реалізації поставленої задачі буде використовуватись обєктно-орієнтований підхід, робота буде виконуватися на мові програмування С++ із використанням бібліотеки функцій WinApi. Кожен крок своєї роботи я буду описувати в основній частині звіту, окрім того детально пояснивши роботу кожного класу та призначення всіх основних використаних або створених мною функцій.

1. АНАЛІЗ ПРЕДМЕТНОЇ ОБЛАСТІ

У минулому для математичних обчислень використовувалися абаки, рахівниці, математичні таблиці (особливо таблиці логарифмів), логарифмічні лінійки і механічні або електромеханічні арифмометри.

Існують калькулятори, вбудовані в персональні комп'ютери, стільникові телефони і навіть наручні годинники.

Першим механічним пристосуванням у Росії для автоматизації розрахунків були рахівниці. Цей «народний калькулятор» протримався на робочих місцях продавців в українських магазинах фактично до середини 90-х років. Одночасно з рахівницями у наукових колах, ще з дореволюційних часів, успішно використовувалися логарифмічні лінійки, що з XVII століття практично не змінювались, вони прослужили «вірою і правдою» до появи калькуляторів.

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

Починаючи з ХІХ століття, арифмометри отримали дуже широке застосування. Ними виконувалися навіть дуже складні розрахунки, наприклад, розрахунки балістичних таблиць для артилерійських стрільб. Існувала навіть особлива професія - лічильник - людина, яка з арифмометром працювала швидко і дотримувалась певних послідовних інструкцій (таку послідовність дій згодом ставали називати програмою). Але такі розрахунки проводилися надто повільно, так як при таких розрахунках вибір виконуваних дій та запис результатів проводилися людиною. Перші арифмометри були дорогі, ненадійні, складні у ремонті й громіздкі.

Мабуть, один з останніх за часом та принципових винаходів в механічній лічильній техніці було зроблено жителем Петербурга Вільгодтом Однером. Збудований Однером в 1890 року арифмометр фактично нічим не відрізнявся від сучасних йому подібних машин. Однер з компаньйоном налагодив й випуск своїх арифмометрів - по 500 штук на рік. До 1914 року у самій лише Росії налічувалося більше 22 тисяч арифмометрів Однера. У першій чверті ХХ століття ці арифмометри були єдиними математичними машинами, що широко застосовувались у різноманітних галузях діяльності.

Проте згодом крутити ручку починало набридати, і людський розум винайшов електричні лічильні машини, які арифметичні дії виконували автоматично чи напівавтоматично.І все-таки наука взяла своє. У повоєнні роки почала бурхливо розвиватися електроніка і перші комп'ютери - електронно-обчислювальні машини (ЕОМ). На початку 1960-х років між комп'ютерами і найпотужнішими лічильно-клавішними обчислювальними машинами утворилося багато суттєвих відмінностей у параметрах.

Перший масовий електронний калькулятор ANITA MK VIII, що виник в Англії 1961 року, являв собою пристрій, що працював на газорозрядних лампах. Це пристрій був досить громіздким за сучасними мірками, він оснащувалося клавіатурою для введення числа, а також додатковою 10-ти клавішною консоллю для задання множника.Подальший розвиток обчислювальної техніки нерозривно пов'язаний з досягненнями мікроелектроніки.

Перші радянські настільні калькулятори, які з'явилися 1971 року, швидко завоювали популярність. Калькулятори створювалися на базі великих інтегральних схем (ВІС), а тому працювали тихо, споживали мало енергії, вираховували швидко і безпомилково. Собівартість мікросхем швидко знижувалася, і можна було подумати над створенням МК кишенькового розміру, ціна якого була б доступна широкому споживачеві.

Одним з перших масових радянських мікрокалькуляторів був «Електроніка Б3-14», випущений 1971 року. Він був створений на заводі «Ангстрем» на мікросхемі операційного пристрою і генераторі імпульсів. Вивід інформації проводився на восьми-розрядний вакуумний люмінесцентний індикатор. Для живлення процесора, генератора і анодів індикатора на транзисторах КТ315 і КТ814 був зібраний підвищувальний перетворювач з трансформатором на броньовому сердечнику, що давав вихідну напругу 24 вольта. Живлення калькулятора могло здійснюватися від 3 елементів АА або від зовнішнього блоку живлення. Особливістю роботи даного калькулятора була помилка при обчисленні: якщо скласти 9.9999999 + 10 на індикаторі виникав результат 120. Головним нововведенням в цьому калькуляторі була його ціна, в 1971 році він коштував 35 рублів, ставши першим бюджетним калькулятором, випущеним в широкий продаж в Радянському Союзі.

Саме мікрокалькулятор «Електроніка Б3-04» в середині 70-х років ледь не став причиною дипломатичного скандалу. Одне з японських підприємств електронної промисловості викрило «Ангстрем» в «плагіаті» - зовнішній вигляд «Електроніки» практично повністю повторював дизайн калькулятора японського виробництва. Однак, коли представникам японського заводу продемонстрували начинку приладу, їм довелося відкликати свої претензії - виявилося, що радянські інженери, поставлені перед завданням створити виріб не гірше, ніж у конкурентів з капіталістичного світу, дійсно не стали витрачати багато часу на розробку дизайну, проте в тому, що стосується «мізків» калькулятора, пішли своїм шляхом. Результат кардинально відрізнявся від японського.

Наступним величезним кроком в історії розвитку мікрокалькуляторів стала поява першого радянського інженерного мікрокалькулятора. В кінці 1975 року в Радянському Союзі був створений перший інженерний мікрокалькулятор Б3-18. 1977 року була розроблена мікросхема К145ІП11, яка породила цілу серію калькуляторів. Найпершим з них був дуже відомий калькулятор Б3-26. Як і з калькуляторами Б3-09М, Б3-14 і Б3-14М, а також з Б3-18А і Б3-25А, з ним вчинили також - видалили деякі функції.

Ще одним напрямком у розвитку мікрокалькуляторів стали інженерні Б3-35 (МК-35) і Б3-36 (МК-36). Ці мікрокалькулятори вміли переводити градуси в радіани і навпаки, множити і ділити числа в пам'яті. Дуже цікаво ці калькулятори обчислювали факторіал - простим перебором. На обчислення максимального значення факторіала числа 69 на мікрокалькуляторі Б3-35 витрачалося більше п'яти секунд.1980 року був випущений мікрокалькулятор МК-53,який мав на борту годинник з будильником і секундоміром. У цьому мікрокалькуляторі вимагалося однією батарейкою менше, ніж у Б3-39.

Інженерна думка рухалася вперед, розв'язуючи завдання мікромініатюризації. 1979 року розроблений новий «надмаленький», але занадто вже розумний мікрокалькулятор Б3-38. У нього увійшли усі останні досягнення мікроелектроніки. Його розміри були справді маленькими - 91х55х5.5 мм.

Калькулятор за призначенням був інженерним, але міг робити і статистичні

Наприкінці 1977 був розроблений, і на початку 1978 року надійшов у продаж перший радянський програмований мікрокалькулятор Б3-21. Це був ще один великий крок вперед. До цього доводилося багато разів повторювати обчислення, в калькуляторах було максимум три регістра пам'яті. Тепер же з'явилася можливість самому писати програми і зберігати кілька чисел у пам'яті. Термін «програмований калькулятор» викликав благоговіння і деяку тремтіння в голосі. Це був дуже дорогий калькулятор - він коштував цілих 350 рублів! Незабаром мікрокалькулятор було нагороджено знаком якості.

Перші моделі мікрокалькулятора Б3-21 випускалися з індикатором на червоних світлодіодах. Кома займала окремий розряд. Потім індикатор поміняли на зелений катодо-люмінесцентний, через що він став працювати на 20% повільніше.

Перший програмований калькулятор відразу став дуже популярний в країні. Тепер користувач міг не тільки писати складні програми, але навіть грати в ігри з калькулятором. Це було нечуване нововведення! Почала випускатися література з техніки програмування на програмованому мікрокалькуляторі. Поява програмованого мікрокалькулятора Б3-21 дозволило навіть організувати управління виробничим процесом. Були випущені настільні варіанти цього калькулятора - МК-46 і МК-64. МК-64 відрізняється від МК-46 наявністю вбудованого цифро-аналогового перетворювача. Багато мікрокалькуляторів МК-64 були встановлені в кабінетах фізики спеціальних фізико-математичних шкіл, так як вони могли, скажімо, виміряти напругу від батарейки.

Мікрокалькулятор Б3-34 і його аналог МК-54 і МК-56 стали настільки популярними, що розробники з Київського заводу «Кристал» вирішили продовжити цю лінію калькуляторів і 1985 року випустили нові моделі МК-61 і МК-52. У них доданий один регістр пам'яті, стало 105 кроків програмної пам'яті та додано ще десяток функцій. При розробці блоків БРП розробники знову вбили відразу двох зайців, запаявши в блок матрицю з двома наборами програм. Встановивши перемичку, скажімо, в положення 1, отримуємо блок БРП-3 з математичним набором програм, а перепаявши перемичку на положення 2 - блок БРП стає астронавігаційним БРП-2.

Розвиток «калькуляторобудування» продовжувався. Принципово нові програмовані калькулятори мали вже графічний екран; вбудовану мову програмування високого рівня; можливість зв'язку з ПК (зазвичай для завантаження програм або даних) або з зовнішніми пристроями; систему символьних обчислень, що включала різні маніпуляції з виразами, рішення рівнянь або їх систем, символьне диференціювання та інтегрування, а часто і розв'язування диференціальних рівнянь у символьному вигляді; програми для малювання різних двовимірних і тривимірних графіків і діаграм; операції лінійної алгебри; розвинені засоби статистичного аналізу даних; пакети фінансових обчислень; обчислення з комплексними числами.Їх пам'ять зазвичай становила 100-400 кілобайт ОЗУ і сотні кілобайт або навіть мегабайти флеш-пам'яті. Часто використовуються процесори з тактовою частотою, рівною десяткам мегагерц.

Таким чином, підводячи підсумки повідомлення, можемо констатувати таке. Досить довгий час людство обходились великими, настільними калькуляторами, поки на початку 1970-х років почали з'являтися кишенькові калькулятори. Форма та функції говорили самі за себе. Сьогодні ми і уявити не можемо людини, у якої б не було маленького помічника в обрахунках.

2. ПОСТАНОВКА ЗАДАЧІ

Об'єктом дослідження курсової роботи є програмне забезпечення для звичайного користувача ОС Windows, що дає змогу швидко й легко порахувати складні вирази.

Предметом дослідження курсової роботи є програмне забезпечення яке дає змогу обчислювати різноманітні вирази математичного характеру з використанням математичних функцій та елементів тригонометричної алгебри.

У курсовій роботі потрібно створити програмний додаток для роботи у сімействі ОС Windows за допомогою середовища MS Visual Studio на мові програмування С++ з використанням бібліотеки функцій WinApi. Програма має давати змогу користувачу обчислювати складні вирази, а також давати доступ до роботи з основними арифметичними та тригонометричними функціями. Має бути реалізована можливість обчислення коренів різної степені, логарифимів а також піднесення заданого числа в степінь. Окрім того повинен бути реалізований інтерфейс роботи з програмою. Сама робота має складатися з таких розділів:

- Розробка математичної моделі розв'язання задачі;

- Розробка структури об'єктів;

- Створення дизайну проекту;

- Розробка інтерфейсу користувача програми;

- Розробка програми для реалізації поставленої задачі;

- Написання інструкції по роботі з програмою для користувача;

- Обов'язкового анотування усіх public класів, методів, та їх параметрів;

- Оформлення звіту;

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

Виведення результатів виконується у тому ж рядку що і введення що дає змогу використати цей результат у наступному виразі без повторного введення.

3. ЕСКІЗНИЙ ПРОЕКТ

3.1 Інтерфейс користувача

На рис 1. зображено ієрархію візуальних компонентів робочого вікна, які створюють функціональний інтерфейс. Даний інтерфейс є простим і водночас легким для сприйняття користувача. Для введення даних достатньо клікнути клавішою миші на необхідну кнопку і ми відразу бачимо готовий результат.

У верхній частині робочого вікна знаходиться рядок головного меню “Як працює”. В меню робота програми повністю описано як слід користуватися калькулятором та як правильно використовувати функції.

Останнє підменю “Выход”- вихід з програми.

Рис. 3.1. Ієрархія візуальних компонентів робочого вікна

3.2 Характеристика роботи програми

На рис 2. представлена схема станів роботи програми. Перший режим роботи програми - режим очікування дій від користувача. Користувач може вибрати один з пунктів меню для перегляду інформації, або виходу з програми. Або користувач може відразу почати роботу з програмою, ввівши якесь число чи вираз для розрахунку.

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

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

Рис. 3.2. Схема станів роботи програми

Як бачимо зі схеми, розроблена програма дозволяє в будь який момент змінити стан роботи. Це дуже зручно, оскільки в будь-який момент можна знайти інформацію про функції в програмі, або відразу, не закінчивши обчислень, покинути програму, натиснувши кнопку виходу.

4. РОБОЧИЙ ПРОЕКТ

Для реалізації було обране середовище розробки Microsoft Visual Studio 2013 при цьому передбачається, що програма буде реалізована мовою програмування C++ з використанням бібліотеки WinAPI, що дозволить програмі мати менший обсяг коду та затрачувати менше ресурсів для його опрацювання.

Первинна структура і основний алгоритм роботи програми, призначеної для роботи під ОС Windows, заздалегідь зумовлені т. н. механізмом повідомлень, прийнятим в даній операційній системі. Використання повідомлень операційної системи з будь-якої запущеної програми робить необхідним використання як мінімум двох основних функцій - WinMain і WndProc. WinMain - точка входу в програму, ім'я функції зарезервовано операційною системою. WndProc - це “віконна процедура” вікна. Ця функція забезпечує обробку повідомлень, які операційна система “посилає” вікна. Фактично WndProc викликається операційною системою, після чого дії цієї функції визначаються фактичними параметрами її виклику.

Для появи вікна на екрані недостатньо створення точки входу в програму і віконної процедури. Тому наш вихідний файл містить ще дві необхідні функції RegisterClassEx і hInstance.

Функція RegisterClassEx реєструє клас вікна, на основі якого згодом буде створено вікно нашої програми, тому що будь-яке вікно створюється на основі класу вікна. Функція hInstance фактично створює наше вікно з тими параметрами, які були вказані при його реєстрації в функції RegisterClassEx і забезпечує відображення його на екрані.

Виконання програми в узагальненому виді виглядає таким чином. На початку роботи програми відбувається виклик функції WinMain. Вона викликає функції RegisterClassEx і hInstance, що забезпечують створення і відображення вікна на екрані. Після цього WinMain входить в цикл обробки повідомлень, чим забезпечує роботою функцію WndProc, обробну повідомлення операційної системи.

Підкоряючись структурі будь-якого Windows-додатка, програм містить чотири основні функції WinMain, WndProc, InitInstance, MyRegisterClass. Основа програми, зумовлена вимогами до калькулятора, знаходиться в функції WndProc, оскільки саме в ній описуються реакції на введення інформації і способи виведення інформації на екран.

Враховуючи те, що код програми може бути досить об'ємним, деякі функції повинні були бути виділені в окремі функції. Можливих причин виділення деякої сукупності коду в окрему функцію дві:

1. Об'ємність кодування тієї або іншої операції, що знижує читабельність коду в рамках обробки повідомлень;

2. Повторне використання аналогічних ділянок коду.

Тобто, “об'ємні” функції виділені для підвищення читабельності коду, повторювані функції виділені для зменшення “об'ємності”.

4.1 Використання вбудованих функцій

Для виконання поставленого завдання були використані наступні вбудовані функції:

GetMessage - витягує повідомлення з черги повідомлень відповідного додатка.

TranslateMessage - переводить повідомлення віртуальних клавіш в символьну форму. Символьне повідомлення поміщається в чергу повідомлень.

DispatchMessage - відправляє повідомлення віконній процедурі.

RegisterClassEx - реєструє клас вікна.

CreateWindow - функція створення вікна.

CreateMenu - функція створює меню.

CreatePopupMenu - створює випадаюче меню, підменю або контекстне меню.

ShowWindow - відображає вікно на екрані.

UpdateWindow - посилає повідомлення WM_PAINT для оновлення клієнтської області вікна.

PostQuitMessage - відправляє в чергу повідомлень повідомлення про закриття вікна.

DialogBox - створює модальне діалогове вікно з ресурсу шаблону блоку діалогу.

SetBkColor - установка кольору фону.

TextOut - записує рядок символів в заданому місці, використовуючи поточний вибраний шрифт, колір фону і колір тексту.

StrCat - об'єднання рядків

LOWORD - макрокоманда, виділяє молодше слово з заданої величини.

BN_CLICKED - функція обробки натискання на кнопку

WM_COMMAND - Функція що відправляє повідомлення коли користувач вибирає заданий пункт меню, або натискає на кнопку.

wm_destroy - використовується для знищення вікна.

4.2 Опис всіх розроблених класів та функцій

TCHAR* Calculate(TCHAR* buf) - клас для розрахунку математичних дій, що будуть введені в розрахунковий рядок

static HWND hButton[20], hEdit, hListBox; структура класу кнопок

for (std::basic_string<TCHAR>::iterator ib = s.begin(); ib != s.end(); ++ib) цикл для формування результуючої строки

while (ss.get(c)) об'явленн циклу для обчислення результату

isdigit(*ib) && (TEXT('.') != *ib) && !(s.begin() == ib && '-' == *ib) функція що добавляє в вихідний результат мінус або крапку принеобхідності

std::basic_stringstream<TCHAR> ss(srpn) формується базова строка звведених даних

dstack.push(d + d1); функція для обчислення операцій з числами, аналогічно описуються й інші функції.

Схема залежностей коду.

5. ПРЕДСТАВЛЕННЯ РЕЗУЛЬТАТІВ РОБОТИ ПРОГРАМИ

У цьому розділі буде представлено результати роботи розробленої програми кожна функція буде представлена двома прикладами по два малюнки: введені данні та резльтат.

Почнемо з простого:

«+»

Рис. 5.1. вирази(зліва)та результат їх обчислення(зправа)

Тут ми бачимо коректну роботу простої арифметичної операції «+».

«-»

Рис. 5.2. Вирази та їх обчислення, як у попередньому прикладі. Тест роботи арифметичної дії «мінус».

Наочно бачимо що від'ємний результат не викликає ніяких проблем.

«*»

Рис. 5.3. Аналогічний попередньому тест роботи дії «множення».

На цьому прикладі бачимо що множення не тільки працює відмінно, а й має свій пріорітет в виконанні функції.

Аналогічна ситуація з діленням:

Рис. 5.4. Тест арифметичної дії «ділення».

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

Приклади роботи:

Рис. 5.6. Робота тригонометричної функції «синус»

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

Рис. 5.7. Косинус: працює аналогічно синусу.

Рис. 5.8. Тангенс(зверху) та котангенс(знизу). Теж обчислюються аналогічно синусу і косинусу.

Як бачимо з роботи програми все виконується правильно і без проблем, але слід зазначити, що результати можуть бути неточними оскільки в коді програми як число пі я використав константу 3.14.

Рис. 5.9. Обрахунок корня задоаного степеня: степінь кореня зліва від його умовного позначення(Q), а число під корнем зправа.

Рис. 5.10. Зведення числа до степеня.

Результат ми бачимо наочно, обчислення точне і не підлягає сумнівам.

Наступний етап це демонстрування роботи таких елементів як дужки а також логарифм.

Почнемо з дужок:

Рис. 5.11. Робота дужок.

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

Логарифм:

Рис. 5.12. Демонстрування роботи логарифму.Зліва основа логарифму, справа чило над яким виконується операція.

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

ВИСНОВКИ

В результаті виконання курсового проекту у середовищі розробки Microsoft Visual Studio 2013, з реалізацією на мові C++ та використанням функій WinAPI було створено програму «Калькулятор», що має на сучасному ринку програмного забезпечення безліч аналогів як схожих, так і радикально відрізнаючихся один від одного. За допомогою програми можна обчислювати складні вирази, та розраховувати складні тригонометричні формули.В результаті подальшої роботи над проектом кількість функцій для роботи з калькулятором буде збільшуватися і також буде змінюватися як внутрішня так і зовнішня складова калькулятора, звісно у сторону полегшення взаємодії людини і машини а також спрощення роботи з інтерфейсом.

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

Виконання курсової роботи - це серйозна справа, що вимагає багато терпіння та уваги, тому до виконання поставленої задачі я віднісся з повною серйозністю і відповідальністю. Звісно під час виконання роботи виникали деякі труднощі. Одні з них було легко подолати, інші - важче. Та все ж таки мені вдалося завершити цей проект. Під час виконання курсової роботи я дізнався багато нового, покращив навички роботи з середовищем VisualStudio та навчився використовувати потенціал бібліотеки функцій WinApi без якої було б набагато складніше реалізувати подібний проект. Я дотримався всіх етапів курсової роботи а також етапів розробки представленої мною програми, і на завершення можу сказати що це був важливий досвід у вивченні MS VisualStudio та WinApi.

ПЕРЕЛІК ПОСИЛАНЬ

1. CyberForum.ru - форум программистов и сисадминов [Електронний ресурс]// Режим доступу: URL: http://www.cyberforum.ru -Загол. з екрану.

2. MSDN - сеть разработчиков майкрософт [Електронний ресурс]// Режим доступу: URL: https://msdn.microsoft.com/ru-ru/-Загол. з екрану.

3. First Steps [Електронний ресурс]// Режим доступу: URL:http://www.firststeps.ru/mfc/winapi-Загол. з екрану.

4. Главная страница - программирование, исхолдники, операционные системы [Електронний ресурс]// Режим доступу: URL: http://www.cyberguru.ru/win32/-Загол. з екрану.

5. Історія створення та розвитку найпростіших обчислювальних пристроїв [Електронний ресурс]// Режим доступу: URL: http://phm.kspu.kr.ua/nauka/naukovo-populiarni-publikatsii/863-istoriia-stvorennia-ta-rozvytku-naiprostishykh-obchysliuvalnykh-prystroiv.html-Загол. з екрану.

6. Error RC2104: undefined keyword or key name: SS_REALSIZECONTROL [Електронний ресурс]// Режим доступу: URL: https://connect.microsoft.com/VisualStudio/feedback/details/781160/-Загол. з екрану.

7. Пишем на WinAPI с «нуля» [Електронний ресурс]// Режим доступу: URL: https://rsdn.org/article/baseserv/api32.xml-Загол. з екрану.

8. Std::map-cppreference.com [Електронний ресурс]// Режим доступу: URL: http://ru.cppreference.com/w/cpp/container/map-Загол. з екрану.

9. Форум программистов [Електронний ресурс]// Режим доступу: URL: http://www.programmersforum.ru-Загол. з екрану.

10. Программирование на C и C++ |Онлайн справочник программиста на C и C++ [Електронний ресурс]// Режим доступу: URL: http://www.c-cpp.ru -Загол. з екрану.

Додаток А. Вихідний код програми

ConsoleApplication10.cpp

#pragma comment (lib, "Shlwapi.lib")

#include "stdafx.h"

#include <windows.h>

#include <stdlib.h>

#include <string.h>

#include <tchar.h>

#include <Shlwapi.h>

#include <iostream>

#include "RPN.h"

static TCHAR szWindowClass[] = _T("win32app");

static TCHAR szTitle[] = _T("Калькулятор (kurs_rob)");

TCHAR buf[1024];

HINSTANCE hInst;

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

// Главная часть программы-------------------------------------------------------------------------------------

int WINAPI WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow)

{

// ------------------------------------------------------------------------------------------------------------

// Структура класса окна---------------------------------------------------------------------------------------

WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW;

wcex.lpfnWndProc = WndProc;

wcex.cbClsExtra = 0;

wcex.cbWndExtra = 0;

wcex.hInstance = hInstance;

wcex.hIcon = LoadIcon(hInstance, IDI_APPLICATION);

wcex.hCursor = LoadCursor(NULL, IDC_ARROW);

wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 11);

wcex.lpszMenuName = NULL;

wcex.lpszClassName = szWindowClass;

wcex.hIconSm = LoadIcon(wcex.hInstance, IDI_APPLICATION);

// ------------------------------------------------------------------------------------------------------------

// Регистрируем класс окна------------------------------------------------------------------------------------

if (!RegisterClassEx(&wcex))

{

MessageBox(NULL,

_T("Call to RegisterClassEx failed!"),

_T("Win32 Guided Tour"),

0);

return 1;

}

// ------------------------------------------------------------------------------------------------------------

// Создаём окно---------------------------------------------------------------------------------------

hInst = hInstance;

HWND hWnd = CreateWindow(

szWindowClass,

szTitle,

WS_SYSMENU,

CW_USEDEFAULT, CW_USEDEFAULT,

360, 250,

NULL,

NULL,

hInstance,

NULL

);

if (!hWnd)

{

MessageBox(NULL,

_T("Call to CreateWindow failed!"),

_T("Win32 Guided Tour"),

0);

return 1;

}

HMENU hMainMenu = CreateMenu();

HMENU hPopMenuFile = CreatePopupMenu();

AppendMenu(hMainMenu, MF_STRING | MF_POPUP, (UINT)hPopMenuFile, L"Меню");

{

AppendMenu(hPopMenuFile, MF_STRING, 1000, L"Автор");

AppendMenu(hPopMenuFile, MF_STRING, 1001, L"Как работает");

}

AppendMenu(hMainMenu, MF_STRING, 1002, L"Выход");

SetMenu(hWnd, hMainMenu);

SetMenu(hWnd, hPopMenuFile);

// ------------------------------------------------------------------------------------------------------------

// Отображаем окно---------------------------------------------------------------------------------------------

ShowWindow(hWnd, nCmdShow);

UpdateWindow(hWnd);

// ------------------------------------------------------------------------------------------------------------

// Цикл обработки сообщений для прослушивания отправляемых ОС сообщений----------------------------------------

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return (int)msg.wParam;

}

// ------------------------------------------------------------------------------------------------------------

// Функция------------------------------------------------------------------------------------------------------------

#define ID_EDIT 99

#define ID_BUTTON 100

#define ID_BUTTON_1 101

#define ID_BUTTON_2 102

#define ID_BUTTON_3 103

#define ID_BUTTON_4 104

#define ID_BUTTON_5 105

#define ID_BUTTON_6 106

#define ID_BUTTON_7 107

#define ID_BUTTON_8 108

#define ID_BUTTON_9 109

#define ID_BUTTON_ADD 110

#define ID_BUTTON_SUB 111

#define ID_BUTTON_MUL 112

#define ID_BUTTON_DIV 113

#define ID_BUTTON_RES 114

//#define ID_BUTTON_DEL 115

#define ID_BUTTON_DOT 116

#define ID_BUTTON_POW 117

#define ID_BUTTON_SQR 118

#define ID_BUTTON_SIN 119

#define ID_BUTTON_COS 120

#define ID_BUTTON_TAN 121

#define ID_BUTTON_CTAN 122

#define ID_BUTTON_BR1 123

#define ID_BUTTON_BR2 124

#define ID_BUTTON_LOG 125

#define ID_BUTTON_C 126

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

// Структура класса кнопки-------------------------------------------------------------------------------------

static HWND hButton[17], hEdit, hListBox;

PAINTSTRUCT ps;

HDC hdc;

int i = 0;

int count = 0, a = 0, b = 0;

// ------------------------------------------------------------------------------------------------------------

switch (message)

{

case WM_CREATE:

hEdit = CreateWindow(_T("edit"), _T("0"), WS_CHILD | WS_VISIBLE | WS_BORDER | ES_RIGHT, 10, 5, 322, 35, hWnd, (HMENU)ID_EDIT, hInst, 0);

hButton[0] = CreateWindow(_T("Button"), _T("0"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 10, 150, 85, 30, hWnd, (HMENU)ID_BUTTON, hInst, 0);

hButton[1] = CreateWindow(_T("Button"), _T("1"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 10, 115, 40, 30, hWnd, (HMENU)ID_BUTTON_1, hInst, 0);

hButton[2] = CreateWindow(_T("Button"), _T("2"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 55, 115, 40, 30, hWnd, (HMENU)ID_BUTTON_2, hInst, 0);

hButton[3] = CreateWindow(_T("Button"), _T("3"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 100, 115, 40, 30, hWnd, (HMENU)ID_BUTTON_3, hInst, 0);

hButton[4] = CreateWindow(_T("Button"), _T("4"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 10, 80, 40, 30, hWnd, (HMENU)ID_BUTTON_4, hInst, 0);

hButton[5] = CreateWindow(_T("Button"), _T("5"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 55, 80, 40, 30, hWnd, (HMENU)ID_BUTTON_5, hInst, 0);

hButton[6] = CreateWindow(_T("Button"), _T("6"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 100, 80, 40, 30, hWnd, (HMENU)ID_BUTTON_6, hInst, 0);

hButton[7] = CreateWindow(_T("Button"), _T("7"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 10, 45, 40, 30, hWnd, (HMENU)ID_BUTTON_7, hInst, 0);

hButton[8] = CreateWindow(_T("Button"), _T("8"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 55, 45, 40, 30, hWnd, (HMENU)ID_BUTTON_8, hInst, 0);

hButton[9] = CreateWindow(_T("Button"), _T("9"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 100, 45, 40, 30, hWnd, (HMENU)ID_BUTTON_9, hInst, 0);

hButton[10] = CreateWindow(_T("Button"), _T("+"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 150, 80, 43, 30, hWnd, (HMENU)ID_BUTTON_ADD, hInst, 0);

hButton[11] = CreateWindow(_T("Button"), _T("-"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 196, 80, 43, 30, hWnd, (HMENU)ID_BUTTON_SUB, hInst, 0);

hButton[12] = CreateWindow(_T("Button"), _T("*"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 150, 115, 43, 30, hWnd, (HMENU)ID_BUTTON_MUL, hInst, 0);

hButton[13] = CreateWindow(_T("Button"), _T("/"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 196, 115, 43, 30, hWnd, (HMENU)ID_BUTTON_DIV, hInst, 0);

hButton[14] = CreateWindow(_T("Button"), _T("="), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 243, 150, 89, 30, hWnd, (HMENU)ID_BUTTON_RES, hInst, 0);

hButton[15] = CreateWindow(_T("Button"), _T("C"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 289, 45, 43, 30, hWnd, (HMENU)ID_BUTTON_C, hInst, 0);

//------------------------------------------------------//-------------------------------------------------------------------------------------//

hButton[16] = CreateWindow(_T("Button"), _T("."), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 100, 150, 40, 30, hWnd, (HMENU)ID_BUTTON_DOT, hInst, 0);

hButton[18] = CreateWindow(_T("Button"), _T("^"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 243, 45, 43, 30, hWnd, (HMENU)ID_BUTTON_POW, hInst, 0);

hButton[19] = CreateWindow(_T("Button"), _T("^v"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 196, 150, 43, 30, hWnd, (HMENU)ID_BUTTON_SQR, hInst, 0);

hButton[20] = CreateWindow(_T("Button"), _T("sin^"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 243, 80, 43, 30, hWnd, (HMENU)ID_BUTTON_SIN, hInst, 0);

hButton[21] = CreateWindow(_T("Button"), _T("cos^"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 289, 80, 43, 30, hWnd, (HMENU)ID_BUTTON_COS, hInst, 0);

hButton[22] = CreateWindow(_T("Button"), _T("tan^"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 243, 115, 43, 30, hWnd, (HMENU)ID_BUTTON_TAN, hInst, 0);

hButton[23] = CreateWindow(_T("Button"), _T("ctan^"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 289, 115, 43, 30, hWnd, (HMENU)ID_BUTTON_CTAN, hInst, 0);

hButton[24] = CreateWindow(_T("Button"), _T("("), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 150, 45, 43, 30, hWnd, (HMENU)ID_BUTTON_BR1, hInst, 0);

hButton[25] = CreateWindow(_T("Button"), _T(")"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 196, 45, 43, 30, hWnd, (HMENU)ID_BUTTON_BR2, hInst, 0);

hButton[26] = CreateWindow(_T("Button"), _T("log"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 150, 150, 43, 30, hWnd, (HMENU)ID_BUTTON_LOG, hInst, 0);

break;

case WM_COMMAND:

if ((LOWORD(wParam) == ID_BUTTON) && (HIWORD(wParam) == BN_CLICKED))

{

GetWindowText(hEdit, buf, sizeof(buf));

if (*buf == TEXT('0') && 0 == buf[1]) *buf = 0;

StrCat(buf, TEXT("0"));

SetWindowText(hEdit, buf);

}

if ((LOWORD(wParam) == ID_BUTTON_1) && (HIWORD(wParam) == BN_CLICKED))

{

GetWindowText(hEdit, buf, sizeof(buf));

if (*buf == TEXT('0') && 0 == buf[1]) *buf = 0;

StrCat(buf, TEXT("1"));

SetWindowText(hEdit, buf);

}

if ((LOWORD(wParam) == ID_BUTTON_2) && (HIWORD(wParam) == BN_CLICKED))

{

GetWindowText(hEdit, buf, sizeof(buf));

if (*buf == '0' && 0 == buf[1]) *buf = 0;

StrCat(buf, TEXT("2"));

SetWindowText(hEdit, buf);

}

if ((LOWORD(wParam) == ID_BUTTON_3) && (HIWORD(wParam) == BN_CLICKED))

{

GetWindowText(hEdit, buf, sizeof(buf));

if (*buf == '0' && 0 == buf[1]) *buf = 0;

StrCat(buf, TEXT("3"));

SetWindowText(hEdit, buf);

}

if ((LOWORD(wParam) == ID_BUTTON_4) && (HIWORD(wParam) == BN_CLICKED))

{

GetWindowText(hEdit, buf, sizeof(buf));

if (*buf == '0' && 0 == buf[1]) *buf = 0;

StrCat(buf, TEXT("4"));

SetWindowText(hEdit, buf);

}

if ((LOWORD(wParam) == ID_BUTTON_5) && (HIWORD(wParam) == BN_CLICKED))

{

GetWindowText(hEdit, buf, sizeof(buf));

if (*buf == '0' && 0 == buf[1]) *buf = 0;

StrCat(buf, TEXT("5"));

SetWindowText(hEdit, buf);

}

if ((LOWORD(wParam) == ID_BUTTON_6) && (HIWORD(wParam) == BN_CLICKED))

{

GetWindowText(hEdit, buf, sizeof(buf));

if (*buf == '0' && 0 == buf[1]) *buf = 0;

StrCat(buf, TEXT("6"));

SetWindowText(hEdit, buf);

}

if ((LOWORD(wParam) == ID_BUTTON_7) && (HIWORD(wParam) == BN_CLICKED))

{

GetWindowText(hEdit, buf, sizeof(buf));

if (*buf == '0' && 0 == buf[1]) *buf = 0;

StrCat(buf, TEXT("7"));

SetWindowText(hEdit, buf);

}

if ((LOWORD(wParam) == ID_BUTTON_8) && (HIWORD(wParam) == BN_CLICKED))

{

GetWindowText(hEdit, buf, sizeof(buf));

if (*buf == '0' && 0 == buf[1]) *buf = 0;

StrCat(buf, TEXT("8"));

SetWindowText(hEdit, buf);

}

if ((LOWORD(wParam) == ID_BUTTON_9) && (HIWORD(wParam) == BN_CLICKED))

{

GetWindowText(hEdit, buf, sizeof(buf));

if (*buf == '0' && 0 == buf[1]) *buf = 0;

StrCat(buf, TEXT("9"));

SetWindowText(hEdit, buf);

}

if ((LOWORD(wParam) == ID_BUTTON_BR1) && (HIWORD(wParam) == BN_CLICKED))

{

GetWindowText(hEdit, buf, sizeof(buf));

if (*buf == '0' && 0 == buf[1]) *buf = 0;

StrCat(buf, TEXT("("));

SetWindowText(hEdit, buf);

}

if ((LOWORD(wParam) == ID_BUTTON_BR2) && (HIWORD(wParam) == BN_CLICKED))

{

GetWindowText(hEdit, buf, sizeof(buf));

if (*buf == '0' && 0 == buf[1]) *buf = 0;

StrCat(buf, TEXT(")"));

SetWindowText(hEdit, buf);

}

if ((LOWORD(wParam) == ID_BUTTON_ADD) && (HIWORD(wParam) == BN_CLICKED))

{

GetWindowText(hEdit, buf, sizeof(buf));

StrCat(buf, TEXT("+"));

SetWindowText(hEdit, buf);

}

if ((LOWORD(wParam) == ID_BUTTON_POW) && (HIWORD(wParam) == BN_CLICKED))

{

GetWindowText(hEdit, buf, sizeof(buf));

StrCat(buf, TEXT("^"));

SetWindowText(hEdit, buf);

}

if ((LOWORD(wParam) == ID_BUTTON_DOT) && (HIWORD(wParam) == BN_CLICKED))

{

GetWindowText(hEdit, buf, sizeof(buf));

StrCat(buf, TEXT("."));

SetWindowText(hEdit, buf);

}

if ((LOWORD(wParam) == ID_BUTTON_SUB) && (HIWORD(wParam) == BN_CLICKED))

{

GetWindowText(hEdit, buf, sizeof(buf));

StrCat(buf, TEXT("-"));

SetWindowText(hEdit, buf);

}

if ((LOWORD(wParam) == ID_BUTTON_MUL) && (HIWORD(wParam) == BN_CLICKED))

{

GetWindowText(hEdit, buf, sizeof(buf));

StrCat(buf, TEXT("*"));

SetWindowText(hEdit, buf);

}

if ((LOWORD(wParam) == ID_BUTTON_DIV) && (HIWORD(wParam) == BN_CLICKED))

{

GetWindowText(hEdit, buf, sizeof(buf));

StrCat(buf, TEXT("/"));

SetWindowText(hEdit, buf);

}

if ((LOWORD(wParam) == ID_BUTTON_SIN) && (HIWORD(wParam) == BN_CLICKED))

{

GetWindowText(hEdit, buf, sizeof(buf));

StrCat(buf, TEXT("s"));

SetWindowText(hEdit, buf);

}

if ((LOWORD(wParam) == ID_BUTTON_LOG) && (HIWORD(wParam) == BN_CLICKED))

{

GetWindowText(hEdit, buf, sizeof(buf));

StrCat(buf, TEXT("l"));

SetWindowText(hEdit, buf);

}

if ((LOWORD(wParam) == ID_BUTTON_COS) && (HIWORD(wParam) == BN_CLICKED))

{

GetWindowText(hEdit, buf, sizeof(buf));

StrCat(buf, TEXT("c"));

SetWindowText(hEdit, buf);

}

if ((LOWORD(wParam) == ID_BUTTON_TAN) && (HIWORD(wParam) == BN_CLICKED))

{

GetWindowText(hEdit, buf, sizeof(buf));

StrCat(buf, TEXT("t"));

SetWindowText(hEdit, buf);

}

if ((LOWORD(wParam) == ID_BUTTON_CTAN) && (HIWORD(wParam) == BN_CLICKED))

{

GetWindowText(hEdit, buf, sizeof(buf));

StrCat(buf, TEXT("a"));

SetWindowText(hEdit, buf);

}

if ((LOWORD(wParam) == ID_BUTTON_SQR) && (HIWORD(wParam) == BN_CLICKED))

{

GetWindowText(hEdit, buf, sizeof(buf));

StrCat(buf, TEXT("Q"));

SetWindowText(hEdit, buf);

}

if ((LOWORD(wParam) == ID_BUTTON_RES) && (HIWORD(wParam) == BN_CLICKED))

{

GetWindowText(hEdit, buf, sizeof(buf));

SetWindowText(hEdit, Calculate(buf));

}

if ((LOWORD(wParam) == ID_BUTTON_C) && (HIWORD(wParam) == BN_CLICKED))

{

SetWindowText(hEdit, TEXT("0"));

buf[0] = 0;

}

break;

case WM_PAINT:

hdc = BeginPaint(hWnd, &ps);

EndPaint(hWnd, &ps);

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

return DefWindowProc(hWnd, message, wParam, lParam);

break;

}

return 0;

}

RPN.h

#pragma comment (lib, "Shlwapi.lib")

#include <stack>

#include <cctype>

#include <map>

#include <string>

#include <cstdio>

#include <sstream>

#include <windows.h>

TCHAR* Calculate(TCHAR* buf)

{

std::basic_string<TCHAR> s(buf), srpn, sres;

std::basic_string<TCHAR>::size_type ind;

//while ((ind = s.find(TEXT(' '))) != std::basic_string<TCHAR>::npos) // удаление пробелов из входной строки

//{

// s.erase(ind, 1);

//}

std::map<TCHAR, size_t> map; // карата весов символов

map.insert(std::make_pair(TEXT('l'), 5));

map.insert(std::make_pair(TEXT('^'), 5));

map.insert(std::make_pair(TEXT('Q'), 5));

map.insert(std::make_pair(TEXT('a'), 4));

map.insert(std::make_pair(TEXT('t'), 4));

map.insert(std::make_pair(TEXT('c'), 4));

map.insert(std::make_pair(TEXT('s'), 4));

map.insert(std::make_pair(TEXT('*'), 3));

map.insert(std::make_pair(TEXT('/'), 3));

map.insert(std::make_pair(TEXT('+'), 2));

map.insert(std::make_pair(TEXT('-'), 2));

map.insert(std::make_pair(TEXT('('), 1));

std::stack<TCHAR> stack;

for (std::basic_string<TCHAR>::iterator ib = s.begin(); ib != s.end(); ++ib) // формировка результирующей строки в ОПЗ

{

if (!isdigit(*ib) && (TEXT('.') != *ib) && !(s.begin() == ib && '-' == *ib))

{

srpn += TEXT(' ');

if (TEXT(')') == *ib)

{

while (stack.top() != TEXT('('))

{

srpn += stack.top();

stack.pop();

srpn += TEXT(' ');

}

stack.pop();

}

else if (TEXT('(') == *ib)

{

stack.push(*ib);

}

else if (stack.empty() || (map[stack.top()] < map[*ib]))

{

stack.push(*ib);

}

else

{

do

{

srpn += stack.top();

srpn += TEXT(' ');

stack.pop();

} while (!(stack.empty() || (map[stack.top()] < map[*ib])));

stack.push(*ib);

}

}

else

{

srpn += *ib;

}

}

while (!stack.empty())// остаток из стека добавляется в результ. строку

{

srpn += stack.top();

srpn += TEXT(' ');

stack.pop();

}

std::stack<double> dstack;

std::basic_stringstream<TCHAR> ss(srpn);

double d, d1;

TCHAR c;

while (ss.get(c)) // вычисление результата

{

if (isdigit(c) || TEXT('.') == c || (1 == ss.tellg() && TEXT('-') == c))

{

ss.unget();

ss >> d;

dstack.push(d);

}

else if (!isspace(c))

{

d1 = dstack.top();

dstack.pop();

d = dstack.top();

dstack.pop();

switch (c)

{

case TEXT('+'):

if ((typeid(double) != typeid(d)) & (typeid(double) != typeid(d1)));

{

_stprintf(buf, TEXT("error"));

}

dstack.push(d + d1);

break;

case TEXT('-'):

dstack.push(d - d1);

break;

case TEXT('*'):

dstack.push(d * d1);

break;

case TEXT('/'):

dstack.push(d / d1);

break;

case TEXT('^'):

dstack.push(pow(d, d1));

break;

case TEXT('Q'):

dstack.push(pow(d1, 1 / d));

break;

case TEXT('s'):

dstack.push(pow(sin(d1), d));

break;

case TEXT('c'):

dstack.push(pow(cos(d1), d));

break;

case TEXT('t'):

dstack.push(pow(tan(d1), d));

break;

case TEXT('a'):

dstack.push(pow(1 / (tan(d1)), d));

break;

case TEXT('l'):

dstack.push(log(d1));

break;

}

}

}

//--------------------------

//-----------------------------------

if (1 == dstack.size())

{

_stprintf(buf, TEXT("%lf"), dstack.top());

dstack.pop();

}

else

{

_stprintf(buf, TEXT("error"));

}

return buf;

}

ConsoleApplication.rc

#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////

//

// Создано из ресурса TEXTINCLUDE 2.

//

#ifndef APSTUDIO_INVOKED

#include "targetver.h"

#endif

#define APSTUDIO_HIDDEN_SYMBOLS

#include "windows.h"

#undef APSTUDIO_HIDDEN_SYMBOLS

/////////////////////////////////////////////////////////////////////////////

#undef APSTUDIO_READONLY_SYMBOLS

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)

LANGUAGE 25, 1

/////////////////////////////////////////////////////////////////////////////

//

// Значок

//

// Значок с наименьшим значением идентификатора помещается первым, чтобы гарантировать использование

// идентичного значка приложения для всех систем.

IDI_CONSOLEAPPLICATION10 ICON "ConsoleApplication10.ico"

IDI_SMALL ICON "small.ico"

/////////////////////////////////////////////////////////////////////////////

//

// Меню

//

IDC_CONSOLEAPPLICATION10 MENU

BEGIN

POPUP "&Файл"

BEGIN

MENUITEM "В&ыход", IDM_EXIT

END

POPUP "&Справка"

BEGIN

MENUITEM "&О программе ...", IDM_ABOUT

END

END

/////////////////////////////////////////////////////////////////////////////

//

// Сочетание клавиш

//

IDC_CONSOLEAPPLICATION10 ACCELERATORS

BEGIN

"?", IDM_ABOUT, ASCII, ALT

"/", IDM_ABOUT, ASCII, ALT

END

/////////////////////////////////////////////////////////////////////////////

//

// Диалоговое окно

//

IDD_ABOUTBOX DIALOGEX 0, 0, 170, 62

STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU

CAPTION "О проекте ConsoleApplication10"

FONT 8, "MS Shell Dlg"

BEGIN

ICON IDR_MAINFRAME,IDC_STATIC,14,14,21,20

LTEXT "ConsoleApplication10, версия 1.0",IDC_STATIC,42,14,114,8,SS_NOPREFIX

LTEXT "Copyright (C) 2017",IDC_STATIC,42,26,114,8

DEFPUSHBUTTON "ОК",IDOK,113,41,50,14,WS_GROUP

END

/////////////////////////////////////////////////////////////////////////////

//

// DESIGNINFO

//

#ifdef APSTUDIO_INVOKED

GUIDELINES DESIGNINFO

BEGIN

IDD_ABOUTBOX, DIALOG

BEGIN

LEFTMARGIN, 7

RIGHTMARGIN, 163

TOPMARGIN, 7

BOTTOMMARGIN, 55

END

END

#endif // APSTUDIO_INVOKED

#ifdef APSTUDIO_INVOKED

/////////////////////////////////////////////////////////////////////////////

//

// TEXTINCLUDE

//

1 TEXTINCLUDE

BEGIN

"resource.h\0"

END

2 TEXTINCLUDE

BEGIN

"#ifndef APSTUDIO_INVOKED\r\n"

"#include ""targetver.h""\r\n"

"#endif\r\n"

"#define APSTUDIO_HIDDEN_SYMBOLS\r\n"

"#include ""windows.h""\r\n"

"#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"

"\0"

END

3 TEXTINCLUDE

BEGIN

"\r\n"

"\0"

END

#endif // APSTUDIO_INVOKED

/////////////////////////////////////////////////////////////////////////////

//

// Таблица строк

//

STRINGTABLE

BEGIN

IDC_CONSOLEAPPLICATION10 "CONSOLEAPPLICATION10"

IDS_APP_TITLE "ConsoleApplication10"

END

#endif

/////////////////////////////////////////////////////////////////////////////

#ifndef APSTUDIO_INVOKED

/////////////////////////////////////////////////////////////////////////////

//

// Создано из ресурса TEXTINCLUDE 3.

//

/////////////////////////////////////////////////////////////////////////////

#endif // не APSTUDIO_INVOKED

Додаток Б. Інструкція з користування

Калькулятор

Щоб успішно користуватися даним програмним додатком, потрібно знати його принцип роботи, який полягає наступних пунктах:

- Кожна з функцій приймає два значення: число зліва і число справа. В залежності від функції ліве число, яке до речі завжди double використовується в залежності від вимог функції.

Усі випадки використання лівого числа у програмі:

- Як основа для зведення у степінь

- Як значення степеня для тригонометричних функцій

- Як значення степеня для кореня

- У простих арифметичних функціях

Праве число використовується як місцеве у буль-яких функціях.

Окрім того у програмі використовується система скорочень.

Список скорочень, які використовуються для роботи з програмою:

- Синус - s

- Косинус - c

- Тангенс - t

- Котангенс - a

- Корінь заданої степені - Q

- Логарифм - l

- Степінь числа - ^

- Обнулити значення у розрахунковому рядку - C

Прості арифметичні операції можна виконати й задати за допомогою всім відомих кнопок: +, -, *, /, =.

Окрім того у програмі реалізована крапка, для задання десяткових чисел, та дужки.

Також реалізований пріоритет операцій, тому вирази типу 2+2*2 калькулятор вирішує правильно.

Для правильності роботи програми потрібно дотримуватися техніки запису виразів, це стосується тригонометричних функцій: число над яким виконується дія записується після натискання кнопки виразу, перед натискання кнопки обов'язково ви повинні задати допоміжне число яке є степінню у яку зводять вираз. Ндля запису корня третьої степені з двадцяти семи потрібно ввести:

3Q27, якщовам потрібен квадратний корінь то пишете 2Q27 і т.д. Це ж саме стосується і синусів та косинусів: якщо потрібен просто синус числа то пишете 1s60, наприклад. Для отримання синуса 60 градусів в кубі, записуємо так: 3s60.

Для отримання логарифму з якоюсь основою ви повинні ввести спочатку основу вашого логарифму, а потім саме число, наприклад запис 2l26 це логарифм 26 по основі 2.

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

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

Размещено на Allbest.ru

...

Подобные документы

  • Визначення поняття автоматизації та інформаційної технології. Вибір мови програмування, аналіз бібліотеки класів та системи масового обслуговування. Реалізація інтерфейсу програми Visual C# 2010 Express. Діаграма класів до основних функцій программи.

    курсовая работа [1,5 M], добавлен 28.04.2012

  • Розробка програми GameBox, яка включає в себе дві гри, судоку та пятнашки. Опис структури даних та вимоги до них, процедур і функцій користувача, стандартних процедур і функцій, які використовувались в програмі, та файлів. Результати роботи програми.

    курсовая работа [5,3 M], добавлен 12.11.2011

  • Ознайомлення з операціями середовища MatLAB на прикладі використання стандартних функцій, побудови файлів-сценаріїв і створення функцій користувача. Роботи з матрицями і векторами в середовищі MatLAB, рішення тригонометричних функцій, побудова графіків.

    лабораторная работа [11,2 M], добавлен 21.05.2019

  • Розробка прикладного додатку для побудови графіків тригонометричних функцій з використанням програмного середовища Delphi. Схема алгоритму, методи створення, структура та особливості програмної реалізації прикладного додатку. Умови виконання програми.

    курсовая работа [643,1 K], добавлен 19.11.2013

  • Постановка задачі: створення списку співробітників інституту. Аналіз мов програмування та вибір мови PascalABC.Net - 32-розрядної програми, яка може працювати на сучасних версіях Windows. Опис функцій та процедур, реалізації інтерфейсу користувача.

    курсовая работа [277,8 K], добавлен 25.06.2015

  • Розробка та виконання простих програм, програм з розгалуженням, з використанням функцій, масивів, рядків, функцій та структур. Динамічні структури даних. Написання програми обчислення струму по відомих значеннях напруги і опору електричного ланцюга.

    курсовая работа [471,0 K], добавлен 02.06.2016

  • Аналіз теоретичної бази методів інтерполювання функцій. Розробка алгоритмів та вибір оптимального. Приклад програми інтерполювання функції за допомогою інтерполяційного многочлена Лагранжа: інструкція користувача, опис, тестування та лістинг програми.

    курсовая работа [1,0 M], добавлен 19.09.2013

  • Побудування блок-схеми рішення завдання зі знайдення центра ваги однорідної усіченої призми. Розробка програми за допомогою язика програмування C++, опис змінних та функцій програми та загальної математичної моделі. Розробка інструкції користувача.

    курсовая работа [1,1 M], добавлен 04.01.2012

  • Загальні факти про комп’ютерні ігри. Розгляд основ розробки програмного (джерельного) коду, контенту (малюнки, моделі, музика) та ігрових механік гри "Три стакани". Правила використанням засобів WinAPI. Створення математичної моделі алгоритму програми.

    курсовая работа [405,6 K], добавлен 09.06.2015

  • Розробка програми для моделювання роботи алгоритму Дейкстри мовою C# з використанням об’єктно-орієнтованих принципів програмування. Алгоритм побудови робочого поля. Програмування графічного інтерфейсу користувача. Тестування програмного забезпечення.

    курсовая работа [991,4 K], добавлен 06.08.2013

  • Характеристика предметної області: FTP-server для ОС Windows. Шляхи встановлення FTP-серверу в ОС Windows. Опис мови та середовища програмування, компонентів та функцій програми. Аналіз реалізованої програми FTP-клієнта. Тестовий запуск та опис програми.

    курсовая работа [1,7 M], добавлен 22.06.2017

  • Об’єктно-орієнтований аналіз, визначення класів та методів. Загальна схема функціонування системи. Представлення учбового матеріалу, питань та відповідей. Графічний інтерфейс користувача для роботи з програмою. Використання програми викладачами.

    курсовая работа [1,3 M], добавлен 09.01.2014

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

    курсовая работа [330,6 K], добавлен 04.02.2015

  • Аналіз технічного забезпечення, вибір інструментального програмного забезпечення та середовища розробки програм. Створення класів для реалізації необхідних функцій для роботи програмного засобу. Розробка інтерфейсу для користувача та лістинг програми.

    курсовая работа [343,9 K], добавлен 24.08.2012

  • Аналіз сучасного стану технологій програмування. Засоби реалізації об'єктів в мові C++, структура даних і функцій. Розробка програмного продукту - гри "трикутники", з використовуванням моделей, класів і функцій об’єктно-орієнтованого програмування.

    курсовая работа [117,8 K], добавлен 14.03.2013

  • Концепції об'єктно-орієнтованого програмування. Конструктори та деструктори. Успадкування класів. Побудова об’єктної моделі. Визначення об'єктів та класів і зв’язків між ними. Реалізація програми в середовищі Visual Studio C++. Інтерфейс програми.

    курсовая работа [743,7 K], добавлен 25.01.2016

  • Визначення та способи представлення графів. Основні алгоритми на графах. Побудова мінімального остового дерева. Алгоритми Прима та Дейкстри. Модель Флойда-Уоршалла. Огляд можливостей мови програмування. Опис функцій програмної моделі, інтерфейс програми.

    дипломная работа [563,7 K], добавлен 03.08.2014

  • Розробка програми в візуальному середовищі С++. Визначення значення функцій в середовищі Builder мовою програмування С++. Обчислення елементів квадратної матриці згідно заданного алгоритму. Бібліотека візуальних компонентів і середовище програмування.

    курсовая работа [451,5 K], добавлен 15.01.2012

  • Програми лінійної та розгалуженої структури. Програмна реалізація функцій для роботи з датою та часом. Робота з візуальними компонентами керування. Створення інтерфейсу користувача стандартними подіями. Глобальні ідентифікатори Screen, Mouse, Application.

    отчет по практике [1,3 M], добавлен 24.02.2015

  • Головні принципи візуального програмування, опис компонентів Delphi, використаних при розробці проекту. Опис програми-додатку "Психологічний тест" та список дій користувача. Алгоритм роботи програми, її форма та ієрархія. Опис графічного інтерфейсу.

    курсовая работа [1,2 M], добавлен 08.06.2010

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.