0

我正在构建一个符号表,并且很难编写 get_symbol,它具有 (symbol_table symtab, char sym) 的参数。我必须为 2 个函数 get_symbol 和 set_symbol 编写代码,我在理解什么是符号表以及如何写出这两个函数时遇到了一些麻烦。它说 get_symbol() 有两个参数:符号表和应检索其值的符号名称。如果符号名称是 A、B、C 之一,则应返回符号表中的相应值。如果它不是这些名称之一,则应返回 0。如果有人可以提供帮助,那将非常感谢您的宝贵时间。

symbol_table.c 代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    #include "globals.h"
    #include "symbol_table.h"

    typedef struct symbol_table_s {
            int a,b,c;
    }*symbol_table_rep;


    status init_symbol_table (symbol_table *p_symtab)
    {
    symbol_table_rep st = malloc(sizeof(struct symbol_table_s));
    if (st == NULL)
            return ERROR;
    st->a = st->b = st->c = 0;
    *p_symtab = (symbol_table) st;
    return OK;
    }

    void destroy_symbol_table (symbol_table *p_symtab)
    {
    free(*p_symtab);
    *p_symtab = NULL;
    }
    void set_symbol(symbol_table *p_symtab, char sym, int value)
    {

    /* WRITE CODE FOR THIS */

    }
    int get_symbol (symbol_table symtab, char sym)
    {

    /* WRITE CODE FOR THIS FUNCTION */


    symbol_table_rep symtab;
    if (A,B,C)
    {
            return symbol_table;
    }else{
            return 0;
    }
    }

    symbol_table.h Code:
    #ifndef _SYMBOL_TABLE_H
    #define _SYMBOL_TABLE_H

    #include "globals.h"

    ABSTRACT_TYPE(symbol_table);

    status init_symbol_table   (symbol_table *p_symtab);
    void   destroy_symbol_table(symbol_table *p_symtab);

    void   set_symbol          (symbol_table *p_symtab, char sym, int value);
    int    get_symbol          (symbol_table  symtab,    char sym);

    #endif
4

1 回答 1

0

您的代码还有许多其他问题,尤其是您将整个符号表按值传递给 get_symbol。你所展示的代码有多少是你写的,有多少样板代码你应该保持原样?

这是一个符号表的实现,其中符号是单个字符,值只是整数,就像您的代码一样。但这支持超过 3 个符号。

// symbol_table.h
struct symbol_table;
struct symbol_table* init_symbol_table(void);
void   destroy_symbol_table(struct symbol_table *p_symtab);

void   set_symbol          (symbol_table *p_symtab, char sym, int value);
int    get_symbol          (const symbol_table  *symtab,    char sym);

// symbol_table.c
#include <limits.h>
#include <stdlib.h>
#define ARRAYSIZE(a) (sizeof(a)/sizeof((a)[0]))
struct symbol_table
{
  // On rare systems, UCHAR_MAX == SIZE_MAX, and this array size will not work.
  // Most people will never write code for such a system though.  We'll ignore them. 
  int values[UCHAR_MAX+1];
};

struct symbol_table* init_symbol_table (void)
{
  struct symbol_table *p = malloc(sizeof(struct symbol_table));
  if (p) 
  { 
    size_t i;
    for (i=0; i<ARRAYSIZE(p->values); ++i)
      p->values[i] = 0;
  }
  return p;
}


void destroy_symbol_table(struct symbol_table *p)
{
  free(p);
}

void   set_symbol (symbol_table *p, char sym, int value)
{
  p->values[(unsigned char)sym] = value;
}

int get_symbol (const symbol_table  *p, char sym)
{
  return p->values[(unsigned char)sym];
}

如果您需要保持函数接口相同(完成相当奇怪的定义symbol_table),那么您可以使用一些简单的条件语句来实现get_symbol和:语句序列或语句。set_symbolifswitch

如果您对此有困难,请重新阅读课程材料中处理字符类型和if. 如果您的课程材料没有涵盖这些内容,那么您应该找到一些其他学习 C 语言的资源;尝试从Great C 教程中提到的项目开始?

是的,我可以为您编写get_symbol代码set_symbol,但我相信您正在寻找的帮助更多的是弄清楚如何开始解决问题,而不是在不理解的情况下获得完成的结果。

我认为您需要实现的关键是详细了解计算机需要采取哪些具体操作来返回其中一个符号的值。首先尽可能准确地以任何符号(图表或英语,等等)说明这一点。然后尝试用 C 语言实现这种理解。

这个首先了解解决问题的机制的过程——也就是说,你想让计算机做什么——是学习编程过程的核心。我猜,这种家庭作业旨在提供这种学习经验。但是没有人可以为你做。向您展示已完成的代码可能无济于事,因为它不会让您“啊哈!” 洞察力。

如果你真的完全被卡住了,请从这个实现开始:

void set_symbol(symbol_table *p_symtab, char sym, int value)
{
  /* WRITE CODE FOR THIS LATER */
}

int get_symbol (symbol_table symtab, char sym)
{
  return 0;
}

它显然做错了事,但它会编译。然后通过修改它来处理它,为 A、B 和 C 返回一个固定值。然后参考你的学习材料,了解如何访问结构的成员。更改代码以始终返回a成员的值。然后尝试弄清楚如何区分调用者想要获取 A 或 B 或 C 的值的情况。您可能会发现“人为地”将符号表的成员a b和设置c为某个特征值以确保您返回的是正确的(但请记住稍后删除该代码)。

完成后,开始着手实施set_symbol. 到您完成get_symbol工作时,set_symbol应该很容易。

于 2012-04-14T23:50:01.420 回答