Курсач. Новый Курсач. Приложение Калькулятор
Скачать 198.43 Kb.
|
МИНОБРНАУКИ РОССИИ Санкт-Петербургский государственный электротехнический университет «ЛЭТИ» им. В.И. Ульянова (Ленина) Кафедра информационной безопасности Курсовая РАБОТА по дисциплине «Программирование» Тема: Приложение «Калькулятор»
Санкт-Петербург 2021 ЗАДАНИЕ НА КУРСОВУЮ РАБОТУ Студент Сошнин Д.Д. Группа 1361 Тема работы: Приложение «Калькулятор» Исходные данные: Разработать на языке программирования C или C++ (по выбору студента) приложение для выполнения простых расчетов с использованием основных арифметических операций (сложение, вычитание, умножение, деление). Значения для расчета (не менее двух значений) и арифметическая операция вводятся пользователем. Поддержка вещественных значений (значений с плавающей точкой) не обязательна. Допускается возникновение целочисленного переполнения в результате выполнения арифметической операции. Ввод/вывод значений должен осуществляться в десятичной системе счисления. Приложение должно иметь консольный или графический интерфейс (по выбору студента). В интерфейсе приложения допускается использовать буквы латинского алфавита для транслитерации букв алфавита русского языка. Интерфейс приложения должен быть интуитивно понятным и содержать подсказки для пользователя. В исходном коде приложения должны быть реализованы функции. В исходном коде приложения должны быть реализованы проверки аргументов реализованных функций и проверки возвращаемых функциями значений (для всех функций — как сторонних, так и реализованных). Приложение должно корректно обрабатывать ошибки, в том числе ошибки ввода/вывода, выделения/освобождения памяти и т. д. Содержание пояснительной записки: Введение, история развития вычислительной техники, реализация программы, использованное ПО, реализованные функции, результаты тестирования программы, заключение, список использованных источников, приложение 1 — руководство пользователя, приложение 2 — блок-схема алгоритма, приложение 3 — исходный код программы. Предполагаемый объём пояснительной записки: Не менее 25 страниц. Дата выдачи задания: 07.11.2021 Дата сдачи реферата: 24.12.2021 Дата защиты реферата: 30.12.2021 Студент ________________ Сошнин Д.Д. Преподаватель ________________ Халиуллин Р.А АННОТАЦИЯ Цель работы — создание консольного приложения, выполняющее простейшие арифметические операции, такие как сложение, вычитание, умножение и деление, а также способное корректно обрабатывать ошибки и сообщать о них. Пользователь вводит два числа и выбирает нужную у арифметическую операцию, программа выводит ответ. Программа написана на языке C и выполняет все вышеперечисленные требования. SUMMARY The aim of the work is to create console application capable of performing the simplest arithmetic operations, such as addition, subtraction, multiplication and division and also capable of correctly handling errors and report them. The user inputs two numbers and selects the arithmetic operation he needs, the program outputs the response. The program is written in C and fulfills all of the requirements listed above. СОДЕРЖАНИЕВВЕДЕНИЕ Цель работы — Создание приложения «Калькулятор», выполняющее простейшие арифметические действия: сложение, вычитание, умножение и деление с двумя целыми числами. Программа должна корректно обрабатывать ошибки, например, деление на ноль. ИСТОРИЯ РАЗВИТИЯ ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ Домеханический периода. Счет на Акабе. Следующим шагом было создание древнейших из известных счетов – "саламинская доска" по имени острова Саламин в Эгейском море – которые у греков и в Западной Европе назывались "абак", у китайцев – "суан - пан", у японцев – "серобян". Вычисления на них проводились путем перемещения счетных костей и камешков (калькулей) в полосковых углублениях досок из бронзы, камня, слоновой кости, цветного стекла. Эти счеты сохранились до эпохи Возрождения, а в видоизмененном виде сначала как "дощатый щот" и как русские счеты до настоящего времени. В своей примитивной форме абак представлял собой дощечку (позднее он принял вид доски, разделенной на колонки перегородками). На ней проводились линии, разделявшие ее на колонки, а камешки раскладывались в эти колонки по тому же позиционному принципу, по которому кладется число на наши счеты. Это нам известно от ряда греческих авторов. Абак был «походным инструментом» греческого купца. О его коммерческом назначении свидетельствует то обстоятельство, что значения, приписываемые камешку в различных колонках, не выдержаны в постоянном числовом отношении друг к другу, а сообразованы с отношениями различных денежных единиц. Палочки Непера. Первым устройством для выполнения умножения был набор деревянных брусков, известных как палочки Непера. Они были изобретены шотландцем Джоном Непером (гг.). На таком наборе из деревянных брусков была размещена таблица умножения. Кроме того, Джон Непер изобрел логарифмы. Логарифмическая линейка. В 1654 г. Роберт Биссакар, а в 1657 г. независимо С. Патридж (Англия) разработали прямоугольную логарифмическую линейку — это счетный инструмент для упрощения вычислений, с помощью которого операции над числами заменяются операциями над логарифмами этих чисел. Конструкция линейки сохранилась в основном до наших дней. Вычисления с помощью логарифмической линейки производятся просто, быстро, но приближенно. И, следовательно, она не годится для точных, например финансовых, расчетов. Механический период. Общая история периода. Эскиз механического тринадцатиразрядного суммирующего устройства с десятью колесами был разработан еще Леонардо да Винчи (1452— 1519). По этим чертежам в наши дни фирма IBM в целях рекламы построила работоспособную машину. Первая механическая счетная машина была изготовлена в 1623 г. профессором математики Вильгельмом Шиккардом (1592—1636). В ней были механизированы операции сложения и вычитания, а умножение и деление выполнялось с элементами механизации. Но машина Шиккарда вскоре сгорела во время пожара. Поэтому биография механических вычислительных устройств ведется от суммирующей машины, изготовленной в 1642 г. Блезом Паскалем (1623—1662), в дальнейшем великим математиком и физиком. В 1673 г. другой великий математик Готфрид Лейбниц разработал счетное устройство, на котором уже можно было умножать и делить. С некоторыми усовершенствованиями эти машины, а названы они были арифмометрами, использовались до недавнего времени. В 1880г. создает в России арифмометр с зубчаткой с переменным количеством зубцов, а в 1890 году налаживает массовый выпуск усовершенствованных арифмометров, которые в первой четверти 19-ого века были основными математическими машинами, нашедшими применение во всем мире. Их модернизация "Феликс" выпускалась в СССР до 50-х годов. Мысль о создании автоматической вычислительной машины, которая бы работала без участия человека, впервые была высказана английским математиком Чарльзом Бэббиджем (1791—1864) в начале XIX в. В 1820—1822 гг. он построил машину, которая могла вычислять таблицы значений многочленов второго порядка. Машина Блеза Паскаля. Считается, что первую механическую машину, которая могла выполнять сложение и вычитание, изобрел в 1646г. молодой 18-летний французский математик и физик Блез Паскаль. Она называется "паскалина". Паскалина Формой своей машина напоминала длинный сундучок. Она была достаточно громоздка, имела несколько специальных рукояток, при помощи которых осуществлялось управление, имела ряд маленьких колес с зубьями. Первое колесо считало единицы, второе - десятки, третье - сотни и т. д. Сложение в машине Паскаля производится вращением колес вперед. Двигая их обратно, выполняется вычитание. Машина Готфрида Лейбница. Следующим шагом было изобретение машины, которая могла выполнять умножение и деление. Такую машину изобрел в 1671 г. немец Готфрид Лейбниц. Хоть машина Лейбница и была похожа на "Паскалину", она имела движущуюся часть и ручку, с помощью которой можно было крутить специальное колесо или цилиндры, расположенные внутри аппарата. Такой механизм позволил ускорить повторяющиеся операции сложения, необходимые для умножения. Само повторение тоже осуществлялось автоматически. Перфокарты Жаккара. Ткацкий Французский ткач и механик Жозеф Жаккар создал первый образец машины, управляемой первая перфокарта введением в нее информацией. В 1802 г. он построил машину, которая облегчила процесс производства тканей со сложным узором. При изготовлении такой ткани нужно поднять или опустить каждую из ряда нитей. После этого ткацкий станок протягивает между поднятыми и пущенными нитями другую нить. Затем каждая из нитей опускается или поднимается в определенном порядке и станок снова пропускает через них нить. Этот процесс многократно повторяется до тех пор, пока не будет получена нужная длина ткани с узором. Для задания узора на ткани Жаккар использовал ряды отверстий на картах. Если применялось десять нитей, то в каждом ряду карты предусматривалось место для десяти отверстий. Карта закреплялась на станке в устройстве, которое могло обнаруживать отверстия на карте. Это устройство с помощью щупов проверяло каждый ряд отверстий на карте. Информация на карте управляла станком. Разностная машина Чарльза Бэббидж. В 1822 г. англичанин Чарльз Бэббидж построил счетное устройство, которое назвал разностной машиной. В эту машину вводилась информация на картах. Для выполнения ряда математических операций в машине применялись цифровые колеса с зубьями. Десять лет спустя Бэббидж спроектировал другое счетное устройство, гораздо более совершенное, которое назвал аналитической машиной. Друг Бэббиджа, графиня, показала, как можно использовать аналитическую машину для выполнения ряда конкретных вычислений. Чарльза Бэббиджа считают изобретателем компьютера, а Аду Лавлейс называют первым программистом компьютера. В 1985 г. сотрудники Музея науки в Лондоне решили выяснить наконец, возможно ли на самом деле построить вычислительную машину Бэббиджа. После нескольких лет напряженной работы старания увенчались успехом. В ноябре 1991 г. незадолго до двухсотлетия со дня рождения знаменитого изобретателя, разностная машина впервые произвела серьезные вычисления. После смерти Бэббиджа умер и его сын, но перед этим он успел построить несколько миникопий разностной машины Бэббиджа и разослать их по всему миру, дабы увековечить эту машину. В октябре 1995 года одна из тех копий была продана на лондонском аукционе австралийскому музею электричества в Сиднее за $200,000. РЕАЛИЗАЦИЯ ПРОГРАММЫ Использованное ПО Операционная система: Windows 10 (x64). Язык программирования: С. Среда разработки: Code::Blocks (x64). Компилятор: GNU GCC. Реализованные функции Функция subtraction. Функция subtraction находит разность двух чисел. Исходный код функции subtraction находится в main.c. Объявление функции: int subtraction (int x, int y, int* z); Тип функции: int. Аргументы функции: x — первый аргумент, который является уменьшаемым, тип аргумента: int x; y — второй аргумент, который является вычитаемым, тип аргумента: int y; *z — указатель на переменную, в которую будет возращена разность, тип аргумента: int* z. Возвращаемое функцией значение: 0 — функция завершилась без ошибок; 1 — значение третьего аргумента функции является некорректным. Функция addition. Функция addition находит сумму двух чисел. Исходный код функции addition находится в main.c. Объявление функции: int addition (int x, int y, int* z); Тип функции: int. Аргументы функции: x — первый аргумент, который является первым слагаемым, тип аргумента: int x; y — второй аргумент, который является вторым слагаемым, тип аргумента: int y; *z — указатель на переменную, в которую будет возращена сумма, тип аргумента: int* z. Возвращаемое функцией значение: 0 — функция завершилась без ошибок; 1 — значение третьего аргумента функции является некорректным. Функция division. Функция division находит частное двух чисел. Исходный код функции division находится в main.c. Объявление функции: int division (int x, int y, int* z); Тип функции: int. Аргументы функции: x — первый аргумент, который является первым слагаемым, тип аргумента: int x; y — второй аргумент, который является вторым слагаемым, тип аргумента: int y; *z — указатель на переменную, в которую будет возращено частное, тип аргумента: int* z. Возвращаемое функцией значение: 0 — функция завершилась без ошибок; 2 — значение второго аргумента функции; 1 — значение третьего аргумента функции является некорректным. Функция multiplication. Функция multiplication находит произведение двух чисел. Исходный код функции multiplication находится в main.c. Объявление функции: int multiplication (int x, int y, int* z); Тип функции: int. Аргументы функции: x — первый аргумент, который является первым слагаемым, тип аргумента: int x; y — второй аргумент, который является вторым слагаемым, тип аргумента: int y; *z — указатель на переменную, в которую будет возращено произведение, тип аргумента: int* z. Возвращаемое функцией значение: 0 — функция завершилась без ошибок; 1 — значение третьего аргумента функции является некорректным. Функция main. Функция main получает на вход два значения и знак арифметической операции. В зависимости от знака операции вызывает другую функцию. Исходный код функции main находится в main.c. Объявление функции: int main (); Тип функции: int. Возвращаемое функцией значение: 0 — функция завершилась без ошибок; 1 — ошибка функции printf; 2 — ошибка функции scanf, некорректный первый аргумент; 3 — ошибка функции scanf, некорректный второй аргумент; 4 — второй аргумент в функции division равен 0; 5 — выбран некорректный символ; 6 — ошибка функции, введён нулевой указатель; 7 — ошибка функции getchar; 8 — ошибка функции fflush. РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ ПРОГРАММЫ Запускаем программу. Она просит ввести первый аргумент. На рисунке 1 изображена запушенная программа. Рисунок 1 – Открытая программа Пользователь вводит первый аргумент, и программа просит ввести второй аргумент (рисунок 2). Рисунок 2 – Введён первый аргумент Пользователь вводит первый аргумент, и программа просит ввести арифметическую операцию (рисунок 3). Рисунок 3 – Введён второй аргумент Пользователь вводит арифметическую операцию, например, вычитание, и программа выводит ответ (рисунок 4). Рисунок 4 – Результат операции вычитания Проверим операцию умножения (рисунок 5). Рисунок 5 – Проверка операции умножения Проверим операцию деления (рисунок 6). Рисунок 6 – Проверка операции деления Проверим операцию сложения (рисунок 7). Рисунок 7 – Проверка операции сложения Введём в значение первого аргумента символ вместо числа. Программа выдаст ошибку при вводе первого аргумента №2 (рисунок 8). Рисунок 8 – Ошибка при вводе первого аргумента Введём в значение первого аргумента символ вместо числа. Программа выдаст ошибку при вводе первого аргумента №2 (рисунок 9). Рисунок 9 – Ошибка при вводе первого аргумента Введём в значение второго аргумента, равное нулю, и выберем операцию деления. Программа выдаст ошибку при делении на ноль №4 (рисунок 10). Рисунок 10 – Ошибка при делении на ноль Введём вместо арифметической операции число. Программа выдаст ошибка при вводе арифметической операции №5 (рисунок 11). Рисунок 11 – Ошибка при вводе арифметической операции ЗАКЛЮЧЕНИЕ Созданное приложение позволяет выполнять простейшие операции с двумя числами. Программа способна корректно обрабатывать ошибки. СПИСИОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 1. Язык программирования C = The programming language / Б. Керниган, Д. Ритчи. - 2-е изд. 2. И. А. Казакова История вычислительной техники. Учебное пособие, Пенза - Издательство ПГУ, 2011. 3. ГОСТ Р 7.0.97-2016 «Национальный стандарт Российской Федерации. Система стандартов по информации, библиотечному и издательскому делу. Организационно-распорядительная документация. Требования к оформлению документов». 4. ГОСТ 7.32-2017 «Межгосударственный стандарт. Система стандартов по информации, библиотечному и издательскому делу. Отчет о научно-исследовательской работе. Структура и правила оформления». 5. Требования к оформлению научно-технических отчетов (Распоряжение от 09.11.2015 № 3003). ПРИЛОЖЕНИЕ 1. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ Краткое описание программы. Программа предназначена для совершения простейших операций, такие как сложение, вычитание, умножение и деление, над двумя числами. Пользователь вводит два числа, а потом нужную арифметическую операцию, после программа выводит ответ. Минимальные системные требования. Операционная система: Windows 10; Процессор: 1 ГГц тактовой частоты; Оперативная память: 2 Гб; Место на жестком диске: 20 Гб; Видеоадаптер: DirectX 9 или новее с драйвером WDDM; Дисплей: 800 x 600. Установка программы. Скопировать файл «Calculator.exe» в любую директорию. Запуск программы. Запустить файл «Calculator.exe» с помощью консоли, вписав в нее путь к файлу. Работа с программой. Запустить программу, введя её путь в консольную строку (рисунок 13). Рисунок 13 – Запущенная программа через консоль Пользователь вводит первое число, программа просит ввести второе число (рисунок 14). Рисунок 14 – Ввод первого числа Пользователь вводит второе число, программа просит ввести арифметическую операцию (рисунок 15). Рисунок 15 – Ввод второго числа Пользователь вводит арифметическую операцию, программа выводит ответ (рисунок 15). Рисунок 15 – Ввод арифметической операции и вывод ответа Программа может возвращать следующие значения: 0 — функция завершилась без ошибок; 1 — ошибка функции printf; 2 — ошибка функции scanf, некорректный первый аргумент; 3 — ошибка функции scanf, некорректный второй аргумент; 4 — второй аргумент в функции division равен 0; 5 — выбран некорректный символ; 6 — ошибка функции, введён нулевой указатель; 7 — ошибка функции getchar; 8 — ошибка функции fflush. ПРИЛОЖЕНИЕ 2. БЛОК-СХЕМА АЛГОРИТМА ПРИЛОЖЕНИЕ 3. ИСХОДНЫЙ КОД ПРОГРАММЫ #include #include int subtraction (int x, int y, int* z) { if (z == NULL) return 1; *z = x - y; return 0; } int addition(int x, int y, int* z) { if (z == NULL) return 1; *z = x + y; return 0; } int division (int x, int y, int* z) { if (z == NULL) return 1; if (y == 0) return 2; *z = x / y; return 0; } int multiplication (int x, int y, int* z) { if (z == NULL) return 1; *z = x * y; return 0; } int main() { int first, second, answer, Result; char symbol; if (printf("input first number: ") < 0) { printf("Error printf!"); return 1; } if (scanf("%d", &first) != 1) { printf("Error input first number!"); return 2; } if (printf("input second number: ") < 0) { printf("Error printf!"); return 1; } if (scanf("%d", &second) != 1) { printf("Error input second number!"); return 3; } if (printf("input symbol: ") < 0) { printf("Error printf!"); return 1; } if (fflush(stdin) != 0) { printf("Error fflush!"); return 8; } Result = getchar(); if (Result == EOF) { printf("Error getchar!\n"); return 7; } symbol = Result; switch (symbol) { case 43: Result = addition(first, second, &answer); if (Result == 0) { printf("%d + %d = %d", first, second, answer); } else { printf("Error addition!\n"); return 6; } break; case 47: Result = division(first, second, &answer); if (Result == 2) { printf("Error division by zero!"); return 4; } if (Result == 0) { printf("%d / %d = %d", first, second, answer); } else { printf("Error division!\n"); return 6; } break; case 42: Result = multiplication(first, second, &answer); if (Result == 0) { printf("%d * %d = %d", first, second, answer); } else { printf("Error multiplication!\n"); return 6; } break; case 45: Result = subtraction(first, second, &answer); if (Result == 0) { printf("%d - %d = %d", first, second, answer); } else { printf("Error subtraction!\n"); return 6; } break; default: if (printf("Error input invalid symbol!") < 0) { printf("Error printf!"); return 1; } return 5; } return 0; } |