МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТ ЭЛЕКТРОНИКИ И МАТЕМАТИКИ
( ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ )
Факультет Автоматики и вычислительной техники
Кафедра "Вычислительные системы и сети"
Предмет “Информатика”
Тема курсового проекта:
“Разработка калькулятора без графической оболочки на языке С++”
Руководитель:
профессор
Исполнитель:
студент группы С-13
2008г.
Оглавление
Вступление
Первые идеи
Разработка интерфейса
Аномалии входных данных
Разработка алгоритма на языке C++
Алгоритм калькулятора на языке C++ целиком
Заключение
Список используемой литературы
3
3
3
6
6
12
15
15
Вступление
В качестве своего курсового проекта я выбрал разработку калькулятора на языке C++. Так как это одна из первых программ, разработанных с помощью C++ Builder, то для начала я напишу калькулятор без графической оболочки, т. е. все действия будут выполняться через консоль. Но при всем при этом я постараюсь сделать дружественный для пользователя интерфейс. К сожалению, мой C++ Builder не поддерживает русский язык, поэтому программа будет написана на английском языке, также в своей работе я буду рассказывать, для чего нужен тот или иной оператор и зачем я использую его здесь.
Первые идеи
Итак, для начала нужно определиться, какими функциями будет обладать калькулятор. Во-первых, он должен оперировать элементарными действиями типа сложения, умножения и т. п. Во-вторых, думаю, что можно добавить функцию подсчета тригонометрических функций для какого-то определенного значения аргумента. В-третьих, добавим опцию подсчета подряд суммы подряд идущих чисел, например от 10 до 15. Там же можно будет посчитать факториал любого числа. В-четвертых, я добавлю возможность вычисления площади геометрических фигур. Ну и наконец, чтобы продемонстрировать возможности языка, добавлю игру «Угадай число», использовав при этом базисный набор несложных операторов.
Разработка интерфейса
Что представляет собой экран, на который будет выводиться вся информация? Это черный прямоугольник, в котором могут одновременно отображаться 25 строк по 80 символов в каждой. В этом окне и будет работать пользователь моего калькулятора. Что должен увидеть он при запуске программы? Я считаю, что в данном случае было бы уместно некое приветствие. Затем перед человеком появляется главное меню, в котором он сможет выбрать нужную операцию, описанную в прошлом пункте. Как это сделать, не имея графической оболочки? Для этого мы пронумеруем пункты меню, и пусть пользователь вводит с клавиатуры цифру, соответствующую нужному ему пункту меню.
Пусть это будет выглядеть так:
Добро пожаловать! Это калькулятор Потапенко Владимира, студента группы С-13.
Выберите действие:
1. Посчитать два числа
2. Посчитать площадь геометрической фигуры
3. Посчитать сумму чисел или факториал
4. Посчитать sin(x), cos(x), tg(x), ctg(x)
5. Сыграть в «Угадай число»
Будем считать, что человек выбрал нужный ему пункт, теперь нужно определиться с тем, что он будет видеть после того, как ввел цифру. Что ж, распишем для каждого меню в отдельности, что должно появиться на экран. Сделаю вложенные подменю, например как будет выглядеть вывод результата.
1. Посчитать два числа
a + b a – b a * b a / b a ^ bВведите 2 числа:
a: <число 1>
b: <число 2>
a <знак> b = <ответ>
2. Посчитать площадь геометрической фигуры
Прямоугольник Круг Треугольник2.1. Прямоугольник
Введите длину 1-ой стороны: <длина 1>
Введите длину 2-ой стороны: <длина 2>
Площадь: <ответ>
2.2. Круг
Введите радиус: <радиус>
Площадь: <ответ>
2.3. Треугольник
Введите длину основания: <длина 1>
Введите длину высоты: <длина 2>
Площадь: <ответ>
3. Посчитать сумму чисел или факториал
Сумма чисел Произведение чисел (факториал)3.1. Сумма чисел
Введите 1-ое число: <число 1>
Введите 2-ое число: <число 2>
Сумма от <число 1> до <число 2>: <ответ>
3.2. Произведение чисел (факториал)
Введите 1-ое число: <число 1>
Введите 2-ое число: <число 2>
Произведение чисел от <число 1> до <число 2>: <ответ>
4. Посчитать sin(x), cos(x), tg(x), ctg(x)
Введите число x:
Sin = <ответ 1>
Cos = <ответ 2>
Tg = <ответ 3>
Ctg = <ответ 4>
5. Сыграть в «Угадай число»
Угадайте число от 0 до 25 или вы умрете :)
У вас есть 5 попыток:
Первая попытка: <число>
Следующая попытка: <число>
Если человек угадывает число не более чем за 5 попыток, то пусть выведется такое сообщение:
===========
Вы выиграли!
===========
В противном случае – такое:
Вы проиграли!
__
| |
O |
/|\ |
/ \ |
__|_
Ответ был <ответ>
После того, как пользователь выполнил нужную ему операцию в калькуляторе, то можно предложить ему воспользоваться им еще раз, для этого пусть он напечатает букву «y» и нажмет Enter, а если другую букву – то программа закончит свое выполнение.
Нажмите ‘y’, чтобы воспользоваться калькулятором еще раз или любой другой символ для выхода.
Аномалии входных данных
Разобравшись с интерфейсом будущей программы, мы должны теперь учесть, как должна реагировать программа на входные данные, так или иначе, не подходящие под общий алгоритм программы. Это могут быть особые значения аргументов или просто ошибка человека при вводе данных.
1) Начнем с простого, в главном меню, когда пользователь должен ввести цифру, обозначающую пункт меню, он вдруг ошибается и вводит число, которое больше 5 или меньше 1. Тогда на экран будет выведено сообщение об ошибке, и пользователю дадут шанс ввести число еще раз.
Пожалуйста, введите число от 1 до 5:
Подобное окно выведем в некоторых других подменю.
2) Следующая неприятность – деление на ноль, встречается в пункте «1.4. Деление двух чисел» и «4. Посчитать sin(x), cos(x), tg(x), ctg(x)».
В первом случае просто попросим ввести другое число b, отличное от нуля:
Не могу делить на 0!
Введите новое число b:
Во втором случае если значение синуса или косинуса может быть равно нулю, то может отсутствовать значение тангенса или котангенса, так как они высчитываются как sin/cos и cos/sin соответственно. Примем этот факт к сведению, когда будем выводить результаты.
Разработка алгоритма на языке C++
Важной особенностью этого языка является то, что вводить переменные можно прямо по ходу работы программы, поэтому в отличие от Паскаля, задавать переменные в специальном разделе мы не будем.
Для использования различных математических и другого рода функций необходимо подключить специальную библиотеку. Для этого с помощью директивы #include подключим 3 библиотеки, хранящие в себе нужные нам функции.
#include <iostream. h>
#include <cstdlib. h>
#include <cmath. h>
Далее в программе будет стоять строка:
using namespace std;
Она указывает компилятору, что он должен использовать пространство имен std. Пространство имен создает декларативный район, в который помещаются различный элементы программы. Элементы, объявленные в одном пространстве имен, отделены от элементов, объявленных в другом пространстве.
Затем добавим строку, которая задает функцию, с которой начинается выполнение любой C++ программы:
int main()
В конце программы мы добавим строку, которая выйдет из этой функции, и добавим закрывающую фигурную скобку, которая формально завершит выполнение программы:
return 0;
}
Все, с приготовлениями покончено, приступим к разработке алгоритма, придерживаясь придуманного интерфейса программы. Для начала нужно вывести приветствие на экран, для этого нам понадобится оператор вывода <<.
cout << "Welcome! This is calculator by student Potapenko Vladimir, group C-13\n\n\n";
Это предложение консольного вывода. Оно приводит к выводу на экран сообщения, заключенного в двойные кавычки. сout представляет собой предопределенный идентификатор, обозначающий консольный вывод, который, как правило, закреплен за экраном. Комбинация знаков \n не выводится на экран, она служит для перевода курсора на следующую строчку. В данном случае я использовал их для того, чтобы создать пропуск между приветствием и меню.
Далее пойдут следующие строки:
int i, j;
cout << "Choose action:\n1. Calculate two numbers\n2. Calculate square of geometric figures\n3. Calculate summ or factorial\n4. Calculate sin(x), cos(x),tg(x),ctg(x)\n5. Play 'Guess number'\n";
do
{
cin >> j;
if (j<1 || j>5) cout<<"Please, input number from 1 to 5:\n";
}
while (j<1 || j>5);
cout << "\n";
int i, j; - это ничто иное, как объявление переменных целого типа, далее идет вывод на экран главного меню. Конструкция do – while(j<1 || j>5); – это цикл, который будет выполняться пока выражение, стоящее в скобках возвращает значение true. Фигурные скобки нужны для того, чтобы цикл выполнял несколько операторов за один шаг. Внутри скобок стоит оператор ввода данных с клавиатуры >>. По умолчанию cin связан с клавиатурой, хотя его можно перенаправлять и на другие устройства. В данном случае пользователь введет значение, которое будет присвоено переменной j. Оператор if – оператор условия, если выражение, стоящее в скобках возвратит значение true, то все что стоит за ним, будет выполнено, в данном случае выведем на экран просьбу ввести число еще раз.
Человек ввел цифру, но как заставить программу понять, какую часть калькулятора он хочет использовать. Все довольно просто, в этом нам поможет предложение switch:
switch(выражение) {
case константа1:
последовательность предложений
break;
case константа2:
последовательность предложений
break;
.
.
.
default:
последовательность предложений
}
Возьмем за выражение переменную j, а за константы те самые цифры от 1 до 5.
switch(j)
{
case 1:
case 2:
case 3:
case 4:
case 5:
}
Теперь для каждого case будем писать свою часть кода. Начнем с case1:
case 1:
double a, b;
cout << "Input action: \n1. + \n2. -\n3. * \n4. / \n5. a^b\n";
do
{
cin >> i;
if (i<1 || i>5) cout<<"Please, input number from 1 to 5:\n";
}
while (i<1 || i>5);
Объявили две переменные вещественного типа, вывели на экран подменю и сделали проверку на возможность ошибки при выборе пункта меню.
Далее вводятся с клавиатуры 2 числа и в зависимости от выбранного меню (переменная i), производится вывод результата, в случае деления двух чисел пришлось сделать проверку на деление на ноль:
cout << "Input 2 numbers:\na: ";
cin >> a;
cout << "b: ";
cin >> b;
cout << "\n";
if(i==1)cout << a << " + " << b << " = " << a+b;
if(i==2)cout << a << " - " << b << " = " << a-b;
if(i==3)cout << a << " * " << b << " = " << a*b;
if(i==4)
{
if(b==0)
{
cout << "Can't /0 !" ;
do
{
cout << "\nInput new number 'b': ";
cin >> b;
}
while (b==0);
}
if(b!=0) cout << a << " / " << b << " = " << a/b;
}
if(i==5)cout << a << "^" << b << " = " << pow(a, b);
break;
Все, первый пункт в главном меню сделан, можно переходить ко второму. Принцип будет использоваться один и тот же, но здесь я посчитал нужным использовать еще одно предложение switch. Здесь я запрошу площадь, какой фигуры пользователь хочет подсчитать, и в зависимости от выбора введу свои переменные и выведу результат.
case 2:
cout << "What figure do you want to calculate square of?\n1. Rectangle\n2. Circle\n3. Triangle\n";
do
cin >> i;
while(i<1 || i>3);
{
cout << "\n";
if (j<i || i>3) cout<<"Please, input number from 1 to 3:\n";
}
switch(i)
{
case 1:
double a, b;
cout << "Input length of first side: ";
cin >> a;
cout << "Input length of second side: ";
cin >> b;
cout << "\nSquare: " << a*b;
break;
case 2:
double r;
cout << "Input radius: ";
cin >> r;
cout << "\nSquare: " << 3.14*r*r;
break;
case 3:
double s, h;
cout << "Input length of basis: ";
cin >> s;
cout << "Input height: ";
cin >> h;
cout << "\nSquare: " << 0.5*s*h;
break;
}
break;
Начинаем делать третий пункт главного меню. Делаем такое же подменю с возможностью выбора и проверкой этого выбора. Есть один момент, если пользователь калькулятора введет первое число больше последнего, то программа должна все равно найти результат, пойду я ввожу проверку и в таком случае меняю значения переменных местами. Для подсчета суммы или произведения используются циклы for.
case 3:
int a3,b3,key, c3;
cout << "What do you want to do?\n1. Calculate summ\n2. Calculate factorial\n";
do
{
cin >> key;
if (key<1 || key>2) cout<<"Please, input number from 1 to 2:\n";
}
while (key<1 || key>2);
cout << "\n";
cout << "Input the first number: ";
cin >> a3;
cout << "Input the last number: ";
cin >> b3;
cout << "\n";
if (b3<a3)
{
c3=b3;
b3=a3;
a3=c3;
}
switch (key)
{
case 1:
double sum ;
sum=0;
for(i=a3;i<=b3;sum+=i++);
cout << "Summ from " << a3 << " to " << b3 << ": " << sum << "\n";
break;
case 2:
double fac;
fac=1;
for(i=a3;i<=b3;fac*=i++);
cout << "Factorial from "<< a3 <<" to "<< b3 << ": " << fac << "\n";
break;
}
break;
Теперь необходимо разработать алгоритм подсчета значения тригонометрических формул в зависимости от аргумента. Как было замечено в разделе «Аномалии входных данных», нужно учесть, что тангенс и котангенс не существуют при некоторых значениях аргумента. В этом случае приходится использовать операторы условия if – else.
case 4:
double sctc;
cout << "Input number 'x': ";
cin >> sctc;
cout << "\nSin = " << sin(sctc) << "\nCos = " << cos(sctc);
if(cos(sctc)==0) cout << "\nTg does not exist\nCtg = " << cos(sctc)/sin(sctc);
else if(sin(sctc)==0) cout << "\nTg = " <<sin(sctc)/cos(sctc) << "\nCtg does not exist";
else cout << "\nTg = "<<sin(sctc)/cos(sctc) << "\nCtg = " << cos(sctc)/sin(sctc);
break;
Осталась последняя часть калькулятора: игра «Угадай число». Строка srand(time(0)); - используется, чтобы при выполнении программы каждый раз генерировались разные числа, int magic=random(25); - собственно присваивает переменной magic значение от 0 до 25 путем случайной генерации числа. Переменная magic и есть то число, которое нужно отгадать. А человек будет вводить значения в переменную guess, и если они совпадут не более чем за 5 попыток, то игрок получит сообщение о победе, в противном случае о проигрыше. Каждая неудачная попытка будет сопровождаться подсказкой компьютера о том, больше или меньше «задуманное» число, чем введенное игроком. Сделать все это лучше в цикле, чтобы при удачной попытке отгадать число можно было сразу завершить игру. Если игрок будет вводить значения не из промежутка от 0 до 25, то попытка не будет засчитана и ему будет предложено снова ввести число.
case 5:
int guess, count;
srand(time(0));
int magic=random(25);
cout << "Guess number between 0 and 25 or you will die :)\nYou have 5 attempts:\n";
cout << "First attempt: ";
do
cin >> guess;
while (guess<0 || guess>25);
count=1;
while(guess!=magic && count!=5)
{
if (guess==magic) cout << "\nYou win!";
else
{
cout << "\nYou are wrong, try again.\n";
if (guess<magic) cout << "Tip:My number > your number";
else cout << "My number < your number";
cout << "\n\nNext attempt: " ;
do
cin >> guess;
while(guess<0 || guess>25);
count++;
if (guess==magic) count--;
if (count==5)
{
cout << "\nYou lose!\n";
cout << " __\n";
cout << " | |\n";
cout << " O |\n";
cout << " /|\\ |\n";
cout << " / \\ |\n";
cout << " ____|_\n\n";
cout << "Answer was " << magic;
}
}
}
if(count<5)
{
cout << "\n ========== \n";
cout << " You win! ";
cout << "\n ========== \n";
}
break;
}
Последняя закрывающая фигурная скобка останавливает предложение switch, которое мы ввели после главного меню, из этого следует, что программа почти готова. Осталось добавить возможность использовать калькулятор по несколько раз, не перезапуская приложения. Для этого почти в начале алгоритма добавим 3 строки и в конце – 5 строк:
char exit;
cout << "Welcome! This ... C-13”;
do
{
здесь располагаются все предложения, что мы уже написали
cout << "\n\nPress 'y' to use calculator again or any other key to exit\n";
cin >> exit;
system("cls");
}
while(exit=='y');
Если пользователь введет символ «y», то алгоритм пойдет по очередному кругу, в противном случае программа завершит работу. system("cls"); - используется для очистки экрана от предыдущей работы с калькулятором.
На этом программу можно считать целиком написанной и готовой к использованию.
Алгоритм калькулятора на языке C++ целиком:
#include <iostream. h>
#include <cstdlib. h>
#include <cmath. h>
using namespace std;
int main()
{
char exit;
cout << "Welcome! This is calculator by student Potapenko Vladimir, group C-13\n\n\n";
do
{
int i, j;
cout << "Choose action:\n1. Calculate two numbers\n2. Calculate square of geometric figures\n3. Calculate summ or factorial\n4. Calculate sin(x),cos(x),tg(x),ctg(x)\n5. Play 'Guess number'\n";
do
{
cin >> j;
if (j<1 || j>5) cout<<"Please, input number from 1 to 5:\n";
}
while (j<1 || j>5);
cout << "\n";
switch(j)
{
case 1:
double a, b;
cout << "Input action: \n1. + \n2. -\n3. * \n4. / \n5. a^b\n";
do
{
cin >> i;
if (i<1 || i>5) cout<<"Please, input number from 1 to 5:\n";
}
while (i<1 || i>5);
cout << "\n";
cout << "Input 2 numbers:\na: ";
cin >> a;
cout << "b: ";
cin >> b;
cout << "\n";
if(i==1)cout << a << " + " << b << " = " << a+b;
if(i==2)cout << a << " - " << b << " = " << a-b;
if(i==3)cout << a << " * " << b << " = " << a*b;
if(i==4)
{
if(b==0)
{
cout << "Can't /0 !" ;
do
{
cout << "\nInput new number 'b': ";
cin >> b;
}
while (b==0);
}
if(b!=0) cout << a << " / " << b << " = " << a/b;
}
if(i==5)cout << a << "^" << b << " = " << pow(a, b);
break;
case 2:
cout << "What figure do you want to calculate square of?\n1. Rectangle\n2. Circle\n3. Triangle\n";
do
cin >> i;
while(i<1 || i>3);
{
cout << "\n";
if (j<i || i>3) cout<<"Please, input number from 1 to 3:\n";
}
switch(i)
{
case 1:
double a, b;
cout << "Input length of first side: ";
cin >> a;
cout << "Input length of second side: ";
cin >> b;
cout << "\nSquare: " << a*b;
break;
case 2:
double r;
cout << "Input radius: ";
cin >> r;
cout << "\nSquare: " << 3.14*r*r;
break;
case 3:
double s, h;
cout << "Input length of basis: ";
cin >> s;
cout << "Input height: ";
cin >> h;
cout << "\nSquare: " << 0.5*s*h;
break;
}
break;
case 3:
int a3,b3,key, c3;
cout << "What do you want to do?\n1. Calculate summ\n2. Calculate factorial\n";
do
{
cin >> key;
if (key<1 || key>2) cout<<"Please, input number from 1 to 2:\n";
}
while (key<1 || key>2);
cout << "\n";
cout << "Input the first number: ";
cin >> a3;
cout << "Input the last number: ";
cin >> b3;
cout << "\n";
if (b3<a3)
{
c3=b3;
b3=a3;
a3=c3;
}
switch (key)
{
case 1:
double sum ;
sum=0;
for(i=a3;i<=b3;sum+=i++);
cout << "Summ from " << a3 << " to " << b3 << ": " << sum << "\n";
break;
case 2:
double fac;
fac=1;
for(i=a3;i<=b3;fac*=i++);
cout << "Factorial from "<< a3 <<" to "<< b3 << ": " << fac << "\n";
break;
}
break;
case 4:
double sctc;
cout << "Input number 'x': ";
cin >> sctc;
cout << "\nSin = " << sin(sctc) << "\nCos = " << cos(sctc);
if(cos(sctc)==0) cout << "\nTg does not exist\nCtg = " << cos(sctc)/sin(sctc);
else if(sin(sctc)==0) cout << "\nTg = " <<sin(sctc)/cos(sctc) << "\nCtg does not exist";
else cout << "\nTg = "<<sin(sctc)/cos(sctc) << "\nCtg = " << cos(sctc)/sin(sctc);
break;
case 5:
int guess, count;
srand(time(0));
int magic=random(25);
cout << "Guess number between 0 and 25 or you will die :)\nYou have 5 attempts:\n";
cout << "First attempt: ";
do
cin >> guess;
while (guess<0 || guess>25);
count=1;
while(guess!=magic && count!=5)
{
if (guess==magic) cout << "\nYou win!";
else
{
cout << "\nYou are wrong, try again.\n";
if (guess<magic) cout << "Tip:My number > your number";
else cout << "My number < your number";
cout << "\n\nNext attempt: " ;
do
cin >> guess;
while(guess<0 || guess>25);
count++;
if (guess==magic) count--;
if (count==5)
{
cout << "\nYou lose!\n";
cout << " __\n";
cout << " | |\n";
cout << " O |\n";
cout << " /|\\ |\n";
cout << " / \\ |\n";
cout << " ____|_\n\n";
cout << "Answer was " << magic;
}
}
}
if(count<5)
{
cout << "\n ========== \n";
cout << " You win! ";
cout << "\n ========== \n";
}
break;
}
cout << "\n\nPress 'y' to use calculator again or any other key to exit\n";
cin >> exit;
system("cls");
}
while(exit=='y');
return 0;
}
Заключение
В своей курсовой работе я показал некоторые возможности языка С++ на примере калькулятора. Это лишь малая доля тех возможностей, какие предоставляет этот язык. Различия с Паскалем очевидны и довольно существенны, причем эти отличия только усложняют работу программиста. Но функциональность C++ куда больше, и вариативность написания многих частей программы сводится к нескольким способам. C++ позволяет создать сложные приложения, не только работая в консольном режиме, но и в графическом. Многие приложения в Windows написаны именно на этом языке, поэтому о нем можно говорить как об очень мощном языке программирования.
Список используемой литературы
«C++ для начинающих», Г. Шилдт, 2007г. «C++ для чайников», , 2003г.Ссылка на .exe файл калькулятора:
http://potapenko-va. *****/Calc. exe
Ссылка на .cpp файл калькулятора:
http://potapenko-va. *****/calc. cpp
Калькулятор
- Калькулятор матриц. Курсовая работа
- Курсовая работа по дисциплине «Микропроцессорные системы» на тему «Двоичный калькулятор»
- Курсовая работа «Двухбайтовый десятичный калькулятор» по курсу «Микропроцессорные системы»
- Тема курсового проекта: “Разработка калькулятора без графической оболочки на языке С++”
- Исследовательская работа по математике. Тема: Плюсы и минусы калькулятора в школе
- Перевод двоичных чисел в десятичную систему счисления. Работа с приложением Калькулятор. Конспект урока
- Программа Калькулятор. Конспект урока
- Преобразование информации по заданным правилам. Практическая работа. Выполняем вычисления с помощью программы Калькулятор. Конспект урока
- Коммунальный калькулятор. Как проверить расчеты по платежам за квартиру?
- Налоговый калькулятор: как рассчитать стоимость патента?
Проекты по теме:
Основные порталы (построено редакторами)




