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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.09.2013, 15:07   #1
VP86
Пользователь
 
Регистрация: 15.09.2013
Сообщений: 11
По умолчанию Как правильно записать условие

Помогите пожалуйста! Нужно, чтобы программа работала по такому принципу: при вводе аргумента x и выходе из поля проверяется в какой из трех диапазонов попадает x, выполняются вычисления и результат отображается в label. При этом соответствующая кнопка становится отмеченной (Checked=true). Если далее нажать другую радиокнопку, вычисления пересчитываются для соответствующей формулы, в label выводится новый результат, диапазон, в котором находится x игнорируется. Если отметить checkbox – результат удваивается. Код написал, но она немного не так работает.
x*sin(x), x<=0
y= sqrt(x)/x, 0<x<3
x^2+2, x>=3
Код:
Код:

void MainWindow::Vichislenie()
{
    double X;
    double Y;
    QString x,y;
    bool V;
    x=ui->lineEdit->text();
    X=x.toDouble(&V);
    if(ui->checkBox->isChecked())
         Y=Y*2;
     if(ui->checkBox_2->isChecked())
         Y=Y*2;
     if(ui->checkBox_3->isChecked())
         Y=Y*2;
     if(ui->radioButton->isChecked())
         (X<=0);
         Y=(X*sin(X));
     if(ui->radioButton_2->isChecked())
         (X>0 && X<3);
         Y=(sqrt(X)/X);
     if(ui->radioButton_3->isChecked())
         (X>=3);
         Y=(X*X+2);
     y = QString::number(Y,'f',5);
     ui->label_2->setText("y = "+y);
}
VP86 вне форума Ответить с цитированием
Старый 16.09.2013, 09:54   #2
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию

Короче напишу как должно быть, а если интересно почему так должно быть спросишь объясню.
Код:
void MainWindow::Vichislenie()
{
    double X;
    double Y;
    x=ui->lineEdit->text().toDouble;
    if(ui->radioButton->isChecked() && X<=0) Y=(X*sin(X));
    if(ui->radioButton_2->isChecked() && X>0 && X<3) Y=(sqrt(X)/X);
    if(ui->radioButton_3->isChecked() && X>=3) Y=(X*X+2);
    if(ui->checkBox->isChecked()) Y=Y*2;
    if(ui->checkBox_2->isChecked()) Y=Y*2;
    if(ui->checkBox_3->isChecked()) Y=Y*2;
    ui->label_2->setText("y = "+QString::number(Y,'f',5));
}
У тебя тут очень много ошибок, начиная от синтаксиса.

Программа тоже не правильно организована, можно сделать проще и эффективнее. Особенно с использованием библиотеки Qt которым ты пользуешься
Может это и чушь, но это моя чушь и я ее никому не отдам.
Shad0wF1rst вне форума Ответить с цитированием
Старый 16.09.2013, 19:15   #3
VP86
Пользователь
 
Регистрация: 15.09.2013
Сообщений: 11
По умолчанию

Спасибо!!! Программа работает намного лучше!!! Я ещё в условиях фигурные скобки не ставил, понял ошибку. И if надо было добавлять. Программа считала у меня неправильно. Я просто с Qt недавно работать начал.
А вы не подскажете, как записать условия так, чтобы после введения X и выходе из поля, автоматически выполнялась проверка всех условий и рассчитывалось по нужной формуле. А когда нажимали другую кнопку условия отбрасывались и расчёт производился по выбранной формуле? И как можно использовать в этой программе вот такое условие: ui->checkBox->setChecked(true)?
VP86 вне форума Ответить с цитированием
Старый 17.09.2013, 09:37   #4
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию

Цитата:
Сообщение от VP86 Посмотреть сообщение
А вы не подскажете, как записать условия так, чтобы после введения X и выходе из поля, автоматически выполнялась проверка всех условий и рассчитывалось по нужной формуле.
Я бы конечно бы отправил вас читать документацию, по QLineEdit я думаю вы этот класс используете как поле ввода. Но скажу так, там есть сигнал
void QLineEdit::editingFinished () [signal] просто соедините со слотом для расчета и все будет в поряде.

И еще насчет удваивания, вам не кажется что там нужен всего один CheckBox для удваивания остальные просто дублируют и являются лишними. Или вам нужно что если выделены все три результат увосьмерялся?

Цитата:
И как можно использовать в этой программе вот такое условие: ui->checkBox->setChecked(true)
Не совсем правильно сформулировано. Это функция ставит флажок на QCheckBox.

Цитата:
А когда нажимали другую кнопку условия отбрасывались и расчёт производился по выбранной формуле?
Насчет этого. Вам нужно написать отдельные функции для каждой формулы. И также соединить их с помощью сигналов. А переменную X сделать глобальной для всего класса.

Вот пример для одной:
Код:

class MainWindow: public QMainWindow
{
    Q_OBJECT
    ------------------
    privet:
    double X;
    ------------------
}

void MainWindow::Vichislenie()
{
    X=ui->lineEdit->text().toDouble;
    if(ui->radioButton->isChecked() && X<=0) rezultFirst ();
}

void MainWindow::rezultFirst ()
{
    double Y = X*sin(X);
    if(ui->checkBox->isChecked()) Y=Y*2; 
    ui->label_2->setText("y = "+QString::number(Y,'f',5));
}
Так же бы посоветовал бы написать защиту от того, что если поле ввода числа пустое, то кнопки неактивные.
Может это и чушь, но это моя чушь и я ее никому не отдам.
Shad0wF1rst вне форума Ответить с цитированием
Старый 17.09.2013, 13:37   #5
VP86
Пользователь
 
Регистрация: 15.09.2013
Сообщений: 11
По умолчанию

Сигнал со слотом у меня соединён. По заданию просто нужно три CheckBox. А можно так эту задачу написать??? Это будет правильно?
Код:
Код:
void MainWindow::Vichislenie()
{
    double X;
    double Y;
    QString x,y;
    x=ui->lineEdit->text();
    X=x.toDouble();
    {
    if (X<=0)
    {
        Y=(X*sin(X));
        ui->label->setText("");
        ui->lineEdit->setFocus();

    }
    if (X>0 && X<3)
    {
        Y=(sqrt(X)/X);
        ui->label->setText("");
        ui->lineEdit->setFocus();
    }
    if (X>=3)
    {
        Y=(X*X+2);
        ui->label->setText("");
        ui->lineEdit->setFocus();
    }
    }
    if(ui->radioButton->isChecked()) Y=(X*sin(X));
    if(ui->radioButton_2->isChecked()) Y=(sqrt(X)/X);
    if(ui->radioButton_3->isChecked()) Y=(X*X+2);
    if(ui->checkBox->isChecked()) Y=Y*2;
    if(ui->checkBox_2->isChecked()) Y=Y*2;
    if(ui->checkBox_3->isChecked()) Y=Y*2;
    ui->label_2->setText("y = "+QString::number(Y,'f',5));
}
А можно ещё вопрос: как сделать, чтобы при первом вычислении, нужная формула была отмеченной, т.е. после ввода х, его проверки в label появился результат, а нужная формула была отмеченной? И синус считается почему то неправильно. Спасибо за помощь!!!!

Последний раз редактировалось VP86; 17.09.2013 в 13:48.
VP86 вне форума Ответить с цитированием
Старый 17.09.2013, 14:18   #6
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию

Цитата:
Сообщение от VP86 Посмотреть сообщение
Сигнал со слотом у меня соединён. По заданию просто нужно три CheckBox. А можно так эту задачу написать??? Это будет правильно?
Код:
Код:
void MainWindow::Vichislenie()
{
    double X;
    double Y;
    QString x,y;
    x=ui->lineEdit->text();
    X=x.toDouble();
    {
    if (X<=0)
    {
        Y=(X*sin(X));
        ui->label->setText("");
        ui->lineEdit->setFocus();

    }
    if (X>0 && X<3)
    {
        Y=(sqrt(X)/X);
        ui->label->setText("");
        ui->lineEdit->setFocus();
    }
    if (X>=3)
    {
        Y=(X*X+2);
        ui->label->setText("");
        ui->lineEdit->setFocus();
    }
    }
    if(ui->radioButton->isChecked()) Y=(X*sin(X));
    if(ui->radioButton_2->isChecked()) Y=(sqrt(X)/X);
    if(ui->radioButton_3->isChecked()) Y=(X*X+2);
    if(ui->checkBox->isChecked()) Y=Y*2;
    if(ui->checkBox_2->isChecked()) Y=Y*2;
    if(ui->checkBox_3->isChecked()) Y=Y*2;
    ui->label_2->setText("y = "+QString::number(Y,'f',5));
}
А можно ещё вопрос: как сделать, чтобы при первом вычислении, нужная формула была отмеченной, т.е. после ввода х, его проверки в label появился результат, а нужная формула была отмеченной? И синус считается почему то неправильно. Спасибо за помощь!!!!
Сморится очень не хорошо. Первый вариант смотрелся лучше.
Насчет того что синус считается не правильно, аргументом функции является число в радианах, может дело в этом.

Кстати прошу прощение, я кажется не так вас понял изначально, radioButtom вам нужен чисто для того что бы указывать какая формула использовалась при расчете? Если так, то тогда ваша программа будет иметь вид:
Код:
void MainWindow::Vichislenie()
{
    double X;
    double Y;
    QString x,y;
    x=ui->lineEdit->text();
    X=x.toDouble();
    {
    if (X<=0)
    {
        Y=(X*sin(X));
        ui->radioButtom->setChecked(true); 
    }
    if (X>0 && X<3)
    {
        Y=(sqrt(X)/X);
        ui->radioButtom_2->setChecked(true); 
    }
    if (X>=3)
    {
        Y=(X*X+2);
        ui->radioButtom_3->setChecked(true); 
    }
    }
    if(ui->checkBox->isChecked()) Y=Y*2;
    if(ui->checkBox_2->isChecked()) Y=Y*2;
    if(ui->checkBox_3->isChecked()) Y=Y*2;
    ui->label->setText("");
    ui->lineEdit->setFocus();
    ui->label_2->setText("y = "+QString::number(Y,'f',5));
}
Так как
ui->label->setText("");
ui->lineEdit->setFocus();
неизменны для всех условий то их можно вынести за условия написав всего один раз.
Правда не понимаю смысловую нагрузку label, когда результат выносится в label_2.
Может это и чушь, но это моя чушь и я ее никому не отдам.
Shad0wF1rst вне форума Ответить с цитированием
Старый 17.09.2013, 14:31   #7
VP86
Пользователь
 
Регистрация: 15.09.2013
Сообщений: 11
По умолчанию

Нет, они нужны для расчёта. Просто надо, чтобы при первом вычислении соответствующая кнопка была отмеченной.
VP86 вне форума Ответить с цитированием
Старый 17.09.2013, 14:34   #8
VP86
Пользователь
 
Регистрация: 15.09.2013
Сообщений: 11
По умолчанию

Извините, это я неправильно написал, там label_2 конечно.
VP86 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно поставить условие? hacker_007 Общие вопросы Delphi 14 20.09.2011 00:00
Как правильно поставить условиЕ. 89legend89 Microsoft Office Excel 5 07.10.2010 00:09
Как записать условие меньше или равно функции ЕСЛИ() Tidus Microsoft Office Excel 9 18.02.2010 11:05
как правильно поставить условие ГОСЕАН Помощь студентам 5 27.04.2009 10:52