帮我看看这串代码

zy47154683 2013-04-27 10:17:34
#include <stdio.h>
void main()
{
int a[5][5]={{2,1,2,1,1},{3,2,1,2,1},{0,2,1,2,1},
{1,2,3,4,1},{1,2,2,2,1}};/*定义一个5*5的房间,里面装满金币*/
int sum=2,m=0,k=0; /*站在第一个房间得到2个金币*/
while((m<5)&&(k<5)) /*走到最下面或者最后面停下*/
{
if (a[k+1][m]>a[k][m+1])/*只能朝下和朝右走*/
{
sum=sum+a[k+1][m]; /*2 1 2 1 1*/
printf("go m:%d\t",a[k+1][m]); /*3 2 1 2 1*/
k++; /*0 2 1 2 1*/
/*1 2 3 4 1*?
} /*1 2 2 2 1*/
else
{sum=sum+a[k][m+1];
printf("go k:%d\t",a[k][m+1 ); /*选择金币多的房间走*/
m++;}

printf("%d\n",sum); /*打印得到多少金币*/
}
getch();
}
这样的一个程序,输出是:go:3 sum=5
go:2 sum=7
go:2 sum=9
go:2 sum=11
go:3 sum=14
go:4 sum=18
go:2 sum=20
go:4198946 sum=4198966
我怎么想不出来最一个go:4198946 sum=4198966 是怎么出现的呢? 是哪里出错了,这个代码可以精简吗?
...全文
86 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
buyong 2013-04-28
  • 打赏
  • 举报
回复
step by step debug is needed
赵4老师 2013-04-28
  • 打赏
  • 举报
回复
不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) { if (条件1) break; //... if (条件2) continue; //... if (条件3) return; //... } 因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。 典型如: 下面两段的语义都是当文件未结束时读字符 whlie (!feof(f)) { a=fgetc(f); //... b=fgetc(f);//可能此时已经feof了! //... } 而这样写就没有问题: whlie (1) { a=fgetc(f); if (feof(f)) break; //... b=fgetc(f); if (feof(f)) break; //... } 类似的例子还可以举很多。
ForestDB 2013-04-28
  • 打赏
  • 举报
回复
if和while不是函数,是语句,基础打好,走得更远。
zy47154683 2013-04-28
  • 打赏
  • 举报
回复
引用 3 楼 hugett 的回复:
不能只判断m<5&&k<5。。。这样下边的m+1或k+1可能会大于等于5的。。会造成数组越界。。就乱了。。

#include <stdio.h>

void main()
{
	int a[5][5]={{2,1,2,1,1},{3,2,1,2,1},{0,2,1,2,1},
				{1,2,3,4,1},{1,2,2,2,1}};/*定义一个5*5的房间,里面装满金币*/
	int sum=2,m=0,k=0;               /*站在第一个房间得到2个金币*/
	while(1)             /*走到最下面或者最后面停下*/
	{
		if(m == 4 && k == 4) break;//无路可走了。。
		if(m == 4 || k + 1 < 5 && a[k+1][m] > a[k][m+1])/*只能朝下和朝右走*/
		{
			sum=sum+a[k+1][m];                  /*2  1  2  1  1*/
			printf("go m:%d\t",a[k+1][m]);      /*3  2  1  2  1*/
			k++;                                /*0  2  1  2  1*/
											    /*1  2  3  4  1*/
		}                                       /*1  2  2  2  1*/
		else
		{
			sum=sum+a[k][m+1];
			printf("go k:%d\t",a[k][m+1]);    /*选择金币多的房间走*/
			m++;
		}
		printf("%d\n",sum);              /*打印得到多少金币*/
	}
}
明白了,为什么你们都习惯用if函数 while不是很方便吗?
hugett 2013-04-27
  • 打赏
  • 举报
回复
不能只判断m<5&&k<5。。。这样下边的m+1或k+1可能会大于等于5的。。会造成数组越界。。就乱了。。

#include <stdio.h>

void main()
{
	int a[5][5]={{2,1,2,1,1},{3,2,1,2,1},{0,2,1,2,1},
				{1,2,3,4,1},{1,2,2,2,1}};/*定义一个5*5的房间,里面装满金币*/
	int sum=2,m=0,k=0;               /*站在第一个房间得到2个金币*/
	while(1)             /*走到最下面或者最后面停下*/
	{
		if(m == 4 && k == 4) break;//无路可走了。。
		if(m == 4 || k + 1 < 5 && a[k+1][m] > a[k][m+1])/*只能朝下和朝右走*/
		{
			sum=sum+a[k+1][m];                  /*2  1  2  1  1*/
			printf("go m:%d\t",a[k+1][m]);      /*3  2  1  2  1*/
			k++;                                /*0  2  1  2  1*/
											    /*1  2  3  4  1*/
		}                                       /*1  2  2  2  1*/
		else
		{
			sum=sum+a[k][m+1];
			printf("go k:%d\t",a[k][m+1]);    /*选择金币多的房间走*/
			m++;
		}
		printf("%d\n",sum);              /*打印得到多少金币*/
	}
}
fox_carnival 2013-04-27
  • 打赏
  • 举报
回复
while((m<5)&&(k<5))//m和k最大值为4 后面的 a[k+1][m]、a[k][m+1]会造成数组越界
zy47154683 2013-04-27
  • 打赏
  • 举报
回复
/*2 1 2 1 1*/ /*3 2 1 2 1*/ /*0 2 1 2 1*/ /*1 2 3 4 1*? /*1 2 2 2 1*/ 注释没对齐。。。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧