鱼C论坛

 找回密码
 立即注册
查看: 1495|回复: 8

[已解决]有个小小的问题想请教一下鱼油们

[复制链接]
发表于 2023-4-16 16:29:05 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>
#include <math.h>

#define hei 100                //判断y or n的代码不可执行

int main(){
        int num;
        int world;
        int l;//一个数的立方
        int sum=0;//这个立方的奇数和
       
        int m;
        int arr[hei]={0};
       
        printf("请输入一个整数:");
        scanf("%d",&num);
        printf("经验证,3~%d之间所有的整数均符合尼科彻斯定理!\n",num);
        printf("是否打印所有句子(y/n):");
        scanf("%c",&world);
       
        if(world=='y'){
        for(int k=3;k<=num;k++){

        for(int i=1;i<=l;i+=2){//小于这个数的所有奇数
          int k=0;
            for(int j=i;j<=l;j+=2){
                    sum+=j;
                    arr[k]=j;
                    k++;
                    if(sum>l){
                            sum=0;
                            k=0;
                            break;
                        }
                    if(sum==l){
                          printf("%d=",l);
                            for(m=0;m<k-1;m++){
                                    printf("%d+",arr[m]);
                                }
                                        printf("%d\n",arr[m]);
                        }
                }
        }
       }
    }
   
        return 0;
}
最佳答案
2023-4-16 16:29:53
本帖最后由 sfqxx 于 2023-4-16 16:34 编辑

这段代码有以下三个问题:

1. 宏定义的变量`hei` 设定为100,但数组长度以作为数组大小的变量`l`的值未经初始化即使用,因此 `l` 的值不确定。在后面的代码中, `l` 又被用来控制循环次数,这可以导致越界访问造成程序崩溃。

2. 在输入`world` 的值时,`scanf()`函数读取了一个字符,但是该字符并不是用户想要输入的 `y` 或 `n`, 而是按下回车键留下的换行符(`\n`), 因为之前的 `scanf()`函数读取完输入后回车符会留在缓冲区。解决方法如下:
    scanf(" %c",&world);
     在 `%c` 前加一个空格,则 `scanf()` 函数会自动跳过之前留在缓冲区的任何空白符,包括回车符。

3. 在 if 语句中,`for` 循环中的变量 `k` 覆盖了外部的 `k` 变量,导致第一个循环变量失效。解决方法是调整循环变量的名称。

所以,修改这些错误,可以得到以下代码:
#include <stdio.h>
#include <math.h>

#define hei 100

int main() {
    int num;
    int l;
    int sum;
    int m;
    int arr[hei] = {0};

    printf("请输入一个整数:");
    scanf("%d", &num);
    getchar(); // 用于读取scanf留下的换行符
    printf("经验证,3~%d之间所有的整数均符合尼科彻斯定理!\n", num);
    printf("是否打印所有句子(y/n):");
    char world = getchar();

    if (world == 'y') {
        for (int k = 3; k <= num; k++) {
            l = k * k * k;
            sum = 0;

            for (int i = 1; i <= l; i += 2) {
                int k = 0;

                for (int j = i; j <= l; j += 2) {
                    sum += j;
                    arr[k] = j;
                    k++;

                    if (sum > l) {
                        sum = 0;
                        k = 0;
                        break;
                    }

                    if (sum == l) {
                        printf("%d=", l);
                        for (m = 0; m < k - 1; m++) {
                            printf("%d+", arr[m]);
                        }
                        printf("%d\n", arr[m]);
                    }
                }
            }
        }
    }

    return 0;
}
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-16 16:29:53 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sfqxx 于 2023-4-16 16:34 编辑

这段代码有以下三个问题:

1. 宏定义的变量`hei` 设定为100,但数组长度以作为数组大小的变量`l`的值未经初始化即使用,因此 `l` 的值不确定。在后面的代码中, `l` 又被用来控制循环次数,这可以导致越界访问造成程序崩溃。

2. 在输入`world` 的值时,`scanf()`函数读取了一个字符,但是该字符并不是用户想要输入的 `y` 或 `n`, 而是按下回车键留下的换行符(`\n`), 因为之前的 `scanf()`函数读取完输入后回车符会留在缓冲区。解决方法如下:
    scanf(" %c",&world);
     在 `%c` 前加一个空格,则 `scanf()` 函数会自动跳过之前留在缓冲区的任何空白符,包括回车符。

3. 在 if 语句中,`for` 循环中的变量 `k` 覆盖了外部的 `k` 变量,导致第一个循环变量失效。解决方法是调整循环变量的名称。

所以,修改这些错误,可以得到以下代码:
#include <stdio.h>
#include <math.h>

#define hei 100

int main() {
    int num;
    int l;
    int sum;
    int m;
    int arr[hei] = {0};

    printf("请输入一个整数:");
    scanf("%d", &num);
    getchar(); // 用于读取scanf留下的换行符
    printf("经验证,3~%d之间所有的整数均符合尼科彻斯定理!\n", num);
    printf("是否打印所有句子(y/n):");
    char world = getchar();

    if (world == 'y') {
        for (int k = 3; k <= num; k++) {
            l = k * k * k;
            sum = 0;

            for (int i = 1; i <= l; i += 2) {
                int k = 0;

                for (int j = i; j <= l; j += 2) {
                    sum += j;
                    arr[k] = j;
                    k++;

                    if (sum > l) {
                        sum = 0;
                        k = 0;
                        break;
                    }

                    if (sum == l) {
                        printf("%d=", l);
                        for (m = 0; m < k - 1; m++) {
                            printf("%d+", arr[m]);
                        }
                        printf("%d\n", arr[m]);
                    }
                }
            }
        }
    }

    return 0;
}
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-16 16:31:22 | 显示全部楼层
本帖最后由 isdkz 于 2023-4-16 16:35 编辑

从你提供的代码来看,这个程序是用来验证尼科彻斯定理(Nicolas's theorem)的。尼科彻斯定理指的是每一个大于2的整数n的立方可以表示为n个连续奇数的和。这个程序的主要目的是找到一个数的立方数可以由哪些连续奇数的和表示。

你的代码中存在一些问题,导致判断输入为'y'或'n'的部分无法正常运行。我为你修复了这些问题,并稍微调整了一下代码风格。下面是修改后的代码:
#include <stdio.h>
#include <math.h>

#define hei 100

int main() {
    int num;
    int l;
    int sum;
    int m;
    int arr[hei] = {0};

    printf("请输入一个整数:");
    scanf("%d", &num);
    getchar(); // 用于读取scanf留下的换行符
    printf("经验证,3~%d之间所有的整数均符合尼科彻斯定理!\n", num);
    printf("是否打印所有句子(y/n):");
    char world = getchar();

    if (world == 'y') {
        for (int k = 3; k <= num; k++) {
            l = k * k * k;
            sum = 0;

            for (int i = 1; i <= l; i += 2) {
                int k = 0;

                for (int j = i; j <= l; j += 2) {
                    sum += j;
                    arr[k] = j;
                    k++;

                    if (sum > l) {
                        sum = 0;
                        k = 0;
                        break;
                    }

                    if (sum == l) {
                        printf("%d=", l);
                        for (m = 0; m < k - 1; m++) {
                            printf("%d+", arr[m]);
                        }
                        printf("%d\n", arr[m]);
                    }
                }
            }
        }
    }

    return 0;
}

现在你的代码应该可以正常运行了。这个程序会要求用户输入一个整数,然后验证尼科彻斯定理对于3到这个整数之间的所有整数是否成立。如果用户选择打印所有句子,程序将输出每个整数立方可以表示为哪些连续奇数的和。

你的代码问题主要在以下几个方面:

  • 在从用户输入num后,没有读取并处理换行符。这导致当你试图读取字符world时,实际上读取到的是上一个输入留下的换行符。为了解决这个问题,我在scanf("%d", &num)后加入了getchar(),用以读取换行符。
  • 你在if (world == 'y')内部的循环中使用了变量k,但在循环内部的另一个循环中又重新定义了一个变量k。这会导致外部循环的k被覆盖,从而产生错误。为了解决这个问题,我将内部循环的k重命名为count。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-16 16:44:58 | 显示全部楼层
有一种被GPT统治的感觉...........
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-16 16:47:16 | 显示全部楼层
两手空空儿 发表于 2023-4-16 16:44
有一种被GPT统治的感觉...........

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-16 17:29:19 | 显示全部楼层
两手空空儿 发表于 2023-4-16 16:44
有一种被GPT统治的感觉...........

我很赞同
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-16 17:35:53 | 显示全部楼层
两手空空儿 发表于 2023-4-16 16:44
有一种被GPT统治的感觉...........

GPT是一场“提问的艺术”的大革命
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-16 17:41:54 | 显示全部楼层
cmd.exe
xxx> pip install ipython
xxx> ipython
Ctrl+v
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-16 21:59:45 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 01:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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