编程小错误总结帖(时常更新)
2014-11-10 09:52
162 查看
一个月以来犯错较多且难以发现错误的:
1,循环体内i,j,k.混用:
for example:
或者在循环体中不小心改变了循环变量的值等等。
2,更新多个变量犯错。
3,处理字符串时,忽略在结尾处添加'\0'
3.2处理字符串中“数字”时,没有减去'0',或只考虑一位数的情况。
4,类型定义错误。
5,数组越界,运行时未报错。
6,边界错误。
如,求a以内连续奇数素数对的个数。(如3,5)
7,没有注意递归出口
注意上述代码在root=0时会无限执行preorder(tree[root].left);
应该为:
另外,树里递归出口很多都是if(root==0)。
比如,求树的高度
8,在条件中的"++"运算符
我这里本来是想判定从str开始到p结束(不包括p)的字符,显然起始位没判断,又多判断了p位.
应该是下面这样:
9,递归出口错误。如DFS想在res为true时推出循环,
应该为下面:
1,循环体内i,j,k.混用:
for example:
for(i=0;i<n;i++){ for(i=0;i<m;i++){ //statement; } }或:
for(i=0;i<n;i++){ for(j=0;j<m;i++){ //statement; } }
或者在循环体中不小心改变了循环变量的值等等。
2,更新多个变量犯错。
int func(int x,int y); //ues func() to update p,q; int p,q; p=func(p,q); q=func(p,q);//note the p has been changed
3,处理字符串时,忽略在结尾处添加'\0'
3.2处理字符串中“数字”时,没有减去'0',或只考虑一位数的情况。
int len=strlen(str); int temp=0; for(j=5;j<len;j++){ <pre name="code" class="cpp">temp=temp*10+str[j]//should be :temp=temp*10+str[j]-'0';}S[top]=temp;//S[top]=str[5]-'0'只考虑了一位情况
4,类型定义错误。
//int instead of char int m[50]; scanf("%s",m); printf(m); //or char instead of int; char n[50]; if(statement){ n++; }
5,数组越界,运行时未报错。
//这个最后居然把x.size置为0了。。 struct bigint{ int digit[200]; int size; }; void func(bigint x){ int i; for(i=0;i<201;i++){ x.digit[i]=0; } }
6,边界错误。
如,求a以内连续奇数素数对的个数。(如3,5)
for(i=2;i<a;i++) if(isPrime(i) && isPrime(i+2)) count++;以上虽然i<a,但是却在循环中出现了i+2.
7,没有注意递归出口
void preorder(int root){ if(root!=0) printf("%d ",tree[root].x); preorder(tree[root].left); preorder(tree[root].right); }
注意上述代码在root=0时会无限执行preorder(tree[root].left);
应该为:
void preorder(int root){ if(root==0) return; printf("%d ",tree[root].x); preorder(tree[root].left); preorder(tree[root].right); }
另外,树里递归出口很多都是if(root==0)。
比如,求树的高度
int height(int root){ if(root==0)return 0; int lefth=0,righth=0; lefth=height(tree[root].left); righth=height(tree[root].right); tree[root].h=max(lefth,righth)+1; tree[root].delth=lefth-righth;//高度差 return tree[root].h; }
8,在条件中的"++"运算符
while(str++<p){ if(str[0]!='A'){ puts("1"); printf("a,b,c,%d,%d,%d\n",a,b,c); return false; } a++; }注意在循环中用到了str[0],但是此时的str已经不再是循环判定中的str了,是自增之后的str;
我这里本来是想判定从str开始到p结束(不包括p)的字符,显然起始位没判断,又多判断了p位.
应该是下面这样:
while(str<p){ if(str[0]!='A'){ puts("1"); printf("a,b,c,%d,%d,%d\n",a,b,c); return false; } str++; a++; }
9,递归出口错误。如DFS想在res为true时推出循环,
应该为下面:
//DFS,注意递归出口是从某鳄鱼可以跳到陆地 bool DFS(int x){ //DFS递归出口易错 bool res=false; int i; visited[x]=true; if(issaved(point[x])){ return true; } for(i=0;i<number;i++){ if(!visited[i]&&dist(point[x],point[i])<=step){ //绝对不可以写 //return DFS(i); //相当于for(i=0;i<n;i++)return i; //除了i为0时会return出来,其他的不会return //事实上出口是return true。当res为false时,还要继续 res=DFS(i); if(res)return true; } } return false; }以及BFS易错点:。。。
//注意两个visited[]位置。 //一开始我只写一个visited,在print后,也就是打印相当于访问 //如下 /* void BFS(int x){ while(!Q.empty())Q.pop(); Q.push(x); int i; while(!Q.empty()){ int t=Q.front(); Q.pop(); printf(" %d",t); visited[i]=true;//这样在打印前可能入队列很多次。。。。 //建议可以在打印前判断是否是访问过。只不过会浪费一些队列位置 for(i=0;i<n;i++){ if(!visited[i] && map[i][t]==1){ //printf("\nt,i:%d,%d",t,i); Q.push(i); } } } } */ void BFS(int x){ while(!Q.empty())Q.pop(); Q.push(x); int i; visited[x]=true;/// while(!Q.empty()){ int t=Q.front(); Q.pop(); printf(" %d",t); for(i=0;i<n;i++){ if(!visited[i] && map[i][t]==1){ //printf("\nt,i:%d,%d",t,i); Q.push(i); visited[i]=true; } } } }
相关文章推荐
- MFC编程中的常犯的错误和心得总结(不断更新中)
- 错误信息总结 (更新中)
- 调试经验总结-VC下的错误对话框(陆续更新5.5.2008)
- Qt之网络编程错误总结
- VC++----编译错误总结(不断更新)
- PHP错误总结-不断更新(新手必看)
- [转]程序员编程艺术第一~十章集锦与总结(教你如何编程)--持续更新中
- Linux 编程总结(不断更新)
- ClickOnce,无法在证书存储区中找到清单签名证书的错误提示,应用程序自动更新的方法总结。
- winpcap里面VS编程错误总结
- JavaEE编程中错误信息解决方法( 持续更新)
- ClickOnce,无法在证书存储区中找到清单签名证书的错误提示,应用程序自动更新的方法总结。
- struts2 错误总结 自己会不断更新中。。。。。
- Linux 编程总结(不断更新)
- 函数错误处理二(总结自己windows编程核心)
- 程序员编程艺术第一~十章集锦与总结(教你如何编程)--持续更新中
- 函数错误处理一(总结自windows编程核心)
- SSH错误总结(不断更新中.......)
- android编程错误总结系列1 —— failed to pull a selection
- Linux C 编程错误总结