houqing1999 发表于 2023-6-1 16:28:44

s1e35动动手进阶

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

#include <stdio.h>

#define MAX_NUM 64

int schedule;

void getInput(char name[], int num);
int arrange(int begin, int num);

void getInput(char name[], int num)
{
      int i;

      for (i = 0; i < num; i++)
      {
                printf("请输入第%d个队伍的名字:", i+1);
                scanf("%s", name);
                getchar();
      }
}

int arrange(int begin, int num)
{
      int i, j;

      if (num == 2)
      {
                schedule = begin;
                schedule = begin + 1;
                schedule = begin + 1;
                schedule = begin;
                return 0;
      }

      arrange(begin, num/2);
      arrange(begin + num/2, num/2);

       for (i = begin + num/2; i < begin + num; i++)
      {
                for (j = num/2 + 1; j <= num; j++)
                {
                        schedule = schedule;
                }
      }

      for (i = begin; i < begin + num/2; i++)
      {
                for (j = num/2 + 1; j <= num; j++)
                {
                        schedule = schedule;
                }
      }
}

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;
      }

      char name;

      getInput(name, num);

      arrange(1, num);

      printf("\n比赛安排如下:\n");
      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("%s\t", name-1]);
                }
                putchar('\n');
      }

      return 0;
}

sfqxx 发表于 2023-6-1 16:29:35

歌者文明清理员 发表于 2023-6-1 16:30:32

sfqxx 发表于 2023-6-1 16:29


我的鱼币啊{:9_233:}

sfqxx 发表于 2023-6-1 16:34:31

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


#include <stdio.h>

#define MAX_NUM 64

int schedule;

void getInput(char name[], int num);
void arrange(int begin, int num);

void getInput(char name[], int num)
{
      int i;

      for (i = 0; i < num; i++)
      {
                printf("请输入第%d个队伍的名字:", i+1);
                scanf("%s", name);
                getchar();
      }
}

void arrange(int begin, int num)
{
      int i, j;

      if (num == 2)
      {
                schedule = begin;
                schedule = begin + 1;
                schedule = begin + 1;
                schedule = begin;
                return;
      }

      arrange(begin, num/2);
      arrange(begin + num/2, num/2);

       for (i = begin + num/2; i < begin + num; i++)
      {
                for (j = num/2 + 1; j <= num; j++)
                {
                        schedule = schedule;
                }
      }

      for (i = begin; i < begin + num/2; i++)
      {
                for (j = num/2 + 1; j <= num; j++)
                {
                        schedule = schedule;
                }
      }
}

int main(void)
{
      int num, i, j;

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

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

      char name;

      getInput(name, num);

      arrange(1, num);

      printf("\n比赛安排如下:\n");
      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("%s\t", name-1]);
                }
                putchar('\n');
      }

      return 0;
}

求最佳答案

houqing1999 发表于 2023-6-1 16:50:56

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


可是用visual stdio运行之后是这样的报错

sfqxx 发表于 2023-6-1 16:55:22

houqing1999 发表于 2023-6-1 16:50
可是用visual stdio运行之后是这样的报错

```c
#include <stdio.h>
#include <stdlib.h> //添加的stdlib头文件

#define MAX_NUM 64

int schedule;

void getInput(char name[], int num);
void arrange(int begin, int num);

void getInput(char name[], int num)
{
    int i;

    for (i = 0; i < num; i++)
    {
      printf("请输入第%d个队伍的名字:", i + 1);
      scanf("%s", name);
      getchar();
    }
}

void arrange(int begin, int num)
{
    int i, j;

    if (num == 2)
    {
      schedule = begin;
      schedule = begin + 1;
      schedule = begin + 1;
      schedule = begin;
      return;
    }

    arrange(begin, num / 2);
    arrange(begin + num / 2, num / 2);

    for (i = begin + num / 2; i < begin + num; i++)
    {
      for (j = num / 2 + 1; j <= num; j++)
      {
            schedule = schedule;
      }
    }

    for (i = begin; i < begin + num / 2; i++)
    {
      for (j = num / 2 + 1; j <= num; j++)
      {
            schedule = schedule;
      }
    }
}

int main(void)
{
    int num, i, j;

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

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

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

    getInput(name, num);
      arrange(1, num);

      printf("\n比赛安排如下:\n");
      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("%s\t", name-1]);
                }
                putchar('\n');
      }

      return 0;
}


试试这个?{:10_277:}

houqing1999 发表于 2023-6-1 16:59:35

本帖最后由 houqing1999 于 2023-6-1 17:02 编辑

sfqxx 发表于 2023-6-1 16:55
试试这个?

可以了,能解释一下之前报错的是什么意思吗?之前那个程序是不能再VS上运行,其他上可以?

sfqxx 发表于 2023-6-1 17:01:20

houqing1999 发表于 2023-6-1 16:59
可以了,能解释一下之前报错的是什么意思吗?改的哪里

主要是因为代码中的arrange函数没有返回值,但是定义时却声明了有int类型返回值,应该在该函数最后添加一个return语句并返回0或其他意义的整数。

houqing1999 发表于 2023-6-1 17:05:06

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

因为一个没有返回值把后面的num也改了?还添加了一个头文件stdlib?

sfqxx 发表于 2023-6-1 17:05:31

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

houqing1999 发表于 2023-6-1 17:24:47

本帖最后由 houqing1999 于 2023-6-3 20:52 编辑

sfqxx 发表于 2023-6-1 17:05


谢谢{:10_338:}

houqing1999 发表于 2023-6-1 17:38:28

sfqxx 发表于 2023-6-1 17:05


想问一下程序运行结果是这样的,上面的第一天第二天离的太近了怎么改下面的天数那边的循环结构啊

houqing1999 发表于 2023-6-3 21:35:02

houqing1999 发表于 2023-6-1 17:38
想问一下程序运行结果是这样的,上面的第一天第二天离的太近了怎么改下面的天数那边的循环结构啊

@sfqxx 能给解决一下这个简单的问题吗

houqing1999 发表于 2023-6-4 15:19:35

sfqxx 发表于 2023-6-1 16:55
试试这个?

刚学了动态分配内存,你用了mallo这个函数不用free释放内存?

sfqxx 发表于 2023-6-4 15:22:03

houqing1999 发表于 2023-6-4 15:19
刚学了动态分配内存,你用了mallo这个函数不用free释放内存?

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


free(name);

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


if ((num & (num - 1)) != 0)
{
    printf("参数队伍的数量必须是2的N次方!\n");
    return -1;
}

sfqxx 发表于 2023-6-4 15:23:18

houqing1999 发表于 2023-6-4 15:19
刚学了动态分配内存,你用了mallo这个函数不用free释放内存?

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

这个评点分,最好有3贡献{:10_254:}
页: [1]
查看完整版本: s1e35动动手进阶