Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 01.06.2012
Сообщений: 14
1

Вычисление выражений. Арифметика (+ - * /). С числами и переменными A-D

01.06.2012, 22:04. Показов 1338. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
это тема моего курсовика, в qt работаем с начала семестра, не сильно шарю. У меня есть окно, в которое вводится выражение с переменными, и есть четыре окошка для переменных A-D, в которые вводятся собственно значения переменных, сказали здесь должен быть парсинг, я весь форум пролистал, везде идет речь об ОПЗ, но я не догоняю, с помощью опз должны вводиться значения? если так, то мне это не подходит.
Короч, подскажите с чего начать ну и как бы что за чем делать
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.06.2012, 22:04
Ответы с готовыми решениями:

Вычисление значений математических выражений с рациональными числами
Доброго времени суток. Задача состоит в: пользователь вводит выражение (пример:...

Вычисление непрерывных дробей и выражений. Вычисление полиномов и их производных.
1. Чему равна знакочередующаяся сумма цифр числа n. 2. Даны натуральное число n и...

Арифметика с 4 байтными числами
положим у меня есть код MOV AX,1000h MOV BX,FFF7 IMUL BX в итоге получаю в DX=FFFF, AX=7000 ...

Арифметика с НЕ-целыми числами.
Наткнулся на проблему. Арифметика работает только с цельными числами. Но нужно работать с...

7
Автор FAQ
2732 / 1428 / 89
Регистрация: 08.09.2011
Сообщений: 3,746
Записей в блоге: 1
01.06.2012, 22:26 2
а что такое ОПЗ ? Я вот вообще не понимаю в чем тут проблема, заменить в строке имя переменной на ее значение?
0
0 / 0 / 0
Регистрация: 01.06.2012
Сообщений: 14
01.06.2012, 22:30  [ТС] 3
1.обратная польская запись
2.мне нужно из окна пропарсить введенное выражение решить его с подстановкой значений переменных и вывести в окно ответа

Добавлено через 49 секунд
мне с парсингом помощь нужна, ну и да с подстановкой тоже
0
Автор FAQ
2732 / 1428 / 89
Регистрация: 08.09.2011
Сообщений: 3,746
Записей в блоге: 1
01.06.2012, 23:12 4
для парсинга используцие QRegExp
0
Эксперт С++
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
01.06.2012, 23:15 5
Цитата Сообщение от uNaple Посмотреть сообщение
мне с парсингом помощь нужна, ну и да с подстановкой тоже

Не по теме:

да чо уж тут и было бы не плохо, что бы и сдали за меня то же....


смотрите в сторону regexp там все просто, про них почитайте в факе Чистого, не зря же человек старался
0
0 / 0 / 0
Регистрация: 01.06.2012
Сообщений: 14
06.06.2012, 23:10  [ТС] 6
написал вроде бы все норм, только вот ошибки, которые вообще никак не догоняю
parsing.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <parsing.h>
 
double calc(char *expres)
{
    answer = addition(expres);
    return answer;
}
 
double addition(char* expres)//сложение, ищет + и -
{
    sum=0;
    int fst=0;
    int lst=strlen(expres);
    for(int i=fst;i<lst+1;i++)
    {
        if ((expres[i]=='+') || (expres[i]=='-'))//ищем плюс или минус, если нашли передаем номер элемента в умножение
        {
            sum+=multipli(*expres,fst,i);
            fst=i++;
        }
        else if (i==lst)
        {
            sum+=multipli(*expres,fst,lst);
        }
        else continue;
    }
    return sum;
}
 
double multipli(char* expres,int fst,int lst)//умножение, ищет * и /,принимает сложение
{
    mult=0;
    for(int j=fst;j<lst;j++)
    {
        if ((expres[j]=='*') || (expres[j]=='/'))//ищем * или /, если нашли передаем номер элемента в множитель
        {
            mult+=factor(*expres,fst,j);
            fst=j++;
        }
        else if(j==lst)
        {
            mult+=factor(*expres,fst,lst);//если нет, то передаем прошлый номер
        }
        else continue;
    }
    return mult;
}
 
double factor(char* expres,int fst,int lst)//множитель, ищет число и a-d
{
    row.cur=0;
    for(int i=fst;i<lst;i++)
    {
        if (isdigit(expres[i]) != 0)
        {
            sscanf(expres,"%lf",number);
//            row.Arr[row.cur]=i;
//            row.cur++;
        }
        else if(isalpha(expres[i] != 0))
        {
            if(i=='a')
            {
                number=val.a;
            }
            else if(i=='b')
            {
                number=val.b;
            }
            else if(i=='c')
            {
                number=val.c;
            }
            else if(i=='d')
            {
                number=val.d;
            }
        }
        else exit(0);
    }
    return number;
}
mainwindow.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "parsing.h"
#include "qregexp.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::on_Calc_clicked()
{
    char* expres = ui->leExpression->text().toAscii().data();//считываем строку
    val.a = ui->leA->text().toDouble();
    val.b = ui->leB->text().toDouble();
    val.c = ui->leC->text().toDouble();
    val.d = ui->leD->text().toDouble();
    answer = addition(expres);
    QString answers = QString::number(answer);
    ui->Answer->setText(answers);
}
parsing.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#ifndef PARSING_H
#define PARSING_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
 
struct val
{
    double a;
    double b;
    double c;
    double d;
};
 
struct row
{
    char Arr[100];
    int cur;
};
 
double answer;
double addition(char* expres);
double multipli(char* expres,int fst,int lst);
double factor(char* expres,int fst,int lst);
double sum;
double mult;
double number;
 
 
#endif // PARSING_H
вот какие ошибки
parsing.cpp: In function 'double addition(char*)':
parsing.cpp:18: error: invalid conversion from 'char' to 'char*'
parsing.cpp:18: error: initializing argument 1 of 'double multipli(char*, int, int)'
parsing.cpp:23: error: invalid conversion from 'char' to 'char*'
parsing.cpp:23: error: initializing argument 1 of 'double multipli(char*, int, int)'
parsing.cpp: In function 'double multipli(char*, int, int)':
parsing.cpp:37: error: invalid conversion from 'char' to 'char*'
parsing.cpp:37: error: initializing argument 1 of 'double factor(char*, int, int)'
parsing.cpp:42: error: invalid conversion from 'char' to 'char*'
parsing.cpp:42: error: initializing argument 1 of 'double factor(char*, int, int)'
parsing.cpp: In function 'double factor(char*, int, int)':
parsing.cpp:51: error: expected unqualified-id before '.' token
parsing.cpp:56: warning: format '%lf' expects type 'double*', but argument 3 has type 'double'
parsing.cpp:64: error: expected primary-expression before '.' token
parsing.cpp:68: error: expected primary-expression before '.' token
parsing.cpp:72: error: expected primary-expression before '.' token
parsing.cpp:76: error: expected primary-expression before '.' token
объясните что значат последние, потому что вроде структура объявлена, а все равно какой-то косяк, и вот этот invalid conversion from 'char' to 'char*'
тут просто еще без обработки ошибок и без всего, просто считаем что пользователь вводит норм выражение
может у меня в файлах косяки?
0
Автор FAQ
2732 / 1428 / 89
Регистрация: 08.09.2011
Сообщений: 3,746
Записей в блоге: 1
07.06.2012, 21:48 7
ну вам как минимум написали что не может переконвертировать char в char*
0
0 / 0 / 0
Регистрация: 01.06.2012
Сообщений: 14
08.06.2012, 15:17  [ТС] 8
разобрался, косяк со структурами был, не правильно понял их суть
0
08.06.2012, 15:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.06.2012, 15:17
Помогаю со студенческими работами здесь

Обмен числами между переменными
Вобщем надо реализовать обмен числами между переменными... Например: было 1000. От неё мы отнимаем...

Длинная арифметика: арифметические операции над числами
Срочно нужны исходники (функции): 1. Перевод обычного числа в длинное (массив, строка , вектор кто...

Длинная арифметика, действия над многоразрядными числами
Помогите реализовать действия над большими числами . То есть вводишь с клавиатуры два больших...

Длинная арифметика. Класс работы с длинными числами.
// модул_умнож.cpp : main project file. #include &quot;stdafx.h&quot; #include &quot;vector&quot; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru