1

printf と scanf を使用して行った、フィボナッチ数列の n 番目の数を計算するプログラムを作成したいと考えています。しかし、プログラムによってプロンプトが表示されたときにシーケンス番号を入力するのではなく、コマンドラインでシーケンス番号を入力するようにプログラムを変更したいと考えていました。これが私が思いついたものです。コンパイルはしますが、実行するとクラッシュします...理由はわかりません。任意の提案をいただければ幸いです。

これは、反復を使用してフィボナッチ コードの n 番目の数を計算するプログラムです。私は次のように書いています: コマンドライン argv[1] で、計算したいシーケンスの番号を入力する必要があります。次に、プログラムはこのコマンド ライン引数を取得して while ループで使用し、この番号も出力します。

#include <stdio.h>


int main( int argc, char**argv ) {
int fib[3] = {0,1};
int counter = 0;
  printf("The %dth Fibonacci number is:\n", atoi(argv[1]));
while ( counter < atoi(argv[1]) ) {

    fib[2] = fib[0] + fib[1];
    fib[0] = fib[1];
    fib[1] = fib[2];
    counter++;
}
printf("%d\n", fib[0]);
getchar();
  return 0;
}
4

5 に答える 5

4

ユーザーが実際に引数を渡したかどうかを確認します。

int main( int argc, char**argv ) {
    if (argc < 2) {
        printf("Usage: %s number\n", argv[0]);
        return 1;
    }
    ...
}

彼がそうしなかった場合、argv[1]null になり、クラッシュします

于 2011-03-15T16:33:51.030 に答える
3

プログラムは、コマンド ライン引数が存在するかどうかを確認する必要があります。

if (argc < 2)
{
    printf ("usage:  %s n\n  where n is a positive integer\n", argv[0]);
    return 1;
}

引数が指定されていない場合、おそらくクラッシュします。

= = = = = 編集 = = = = =

上記のバグが修正されると、クラッシュの原因はわかりません。これは問題なく動作します:

#include <stdio.h>
int main( int argc, char**argv )
{
        int fib[3] = {0,1};
        int counter = 0;
        if (argc < 2)
        {
                printf ("usage: %s number\n", argv[0]);
                return 1;
        }

        printf("The %dth Fibonacci number is:\n", atoi(argv[1]));
        while ( counter < atoi(argv[1]) )
        {

                fib[2] = fib[0] + fib[1];
                fib[0] = fib[1];
                fib[1] = fib[2];
                counter++;
        }
        printf("%d\n", fib[0]);
        return 0;
}


[wally@zenetfedora ~]$ ./a.out 
usage: ./a.out number
[wally@zenetfedora ~]$ ./a.out 3
The 3th Fibonacci number is:
2
[wally@zenetfedora ~]$ ./a.out 4
The 4th Fibonacci number is:
3
[wally@zenetfedora ~]$ ./a.out 5
The 5th Fibonacci number is:
5
[wally@zenetfedora ~]$ ./a.out 6
The 6th Fibonacci number is:
8
[wally@zenetfedora ~]$ ./a.out 7
The 7th Fibonacci number is:
13
[wally@zenetfedora ~]$ ./a.out 8
The 8th Fibonacci number is:
21
[wally@zenetfedora ~]$ ./a.out 9
The 9th Fibonacci number is:
34
[wally@zenetfedora ~]$ ./a.out 10
The 10th Fibonacci number is:
55
于 2011-03-15T16:34:00.917 に答える
0

何番でテストしましたか?int は 50 番目のフィボナッチ数よりも大きい値を保持できないためです。私はアルゴリズムクラスでこのようなことをしなければなりませんでした.239番目のフィボナッチ数を見つけなければなりませんでした64202014863723094126901777428873111802307548623680 .これはintでもlongでも正しく保持できるものです.大きなフィボナッチ数を見つける必要がある場合。

于 2011-03-15T16:42:15.193 に答える
0
#include<stdio.h>

#include<stdlib.h>

int main(int c,char *v[])

{

int *numberOfTerms;

int x,y,z,i,count;

if(c==1)

{

printf("provide number of terms as command line argument");

return 0;

}

numberOfTerms=(int *)malloc(sizeof(int));

*numberOfTerms=atoi(v[1]);

x=0;

y=1;

if(*numberOfTerms==0) return 0;

if(*numberOfTerms<=2)

{

for(i=0;i<*numberOfTerms;i++) printf("%d\n",i);

return 0;

}

printf("%d\n",x);

printf("%d\n",y);

count=2;

while(count<*numberOfTerms)

{

z=x+y;

printf("%d\n",z);

x=y;

y=z;

count++;

}

}
于 2014-08-10T04:24:10.390 に答える