Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
chuvak2008f
4 / 4 / 1
Регистрация: 10.01.2012
Сообщений: 43
#1

Отображение времени в читаемом виде - C++

06.04.2012, 11:38. Просмотров 1102. Ответов 16
Метки нет (Все метки)

Есть такая функция
C++
1
DWORD GetTickCount(void);
Она выводит кол-во мс от начала старта системы, с помощью неё я вывожу время от старта функции в моей проге:
C++
1
int startMyProg = GetTickCount();
и получаю в любой момент время работы:
C++
1
int timeWork = GetTickCount() - startMyProg;
Теперь вопрос, как можно преобразовать это время в удобно перевариваемый вид: 00:24:45
Существуют ли стандартные функции или нужно писать свою?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2012, 11:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Отображение времени в читаемом виде (C++):

Отформатировать текст кода в читаемом виде - C++
Здравствуйте, помогите пожалуйста отформатировать текст кода в читаемом виде: #include <stdio.h> #include <stdlib.h> #include...

Отображение текущего времени - C++
Ребят, сап! Такая проблема. Есть код, в котором от 1 января 1990 считается определенное количество дней и месяцев (задается пользователем с...

Отображение процесса копирования в виде индикатора - C++
Всем привет :) У меня была цель написать программу, которая: а) копирует в выходной файл 2 файла: «test1.txt» и...

Вывод времени в виде 1 час : 2 минуты : 3 секунды - C++
Собственно интересует алгоритм вывода системного времени в данном виде 1 час : 2 минуты : 3 секунды. час\минута\секунда склоняются в...

Функция, получающая формат даты и времени в виде параметра - C++
Нужна функция получающая формат даты и времени в виде параметра и возвращающая дату и время в виде строки. Изучая Си написал следующую...

Какая функция используется для представления времени в виде строки заданного формата? - C++
Какая функция используется для представления времени в виде строки заданного формата?

16
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
06.04.2012, 12:36 #2
Цитата Сообщение от chuvak2008f Посмотреть сообщение
Существуют ли стандартные функции или нужно писать свою?
А что тут писать? на 24*3600*1000 делишь - дни, остаток на 3600*1000 - часы, остаток на 60*1000 - минуты, остаток на 1000 секунды, остаток мс
0
-=ЮрА=-
Заблокирован
Автор FAQ
06.04.2012, 14:50 #3
chuvak2008f, посмотри сюда
Детальная информация о времени работы системы
0
chuvak2008f
4 / 4 / 1
Регистрация: 10.01.2012
Сообщений: 43
06.04.2012, 16:23  [ТС] #4
Цитата Сообщение от Nekto Посмотреть сообщение
А что тут писать? на 24*3600*1000 делишь - дни, остаток на 3600*1000 - часы, остаток на 60*1000 - минуты, остаток на 1000 секунды, остаток мс
Я в общем то искал стандартный метод. А так то своё это не проблема

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Много букаф для такой скромной задачи, потом почитаю

C++
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
// *** MEDIUM КОД
 
String toNormalTime(DWORD dMillisec) {
    float dSec = dMillisec / 1000;
 
    int iHour   = int(dSec / 3600),
        iMin    = int(dSec / 60 - iHour * 60),
        iSec    = int(dSec - int(dSec / 60) * 60);
    String  hour    = (iHour<10)? "0"+IntToStr(iHour): IntToStr(iHour),
            min     = (iMin<10)?  "0"+IntToStr(iMin):  IntToStr(iMin),
            sec     = (iSec<10)?  "0"+IntToStr(iSec):  IntToStr(iSec);
 
    return hour+":"+min+":"+sec;
}
 
// *** HARD КОД
 
String toNormalTime(DWORD dMillisec) {
    float dSec = dMillisec / 1000;
    int iHour, iMin, iSec;
    String  hour    = ((iHour   =int(dSec / 3600))<10)?                 "0"+IntToStr(iHour): IntToStr(iHour),
            min     = ((iMin    =int(dSec / 60 - iHour * 60))<10)?      "0"+IntToStr(iMin):  IntToStr(iMin),
            sec     = ((iSec    =int(dSec - int(dSec / 60) * 60))<10)?  "0"+IntToStr(iSec):  IntToStr(iSec);
    return hour+":"+min+":"+sec;
}
Хотя как не странно, первый выполняется на порядок быстрее, чем второй.
0
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
06.04.2012, 16:56 #5
а так не быстрее?
C++
1
2
3
4
5
6
7
8
9
10
char* toNormalTime(DWORD dMillisec) {
    int iSec = dMillisec/1000;
    int iHour   = iSec/3600;
    iSec%=3600;
    int iMin    = iSec/60;
    iSec %=60;
    char* s=new char[9];
    sprintf(s,"%c%c:%c%c:%c%c",iHour/10+48,iHour%10+48,iMin/10+48,iMin%10+48,iSec/10+48,iSec%10+48);
    return s;
}
Правда, только для часов <100 работать будет по идее
0
-=ЮрА=-
Заблокирован
Автор FAQ
06.04.2012, 18:57 #6
Цитата Сообщение от chuvak2008f Посмотреть сообщение
Много букаф для такой скромной задачи, потом почитаю
- ну и зря, по поводу твоего кода - тихий ужас(без обид - констатирую затраты кода положенные на его эффективность)
По поводу второго кода - Nekto, спецификатор формата %c означает что преобразовываться будет к чарам, на кой прибавлять +48 если сразу можно записать
C
1
sprintf(s,"%d%d:%d%d:%d%d",iHour/10,iHour%10,iMin/10,iMin%10,iSec/10,iSec%10);
А вообще парни пишите как вам удобней, я лишь помочь хотел
0
-=ЮрА=-
Заблокирован
Автор FAQ
06.04.2012, 19:22 #7
Привожу код который работает с любым числом тиков. В режиме реального времени идёт индикация от чила дней до миллисекунд
C
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
#include <windows.h>
#include <stdio.h>
 
char * UpdateTime(DWORD dwTime)
{
    char sTime[256] = {0};
    ULONG uDiv = 3600*24*1000;
    UINT uTime = dwTime/uDiv;
    dwTime     = dwTime%uDiv;
    uDiv = uDiv / 24;
    sprintf(sTime,"%02d:",uTime);//Записали число дней
    do
    {
        uTime  = dwTime/uDiv;
        dwTime = dwTime%uDiv;
        sprintf(sTime,"%s%02d:",sTime, uTime);
    }
    while(1000 < dwTime && (uDiv = uDiv/60));
    sprintf(sTime,"%s%03d",sTime, dwTime);//Записали число миллисекунд
    return &sTime[0];
}
 
int main()
{
    DWORD dwTime = 0;
    while(TRUE)
    {
        system("cls");
        dwTime = GetTickCount();
        printf("NT UPTIME DD:HH:MM:SS:MS %s",UpdateTime(dwTime));
        Sleep(100);
    }
    return 0;
}
0
Миниатюры
Отображение времени в читаемом виде  
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
06.04.2012, 20:17 #8
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
По поводу второго кода - Nekto, спецификатор формата %c означает что преобразовываться будет к чарам, на кой прибавлять +48 если сразу можно записать
C
1
sprintf(s,"%d%d:%d%d:%d%d",iHour/10,iHour%10,iMin/10,iMin%10,iSec/10,iSec%10);
А вообще парни пишите как вам удобней, я лишь помочь хотел
Для ускорения процесса Разве это не быстрее будет? %d ведь не знает сколько будет символов, а мы знаем, что всего лишь 1.
0
-=ЮрА=-
Заблокирован
Автор FAQ
06.04.2012, 20:36 #9
Nekto, есть еще спецификатор длинны при этом для часов и минут и секунд нужно два символа или по твоему система не может работать подряд скажем часов 20.В общем подумай еще раз что ты написал...
0
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
06.04.2012, 21:05 #10
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Nekto, есть еще спецификатор длинны при этом для часов и минут и секунд нужно два символа или по твоему система не может работать подряд скажем часов 20.В общем подумай еще раз что ты написал...
Так мой вариант для времени работы <100 часов работает. Или нет? Если предусматривается больше, то да. А так я просто привёл к виду ХХ:ХХ:ХХ (т.е. по 2 символа ЧЧ:ММ:СС).
0
-=ЮрА=-
Заблокирован
Автор FAQ
06.04.2012, 21:13 #11
Nekto, твои %с%с (два символа)очень легко заменяются спецификатором длины %2d(тоже будет два символа).
0
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
07.04.2012, 02:23 #12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Nekto, твои %с%с (два символа)очень легко заменяются спецификатором длины %2d(тоже будет два символа).
оно 0 не вставит в начале, если у нас число меньше 10 :Р
0
easybudda
Модератор
Эксперт CЭксперт С++
9664 / 5614 / 952
Регистрация: 25.07.2009
Сообщений: 10,778
07.04.2012, 04:13 #13
Цитата Сообщение от Nekto Посмотреть сообщение
оно 0 не вставит в начале, если у нас число меньше 10
C
1
2
int i = 1;
printf("%02d\n", i);
а так?
1
-=ЮрА=-
Заблокирован
Автор FAQ
07.04.2012, 09:33 #14
Nekto, если бы раскрыл глаза и посмотрел мой код
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
sprintf(sTime,"%s%02d:",sTime, uTime);
то понял бы что пишешь глупость. Кроме того
Цитата Сообщение от Nekto Посмотреть сообщение
Для ускорения процесса Разве это не быстрее будет
- сомнительно, т.к. в твоём случае будет выполняться на 12 операций больше. Или по твоему дополнительное деление (/ или %), а также прибавление 48 не отнимает процессорного времени?
0
-=ЮрА=-
Заблокирован
Автор FAQ
07.04.2012, 09:46 #15
Nekto, вот то о чём говорил
C
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
#include <stdio.h>
#include <time.h>
 
int main()
{
    int nHours   = 0;
    int nMinutes = 48;
    int nSeconds = 59;
    long i, N = 100000;
    long dif1, dif2;
    long start,end;
    start = clock();
    for(i = 0; i < N; i++)
        printf
        (
            "Nekto %c%c:%c%c:%c%c\n",
            nHours/10 + 48,nHours%10 + 48,
            nMinutes/10 + 48,nMinutes%10 + 48,
            nSeconds/10 + 48, nSeconds%10 + 48
        );
    
    end   = clock();
    dif1 = end - start;
    
    start   = clock();
    for(i = 0; i < N; i++)
        printf("YurA  %02d:%02d:%02d\n",nHours,nMinutes,nSeconds);
    end     = clock();
    dif2 = end - start;
 
    printf("Time of operations :\n");
    
    printf("Nekto %u\n",dif1);
    printf("YurA  %u\n",dif2);
    getchar();
    return 0;
}
Думаю тут уже нечего говорить
Time of operations :
Nekto 6265
YurA 6156
Т.е. ты даже не ускорил свой код а замедлил
1
Миниатюры
Отображение времени в читаемом виде  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2012, 09:46
Привет! Вот еще темы с ответами:

Преобразовать период времени p, заданный в секундах (p<=86400) в часы, минуты и секунды, результат вывести в виде чч:мм:сс . - C++
Преобразовать период времени p, заданный в секундах (p&lt;=86400) в часы, минуты и секунды, результат вывести в виде чч:мм:сс . Для...

Распечатать многочлен, заданный в виде односвязного списка, в обычном виде - C++
Люди помогите пожалуйста. Вообще не знаю как подступиться к задаче. Заранее спасибо! Многочлен от одной переменной Х можно представить...

Вывести на экран матрицу порядка n (n=1..15) - элементы выводятся не в виде матрицы, а в виде строки - C++
Здравствуйте. Нужно вывести на экран матрицу порядка n (n=1..15). Я написал программу, но при этом на экран элементы выводятся не в виде...

Введение в рекурсию. Заполнить массив типа char в виде десятичного числа, принимаемого в виде аргумента - C++
Пытался написать функцию, которая заполняет массив типа char в виде десятичного числа, принимаемого в виде аргумента. Но почему то...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
07.04.2012, 09:46
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru