代码如下:
for (int i=0;i<8;i++)
for(int j=0;j<8;j++)
{
char c=' ';
System.out.println("INPUT:");
try{
c=(char)System.in.read();
}catch(IOException e){}
if(c=='1')
{
System.out.print(OK!);
}
else
j--;
}编译运行时,第一次出现一次INPUT,输入一个字符后出现三个INPUT,为什么?
for (int i=0;i<8;i++)
for(int j=0;j<8;j++)
{
char c=' ';
System.out.println("INPUT:");
try{
c=(char)System.in.read();
}catch(IOException e){}
if(c=='1')
{
System.out.print(OK!);
}
else
j--;
}编译运行时,第一次出现一次INPUT,输入一个字符后出现三个INPUT,为什么?
public static void main(String[] args) {
for (int i=0;i <8;i++)
for(int j=0;j <8;j++)
{
char c= ' ';
System.out.println("INPUT:"); a
try{
c=(char)System.in.read(); b
}catch(IOException e){}
if(c== '1')
{
System.out.print("OK!"); c
}else
j--; //感觉这个地方是写错了吧
}
}函数执行到a时,首先输出了INPUT,然后接受键盘输入,接下来的处理过程是:
1.假设我们输入的字符是 2,肯定还有一个enter;实际上是两个键,程序运行如下:
1.1 读入'2',此时输出一个 INPUT ;
1.2 读入enter,此时输出一个 INPUT;
1.3 执行循环到b处,等待输入,此过程又输出一个 INPUT;
程序结果是三个 INPUT
2.假设我们输入的字符是 1,也要有enter;仍旧是两个键,程序运行如下:
2.1 读入'1',此时输出一个 INPUT ;
2.2 判定是'1',输出一个 OK!;
2.3 读入enter,此时输出一个 INPUT;
2.4 执行循环到b处,等待输入,此过程又输出一个 INPUT;
程序结果是三个 OK! INPUT: INPUT: INPUT:
3.假设输入enter;是一个键,程序运行如下:
3.1 读入enter,此时输出一个 INPUT;
3.2 执行循环到b处,等待输入,此过程输出一个 INPUT;
程序结果是 INPUT: INPUT: lz不清楚问题的所在就是对IO上概念不够清晰,我也遇到过类似的问题,希望能对你有所帮助。
ps:我是菜鸟,共同学习
1、运行程序显示一个INPUT,等待输入。现在程序到b点了。
2、案回车键,接收一个按键“回车”(回车的ASCII码是13)。
3、程序到a点时输出INPUT.
4、程序到b点等待输入。
这样我的理论输出结果是:
INPUT:INPUT:
实际运行结果是:
INPUT:INPUT:
INPUT:
为什么?
public abstract int read()
throws IOException从输入流读取下一个数据字节。返回 0 到 255 范围内的 int 字节值。
1.如果因已到达流末尾而没有可用的字节,则返回值 -1。在输入数据可用、检测到流的末尾或者抛出异常前,此方法一直阻塞。
在我们按下Enter的时候,实际上发送的两个键值:一个回车(13),一个是换行(10);
所以在执行的时候就会有两个输出水平不高,记得不牢,不好意思啊,呵呵
INPUT:
1
OK!INPUT: -------A
INPUT: -------B
INPUT: -------C输入1,成功读到1,所以打印出OK
AInput读到的是\r,所以继续循环
BInput读到的是\n,继续循环
CInput停止不动,等待键盘输入。
这个程序没什么意思呀。
INPUT:
1
OK!INPUT: -------A
INPUT: -------B
INPUT: -------C输入1,成功读到1,所以打印出OK
AInput读到的是\r,所以继续循环
BInput读到的是\n,继续循环
CInput停止不动,等待键盘输入。
这个程序没什么意思呀。
不过可以更好的了解System.in.read()。也许以后作项目时能用上,知识是一点点积累地。
我解释一下:我是想写一段代码来输入一定量特定的(如0,1,2)的字符,所以有 "esle j--;"
看到你们讲的后,
把代码改成:
String c="";
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
{
System.out.println("INPUT");
c=in.readLine();
if(c=="1")
{
System.out.println("OK!");
}
else
j--;
}
编译运行时,却没有"OK!"了。现在还没找到原因。
改成如下:
String c="";
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
{
System.out.println("INPUT");
c=in.readLine();
System.out.println("i="+i+"/tj="+j);
if(c=="1")
{
System.out.println("OK!");
}
else
j--;
}
来测试i和j的值,发现两者都为0,没有变。
为什么?
附:
在windows下按下ENTER键,有两个值(/r/n),在unix/linux下只有一个值(/n);
没记错的话是那样的,不信把%JAVA_HOME%/jdk1.5.0_04/下的scr.zip解压缩,
用记事本打开任一个java文件,会发现有很多的小黑方块。
不好意思,新手。
第一个问题的要点在于:对于字符串的比较不要用'=='操作符,而要用equals(),方法,代码如下:
String c="";
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
for(int i=0;i <8;i++)
for(int j=0;j <8;j++)
{
System.out.println("INPUT");
try {
c=in.readLine();
} catch (IOException e) {
e.printStackTrace();
}
if(c.equals("1"))
{
System.out.println("OK!");
}
else
System.out.println("after");
j--;
}
至于第二个问题的要点在于,循环语句的执行顺序,按照你的写法,程序的内部循环执行如下:
首先,j--; 然后在循环控制语句中进行 j++ ;结果就是 j == j == 初始值 0 ,这是个死循环,永远不会结束
for(int j=0;j <8;j++)
{
char c= ' ';
System.out.println("INPUT:");
try{
c=(char)System.in.read(); //A
}catch(IOException e){}
if(c== '1 ')
{
System.out.print(OK!);
}
else
j--;
}
第一次程序执行到A处时 输入一个字符并按下回车键。
分析这次输入,真正输入输入流的数据是字符和代表回车键的两个字符。
当下一次程序执行到A处时,输入流中仍然有数据,故赋给C,显示在控制台上是空格(代表回车键的第一个自符)。
程序继续执行下一循环,输入流中仍然有数据,故赋给C,显示在控制台上是空格(代表回车键的第二个自符)。
程序继续执行下一循环,此时输入流中无字符,故等待输入,所以第一次出现一次INPUT,输入一个字符后出现三个INPUT。
正在完成一个离散数学的作业,判断一个集合中元素之间的二元关系。
全部代码如下:
import java.io.*;public class work
{
private byte [][]A; //定义一个数组来保存集合A中的关系
private int number; //集合A中元素的个数
private static final int NO=0; //没有关系
private static final int ZI_FAN=1; //自反性
private static final int FAN_ZI_FAN=2; //反自反性
private static final int DUI_CHEN=3; //对称性
private static final int FAN_DUI_CHEN=4; //反对称性
private static final int CHUAN_DI=5; //传递性 public work() throws IOException //work的构造方法,在此要求一个一个地输入关系
{
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));//字符串缓冲区
String str; //存放输入的字符串
int n; //存放输入的数字
System.out.print("请输入A中元素的个数:");
str=reader.readLine(); //输入数字的字符串
try
{
n=Integer.parseInt(str);//将字符串转化为数字
}
catch(NumberFormatException e) //字符串输入不是数字时,n默认是3
{
n=3;
}
if(n<=0) //当输入的数字是非正数时,n默认是3
n=3;
number=n;
A=new byte[number][number];
System.out.println("A中共有"+number+"个元素."); //由于可能出现上面出现的错误,提醒一下A中元素的个数
for(int i=0;i<number;i++)
for(int j=0;j<number;j++)
{
System.out.print("第"+(i+1)+"个元素和第"+(j+1)+"个元素的关系[0-无,1-有]:");
str=reader.readLine();
if(str.equals("0"))
A[i][j]=0;
else if(str.equals("1")
A[i][j]=1;
else j--; //当输入的不是0,1时,j减少1。这样,下一个循环时j不变
}
}
public int ifZiFan() //判断自反性
{
int sign=0; //存放性质
int i; //循环个数
if(A[0][0]==0)
sign=FAN_ZI_FAN; //当第一个元素与第一个元素没有关系时,是反自反的
else if(A[0][0]==1)
sign=ZI_FAN; //同理,自反的
for(i=1;i<number;i++)
{
if(A[i][i]!=A[0][0])
break; //当一下斜行中有不同的关系时跳出循环
}
if(i<number)
return NO; //没有自反性或反自反性
else return sign; //只有完全执行完循环,才有反自反性或自反性
} public int ifDuiChen() //判断对称性
{
int i,j;
int duiChen=0,fanDuiChen=0; //记录对称与反对称的个数
for(i=0;i<number;i++)
for(j=0;j<number;j++)
{
if((A[i][j]==1)&&(A[j][i]==1))
duiChen++; //当第i个元素与第j个元素有关系且第j个元素与第i个元素有关系时
else if((A[i][j]==1)&&(A[j][i]==0))
fanDuiChen++; //当第i个元素与第j个元素与第j个元素与第i个元素不同时有关系时
}
if(duiChen>0&&fanDuiChen>0)
return NO;
else if(duiChen>0&&fanDuiChen==0)
return DUI_CHEN;
else return FAN_DUI_CHEN;
}
public int ifChuanDi() //判断传递性,这个方法还有问题,不能正确的判断,修改中... ...
{
for(int i=0;i<number;i++)
{
for(int j=0;j<number;j++)
{
if(j==i)
continue;
else if(A[i][j]==1)
for(int k=0;k<number;k++)
{
if(k==j)
continue;
else if(A[j][k]==1)
if(A[i][k]!=1)
return NO;
}
}
}
return CHUAN_DI;
}
public void display()
{
for(int i=0;i<number;i++)
{
for(int j=0;j<number;j++)
{
System.out.print(A[i][j]);
}
System.out.println("");
}
}
public static void main(String[] args) throws IOException
{
work a=new work();
a.display();
int sign=0;
sign=a.ifChuanDi();
if(sign==NO)
System.out.println("A没有传递性.");
else if(sign==CHUAN_DI)
System.out.println("A有传递性.");
sign=a.ifDuiChen();
if(sign==NO)
System.out.println("A既不对称也不反对称.");
else if(sign==DUI_CHEN)
System.out.println("A有对称性.");
else if(sign==FAN_DUI_CHEN)
System.out.println("A有反对称性.");
sign=a.ifZiFan();
if(sign==NO)
System.out.println("A既不自反也不反自反.");
else if(sign==ZI_FAN)
System.out.println("A有自反性.");
else if(sign==FAN_ZI_FAN)
System.out.println("A有反自反性.");
}
}
public int ifChuanDi()
//判断传递性,先检测两个元素间是否有关系,若有则检测第二个元素和非第一个元素(第三个元素)是否有关系,
//若有则判断第一个元素和第三个元素是否有关系,如果没有则没有传递性,返回NO
{
for(int i=0;i<number;i++)
for(int j=0;j<number;j++)
{
if(A[i][j]==1)
for(int k=0;k<number;k++)
{
if(k==i)
continue;
if(A[j][k]==1)
if(A[i][k]==0)
return NO;
}
}
return CHUAN_DI;
}这样应该OK了。