Измерить время выполнения программы
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
|