我需要实现extern void start_stopper(void)和extern void end_stopper()。 如何实现这两个功能,以便他们将计算这个程序执行的秒数?
#include <stdio.h>
#include <dos.h>
extern void start_stopper(void);
unsigned long int fibo(int n)
{
if (n <= 1)
return 1;
else
return(fibo(n-1) + fibo(n-2));
} /* fibo */
extern double end_stopper();
void main(void)
{
unsigned long int fn;
unsigned int n;
double time_in_secs;
int i1, i2, result;
printf("Enter an integer <= 47 )\n");
scanf("%u", &n);
system("time");
start_stopper();
fn = fibo(n);
system("time");
time_in_secs = end_stopper();
printf("Fibo(%u) = %lu\n", n, fn);
printf("Computation took %lf secs\n", time_in_secs);
} /* main */
答案 0 :(得分:2)
您应该使用time
中定义的clock()
函数,而不是使用<time.h>
shell命令。它更精确,开销更少。
以下是修改后的代码:
#include <stdio.h>
#include <time.h>
unsigned long int fibo(int n) {
if (n <= 1)
return 1;
else
return fibo(n - 1) + fibo(n - 2);
}
int main(void) {
unsigned long fn;
unsigned int n;
double time_in_secs;
printf("Enter an integer <= 47:\n");
if (scanf("%u", &n) == 1) {
clock_t start = clock();
fn = fibo(n);
time_in_secs = (double)(clock() - t) / CLOCKS_PER_SEC;
printf("Fibo(%u) = %lu\n", n, fn);
printf("Computation took %f secs\n", time_in_secs);
}
return 0;
}
如果您正在MS / DOS系统上进行编程,并且clock()
在那里不可用,您可以尝试以这种方式进行定义:
#define CLOCK_PER_SEC 18.2
#define clock() (*(unsigned long __far *)0x0040006C)
节拍中断(INT 8)每小时更新一次32位节拍计数器65536次。可以在绝对地址0040:006C
访问32位滴答计数器。如果您想要更精确的时序,可以尝试重新编程中断控制器,使其更快地触发中断。然后,您需要安装自己的处理程序来过滤这些中断,以避免弄乱系统的计时器。
这是一个有用的网站,有关PC / DOS系统及其BIOS数据的更多信息:http://www.fysnet.net/rombios.htm
另请注意,您的Fibonacci序列与经典定义fib(0) = 0, fib(1) = 1
不一致。 Wikipedia article is here。
以下是相应的代码:
unsigned long int fibo(int n) {
if (n <= 1)
return n;
else
return fibo(n - 1) + fibo(n - 2);
}