这个程序的从29行到第33行 和 从35行到39行(如图)的目的是想求出这两个程序运行的tick,有没有办法把这一部分直接封装成一个函数让程序看起来更简洁一些,全代码如下
#include <stdio.h>
#include <time.h>
#include <math.h>
#define MAXN 10
clock_t start, stop;
double duration;
double f1(int n, double a[], double x) {
int i;
double p = a[0];
for (i = 1; i <= n; i++)
p += a[i] + pow(x, i);
return p;
}
double f2(int n, double a[], double x) {
int i;
double p = a[n];
for (i = 1; i <= n; i++)
p = a[i - 1] + x * p;
return p;
}
int main() {
int i;
double a[MAXN];
for (i = 0; i < MAXN; i++)
a[i] = (double)i;
start = clock();
for (i = 0; i < 1e6; i++)
f1(MAXN - 1, a, 1.1);
stop = clock();
printf("ticks1=%d\n", stop - start);
start = clock();
for (i = 0; i < 1e6; i++)
f2(MAXN - 1, a, 1.1);
stop = clock();
printf("ticks2=%d\n", stop - start);
return 0;
}
计时和输出分别扔到2个函数里,mian里只调用函数
或者用函数指针。
这样写,供参考:
#include <stdio.h>
#include <time.h>
#include <math.h>
#define MAXN 10
//clock_t start, stop;
double duration;
double f1(int n, double a[], double x) {
int i;
double p = a[0];
for (i = 1; i <= n; i++)
p += a[i] + pow(x, i);
return p;
}
double f2(int n, double a[], double x) {
int i;
double p = a[n];
for (i = 1; i <= n; i++)
p = a[i - 1] + x * p;
return p;
}
clock_t Clock_Count(double(*fun) (int, double[], double), int n, double a[], double x)
{
int i;
clock_t start, stop;
start = clock();
for (i = 0; i < 1e6; i++)
fun(n - 1, a, x);
stop = clock();
return stop - start;
}
int main() {
int i;
double a[MAXN];
for (i = 0; i < MAXN; i++)
a[i] = (double)i;
//start = clock();
//for (i = 0; i < 1e6; i++)
// f1(MAXN - 1, a, 1.1);
//stop = clock();
printf("ticks1=%d\n", Clock_Count(f1, MAXN, a, 1.1)); //stop - start);
//start = clock();
//for (i = 0; i < 1e6; i++)
// f2(MAXN - 1, a, 1.1);
//stop = clock();
printf("ticks2=%d\n", Clock_Count(f2, MAXN, a, 1.1)); //stop - start);
return 0;
}
【以下回答由 GPT 生成】
可以将这两个循环部分封装成一个函数来简化代码。具体的解决方案如下:
#include <stdio.h>
#include <time.h>
#include <math.h>
#define MAXN 10
clock_t start, stop;
double duration;
double calculateTicks(int n, double a[], double x, double (*function)(int, double[], double)) {
start = clock();
for (int i = 0; i < 1e6; i++) {
function(n, a, x);
}
stop = clock();
duration = ((double)(stop - start)) / CLOCKS_PER_SEC;
return duration;
}
double f1(int n, double a[], double x) {
int i;
double p = a[0];
for (i = 1; i <= n; i++) {
p += a[i] + pow(x, i);
}
return p;
}
double f2(int n, double a[], double x) {
int i;
double p = a[n];
for (i = 1; i <= n; i++) {
p = a[i - 1] + x * p;
}
return p;
}
int main() {
int i;
double a[MAXN];
for (i = 0; i < MAXN; i++) {
a[i] = (double)i;
}
double ticks1 = calculateTicks(MAXN - 1, a, 1.1, f1);
printf("ticks1 = %lf\n", ticks1);
double ticks2 = calculateTicks(MAXN - 1, a, 1.1, f2);
printf("ticks2 = %lf\n", ticks2);
return 0;
}
首先,我们创建了一个名为calculateTicks
的新函数来封装运行循环所需的时间计算。该函数接受n
、a[]
、x
和一个用于执行循环的函数指针function
作为参数。
在calculateTicks
函数内部,我们使用clock()
函数计算开始时间start
和结束时间stop
,然后通过循环调用传入的function
函数1e6
次。
计算结束后,我们将开始时间和结束时间的差值转换为秒数,存储在duration
变量中,并返回这个时间值。
在main
函数中,我们调用calculateTicks
函数两次来计算f1
和f2
函数的时间。
最后,我们输出这两个时间值。
通过这个封装的函数,你可以更简洁地计算两个循环部分的执行时间,而无需重复的代码。