1

我正在尽力完成此代码。至少在几天的时间里,现在已经超过 15 个小时了,我仍然被困住了。我正在用 C 编程,它是我的第一语言,所以我有点菜鸟,对不起。任何形式的帮助都会非常有帮助。

一个快速的第一个问题:

while (manStatus[i] == -1 || womanStatus[i] == -1)

什么是正确的语法或方式来表示我想不断检查我的数组的元素以查看里面是否有任何值是“-1”(或者实际上,这些数组中的男人和女人是单身,所以继续尝试配对)。

我有更多,但这一个已经难倒我好几天了。我会继续努力解决剩下的问题,但如果有人有时间的话,我会很乐意为初学者提供一些帮助。

4

5 回答 5

3

在 C 中,不能简单地期望manStatus[i] == -1检查数组中的所有值并返回true匹配中的任何值-1

相反,您需要编写一个算法,手动对数组中的每个元素进行细致检查。它实际上非常简单并且使用循环。我在这里将它实现为一个函数:

bool checkArray(int array[],int arrayLength, int val)
{
    int i;
    for(i = 0; i < arrayLength; i++)
    {
        if(array[i] == val)
            return true;
    }
    return false;
}

现在您可以在语句中调用此函数:

while (checkArray(manStatus, LENGTH_OF_ARRAY, -1) || checkArray(womenStatus, LENGTH_OF_ARRAY, -1))
于 2013-10-27T22:53:33.437 回答
0

好吧,lsearch这可能很方便,但这是一个非标准功能。

定义一个辅助函数来检查一个值是否在数组中。

int containsInt(int *array, size_t length, int value) {
    size_t i;
    for(i = 0; i < length; i++) {
        if(array[i] == value) {
            return 1;
        }
    }
    return 0;
}

然后你的支票就变成了,

while(!containsInt(manStatus, numMen, -1) && !containsInt(womanStatus, numWomen, -1))
于 2013-10-27T22:51:00.980 回答
0

如果您想检查manStatus数组中的任何值是否为 -1,您可以这样做:

#define NON_WITH_MINUS_ONE 0
#define SOME_WITH_MINUS_ONE 1
int checkMarriage(int *manStatus,int N)
{
  for(i=0;i<N;i++)
    if(manStatus[i]==-1) 
      return SOME_WITH_MINUS_ONE
  return  NON_WITH_MINUS_ONE
}

其中 N 是数组中的元素数。然后你可以调用这个函数,例如

if(checkMarriage(manStatus, 20)==1) 
{//do something}
else
{ //do something else}
于 2013-10-27T22:51:31.407 回答
0

以您的方式,如果您在另一个数组用完之前用完了男性或女性,那么您将陷入无限循环。

一旦没有更多匹配项,打破循环的最佳方法是:

while (manStatus[i] == -1` && `womanStatus[i] == -1)
于 2013-10-27T23:00:00.637 回答
0

让我先从数学的角度回答。据我了解,您有两个有限集(幸运的是,地球上的人类数量是有限的……休)。第一个,我将表示为S w是一组女性(女士优先男士!)。第二个是男子的:S m

现在,您想将来自S w的女性与来自S m的男性配对。不保证每组的基数相同。我将它们表示为i = | S i |, 其中 i ∈ { w, m }。

假设我们有w > m(呵呵),那么您所要做的就是在S w 中的 w 中选择m女性子集​​ S w,m(有w!/((w - m)! .m!)这样的子集),然后在S mS w,m之间建立一个双射。有米!这样的双射。然后,您通过将其他女性设置为单身状态(如果我做对了)来扩展双射。-1

从现在开始,你有两种可能:

  • 生成一个这样的“扩展双射” p并将男人i与女人p(i)绑定 (剩下的可怜的小女人到 status -1)。
  • 您得到了部分“配对”的两组,并且您希望尽可能多地配对剩余的单曲。

在我走得更远之前,你能告诉我哪种方法是你感兴趣的吗?

于 2013-10-27T23:21:40.390 回答