Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Калькулятор на С++ (http://forum.oszone.net/showthread.php?t=29678)

PRaetorian 21-05-2004 20:50 205290

Задали на курсовую написать калькулятор на С++. может кто кинет исходники, плиз, а то и кроме этого запарка... или хоть ссылки, где искать. помогите!!!

BrutalBit 21-05-2004 22:02 205291

http://algolist.manual.ru/syntax/index.php

pva 07-06-2004 13:51 205292

Стандартная задача.
В книге Страуструпа есть законченный пример программируемого калькулятора.

Hector 10-04-2011 23:03 1655533

Цитата:

Цитата PRaetorian
Задали на курсовую написать калькулятор на С++ »

блин, мне бы такие курсовые. неделю назад, на лабе делали. в чем конкретно проблема?

Vaniok 11-04-2011 17:40 1655926

Задали на курсовую написать калькулятор на С++ чтоби считал arctg(x)

Delirium 12-04-2011 01:02 1656188

Vaniok, тебе последнее предупреждение за дублирование постов. В след. раз будет бан.
Vaniok, дали задание - делай. Есть проблемы - спрашивай в отдельно созданной теме. За тебя её никто делать не будет здесь.

Vaniok 12-04-2011 22:15 1656847

ну может у кого то уже ест готов код...или какието ссилки...

lxa85 13-04-2011 00:06 1656946

тут же тебе приводили код калькулятора. Допиши для него вычисление функции arctg и все. Это быстрее чем за тебя готовое решение искать.

Vaniok 13-04-2011 12:14 1657219

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

Hilaly 13-04-2011 12:18 1657224

А в чем проблема? существует ф-я
T atan(T)
Вам надо то только добавить обработчик события по нажатию кнопки ?

lxa85 13-04-2011 13:01 1657275

Vaniok, C++ арктангенс,
c++ arctan
Раз два
Дальше сам справишься?

Vaniok 14-04-2011 21:20 1658501

да. и прописать ету функцию в програме...

о спасибо за полезную инфу.)

Buchik 19-05-2011 10:06 1678948

Вот моя проблема: мне нужно написать калькулятор, который щитает выражения в скобках (с ОПН или ОПЗ это одно и то же)
так вот я нашёл калькулятор, который щитает сарзу переведённую запись в ОПЗ, но мне нужно сделать что бы это переводило автоматом в ОПЗ и щитало...
тоесть выражение 34 + ( 45*3+5)
это выражение выглядит в ОПН как 34 45 3 * 5 ++

вот мой код
Код:

#include "stdafx.h"
#include <stdio.h>

int _tmain(int argc, _TCHAR* argv[])
 {
    int stack[1000]; 
    // sp = индекс ячейки, куда будет push-иться очередное число
    int sp =0;      // (sp-1) = индекс ячейки, являющейся вершиной стека
    while ( !feof(stdin) )
        {
        int c = getchar() ;
        int x ;
        switch ( c )
                {
            case  ' ' :
            case '\n' :
                break ;
            case '=' :
                printf( "Result = %d\n", stack[sp - 1] ) ;  sp-- ;
                break ;
            case '+' :
                stack[sp-2] = stack[sp-2] + stack[sp-1] ;  sp-- ;
                break ;
            case '-' :
                stack[sp-2] = stack[sp-2] - stack[sp-1] ;  sp-- ;
                break ;
            case '*' :
                stack[sp-2] = stack[sp-1] * stack[sp-2] ;  sp-- ;
                break ;
            case '/' :
              stack[sp-2] = stack[sp-2] / stack[sp-1] ;  sp-- ;
                break ;
            default :
                ungetc (c, stdin); // вернуть символ обратно в поток
                if ( scanf( "%d" , &x ) != 1 )
                                {
                    fprintf( stderr , "Can't read integer\n" ) ;
                    return -1 ;
                }
                                else
                                {
                    stack[sp] = x ;
                                        sp++ ;
                }
        }
    }
    printf( "Result = %d\n" , stack[sp-1] ) ;
    return 0 ;
 }


lxa85 19-05-2011 22:00 1679269

Выматался, дальше запроса в гугл сейчас искать ничего не буду.
алгоритмы перевода выражения в ОПЗ Даже если написано на Pascal, понять логику работы и перевести на С++ не составит труда.

Buchik 22-05-2011 15:32 1680611

Логика понятна, но "перевести на С++ не составит труда." с этим проблемы....Как из char строки введёной с клавиатуры задать цикл
который , бы загонял число,стоящее до определённого символа в строке, в стек, а знак, в другой стек?? тока не отправляйте в гугл.. это элементарно , знаю но или у меня мозги уже закипели.. или я найти не могу...

lxa85 22-05-2011 16:06 1680623

значит чарку вина пропусти и будь проще.
А вообще, приложи исходник. Вариантов помещения символа в стек много (по смыслу одинаковые, но варианты вызова функции будут отличаться)
цикл от 0(или текущего значения) до заданного с анализом( if .... ; case ... и т.п.) полученного символа.
В принципе и схем получения ОПЗ много, есть однопроходные, есть не очень, с применением стека , ссылочных типов данных (типа списков) и т.п.
В общем нужен код обрамленный тегом [code] [/code] #
кратко его прокомментируй, чтобы было понятно что и зачем, и выдели проблемный кусок, так всем будет проще.

Buchik 22-05-2011 23:39 1680823

вот, допустим вводим строку типа char назвали её переменной допустим vvod[1000] , объявили стек
stack <int> s1 ;


1206+(13*3)=

как , число 1206 загнать в стек , не зная какой размерности это число?..
s1.push( vvod[ 0 тирэ 3 ] ) ; вот что я имею в виду..или как преобразовать кусок чаровской строки в инт и загнать его в стек...

lxa85 23-05-2011 08:29 1680895

во первых ты летишь вперед паровоза.
Первое что тебе надо сделать - провести синтаксический анализ строки. Т.е. есть так называемая Форма Бэкуса-Наура, описывающая синтаксис.

Вводи вспомогательные функции определения подстроки числа / знака в строке.
s1.push (vvod[1-3]) тебе выполнить не дадут.
Не совместимость типов. Либо устранять не совместимость переводом в число [через поиск подстроки и т.д.], либо менять тип стека.

Buchik 23-05-2011 13:58 1681047

Я , сдался, нашёл пару исходников с готовыми калькуляторами...

lxa85 23-05-2011 14:04 1681053

Buchik, жаль что сдался, ну да ладно. Попробуем воскресить бренное тело :) С готовыми исходниками разобрался? Принцип их работы понятен?

Buchik 23-05-2011 19:02 1681208

Просто я позно спахватился,думал, что легко написать... а в эту пятницу уже курсач сдавать(( завтра буду разгребать, чуть что задам вопросиков..=))

Buchik 29-05-2011 22:19 1684772

Вот, пишу спросить немного по программе
у меня 3 файла, начальный, объявление класса и его компонентов, и деструкторы и конструкторы.

я буду помечать в коде, что хотел бы узнать, что обозначает. помогите пожалуйста.А то я отчёт по курсовой написал, а его ещё и защитить надо....

файл calc1.cpp
Код:


#include "stdafx.h"
#include "calc.h"
#include <iostream>
#include <locale>
using namespace std;
int main(int argc, char* argv[])
{
        wcout.imbue(locale("rus_rus.866"));
        char line [80];
        calc_var calculator;// что это обозначает?
        wcout << L"Доступные операции : +-*/ \n" ;
        wcout<< L"Введите 'z' для выхода.\n";
        while(true)
        {
                wcout << L"Введите выражение: \n";
                cin.getline(line,79);
                if(*line=='z')break;
                try// этот оператор что обозначает, опишите, как он работает
                {
                calculator.SetFunction(line);
                wcout << L"Ответ : "<< calculator.proceed() <<"\n" ;
                }
                catch(calc_var::SyntaxError e)
                {
                        wcout << L"Синтаксическая ошибка :" <<e.p<<"\n" ;
                }
                catch (calc_var::divzero)
                {
                        wcout << L"Ошибка.Деление на ноль!(Или равно бесконесность!)\n" ;
                };
                       
        }
        return 0;
}

файл calc.h
Код:


#include <string.h>
#include <ctype.h>
#include <math.h>
class calc_var 
{
public:
        double proceed();
        void SetFunction(char* lpszCommand);
        calc_var(char* lpszCommand);
        calc_var();
        struct divzero{};
        struct SyntaxError
        {
                const char* p;
                SyntaxError(const char* q){p=q;}
        };

        virtual ~calc_var();//что обозначает виртуал??
private:
        virtual        void GetToken();
        double mul_div();
        enum Tok_Type {UNDEF, NUMBER, OPERATOR, END};
        Tok_Type CurrTok;
protected://чем протектед от привайт отличается??? при чём ниже объявляются функции, а почему потом они вызываются , как конструкторы?
        char* pCurrPos;
        char TokenValue[16];
        double add_sub();
        char Function[255];
        virtual double prim();
};

файл calc.cpp
Код:


#include "stdafx.h"
#include "calc.h"
#include <string>
#include "ctype.h"
#include <math.h>
//////////////////////////////////////////////////////////////////////
// конструкторы/деструкторы
//////////////////////////////////////////////////////////////////////

calc_var::calc_var()//что это делает, и где оно вызывается??
{
 memset(Function,0,256);
 pCurrPos=Function;
}
calc_var::~calc_var()
{

}
calc_var::calc_var(char* lpszCommand)// что это? и где вызывается??
{
        SetFunction(lpszCommand);
}
void calc_var::SetFunction(char* lpszCommand)// что этот конструктор делает?
{
        strncpy_s(Function,lpszCommand,255);//strncpy_s(); что это обозначает??
        Function[255]=0;
        pCurrPos=Function;
}

double calc_var::proceed()
{
        if (strlen(Function)<1) throw(SyntaxError("No Expression"));//strlen(Function) - это что-то вроди если символов в ведённой линии маньше 1-цы то выыодит синтаксическую ошибку?
        return add_sub();
}

double calc_var::add_sub()
{
        double left=mul_div();
        while(true)
        {
                switch (*TokenValue)
                {
                case '+':  left+=mul_div(); break;
                case '-': left-=mul_div();break;
                default: return left;
                }
               
        }

}

double calc_var::mul_div()
{
        double left=prim();
        while (true)
        {
                switch(*TokenValue)
                {
                case '(': if(pCurrPos-Function)pCurrPos--;
                                //предоставлена возможность не ставиь знак * перед и после скобки.
                        //уменьшаем текущую разбираемую позицию на 1 и далее вызывается стандартное умножение
                case '*': left*=prim();break;
                case '/': { double d=prim();
                                        if(d==0) throw(divzero());
                                        left/=d;
                                        break;}
                default:return left;
                }

        }
}

double calc_var::prim()// что делает этот конструктор???, шде он вызывается я вижу , но что он именно делает?
{
        GetToken();
        switch(CurrTok)
        {
        case NUMBER://что делает ,если кейс попадает на это условие???
                {
                        double temp=atof(TokenValue);
                        GetToken();
                        return temp;
                }
        case OPERATOR:
                {
                        switch(*TokenValue)
                        {
                                case '-':return -prim();
                                case '+':return prim();
                                case '(':
                                        {
                                                double temp=add_sub();
                                                if(*TokenValue!=')') throw(SyntaxError(") expected"));
                                                GetToken();
                                                return temp;
                                        }
                        }
                        throw(SyntaxError("Incorrect operator"));
                }
        default:throw(SyntaxError("No Expression"));
        }

}

void calc_var::GetToken()//это отсортировывает операции в отдельную переменную??
{
        if(!pCurrPos){ CurrTok=END; *TokenValue=0; return;}//конец выражения
        while(*pCurrPos==' ')pCurrPos++;//Пропускаем пробелы в начале

       
        char* temp=TokenValue;
        if(isdigit(*pCurrPos))
        {
                CurrTok=NUMBER;
                while(isdigit(*pCurrPos)||(*pCurrPos=='.'))*temp++=*pCurrPos++;

        }
        else if(strchr("+-*/()",*pCurrPos))//strchr("+-*/()",*pCurrPos) что за условие проверяет этот иф???strchr что обозначает??
        {
                CurrTok=OPERATOR;
                //перейти к следующему символу
                *temp++=*pCurrPos++;//занесли в TokenValue оператор
        }
        else CurrTok=END;
        *temp=0;
}



Тока пожалуйста не посылайте читать книжки.....и если можно объясните попонятней) и всё , что я закоментил, это важно для меня....

lxa85 30-05-2011 00:03 1684824

Цитата:

Цитата Buchik
calc_var calculator; »

Вон у тебя calc.cpp реализует тип 'calc_var'. Соотв этой строкой ты создаешь переменную "calculator" типа calc_var, реализация которой написана в calc.cpp.
Цитата:

Цитата Buchik
try// этот оператор что обозначает, опишите, как он работает »

Операторы try... catch. Нужны, чтобы "ловить" ошибки и программировать действия программы в том или ином случае. Что собственно и делается в программе.
Что касается отличий virtual, protected и т.п. - все таки придется тебе прочесть главу по объектам. Хотя бы "по диагонали".
...
calc.cpp завтра распишу. Говорил тебе - пиши сам, проще будет. Вечно не послушаются...

Buchik 31-05-2011 12:26 1685597

Всё, уже ненада, защитил курсовую и так) большое спасибо.


Время: 15:18.

Время: 15:18.
© OSzone.net 2001-