【问题标题】:Why does cycle increment and not print out just the number of cycles?为什么循环增加而不只是打印出循环数?
【发布时间】:2016-02-11 07:44:59
【问题描述】:

下面有我的代码。我试图得到 8、3、1、8、1、1、1、1、1、1。对于我的代码输出中的循环,当用户输入 45 23 6 12 0 0 0 0 0 0 时。但由于某种原因,它将下一个数字加起来减去 1。所以我得到 8、10、10、17、17、17、17、17、17、17。我试图解决这个问题,但我所做的似乎无济于事.有人可以帮我指出发生这种情况的原因吗?

#include<stdio.h>
#include<stdlib.h>

int sum_divisors(int); //Function Prototype

/*Just wanted to do an example to show you don't need
 *function prototypes if you write the function itself
 *before main.
 */
int cycles(int x){
    static int count = 1;
    int j;
    if(x == sum_divisors(x)){
        printf("%d%13d Cycle(s) \n", x, count);
    }else{
        x = sum_divisors(x);
        count++;
        printf("%d, ",x);
        cycles(x);
    }
}

int main(void){ //Start of main
    int count = 0;
    int x, sum;
    int i = 0;
    int nums [9];

    puts("Please enter 10 integers. Fill up the rest with 0s. Please only type in numbers if not you might not get the output you want.");

    while(scanf("%d ", &x) != EOF){
        if(x > 100){
            puts("Wrong input");
            exit(1);
        }else{
            count++;
            nums[i] = x;
            ++i;
        }           

        if(i == 9){
            break;
        }
    }

    for(i=0; i<count; i++){
        sum = sum_divisors(nums[i]);
        printf("%d, ", nums[i]);
        cycles(nums[i]);
    }

    puts("");

    return 0;
} //end of main

int sum_divisors(int n){

    int i;
    int sum = 0;
    int prime_ind = 0;

    if(n <= 1){
        sum = 0;
        return sum;
    }

    for(i=2; i<n; i++){
        if(n%i == 0){
            prime_ind = 1;
            break;
        }
    }

    if(prime_ind == 0){
        sum = 1;
    }else{
        for(i=1; i<((n/2)+1); i++){
            if(n%i == 0){
                sum += i;
            }
        }
    }
    return sum;
}

【问题讨论】:

  • 您在此处访问索引越界 -nums[i] = x; 。查看if 块中的循环中断条件。
  • 您通过访问您的 nums 数组超出其边界来调用未定义的行为。

标签: c input output user-input increment


【解决方案1】:

我已经审查了您的计划。 你的问题出在函数中

 int cycles(int x){}

所以改成

int cycles(int x){
    static int count = 1;
    int j;
    if(x == sum_divisors(x)){
        printf("%d%13d Cycle(s) \n", x, count);
        count=1; // add this line 

    }else{
        x = sum_divisors(x);
        count++;
        printf("%d, ",x);
        cycles(x);
    }
}

这里的静态变量在调用 new cycle() 时没有初始化。

【讨论】:

  • 对费心弄清楚代码的用途并找到修复程序表示赞同。 ;-)
【解决方案2】:
int cycles(int x){
    static int count = 1;

像这样的静态变量将在该行的第一次执行时被初始化为给定值之后,它将在多个函数调用中保持其值,不仅是递归的,还有来自main() 的“新”调用。你只需保持增加count。它永远不会被重置为1

我认为这不是(完全)你想要的。真的很难说,因为你没有告诉我们你的函数实际上是打算做什么——既不是在问题中,也不是在 cmets 中。我不打算对这些信息进行逆向工程。

那时我也停止检查您的代码,因为static 很可能是您问题的核心。可能还有更多问题,例如 cmets 提示的越界访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 2013-05-11
    相关资源
    最近更新 更多