【问题标题】:Converting struct c ++ programs to c language将struct c++程序转换为c语言
【发布时间】:2021-02-20 13:26:41
【问题描述】:

我正在解决关于 e-Olymp 的问题。

我已经使用 c++ 解决了这个问题。这是我创建的一个程序:

#include <iostream>

using namespace std;

int m, MOD = 1000003;

struct Math //Deklaraasi struct dengan MOD
{
    long pow_mod(long a, long p)
    {
        if (a >= m) a %= MOD;
        if (a == 0) return 0;
        if (p == 0) return 1;
        long t = pow_mod(a, p / 2);
        if (p & 1) return a * t % MOD * t % MOD;
        return t*t % MOD;
    }
    long inverse(long a) { return pow_mod(a, MOD - 2); }
    long C_MOD(long n, long k)
    {
        long ans = 1;
        if (k > n / 2) k = n - k;
        for (int i = 1; i <= k; i++)
        {
            ans *= n - k + i;
            ans %= MOD;
            ans *= inverse(i);
            ans %= MOD;
        }
        return ans;
    }
} math;

struct BST      //Struct untuk BST
{
    struct node {
        int val, sz, F;
        node *ch[2];
    } *root;
    void Del(node* T)
    {
        if (!T) return;
        Del(T->ch[0]);
        Del(T->ch[1]);
        delete T;
    }
    void reset()    //Fungsi untuk mereset
    {
        Del(root);
        root = nullptr;
    }
    int getsz(node *T) { return T ? T->sz : 0; }
    void insert(int v, node* &T)
    {
        if (!T)
        {
            T = new node();
            T->val = v;
            T->sz = 1;
        }
        else
        {
            insert(v, T->ch[v > T->val]);
            T->sz = getsz(T->ch[0]) + getsz(T->ch[1]) + 1;
        }
    }
    int f(node* T)
    {
        if (!T) return 1;
        if (T->F) return T->F;
        return T->F = (long)f(T->ch[0]) * f(T->ch[1]) % MOD \
            * math.C_MOD(getsz(T->ch[0]) + getsz(T->ch[1]), getsz(T->ch[0])) % MOD;
    }
} bst;

int main()
{
    int T, n, A[1010];
    scanf("%d", &T);
    for (int kase = 1; kase <= T; kase++)   //Perulangan sebanyak input pengguna atau T
    {
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= n; i++) scanf("%d", &A[i]);
        //membuat BST
        bst.reset();
        for (int i = 1; i <= n; i++) bst.insert(A[i], bst.root);
        int ans = bst.f(bst.root) * math.C_MOD(m, n) % MOD;
        printf("%d\n", ans);
    }
}

接下来我想尝试将程序转换成c语言,解决问题。但是我还是c语言的初学者,在应用c struct语言不能像c++那样制作的结构时遇到了一些问题。

如何解决问题或使用 c 语言中的适当结构将我的 c++ 程序转换为 c?

谢谢。

【问题讨论】:

  • 你尝试了什么?它是如何失败的?你被困在哪里了?恭喜你意识到 C 不是 C++,但作为第一次试验,我只是要求 C 编译器编译它,看看会发生什么。你已经这样做了吗?
  • C 中没有成员函数之类的东西。这需要重写,而不仅仅是“翻译”或“转换”。此外,在线竞赛编码网站不是真正学习另一种计算机语言的方式。这些网站希望您使用您已经知道的计算机语言,并且足够了解它,而不必询问如何使用该语言的问题。
  • c语言中,struct类型不能有函数。您可以将内部结构函数编写为普通函数,使用结构实例作为参数。
  • 关于 C++ 发布的代码。看来struct 对象应该是class 对象。 struct 示例中的函数应该是 publicprivate struct 对象中的每个变量都应该有一个访问函数。我在struct 对象中看不到构造函数、析构函数和复制函数,因此它们将使用默认的构造函数、析构函数和复制函数生成。可能不是你想要的。

标签: c++ c struct


【解决方案1】:

要将您的 C++ 代码转换为 C,您主要需要将成员函数更改为常规函数,这些函数将它们所作用的结构作为参数。 例如会发生变化

void reset()

void reset(BST* bst)

在该函数内部 root by bst-&gt;root 当然,您可以使用引用而不是指针来避免空检查。 因此,您的 Math 无论如何都不包含任何状态,您可以将其删除并将该函数用作常规函数(并在调用时删除 math.)。

考虑重命名函数以对逻辑组进行分组,例如bst_reset(BST* bst) 作为新名称。

此外,您还需要更改一些 C 不知道的其他内容。 它们是:

  • nullptr 更改为NULL(相同用法)
  • #include &lt;iostream&gt; 替换为#include &lt;stdio.h&gt;(包含scanf 和printf)
  • 删除 using namespace std; 而不替换(C 中没有命名空间)
  • new node() 替换为(node*) malloc(sizeof(node))(请注意,结构中包含的值始终未定义,因为没有像构造函数这样的东西)和delete Tfree(T)
  • 要使用mallocfree,还需要包含#include &lt;stdlib.h&gt;

您嵌套的struct node 可能也需要移出struct BST

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 2014-02-14
    相关资源
    最近更新 更多