我必须在C中为一个教育软件项目建模周期表(它基本上是一个测验)。
我已经创建了一个结构并声明了所有元素。现在我必须编写一个随机选择一个元素的函数。
这是我的结构:
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};
但这只是给了我错误:(
有什么想法吗?
答案 0 :(得分:1)
这种方法应该有效。 设置一个结构数组,然后取index = rand()%118。你设置结构列表的语法就是问题所在。尝试
public mutating func round(_ rule: FloatingPointRoundingRule) {
switch rule {
case .toNearestOrAwayFromZero:
_value = Builtin.int_round_FPIEEE${bits}(_value)
case .toNearestOrEven:
_value = Builtin.int_rint_FPIEEE${bits}(_value)
case .towardZero:
_value = Builtin.int_trunc_FPIEEE${bits}(_value)
case .awayFromZero:
if sign == .minus {
_value = Builtin.int_floor_FPIEEE${bits}(_value)
}
else {
_value = Builtin.int_ceil_FPIEEE${bits}(_value)
}
case .up:
_value = Builtin.int_ceil_FPIEEE${bits}(_value)
case .down:
_value = Builtin.int_floor_FPIEEE${bits}(_value)
}
}
答案 1 :(得分:0)
您可以使用指定的初始值设定项:
element elements[118] =
{
[0] = {"hydrogen", "H", 1, 1},
[1] = {"helium", 18, 1},
...
};
更好的是,你可以摆脱"魔术数字"使用枚举:
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!");
虽然请注意,与周期表不同,这将是零索引。因此,您要打印周期表编号,打印时必须使用+1。 (或者你可以在数组的开头留下一个垃圾项,但这是一个草率的编程。)
答案 2 :(得分:-4)
您在C名称空间内使用C ++ =运算符心态。那是你的错。你在命名空间“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可以让以后更容易执行和忘记。