马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
//以下四个标黄不会
#include <stdio.h>
#define MAX_NUM 64
int schedule[MAX_NUM+1][MAX_NUM+1];
int arrange(int begin, int num);
int arrange(int begin, int num)
{
int i, j;
if (num == 2)//当最后arrange函数最后mum==2时按照1 2 2 1 的顺序存储到数组schedule[1][1] schedule[1][2] schedule[2][1] schedule[2][2]的元素中,并return 0;可是二维数组刚开始不应该是[0][0]吗
二维数组的第一个元素不应该是0,0吗为啥这里的1的位置是这个
{// 所以[0][x]和[x][0]存放什么捏
schedule[begin][1] = begin;
schedule[begin][2] = begin + 1;
schedule[begin+1][1] = begin + 1;
schedule[begin+1][2] = begin;
return 0;
}
arrange(begin, num/2);
arrange(begin + num/2, num/2);
// 下面四个for函数也不太懂,以及在数组中存放的位置,
for (i = begin + num/2; i < begin + num; i++)
{
for (j = num/2 + 1; j <= num; j++)
{
schedule[i][j] = schedule[i-num/2][j-num/2];
}
}
for (i = begin; i < begin + num/2; i++)
{
for (j = num/2 + 1; j <= num; j++)
{
schedule[j] = schedule[i+num/2][j-num/2];
}
}
}
int main(void)
{
int num, i, j;
printf("请输入参赛的队伍数量:");
scanf("%d", &num);
// 检查num是否2的N次方
// 注意,这里是&,不是&&
// &是按位与操作,1&1==1,0&1==0,0&0 == 0
if (num & num - 1)
{
printf("参数队伍的数量必须是2的N次方!\n");
return -1;
}
arrange(1, num);
// 这里也不太懂,打印编号的位置,所以这个i是个局部变量?[/i]
[i][i] printf("编 号");
for (i = 1; i < num; i++)
{
printf("\t第%d天", i);
}
putchar('\n');
//还有这个循环语句什么意思捏
for (i = 1; i <= num; i++)
{
for (j = 1; j <= num; j++)
{
printf("%3d\t", schedule[j]);
}
putchar('\n');
}
return 0;
}[/i][/i]
让我们逐步回答您的每个问题:
1. 二维数组 `schedule` 被定义为 `int schedule[MAX_NUM+1][MAX_NUM+1];`。在 C 语言中,数组是从 0 开始索引的,这意味着第一个元素使用索引 0 而不是 1 进行访问。在这段代码中,数组元素从索引 1 到 `num` 进行访问,所以数组的大小被定义为 `MAX_NUM+1`,以适应这种索引方式。数组中的索引 0 处的元素在这段代码中没有被使用。
2. `arrange` 函数中的四个 `for` 循环用于根据特定的模式重新排列 `schedule` 数组中的元素。让我们逐个解释每个循环的目的:
- 第一个循环 `for (i = begin + num/2; i < begin + num; i++)` 迭代范围的后半部分,嵌套循环 `for (j = num/2 + 1; j <= num; j++)` 迭代 `schedule` 数组的后半部分列。此循环的目的是将范围的前半部分的值(`schedule[i-num/2][j-num/2]`)复制到范围的后半部分(`schedule[j]`)。
- 第二个循环 `for (i = begin; i < begin + num/2; i++)` 迭代范围的前半部分,嵌套循环 `for (j = num/2 + 1; j <= num; j++)` 再次迭代 `schedule` 数组的后半部分列。此循环的目的与第一个循环类似,但是顺序相反。它将范围的后半部分的值(`schedule[i+num/2][j-num/2]`)复制到范围的前半部分(`schedule[j]`)。
- 这些循环有助于按照特定的模式排列元素,但是在提供的代码中,没有直接清楚地说明具体的模式或代码的目的。没有附加的上下文或注释,很难确定代码的确切模式或目的。
3. `main` 函数中的最后一个 `for` 循环用于打印 `schedule` 数组的内容。它迭代 `schedule` 数组的每一行和每一列,并使用循环内的 `printf` 语句打印相应的值。`printf` 语句 `printf("%3d\t", schedule[j]);` 用于以 3 个字符的宽度打印每个值,后面跟一个制表符(`\t`)。在打印每一行后,打印一个换行符(`\n`)以换行到下一行。
|