Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Секундомер на С++


Автор: Garik1995 23.10.2014, 04:11
Пишу секундомер,проблема в том,что он неккоректно переводит минуты в часы.Что нужно исправить чтобы он правильно переводил минуты в часы?
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit6.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm6 *Form6;
//---------------------------------------------------------------------------
__fastcall TForm6::TForm6(TComponent* Owner)
    : TForm(Owner)
{
Timer1->Enabled = false;
Timer1->Interval = 10;
}
//---------------------------------------------------------------------------
void __fastcall TForm6::Button1Click(TObject *Sender)
{
Timer1->Enabled = true;
Button1->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm6::Button3Click(TObject *Sender)
{
hours = 0;
min = 0;
sec = 0;
msec = 0;
Label1->Caption = "00";
Label2->Caption = "00";
Label3->Caption = "00";
Label4->Caption = "00";
}
//---------------------------------------------------------------------------
void __fastcall TForm6::Button2Click(TObject *Sender)
{
Timer1->Enabled = false;
Button1->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm6::Timer1Timer(TObject *Sender)
{
if ( msec < 99 )
msec++;
else
{
msec = 0;
if ( sec < 59)
sec++;
else
{
sec = 0;
min++;
Label2->Caption = "0" + IntToStr(min);
}
if ( min < 59)
min++;
else
{
min = 0;
hours++;
Label1->Caption = "0" + IntToStr(hours);
}
if (sec <= 9)
Label3->Caption = "0" + IntToStr(sec);
else
Label3->Caption = IntToStr(sec);
}
if (msec <=9)
Label4->Caption = "0" + IntToStr(msec);
else
Label4->Caption = IntToStr(msec);
}

//---------------------------------------------------------------------------

Автор: baldman88 23.10.2014, 08:52
Странно, что оно у Вас все остальное (кроме часов) нормально переводит smile 

Автор: Garik1995 23.10.2014, 09:00
Цитата(baldman88 @ 23.10.2014,  08:52)
Странно, что оно у Вас все остальное (кроме часов) нормально переводит smile

у меня выводится дата типа 01:060:45:13

Автор: baldman88 23.10.2014, 09:17
Попробуйте так (с Builder не знаком, но если что-то не так, то поправьте сами):
Код

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit6.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm6 *Form6;
//---------------------------------------------------------------------------
__fastcall TForm6::TForm6(TComponent* Owner)
    : TForm(Owner)
{
    Timer1->Enabled = false;
    Timer1->Interval = 10;
}
//---------------------------------------------------------------------------
void __fastcall TForm6::Button1Click(TObject *Sender)
{
    Timer1->Enabled = true;
    Button1->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm6::Button3Click(TObject *Sender)
{
    hours = 0;
    min = 0;
    sec = 0;
    msec = 0;
    Label1->Caption = "00";
    Label2->Caption = "00";
    Label3->Caption = "00";
    Label4->Caption = "00";
}
//---------------------------------------------------------------------------
void __fastcall TForm6::Button2Click(TObject *Sender)
{
    Timer1->Enabled = false;
    Button1->Enabled = true;
}
//---------------------------------------------------------------------------
void  update_caption(TObject *Label, int value)
{
    if (value <= 9)
    {
        Label->Caption = "0" + IntToStr(value);
    }
    else
    {
        Label->Caption = IntToStr(value);
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm6::Timer1Timer(TObject *Sender)
{
    if ( msec < 99 )
    {
        msec++;
    }
    else
    {
        msec = 0;
        if ( sec < 59)
        {
            sec++;
        }
        else
        {
            sec = 0;
            if ( min < 59)
            {
                min++;
            }
            else
            {
                min = 0;
                hours++;
                update_caption(Label1, hours);
            }
            update_caption(Label2, min);
        }
        update_caption(Label3, sec);
    }
    update_caption(Label4, msec);
}
//---------------------------------------------------------------------------

Вариант, конечно, не самый оптимальный, но работать должно.

Автор: maint 23.10.2014, 10:02
Цитата(Garik1995 @ 23.10.2014,  04:11)
Пишу секундомер,проблема в том,что он неккоректно переводит минуты в часы.Что нужно исправить чтобы он правильно переводил минуты в часы?
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit6.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm6 *Form6;
//---------------------------------------------------------------------------
__fastcall TForm6::TForm6(TComponent* Owner)
    : TForm(Owner)
{
Timer1->Enabled = false;
Timer1->Interval = 10;
}
//---------------------------------------------------------------------------
void __fastcall TForm6::Button1Click(TObject *Sender)
{
Timer1->Enabled = true;
Button1->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm6::Button3Click(TObject *Sender)
{
hours = 0;
min = 0;
sec = 0;
msec = 0;
Label1->Caption = "00";
Label2->Caption = "00";
Label3->Caption = "00";
Label4->Caption = "00";
}
//---------------------------------------------------------------------------
void __fastcall TForm6::Button2Click(TObject *Sender)
{
Timer1->Enabled = false;
Button1->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm6::Timer1Timer(TObject *Sender)
{
if ( msec < 99 )
msec++;
else
{
msec = 0;
if ( sec < 59)
sec++;
else
{
sec = 0;
min++;
Label2->Caption = "0" + IntToStr(min);
}
if ( min < 59)
min++;
else
{
min = 0;
hours++;
Label1->Caption = "0" + IntToStr(hours);
}
if (sec <= 9)
Label3->Caption = "0" + IntToStr(sec);
else
Label3->Caption = IntToStr(sec);
}
if (msec <=9)
Label4->Caption = "0" + IntToStr(msec);
else
Label4->Caption = IntToStr(msec);
}

//---------------------------------------------------------------------------

минуты делить на 60, как целое число. Оставшиеся минуты получать с помощью остатка от деления  (операция %). 
И не городить все эти if использовать форматирование с помощью sprintf.  "%.2d" сам нолик пририсует если нужно

Автор: Garik1995 23.10.2014, 11:05
Цитата(maint @ 23.10.2014,  10:02)
Цитата(Garik1995 @ 23.10.2014,  04:11)
Пишу секундомер,проблема в том,что он неккоректно переводит минуты в часы.Что нужно исправить чтобы он правильно переводил минуты в часы?
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit6.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm6 *Form6;
//---------------------------------------------------------------------------
__fastcall TForm6::TForm6(TComponent* Owner)
    : TForm(Owner)
{
Timer1->Enabled = false;
Timer1->Interval = 10;
}
//---------------------------------------------------------------------------
void __fastcall TForm6::Button1Click(TObject *Sender)
{
Timer1->Enabled = true;
Button1->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm6::Button3Click(TObject *Sender)
{
hours = 0;
min = 0;
sec = 0;
msec = 0;
Label1->Caption = "00";
Label2->Caption = "00";
Label3->Caption = "00";
Label4->Caption = "00";
}
//---------------------------------------------------------------------------
void __fastcall TForm6::Button2Click(TObject *Sender)
{
Timer1->Enabled = false;
Button1->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm6::Timer1Timer(TObject *Sender)
{
if ( msec < 99 )
msec++;
else
{
msec = 0;
if ( sec < 59)
sec++;
else
{
sec = 0;
min++;
Label2->Caption = "0" + IntToStr(min);
}
if ( min < 59)
min++;
else
{
min = 0;
hours++;
Label1->Caption = "0" + IntToStr(hours);
}
if (sec <= 9)
Label3->Caption = "0" + IntToStr(sec);
else
Label3->Caption = IntToStr(sec);
}
if (msec <=9)
Label4->Caption = "0" + IntToStr(msec);
else
Label4->Caption = IntToStr(msec);
}

//---------------------------------------------------------------------------

минуты делить на 60, как целое число. Оставшиеся минуты получать с помощью остатка от деления  (операция %). 
И не городить все эти if использовать форматирование с помощью sprintf.  "%.2d" сам нолик пририсует если нужно

Спасибо большое,попробую)

Автор: baldman88 23.10.2014, 12:22
Цитата(maint @ 23.10.2014,  10:02)
И не городить все эти if использовать форматирование с помощью sprintf.  "%.2d" сам нолик пририсует если нужно

Что-то профит от применения sprintf, в данном сулчае, выглядит весьма сомнительно.

Автор: borisbn 24.10.2014, 00:29
Вот, что предлагает maint:

Код
void __fastcall TForm6::Timer1Timer(TObject *Sender)
{
    AnsiString s;
    msec++;
    int ms = msec;
    Label4->Caption = s.sprintf( "%02d", ms % 100 );    ms /= 100;
    Label3->Caption = s.sprintf( "%02d", ms % 60 );     ms /= 60
    Label2->Caption = s.sprintf( "%02d", ms % 60 );     ms /= 60
    Label1->Caption = s.sprintf( "%d", ms );
}


ИМХО проще некуда. Нет ?

Автор: Garik1995 24.10.2014, 01:05
Цитата(borisbn @ 24.10.2014,  00:29)
Вот, что предлагает maint:

Код
void __fastcall TForm6::Timer1Timer(TObject *Sender)
{
    AnsiString s;
    msec++;
    int ms = msec;
    Label4->Caption = s.sprintf( "%02d", ms % 100 );    ms /= 100;
    Label3->Caption = s.sprintf( "%02d", ms % 60 );     ms /= 60
    Label2->Caption = s.sprintf( "%02d", ms % 60 );     ms /= 60
    Label1->Caption = s.sprintf( "%d", ms );
}


ИМХО проще некуда. Нет ?

Согласен)Я уже разобрался,теперь у меня всё работает как нужно)Спасибо вам большое)

Автор: baldman88 25.10.2014, 01:10
Цитата(borisbn @  24.10.2014,  00:29 Найти цитируемый пост)
ИМХО проще некуда. Нет ? 

Это да. Признаю, был не прав. Все в микроконтроллерах мыслю  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)