Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
Даниил
68 / 41 / 1
Регистрация: 14.05.2013
Сообщений: 383
1

Программа-таймер (отсчитывает определенное время)

03.07.2013, 18:58. Просмотров 2475. Ответов 26
Метки нет (Все метки)

Нужно написать программу, вот задача:

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

Помогите написать пожалуйста!

Добавлено через 15 минут
Спасибо (хз кому), но я уже сам написал Вот исходник, вдруг кому нужен будет:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <cstdlib>
 
using namespace std;
 
int main()
{
double x;
cout << "Введи время в секундах: " << endl;
cin >> x;
for (x = 1; x <= 60; ++x) {
cout << "Секунды: " << x
<< endl;
}
system ("pause");
return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2013, 18:58
Ответы с готовыми решениями:

Программа подачи компьютеру сигнала shutdown в определенное системное время
Доброго времени суток) Прошу помощи в написании маленькой программки....

Нажатие клавиш за определенное время
Всем доброго времени суток. Возник такой вопрос... как в С++ возможно описать...

Приостановка процесса на определенное время
Кто знает, как организовать приостановку процесса на определенное время другого...

Выполнение функции в определенное системное время
Привет. Как реализовать вызов функции, в строго определенные моменты времени?...

Подсчитать количество за определенное прошедшее время
Помогите с алгоритмом для такой задачи. Код не нужен, но можно описать словами....

26
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
03.07.2013, 19:51 2
Ввёл 60, а программа за 3.2 секунды закончилась.
0
Миниатюры
Программа-таймер (отсчитывает определенное время)  
Croessmah
03.07.2013, 20:04
  #3

Не по теме:

Цитата Сообщение от alsav22 Посмотреть сообщение
за 3.2 секунды закончилась
3 из которых вводил x, который не нужен )))

0
DiffEreD
1442 / 779 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
03.07.2013, 20:05 4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <chrono>
#include <thread>
#include <windows.h>
 
int main(int argc, char** argv)
{
    SetConsoleCP (1251); SetConsoleOutputCP (1251);
    
    std::cout << "Введи время в секундах: ->";
    size_t seconds;
    std::cin>>seconds;
    while (seconds)
    {
       std::this_thread::sleep_for(std::chrono::seconds(1));
       std::cout << "Секунды: " << --seconds << '\n';
    }
    
    return 0;
}
1
bgm123
40 / 40 / 27
Регистрация: 29.01.2013
Сообщений: 277
03.07.2013, 20:15 5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <ctime>
#include <iostream>
using namespace std;
 
#define FACTOR 1000
 
int main(void)
{
    long sec;
 
    cout << "Enter seconds: ";
    cin >> sec;
 
    cout << "Timer is enabled" << endl;
    _sleep(sec * FACTOR);
    cout << "Timer off" << endl;
 
    return 0;
}
Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <ctime>
#include <iostream>
using namespace std;
 
#define FACTOR 1000
 
int main(void)
{
    long sec;
 
    cout << "Enter seconds: ";
    cin >> sec;
 
    cout << "Timer is enabled" << endl;
    for(int i = sec; i >= 1; i--){
        cout << "second: " << i << endl;
        _sleep(1 * FACTOR); 
    }
 
    cout << "Timer off" << endl;
    return 0;
}
1
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
03.07.2013, 20:22 6
DiffEreD, а можно как-то без chrono обойтись?

Не по теме:

Любопытства ради

0
DiffEreD
1442 / 779 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
03.07.2013, 20:27 7
Ну, std::this_thread::sleep_for принимает std::chrono::duration, так что по другому не знаю. sleep_for
1
Van111
212 / 191 / 22
Регистрация: 03.08.2011
Сообщений: 2,674
Записей в блоге: 12
03.07.2013, 21:20 8
Цитата Сообщение от Даниил1991 Посмотреть сообщение
for (x = 1; x <= 60; ++x) {
cout << "Секунды: " << x
<< endl;
}
3.24 ушло на запуск программы).
если хотите сделать приближённо
можете добавить Sleep(1000); перед cout
если вам нужно не побалываться а для дела, юзайте SetTimer

Добавлено через 1 минуту
Вот получение дескриптора консоли, какие заглав файлы подключить сами разберитесь
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
 HWND GetConsoleHwnd(void)
   {
       #define MY_BUFSIZE 1024 // Buffer size for console window titles.
       HWND hwndFound;         // This is what is returned to the caller.
       char pszNewWindowTitle[MY_BUFSIZE]; // Contains fabricated
                                           // WindowTitle.
       char pszOldWindowTitle[MY_BUFSIZE]; // Contains original
                                           // WindowTitle.
 
       // Fetch current window title.
 
       GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);
 
       // Format a "unique" NewWindowTitle.
 
       wsprintf(pszNewWindowTitle,"%d/%d",
                   GetTickCount(),
                   GetCurrentProcessId());
 
       // Change current window title.
 
       SetConsoleTitle(pszNewWindowTitle);
 
       // Ensure window title has been updated.
 
       Sleep(40);
 
       // Look for NewWindowTitle.
 
       hwndFound=FindWindow(NULL, pszNewWindowTitle);
 
       // Restore original window title.
 
       SetConsoleTitle(pszOldWindowTitle);
 
       return(hwndFound);
   }
0
Croessmah
++Ͻ
14611 / 8365 / 1576
Регистрация: 27.09.2012
Сообщений: 20,561
Записей в блоге: 2
Завершенные тесты: 1
03.07.2013, 21:26 9
Цитата Сообщение от Van111 Посмотреть сообщение
юзайте SetTimer
так же не даст точных результатов
Цитата Сообщение от Van111 Посмотреть сообщение
Вот получение дескриптора консоли, какие заглав файлы подключить сами разберитесь
Есть еще функция GetConsoleWindow
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
0
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
03.07.2013, 23:37 10
DiffEreD, забавно получается: если в конце строчки std::cout << "Секунды: " << --seconds << '\n'; убрать переход на новую строку, то программа напечатает только один раз всё сразу по завершении цикла:
Bash
1
2
Введи время в секундах: ->5
Секунды: 4Секунды: 3Секунды: 2Секунды: 1Секунды: 0
Добавлено через 36 секунд
почему так происходит?

Добавлено через 2 минуты
на всякий случай уточню: компилятор нативный gcc 4.8
0
DiffEreD
04.07.2013, 00:34
  #11

Не по теме:

xtorne21st, не понял, что вас так удивляет? Тут sleep_for вообще не пределах. Обычное следование операторов в цикле (в одну строчку если уж перевод строки убрали)

C++
1
2
3
4
while (seconds)
    {
       std::cout << "Секунды: " << --seconds;
    }

0
Croessmah
++Ͻ
14611 / 8365 / 1576
Регистрация: 27.09.2012
Сообщений: 20,561
Записей в блоге: 2
Завершенные тесты: 1
04.07.2013, 01:24 12
Цитата Сообщение от DiffEreD Посмотреть сообщение
(в одну строчку если уж перевод строки убрали
Цитата Сообщение от xtorne21st Посмотреть сообщение
убрать переход на новую строку, то программа напечатает только один раз всё сразу по завершении цикла
собственно вот буферизация имеет место быть
0
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
04.07.2013, 03:08 13
DiffEreD, Croessmah, я понял почему у вас вызвало удивление. Только что откомпилировал код в 12 студии - всё как и очевидно: через каждую секунду значение отображается далее в этой же строчке. Но в линуксе при компиляции при помощи g++ 4.8 результирующая строка со всеми значениями отображается один раз через 5 секунд, а если поставить символ перевода на новую строку, тогда всё правильно... Не даром компилятор gcc 4.8 находиться в тестовой ветки ppa. Хотя, может быть так и нужно...

Добавлено через 11 минут
А также вот этот код в gcc 4.8 недопустим:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <thread>
#include <string>
 
void say_hello(const std::string& name)
{
   std::cout << "hello " << name << std::endl;
}
 
int main(int argc, char * argv[])
{
   std::thread th(say_hello, "world");
   th.join();
}
Добавлено через 48 секунд
4.8 сырой ещё. Имхо.

Добавлено через 4 минуты
П.С. Если быть точнее - допустим, но выкидывает исключение
0
Croessmah
04.07.2013, 03:09
  #14

Не по теме:

Цитата Сообщение от xtorne21st Посмотреть сообщение
я понял почему у вас вызвало удивление.
кто Вам сказал про удивление? :jokingly: если внимательно прочитаете, то можете и ответ найти :)

0
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
04.07.2013, 04:05 15
Цитата Сообщение от Croessmah Посмотреть сообщение
кто Вам сказал про удивление? если внимательно прочитаете, то можете и ответ найти

Не по теме:

:) во всяком случаи, меня результат работы двух компиляторов удивил уж точно.

0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
04.07.2013, 05:27 16
Дело может и не в этом компиляторе, а в Linux (или в компиляторах для Linux). Там ввод\вывод как-то по другому организован (боюсь сказать: небуферизован, потому что тут спор был на эту тему). Некотроые команды, например sync(), для очистки буфера, в Linux не работают. Но это предположение. Если бы проверить, в Linux, этот код с другим компилятором (не сырым)...
0
xtorne21st
08.07.2013, 00:22
  #17

Не по теме:

На линукс, подобного эффекта можно добиться используя заголовок <sys/select.h>:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <sys/select.h>
#include <iostream>
 
int main()
{
    int seconds;
    struct timeval t;
    std::cout << "Put seconds: ";
    std::cin >> seconds;
 
    while (seconds) 
    {
        t.tv_sec = 1;
        t.tv_usec = 0;
        select(0, NULL, NULL, NULL, &t);
        std::cout << "seconds: " << --seconds << std::endl;
    }
 
    return 0;
}

0
Retyrn0
45 / 45 / 5
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
08.07.2013, 00:50 18
Цитата Сообщение от Croessmah Посмотреть сообщение
так же не даст точных результатов
А Sleep даст точный результат?
0
Croessmah
++Ͻ
14611 / 8365 / 1576
Регистрация: 27.09.2012
Сообщений: 20,561
Записей в блоге: 2
Завершенные тесты: 1
08.07.2013, 00:55 19
Цитата Сообщение от Retyrn0 Посмотреть сообщение
А Sleep даст точный результат?
Нет.
0
Retyrn0
45 / 45 / 5
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
08.07.2013, 01:25 20
Если нужна точность, то GetTickCount() или вообще использовать...хотя вряд ли.
Думаю Вам и точности Sleep() хватит) Хотя в данном случае SetTimer() значительно удобней.

Добавлено через 21 минуту
Боюсь спросить как Вы добились здесь:
Цитата Сообщение от Даниил1991 Посмотреть сообщение
Спасибо (хз кому), но я уже сам написал Вот исходник, вдруг кому нужен будет:Код C++
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
double x;
cout << "Введи время в секундах: " << endl;
cin >> x;
for (x = 1; x <= 60; ++x) {
cout << "Секунды: " << x
<< endl;
}
system ("pause");
return 0;
}
Задержки в одну секунду? Процессор такой медленный, не успевает больше раза в секунду выводить строку? Если без лишней точности, нужно добавить ожидание в одну секунду в цикле (можно чуть меньше, с учётом времени выполнения остального кода). Кстати, чтобы не выстраивалось в рядок, можно чистить экран:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
double x;
cout << "Введи время в секундах: " << endl;
cin >> x;
for (x = 1; x <= 60; ++x) {
system("cls");///////////////////////////Чистим экран
cout << "Секунды: " << x
<< endl;
Sleep(1000);/////////////////////////////Эта строка преостановит выполнение на 1 секунду
}
system ("pause");
return 0;
Иначе на разных компьютерах и в зависимости от нагрузки процессора, будет "разная длина секунды". У меня 40 секунд прошло аж за пол секунды ;-)
0
08.07.2013, 01:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2013, 01:25

Очистка экрана в консоли через определенное время
Результат стоит в консоли секунду потом происходит очистка экрана. как такое...

Создать цикл, повторяющийся раз в определенное время
Здравствуйте, подскажите, как создать цикл, который выполняется раз в...

Завершение бесконечного цикла через определенное время
Есть бесконечный цикл for( ; ; ), который обрабатывает событие нажатия кнопки в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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