2011-05-08 49 views
1
#include <iostream> 

int* fib(int); 

int main() 
{ 
    int count; 
    std::cout<<"enter number up to which fibonacci series is to be printed"<<std::endl; 
    std::cin>>count; 
    int *p=new int[count]; 
    p=fib(count); 
    int i; 
    for(i<0;i<=count;i++) 
     std::cout<<p[i]<<std::endl; 
    return 0; 
} 

int* fib(int d) 
{ 
    int *ar=new int[d]; 
    int p=-1,q=1,r; 
    int j; 
    for(j=0;j<=d;j++) 
    { 
     r=p+q; 
     ar[j]=r; 
     p=q; 
     q=r; 
    } 
    return ar; 
    delete ar; 
} 

爲什麼我不能用這種方式打印整個Fibonacci系列數組?如何從函數返回一個數組並循環遍歷它?

+1

你看到的問題是什麼?編譯器錯誤?如果是這樣,哪些?意外的結果?如果是這樣,你期望得到什麼結果,你會得到什麼? – sth 2011-05-08 11:04:53

+0

好吧,從哪裏開始...首先,它是什麼意思「不能」 - 會發生什麼?另外,在你的代碼中有一些問題:1)你不需要在main中分配數組 - 當你立即覆蓋指針時它會導致內存泄漏; 2)'fib()'中的delete ar'語句永遠不會執行,因爲它是在返回後執行的,但是如果它丟失了剛剛計算的數據的位置 – davka 2011-05-08 11:08:32

+0

沒有錯誤,但是我沒有得到該系列。你可以在你的編譯器上檢查它嗎?我正在使用gcc。 – 2011-05-08 11:17:50

回答

4

與您的代碼的幾個問題

for(i<0;i<=count;i++) 

實際上應該是

for(i=0;i<count;i++) 

for(j=0;j<=d;j++) 

必須閱讀

for(j=0;j<d;j++) 

並刪除行

delete ar; 

,因爲它不具備return語句後有任何影響。此外,您可以在main(),因爲這是你fib功能也做擺脫實例

int *p=new int[count]; 

的。就目前而言,你泄露了你剛剛分配的內存。

+0

OP希望fib(n)不是fib(n-1) – 2011-05-08 11:10:39

+0

@大衛,這可以討論。我不能從問題規範中讀出這個問題;-)它給出了以0,1開頭的第一個「n」數字。因此它全部取決於'fib(n)'的定義。 – Howard 2011-05-08 11:14:09

+0

只要n + 1個元素被分配,循環都很好 – 2011-05-08 11:15:42

0

一個問題是,您分配數組的一個元素太短。 new[]中的參數是元素的個數,不是的最高索引。

另一個問題是,你在兩個地方分配數組,但只會產生內存泄漏,不會影響結果。

+0

這個question.how做可以擴展該程序打印兩個數字之間的斐波納契數列?請給一些想法 – 2011-05-08 11:35:05

1

您正在分配的元素太少。您刪除ar的代碼永遠不會運行,因爲它會在返回之後運行。您還會泄漏p,因爲您會用fib()返回的指針覆蓋指針。

如果我是你,我可能會通過pfib()並獲得fib()來填寫數組。

void fib(int n, int p[]) 
{ 
    p[0] = 1; 
    p[1] = 1; 
    for (int i=2; i<=n; i++) 
     p[i] = p[i-2]+p[i-1]; 
} 

顯然,這種代碼需要n>=2但我會離開錯誤檢查作爲練習讀者!

要調用它使用這樣的代碼:

int p[] = new int[count]; 
fib(count, p); 

如果你想I1和I2之間打印出的價值觀,比如說,像這樣做:

for (int i=i1, i<=i2, i++) 
    std::cout<<p[i]<<std::endl; 

由於您使用C++ ,所有這些代碼在C++矢量類中都會更簡單。

2

你的我沒有初始化。而不是讓它i = 0,你做我< 0.而在j循環中,最大數量應該是d。所以j < d。不是j < = d。

+0

這個question.how做可以擴展該程序打印兩個數字之間的斐波納契數列?請給出一些想法 – 2011-05-08 11:33:58

0

首先,您不必在主內部分配int *p=new int[count];,因爲您將從fib函數接收指向已分配內存的指針。

其次,return聲明後面的所有內容都是無法訪問的代碼,因此您可以將其刪除或在return之前將其移動。

此外,如果你刪除裏面fib功能陣列,將返回一個空指針。

和主要問題是:

for(i<0;i<=count;i++) 

其中正確的是:

for(i = 0; i <= count; i++) 
+0

完成這個問題,我可以擴展這個程序打印兩個數字之間的斐波那契數列?請給出一些想法 - – 2011-05-08 11:32:48

+0

您必須計算該系列,直到你達到第一個數字,然後繼續計算,這一次也將值存儲在數組中,直到達到第二個數字。作爲一個系列,你不能以一個隨機數字開頭(或者你需要2個開始數字) – 2011-05-08 11:56:58

1

的問題正是在這裏:

int i; 
for(i<0;i<=count;i++) 
    std::cout<<p[i]<<std::endl; 

您還沒有分配我任何啓動值。它更改爲:

for (int i = 0; i < count; i++) 
    std::cout << p[i] << std::endl; 
+0

謝謝..對所有的 – 2011-05-08 11:19:11

+0

如何擴展這個程序來打印兩個數字之間的斐波那契數列?請給出一些想法 – 2011-05-08 11:28:20

1

這裏是斐波納契數列的一個例子,並且我開始礦了與一個[0] = 1和a [1] = 1斐波納契數列normaly開始與0和1,但將礦啓動1和1

的#include 「stdafx.h中」 #include <iostream>

使用命名空間std;

int main() 
{ 
    int a[25]; 
    int i,j; 
    int fib[25]; 
    int fibs; 
    char z; 

    a[0] = 1; 
    a[1] = 1; 


     fib[1] = a[0]; 
     fib[2] = a[1]; 
     fibs = 0; 

    for (i=2; i<25; i++) 
    { 
     fibs = fib[1] + fib[2]; 
     fib[1] = fib[2]; 
     fib[2] = fibs; 
     a[i] = fibs; 
    } 

    for(i=0; i<25; i++) 
    { 
     cout << "a[" << i << "]=" << a[i] << endl; 
    } 
相關問題