由其成员选择一个随机结构
Choosing a random struct by its members
我必须在 C 中为一个教育软件项目建模周期性的 table(这基本上是一个测验)。
我已经创建了一个结构并声明了所有元素。现在我必须编写一个随机选择一个元素的函数。
这是我的结构:
typedef struct{
char name[15];
char shortname[3];
int group;
int period;
}element;
element hydrogen={"hydrogen", "H", 1, 1}, helium={"Helium", "He", ...
我已经尝试将它们组合成一个数组,然后生成一个随机索引:
element elements[118];
elements[1] = {"hydrogen", "H", 1, 1};
但这给了我错误:(
有什么想法吗?
您可以使用指定的初始化程序:
element elements[118] =
{
[0] = {"hydrogen", "H", 1, 1},
[1] = {"helium", 18, 1},
...
};
更好的是,您可以使用枚举摆脱 "magic numbers":
typedef enum
{
ELEMENT_H,
ELEMENT_He,
ELEMENT_Li,
...
NUMBER_OF_ELEMENTS
} element_t;
element elements[] =
{
[ELEMENT_H] = {"hydrogen", "H", 1, 1},
[ELEMENT_He] = {"helium", 18, 1},
...
};
_Static_assert(sizeof(elements)/sizeof(elements[0]) == NUMBER_OF_ELEMENTS,
"Missing elements!");
不过请注意,这将是零索引的,这与周期性 table 不同。所以你想打印周期性的 table 数字,你必须在打印时使用 +1 。 (或者你可以在数组的开头留下一个垃圾项,但这是草率的编程。)
该方法应该有效。
设置一个结构数组,然后取 index = rand() % 118。您设置结构列表的语法是问题所在。尝试
struct element elements[118] = {
{"hydrogen", "H", 1, 1},
{"helium", "He", 2, 4},
... etc
};
您在 C 名称中使用了 C++ = 运算符心态 space。那是你的错误。你在名字space"C".
::= 将所有成员元素从一个隐式复制到另一个的运算符在 C 中不存在。
相反,您必须逐个元素显式复制所有成员。
所以:
strncpy (elements[1].name, "hydrogen", strlen("hydrogen"));
strncpy (elements[1].shortname, "H", strlen("H"));
elements[1].group = 1;
elements[1].period = 1;
将是正确的方法。内联函数或#define 将使它更容易执行并在以后忘记。
我必须在 C 中为一个教育软件项目建模周期性的 table(这基本上是一个测验)。
我已经创建了一个结构并声明了所有元素。现在我必须编写一个随机选择一个元素的函数。
这是我的结构:
typedef struct{
char name[15];
char shortname[3];
int group;
int period;
}element;
element hydrogen={"hydrogen", "H", 1, 1}, helium={"Helium", "He", ...
我已经尝试将它们组合成一个数组,然后生成一个随机索引:
element elements[118];
elements[1] = {"hydrogen", "H", 1, 1};
但这给了我错误:(
有什么想法吗?
您可以使用指定的初始化程序:
element elements[118] =
{
[0] = {"hydrogen", "H", 1, 1},
[1] = {"helium", 18, 1},
...
};
更好的是,您可以使用枚举摆脱 "magic numbers":
typedef enum
{
ELEMENT_H,
ELEMENT_He,
ELEMENT_Li,
...
NUMBER_OF_ELEMENTS
} element_t;
element elements[] =
{
[ELEMENT_H] = {"hydrogen", "H", 1, 1},
[ELEMENT_He] = {"helium", 18, 1},
...
};
_Static_assert(sizeof(elements)/sizeof(elements[0]) == NUMBER_OF_ELEMENTS,
"Missing elements!");
不过请注意,这将是零索引的,这与周期性 table 不同。所以你想打印周期性的 table 数字,你必须在打印时使用 +1 。 (或者你可以在数组的开头留下一个垃圾项,但这是草率的编程。)
该方法应该有效。 设置一个结构数组,然后取 index = rand() % 118。您设置结构列表的语法是问题所在。尝试
struct element elements[118] = {
{"hydrogen", "H", 1, 1},
{"helium", "He", 2, 4},
... etc
};
您在 C 名称中使用了 C++ = 运算符心态 space。那是你的错误。你在名字space"C".
::= 将所有成员元素从一个隐式复制到另一个的运算符在 C 中不存在。
相反,您必须逐个元素显式复制所有成员。
所以:
strncpy (elements[1].name, "hydrogen", strlen("hydrogen"));
strncpy (elements[1].shortname, "H", strlen("H"));
elements[1].group = 1;
elements[1].period = 1;
将是正确的方法。内联函数或#define 将使它更容易执行并在以后忘记。