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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.10.2014, 20:54   #81
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Код:
    catch ( const std::logic_error &e ) {
        std::cerr << e.what() << std::endl;
        return 1;
    }
Я бы искал так. Мы видим, что what() это метод класса std::logic_error

Набираем в гугле std::logic_error и переходим сюда: http://www.cplusplus.com/reference/s...t/logic_error/

Бегло просматриваем статью в поисках what() находим ссылку на него в этой строке:
Цитата:
The class inherits the what member function from exception.
Кликаем на what. Попадаем на статью про what(). Ищем раздел "Return Value" и видим текст:
Цитата:
A pointer to a c-string with content related to the exception.
Копируем его сюда: https://translate.google.com

Плучаем перевод:
Цитата:
Указатель на с-строку с содержанием, связанным с исключением.
8Observer8 вне форума Ответить с цитированием
Старый 17.10.2014, 21:51   #82
igoreshka3333
Форумчанин
 
Аватар для igoreshka3333
 
Регистрация: 26.09.2014
Сообщений: 176
По умолчанию

Точно! не додумался

Сделал, однако вопрос:
зачем нужны исключения (помимо сокращения кода) в методе get_time()? Ведь с помощью цикла программа поправляет пользователя и позволяет попытаться ввести значения заново?
Вот цитата из Лафоре (ООП):
Цитата:
Исключения — не панацея
Механизм исключений невозможно применять ко всем типам ошибок. Есть не- кий потолок, касающийся размеров программы и времени на обработку ошибок. Например, все-таки, наверное, нецелесообразно использовать исключения для работы с ошибками ввода (например, ввода символов вместо цифр), такие коллизии гораздо проще ликвидировать традиционными способами. Да-да, прос- то в цикле проверять, что вводит пользователь, и принимать соответствующие решения. В случае необходимости — просить пользователя ввести данные заново.
А вот сеттер я модифицировал:
Time.cpp
Код:
void Time::set_Time(int h, int m, int s)
{
    if (h==0 && m==0 && s==0)
    {
        throw std::out_of_range("\nError: the timer can not be"
                                "initialized with zero values");
    }
    const int beginOfRange = 0;
    const int endOfRange = 60;
    if ( ( m < beginOfRange ) || ( m > endOfRange ) ||
         ( s < beginOfRange ) || ( s > endOfRange ) )
    {
        throw std::out_of_range( "\nError: argumets must be from the range ("
                                 + std::to_string( beginOfRange ) +
                                 ", " + std::to_string( endOfRange ) + ")");
    }
    _hour = h;
    _min = m;
    _sec = s;
}
main.cpp
Код:
int main ()
{
    try
    {
        Time t;
        std::cout << "Start the timer: \n";
        t.set_Time(0,0,1);
        t.get_time();
        std::cout << "\nTimer set: \n\n";
        while (true)
        {
            std::cout << t--;
            Sleep(1000);
        }
        std::cout << std::endl;
    }
    catch ( const std::logic_error& e )
    {
        std::cerr << e.what() << std::endl;
        return 1;
    }
}

Последний раз редактировалось Stilet; 18.10.2014 в 11:30.
igoreshka3333 вне форума Ответить с цитированием
Старый 18.10.2014, 10:52   #83
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

По поводу прошлой темы, которую закрыли:
Цитата:
Сообщение от igoreshka3333 Посмотреть сообщение
Ого! И так можно....
Можно ещё вот так: http://www.cplusplus.com/reference/algorithm/count_if/

Рекомендую изучить главу про алгоритмы: "Chapter 13. Mastering STL Algorithms" из этой книги: https://yadi.sk/d/VCvsky11c6wtP

Цитата:
зачем нужны исключения (помимо сокращения кода) в методе get_time()?
В этом методе они не нужны вы абсолютно правы! Я хотел лишь привести вас с общей стратегии обработки ошибок, которую лично мне удобно использовать в средних и больших проектах

Цитата:
Например, все-таки, наверное, нецелесообразно использовать исключения для работы с ошибками ввода (например, ввода символов вместо цифр)
С этим я не согласен, так как, например, функция std::stod выбрасывает исключения std:ut_of_range и std::invalid_argument и вы обязаны их перехватить. Попробуйте запустить программу и ввести буквы вместо цифр и вы получите крэш:
Код:
#include <string>
#include <stdexcept>
#include <iostream>

int main()
{

//    try {
        std::cout << "\nEnter a real number:\n> ";
        std::string str;
        std::getline( std::cin, str );
        double doubleN = stoi( str );
        std::cout << doubleN << std::endl;
//    } catch ( const std::logic_error ) {
//        std::cerr << "Error: you wrote the incorrect number." << std::endl;
//        return 1;
//    } catch ( ... ) {
//        std::cerr << "Error: unknown exception" << std::endl;
//        return 1;
//    }

    return 0;
}
Можно конечно поставить себе цель не использовать такие функции. Это выбор программиста

Я выше ошибся:
Код:
float floatN = stoi( str );
// ...
double doubleN = stoi( str );
Надо было так написать:
Код:
float floatN = stof( str );
// ...
double doubleN = stod( str );
Я написал небольшую статью на "Russian Qt Forum": Стратегия обработки ошибок пользователя с помощью собственных классов исключений

Последний раз редактировалось Stilet; 18.10.2014 в 17:37.
8Observer8 вне форума Ответить с цитированием
Старый 18.10.2014, 13:41   #84
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Ваша программа ещё не закончена. Нужно сразу уяснить, что результатом работы программиста являются:

1) Программа, которую пользователь может скачать и использовать
2) Классы c демо-примером, которые другой программист может скачать и использовать

Допустим вам заказали написать программу с теми требованиями, которые вы реализовали с классом Time. Теперь настало время отправить результат своей работы (исполняемый файл) заказчику

Упражнение 1. Разместите исполняемый файл (с необходимыми dll) на ресурсе Яндекс.Диск. Пришлите ссылку

Примечание. Можно использовать и другие ресурсы, например, Google.Drive. Но на Яндекс.Диск проверяют на вирусы, о чём пользователь может прочитать перед скачиванием и это вызывает большее доверие

Теперь допустим другой заказчик заказал класс Time. Результатом для этого заказчика будет исходный код класса Time с демо-примером. Заказчик требует, чтобы проект был загружен на https://github.com/

Упражнение 2. Сохраните исходники демо-примера на https://github.com/ Пришлите ссылку

Выполните следующую мою инструкцию. Она возможно на кривом английском. Если заметите ошибки, то напишите, буду очень признателен!

How to save files of a project to remote server (github.com)

Register on https://github.com/

Create a new repository, for this: in top-right corner click on “+” -> select “New repository”

In the text field “Repository name” write a name for a project, for example: HelloGit

In the text field “Description” write a desription of a project, for example: My first project (or miss it)

Click the button “Create repository”

Download and install Git: http://msysgit.github.io/

Write a name and an email, for this run a terminal and write commands:
Цитата:
git config –global user.name “Your Name”
git config –global user.email “your_email@whatever.com”
Write ends for lines, for this write commmands:
Цитата:
git config –global core.autocrlf false
git config –global core.safecrlf true
Note. Your name and ends for lines are written one time before installing Git

For working with terminal I recommend to download and install Far Manager: http://www.farmanager.com/download.php

Run Far Manager. Go to the project folder by Far Manager. Let us suppose that we have three files in our project folder, for example: main.cpp, person.h, person.cpp

Create file .gitignore in the project folder. For this you need press Shift+F4. Write the name: .gitignore

Write in .gitignore the names of the files and folders that you want to ignore, for example:
Цитата:
*.user.pro*
build*
Note. For switching between “file navigation” and “terminal output” you need to use Ctrl+O

Click Ctrl+O

Init Git and add the files to Git repository:
Цитата:
git init
git add .gitignore
git add .
Note. We can see current status of our files in any time. For this you need to run: git status

Commit the files:
Цитата:
git commit -am “First Commit”
Note. For next command you need to write your repository link

Send the files on a remote repository, for this run command:
Цитата:
git push https://github.com/8Observer8/HelloGit.git refs/heads/master:refs/heads/master
Write a login and a password. The project was saved on: https://github.com/

You can change project files, commit them and save them on a remote repository again:

Цитата:
git commit -m “I Added string \”Hello, World!\” on the screen” main.cpp
Or you can commit all:

Цитата:
git commit -am “First Commit“
Цитата:
git push https://github.com/8Observer8/HelloGit.git refs/heads/master:refs/heads/master

Последний раз редактировалось 8Observer8; 18.10.2014 в 13:48.
8Observer8 вне форума Ответить с цитированием
Старый 18.10.2014, 17:35   #85
igoreshka3333
Форумчанин
 
Аватар для igoreshka3333
 
Регистрация: 26.09.2014
Сообщений: 176
По умолчанию

Цитата:
с демо-примером
То есть урезанный код?

Цитата:
Разместите исполняемый файл (с необходимыми dll) на ресурсе Яндекс.Диск. Пришлите ссылку
Timer.exe
1dll
2dll
3dll

Цитата:
Write in .gitignore the names of the files and folders that you want to ignore, for example:
Цитата:
*.user.pro*
build*
Создал файл!

Вот с этим проблемы:
Цитата:
Init Git and add the files to Git repository:
Цитата:
git init
git add .gitignore
git add .
Изображения
Тип файла: jpg Безымянный.jpg (14.3 Кб, 146 просмотров)

Последний раз редактировалось Stilet; 22.10.2014 в 07:39.
igoreshka3333 вне форума Ответить с цитированием
Старый 18.10.2014, 20:36   #86
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Цитата:
Сообщение от igoreshka3333 Посмотреть сообщение
То есть урезанный код?
В данном случае - все файлы проекта. Это я писал про случай, когда нужно разработать несколько классов для общего проекта (или для чужого проекта) А вообще, сейчас принято снабжать классы, например, Google тестами. По ним видно, как работать с методами класса, как эти методы обрабатывают некорректные входные данные

Просто сохраните все файлы своего проекта на github.com, чтобы можно было их скачать и собрать проект у себя

Почему у вас exe и dll поотдельности? Поместите их вместе в один архив и пришлите ссылку

Итак, жду ссылку на приложение и на исходники

Упражнение. Прислать ссылку на GUI версию приложения Time. И ссылку на исходники. Для выполнения этого упражнения советую скачать следующую книжку и использовать её как справочник: ссылка И использовать мою инструкцию:

Создадим новый проект. Для этого в меню Qt Creator’а выбираем “File” -> “New File or Project…”

В разделе “Projects” выбираем “Applications” -> во второй колонке выбираем “Qt Widgets Application” -> нажимаем кнопку “Choose…”

В поле “Name” пишем: ИмяПроекта -> нажимаем кнопку “Browse…” и указываем путь, где будет создан наш проект -> нажимаем два раза кнопку “Next” и выбираем в списке “Base class” значение “QDialog” -> нажимаем последовательно: два раза “Next” -> нажимаем кнопку “Finish”

Запускаем приложение. Для этого нажимаем зелёный треугольник слева внизу (или Ctrl+R). Закрываем приложение

На панели слева вы видите папку “Forms” с файлом “Dialog.ui” -> нажимаем два раза по “Dialog.ui” -> мы видим форму, на которую мы можем перетаскивать элементы

Перетащим три “LineEdit” и одну кнопку “PushButton” (лучше всего вводить названия в поле “Filter”)

Один раз кликаем на “LineEdit” (чтобы выделить его) -> затем справа на панели изменяем имя этого объекта с “lineEdit” на “firstNumberLineEdit”

Тоже самое проделываем со вторым “LineEdit ” -> меняем ему имя с “lineEdit_2″ на “secondNumberLineEdit”

У третьего “LineEdit ” меняем имя с “lineEdit_3″ на “resultLineEdit”

Два раза кликаем по кнопке и меняем её текст на: Показать Сумму

Меняем имя кнопки с “pushButton” на “showResultButton”

Примечание. Мы можем группировать и выравнивать элементы. Для этого надо выделить их и нажать либо кнопку с тремя вертикальными полосками или с тремя горизонтальными (на панели выше). Поэкспериментируйте немного с этими двумя кнопками (и остальными на этой панели) и вы разберётесь

Нажимаем правой кнопкой мыши по нашей кнопке на форме -> из выпадающего списка выбираем “Go to slot…” -> нажимаем “OK”

В отрывшемся окне мы видим функцию on_showResultButton_clicked() Это обработчик нажатия на кнопку. Копируем в этот обработчик код, чтобы он выглядел так:

Код:
void Dialog::on_showResultButton_clicked()
{
    // Get numbers
    int a = ui->firstNumberLineEdit->text().toInt();
    int b = ui->secondNumberLineEdit->text().toInt();

    // Sum
    int c = a + b;

    // Output
    ui->resultLineEdit->setText( QString::number( c ) );
}
Запускаем приложение. Для этого нажимаем зелёный треугольник слева внизу (или Ctrl+R)

Вводим числа -> нажимаем кнопку “Показать Сумму”
8Observer8 вне форума Ответить с цитированием
Старый 18.10.2014, 23:26   #87
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Цитата:
Создал файл!
В этот файл надо писать имена файлов, которые вы хотите проигнорировать и не сохранять на удалённый сервер

Цитата:
Вот с этим проблемы:
Какие проблемы?
8Observer8 вне форума Ответить с цитированием
Старый 19.10.2014, 15:39   #88
igoreshka3333
Форумчанин
 
Аватар для igoreshka3333
 
Регистрация: 26.09.2014
Сообщений: 176
По умолчанию

Не доходит как связать класс QТimer со своим и вывести в LineEdit декрементируемый обьект!
igoreshka3333 вне форума Ответить с цитированием
Старый 19.10.2014, 16:48   #89
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Нужно в файле "Dialog.h" создать объект класс QTimer:

Код:
private:
    QTimer _timer;
И в в этом же файле написать функцию, которую таймер будет вызывать через указанные промежутки времени:

Код:
public slots:
    void slotTimeout();
В файле "Dialog.cpp" напишите реализацию функции slotTimeout()

Обязательно нажмите кнопку Help на панели слева и введите QTimer. Там будет пример и описание

Теперь обратно перейдите в файл "Dialog.cpp" и в конструкторе класса Dialog соедините сигнал, который будет отправлять объект _timer, со слотом, который будет вызываться, когда _timer испустит сигнал:

Код:
{
    ui->setupUi(this);

    connect( &_timer, SIGNAL( timeout() ),
             this, SLOT( slotTimeout() ) );
}
Здесь же в конструкторе класса Dialog запускаем таймер с таймаутом в 1000 мс (1 сек)

Код:
{
    ui->setupUi(this);

    connect( &_timer, SIGNAL( timeout() ),
             this, SLOT(slotTimeout() ) );
    _timer.start( 1000 );
}
Для наглядности в окно отладки можно что-то выводить:

Код:
#include <QDebug>
// ...
void Dialog::slotTimeout()
{
    qDebug() << "hello!";
}
У Qt отличная и полная документация с примерами. Туториалы есть. И ещё много примеров. Они в папке examples, но их можно из Qt Creator найти. Для этого нужно нажать кнопку "Welcome". Там увидите две кнопки "Examples" и "Tutorials". Нажмите на "Examples" и введите: clock. Там есть пример с часами. Если какие-то классы непонятны, то их описание можно найти в "Help"

Упражнение. Найдите пример "Digital Clock". Перепишите его с вашем классом Time, чтобы получился таймер. Пришлите исполняемый файл с необходимыми dll в одном zip-архиве. Пришлите ссылку на исходники c github.com

Последний раз редактировалось 8Observer8; 19.10.2014 в 16:52.
8Observer8 вне форума Ответить с цитированием
Старый 19.10.2014, 18:16   #90
igoreshka3333
Форумчанин
 
Аватар для igoreshka3333
 
Регистрация: 26.09.2014
Сообщений: 176
По умолчанию

Решил просто протестировать декрементацию!
Код:
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private slots:
    void slotTimeout();

private:
    Ui::Dialog *ui;
    QTime _timer;
};

#endif // DIALOG_H
Ругается:
Цитата:
field "_timer" has incomplete type
вот на этом месте
Код:
QTime _timer;
igoreshka3333 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
описать класс в с# volkodinocka Помощь студентам 0 09.11.2013 22:05
Описать класс С# NeoX_2011 Помощь студентам 1 19.03.2012 00:10
C# исправление ошибки. Описать класс, реализующий шестнадцатеричный счетчик PROkaZZZniK Помощь студентам 7 09.02.2012 16:29
Описать класс-родитель и класс-потомок. Delphi 7 Andrew_M Помощь студентам 0 15.01.2011 14:42
Описать класс. Telec Общие вопросы C/C++ 1 30.04.2010 18:43