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

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

++ \n sizeof ase 數組 ret print void bool

題目見紫書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; }

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