Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
4 / 4 / 6
Регистрация: 10.12.2016
Сообщений: 192

Измерить время выполнения программы

27.11.2017, 20:50. Показов 4312. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!

Прошу Вашей помощи в решении задачи.

Речь касается "Ханойских башен"

Провести вычислительный эксперимент с реализованным алгоритмом путем изменения числа колец. При этом максимальное число колец не должно быть большим N=10. Для каждого N измерить время выполнения программы с точностью до миллисекунд. Результаты эксперимента выдать из программы в виде таблицы:
Кол-во колец
Время до наступления конца света

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
// Ханойские башни
#include <iostream>
#include <iomanip>
#include <math.h>
#include <windows.h>
 
using namespace std;
 
int *stack1, *stack2, *stack3, top1=0, top2=0, top3=0, element, m;
 
void push(int start){
    if(start==1){
        for(int i=top1-1;i>=0;i--)
            stack1[i+1]=stack1[i];
 
        stack1[0]=element;
        top1++;
    }
 
    if(start==2){
        for(int i=top2-1;i>=0;i--)
            stack2[i+1]=stack2[i];
 
        stack2[0]=element;
        top2++;
    }
 
    if(start==3){
        for(int i=top3-1;i>=0;i--)
            stack3[i+1]=stack3[i];
 
        stack3[0]=element;
        top3++;
    }
}
 
void pop(int start){
    if(start==1)
    {
        element=stack1[0];
        for(int i=0;i<=top1-1;i++){
            stack1[i]=stack1[i+1];
            if(i==top1-1)
                stack1[i]=0;
        }
        top1--;
    }
 
    if(start==2)
    {
        element=stack2[0];
        for(int i=0;i<=top2-1;i++){
            stack2[i]=stack2[i+1];
            if(i==top2-1)
                stack2[i]=0;
        }
        top2--;
    }
 
    if(start==3)
    {
         element=stack3[0];
        for(int i=0;i<=top3-1;i++){
            stack3[i]=stack3[i+1];
            if(i==top3-1)
                stack3[i]=0;
        }
        top3--;
    }
}
 
void Input(){
    cout<<"   Исходный   "<<"Промежуточный "<<"   Конечный  "<<endl;
    for(int i=0;i<m;i++){
            if(i<top1)
                cout<<setw(7)<<stack1[i];
            else cout<<setw(7)<<0;
            if(i<top2)
                cout<<setw(14)<<stack2[i];
            else cout<<setw(14)<<0;
            if(i<top3)
                cout<<setw(14)<<stack3[i]<<endl;
            else cout<<setw(14)<<0<<endl;
    }
}
 
void Hanoi_Tower(int m, int start, int destination, int buffer)
{
    int operation=0;
        if (m == 0)
        {
            return;
        }
            Hanoi_Tower(m-1, start, buffer, destination);
            cout<< start << " -> " << destination << endl;
            cout<<endl;
            pop(start);
            push(destination);
            Input();
            Hanoi_Tower(m-1, buffer, destination, start);
}
 
int main(){
 
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
 
int start=1, destination=3, buffer=2;
 
metka:
    cout<<"Количество дисков не должно привышать 10!"<<endl;
    cout<<"Введите количество дисков: "; cin>>m;
if (m>10){
    system("CLS");
    goto metka;
      }
stack1= new int [m];
stack2= new int [m];
stack3= new int [m];
 
for(int i=0;i<m;i++){
    element=m-i;
   push(start);
}
 
Input();
 
Hanoi_Tower(m, start, destination, buffer);
cout<<"Число операций: "<<pow(2,m)-1;
delete [] stack1;
delete [] stack2;
delete [] stack3;
return 0;
}
Добавлено через 53 минуты
Добавил немного комментариев и организовал подсчет времени вычислений.
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
// Ханойские башни
#include <iostream> //потоквый ввода/вывода
#include <iomanip> //редактирование вывода
#include <math.h> //математические вычесления
#include <windows.h> //отображение языка
/* вычисление времени работы участка кода */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
using namespace std;
 
int *stack1, *stack2, *stack3, top1=0, top2=0, top3=0, element, m;
 
/* добавить элемент в стек*/
void push(int start){
    if(start==1){
        for(int i=top1-1;i>=0;i--)
            stack1[i+1]=stack1[i];
 
        stack1[0]=element;
        top1++;
    }
 
    if(start==2){
        for(int i=top2-1;i>=0;i--)
            stack2[i+1]=stack2[i];
 
        stack2[0]=element;
        top2++;
    }
 
    if(start==3){
        for(int i=top3-1;i>=0;i--)
            stack3[i+1]=stack3[i];
 
        stack3[0]=element;
        top3++;
    }
}
 
/* удалить элемент из стека */
void pop(int start){
    if(start==1)
    {
        element=stack1[0];
        for(int i=0;i<=top1-1;i++){
            stack1[i]=stack1[i+1];
            if(i==top1-1)
                stack1[i]=0;
        }
        top1--;
    }
 
    if(start==2)
    {
        element=stack2[0];
        for(int i=0;i<=top2-1;i++){
            stack2[i]=stack2[i+1];
            if(i==top2-1)
                stack2[i]=0;
        }
        top2--;
    }
 
    if(start==3)
    {
         element=stack3[0];
        for(int i=0;i<=top3-1;i++){
            stack3[i]=stack3[i+1];
            if(i==top3-1)
                stack3[i]=0;
        }
        top3--;
    }
}
 
/* вывод стека*/
void Input(){
    cout<<"   Исходный   "<<"Промежуточный "<<"   Конечный  "<<endl;
    for(int i=0;i<m;i++){
            if(i<top1)
                cout<<setw(7)<<stack1[i];
            else cout<<setw(7)<<0;
            if(i<top2)
                cout<<setw(14)<<stack2[i];
            else cout<<setw(14)<<0;
            if(i<top3)
                cout<<setw(14)<<stack3[i]<<endl;
            else cout<<setw(14)<<0<<endl;
    }
}
 
 
void Hanoi_Tower(int m, int start, int destination, int buffer)
{
        if (m == 0)
        {
            return;
        }
            Hanoi_Tower(m-1, start, buffer, destination);
            cout<< start << " -> " << destination << endl;
            cout<<endl;
            pop(start);
            push(destination);
            Input();
            Hanoi_Tower(m-1, buffer, destination, start);
}
 
 
int main(){
 
/* корректное отображение русского языка*/
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
 
int start=1, destination=3, buffer=2;
 
label:
    cout<<"Количество дисков не должно привышать 10!"<<endl;
    cout<<"Введите количество дисков: "; cin>>m;
/*проверка вводимого значения*/
if (m>10||m<=0){
    system("CLS");
    goto label;
      }
 
stack1= new int [m];
stack2= new int [m];
stack3= new int [m];
 
for(int i=0;i<m;i++){
    element=m-i;
   push(start);
}
Input();
 
 clock_t t;
 t = clock(); //фиксация времени
 
Hanoi_Tower(m, start, destination, buffer);
 
  t = clock() - t;
  printf ("Время до наступления конца света %f seconds.\n",((float)t)/CLOCKS_PER_SEC); //вывод времени
 
cout<<"Число операций: "<<pow(2,m)-1;
 
delete [] stack1;
delete [] stack2;
delete [] stack3;
 
return 0;
}
Добавлено через 58 минут
программа аварийно завершается вернув значение "255 (0xFF)"
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
/ Ханойские башни
#include <iostream> //потоквый ввод/вывод
#include <fstream> //ввод/вывод в файл
#include <iomanip> //редактирование вывода
#include <math.h> //математические вычесления
#include <windows.h> //отображение языка
/* вычисление времени работы участка кода */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
using namespace std;
 
int *stack1, *stack2, *stack3, top1=0, top2=0, top3=0, element, m;
 
/* добавить элемент в стек*/
void push(int start){
    if(start==1){
        for(int i=top1-1;i>=0;i--)
            stack1[i+1]=stack1[i];
 
        stack1[0]=element;
        top1++;
    }
 
    if(start==2){
        for(int i=top2-1;i>=0;i--)
            stack2[i+1]=stack2[i];
 
        stack2[0]=element;
        top2++;
    }
 
    if(start==3){
        for(int i=top3-1;i>=0;i--)
            stack3[i+1]=stack3[i];
 
        stack3[0]=element;
        top3++;
    }
}
 
/* удалить элемент из стека */
void pop(int start){
    if(start==1)
    {
        element=stack1[0];
        for(int i=0;i<=top1-1;i++){
            stack1[i]=stack1[i+1];
            if(i==top1-1)
                stack1[i]=0;
        }
        top1--;
    }
 
    if(start==2)
    {
        element=stack2[0];
        for(int i=0;i<=top2-1;i++){
            stack2[i]=stack2[i+1];
            if(i==top2-1)
                stack2[i]=0;
        }
        top2--;
    }
 
    if(start==3)
    {
         element=stack3[0];
        for(int i=0;i<=top3-1;i++){
            stack3[i]=stack3[i+1];
            if(i==top3-1)
                stack3[i]=0;
        }
        top3--;
    }
}
 
/* вывод стека*/
void Input(){
    cout<<"   Исходный   "<<"Промежуточный "<<"   Конечный  "<<endl;
    for(int i=0;i<m;i++){
            if(i<top1)
                cout<<setw(7)<<stack1[i];
            else cout<<setw(7)<<0;
            if(i<top2)
                cout<<setw(14)<<stack2[i];
            else cout<<setw(14)<<0;
            if(i<top3)
                cout<<setw(14)<<stack3[i]<<endl;
            else cout<<setw(14)<<0<<endl;
    }
}
 
 
void Hanoi_Tower(int m, int start, int destination, int buffer)
{
        if (m == 0)
        {
            return;
        }
            Hanoi_Tower(m-1, start, buffer, destination);
            cout<< start << " -> " << destination << endl;
            cout<<endl;
            pop(start);
            push(destination);
            Input();
            system("cls");
            Hanoi_Tower(m-1, buffer, destination, start);
}
 
 
int main(){
 
/* корректное отображение русского языка*/
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
 
int start=1, destination=3, buffer=2;
 
ofstream table("отчет.txt",ios_base::out | ios_base::trunc);
table.open("отчет.txt", ios_base::out | ios_base::trunc);
if (!table.is_open()) // если файл небыл открыт
    {
     cout << "Файл не может быть открыт или создан\n"; // напечатать соответствующее сообщение
     return 1; // выполнить выход из программы
    }
 
for (int m=1; m<11;m++)
{
stack1= new int [m];
stack2= new int [m];
stack3= new int [m];
 
for(int i=0;i<m;i++){
    element=m-i;
   push(start);
}
Input();
 
 clock_t t;
 t = clock(); //фиксация времени
 
Hanoi_Tower(m, start, destination, buffer);
 
  t = clock() - t;
  table<<"Количество колец: "<<m<<endl;
  table<<"Время до наступления конца света "<<((float)t)/CLOCKS_PER_SEC<<"секунд"<<endl; //вывод времени
  table<<"___________________________________________________________"<<endl;
//cout<<"Число операций: "<<pow(2,s)-1;
 
delete [] stack1;
delete [] stack2;
delete [] stack3;
}
table.close(); //закрытие файла
    cout << "Данные успешно записаны в файл отчет.txt\n";
    system("pause");
return 0;
}
/
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.11.2017, 20:50
Ответы с готовыми решениями:

Измерить время выполнения кода
В C# такая классная вещь есть - Stopwatch, которая могла время измерять. В C++ же кроме clock() из хэдера ctime (что не очень удобно) я...

Измерить время выполнения (сложение двух чисел)
Вот у меня есть код, который выполняет сложение двух чисел.. Помогите вставить сюда GetTickCount и QueryPerformanceCounter.... Только нужно...

Как измерить время выполнения отдельного участка кода?
Собственно возник вопрос, каким образом измерить время выполнения того или инного учатска кода?(На винде)

1
4 / 4 / 6
Регистрация: 10.12.2016
Сообщений: 192
04.12.2017, 21:59  [ТС]
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
// Ханойские башни
#include <iostream> //потоквый ввод/вывод
#include <fstream> //ввод/вывод в файл
#include <iomanip> //редактирование вывода
#include <math.h> //математические вычесления
#include <windows.h> //отображение языка
/* вычисление времени работы участка кода */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
using namespace std;
 
int *stack1, *stack2, *stack3, top1, top2, top3, element,m;
 
/* добавить элемент в стек*/
void push(int start){
    if(start==1){
        for(int i=top1-1;i>=0;i--)
            stack1[i+1]=stack1[i];
 
        stack1[0]=element;
        top1++;
    }
 
    if(start==2){
        for(int i=top2-1;i>=0;i--)
            stack2[i+1]=stack2[i];
 
        stack2[0]=element;
        top2++;
    }
 
    if(start==3){
        for(int i=top3-1;i>=0;i--)
            stack3[i+1]=stack3[i];
 
        stack3[0]=element;
        top3++;
    }
}
 
/* удалить элемент из стека */
void pop(int start){
    if(start==1)
    {
        element=stack1[0];
        for(int i=0;i<=top1-1;i++){
            stack1[i]=stack1[i+1];
            if(i==top1-1)
                stack1[i]=0;
        }
        top1--;
    }
 
    if(start==2)
    {
        element=stack2[0];
        for(int i=0;i<=top2-1;i++){
            stack2[i]=stack2[i+1];
            if(i==top2-1)
                stack2[i]=0;
        }
        top2--;
    }
 
    if(start==3)
    {
         element=stack3[0];
        for(int i=0;i<=top3-1;i++){
            stack3[i]=stack3[i+1];
            if(i==top3-1)
                stack3[i]=0;
        }
        top3--;
    }
}
 
/* вывод стеков*/
void Input(){
    cout<<"   Исходный   "<<"Промежуточный "<<"   Конечный  "<<endl;
    for(int i=0;i<m;i++){
            if(i<top1)
                cout<<setw(7)<<stack1[i];
            else cout<<setw(7)<<0;
            if(i<top2)
                cout<<setw(14)<<stack2[i];
            else cout<<setw(14)<<0;
            if(i<top3)
                cout<<setw(14)<<stack3[i]<<endl;
            else cout<<setw(14)<<0<<endl;
    }
}
 
 
void Hanoi_Tower(int m, int start, int destination, int buffer)
{
        if (m == 0)
        {
            return;
        }
            Hanoi_Tower(m-1, start, buffer, destination);
            cout<< start << " -> " << destination << endl;
            cout<<endl;
            system("cls");
            pop(start);
            push(destination);
            Input();
            Hanoi_Tower(m-1, buffer, destination, start);
}
 
 
int main(){
 
/* корректное отображение русского языка*/
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
 
float sum=0; //время работы
const int disk =11; //количество дисков
 
ofstream table("отчет.txt",ios_base::out | ios_base::trunc);
if (!table.is_open()) // если файл небыл открыт
    {
     cout << "Файл не может быть открыт или создан\n"; // напечатать соответствующее сообщение
     return 1; // выполнить выход из программы
    }
 
for (m=1; m< disk+1; m++)
{
int start=1, destination=3, buffer=2;
top1=0; top2=0; top3=0;
 
stack1= new int [m];
stack2= new int [m];
stack3= new int [m];
 
for(int i=0;i<m;i++){
    element=m-i;
   push(start);
}
Input();
 
 clock_t t;
 t = clock(); //фиксация времени
 
Hanoi_Tower(m, start, destination, buffer); //вызов рекурсивной функции
 
  t = clock() - t;
 
/* ввод в файл */
  table<<"Количество колец: "<<m<<endl;
  table<<"Время до наступления конца света "<<((float)t)/CLOCKS_PER_SEC<<" секунд"<<endl; //вывод времени
  table<<"_________________________________________________"<<endl;
 
/* суммирование времени */
sum=sum+(((float)t)/CLOCKS_PER_SEC);
 
delete [] stack1;
delete [] stack2;
delete [] stack3;
 
}
 
table<<"Общее время расчетов равно "<<sum<<" секунд";
 
table.close(); //закрытие файла
system("cls");
 
    cout << "Данные успешно записаны в файл \"отчет.txt\"\n";
    system("pause");
 
return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.12.2017, 21:59
Помогаю со студенческими работами здесь

Измерить время части программы
Есть такая функция, хочу замерить время ее выполнения. После каждого выполнения значения очень разные от 1 и до 4мс. Входные данные...

Измерить время работы части программы
Создала прогу, реализующую последовательный поиск в массиве. Но мне почему-то кажется, что время считается как-то странно.Что может быть не...

Как измерить время работы программы по сортировке массива?
Общая схема программы Х выглядит следующим образом. а. Выбрать очередной размер массива исходных данных. б. Заполнить массив...

Время выполнения программы
Здравствуйте.Я до сих пор новичок в программировании,сразу скажу,и тонкостей не знаю. Собрал я тут программу с использованием CUDA.И...

Определить время выполнения программы
В связи с доработкой алгоритма разных прог, иногда необходимо посмотреть на сколько повысилась производительность и уменьшилось время...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru