0

在课堂上,助教解释说 A[end+1] 比 A[end] 好,但我忘记了原因。有人可以帮助解释是否有必要,因为没有它该程序似乎可以正常工作。另外,如果您愿意帮助我为函数中的 ERROR 触发器返回 -1。在发生错误时,我没有为最终总和打印 -1 值,我具体添加了什么以及在哪里打印错误消息而不是 -1?

/* Progrm.c

   Author:

   Adds fibonacci terms from start to end inclusive.

*/

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

int f(int start, int end);

int main() {

    int start, end, response;
 do {   
    printf("Enter start\n");
    scanf("%d",&start);
    printf("\nEnter end\n");
    scanf("%d",&end);
    printf("\n%d\n",f(start,end));
    printf("\nWould you like to solve additional problems ? \n"
    "Please enter 1 for yes or 0 for no: ");
    scanf("%d", &response);
    } while ( response == 1 );

    system("pause");

    return 0;

}

int f(int start, int end) {
    if(start<=0||end<=0||start>end) {
      fprintf( stderr, "\nError - Input data is invalid. Please enter "
      "start: > 0, end: > 0, \nand start < end.\n");                             
      return -1;
    }
    int A[end+1],i;                      /*Can you replace A[end+1] with just A[end]*/ 
    A[1]=1;                              /*and not encounter problems?*/
    A[2]=1;
    for(i=3;i<=end;i++)
       A[i]=A[i-1]+A[i-2];
    int sum=0;
    for(i=start;i<=end;i++)
       sum+=A[i];
    return sum;
}
4

2 回答 2

0

回答你的第一个问题:

为什么 A[end+1] 比 A[end] 好?

这是因为您正在迭代直到结束并且数组索引从 0 开始。这意味着要容纳最多 'n' 的值,您必须将数组的大小设为 'n+1'。假设 n = 5,数组的大小为 5+1=6,5 表示 1 到 5 的索引,1 表示 0。
你的第二个问题:

你能用 A[end] 替换 A[end+1] 吗?

所以是的,我们可以通过改变函数 f() 中的代码来做到这一点,如下所示:

    if(start<=0||end<=0||start>end) {  
       fprintf( stderr, "\nError - Input data is invalid. Please enter "
       "start: > 0, end: > 0, \nand start < end.\n");                             
       return -1;
    }

    start = start -1;  // decrease the value of start and end by 1
    end = end - 1;
    int A[end],i;  // A[end+1] changed to A[end]                     
    A[0]=1;    // decreased index by 1                          
    A[1]=1;    // decreased index by 1 
    for(i=2;i<end;i++)   // changed loop iteration from 2 till i<end
       A[i]=A[i-1]+A[i-2];
    int sum=0;
    for(i=start;i<end;i++)   // changed loop iteration till i<end
       sum+=A[i];

你的另一个问题:

在发生错误时,我没有为最终总和打印 -1 值,我具体添加了什么以及在哪里打印错误消息而不是 -1?

要仅打印不 -1 的错误消息,您必须更改 do-while 循环中的代码,如下所示:

// take one int variable and get the result in this
int result =  f(start,end);
// print the sum, only if there is no error
if(result!= -1)
    printf("\n%d\n",result );
于 2013-10-31T05:27:04.870 回答
0

你的循环

for(i=3;i<=end;i++)
for(i=start;i<=end;i++)

两者都可以访问A[end]。如果您声明int A[end],那已经超过了数组的末尾并且您正在写入您不应该写入的内存(可能是i,但这是未定义的行为,所以所有的赌注都关闭了)。声明int A[end-1]意味着写入A[end]是有效的。

同样,您应该end在开始时检查至少 3 ,这样A[2]如果数组比这短,您就不会写入。

于 2013-10-31T04:28:54.347 回答