Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2015, 01:33   #1
velllum
 
Регистрация: 28.03.2015
Сообщений: 7
По умолчанию Калькулятор обыкновенных дробей на Qt

Всем привет!!! Не могу запустить калькулятор обыкновенных дробей, который должен работать на QT, нужно соединить одни объекты с другими, то есть нужно к кнопкам плюса, минуса и т.д. привязать операторов вычисления!



fraction.h
Код:
#ifndef FRACTION_H
#define FRACTION_H
 
namespace shaa {
 
class Fraction
 
{
 
public:
 
    Fraction(int num = 0, int den = 1);   
 
    Fraction(const Fraction &obj);        
                                                
    ~Fraction();                                  
 
    const Fraction& operator=(const Fraction &obj);      
 
    operator double() const;                               
 
    int numerator() const;                                 
 
    void setNumerator(int num);                            
 
    int denominator() const;                                 
 
    void setDenominator(int den);                         
 
private:
 
    int _num; 
    int _den; 
 
};
 
 const Fraction operator+(const Fraction &a, const Fraction &b);         
 
 const Fraction operator-(const Fraction &a, const Fraction &b);                
 
 const Fraction operator*(const Fraction &a, const Fraction &b);               
 
 const Fraction operator/(const Fraction &a, const Fraction &b);               
}
 
#endif // FRACTION_H


fraction.cpp
Код:
#include "fraction.h"
 
enum ERRORS {ILLEGAL_FRACTION};
 
using namespace shaa;
 
 
Fraction::Fraction(int num, int den){
 
    _num = num;
    _den = den;
 
}
 
 
 
Fraction::Fraction(const Fraction& obj){
 
    _num = obj._num;
    _den = obj._den;
 
}
 
Fraction::~Fraction(){
 
 
 
}
 
 
const Fraction& Fraction::operator=(const Fraction& obj){
 
    Fraction(obj._num, obj._den);
    return *this;
 
}
 
 
 
Fraction::operator double() const{
 
    return double (_num/_den);
 
}
 
 
 
int Fraction::numerator() const{
 
    return _num;
 
}
 
 
int Fraction::denominator() const{
 
    return _den;
 
}
 
 
void Fraction::setNumerator(int num){
 
    _num = num;
}
 
 
void Fraction::setDenominator(int den){
 
    if(den == 0)
            throw ILLEGAL_FRACTION;
    _den = den;
}
 
 
 
const Fraction operator+(const Fraction &a, const Fraction &b){
 
    return Fraction( a.numerator()*b.denominator()+a.denominator()*b.numerator(),
                     a.denominator()*b.denominator());
 
}
 
 
const Fraction operator-(const Fraction &a, const Fraction &b){
 
    return Fraction(a.numerator()*b.denominator()-a.denominator()*b.numerator(),
                    a.denominator()*b.denominator());
 
}
 
 
const Fraction operator*(const Fraction &a, const Fraction &b){
 
    return Fraction(a.numerator()*b.numerator(),
                    a.denominator()*b.denominator());
 
}
 
 
const Fraction operator/(const Fraction &a, const Fraction &b){
 
    return Fraction(a.numerator()*b.denominator(),
                    a.denominator()*b.numerator());
 
}

Последний раз редактировалось velllum; 28.03.2015 в 01:44.
velllum вне форума Ответить с цитированием
Старый 28.03.2015, 01:47   #2
velllum
 
Регистрация: 28.03.2015
Сообщений: 7
По умолчанию

form.h
Код:
#ifndef FORM_H
#define FORM_H
 
#include "fraction.h"
#include <QWidget>
#include <QPushButton>
#include <QLineEdit>
#include <QMessageBox>
 
using namespace shaa;
 
class Form : public QWidget
{
    Q_OBJECT
 
public:
    explicit Form(QWidget *parent = 0);
    ~Form();
 
private:
 
    QPushButton *slojenie;
    QPushButton *vichetan;
    QPushButton *umnojen;
    QPushButton *delenie;
 
    QLineEdit *a_num;
    QLineEdit *b_den;
    QLineEdit *c_num;
    QLineEdit *d_den;
    QLineEdit *otvet_num;
    QLineEdit *otvet_den;
 
    QMessageBox *box;
 
private slots:
 
    void button_slojenie();
    void button_vichitan();
    void button_umnojen();
    void button_delenie();
 
    void line_a_num();
    void line_b_den();
    void line_c_num();
    void line_d_den();
 
};
 
#endif // FORM_H


form.cpp
Код:
#include "fraction.h"
#include "form.h"
 
using namespace shaa;
 
Form::Form(QWidget *parent) :
    QWidget(parent)
{
 
 
    setWindowTitle("Калькулятор");
 
    slojenie = new QPushButton(this);
    slojenie -> show();
    slojenie -> setText("Сложение");
    slojenie -> setGeometry(30,220,90,30);
 
    vichetan = new QPushButton(this);
    vichetan -> show();
    vichetan -> setText("Вычитание");
    vichetan -> setGeometry(130,220,90,30);
 
    umnojen = new QPushButton(this);
    umnojen -> show();
    umnojen -> setText("Умножение");
    umnojen -> setGeometry(230,220,90,30);
 
    delenie = new QPushButton(this);
    delenie -> show();
    delenie -> setText("Деление");
    delenie -> setGeometry(330,220,90,30);
 
 
 
    a_num = new QLineEdit(this);
    a_num -> show();
    a_num -> setGeometry(150,70,50,40);
 
    b_den = new QLineEdit(this);
    b_den -> show();
    b_den -> setGeometry(150,120,50,40);
 
    c_num = new QLineEdit(this);
    c_num -> show();
    c_num -> setGeometry(240,70,50,40);
 
    d_den = new QLineEdit(this);
    d_den -> show();
    d_den -> setGeometry(240,120,50,40);
 
    otvet_num = new QLineEdit(this);
    otvet_num -> show();
    otvet_num -> setGeometry(330,70,50,40);
 
    otvet_den = new QLineEdit(this);
    otvet_den -> show();
    otvet_den -> setGeometry(330,120,50,40);
 
 
    box = new QMessageBox();    
    // box -> show();
 
    connect(slojenie,SIGNAL(clicked()),this,SLOT(button_slojenie()));
    connect(vichetan,SIGNAL(clicked()),this,SLOT(button_vichitan()));
    connect(umnojen,SIGNAL(clicked()),this,SLOT(button_umnojen()));
    connect(delenie,SIGNAL(clicked()),this,SLOT(button_delenie()));
 
}
 
Form::~Form(){
 
 
 
}
 
 
 
void Form::button_slojenie(){
 
Fraction  a,b,c;
 
QString num_a = a_num -> text();
QString den_b = b_den -> text();
a = num_a.toInt() / den_b.toInt();
 
QString num_c = c_num -> text();
QString den_d = d_den -> text();
b = num_c.toInt() / den_d.toInt();
 
 
c.operator+(a,b);
 
 
otvet_num, "/", otvet_den -> setText(QString::number(c));
 
//otvet_num / otvet_den ->insertPlainText(QString::number(c));
 
}
 
 
 
void Form::button_vichitan(){
 
 
 
}
 
 
void Form::button_umnojen(){
 
 
 
}
 
 
void Form::button_delenie(){
 
 
 
}
 
 
void Form::line_a_num(){
 
 
 
}
 
 
void Form::line_b_den(){
 
 
 
}
 
 
void Form::line_c_num(){
 
 
 
}
 
 
void Form::line_d_den(){
velllum вне форума Ответить с цитированием
Старый 28.03.2015, 07:07   #3
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Может быть лучше архив с кодом выложить? - раз уж проект такой огромный?

Укажи почему именно "не получается запустить", как это проявляется? Ошибки получаешь?

Какую часть этого кода ты писал сам? - fraction, я так понимаю, ты взял готовый и с Qt он никак не связан. Ты пытаешься приделать к нему интерфейс?
rrrFer вне форума Ответить с цитированием
Старый 28.03.2015, 18:27   #4
velllum
 
Регистрация: 28.03.2015
Сообщений: 7
По умолчанию

Высылаю архив с кодом!

Я взял код с cpp немного его переделал и да как ты заметил пытаюсь его приделать к интерфейсу qt! У меня выпадает вот такая ошибка:

Код:
1. /home/pol/Qt/proekti/Fraction/form.cpp:90: ошибка: undefined reference to `shaa::operator+(shaa::Fraction const&, shaa::Fraction const&)'


2. :-1: ошибка: collect2: error: ld returned 1 exit status
Вложения
Тип файла: zip Fraction.zip (8.2 Кб, 9 просмотров)
velllum вне форума Ответить с цитированием
Старый 28.03.2015, 19:22   #5
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
У меня выпадает вот такая ошибка:
Дак а как эта ошибка с Qt связана? - написано же, что используется оператор +, на который нет ссылки. Т.е. оператор объявлен, но реализован.

Потому что скопипастил ты криво. И форматируешь код ужасно.

Смотри внимательно
Код:
shaa::operator+(shaa::Fraction
Т.е. он ищет оператор, размещенный внутри пространства имен shaa, и действительно, в хедере у тебя описан такой оператор.

Захожу я в .cpp и вижу оператор с таким же именем, но не внутри протсранства имен:
Код:
const Fraction operator+(const Fraction &a, const Fraction &b){

    return Fraction( a.numerator()*b.denominator()+a.denominator()*b.numerator(),
                     a.denominator()*b.denominator());

}
Строка
Код:
using namespace shaa;
Означает лишь то, что имена из пространства имен экспортируются в файл, т.е. тебе становятся доступны имена shaa::Fraction без указания имени пространства имен. Экспорт имен не означает, что размещенные внутри файла функции попадут в это же пространство имен. Это ведь более чем логично, например form.cpp у тебя тоже использует имена из shaa, но это же не значит что функции, реализованные в нем попадут в shaa, верно? )

Вобщем, правится так:
Код:
const Fraction shaa::operator+(const Fraction &a, const Fraction &b){

    return Fraction( a.numerator()*b.denominator()+a.denominator()*b.numerator(),
                     a.denominator()*b.denominator());

}
После этого код запускается, как работает не проверял.
Отформатирован код ужасно, читать больно.

Вместо написания вот такого кода руками:
Код:
    otvet_num = new QLineEdit(this);
    otvet_num -> show();
    otvet_num -> setGeometry(330,70,50,40);

    otvet_den = new QLineEdit(this);
    otvet_den -> show();
    otvet_den -> setGeometry(330,120,50,40);
ты можешь использовать дизайнер форм - просто вытащи нужные элементы на форму мышкой, это ведь гораздо удобнее чем задавать вручную размеры для кучи элементов.

Задавать так жестко размеры вообще неправильно. В Qt есть менеджер размещения, который сделает это автоматически.
rrrFer вне форума Ответить с цитированием
Старый 28.03.2015, 20:18   #6
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

velllum, у меня есть короткий пример, как сделать сложение двух чисел с помощью дизайнера --> ссылка
8Observer8 вне форума Ответить с цитированием
Старый 28.03.2015, 23:15   #7
velllum
 
Регистрация: 28.03.2015
Сообщений: 7
По умолчанию

Большое спасибо не заметил эту за эту ошибку!!! Ошибки больше нет но при вводе калькулятор выдает ноль!


Насчет того что писал ручками а не дизайнером, это для личного опыта, Ручками быстрей поймешь как все устроено, я как новичок хочу понять как все работает.
velllum вне форума Ответить с цитированием
Старый 28.03.2015, 23:24   #8
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Насчет того что писал ручками а не дизайнером, это для личного опыта, Ручками быстрей поймешь как все устроено, я как новичок хочу понять как все работает
Это похвально, но особо не услекайтесь, так как это не та вещь, на которую стоит тратить время. К тому же когда много кода то легче совершить ошибку и сложно её искать, а тем кто потенциально может помочь сложно разбираться с чужим кодом
8Observer8 вне форума Ответить с цитированием
Старый 28.03.2015, 23:24   #9
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Насчет того что писал ручками а не дизайнером, это для личного опыта, Ручками быстрей поймешь как все устроено, я как новичок хочу понять как все работает
Это похвально, но особо не услекайтесь, так как это не та вещь, на которую стоит тратить время. К тому же, когда много кода, то легче совершить ошибку и сложно её искать, а тем кто потенциально может помочь - сложно разбираться

Последний раз редактировалось 8Observer8; 28.03.2015 в 23:51.
8Observer8 вне форума Ответить с цитированием
Старый 29.03.2015, 01:22   #10
velllum
 
Регистрация: 28.03.2015
Сообщений: 7
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Это похвально, но особо не увлекайтесь, так как это не та вещь, на которую стоит тратить время. К тому же, когда много кода, то легче совершить ошибку и сложно её искать, а тем кто потенциально может помочь - сложно разбираться
Да я знаю это для себя, в сеть пускать не буду! Или потом исходник приведу в порядок, сейчас не могу запустить вычисление. Пробовал по тому способу на который ты дал ссылку ни чего не получилось, это ведь не целочисленное число а дробь. Приведи пример сложения если не сложно!

Код:
void Form::button_slojenie(){

Fraction a,b,c;

QString num_a = a_num -> text();
QString den_b = b_den -> text();
a = num_a.toInt();
a = den_b.toInt();

QString num_c = c_num -> text();
QString den_d = d_den -> text();
b = num_c.toInt();
b = den_d.toInt();

c = a + b;

otvet_num, "/" ,otvet_den-> setText(QString::number(c);
velllum вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание класса дробей. Пример на сложение двух дробей. Помогите найти ошибку (С++) Сергей.Ш Общие вопросы C/C++ 5 28.10.2013 13:24
Калькулятор дробей Нани Набиев Помощь студентам 0 28.11.2012 06:25
COM-объект для решения систем n-обыкновенных дифференциальных уравнений в форме Коши. ra.shid Помощь студентам 0 15.05.2011 18:33
Решение обыкновенных дифференциальных уравнений Craz Помощь студентам 0 28.11.2009 21:25
Система обыкновенных дифференциальных уравнений Anarki Помощь студентам 1 05.11.2009 00:19