2011-05-08 87 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; 
    }