这是我的代码......我是初学者,感谢任何反馈。我试图解决的问题是将pascal三角形打印到用户推算的行。
public class Pascal111 {
int max;
int r,c;
public int pascal(int maxm){
max=maxm;
for(int r=0; r<max; r++){
for (int c=0; c<r; c++){
populate();}
}
return max;
}
public void populate(){
int[][] array=new int[max][max];
if (r==0){
array[0][0]=1;
}
else if(c==0){
array[0][0]=1;
}
else if(c==r){
array[r][c]=1;;
}
else
array[r][c]=(array[r-1]+array[c-1]+array[r-1]+array[c]);
}
}
我收到以下错误....
Error: bad operand types for binary operator '+'
first type: int[]
second type: int[]
答案 0 :(得分:1)
array[r][c]=(array[r-1]+array[c-1]+array[r-1]+array[c]);
错了。
array
是一个二维数组,因此array[X]
表示一个完整的行(一维数组)。你不能对1-D数组进行二进制操作,而是将它放在单个元素array[r][c]
上。
而是用
替换它array[r][c]=(array[r-1][c-1]+array[r-1][c]);
答案 1 :(得分:1)
虽然我没有密切关注这一点,但有一个错误突出:你有两个不同的名为r
的变量和两个名为c
的不同变量。
以下是代码的相关部分:
public class Pascal111 {
int r,c; // (A)
public int pascal(int maxm) {
for (int r=0; r<max; r++){ // (B)
for (int c=0; c<r; c++){ // (B)
populate();
}
}
return max;
}
public void populate() {
if (r==0) {
... more code that accesses r and c
}
}
(A)处的声明声明实例变量,因为声明不在方法内部。这意味着无论何时创建Pascal111
对象,此对象都将包含名为r
和c
的字段。它们被初始化为0。
(B)的声明,因为它们上有int
个关键字,声明了新的变量。这些变量是pascal
方法的本地变量,这意味着只能在该方法内访问它们。 (实际上,只能在for
循环内访问它们。)这些变量与实例变量有 no 连接。它们是完全分开的。当您递增这些本地r
和c
变量时,实例变量保持不变。也就是说,他们仍然是0.
populate
方法无法访问pascal
中声明的局部变量。因此,当populate
引用r
和c
时,它们指的是实例变量。这些不在循环中增加的变量,而是保持为0的实例变量。
解决此问题的一种方法是删除(B)中声明的int
;这将导致pascal
增加实例变量,然后populate
将使用这些变量。 然而,这是错误的做法。
解决这些问题的最佳方法是不使用实例变量在pascal
和populate
之间进行通信 - 而是使用参数。那就是:
for (int r=0; r<max; r++){ // (B)
for (int c=0; c<r; c++){ // (B)
populate(r, c);
}
}
以后:
public void populate(int r, int c) {
然后,当populate
引用r
和c
时,它将引用参数,这些参数实际上是局部变量。参数将来自r
的{{1}}和c
。 (但是,您不必为pascal
变量和pascal
参数使用相同的名称。)执行此操作后,您将发现实例变量不再存在需要的。无论如何,将实例变量用作循环索引总是或几乎总是错误的。
类似的错误:您在populate
内有array
作为局部变量。这意味着每次调用它以设置一个数组元素时,您都会创建一个全新的数组。然后,当populate
返回时,无法再访问populate
,因此您所做的任何工作都将丢失。