1. 程式人生 > >J - 下落的樹葉 ( 輸入函式要有返回值!)

J - 下落的樹葉 ( 輸入函式要有返回值!)

題目見紫書p161

re,一直re,re到懷疑人生

剛開始出現re的時候懷疑是陣列開的不夠大

但一直都修改不行

 

結果是,  , , ,輸入函式bool函式沒加返回值 return true;

所以re時 ,可能

①除以零 

②陣列越界:int a[3]; a[10000000]=10;

③指標越界:int * p; p=(int *)malloc(5 * sizeof(int)); *(p+1000000)=10;(特別是空指標!)

④使用已經釋放的空間:int * p; p=(int *)malloc(5 * sizeof(int));free(p); *p=10;

⑤陣列(在函式內)開得太大,超出了棧的範圍,造成棧溢位:int a[100000000];

再加一項 圈6 非void的函式沒有返回值(特別是bool)

#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;

int p[1000];
int lmax=500,rmax=500;
bool sum(int u,int lp){
    int r,l;
    p[lp]+=u;    
    scanf("%d",&l);
    if(l!=-1)sum(l,lp-1
); scanf("%d",&r); if(r!=-1)sum(r,lp+1); if(lp<lmax)lmax=lp; if(lp>rmax)rmax=lp; return true; //<---就是這裡!!!要加的 } int main(){ int root,j=1; memset(p,0,sizeof(p)); while(j){ lmax=500;rmax=500; scanf("%d",&root); if(root==-1)break; sum(root,500); printf(
"Case %d:\n",j++); for(int i=lmax;i<=rmax;i++) if(i==lmax) printf("%d",p[i]); else printf(" %d",p[i]); printf("\n\n"); memset(p,0,sizeof(p)); } return 0; }