关于c语言函数的一个问题

这个程序的从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;
}


img

计时和输出分别扔到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的新函数来封装运行循环所需的时间计算。该函数接受na[]x和一个用于执行循环的函数指针function作为参数。

calculateTicks函数内部,我们使用clock()函数计算开始时间start和结束时间stop,然后通过循环调用传入的function函数1e6次。

计算结束后,我们将开始时间和结束时间的差值转换为秒数,存储在duration变量中,并返回这个时间值。

main函数中,我们调用calculateTicks函数两次来计算f1f2函数的时间。

最后,我们输出这两个时间值。

通过这个封装的函数,你可以更简洁地计算两个循环部分的执行时间,而无需重复的代码。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^