鱼C论坛

 找回密码
 立即注册
查看: 1258|回复: 15

[已解决]s1e35动动手进阶

[复制链接]
发表于 2023-6-1 16:28:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
//程序报错,请问出错怎么改

  1. #include <stdio.h>

  2. #define MAX_NUM 64

  3. int schedule[MAX_NUM+1][MAX_NUM+1];

  4. void getInput(char name[][128], int num);
  5. int arrange(int begin, int num);

  6. void getInput(char name[][128], int num)
  7. {
  8.         int i;

  9.         for (i = 0; i < num; i++)
  10.         {
  11.                 printf("请输入第%d个队伍的名字:", i+1);
  12.                 scanf("%s", name[i]);
  13.                 getchar();
  14.         }
  15. }

  16. int arrange(int begin, int num)
  17. {
  18.         int i, j;

  19.         if (num == 2)
  20.         {
  21.                 schedule[begin][1] = begin;
  22.                 schedule[begin][2] = begin + 1;
  23.                 schedule[begin+1][1] = begin + 1;
  24.                 schedule[begin+1][2] = begin;
  25.                 return 0;
  26.         }

  27.         arrange(begin, num/2);
  28.         arrange(begin + num/2, num/2);

  29.        for (i = begin + num/2; i < begin + num; i++)
  30.         {
  31.                 for (j = num/2 + 1; j <= num; j++)
  32.                 {
  33.                         schedule[i][j] = schedule[i-num/2][j-num/2];
  34.                 }
  35.         }

  36.         for (i = begin; i < begin + num/2; i++)
  37.         {
  38.                 for (j = num/2 + 1; j <= num; j++)
  39.                 {
  40.                         schedule[i][j] = schedule[i+num/2][j-num/2];
  41.                 }
  42.         }
  43. }

  44. int main(void)
  45. {
  46.         int num, i, j;

  47.         printf("请输入参赛的队伍数量:");
  48.         scanf("%d", &num);

  49.         // 检查num是否2的N次方
  50.         // 注意,这里是&,不是&&
  51.         // &是按位与操作,1&1==1,0&1==0,0&0 == 0
  52.         if (num & num - 1)
  53.         {
  54.                 printf("参数队伍的数量必须是2的N次方!\n");
  55.                 return -1;
  56.         }

  57.         char name[num][128];

  58.         getInput(name, num);

  59.         arrange(1, num);

  60.         printf("\n比赛安排如下:\n");
  61.         printf("队 伍");

  62.         for (i = 1; i < num; i++)
  63.         {
  64.                 printf("\t第%d天", i);
  65.         }

  66.         putchar('\n');

  67.         for (i = 1; i <= num; i++)
  68.         {
  69.                 for (j = 1; j <= num; j++)
  70.                 {
  71.                         printf("%s\t", name[schedule[i][j]-1]);
  72.                 }
  73.                 putchar('\n');
  74.         }

  75.         return 0;
  76. }
复制代码


最佳答案
2023-6-1 16:55:22
houqing1999 发表于 2023-6-1 16:50
可是用visual stdio运行之后是这样的报错
  1. ```c
  2. #include <stdio.h>
  3. #include <stdlib.h> //添加的stdlib头文件

  4. #define MAX_NUM 64

  5. int schedule[MAX_NUM + 1][MAX_NUM + 1];

  6. void getInput(char name[][128], int num);
  7. void arrange(int begin, int num);

  8. void getInput(char name[][128], int num)
  9. {
  10.     int i;

  11.     for (i = 0; i < num; i++)
  12.     {
  13.         printf("请输入第%d个队伍的名字:", i + 1);
  14.         scanf("%s", name[i]);
  15.         getchar();
  16.     }
  17. }

  18. void arrange(int begin, int num)
  19. {
  20.     int i, j;

  21.     if (num == 2)
  22.     {
  23.         schedule[begin][1] = begin;
  24.         schedule[begin][2] = begin + 1;
  25.         schedule[begin + 1][1] = begin + 1;
  26.         schedule[begin + 1][2] = begin;
  27.         return;
  28.     }

  29.     arrange(begin, num / 2);
  30.     arrange(begin + num / 2, num / 2);

  31.     for (i = begin + num / 2; i < begin + num; i++)
  32.     {
  33.         for (j = num / 2 + 1; j <= num; j++)
  34.         {
  35.             schedule[i][j] = schedule[i - num / 2][j - num / 2];
  36.         }
  37.     }

  38.     for (i = begin; i < begin + num / 2; i++)
  39.     {
  40.         for (j = num / 2 + 1; j <= num; j++)
  41.         {
  42.             schedule[i][j] = schedule[i + num / 2][j - num / 2];
  43.         }
  44.     }
  45. }

  46. int main(void)
  47. {
  48.     int num, i, j;

  49.     printf("请输入参赛的队伍数量:");
  50.     scanf("%d", &num);

  51.     // 检查num是否2的N次方
  52.     if ((num & (num - 1)) != 0)
  53.     {
  54.         printf("参数队伍的数量必须是2的N次方!\n");
  55.         return -1;
  56.     }

  57.     char (*name)[128] = malloc(num * sizeof(*name)); //使用动态内存分配,避免栈溢出

  58.     getInput(name, num);
  59.         arrange(1, num);

  60.         printf("\n比赛安排如下:\n");
  61.         printf("队 伍");

  62.         for (i = 1; i < num; i++)
  63.         {
  64.                 printf("\t第%d天", i);
  65.         }

  66.         putchar('\n');

  67.         for (i = 1; i <= num; i++)
  68.         {
  69.                 for (j = 1; j <= num; j++)
  70.                 {
  71.                         printf("%s\t", name[schedule[i][j]-1]);
  72.                 }
  73.                 putchar('\n');
  74.         }

  75.         return 0;
  76. }
复制代码


试试这个?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-6-1 16:29:35 | 显示全部楼层

回帖奖励 +5 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-6-1 16:30:32 | 显示全部楼层

我的鱼币啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-1 16:34:31 | 显示全部楼层
这段代码的问题在于,函数 `arrange` 的返回值类型为 `int`,但没有返回值。可以将返回类型改为 `void`,并添加一个 `return` 语句或者直接移除 `return` 语句。此外,也可以在 `main` 函数中添加 `return 0` 以表明程序正常结束。具体的修改如下:


  1. #include <stdio.h>

  2. #define MAX_NUM 64

  3. int schedule[MAX_NUM+1][MAX_NUM+1];

  4. void getInput(char name[][128], int num);
  5. void arrange(int begin, int num);

  6. void getInput(char name[][128], int num)
  7. {
  8.         int i;

  9.         for (i = 0; i < num; i++)
  10.         {
  11.                 printf("请输入第%d个队伍的名字:", i+1);
  12.                 scanf("%s", name[i]);
  13.                 getchar();
  14.         }
  15. }

  16. void arrange(int begin, int num)
  17. {
  18.         int i, j;

  19.         if (num == 2)
  20.         {
  21.                 schedule[begin][1] = begin;
  22.                 schedule[begin][2] = begin + 1;
  23.                 schedule[begin+1][1] = begin + 1;
  24.                 schedule[begin+1][2] = begin;
  25.                 return;
  26.         }

  27.         arrange(begin, num/2);
  28.         arrange(begin + num/2, num/2);

  29.        for (i = begin + num/2; i < begin + num; i++)
  30.         {
  31.                 for (j = num/2 + 1; j <= num; j++)
  32.                 {
  33.                         schedule[i][j] = schedule[i-num/2][j-num/2];
  34.                 }
  35.         }

  36.         for (i = begin; i < begin + num/2; i++)
  37.         {
  38.                 for (j = num/2 + 1; j <= num; j++)
  39.                 {
  40.                         schedule[i][j] = schedule[i+num/2][j-num/2];
  41.                 }
  42.         }
  43. }

  44. int main(void)
  45. {
  46.         int num, i, j;

  47.         printf("请输入参赛的队伍数量:");
  48.         scanf("%d", &num);

  49.         // 检查num是否2的N次方
  50.         // 注意,这里是&,不是&&
  51.         // &是按位与操作
  52.         if (num & num - 1)
  53.         {
  54.                 printf("参数队伍的数量必须是2的N次方!\n");
  55.                 return -1;
  56.         }

  57.         char name[num][128];

  58.         getInput(name, num);

  59.         arrange(1, num);

  60.         printf("\n比赛安排如下:\n");
  61.         printf("队 伍");

  62.         for (i = 1; i < num; i++)
  63.         {
  64.                 printf("\t第%d天", i);
  65.         }

  66.         putchar('\n');

  67.         for (i = 1; i <= num; i++)
  68.         {
  69.                 for (j = 1; j <= num; j++)
  70.                 {
  71.                         printf("%s\t", name[schedule[i][j]-1]);
  72.                 }
  73.                 putchar('\n');
  74.         }

  75.         return 0;
  76. }
复制代码


求最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-1 16:50:56 | 显示全部楼层
sfqxx 发表于 2023-6-1 16:34
这段代码的问题在于,函数 `arrange` 的返回值类型为 `int`,但没有返回值。可以将返回类型改为 `void`,并 ...

微信图片_20230601164920.png
可是用visual stdio运行之后是这样的报错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-1 16:55:22 | 显示全部楼层    本楼为最佳答案   
houqing1999 发表于 2023-6-1 16:50
可是用visual stdio运行之后是这样的报错
  1. ```c
  2. #include <stdio.h>
  3. #include <stdlib.h> //添加的stdlib头文件

  4. #define MAX_NUM 64

  5. int schedule[MAX_NUM + 1][MAX_NUM + 1];

  6. void getInput(char name[][128], int num);
  7. void arrange(int begin, int num);

  8. void getInput(char name[][128], int num)
  9. {
  10.     int i;

  11.     for (i = 0; i < num; i++)
  12.     {
  13.         printf("请输入第%d个队伍的名字:", i + 1);
  14.         scanf("%s", name[i]);
  15.         getchar();
  16.     }
  17. }

  18. void arrange(int begin, int num)
  19. {
  20.     int i, j;

  21.     if (num == 2)
  22.     {
  23.         schedule[begin][1] = begin;
  24.         schedule[begin][2] = begin + 1;
  25.         schedule[begin + 1][1] = begin + 1;
  26.         schedule[begin + 1][2] = begin;
  27.         return;
  28.     }

  29.     arrange(begin, num / 2);
  30.     arrange(begin + num / 2, num / 2);

  31.     for (i = begin + num / 2; i < begin + num; i++)
  32.     {
  33.         for (j = num / 2 + 1; j <= num; j++)
  34.         {
  35.             schedule[i][j] = schedule[i - num / 2][j - num / 2];
  36.         }
  37.     }

  38.     for (i = begin; i < begin + num / 2; i++)
  39.     {
  40.         for (j = num / 2 + 1; j <= num; j++)
  41.         {
  42.             schedule[i][j] = schedule[i + num / 2][j - num / 2];
  43.         }
  44.     }
  45. }

  46. int main(void)
  47. {
  48.     int num, i, j;

  49.     printf("请输入参赛的队伍数量:");
  50.     scanf("%d", &num);

  51.     // 检查num是否2的N次方
  52.     if ((num & (num - 1)) != 0)
  53.     {
  54.         printf("参数队伍的数量必须是2的N次方!\n");
  55.         return -1;
  56.     }

  57.     char (*name)[128] = malloc(num * sizeof(*name)); //使用动态内存分配,避免栈溢出

  58.     getInput(name, num);
  59.         arrange(1, num);

  60.         printf("\n比赛安排如下:\n");
  61.         printf("队 伍");

  62.         for (i = 1; i < num; i++)
  63.         {
  64.                 printf("\t第%d天", i);
  65.         }

  66.         putchar('\n');

  67.         for (i = 1; i <= num; i++)
  68.         {
  69.                 for (j = 1; j <= num; j++)
  70.                 {
  71.                         printf("%s\t", name[schedule[i][j]-1]);
  72.                 }
  73.                 putchar('\n');
  74.         }

  75.         return 0;
  76. }
复制代码


试试这个?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-1 16:59:35 | 显示全部楼层
本帖最后由 houqing1999 于 2023-6-1 17:02 编辑


可以了,能解释一下之前报错的是什么意思吗?之前那个程序是不能再VS上运行,其他上可以?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-1 17:01:20 | 显示全部楼层
houqing1999 发表于 2023-6-1 16:59
可以了,能解释一下之前报错的是什么意思吗?改的哪里

主要是因为代码中的arrange函数没有返回值,但是定义时却声明了有int类型返回值,应该在该函数最后添加一个return语句并返回0或其他意义的整数。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-1 17:05:06 | 显示全部楼层
sfqxx 发表于 2023-6-1 17:01
主要是因为代码中的arrange函数没有返回值,但是定义时却声明了有int类型返回值,应该在该函数最后添加一 ...

因为一个没有返回值把后面的num也改了?还添加了一个头文件stdlib?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-1 17:05:31 | 显示全部楼层
houqing1999 发表于 2023-6-1 17:05
因为一个没有返回值把后面的num也改了?还添加了一个头文件stdlib?


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-1 17:24:47 | 显示全部楼层
本帖最后由 houqing1999 于 2023-6-3 20:52 编辑


谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-1 17:38:28 | 显示全部楼层

想问一下程序运行结果是这样的,上面的第一天第二天离的太近了怎么改下面的天数那边的循环结构啊 微信图片_20230601173748.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-3 21:35:02 | 显示全部楼层
houqing1999 发表于 2023-6-1 17:38
想问一下程序运行结果是这样的,上面的第一天第二天离的太近了怎么改下面的天数那边的循环结构啊

@sfqxx 能给解决一下这个简单的问题吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-4 15:19:35 | 显示全部楼层

刚学了动态分配内存,你用了mallo这个函数不用free释放内存?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-4 15:22:03 | 显示全部楼层
houqing1999 发表于 2023-6-4 15:19
刚学了动态分配内存,你用了mallo这个函数不用free释放内存?

好的,关于这个代码还有一些需要修改的地方,如你所说,虽然使用了动态内存分配函数 `malloc()` 来分配空间,但没有在程序运行结束后及时释放,这样会造成内存泄漏的问题,因此应当在程序的结尾加上以下代码实现内存的释放:


  1. free(name);
复制代码


此外,在用户输入队伍数量之后,代码中应加入对输入数量是否有效的检查,只有输入为2的幂次方时才进行比赛安排,否则输出错误信息并结束程序。这可以通过如下语句实现:


  1. if ((num & (num - 1)) != 0)
  2. {
  3.     printf("参数队伍的数量必须是2的N次方!\n");
  4.     return -1;
  5. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-4 15:23:18 | 显示全部楼层
houqing1999 发表于 2023-6-4 15:19
刚学了动态分配内存,你用了mallo这个函数不用free释放内存?

https://fishc.com.cn/thread-225505-1-1.html

这个评点分,最好有3贡献
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-10 08:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表